Skip to content

SpawnDock/api

Repository files navigation

mcp-tma-builder

MCP-сервер знаний по разработке Telegram Mini Apps и TON blockchain. AI-агент спрашивает — сервер отвечает, используя Qwen Code и базу из 55 документов (29,500+ строк).

Архитектура

AI-агент (docker-git у пользователя)
    |
    MCP tool: search({ query: "..." })
    |
    mcp-tma-client (npm-пакет, stdio-to-SSE bridge)
    | HTTP
    v
Express сервер (VPS)
    |-- Rate limit (10 req/s по IP)
    |-- /sse -> MCP SSE Transport
    |             |
    v             v
         Qwen Code (Docker-контейнер)
              |
              knowledge/ (55 markdown-файлов)

Требования

  • Node.js 20+
  • Docker + Docker Compose
  • GPU или достаточно RAM для Qwen Code

Установка

git clone https://github.com/SpawnDock/MCP.git
cd MCP
npm install
cp .env.example .env

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

PORT=3000
RATE_LIMIT_RPS=10
QWEN_MODE=http
QWEN_API_URL=http://localhost:8080
QWEN_TIMEOUT_MS=60000
QWEN_CODE_COMMAND=qwen
QWEN_CODE_AUTH_TYPE=qwen-oauth
PUBLIC_ORIGIN=http://localhost:3000

# Продакшен с docker-compose.prod.yml: см. .env.example — PUBLIC_HOST (:80 или FQDN), PUBLIC_ORIGIN без :3000 (наружу 80/443 через Caddy).

TELEGRAM_BOT_TOKEN=
TELEGRAM_BOT_USERNAME=rustgpt_bot
TELEGRAM_MINI_APP_SHORT_NAME=tma
CONTROL_PLANE_URL=http://localhost:3000
BOT_POLL_TIMEOUT=25

TELEGRAM_*, CONTROL_PLANE_URL и BOT_POLL_TIMEOUT нужны для npm run bot или npm run bot:dev. Бот использует TELEGRAM_BOT_USERNAME и TELEGRAM_MINI_APP_SHORT_NAME, чтобы отдавать TMA deep link вида https://t.me/rustgpt_bot/tma?startapp=<slug>.

Если те же TELEGRAM_BOT_TOKEN, TELEGRAM_BOT_USERNAME и TELEGRAM_MINI_APP_SHORT_NAME заданы процессу MCP/API (npm start / npm run dev), при первом подключении dev-tunnel к проекту владелец получит сообщение в Telegram со ссылками на превью.

Режимы Qwen / поиска по базе знаний:

  • QWEN_MODE=http (по умолчанию) — запрос к HTTP API (QWEN_API_URL или OpenRouter при OPENROUTER_KEY).
  • QWEN_MODE=cli — локальный бинарь qwen на машине, где запущен API (QWEN_CODE_COMMAND, QWEN_CODE_CWD, QWEN_CODE_AUTH_TYPE).
  • QWEN_MODE=container — каждый поиск вызывает docker/podman run с образом QWEN_CONTAINER_IMAGE; каталог knowledge/ монтируется только для чтения в QWEN_CONTAINER_CORPUS_PATH. Сборка образа, пример docker run и обновление корпуса без пересборки: docker/qwen-search/README.md. Переменные QWEN_CONTAINER_* и опционально QWEN_KNOWLEDGE_HOST_PATH — в .env.example.

Для cli: QWEN_CODE_AUTH_TYPE=qwen-oauth ожидает OAuth credentials в ~/.qwen/oauth_creds.json.

Запуск (разработка)

npm run build
npm start

Или:

npm run dev

Для локального polling-бота:

npm run bot:dev

Локальная разработка в Docker (docker-compose.yml)

Полный локальный стек с HTTPS (Caddy tls internal) для проверки сценариев, где нужен https:// на этой машине.

mkdir -p data/state
npm run build
npm run docker:dev
# или: docker compose up -d --build

Сервисы:

  • qwen — Qwen Code, порт 8080 на хосте (удобно для гибрида: только Qwen в Docker, npm run dev на хосте с QWEN_API_URL=http://127.0.0.1:8080).
  • mcp-server — API и MCP, http://localhost:3000 и через Caddy https://localhosthttps://127.0.0.1).
  • caddy80/443, лендинг на /, остальное — прокси на MCP.

Базовые переменные для compose лежат в deploy/spawndock-docker-dev.stack (PUBLIC_ORIGIN=https://localhost). Секреты и TELEGRAM_* задавайте в корневом .env (рядом с docker-compose.yml) — Compose подставит их в контейнеры.

Доверие локальному HTTPS (браузер): у Caddy внутренний CA. Экспорт корневого сертификата (один раз):

docker compose cp caddy:/data/caddy/pki/authorities/local/root.crt /tmp/spawndock-caddy-local.crt
# Далее импортируйте root.crt в доверенные корневые (Chrome: Настройки → Безопасность → Управление сертификатами) или см. документацию вашей ОС.

Telegram: long polling бот в том же compose: положите токен и username в .env, затем npm run docker:dev:telegram или docker compose --profile telegram up -d --build. Mini App из телефона по-прежнему нуждается в публичном HTTPS (туннель, например dev-tunnel / cloudflared / ngrok); https://localhost с ПК после импорта CA достаточно для проверки API и ссылок на этой машине.

Запуск (продакшен, Docker)

Продакшен на VPS: docker compose -f docker-compose.prod.yml — MCP, бот, образ поиска и Caddy на 80/443; порт 3000 наружу не публикуется. См. .env.example и OPERATOR.md.

Тесты

npm test

Tool: search

Единственный MCP tool. Принимает запрос на естественном языке, Qwen ищет по документации и формирует ответ.

Input:

{
  "query": "как реализовать корзину в TMA"
}

Output:

{
  "answer": "Для корзины используйте React-контекст...",
  "sources": [
    { "file": "templates/shop/components.md", "section": "Cart" },
    { "file": "guides/webapp-api.md", "section": "MainButton" }
  ]
}

Ограничения: query не пустой, максимум 2000 символов.

База знаний (knowledge/)

55 файлов, 29,500+ строк документации. Покрывает всю экосистему TMA + TON.

TMA разработка

guides/
  getting-started.md         -- создание проекта, Vite + React + TWA SDK
  webapp-api.md              -- WebApp API: MainButton, BackButton, HapticFeedback, Popup
  navigation.md              -- роутинг, BackButton, deep linking, табы
  theming.md                 -- темы Telegram, CSS-переменные, dark/light
  common-mistakes.md         -- 10 типичных ошибок с исправлениями
  advanced-tma-features.md   -- CloudStorage, BiometricManager, QR-сканер, Invoice, Fullscreen, Accelerometer
  performance.md             -- бандл, lazy loading, виртуализация, кэширование
  testing-tma.md             -- моки WebApp SDK, TON Connect, Playwright E2E
  security.md                -- initData HMAC, CSP, XSS, rate limiting
  workflows.md               -- 6 end-to-end воркфлоу (beginner -> advanced)

Деплой

guides/deploy/
  cloudflare-pages.md        -- Wrangler CLI, GitHub integration
  vercel.md                  -- Vercel CLI, конфигурация
  github-pages.md            -- GitHub Actions, SPA routing

TON Connect

guides/
  ton-connect.md             -- базовая интеграция: wallet, transfer, manifest
  ton-connect-advanced.md    -- get-методы, мульти-сообщения, TON Proof, Jetton/NFT
  ton-agentic-patterns.md    -- 3 модели AI-blockchain: Propose+Approve, Agentic, Read-Only

TON Blockchain

guides/
  ton-smart-contracts.md     -- Tolk, Tact, FunC, акторная модель, Blueprint
  ton-tvm.md                 -- TVM: стек, cells, газ, регистры, опкоды
  ton-jettons.md             -- TEP-74, мастер/кошелёк, минт/трансфер/сжигание
  ton-nft.md                 -- TEP-62, коллекции, метаданные, royalty, SBT
  ton-defi.md                -- AMM, стейкинг, DAO, multisig, DeDust/Ston.fi
  ton-swap-dex.md            -- DeDust, Ston.fi, Omniston, LP, swap UI
  ton-wallet-versions.md     -- v3r2, v4r2, v5r1, Agentic wallet сравнение
  ton-agentic-wallets.md     -- автономные AI-кошельки, operator/owner ключи
  ton-dns.md                 -- .ton, .t.me домены, TEP-81
  ton-sites.md               -- ADNL, RLDP, децентрализованный хостинг
  ton-storage.md             -- Bag of Cells, storage providers, файлы
  ton-payment-channels.md    -- off-chain каналы, микротранзакции
  ton-payments-tma.md        -- 5 способов оплаты: TON, Jetton, Stars, TON Pay, Invoice
  ton-analytics.md           -- forensics, мониторинг, whale alerts
  ton-transaction-tracking.md -- lifecycle, hash типы, polling, SSE
  ton-contract-security.md   -- 10 уязвимостей, аудит, TEP compliance
  ton-appkit.md              -- @ton/appkit, React hooks, swap integration

TMA шаблоны (6 типов)

templates/
  shop/       -- каталог, корзина, checkout (prompt.md + components.md)
  game/       -- Canvas/Phaser, лидерборд, скоринг
  landing/    -- hero, features, CTA
  quiz/       -- вопросы, таймер, результаты
  menu/       -- категории, корзина, доставка
  portfolio/  -- проекты, галерея, контакты

Справочники

reference/
  twa-sdk.md              -- @twa-dev/sdk API (все методы и типы)
  telegram-bot-api.md     -- Bot API для TMA
  ton-sdk.md              -- @ton/ton, @ton/crypto, tonweb
  ton-apis.md             -- TON Center, TON API (tonapi.io)
  ton-standards.md        -- TEP-62, TEP-64, TEP-74, TEP-66, TEP-81, TEP-85, TEP-89
  ton-popular-tokens.md   -- USDT, NOT, DOGS, STON, GRAM + адреса контрактов
  blueprint.md            -- Blueprint framework, Sandbox, деплой
  ton-explorers.md        -- Tonviewer, TON Scan, TONAPI, инструменты
  tolk-language.md        -- Tolk: синтаксис, типы, миграция с FunC
  ton-mcp-ecosystem.md    -- обзор всех MCP-серверов в экосистеме TON

MCP-клиент (для пользователей)

npm-пакет mcp-tma-client в packages/mcp-tma-client/. Работает как stdio-to-SSE bridge — AI-агент видит его как локальный MCP-сервер, а он проксирует запросы на бэкенд.

Конфигурация в проекте пользователя (.mcp.json):

{
  "mcpServers": {
    "tma-knowledge": {
      "command": "npx",
      "args": ["mcp-tma-client"],
      "env": {
        "MCP_SERVER_URL": "https://tma-api.example.com/sse"
      }
    }
  }
}

Спецификации (PRD)

  • docs/PRD-public-knowledge-search-service.md — публичный /knowledge API
  • docs/PRD-usage-dashboard-minimal.md — панель использования (SQLite); UI: /ops/usage (Basic Auth OPS_USAGE_*), пиксель лендинга: /ops/pixel/landing.gif

Структура проекта

src/
  index.ts          -- точка входа, запуск Express
  server.ts         -- Express: CORS, rate limit, health, SSE
  mcp.ts            -- MCP server, tool search
  config.ts         -- env-переменные
  qwen/
    client.ts       -- HTTP-клиент к Qwen API
    parser.ts       -- парсинг ответа, fallback
    prompts.ts      -- системный промпт
packages/
  mcp-tma-client/   -- npm-пакет тонкого клиента
knowledge/          -- база знаний (55 файлов)
Dockerfile
docker-compose.yml

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Contributors