MCP Server: Claude Desktop + локальні інструменти
Model Context Protocol (MCP) — відкритий стандарт Anthropic для підключення AI-агентів до зовнішніх даних та інструментів. MCP-сервери дають Claude змогу працювати з файловою системою, базами даних, API та браузером безпосередньо з чату.
Архітектура MCP
MCP складається з трьох компонентів: Host (Claude Desktop, Claude Code), Client (вбудований у Host), Server (локальний процес з інструментами). Сервер надає: Tools (дії), Resources (дані) та Prompts (шаблони).
Встановлення Claude Desktop
Завантажте з claude.ai/download. Конфігурація MCP-серверів міститься у:
# macOS/Linux
~/.config/claude/claude_desktop_config.json
# Windows
%APPDATA%\Claude\claude_desktop_config.jsonПідключення готових MCP-серверів
# claude_desktop_config.json
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/home/user/projects"]
},
"sqlite": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-sqlite", "--db-path", "/data/mydb.sqlite"]
},
"brave-search": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-brave-search"],
"env": {"BRAVE_API_KEY": "your-key"}
}
}
}Створення власного MCP-сервера на Python
pip install mcpfrom mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp import types
import asyncio
server = Server("my-hosting-tools")
@server.list_tools()
async def list_tools():
return [
types.Tool(
name="check_domain",
description="Перевірити доступність домену",
inputSchema={
"type": "object",
"properties": {
"domain": {"type": "string", "description": "Доменне ім'я"}
},
"required": ["domain"]
}
)
]
@server.call_tool()
async def call_tool(name: str, arguments: dict):
if name == "check_domain":
domain = arguments["domain"]
import socket
try:
socket.gethostbyname(domain)
return [types.TextContent(type="text", text=f"Домен {domain} активний")]
except:
return [types.TextContent(type="text", text=f"Домен {domain} недоступний")]
async def main():
async with stdio_server() as streams:
await server.run(*streams, server.create_initialization_options())
asyncio.run(main())# Додати до claude_desktop_config.json
{
"mcpServers": {
"hosting-tools": {
"command": "python3",
"args": ["/path/to/my-mcp-server.py"]
}
}
}Типові помилки MCP-сервера
| Помилка | Причина | Що робити |
|---|---|---|
| Server disconnected одразу після запуску Claude Desktop | Неправильний шлях або команда в полі command/args секції mcpServers | Перевірте, що команда запускається вручну в терміналі без помилок тими самими аргументами |
| spawn npx ENOENT | Node.js або npx не встановлені, або недоступні в PATH процесу, з якого запущено Claude Desktop | Вкажіть повний шлях до npx: which npx і пропишіть абсолютний шлях у полі command |
| MCP error -32000: Connection closed | Сервер завершився з необробленим винятком одразу після старту | Запустіть сервер вручну і подивіться traceback у консолі перед підключенням до Claude Desktop |
| Зміни в claude_desktop_config.json не застосовуються | Claude Desktop кешує конфіг під час запуску і не перечитує його на льоту | Повністю завершіть процес Claude Desktop (не просто закрийте вікно) і запустіть знову |
Порівняння способів підключення інструментів
| Спосіб | Де виконується | Рівень доступу |
|---|---|---|
| MCP Server (локальний процес, stdio) | На машині користувача | Повний — такий самий, як у процесу користувача в системі |
| Function calling через API без MCP | На боці вашого власного бекенду | Обмежений тим, що явно реалізовано у вашому коді |
| Вбудовані інструменти Claude (вебпошук, виконання коду) | На боці інфраструктури Anthropic | Обмежений вбудованим набором, без доступу до файлової системи користувача |
Коли MCP не підходить
- Потрібен production-сервіс для зовнішніх користувачів — MCP через stdio розрахований на локальний десктоп, а не на сотні одночасних клієнтів
- Інструмент має працювати без встановленого локально Claude Desktop — тоді потрібен HTTP API, а не протокол stdio
- Потрібна сувора пісочниця навколо інструмента — звичайний локальний MCP-процес виконується з правами поточного користувача ОС, без ізоляції
- Критична гарантована сумісність між різними MCP-хостами без індивідуального тестування — реалізації протоколу в різних клієнтів поки відрізняються деталями
Якщо інструмент підключається до зовнішнього AI API, а не до Claude Desktop локально, знадобиться стаття «Claude API (Anthropic): підключення та інтеграція з VPS». Оскільки інструмент отримує довільний ввід від моделі, варто заздалегідь прочитати про «Безпека AI-агентів: захист від prompt injection».
Перевірка результату
Переконайтеся, що сервер запущено, він видимий Claude і справді викликається:
# Запустити сервер вручну і переконатися, що немає помилок у stdout/stderr
python3 /path/to/my-mcp-server.py
# Переглянути логи MCP у Claude Desktop (macOS)
tail -f ~/Library/Logs/Claude/mcp*.log
# Список інструментів через офіційний dev-інспектор
npx @modelcontextprotocol/inspector python3 /path/to/my-mcp-server.py
В інтерфейсі Claude Desktop сервер має з'явитися у списку підключених із зеленим індикатором і доступним інструментом check_domain. Для сценаріїв автоматизації без діалогу з Claude Desktop іноді зручніша готова платформа на кшталт «n8n на VDS: автоматизація з AI-агентами без коду».