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
Audiense Insights MCP Server

Audiense Insights MCP Server

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

官方
精选
本地
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

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

官方
精选
本地
TypeScript
VeyraX

VeyraX

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

官方
精选
本地
Kagi MCP Server

Kagi MCP Server

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

官方
精选
Python
graphlit-mcp-server

graphlit-mcp-server

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

官方
精选
TypeScript
Exa MCP Server

Exa MCP Server

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

官方
精选
mcp-server-qdrant

mcp-server-qdrant

这个仓库展示了如何为向量搜索引擎 Qdrant 创建一个 MCP (Managed Control Plane) 服务器的示例。

官方
精选
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选