Skip to main content
Glama

MCP Server - Model Context Protocol Implementation

A comprehensive Python backend implementing the Model Context Protocol (MCP) with JSON-RPC 2.0, Azure OpenAI integration, and Server-Sent Events streaming capabilities.

Features

  • Complete MCP Protocol Support: JSON-RPC 2.0 compliant implementation

  • Azure OpenAI Integration: Seamless connection to Azure OpenAI services

  • Streaming Responses: Real-time streaming via Server-Sent Events (SSE)

  • Resource Management: File system resource discovery and access

  • Tool Execution: Extensible tool registry with validation

  • Authentication: JWT-based authentication system

  • Monitoring: Prometheus metrics collection

  • Web Interface: Built-in testing and management interface

Related MCP server: MCP Python SDK

Architecture

├── app/
│   ├── core/
│   │   ├── config.py          # Configuration management
│   │   ├── errors.py          # Custom exception classes
│   │   └── logging.py         # Structured logging setup
│   ├── protocol/
│   │   ├── enums.py           # MCP protocol enumerations
│   │   └── models.py          # Pydantic models for MCP
│   ├── services/
│   │   ├── llm.py             # Azure OpenAI service
│   │   ├── resources.py       # Resource management
│   │   └── tools.py           # Tool registry and execution
│   ├── transport/
│   │   └── http.py            # HTTP transport layer
│   ├── auth.py                # JWT authentication
│   └── metrics.py             # Prometheus metrics
├── static/
│   └── app.js                 # Frontend JavaScript
├── templates/
│   └── index.html             # Web interface
├── main.py                    # Application entry point
└── server.py                  # Flask app configuration

Installation

  1. Clone the repository:

git clone <repository-url>
cd mcp-server
  1. Install dependencies:

pip install -r requirements.txt
  1. Set up environment variables:

# Required for Azure OpenAI
export OPENAI_API_KEY="your-azure-openai-api-key"
export AZURE_OPENAI_ENDPOINT="https://your-resource.openai.azure.com"
export AZURE_OPENAI_DEPLOYMENT="your-deployment-name"
export AZURE_OPENAI_API_VERSION="2024-08-01-preview"

# Optional configurations
export JWT_SECRET="your-jwt-secret"
export SESSION_SECRET="your-session-secret"

Configuration

The server supports both Azure OpenAI and standard OpenAI configurations:

USE_AZURE_OPENAI = True
AZURE_OPENAI_ENDPOINT = "https://your-resource.openai.azure.com"
AZURE_OPENAI_DEPLOYMENT = "gpt-4o"
AZURE_OPENAI_API_VERSION = "2024-08-01-preview"

Standard OpenAI

USE_AZURE_OPENAI = False
OPENAI_MODEL = "gpt-4o"

Running the Server

Development

python main.py

Production

gunicorn --bind 0.0.0.0:5000 --reuse-port --reload main:app

The server will be available at http://localhost:5000

API Endpoints

MCP Protocol

  • POST /rpc - JSON-RPC 2.0 endpoint for MCP requests

  • GET /events - Server-Sent Events for streaming responses

Management

  • GET / - Web interface for testing and management

  • GET /health - Health check endpoint

  • GET /metrics - Prometheus metrics

Authentication

The server uses JWT-based authentication. Include the token in requests:

# HTTP Headers
Authorization: Bearer <token>

# Query Parameters (for SSE)
?token=<token>

Default development token: devtoken

MCP Protocol Support

Capabilities

  • Resources: File system resource discovery and reading

  • Tools: Extensible tool execution with validation

  • Sampling: LLM completion requests (streaming and non-streaming)

  • Logging: Structured JSON logging

Example Requests

Initialize Connection

{
  "jsonrpc": "2.0",
  "id": "init",
  "method": "initialize",
  "params": {
    "protocolVersion": "2024-11-05",
    "capabilities": {},
    "clientInfo": {"name": "test-client", "version": "1.0.0"}
  }
}

List Resources

{
  "jsonrpc": "2.0",
  "id": "resources",
  "method": "resources/list",
  "params": {}
}

Execute Tool

{
  "jsonrpc": "2.0",
  "id": "tool",
  "method": "tools/call",
  "params": {
    "name": "calculate",
    "arguments": {"operation": "add", "a": 5, "b": 3}
  }
}

LLM Completion

{
  "jsonrpc": "2.0",
  "id": "completion",
  "method": "sampling/createMessage",
  "params": {
    "messages": [{"content": {"type": "text", "text": "Hello, world!"}}],
    "maxTokens": 100
  }
}

Extending the Server

Adding New Tools

from app.services.tools import mcp_tool

@mcp_tool("my_tool", {
    "type": "object",
    "properties": {
        "param1": {"type": "string"},
        "param2": {"type": "number"}
    },
    "required": ["param1"]
})
async def my_custom_tool(param1: str, param2: float = 0.0):
    """Custom tool implementation"""
    return {"result": f"Processed {param1} with {param2}"}

Custom Resource Handlers

from app.services.resources import ResourceService

class CustomResourceService(ResourceService):
    async def list_resources(self, base_path: str = "."):
        # Custom resource discovery logic
        pass

Monitoring

The server includes comprehensive monitoring:

  • Prometheus Metrics: Request counts, response times, error rates

  • Structured Logging: JSON-formatted logs with correlation IDs

  • Health Checks: Application and dependency status

Security

  • Environment-based configuration (no hardcoded secrets)

  • JWT authentication with configurable secrets

  • Input validation on all endpoints

  • Rate limiting headers from Azure OpenAI

Development

Running Tests

# Test the API endpoints
curl -X POST http://localhost:5000/rpc \
  -H "Authorization: Bearer devtoken" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":"test","method":"initialize","params":{}}'

# Test streaming
curl -N "http://localhost:5000/events?token=devtoken&prompt=Hello&stream=true"

Adding Dependencies

pip install <package-name>
pip freeze > requirements.txt

Troubleshooting

Common Issues

  1. Azure OpenAI Connection Errors

    • Verify AZURE_OPENAI_ENDPOINT and AZURE_OPENAI_DEPLOYMENT

    • Check API key permissions

    • Ensure correct API version

  2. Authentication Failures

    • Verify JWT token format

    • Check token expiration

    • Ensure correct secret configuration

  3. Streaming Issues

    • Use query parameters for SSE authentication

    • Check network connectivity for long-running streams

Debug Logging

Enable debug logging by setting:

export DEBUG=true

License

This project is licensed under the MIT License.

Contributing

  1. Fork the repository

  2. Create a feature branch

  3. Make your changes

  4. Add tests for new functionality

  5. Submit a pull request

Support

For issues and questions:

  • Check the troubleshooting section

  • Review the API documentation

  • Open an issue on GitHub

-
security - not tested
A
license - permissive license
-
quality - not tested

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Krishanu-das-05/MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server