mcp-server-template
mcp-server-template
Отправная точка для MCP-сервера, доведённая до продакшен‑формы.
Быстрый старт в документации MCP даёт вам работающий инструмент за десять минут. А вот то, что вам предстоит добавить в течение следующих трёх недель — когда этот инструмент уже вызывается чем-то, что вы не контролируете.
@mcp.tool()
def add(a: int, b: int) -> int:
return a + b # fine on a laptopЧего там не хватает — не функций. Дело в том, что происходит, когда инструмент зависает, выбрасывает исключение, возвращает необычный результат или вызывается сорок раз одновременно — и что модели в этот момент позволено видеть.
Решаемая проблема
Вызывающий инструмент MCP — это языковая модель, и это меняет инженерный подход.
Модель не может прочитать стек‑трейс, но с радостью повторит его вашему пользователю. Так что утёкший traceback — одновременно и бесполезен, и является разглашением.
У модели свой дедлайн. Зависший инструмент даёт не медленный ответ, а мёртвую беседу.
Модель не отличает обрезанный результат от полного. Молчаливое переполнение контекста не вызывает ошибку — оно ухудшает ответ, и вы узнаёте об этом от клиента.
Модель будет повторять, если вы ей позволите. Поэтому «не найдено» и «недоступен вышестоящий сервис» должны быть разными ответами, иначе она будет долбить сервис из‑за записи, которой никогда не было.
Каждая из этих проблем решается один раз и в одном месте, чтобы инструмент, добавленный в пятницу после обеда, получал ту же защиту, что и инструмент, аккуратно написанный в первый день.
Related MCP server: Graft
Что вы получаете
Таймаут на инструмент | Настоящая отмена, а не предупреждение после. Возвращается ошибка |
Потолок параллелизма | Ограниченное параллельное выполнение, чтобы всплеск не сможет смести всё, что вызывают ваши инструменты |
Граница ошибок | Объявленные ошибки доходят до вызывающего; неожиданные превращаются в |
Маскирование секретов | Применяется к журналам и к исходящим сообщениям, ведь ключи чаще утекают через интерполированные строки исключений, чем через код |
Видимое усечение | Слишком большое результаты обрезаются с маркером, a не молча |
Идентификаторы корреляции | Один идентификатор на вызов: и в журнале, и в ошибке, которую пользователь может процитировать вам |
Структурированный логи в stderr | stdout принадлежит протоколу — случайный |
Fail‑fast конфигурация | Плохие настройки останавливают сервер при запуске, а не при первом запросе |
Офлайн‑тесты | Набор запускается в поезде. Свежих ключей нет, сети нет |
Быстрый старт
git clone https://github.com/muhammadwaqasmbd/mcp-server-template
cd mcp-server-template
make install
make test
make run # stdio, ready for a desktop MCP clientИли запустите его по сети:
TRANSPORT=streamable-http PORT=8000 python -m mcp_server_templateПодключите к нему десктопный клиент
{
"mcpServers": {
"template": {
"command": "python",
"args": ["-m", "mcp_server_template"],
"cwd": "/absolute/path/to/mcp-server-template"
}
}
}Добавление своего инструмента
Напишите функцию. И не нужно ничего остального.
# src/mcp_server_template/tools/orders.py
from ..errors import InvalidInput, UpstreamUnavailable
async def cancel_order(order_id: str) -> dict:
"""Cancel an order. Returns the order's new state."""
if not order_id.strip():
raise InvalidInput("order_id must not be empty") # model can fix this
...
raise UpstreamUnavailable("order service timed out") # model may retryЗарегистрируйте её за гардом:
mcp.tool(name="cancel_order", description="Cancel an order by id.")(
guard.wrap(orders.cancel_order)
)Теперь у неё есть таймаут, потолок, граница ошибок, усечение и логирование. Вы ничего из этого не пислели.
Выбрасывайте InvalidInput, когда модель может это то исправвить. Выбрасывайте UpstreamUnavailabled, когда повторная попутка других дейстовать. Просто ложные исходы возвращайте обычным способом — отсуствющая запись — это ответ, а не ошибка.
Архитектура
server.py the ONLY module that imports the MCP SDK
│
├── guard.py timeout · concurrency · error boundary · truncation · timing
├── errors.py what a model is allowed to see, and secret redaction
├── observability.py JSON logs on stderr, correlation ids
├── config.py validated once at boot, immutable thereafter
└── tools/ plain functions. No protocol knowledge. No decoratorsСтрелка зависимостей указывает в одну сторону: инструменты не знают об MCP, а гард ничего не знает ваших инструментах. Иминно поэтому тесты выполняются за миллисекунды без сервера и поэтому изменение SDK затрагивает ровно один файлся.
Чего эта система намеренно не делает
Честные про границы полезнее длинного списка возможностей.
Никакой аутификации. Промость stdio-граница ОС является границей безопасности. Если выставляете пот CSV, поставть перед настойщим аутом — SDK это поддерживает, а писать её здесь означало бы подразумет адаптую модель угрроз, которую вы не выбрали.
Никакой ретраи внутри инструментов. Гард сообщает, является ли сбой повётным; решать, не нужруется ли повторить, должен вызывающий, у которого есть контекст и бюджет.
Никакого ограничения запросов в наблюдателе. "потолок параллельности ограничивает" все суммарную работу, а не честность в отplicательного под отдельный идентификаторов. Если вам это нужно, сначала нужна идентификация.
Никакой постоянчик, очереди или планировщика. Серверный сервер, который тихо превращается в выполненur job'ов, — распределительная система, которую никто не проектировал.
Никакого streaming-вызова частых результатов. Это стоит добавить для долгих инструментов, но опущено, потому что усложния границу ошибок, а большинству а инструментов это не ненужно.
Тестирование
make testНабор нап ли с фокусе на отобини чтобы — failures. Он проверяет, что зависший инструмент отменяется, что непредвиденные исключения не моя не вытечь; не большого объём результаты отобразяется вилимо, что потолок параллельности держится в десять одновременных вызовов и что блокирующий синхронный инструмент не уморит с гролод, событийный цикл.
Лицензия
MIT — см. LICENSE.
Собрал Muhammad Waqas, который большую часть своего времени занимаатся агентными системами в регулируемых отраслях, где уверенный неправильный ответ — это инцидент, который следует докладывать.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityDmaintenanceA production-grade, extensible Python template for building Model Context Protocol servers with support for Streamable HTTP and stdio transports. It provides a structured framework for implementing tools, resources, and prompts with built-in authentication, observability, and background task management.11MIT
- AlicenseNot gradedqualityCmaintenanceEnables building agent-ready APIs that expose tools as both HTTP and MCP endpoints from a single server definition, with automatic OpenAPI, discovery docs, and interactive API reference.5Apache 2.0
- AlicenseNot gradedqualityDmaintenanceA production-grade MCP server designed for multi-tenant, authenticated, and observable AI agent systems, enabling secure tool execution across heterogeneous data sources.57MIT
- AlicenseAqualityCmaintenanceA production-ready foundation for building secure, observable MCP servers with built-in authentication, rate limiting, and reference tools like database-query and semantic-search.1578MIT
Related MCP Connectors
Hosted MCP server for LLM cost estimation, model comparison, and budget-aware routing.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
An MCP server for Arcjet - the runtime security platform that ships with your AI code.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/muhammadwaqasmbd/mcp-server-template'
If you have feedback or need assistance with the MCP directory API, please join our Discord server