Production-grade MCP-сервер для LLM-агентов, предоставляющий безопасные typed tools для поиска знаний, чтения документов, сборки проектного контекста и выполнения ограниченных действий внутри системы.
MCP Knowledge Server — это backend-компонент для agentic / LLM-систем, который выступает прослойкой между моделью и внутренними данными/действиями.
Сервер предоставляет инструменты через MCP-подобный JSON-RPC transport, контролирует доступ по API key и scope-ам, ведет аудит операций и поддерживает наблюдаемость через метрики и request tracing.
Проект разрабатывался как production-oriented MCP backend, который должен демонстрировать навыки, ожидаемые от LLM Engineer / AI Backend Engineer:
- проектирование tool interfaces для LLM-агентов;
- реализация MCP-oriented transport layer;
- schema-first подход к tool contracts;
- safe tool execution;
- retrieval-aware backend design;
- контекстная агрегация для моделей;
- auth, scopes и auditability;
- observability и production readiness;
- тестирование tool contracts и integration flows.
- поиск документов через PostgreSQL Full-Text Search;
- ранжирование результатов через
ts_rank; - фильтрация по проекту;
- получение документа по идентификатору;
- сборка структурированного project context.
- создание задач;
- создание заметок;
- idempotency для
create_note.
- аутентификация через
x-api-key; - tool-level authorization через scopes;
- request context с
request_id,client_id,client_name.
- Prometheus metrics;
- HTTP request metrics;
- MCP tool metrics;
- request logging;
- audit logs для mutation-операций.
- Alembic migrations;
- unit / integration / contract tests;
- typed DTO и отдельный service layer.
Проект реализован как modular monolith с четким разделением слоев.
Отвечает за входные протоколы и адаптацию запросов:
- HTTP routers;
- MCP endpoint;
- middleware;
- зависимости для auth / request context.
Инкапсулирует tool execution pipeline:
- registry tools;
- dispatcher;
- input/output schemas;
- permission checks;
- result envelope.
Содержит use cases и бизнес-логику:
- document service;
- project service;
- task services;
- note service.
Содержит сущности, enum-ы и модели предметной области:
- projects;
- documents;
- document_chunks;
- tasks;
- notes;
- api_clients;
- audit_logs.
Содержит технические адаптеры:
- SQLAlchemy repositories;
- DB session management;
- auth service;
- metrics;
- search implementation.
app/
├── application/
│ ├── dto/
│ ├── interfaces/
│ └── services/
├── core/
│ ├── config.py
│ ├── exceptions.py
│ ├── logging.py
│ ├── request_context.py
│ └── telemetry.py
├── domain/
│ ├── enums/
│ └── models/
├── infrastructure/
│ ├── auth/
│ ├── db/
│ ├── observability/
│ └── repositories/
├── tests/
│ ├── contract/
│ ├── integration/
│ └── unit/
└── transport/
├── http/
│ ├── middleware.py
│ ├── dependencies.py
│ └── routers/
└── mcp/
├── auth.py
├── context.py
├── dispatcher.py
├── registry.py
├── result.py
├── schemas.py
└── tools/
- Python 3.12
- FastAPI
- Pydantic v2
- SQLAlchemy 2
- Alembic
- PostgreSQL
- Redis
- PostgreSQL Full-Text Search
- tsvector
- ts_rank
- GIN index
- pytest
- pytest-asyncio
- httpx
- Ruff
- MyPy
- prometheus-client
- Docker Compose
Сервер предоставляет следующие инструменты.
Ищет документы по текстовому запросу с использованием PostgreSQL FTS.
Scope: knowledge:read
Возвращает полный документ по идентификатору.
Scope: knowledge:read
Собирает структурированный контекст по проекту:
- метаданные проекта;
- последние документы;
- открытые задачи.
Scope: projects:read
Ищет задачи по тексту, проекту и/или исполнителю.
Scope: tasks:read
Создает задачу внутри проекта.
Scope: tasks:write
Создает заметку внутри проекта.
Scope: notes:write
Для доступа к MCP endpoint используется заголовок:
x-api-key
Ключ сопоставляется с сущностью api_client в базе данных.
Каждому клиенту назначается набор scope-ов, например:
knowledge:readprojects:readtasks:readtasks:writenotes:write
Каждый tool требует конкретный scope, и вызов без нужного разрешения будет отклонен.
Для каждого запроса формируется request context:
request_idclient_idclient_namescopes
Этот контекст используется при:
- проверке прав;
- логировании;
- аудите mutation-операций.
Для write-tools создаются записи в audit_logs, содержащие:
- client id;
- request id;
- tool name;
- action type;
- входной payload;
- outcome.
Экспортируются:
- http_requests_total
- http_request_duration_seconds
- mcp_tool_calls_total
- mcp_tool_duration_seconds
На уровне приложения логируются:
- HTTP requests;
- tool execution;
- ошибки валидации и выполнения.
-
Пользователь отправляет запрос в host-приложение.
-
Host передает агенту список доступных tools.
-
Модель принимает решение вызвать нужный tool.
-
Host отправляет JSON-RPC запрос на MCP server.
-
MCP server:
- аутентифицирует клиента;
- проверяет scope;
- валидирует input schema;
- вызывает service layer;
- получает результат;
- возвращает typed output.
-
Host передает результат обратно модели.
-
Модель строит итоговый ответ пользователю.
- Создать .env
Скопируйте пример:
cp .env.example .env
- Поднять инфраструктуру
docker compose up -d
- Установить зависимости
pip install -e ".[dev]"
- Применить миграции
alembic upgrade head
- Заполнить базу тестовыми данными
python -m app.infrastructure.db.seed
- Запустить сервер
uvicorn app.main:app --reload
GET /api/v1/health/live
GET /api/v1/health/ready
GET /api/v1/metrics
POST /api/v1/mcp
Content-Type: application/json
x-api-key: dev-secret-key
x-request-id: test-request-001
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "search_knowledge",
"arguments": {
"query": "retrieval architecture"
}
}
}
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "build_project_context",
"arguments": {
"slug": "aurora"
}
}
}
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "create_task",
"arguments": {
"project_id": "PROJECT_UUID",
"title": "Add request logging",
"description": "Persist request metadata for MCP tool calls",
"priority": "high",
"assignee": "zach",
"created_by": "platform-team"
}
}
}
pytest
pytest app/tests/unit
pytest app/tests/integration
pytest app/tests/contract
- API key auth;
- scope checks.
- health endpoints;
- MCP read-tools;
- MCP write-tools;
- idempotency для create_note.
- shape ответа tools/list;
- структура MCP payload.
На данный момент проект намеренно не включает:
- OAuth 2.1 / OIDC;
- полноценный remote MCP authorization flow;
- pgvector и semantic search;
- chunk-level retrieval в tool response;
- reranking;
- OpenTelemetry tracing;
- rate limiting;
- JSONB audit payload;
- background indexing pipeline.