MCP Runbook Search Server
MCP Runbook Search Server
Сервер Model Context Protocol (MCP), который предоставляет семантический поиск по набору внутренних инженерных runbook'ов в виде инструментов — чтобы Claude Desktop, MCP-совместимая IDE или пользовательский агент могли спросить «как нам обработать отказ базы данных?» и получить нужный runbook, вместо того чтобы кто-то искал в вики.
Обзор
MCP стандартизирует то, как LLM-клиент обнаруживает и вызывает инструменты, предоставляемые отдельным серверным процессом, через stdio или HTTP. Этот сервер реализует эту сторону протокола для одного конкретного, реалистичного сценария использования: делая внутреннюю базу знаний (runbook'и, постмортемы, плейбуки) доступной для запросов любому MCP-клиенту без написания индивидуальной интеграции для каждого клиента.
Сервер предоставляет три инструмента:
search_runbooks(query, top_k)— семантический поиск по корпусу runbook'ов, ранжированный по косинусной близости.get_runbook(doc_id)— получить полный текст одного runbook по идентификатору.list_runbooks()— перечислить идентификаторы и заголовки всех индексированных runbook'ов.
Ключевые особенности
Реальный протокол MCP, а не имитация — построен на официальном
mcpPython SDK с серверомFastMCPи проверен end-to-end с реальнымClientSession, подключающимся через stdio (см. пример запуска ниже) — а не только модульными тестами базовых функций.Семантический поиск без зависимостей — хэширующий эмбеддер превращает каждый документ в вектор фиксированного размера без внешней модели, API-ключа или сетевых вызовов, поэтому сервер работает полностью офлайн. Косинусная близость этих векторов ранжирует результаты по смыслу, а не только по совпадению ключевых слов.
Логика инструментов отделена от транспорта —
src/tools.pyсодержит простые функции надCorpus, независимо протестированные;src/server.pyтолько подключает эти функции к декораторам инструментов MCP. Замена stdio на HTTP-транспорт или корпуса на реальное хранилище документов не затрагивает логику инструментов.Понятная обработка ошибок —
get_runbookдля неизвестного идентификатора возвращает структурированный ответ{"error": ...}вместо исключения, поэтому клиент в любом случае получает полезный ответ.
Архитектура
MCP client (Claude Desktop, IDE, custom agent)
│ stdio / JSON-RPC
▼
FastMCP server (src/server.py)
│ registers tools
▼
tools.py ──▶ Corpus (src/corpus.py)
│
▼
hashing embedder + cosine similarity
│
▼
5 sample engineering runbooksТехнологический стек
Слой | Инструменты |
Язык | Python |
Протокол | Model Context Protocol ( |
Поиск | Хэширующий эмбеддер без зависимостей + косинусная близость |
CI/CD | GitHub Actions |
Структура проекта
.
├── src/
│ ├── corpus.py # Hashing embedder, Corpus, sample runbook documents
│ ├── tools.py # Pure tool functions (search / get / list)
│ └── server.py # FastMCP server wiring tools.py into MCP tool decorators
├── tests/
│ ├── test_corpus.py
│ └── test_tools.py
├── .github/workflows/ci.yml
├── Dockerfile
├── requirements.txt
└── README.mdНачало работы
Предварительные требования
Python 3.10+
Установка
git clone https://github.com/deekshu05/mcp-document-search-server.git
cd mcp-document-search-server
pip install -r requirements.txtЗапуск сервера
python -m src.serverЭто запускает сервер на stdio, ожидая подключения MCP-клиента.
Подключение из Claude Desktop
Добавьте это в ваш claude_desktop_config.json:
{
"mcpServers": {
"runbook-search": {
"command": "python",
"args": ["-m", "src.server"],
"cwd": "/path/to/mcp-document-search-server"
}
}
}Перезапустите Claude Desktop, и search_runbooks, get_runbook и list_runbooks станут инструментами, которые Claude может вызывать напрямую в разговоре.
Запуск с Docker
docker build -t mcp-runbook-server .
docker run -i mcp-runbook-serverПример запуска
Реальный вывод Python MCP-клиента, подключающегося к этому серверу через stdio и вызывающего его инструменты — не симулированная стенограмма:
Tools exposed: ['search_runbooks', 'get_runbook', 'list_runbooks']
search_runbooks('the primary database node is not responding'):
{
"doc_id": "rb-001",
"title": "Database failover procedure",
"snippet": "Database failover procedure. When the primary Postgres node becomes
unresponsive, promote the standby replica using the orchestrator's promote
command, update the connection endpoint in the service config map, and verify",
"score": 0.439
}
{
"doc_id": "rb-003",
"title": "Deploy rollback procedure",
"snippet": "Deploy rollback procedure. If error rates exceed the alert
threshold within ten minutes of a deploy, trigger the automated rollback to
the previous stable image tag, confirm the health checks pass on all
replicas, and po",
"score": 0.3208
}
get_runbook('rb-001'):
{
"doc_id": "rb-001",
"title": "Database failover procedure",
"text": "Database failover procedure. When the primary Postgres node becomes
unresponsive, promote the standby replica using the orchestrator's promote
command, update the connection endpoint in the service config map, and
verify replication lag has dropped to zero on the new primary before
resuming writes. Page the on-call DBA if promotion does not complete within
five minutes."
}Запрос никогда не упоминает «Postgres» или «failover» по имени — это простое описание симптома — и поиск всё равно ранжирует правильный runbook первым по смыслу, а не по совпадению ключевых слов, с реальным вторым результатом (процедура отката), который действительно является следующим наиболее связанным runbook'ом.
Влияние
Подобный шаблон превращает внутреннюю базу знаний, которая раньше требовала от кого-то знания, какую страницу вики искать, в нечто, что любой MCP-совместимый ИИ-ассистент может напрямую запрашивать и цитировать, сокращая время между «началом инцидента» и «появлением нужного runbook'а перед реагирующим».
Дорожная карта
Заменить хэширующий эмбеддер на настоящую модель эмбеддингов при работе с более крупным корпусом
Потоковый HTTP-транспорт наряду со stdio для удалённых MCP-клиентов
Сквозное индексирование, чтобы новые runbook'и можно было добавлять без перезапуска сервера
Разграничение прав доступа, чтобы разные MCP-клиенты видели разные подмножества корпуса
Лицензия
MIT
This server cannot be installed
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 Connectors
Knowledge coverage map and health score. Ingest docs into a governed knowledge graph via MCP.
Read-only MCP connector serving the Run It on AI book; index and Implementation Blocks are free.
Query any docs site via MCP. Submit a URL, ask questions, get cited answers.
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/deekshu05/mcp-document-search-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server