Simple-MCP-Server
Домашнее задание MCP Agent
Система TypeScript MCP (Model Context Protocol), созданная для задания в MCP_HOMEWORK_SKILL.md: Agent Host, который загружает Agent Skill (SKILL.md), подключается к трём MCP-серверам через все три требуемых транспорта, обнаруживает/агрегирует их инструменты и позволяет Gemini выбирать и вызывать нужный инструмент на нужном сервере.
Архитектура
Agent Host (src/host)
skill-loader + connection-manager
+ tool-bridge + gemini-client
|
+------------------+------------------+
| | |
v v v
stdio server local HTTP server public HTTP server
(src/servers/stdio- (src/servers/http- (same http-server.ts,
server.ts) server.ts, no auth) API-key protected)
| | |
+------------------+-------------------+
|
shared tool logic (src/servers/shared/tools.ts)
3 tools (calculator, text_stats, unit_convert) + 1 resource + 1 promptsrc/servers/shared/tools.ts— единственная реализация 3 инструментов, 1 ресурса и 1 промпта, зарегистрированных одинаково на каждом сервере, чтобы одна и та же логика переиспользовалась везде (без дублирования бизнес-логики).src/servers/stdio-server.ts— MCP через stdio (запускается как дочерний процесс).src/servers/http-server.ts— MCP через Streamable HTTP. Один и тот же файл/код запускает и «локальный», и «публичный» серверы; разница только в конфигурации (PORT,PUBLIC_MCP_API_KEY).src/host/connection-manager.ts— MCP Host: подключается к каждому настроенному серверу, обнаруживает инструменты/ресурсы/промпты, разносит имена инструментов по пространствам имён как<namespace>__<tool>во избежание коллизий и направляет вызовы инструментов обратно на владеющий сервер.src/host/tool-bridge.ts— преобразует обнаруженные MCP-инструменты в объявления функций Gemini.src/host/gemini-client.ts— цикл вызова инструментов Gemini (отправка сообщения → чтение вызовов функций → диспетчеризация через connection manager → отправка ответов функций обратно → повтор до финального текста).src/host/skill-loader.ts— загружает SKILL.md и внедряет его как системную инструкцию модели, так что скилл активно формирует использование инструментов.src/host/agent-host.ts— связывает всё вышеперечисленное на основе config/servers.json.src/host/cli.ts— точка входа CLI (интерактивный режим или--demo).
Related MCP server: mcp-tools-server
Настройка
npm installСекреты хранятся в api.env (уже в gitignore):
API_KEY=your-gemini-api-key
# Optional, only needed once you deploy the public server:
# PUBLIC_MCP_URL=https://your-app.onrender.com/mcp
# PUBLIC_MCP_API_KEY=some-strong-random-keyЗапуск каждого компонента
stdio-сервер (20 баллов)
npm run server:stdio # run directly
npm run inspector:stdio # open MCP Inspector against itInspector обнаружит 3 инструмента (calculator, text_stats,
unit_convert), 1 ресурс (docs://unit-conversions) и 1 промпт
(explain-tool-result) и сможет выполнить/прочитать их все.
Локальный HTTP-сервер
npm run server:http # listens on http://127.0.0.1:8787/mcp, no auth
npm run inspector:http # then connect Inspector to that URLПубличный HTTP-сервер (15 баллов)
Тот же http-server.ts становится «публичным» сервером, как только задан
PUBLIC_MCP_API_KEY — каждый запрос теперь требует соответствующий заголовок
x-api-key; при отсутствии/неверном ключе возвращается 401 Unauthorized.
$env:PORT=8788; $env:PUBLIC_MCP_API_KEY="a-strong-secret"; npm run server:httpПубличное развёртывание (Render.com, с использованием приложенного render.yaml):
git init && git add -A && git commit -m "MCP homework", затем запушьте в ваш собственный репозиторий GitHub.В Render: New + → Blueprint → выберите репозиторий (он читает
render.yamlавтоматически) или создайте Web Service вручную с:Команда сборки:
npm install && npm run buildКоманда запуска:
npm run start:httpПуть проверки здоровья:
/health
В панели Render задайте переменную окружения
PUBLIC_MCP_API_KEYкак надёжный секрет (никогда не коммитьте его).После развёртывания поместите полученный URL + ключ в
api.env:PUBLIC_MCP_URL=https://<your-service>.onrender.com/mcpиPUBLIC_MCP_API_KEY=<тот же секрет>.Проверьте с помощью Inspector:
Без ключа → отклонено:
curl -X POST https://<url>/mcp -H "Content-Type: application/json" -d "{...}"возвращает401.С ключом → работает: передайте
--header "x-api-key: <secret>"вnpx @modelcontextprotocol/inspector --cli <url> --method tools/list.
Agent Host
npm run agent # interactive CLI
npm run agent:demo # runs a scripted set of demo queriesПри запуске хост:
Загружает
SKILL.mdкак системную инструкцию.Читает config/servers.json и подключается к stdio-серверу (запускается автоматически), локальному HTTP-серверу (должен уже работать) и публичному HTTP-серверу (пропускается автоматически, если
PUBLIC_MCP_URL/PUBLIC_MCP_API_KEYне заданы — он опционален, чтобы демо работало и без живого развёртывания).Обнаруживает и разносит по пространствам имён каждый инструмент, передаёт их Gemini и направляет каждый вызов инструмента, сделанный Gemini, на правильный MCP-сервер.
Конфигурация
Регистрация серверов управляется данными через config/servers.json
— добавляйте/удаляйте серверы там, а не редактируйте код хоста. ${VAR} в url
разрешается из process.env в момент подключения; apiKeyEnv задаёт имя
переменной окружения, значение которой отправляется как x-api-key.
Agent Skill
SKILL.md инструктирует агента предпочитать вызов инструментов
угадыванию при арифметике/конвертациях/текстовой статистике, выбирать один
инструмент с пространством имён на каждый логический запрос, обращаться
к ресурсу docs://unit-conversions при неуверенности в поддерживаемых
конвертациях и объяснять результаты простым языком. Он загружается дословно
в системную инструкцию Gemini при каждом запуске (см.
src/host/skill-loader.ts), так что его правила напрямую влияют на выбор
инструментов и стиль ответов — это видно в выводе демо (например, агент всегда
вызывает инструмент для арифметики, а не вычисляет сам).
Замечания по безопасности
Секреты не коммитятся;
api.envв gitignore, и публичный сервер читаетPUBLIC_MCP_API_KEYтолько из окружения.Публичный HTTP-сервер отклоняет любой запрос без соответствующего заголовка
x-api-key(401) и принимает запросы при наличии действительного ключа.
This server cannot be deployed
Maintenance
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server for progressive tool usage at any scale (see https://klavis.ai)
Analytics for MCP servers. Find out which of your tools agents get wrong. MCPulse shows you which tools AI agents retry, which come back empty, and which they never call at all. Two lines inside your own server. It never sees your arguments or your results. getmcpulse.com
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
Related MCP Servers
- FlicenseAqualityDmaintenanceA lightweight MCP server providing utility tools for math, text processing, data conversion, and URL fetching. It supports both STDIO and SSE communication modes for seamless integration with Claude Desktop and remote AI agents.51-
- AlicenseNot gradedqualityDmaintenanceA general-purpose MCP server with utility tools including datetime information, safe math calculations, text statistics, JSON extraction, knowledge base search, and HTTP GET requests. It demonstrates server-side MCP implementation and can be connected to Claude Desktop or LangGraph agents.MIT
- FlicenseNot gradedqualityDmaintenanceProvides math and weather tools accessible via LangGraph agent using MCP protocol with stdio and streamable HTTP transports.1-
- FlicenseNot gradedqualityDmaintenanceA model-agnostic MCP server exposing example tools (add1, multiply2, greet) for learning purposes, working with any LLM through stdio transport.-