Экосистема готовых серверов: зачем использовать чужой код
Когда MCP появился в ноябре 2024, Anthropic одновременно выпустил репозиторий modelcontextprotocol/servers — коллекцию эталонных реализаций. Это не просто примеры: это production-ready серверы с обработкой ошибок, тестами и документацией, которые поддерживает сама Anthropic.
Принципиальный момент: готовый сервер работает через тот же stdio-транспорт, что и твой собственный. Claude Desktop запускает его как дочерний процесс, передаёт запросы через stdin/stdout. С точки зрения агента — никакой разницы, написал ли сервер ты или Anthropic.
npx @modelcontextprotocol/server-filesystem /path
как отдельный дочерний процесс. Четыре сервера = четыре процесса.
Это изоляция: падение одного сервера не влияет на остальные.
Инструменты всех серверов объединяются в один список — агент видит их вместе.
Анатомия конфига Claude Desktop
Все готовые серверы подключаются через один конфиг-файл. Прежде чем разбирать конкретные серверы — поймём структуру конфига.
Путь к конфигу: macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json Linux: ~/.config/Claude/claude_desktop_config.json
npx, node, python, uvx.
Для Node.js-серверов обычно npx.ps aux).true — сервер не запускается, но остаётся в конфиге.
Удобно для временного отключения."@modelcontextprotocol/server-filesystem@0.6.2".
server-filesystem: чтение и запись файлов
Самый часто используемый сервер. Принимает список разрешённых директорий
как аргументы командной строки. Все операции с файлами за пределами этих
директорий отклоняются — реализован тот же sandbox через path.resolve(),
что мы строили вручную в предыдущем уроке.
| Инструмент | Что делает |
|---|---|
| read_file | Читает файл целиком, возвращает текст + метаданные MIME-типа |
| read_multiple_files | Читает несколько файлов одним запросом, не тратя tool-call токены |
| write_file | Записывает текст в файл, создаёт директории при необходимости |
| edit_file | Патч-редактирование: заменяет строки по точному совпадению (не regexp) |
| create_directory | Создаёт директорию и все промежуточные |
| list_directory | Список файлов и папок с типами и размерами |
| directory_tree | Рекурсивное дерево директорий в виде JSON |
| move_file | Переименование и перемещение файлов |
| search_files | Рекурсивный glob-поиск по имени файла |
| get_file_info | Размер, даты создания/изменения, права доступа |
| list_allowed_directories | Показывает список разрешённых директорий (sandbox) |
Конфигурация — просто список разрешённых директорий как аргументы:
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/ivan/projects",
"/Users/ivan/Documents",
"/tmp/agent-workspace"
]
}
}
}
После перезапуска Claude Desktop агент может работать с файлами. Примеры запросов:
«Покажи структуру директории /Users/ivan/projects/my-app»
«Прочитай файл src/main.py и найди все TODO-комментарии»
«Создай файл /tmp/agent-workspace/summary.md с отчётом о результатах»
«Переименуй все .txt файлы в /tmp/agent-workspace в .md»
\r\n),
а поиск идёт с Unix (\n) — совпадения не будет и инструмент вернёт ошибку.
Перед редактированием лучше прочитать файл через read_file.
server-puppeteer: агент в браузере
Puppeteer управляет headless Chromium: загружает страницы, кликает элементы, заполняет формы, делает скриншоты. Сервер держит один экземпляр браузера на протяжении всей сессии — переходы между страницами сохраняют состояние (cookies, localStorage). Это критично для сайтов с авторизацией.
| Инструмент | Что делает |
|---|---|
| puppeteer_navigate | Переходит по URL, ждёт загрузки страницы |
| puppeteer_screenshot | Делает скриншот страницы или элемента (base64 PNG) |
| puppeteer_click | Клик по CSS-селектору или координатам |
| puppeteer_fill | Вводит текст в поле ввода по CSS-селектору |
| puppeteer_select | Выбирает значение в <select> |
| puppeteer_hover | Наводит курсор (открывает tooltips, dropdown меню) |
| puppeteer_evaluate | Выполняет произвольный JS в контексте страницы |
| puppeteer_get_content | Возвращает текстовое содержимое страницы (без HTML-тегов) |
{
"mcpServers": {
"puppeteer": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-puppeteer"]
}
}
}
При первом запуске Puppeteer скачает Chromium (~170 MB). Затем браузер стартует в headless-режиме и остаётся запущенным. Примеры задач:
«Зайди на https://news.ycombinator.com и верни заголовки топ-10 постов»
«Сделай скриншот главной страницы https://example.com»
«Заполни форму логина на сайте: логин admin@test.com, пароль не введи,
просто проверь что поле существует»
«Найди на странице все ссылки с текстом "Download" и верни их href»
PUPPETEER_ARGS:
"--proxy-server=http://proxy:8080".
server-postgres: PostgreSQL как набор ресурсов
Сервер реализует комбинацию инструментов и ресурсов. Схема каждой таблицы доступна как MCP Resource — клиент может подгрузить её в контекст при инициализации, не тратя токены на tool call. SQL-запросы — через инструмент. По умолчанию только SELECT.
| Тип | Название | Что делает |
|---|---|---|
| tool | query | Выполняет произвольный SQL. По умолчанию обёрнут в READ ONLY транзакцию |
| resource | postgres://<host>/<db>/<schema>/<table>/schema | JSON-схема таблицы: колонки, типы, ключи, индексы |
| resource list | postgres://…/schema | Список всех таблиц во всех схемах базы данных |
Connection string передаётся как аргумент командной строки. Из соображений безопасности лучше использовать env-переменную:
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://user:password@localhost:5432/mydb"
]
}
}
}
Лучший способ — передать connection string через env и использовать переменную в args (Claude Desktop поддерживает подстановку):
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": {
"POSTGRES_URL": "postgresql://readonly_user:secret@localhost:5432/prod_db"
}
}
}
}
CREATE USER mcp_agent WITH PASSWORD 'secret';GRANT CONNECT ON DATABASE prod_db TO mcp_agent;GRANT USAGE ON SCHEMA public TO mcp_agent;GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_agent;Даже если сервер обходит READ ONLY транзакцию — пользователь без прав ничего не сломает.
Примеры запросов агенту с подключённым Postgres:
«Покажи структуру таблицы orders»
«Сколько заказов за последний месяц в статусе pending?»
«Найди топ-5 клиентов по сумме заказов за 2024 год»
«Есть ли индексы на колонку user_id в таблице events?»
server-github: работа с репозиториями
Сервер оборачивает GitHub REST API. Для работы нужен Personal Access Token (PAT)
с нужными scopes. Минимальный набор для чтения публичных репо — без scope вообще
(просто токен). Для работы с issues и PR нужны repo scopes.
| Инструмент | Что делает |
|---|---|
| create_or_update_file | Создаёт или обновляет файл в репозитории через API |
| search_repositories | Поиск репозиториев по запросу |
| create_repository | Создаёт новый репозиторий |
| get_file_contents | Читает файл или список файлов в директории |
| push_files | Коммитит несколько файлов одним коммитом |
| create_issue | Создаёт issue с заголовком, телом, метками |
| create_pull_request | Открывает Pull Request из ветки в ветку |
| fork_repository | Форкает репозиторий в аккаунт пользователя |
| create_branch | Создаёт ветку из указанного SHA или другой ветки |
| list_commits | Список коммитов в ветке с пагинацией |
| list_issues | Список issues с фильтрами по статусу, метке, assignee |
| update_issue | Меняет статус, метки, assignee у issue |
| add_issue_comment | Добавляет комментарий к issue |
| search_code | Полнотекстовый поиск по коду в репозитории |
| search_issues | Поиск по issues и PR с расширенным синтаксисом |
| get_pull_request | Детали PR: файлы, диффы, reviewers, статус CI |
| list_pull_requests | Список открытых/закрытых PR с фильтрами |
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxxxxxxxxxxxxxxxxxx"
}
}
}
}
Создать PAT: GitHub Settings → Developer settings → Personal access tokens → Fine-grained tokens.
Для типичных задач достаточно: Contents (read), Issues (read+write),
Pull requests (read+write), Metadata (read).
«Покажи открытые issues в репозитории anthropics/claude-code с меткой bug»
«Найди в коде репозитория все использования функции parse_json»
«Создай issue в my-org/my-repo: заголовок "Fix memory leak in worker", метка bug»
«Прочитай файл README.md в ветке main репозитория my-org/my-repo»
Несколько серверов одновременно
Claude Desktop запускает все серверы из конфига параллельно при старте. Инструменты всех серверов объединяются в один список. Агент видит их вместе и сам решает, какой использовать.
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/ivan/projects"
]
},
"postgres": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://agent:secret@localhost:5432/app"
]
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxxxxxxxxxxxxxxxxxx"
}
}
}
}
С таким конфигом агент может одновременно: читать код из файловой системы, смотреть данные в базе, создавать issues на GitHub. Реальный пример сессии:
Пользователь: «Найди все функции в src/, которые делают запросы к таблице orders.
Для каждой создай GitHub issue с предложением добавить индекс,
если его нет в БД»
Агент:
1. list_directory("/Users/ivan/projects/src") → список файлов
2. search_files("/Users/ivan/projects/src", "*.py") → Python файлы
3. read_multiple_files([...]) → код
4. query("SELECT indexname FROM pg_indexes WHERE tablename='orders'")
→ существующие индексы
5. create_issue("my-org/app", "Add index on orders.user_id", ...)
→ issue создан
read_file), Claude Desktop
использует последний по порядку в конфиге. Избегай дублирования
или переименовывай серверы так, чтобы имена были семантически разными.
Как найти нужный сервер
Экосистема MCP растёт быстро. Три основных источника:
Популярные серверы сообщества, которые стоит знать:
| Сервер | Что умеет |
|---|---|
| mcp-server-git | Git операции: log, diff, blame, commit, branch — через subprocess |
| server-sqlite | SQLite (официальный) — аналог postgres для локальных БД |
| server-slack | Отправка сообщений, чтение каналов, поиск (нужен Bot Token) |
| server-brave-search | Веб-поиск через Brave Search API (нужен ключ) |
| server-google-maps | Геокодирование, маршруты, поиск мест через Google Maps API |
| server-fetch | Простой HTTP-клиент + конвертер HTML→Markdown |
| server-memory | Knowledge graph для постоянной памяти агента между сессиями |
| server-sequential-thinking | Инструмент для пошагового рассуждения (думает вслух) |
Типичные ошибки
PATH
может не содержать /usr/local/bin или ~/.nvm.
Сервер не запускается, в логах — «command not found».
/usr/local/bin/npx или /opt/homebrew/bin/npx. Найди путь через which npx."args": ["...server-postgres", "postgresql://user:pass@host/db"] —
пароль виден любому пользователю системы через ps aux.
Особенно критично на shared серверах.
"env": {"POSTGRES_URL": "..."}. Большинство серверов читают конфиг из переменной окружения."env": {"PUPPETEER_ARGS": "--proxy-server=http://..."} или настрой системный прокси через переменную https_proxy.repo
даёт агенту доступ ко всем приватным репозиториям аккаунта,
включая форки и архивированные. Утечка токена = компрометация всего.
claude_desktop_config.json только при запуске.
Изменения в конфиге — добавление сервера, изменение env — не применяются
в текущей сессии. Многие думают, что изменения подхватываются автоматически.
Шпаргалка
- Конфиг:
~/Library/Application Support/Claude/claude_desktop_config.json, полеmcpServers - Запуск: каждый сервер — отдельный процесс; Claude Desktop запускает все при старте
- npx -y: скачивает пакет в кэш при первом запуске; следующие запуски — из кэша
- filesystem: список разрешённых директорий как аргументы CLI; edit_file — точное совпадение строк
- puppeteer: один браузер на сессию; сохраняет cookies и состояние между командами
- postgres: READ ONLY по умолчанию; схемы таблиц — как MCP Resources; создай отдельного пользователя
- github: нужен PAT; fine-grained token лучше classic; токен через
env, не черезargs - Несколько серверов: инструменты объединяются; конфликт имён — побеждает последний в конфиге
- Secrets: всегда через
env, не черезargs(args видны в ps aux) - Перезапуск: изменения конфига применяются только после полного перезапуска Claude Desktop
Практика
server-filesystem с тремя директориями:
домашняя директория, /tmp и директория с текущим проектом.
Попроси агента: «Найди все Python-файлы в проекте, содержащие слово TODO
в комментариях, и запиши список в /tmp/todos.md».
Проверь, что файл создан корректно.
server-postgres к локальной базе данных
(можно использовать тестовую с несколькими таблицами).
Попроси агента: «Опиши схему базы данных, найди таблицы без первичных ключей
и таблицы с колонкой created_at без индекса».
Оцени, насколько точно агент читает схему через MCP Resources.
server-filesystem, server-github
и server-postgres. Дай агенту задачу, требующую всех трёх:
«Прочитай CHANGELOG.md из репозитория на GitHub,
найди все версии с типом "breaking change",
запроси из БД таблицу deployments по датам этих версий
и сохрани отчёт в /tmp/breaking_deploys.md».
Проследи, сколько tool call сделал агент и в каком порядке.