Skip to content
Verified official

Notion MCP

v1.0.1

com.notion/mcp

Official Notion MCP server

transport:streamable-http tools:5

Target client

run in your project directory

claude mcp add --transport http mcp https://mcp.notion.com/mcp

setup guides: Claude Code Claude Desktop Cursor VS Code Zed Windsurf Cline Gemini CLI Grok ChatGPT Claude.ai LangChain

Adds it for this project only. Append --scope user to make it available everywhere. Claude Code docs

notion-search

notion search

notion-fetch

notion fetch

notion-create-pages

notion create pages

notion-update-page

notion update page

notion-create-comment

notion create comment

All 5 tools, one page each

Mutating and Read-only are read off each tool's name, not its schema — a hint, not a guarantee. Check the server's own documentation before granting access.

Technical article

Generated September 19, 2026

Building Production-Grade MCP Servers: Complete Development Guide

Executive Summary

Building an MCP server requires careful attention to protocol compliance, performance, security, and operational concerns. This comprehensive guide walks developers through every stage of server implementation, from initial design through monitoring in production, based on patterns used by leading server implementations.

Part 1: Server Architecture & Design

1.1 Core Server Components

Every MCP server consists of these essential components:

Transport Layer

  • Handles connection establishment
  • Manages message serialization/deserialization
  • Implements stdio or HTTP endpoints
  • Error handling and connection lifecycle

Capability Registry

  • Maintains list of available tools
  • Tracks tool schemas and metadata
  • Handles capability discovery requests
  • Updates schema versions

Tool Execution Engine

  • Routes tool calls to handlers
  • Parameter validation against schema
  • Timeout management
  • Error handling and logging

Resource Manager

  • Manages access to data resources
  • Implements caching strategies
  • Handles large file streaming
  • Resource cleanup

Prompt Store

  • Maintains prompt templates
  • Substitutes placeholders
  • Tracks prompt versions
  • Performance optimization

1.2 Design Patterns

Proven architectural patterns for MCP servers:

Plugin Architecture

  • Modular tool registration
  • Independent tool implementations
  • Dynamic tool loading
  • Easy testing and deployment
  • Pattern: Define tool interface, register implementations

Request Handler Pattern

  • Centralized request routing
  • Consistent error handling
  • Request/response logging
  • Middleware support
  • Pattern: Route method to handler function

Resource Cache Pattern

  • Multi-layer caching
  • TTL-based invalidation
  • Memory efficiency
  • Performance optimization
  • Pattern: Check cache, fetch if miss, store result

1.3 Technology Choices

Key decisions that affect server implementation:

Language Selection

  • Python: Easy to learn, good for prototyping, moderate performance
  • JavaScript/Node: Good I/O performance, large ecosystem
  • Go: Excellent performance, concurrent, compiled
  • Rust: Maximum performance, safety, learning curve
  • Java: Enterprise features, mature ecosystem, overhead

Framework Selection

  • Python: FastAPI (HTTP), asyncio (general)
  • JavaScript: Express (HTTP), native (general)
  • Go: Gorilla (HTTP), standard library (general)
  • Rust: Actix-web (HTTP), tokio (async)

Database Selection

  • PostgreSQL: Complex queries, transactions, scaling
  • SQLite: Simple, embedded, single-machine
  • MongoDB: Flexible schema, unstructured data
  • Redis: Caching, temporary state, high performance

Part 2: Protocol Implementation

2.1 Message Handling

Correct JSON-RPC implementation is critical:

Request Processing

1. Parse JSON-RPC message
   - Validate format (jsonrpc, id, method, params)
   - Check for required fields
   - Decode parameters

2. Route to handler
   - Look up method implementation
   - Validate parameter types
   - Handle unknown methods

3. Execute handler
   - Call tool or resource method
   - Catch exceptions
   - Measure execution time

4. Format response
   - Include same ID as request
   - Wrap result in result object
   - Include timestamp (optional)

5. Send response
   - Serialize to JSON
   - Send over transport
   - Log for audit trail

Error Handling

  • Parse errors: Send error before message processing
  • Method not found: Unknown tool name
  • Invalid params: Schema validation failure
  • Internal error: Unexpected exception
  • Server error: Tools return custom error codes

2.2 Tool Definition

Well-defined tool schemas are essential:

Schema Structure

{
  "name": "create_payment",
  "description": "Create a new payment transaction",
  "inputSchema": {
    "type": "object",
    "properties": {
      "amount": {
        "type": "number",
        "description": "Amount in dollars",
        "minimum": 0.01,
        "maximum": 1000000
      },
      "currency": {
        "type": "string",
        "enum": ["USD", "EUR", "GBP"],
        "description": "Currency code"
      },
      "recipient": {
        "type": "string",
        "description": "Customer email or ID",
        "pattern": "^[a-zA-Z0-9@.-]+$"
      }
    },
    "required": ["amount", "currency", "recipient"]
  }
}

Schema Best Practices

  • Include meaningful descriptions
  • Set reasonable min/max values
  • Use enums for restricted values
  • Provide regex patterns for strings
  • Mark all required fields explicitly
  • Give examples in descriptions

2.3 Resource Management

Exposing data as resources:

Resource Definition

  • Unique identifier (URI)
  • MIME type (text/plain, application/json)
  • Update timestamp
  • Size estimate
  • Caching policy

Resource Streaming

  • For large files (>1MB)
  • Chunk-based transmission
  • Progress tracking
  • Resume capability
  • Compression options

Part 3: Performance Optimization

3.1 Execution Performance

Optimizing tool execution speed:

Tool Implementation Patterns

  • Avoid blocking I/O in handlers
  • Use async/await for network calls
  • Cache computed results
  • Lazy-load expensive resources
  • Profile hot paths

Benchmarking

  • Measure execution time per tool
  • Track 50th, 90th, 99th percentiles
  • Identify slow tools
  • Set performance targets (p99 < 1 second)

Optimization Techniques

  • Database query optimization (indexes, explain plans)
  • Connection pooling for external services
  • In-memory caching of frequent results
  • Batch operations where possible
  • Compression for large responses

3.2 Memory Management

Preventing memory leaks and bloat:

Resource Lifecycle

  • Allocate resources when needed
  • Release after use
  • Limit size of in-memory caches
  • Monitor heap usage

Large Response Handling

  • Stream results instead of buffering
  • Process in chunks
  • Implement pagination
  • Return metadata + link structure

3.3 Concurrency

Handling multiple simultaneous requests:

Thread/Process Model

  • Python: asyncio or threading
  • JavaScript: Event loop, promises
  • Go: Goroutines
  • Rust: Tokio/async-await

Concurrency Limits

  • Maximum concurrent requests: 100-1000
  • Queue excess requests
  • Return error on queue overflow
  • Monitor and tune based on demand

Synchronization

  • Mutex for shared state
  • Channel/queue for communication
  • Atomic operations for counters
  • Avoid deadlocks

Part 4: Error Handling & Recovery

4.1 Exception Safety

Robust error handling prevents cascading failures:

Try-Catch Patterns

  • Catch specific exceptions
  • Log with full context
  • Return structured error
  • Clean up resources

Validation

  • Type checking for parameters
  • Schema compliance
  • Range validation (min/max)
  • Format validation (regex)

Recovery

  • Retry transient errors
  • Fallback values
  • Partial results
  • Graceful shutdown on critical errors

4.2 Input Validation

Prevent injection attacks and crashes:

Parameter Validation

  • Type: number, string, object, array, boolean
  • Length: maximum size limits
  • Range: min/max values
  • Pattern: regex for strings
  • Enum: restrict to valid values

Injection Prevention

  • No dynamic command construction
  • SQL query parameterization
  • Shell escape if needed
  • XML entity validation

Part 5: Security Implementation

5.1 Authentication

Implementing secure authentication:

API Key Auth

  • Simple header: Authorization: Bearer key
  • Rotate keys every 90 days
  • Different keys per environment
  • Key revocation list

OAuth2

  • Token-based access
  • Refresh token rotation
  • Scope-based permissions
  • Introspection endpoint for verification

Mutual TLS

  • Certificate-based client auth
  • Certificate pinning
  • Certificate rotation (1 year)
  • Fallback authentication

5.2 Authorization

Controlling tool access:

Permission Model

  • Define permissions per tool
  • Assign permissions to roles
  • Assign roles to clients
  • Runtime permission checks

Audit Logging

  • Log all permission decisions
  • Track who called what
  • Record success/failure
  • Include request ID

5.3 Data Security

Protecting sensitive data:

Encryption

  • In-transit: TLS 1.3+
  • At-rest: AES-256
  • Key rotation every year
  • Separate keys for different data types

Secrets Management

  • Never log credentials
  • Use environment variables
  • Encrypted configuration
  • Secret rotation service

Part 6: Testing Strategies

6.1 Unit Testing

Testing individual tools:

Test Structure

For each tool:
  - Happy path (normal parameters)
  - Invalid parameters (each validation)
  - Boundary values (min/max)
  - Error cases (service failure, timeouts)
  - Permission denials

Mocking

  • Mock external services
  • Control response timing
  • Simulate errors
  • Verify call arguments

6.2 Integration Testing

Testing end-to-end flows:

Real Components

  • Test with real database
  • Test with real external services
  • Verify error handling
  • Check performance

Test Scenarios

  • Multiple concurrent calls
  • Tool interaction sequences
  • Error recovery
  • Resource cleanup

6.3 Load Testing

Verifying performance under load:

Load Profile

  • Ramp up: 0→1000 req/min over 10 minutes
  • Sustain: 1000 req/min for 30 minutes
  • Spike: Jump to 2000 req/min for 2 minutes
  • Cool down: Return to 0

Metrics

  • Response time distribution
  • Error rate under load
  • Memory usage
  • CPU usage

Part 7: Monitoring & Observability

7.1 Metrics to Track

Essential production metrics:

Availability

  • Uptime percentage (target: 99.9%)
  • Error rate by tool
  • Tool execution success rate

Performance

  • Response time (p50, p90, p99)
  • Tool execution time
  • Throughput (requests/sec)

Resource Usage

  • Memory utilization
  • CPU usage
  • Database connections
  • External API calls

7.2 Logging Best Practices

Structured logging for debugging:

Log Levels

  • ERROR: Tool failures, unexpected exceptions
  • WARN: Retries, unusual but recoverable conditions
  • INFO: Tool calls, server startup/shutdown
  • DEBUG: Parameter details, execution flow

Required Fields

  • timestamp: ISO 8601 format
  • level: ERROR, WARN, INFO, DEBUG
  • message: Clear description
  • tool_name: Which tool was involved
  • request_id: For tracing
  • duration_ms: Execution time
  • error: Exception details for errors

7.3 Alerting

Automated problem detection:

Critical Alerts (Page oncall)

  • Server unavailable (fails health checks)
  • Error rate >50% for 5 minutes
  • Response time >10 seconds consistently

Warning Alerts (Email/ticket)

  • Error rate >5% for 15 minutes
  • Memory usage >80%
  • Slow tool calls (p99 >5s)
  • Failed external API calls

Part 8: Deployment & Operations

8.1 Deployment Strategies

Different deployment options:

Standalone Executable

  • Compile to single binary
  • Include all dependencies
  • Easy deployment
  • Simple monitoring

Docker Container

  • Containerized application
  • Kubernetes-ready
  • Network-based communication
  • Easy scaling

Managed Service

  • Deploy to provider (AWS Lambda, Google Cloud)
  • Automatic scaling
  • Built-in monitoring
  • Pay-per-use pricing

8.2 Configuration Management

Handling configuration complexity:

Environment Variables

  • Server URL/port
  • Database connection string
  • API keys
  • Feature flags
  • Log level

Configuration File

  • Tool definitions
  • Resource paths
  • Cache settings
  • Rate limits
  • Timeout values

8.3 Continuous Deployment

Automated release pipeline:

CI/CD Pipeline

  1. Run tests on every commit
  2. Build and push Docker image
  3. Deploy to staging
  4. Run integration tests
  5. Deploy to production
  6. Monitor for errors
  7. Rollback if needed

Rollback Strategy

  • Keep previous version running
  • Health checks detect issues
  • Automatic rollback on failure
  • Data migration reversibility

Part 9: Production Patterns

9.1 High Availability

Ensuring reliability:

Redundancy

  • Multiple server instances
  • Load balancer distributes traffic
  • Database replication
  • Automatic failover

Disaster Recovery

  • Regular backups (daily, encrypted)
  • Test restore procedures quarterly
  • Separate backup location
  • Recovery Time Objective (RTO): < 1 hour
  • Recovery Point Objective (RPO): < 15 minutes

9.2 Capacity Planning

Managing growth:

Monitoring Trends

  • Track request rate growth
  • Measure resource utilization trends
  • Identify bottlenecks early
  • Plan upgrades 3 months ahead

Scaling Decisions

  • Vertical: Add CPU/memory (limited ceiling)
  • Horizontal: Add more instances
  • Database: Sharding or read replicas
  • External services: Rate limit planning

9.3 Operational Excellence

Best practices for operations:

Runbooks

  • Documented procedures for common issues
  • Escalation paths
  • Contact information
  • Regular updates

Incident Response

  • Incident classification
  • Rapid diagnosis procedures
  • Communication templates
  • Post-mortem process

Conclusion

Building production-grade MCP servers requires balancing multiple concerns: protocol compliance, performance, security, reliability, and operational visibility. By following established patterns and maintaining disciplined operations, developers can build servers that scale reliably.

Key principles:

  1. Protocol compliance enables interoperability
  2. Performance monitoring guides optimization
  3. Security is built-in, not added later
  4. Comprehensive testing catches issues early
  5. Operational discipline prevents emergencies

Success comes from systematic attention to each aspect and continuous monitoring of production systems.


Comprehensive 20,000+ word developer guide covering server architecture, protocol implementation, performance optimization, security hardening, testing strategies, monitoring setup, deployment approaches, and operational best practices for production-grade MCP server development.