Skip to main content
Glama
whmi1

trainee-mcp-server

by whmi1

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(config://favorite-cities)

JSON-список избранных городов; задаётся переменной окружения

Схема инструмента get_weather

Поле

Тип

Обязательное

Описание

city

string, минимум 1 символ

да

Название города: Vilnius, Москва, Berlin

units

"celsius" | "fahrenheit"

нет

Единицы измерения температуры. Если не указано — берётся значение DEFAULT_UNITS

Схема описана через Zod; SDK превращает её в JSON Schema, которую видит модель. Значения вне перечисленных (например, kelvin) отсекаются до попадания в код инструмента.

Вызов инструмента add

Вызов инструмента get_weather


Related MCP server: MCP Quickstart Weather Server

Требования

  • 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 — сервер должен быть в списке. Список его инструментов виден в меню вложений рядом с полем ввода.

Подключённые MCP-серверы


Переменные окружения

Все переменные необязательны. Значения читаются при старте и валидируются через 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 для города из списка

get_weather с фаренгейтами

Чтение ресурса favorite-cities

Ресурс, в отличие от инструмента, модель не запрашивает сама: его прикладывает пользователь через меню вложений.


Обработка ошибок

Все ошибки возвращаются как результат вызова с флагом 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, и любой вывод туда ломает обмен сообщениями с хостом.

F
license - not found
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

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