trainee-mcp-server
A training MCP server built with TypeScript that provides basic tools (add, get_weather) and a resource (favorite-cities) for use with Claude Desktop. Weather data is fetched from Open-Meteo without requiring an API key.
README
Test Task: Trainee Mcp Server
Учебный MCP-сервер на TypeScript: даёт Claude два инструмента (add, get_weather) и один ресурс (favorite-cities). Работает локально, общается с хостом по транспорту stdio, подключается к Claude Desktop.
Источник данных о погоде — Open-Meteo. Ключ API не нужен, регистрация не требуется.
Что умеет
| Тип | Имя | Что делает |
|---|---|---|
| tool | add |
Складывает два числа и возвращает сумму |
| tool | get_weather |
Текущая погода в городе: температура, влажность, скорость ветра |
| resource | favorite-cities<br>(config://favorite-cities) |
JSON-список избранных городов; задаётся переменной окружения |
Схема инструмента get_weather
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
city |
string, минимум 1 символ |
да | Название города: Vilnius, Москва, Berlin |
units |
"celsius" | "fahrenheit" |
нет | Единицы измерения температуры. Если не указано — берётся значение DEFAULT_UNITS |
Схема описана через Zod; SDK превращает её в JSON Schema, которую видит модель. Значения вне перечисленных (например, kelvin) отсекаются до попадания в код инструмента.


Требования
- Node.js 18+ (рекомендуется актуальная LTS) — используются встроенные
fetchиAbortSignal.timeout - Claude Desktop или другой MCP-хост
- Доступ в интернет для запросов к Open-Meteo
Установка и сборка
git clone <ссылка-на-репозиторий>
cd trainee-mcp-server
npm install
npm run build
После сборки появится dist/index.js — именно этот файл запускает хост.
Проверить, что сервер стартует:
npm start
Ожидаемое поведение: в консоль (stderr) выводится MCP-сервер запущен на stdio, после чего процесс остаётся висеть — он ждёт JSON-RPC-сообщения на stdin. Это нормально, выход по Ctrl+C.
Подключение к Claude Desktop
1. Открой файл конфигурации:
| ОС | Путь |
|---|---|
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
Быстрый путь: меню Claude → Settings → вкладка Developer → Edit Config.
2. Добавь блок сервера. Путь до dist/index.js должен быть абсолютным:
{
"mcpServers": {
"trainee-mcp-server": {
"command": "node",
"args": ["C:/Users/Имя/trainee-mcp-server/dist/index.js"],
"env": {
"FAVORITE_CITIES": "Minsk,Gomel,Moscow",
"DEFAULT_UNITS": "celsius",
"REQUEST_TIMEOUT_MS": "8000"
}
}
}
}
Блок env опционален — без него применяются значения по умолчанию (см. ниже).
Windows: в JSON обратный слэш — управляющий символ, поэтому путь пишется либо через прямые слэши (
C:/Users/...), либо через двойные обратные (C:\\Users\\...).
3. Полностью закрой и заново запусти Claude Desktop. Закрыть окно недостаточно — конфиг читается только при старте приложения.
4. Проверь подключение: Settings → Developer — сервер должен быть в списке. Список его инструментов виден в меню вложений рядом с полем ввода.

Переменные окружения
Все переменные необязательны. Значения читаются при старте и валидируются через Zod: при некорректном значении сервер завершается с ненулевым кодом и пишет причину в stderr — вместо того чтобы молча работать с мусором.
| Переменная | Назначение | По умолчанию |
|---|---|---|
FAVORITE_CITIES |
Список избранных городов через запятую. Отдаётся ресурсом favorite-cities |
Minsk,Gomel,Moscow |
DEFAULT_UNITS |
Единицы температуры, если инструмент вызван без units. Допустимо: celsius, fahrenheit |
celsius |
REQUEST_TIMEOUT_MS |
Таймаут HTTP-запроса к Open-Meteo, мс | 8000 |
Значения в claude_desktop_config.json задаются строками, включая числовые (требование JSON) — схема приводит их к нужному типу самостоятельно.
Сервер, запущенный из Claude Desktop, не наследует пользовательское окружение: переменные, выставленные в терминале, до него не дойдут. Задавать их нужно в блоке
envконфига.
Примеры запросов к Claude
| Что спросить | Что должно произойти |
|---|---|
| «Сколько будет 9176 плюс 912730?» | Вызов add, точная сумма из результата инструмента |
| «Какая сейчас погода в Вильнюсе?» | Вызов get_weather, температура в цельсиях |
| «Погода в Нью-Йорке в фаренгейтах» | Вызов get_weather с параметром units: "fahrenheit" |
| Приложить ресурс «Избранные города» и спросить: «Какие города в списке? Покажи погоду для первого» | Чтение ресурса, затем вызов get_weather для города из списка |


Ресурс, в отличие от инструмента, модель не запрашивает сама: его прикладывает пользователь через меню вложений.
Обработка ошибок
Все ошибки возвращаются как результат вызова с флагом isError: true, а не выбрасываются исключением. Разница существенная: при исключении модель получает протокольную ошибку без деталей, а так текст ошибки приходит ей как обычный ответ инструмента — и она может на него осмысленно отреагировать. Процесс сервера при этом не падает и продолжает обслуживать следующие вызовы.
| Сценарий | Что получает Claude | Как воспроизвести |
|---|---|---|
| Город не найден | Сообщение с предложением проверить написание | Спросить погоду в asdasdasd |
| Сервис вернул неполные данные | Сообщение о том, что город определён верно, но данных нет и повтор с другим написанием не поможет | Закомментировать установку параметра current в URL прогноза |
| Превышен таймаут | Сообщение с указанием лимита в секундах | Выставить REQUEST_TIMEOUT_MS=1 |
Отдельно: fetch не выбрасывает исключение на статусах 4xx/5xx, поэтому res.ok проверяется явно. Таймаут реализован через AbortSignal.timeout() — без него зависший внешний сервис подвесил бы вызов инструмента на неопределённое время.



Контрольная проверка — обычный запрос после серии сбоев: сервер жив, инструмент отрабатывает штатно.

Что такое MCP
MCP простыми словами - это "USB-порт" для подключения различных инструментов к модели. В силу того, что модель сама не ходит в интернет, а также писать кучу отдельных интеграций под каждый инструмент нецелесообразно, MCP выступает удобным единым протоколом.
Сам по себе MCP-сервер включает в себя 3 основных составляющие:
- tools — действия/функции, которые использует сама модель (два примера реализованы в данном тестовом задании);
- resources — данные для чтения, дополнительные справочники для модели (файлы, БД);
- prompts — уже готовые шаблоны для запросов.
Структура проекта
trainee-mcp-server/
├── src/
│ └── index.ts # типы, конфигурация, инструменты, ресурс, запуск
├── screenshots/ # скриншоты вызовов из Claude Desktop
├── *dist/ # результат сборки, в репозиторий не коммитится
├── package-lock.json
├── package.json
├── README.md
└── tsconfig.json
Логи сервера пишутся только в stderr: stdout занят транспортом JSON-RPC, и любой вывод туда ломает обмен сообщениями с хостом.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。
mcp-server-qdrant
这个仓库展示了如何为向量搜索引擎 Qdrant 创建一个 MCP (Managed Control Plane) 服务器的示例。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。