Skip to main content
Glama
TushGoel

production-mcp-server

by TushGoel

production-mcp-server

CI Python License Tests

Сервер MCP (Model Context Protocol) производственного уровня, демонстрирующий, как безопасно предоставлять инструменты ИИ-агентам в корпоративных средах.

Большинство примеров MCP показывают, как подключать инструменты к агентам. Этот репозиторий показывает, как делать это безопасно в масштабе — с контролем разрешений, поведенческими ограничениями, контролем радиуса поражения и структурированными журналами аудита при каждом вызове.


Проблема → Решение → Эффект

Проблема

ИИ-агентам для полезности нужен доступ к инструментам, но неограниченный доступ вызывает инциденты в продакшене. Команды либо полностью ограничивают агентов (бесполезно), либо дают полный доступ (опасно).

Решение

Управляемый шлюзовой слой MCP, расположенный между каждым агентом и каждым инструментом: с проверкой разрешений, контролем радиуса поражения и полным аудитом каждого вызова.

Эффект

Агенты безопасно работают в продакшене с авторизацией корпоративного уровня. Команды безопасности могут аудировать каждое действие. Разработчики выпускают функции агентов, не опасаясь побочных эффектов.


Related MCP server: evav-gateway

Проектирование системы

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

Разбивка по слоям

Слой

Что делает

Почему это важно

Реестр инструментов

Хранит имя, описание, требуемые разрешения и уровень риска для каждого инструмента

Единый источник истины — ни один инструмент не запускается без регистрации

Контроль разрешений

Проверяет разрешения вызывающей стороны на соответствие требованиям инструмента перед выполнением

Агенты могут вызывать только те инструменты, на которые у них есть явное разрешение

Защита радиуса поражения

Требует confirmed=True для операций с уровнем риска HIGH

Агенты не могут случайно запустить разрушительные операции

Проверка входных данных

Блокирует обход путей, деструктивные SQL-запросы и другие паттерны атак

Эшелонированная защита — проверка выполняется до запуска любого обработчика

Журнал аудита

Неизменяемый журнал только на добавление для каждого вызова

Полная аудируемость для соответствия требованиям и отладки

Проблема

Когда ИИ-агенты получают доступ к инструментам, немедленно возникают три режима отказа:

  1. Неограниченный доступ — агенты вызывают инструменты, которые не должны, вызывая непреднамеренные побочные эффекты

  2. Отсутствие журнала аудита — когда что-то идёт не так, невозможно восстановить, что сделал агент

  3. Тихие сбои — ошибки разрешений проглатываются, что делает отладку невозможной

Этот сервер решает все три проблемы.

Архитектура

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
│  └──────────────────────┘   │
└─────────────────────────────┘

Ключевые паттерны

1. Управляемый доступ к инструментам

Каждый инструмент регистрируется с явными требованиями к разрешениям:

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. Контроль разрешений

Защитный слой проверяет разрешения до запуска любого обработчика:

# 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. Контроль радиуса поражения

Инструменты с уровнем риска HIGH требуют явного флага подтверждения — агенты не могут случайно запустить разрушительные операции:

# 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. Проверка входных данных

Проверки на уровне аргументов выполняются до любого обработчика инструмента:

# 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. Структурированный журнал аудита

Каждый вызов — разрешённый или отклонённый — записывается:

# 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()}")

Структура проекта

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

Установка

pip install -e ".[dev]"

Запуск сервера

python -m src.server

Подключите любой MCP-совместимый клиент (Claude Desktop, Claude Code и т. д.) к серверу.

Запуск тестов

pytest tests/ -v

Расширение

Добавление нового инструмента

  1. Напишите функцию-обработчик в src/tools/:

def read_config(config_key: str) -> str:
    return os.environ.get(config_key, "not_found")
  1. Зарегистрируйте его с разрешениями и уровнем риска:

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. Опубликуйте через FastMCP:

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

Защитный слой и слой аудита применяются автоматически — никаких изменений там не требуется.

Интеграция вашего слоя аутентификации

Замените статические CALLER_ID / CALLER_PERMISSIONS в server.py на ваш реальный поставщик удостоверений:

# 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"])

Почему это важно

ИИ-агенты, работающие с доступом к инструментам в продакшене, нуждаются в тех же средствах контроля, что и любой привилегированный сервис: авторизация с минимальными привилегиями, проверка входных данных, ограничение радиуса поражения и полный журнал аудита. Этот репозиторий — эталонная реализация этих паттернов с использованием протокола MCP.

Лицензия

MIT


Часть стека агентной инфраструктуры

Этот репозиторий — одна из частей портфеля производственной ИИ-агентной инфраструктуры:

Репозиторий

Что это

agentic-ops

Полное проектирование системы: как эти части сочетаются в производственном развёртывании, которое устранило 95% ручного разбора инцидентов при дежурствах

production-mcp-server

← Вы здесь: слой управления MCP

agent-eval-framework

Как измеряется качество агентов и регрессии выявляются до релиза

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