Превращение веб-инструмента в MCP-сервер без внешних зависимостей

Я развиваю DomainIntel. Это небольшое веб-приложение. Я хотел превратить его в сервер Model Context Protocol (MCP).

Я хотел, чтобы пользователи могли запустить всего одну команду: npx -y @domainintel/mcp.

Это означает максимальную простоту использования. Никакого клонирования репозиториев. Никакого долгого времени установки. Сервер должен работать как один файл без зависимостей во время выполнения.

Вот как я это сделал с помощью esbuild.

Проблема: Упаковка

Я использовал esbuild для сборки всего проекта. Мне пришлось решить несколько технических проблем:

• Статические импорты: esbuild не может отслеживать вызовы require во время выполнения. Я перешел от createRequire к стандартным ESM-импортам. Это позволило esbuild отслеживать граф зависимостей.

• Совместимость с CommonJS: Одна из зависимостей использовала require('net') внутри себя. Я добавил баннер в конфигурацию esbuild. Этот баннер внедряет createRequire, чтобы заглушка (shim) работала для встроенных модулей.

• Конфликты логгера: MCP использует stdout для связи. Мой текущий логгер пытался записывать данные в локальную директорию. В глобальном CLI это приводит к ошибке. Я использовал плагин onResolve, чтобы создать заглушку (stub) для логгера.

• Двойные шебанги: И мой входной файл, и мой баннер содержали шебанги. Это привело к созданию некорректного файла. Я удалил шебанг из исходного кода.

• Типы модулей: Я удалил "type": "module" из package.json. Это предотвратило попытки esbuild обрабатывать CommonJS-файлы как ESM. Входной файл .mjs остается ESM благодаря расширению.

• Фиксация версий: Одна из зависимостей перешла на ESM и сломала мою сборку. Я зафиксировал версию, чтобы обеспечить воспроизводимость бандла.

Результат

Итоговый файл — mcp/dist/server.mjs. Его размер составляет около 1,7 МБ. У него нет зависимостей во время выполнения.

Вы можете добавить его в Claude с помощью команды: claude mcp add domainintel -- npx -y @domainintel/mcp

Теперь ваш агент может выполнить запрос "give me a full report on stripe.com" и мгновенно получить данные.

Если у вас есть инструмент с основной логикой, оберните его в MCP-сервер. Это сделает ваш инструмент полезным для ИИ-агентов.

Source: https://dev.to/chris_morris/turning-a-web-tool-into-a-zero-dependency-mcp-server-21ca

Optional learning community: https://t.me/GyaanSetuAi