trainee-mcp-server

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.

Category
访问服务器

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) отсекаются до попадания в код инструмента.

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

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


Требования

  • 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, и любой вывод туда ломает обмен сообщениями с хостом.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选