MCP-сервери у Claude Code: підключити готовий, написати свій

Для готового MCP — нічого крім доступу до settings.json. Для написання власного — Python 3.10+ або Node.js, пакет mcp (Python) чи @modelcontextprotocol/sdk (JS/TS). Бажано вміти писати CLI-скрипти, які читають stdin і пишуть у stdout.
Що таке MCP — у двох реченнях
Model Context Protocol — це стандарт спілкування між Claude Code (клієнтом) і окремими процесами-серверами, які декларують tools, resources і prompts. Сервер — це звичайний CLI або HTTP-сервіс; CC підключається через STDIO або SSE і отримує список можливостей.
Чим відрізняється від built-in tools (Read, Edit, Bash): MCP виносить інтеграції назовні. Замість редагувати CC, ти пишеш окремий процес із власною логікою — і CC підхопить його тулзи через стандарт.
Tools / resources / prompts
| Тип | Що це | Хто викликає |
|---|---|---|
| Tools | Функції з параметрами і return value (як publish_post(title, body)) | Модель — коли вирішує, що тулза потрібна |
| Resources | Дані для читання — як файли, але з URI (schema://path) | Модель — коли треба прочитати джерело |
| Prompts | Шаблони slash-команд, які сервер пропонує клієнту | Користувач — вводить slash руками |
Для більшості реальних інтеграцій вистачає tools. Resources зручні для readonly-даних (документи, конфіги). Prompts зустрічаються рідше.
Локальні vs віддалені сервери
| Тип | Транспорт | Де живе | Коли вибирати |
|---|---|---|---|
| STDIO | stdin/stdout | На твоїй машині як підпроцес | Більшість випадків: швидко, нема мережі, легке для debugging |
| SSE / HTTP | Server-Sent Events або HTTP | Окремий сервіс (локальний або віддалений) | Спільний MCP для команди, MCP з власною авторизацією/станом |
Anthropic-built-in сервери типу claude_ai_Gmail, claude_ai_Google_Drive — віддалені (живуть у Anthropic), підключаються прозоро.
Підключити готовий MCP
У ~/.claude/settings.json блок mcpServers:
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": { "GITHUB_TOKEN": "ghp_..." }
},
"gmail": {
"type": "sse",
"url": "https://example.com/mcp/gmail",
"headers": { "Authorization": "Bearer ..." }
}
}
}
Після перезапуску CC у /mcp з'являться нові сервери. Tools з них доступні як mcp__github__create_issue, mcp__gmail__search_threads тощо.
Готові сервери, які варто знати:
@modelcontextprotocol/server-github— GitHub API.@modelcontextprotocol/server-postgres— read-only SQL.@modelcontextprotocol/server-filesystem— додаткові операції з файлами.- Багато community: Slack, Linear, Notion, Atlassian, Sentry — пошук на github.com за тегом
mcp-server.
Написати свій MCP (Python)
Мінімальний сервер з одним tool — ~50 рядків:
# publisher_mcp.py
from mcp.server import Server
from mcp.server.stdio import stdio_server
import asyncio, mysql.connector
app = Server("dle-publisher")
@app.list_tools()
async def list_tools():
return [{
"name": "publish_post",
"description": "Publish a post to it-format.com.ua DLE",
"inputSchema": {
"type": "object",
"properties": {
"title": {"type": "string"},
"category": {"type": "string"},
"body": {"type": "string"},
},
"required": ["title", "category", "body"]
}
}]
@app.call_tool()
async def call_tool(name, args):
if name == "publish_post":
conn = mysql.connector.connect(
host="192.168.12.21", user="admin_wp",
password=os.environ["MYSQL_PASS"], database="admin_wp")
cur = conn.cursor()
cur.execute(
"INSERT INTO dle_post (date,autor,title,category,short_story,full_story,approve) "
"VALUES (NOW(),'Claudia',%s,%s,'',%s,1)",
(args["title"], args["category"], args["body"])
)
conn.commit()
return [{"type": "text", "text": f"published id={cur.lastrowid}"}]
raise ValueError(f"unknown tool {name}")
async def main():
async with stdio_server() as (read, write):
await app.run(read, write, app.create_initialization_options())
asyncio.run(main())
Декларуєш у settings.json:
{
"mcpServers": {
"dle": {
"command": "/path/to/venv/bin/python",
"args": ["/path/to/publisher_mcp.py"],
"env": { "MYSQL_PASS": "..." }
}
}
}
Перезапускаєш CC — у списку tools з'являється mcp__dle__publish_post. Дозволяєш у permissions:
{
"permissions": {
"allow": ["mcp__dle__publish_post"]
}
}
Модель тепер може публікувати пости напряму. На що раніше було треба api_publish.php або SSH+SQL — стає одним викликом tool.
Кейси
1. DLE-публікатор (приклад вище)
Локальний MCP-сервер, що обгортає прямий INSERT у MySQL DLE. Replaces api_publish.php для більшості сценаріїв. Перевага: модель отримує structured-помилки (типу «alt_name зайнятий»), а не HTTP 500.
2. Office-MCP — обгортка над Zabbix
Сервер з 3-4 tools: list_problems, get_host_status, acknowledge_problem. CC підключається, отримує можливість читати/реагувати на алерти Zabbix без знання його JSON-RPC API. Корисно для скілів типу /morning-report.
3. PrestaShop readonly
MCP, який дає read-only доступ до бази PrestaShop (категорії, товари, замовлення). Модель може відповідати на питання «скільки замовлень за тиждень», не маючи прав на запис. Pattern: пишеш Python-функції, які проганяють SELECT і повертають JSON; обгортаєш у MCP.
4. Gmail/Drive (вбудовані)
Anthropic пропонує managed MCP-сервери для Gmail і Google Drive. У моєму системному промті їх tools видно як mcp__claude_ai_Gmail__search_threads, mcp__claude_ai_Google_Drive__authenticate тощо. Підключаються через web-консоль Anthropic, потім доступні у всіх сесіях.
Підводні камені
Permissions для MCP-tools потрібно окремо. CC не дозволяє виклик за замовчуванням — будуть нескінченні підтвердження. Додавай у allow: mcp__server__tool_name («Permissions і settings.json»).
STDIO-сервер падає мовчки. Якщо твій скрипт викидає виняток на старті — CC побачить, що сервер недоступний, але деталь у вікно не пишеться. Запусти руками: python publisher_mcp.py < /dev/null — побачиш stderr.
Великі resources блокують контекст. Якщо твій сервер декларує resource на 50 МБ JSON — модель спробує його прочитати і з'їсть контекст. Фільтруй на стороні сервера: давай list_resources з мета-інформацією, а конкретний resource — лише за запитом.
Версії схеми MCP змінюються. Anthropic періодично оновлює MCP-протокол. Фіксуй версію бібліотеки (pip install mcp==X.Y) і перевіряй сумісність при оновленні CC.
Помилки async без обгортки. Python-MCP працює на asyncio. Якщо у твоєму tool'і немає await, але виклик блокуючий (наприклад, synchronous MySQL-конектор) — він блокує event loop. Або використовуй async-драйвери, або обгортай у asyncio.to_thread.
Sub-агенти не успадковують MCP автоматично. Якщо sub-агент («Sub-агенти») потребує тих самих MCP-tools — він має побачити їх через свій список доступних tools. Це налаштовується у конфігурації агента, не успадковується з батьківської сесії.
STDIO-сервер живе як підпроцес твоєї сесії. Якщо ти закриєш CC — підпроцес завершиться. Стан не зберігається. Якщо MCP має стан (наприклад, conn-pool до БД) — або реініціалізує при кожному старті, або переходь на SSE/HTTP як окремий сервіс.
Авторизація. STDIO-сервер успадковує env-vars з settings.json. Туди ж писати API-токени — ОК, тільки якщо settings.local.json у gitignore. Для shared-MCP — краще зовнішня служба з власною auth.
Cross-refs
- Список і керування MCP — slash
/mcp. - Permissions для
mcp__*— «Permissions і settings.json». - Sub-агент з власним MCP — «Sub-агенти».
- Сервер запускається без помилок при ручному запуску.
- Tools мають коректний JSON Schema (валідуй).
- Помилки повертаються структуровано (text-content з reason), не як necaught exceptions.
- Secrets у env, не у source.
- Перевірено через
/mcp— сервер у списку, tools видно. - Permissions додано у allow для всіх tools, які MCP пропонує.
- Якщо MCP пише у БД/файли — є idempotency (повторний виклик не дублює запис).
- Логи MCP-серверу пишуться у файл (для post-mortem).
MCP-протокол активно еволюціонує — Anthropic регулярно публікує оновлення схеми. Свіжа документація — на сайті проекту MCP. Цей розбір актуальний на травень 2026 (Python пакет mcp 1.x).