trainee-mcp-server
Test Task: Trainee Mcp Server
Учебный MCP-сервер на TypeScript: даёт Claude два инструмента (add, get_weather) и один ресурс (favorite-cities). Работает локально, общается с хостом по транспорту stdio, подключается к Claude Desktop.
Источник данных о погоде — Open-Meteo. Ключ API не нужен, регистрация не требуется.
Что умеет
Тип | Имя | Что делает |
tool |
| Складывает два числа и возвращает сумму |
tool |
| Текущая погода в городе: температура, влажность, скорость ветра |
resource |
| JSON-список избранных городов; задаётся переменной окружения |
Схема инструмента get_weather
Поле | Тип | Обязательное | Описание |
|
| да | Название города: |
|
| нет | Единицы измерения температуры. Если не указано — берётся значение |
Схема описана через Zod; SDK превращает её в JSON Schema, которую видит модель. Значения вне перечисленных (например, kelvin) отсекаются до попадания в код инструмента.


Требования
Node.js 18+ (рекомендуется актуальная LTS) — используются встроенные
fetchиAbortSignal.timeoutClaude 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 |
|
macOS |
|
Быстрый путь: меню 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 — вместо того чтобы молча работать с мусором.
Переменная | Назначение | По умолчанию |
| Список избранных городов через запятую. Отдаётся ресурсом |
|
| Единицы температуры, если инструмент вызван без |
|
| Таймаут HTTP-запроса к Open-Meteo, мс |
|
Значения в claude_desktop_config.json задаются строками, включая числовые (требование JSON) — схема приводит их к нужному типу самостоятельно.
Сервер, запущенный из Claude Desktop, не наследует пользовательское окружение: переменные, выставленные в терминале, до него не дойдут. Задавать их нужно в блоке
envконфига.
Примеры запросов к Claude
Что спросить | Что должно произойти |
«Сколько будет 9176 плюс 912730?» | Вызов |
«Какая сейчас погода в Вильнюсе?» | Вызов |
«Погода в Нью-Йорке в фаренгейтах» | Вызов |
Приложить ресурс «Избранные города» и спросить: «Какие города в списке? Покажи погоду для первого» | Чтение ресурса, затем вызов |


Ресурс, в отличие от инструмента, модель не запрашивает сама: его прикладывает пользователь через меню вложений.
Обработка ошибок
Все ошибки возвращаются как результат вызова с флагом isError: true, а не выбрасываются исключением. Разница существенная: при исключении модель получает протокольную ошибку без деталей, а так текст ошибки приходит ей как обычный ответ инструмента — и она может на него осмысленно отреагировать. Процесс сервера при этом не падает и продолжает обслуживать следующие вызовы.
Сценарий | Что получает Claude | Как воспроизвести |
Город не найден | Сообщение с предложением проверить написание | Спросить погоду в |
Сервис вернул неполные данные | Сообщение о том, что город определён верно, но данных нет и повтор с другим написанием не поможет | Закомментировать установку параметра |
Превышен таймаут | Сообщение с указанием лимита в секундах | Выставить |
Отдельно: 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, и любой вывод туда ломает обмен сообщениями с хостом.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/whmi1/trainee-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server