Что из себя представляет MCP-сервер?
Как правило - это небольшая программа на любом языке программирования (чаще всего - Python/TypeScript), которая никакой логики в себе не содержит, и просто связывает внешнюю систему и MCP-клиент между собой.
Аутентификация
Довольно часто для доступа к внешней системе MCP-сервер содержит в себе процедуры аутентификации - т.е. именно ему нужно передавать все логины/пароли/токены, и он решает проблему с доступом LLM к каким-то вашим внутренним ресурсам.
Как можно общаться с MCP-сервером?
Есть 2 транспорта из коробки:
● stdio - т.е. через стандартный input/output: в этом случае MCP-сервер запускается MCP-хостом как консольное приложение.
В этом случае предполагается, что вы скачиваете MCP-сервер в виде кода или готовой к запуску программы на машину, где у вас находится сам хост, и они работают в тесной связке, запускаясь вместе
● sse - это по имени Server-Sent Events, одного из стандартных (и древних) способов передачи сообщений поверх HTTP, использующего долгоживущее соединение для передачи данных в одном направлении (server -> client).
В случае с MCP нам всё-таки нужен полноценный двусторонний обмен с сервером, и, соответственно, 2 endpoint'а:
* GET с собственно SSE - по нему будут передаваться сообщения от сервера клиенту в режиме бесконечного стрима
* обычный POST для передачи сообщений от клиента серверу
Сервер с таким транспортом может быть запущен где угодно и может обслуживать много клиентов одновременно, в отличие от stdio.
В подавляющем большинстве случаев, однако, сервера сделаны именно в варианте stdio, но есть способ конвертить stdio <-> sse, см. ниже, в разделе с инструментами.
Где брать MCP-сервера?
К примеру, тут: https://github.com/modelcontextprotocol/servers или тут: https://github.com/punkpeye/awesome-mcp-servers/
Вообще серверов буквально тысячи уже (https://glama.ai/mcp/servers, https://mcp.so/), но я бы советовал прям глазами проверять код тех, которые вы собираетесь использовать, т.к. порог входа низкий, модерации нет, многие вообще не работают - словом, это дикое поле :)
Сколько серверов можно подключать к хосту?
Явного ограничения нет, но список всех сущностей, которые предоставляет MCP-сервер (tools, resources, prompts, etc) с их описаниями передается LLM в контексте, чтобы она про них знала и могла попросить вызвать что-то, что нужно для решения задачи пользователя.
Соответственно, надо быть аккуратным с подключением большого количества серверов - помимо отъедания ими контекста, можно ещё и запутать модель, и она будет вызывать не те функции, которые вы ожидаете.
А если вы делаете свой сервер - лучше быть кратким и точным в своих описаниях и названиях экспортируемых сущностей.
Пример сервера
Вот пример простого MCP-сервера:
https://github.com/modelcontextprotocol/servers/blob/main/src/postgres/index.ts - это всего лишь ~140 строк TypeScript кода, которые дают модели возможность просматривать схемы таблиц в вашем PostgreSQL и выполнять запросы к выбранной базе.
Это stdio-сервер, и запускается он как консольное приложение, которому передаются данные для доступа к БД, к примеру, так:
node <file-path-to>/index.js postgresql://myuser:mypassword@localhost:5432/mydb
Оцените, насколько просто можно сделать сервер под свои задачи.
Полезные инструменты
MCP-inspector: https://github.com/modelcontextprotocol/inspector
С его помощью можно проверять, работает ли MCP-сервер, узнать, какие сущности он экспортирует и посылать ему тестовые запросы.
Supergateway: https://github.com/supercorp-ai/supergateway
Имбовая штука для конверсии MCP-сервера sse <-> stdio.
Я предпочитаю sse в силу большого количества багов вокруг stdio, так что все сервера перевел на sse с помощью Supergateway, собрав их в docker-compose и развесив контейнеры на разные порты на своей машине.
Как вариант, для тех же целей можно использовать mcp-proxy: https://github.com/sparfenyuk/mcp-proxy
#ai #mcp
