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-агентами без кода».