Skip to main content
Glama
TushGoel

production-mcp-server

by TushGoel

production-mcp-server

CI Python License Tests

Ein produktionsreifer MCP-Server (Model Context Protocol), der demonstriert, wie Tools sicher für KI-Agenten in Unternehmensumgebungen bereitgestellt werden.

Die meisten MCP-Beispiele zeigen, wie man Tools mit Agenten verbindet. Dieses Repository zeigt, wie man es sicher in großem Maßstab macht – mit Berechtigungsdurchsetzung, verhaltensbezogenen Schutzmechanismen, Blast-Radius-Kontrollen und strukturierten Audit-Trails bei jedem Aufruf.


Das Problem → Lösung → Auswirkung

Problem

KI-Agenten benötigen Tool-Zugriff, um nützlich zu sein – aber uneingeschränkter Tool-Zugriff verursacht Produktionsstörungen. Teams sperren Agenten entweder komplett ein (nutzlos) oder gewähren vollen Zugriff (gefährlich).

Lösung

Eine kontrollierte MCP-Gateway-Schicht, die zwischen jedem Agenten und jedem Tool sitzt: berechtigungsgeprüft, mit kontrolliertem Blast-Radius und bei jedem Aufruf vollständig auditiert.

Auswirkung

Agenten arbeiten sicher in der Produktion mit einer Autorisierung auf Enterprise-Niveau. Sicherheitsteams können jede Aktion prüfen. Entwickler liefern Agentenfunktionen aus, ohne Angst vor Nebenwirkungen zu haben.


Related MCP server: evav-gateway

Systemdesign

graph TD
    A[🤖 AI Agent<br/>Claude / Any LLM] -->|MCP Protocol| B

    subgraph MCP Gateway — Governed Tool Access
        B[Request Received] --> C{Layer 1<br/>Permission Check}
        C -->|Missing permissions| D[❌ Denied<br/>Audit logged]
        C -->|Permitted| E{Layer 2<br/>Blast-Radius Guard}
        E -->|HIGH risk, no confirmation| F[❌ Blocked<br/>Audit logged]
        E -->|Confirmed or LOW/MED| G{Layer 3<br/>Input Validation}
        G -->|Path traversal / SQL injection| H[❌ Blocked<br/>Audit logged]
        G -->|Clean inputs| I[✅ Tool Handler Executes]
    end

    I --> J[(Tool Registry<br/>name · permissions · risk_level)]
    I --> K[📋 Audit Trail<br/>every call · permitted or denied]

    subgraph Tools
        I --> L[📊 Read Metrics]
        I --> M[🔍 Query Database]
        I --> N[🚀 Trigger Rollback<br/>HIGH RISK — requires confirmed=True]
    end

Aufschlüsselung der Schichten

Schicht

Was sie tut

Warum sie wichtig ist

Tool-Registry

Speichert Name, Beschreibung, erforderliche Berechtigungen und Risikostufe für jedes Tool

Single Source of Truth – kein Tool läuft ohne Registrierung

Berechtigungsdurchsetzung

Prüft vor der Ausführung die Berechtigungen des Aufrufers gegen die Tool-Anforderungen

Agenten können nur Tools aufrufen, für die sie ausdrücklich autorisiert sind

Blast-Radius-Schutz

Erfordert confirmed=True für Operationen mit hohem Risiko

Agenten können nicht versehentlich destruktive Operationen auslösen

Eingabevalidierung

Blockiert Path Traversal, destruktives SQL und andere Angriffsmuster

Defense-in-Depth – validiert, bevor ein Handler läuft

Audit-Trail

Unveränderliches Append-only-Log jedes Aufrufs

Vollständige Prüfbarkeit für Compliance und Debugging

Das Problem

Wenn KI-Agenten Tool-Zugriff erhalten, treten sofort drei Fehlermodi auf:

  1. Uneingeschränkter Zugriff – Agenten rufen Tools auf, die sie nicht aufrufen sollten, was unbeabsichtigte Nebenwirkungen verursacht

  2. Kein Audit-Trail – Wenn etwas schiefgeht, lässt sich nicht rekonstruieren, was der Agent getan hat

  3. Stille Fehler – Berechtigungsfehler werden verschluckt, was Debugging unmöglich macht

Dieser Server adressiert alle drei.

Architektur

Agent (Claude / any LLM)
        │
        ▼ MCP Protocol
┌─────────────────────────────┐
│        MCP Server           │
│  ┌──────────────────────┐   │
│  │    Guardrail Layer   │   │  ← permission check → blast-radius guard → arg validation
│  └──────────┬───────────┘   │
│             │               │
│  ┌──────────▼───────────┐   │
│  │    Tool Registry     │   │  ← name, description, required_permissions, risk_level
│  └──────────┬───────────┘   │
│             │               │
│  ┌──────────▼───────────┐   │
│  │    Tool Handlers     │   │  ← plain Python functions, no security logic here
│  └──────────────────────┘   │
│             │               │
│  ┌──────────▼───────────┐   │
│  │     Audit Trail      │   │  ← every invocation logged, permitted or denied
│  └──────────────────────┘   │
└─────────────────────────────┘

Kernmuster

1. Kontrollierter Tool-Zugriff

Jedes Tool wird mit expliziten Berechtigungsanforderungen registriert:

registry.register(ToolDefinition(
    name="trigger_rollback",
    description="Initiate a deployment rollback.",
    handler=trigger_rollback,
    required_permissions={"deployments:write", "deployments:rollback"},
    risk_level=RiskLevel.HIGH,
    requires_confirmation=True,  # blast-radius guard
))

2. Berechtigungsdurchsetzung

Die Guardrail-Schicht prüft Berechtigungen, bevor ein Handler läuft:

# Agent tries to trigger rollback but lacks deployments:write
guardrails.invoke(
    tool_name="trigger_rollback",
    arguments={"deployment_id": "d-123", "reason": "high error rate"},
    caller_id="monitoring-agent",
    caller_permissions={"deployments:read"},  # missing write permission
)
# → PermissionDeniedError: Caller 'monitoring-agent' lacks permissions
#   {'deployments:write', 'deployments:rollback'} for tool 'trigger_rollback'

3. Blast-Radius-Kontrollen

Tools mit hohem Risiko erfordern ein explizites Bestätigungs-Flag – Agenten können nicht versehentlich destruktive Operationen auslösen:

# Without confirmation — blocked
guardrails.invoke("trigger_rollback", {...}, confirmed=False)
# → GuardrailViolationError: HIGH risk tool requires confirmed=True

# With confirmation — permitted
guardrails.invoke("trigger_rollback", {...}, confirmed=True)

4. Eingabevalidierung

Prüfungen auf Argumentebene laufen vor jedem Tool-Handler:

# Path traversal — blocked automatically
guardrails.invoke("read_file", {"path": "../../etc/passwd"}, ...)
# → GuardrailViolationError: Path traversal detected

# Destructive SQL — blocked automatically
guardrails.invoke("query", {"query": "DROP TABLE users"}, ...)
# → GuardrailViolationError: Destructive SQL pattern detected

5. Strukturierter Audit-Trail

Jeder Aufruf – erlaubt oder verweigert – wird aufgezeichnet:

# After some invocations
events = audit.get_events()
print(events[0].to_json())
# {
#   "tool_name": "read_deployment_status",
#   "caller_id": "oncall-agent-v1",
#   "arguments": {"deployment_id": "d-abc"},
#   "result": "{'status': 'healthy', ...}",
#   "permitted": true,
#   "timestamp": "2026-08-26T14:30:00+00:00",
#   "duration_ms": 12.4
# }

print(f"Denied requests: {audit.denied_count()}")

Projektstruktur

production-mcp-server/
├── src/
│   ├── server.py          # MCP server entry point — tool registration + FastMCP wiring
│   ├── registry.py        # Tool registry — metadata, permissions, risk classification
│   ├── guardrails.py      # Guardrail layer — 3-layer enforcement on every invocation
│   ├── audit.py           # Structured audit trail — append-only event log
│   └── tools/
│       └── example_tools.py  # Example handlers — swap with your real data sources
├── tests/
│   ├── test_guardrails.py    # Permission enforcement, blast-radius, input validation
│   └── test_registry.py      # Tool registration and lookup
├── examples/
│   └── basic_usage.py        # Standalone usage without the MCP server
└── pyproject.toml

Installation

pip install -e ".[dev]"

Server ausführen

python -m src.server

Verbinden Sie einen beliebigen MCP-kompatiblen Client (Claude Desktop, Claude Code usw.) mit dem Server.

Tests ausführen

pytest tests/ -v

Erweitern

Hinzufügen eines neuen Tools

  1. Schreiben Sie die Handler-Funktion in src/tools/:

def read_config(config_key: str) -> str:
    return os.environ.get(config_key, "not_found")
  1. Registrieren Sie es mit Berechtigungen und Risikostufe:

registry.register(ToolDefinition(
    name="read_config",
    description="Read a configuration value by key.",
    handler=read_config,
    required_permissions={"config:read"},
    risk_level=RiskLevel.LOW,
))
  1. Stellen Sie es über FastMCP bereit:

@mcp.tool()
def config(config_key: str) -> str:
    return guardrails.invoke("read_config", {"config_key": config_key}, ...)

Die Guardrail- und Audit-Schichten werden automatisch angewendet – dort sind keine Änderungen erforderlich.

Integration Ihrer Auth-Schicht

Ersetzen Sie die statischen CALLER_ID / CALLER_PERMISSIONS in server.py durch Ihren echten Identitätsanbieter:

# Example: derive permissions from an OAuth token in the MCP session context
def get_caller_context(session) -> tuple[str, set[str]]:
    token = session.headers.get("Authorization")
    claims = verify_jwt(token)
    return claims["sub"], set(claims["permissions"])

Warum das wichtig ist

KI-Agenten, die in der Produktion mit Tool-Zugriff arbeiten, benötigen dieselben Kontrollen wie jeder privilegierte Dienst: Least-Privilege-Autorisierung, Eingabevalidierung, Blast-Radius-Grenzen und einen vollständigen Audit-Trail. Dieses Repository ist eine Referenzimplementierung dieser Muster mithilfe des MCP-Protokolls.

Lizenz

MIT


Teil des Agentic-Infrastruktur-Stacks

Dieses Repository ist ein Baustein eines Portfolios für KI-Agenten-Infrastruktur in der Produktion:

Repo

Was es ist

agentic-ops

Vollständiges Systemdesign: wie diese Bausteine in einer Produktionsbereitstellung zusammenspielen, die 95 % der manuellen On-Call-Triage eliminiert hat

production-mcp-server

← Sie sind hier: die MCP-Governance-Schicht

agent-eval-framework

Wie die Qualität von Agenten gemessen und Regressionen erkannt werden, bevor sie ausgeliefert werden

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to securely call MCP tools with risk scoring, checkpoints, rollback, and approval workflows.
    17 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Governed MCP gateway that lets AI agents call tools with policy enforcement, prompt-injection screening, a kill-switch, and tamper-evident signed audit logs.
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables agents to invoke declared API capabilities through a governed MCP surface where each call is risk-tiered — low-risk calls execute immediately, medium-risk writes queue for human approval, and high-risk actions are withheld from the tool list entirely. Every call, decision and denial is recorded in an audit trail, and responses carrying third-party text are scanned for prompt-injection signals before an agent can read them.
    2
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to securely reach enterprise tools and other agents through a governed gateway with pinned tool definitions, delegated authorization, content inspection, human approval, and signed audit trails.
    Apache 2.0