mcp-server-base
MCP Server Base v3.0 — Масштабирование и корпоративное использование (2026)
Современный сервер Model Context Protocol на базе последнего стека:
MCP SDK
1.12+— высокоуровневый APIMcpServer+StreamableHTTPServerTransport(новый) иStdioServerTransportTypeScript 5.7 ESM + модуль
NodeNextZod валидация → автоматическая JSON Schema + валидация env (
src/config.ts:1)Express 4 + helmet + CORS allowlist + rate-limit + health/ready + Admin UI
Двойной транспорт: STDIO (Claude Desktop) и Streamable HTTP (удалённый, спецификация 2025-03, без сохранения состояния + возобновляемость с сохранением состояния через RedisEventStore)
Структурированные модули инструментов/ресурсов/промптов + RAG гибрид (BM25+vector), Web (кэшированный), интеграции GitHub
Plugin SDK (
src/plugin/index.ts:1) + интеграции (slack/notion/linear), Registry (smithery.yaml, mcpName), Prompt Playground на/adminv3.0 Enterprise: мультитенантность (
X-Tenant-Id, пространства имён для хранилищ), SSO OIDC, CRUD для control plane, кластерный режим, стек Prometheus/GrafanaOTEL трассировка/метрики (
src/utils/otel.ts:1), Tasks (экспериментальный +create_task), k6 нагрузочные тестыtsxwatch,vitest(178 тестов, 88% покрытие), graceful shutdown,docker-compose(redis, postgres, qdrant, otel-collector, prometheus, grafana)
🚀 Быстрый старт
npm install
npm run build
# STDIO (for Claude Desktop, Cursor, opencode, etc.)
npm start
# HTTP (Streamable HTTP - latest)
npm run start:http
# → http://localhost:3000/mcp
# → health http://localhost:3000/healthDev
npm run dev # stdio watch
npm run dev:http # http watch (Streamable HTTP at http://localhost:3000/mcp)
npm test # unit + e2e (InMemory + HTTP)
npm run test:coverage # coverage 80% thresholds
npm run lint # eslint 9 flat config
npm run format:check # prettier
npm run typecheck # tsc --noEmit
npm run buildCI
.github/workflows/ci.yml запускается на push/PR в main с матрицей Node 20+22: lint, format:check, typecheck, test:coverage, build, docker build.
Related MCP server: TokenHub MCP
🔌 Транспорты
Транспорт | Использование | Команда |
STDIO | Локальные клиенты (Claude Desktop) |
|
Streamable HTTP | Удалённый / Docker / Cloud |
|
Streamable HTTP — новый стандарт, заменяющий SSE (устарел в марте 2025).
🧰 Инструменты (40)
Инструмент | Описание | Входные данные |
| Эхо-сообщение |
|
| add/sub/mul/div |
|
| Текущее время |
|
| Получить URL |
|
| Список файлов в ALLOWED_ROOT |
|
| Чтение файла (лимит 1MB) |
|
| Запись файла + уведомление об изменении ресурса |
|
| Поиск текста в файлах |
|
| Установить KV в памяти |
|
| Получить KV |
|
| Удалить KV |
|
| Список KV | — |
| Очистить всё | — |
| SQL через alasql (users, notes) |
|
| Список таблиц с количеством строк | — |
| Shell (allowlist, отключено по умолчанию) |
|
| Демо-сбор информации (контакты/предпочтения) |
|
| Демо-сэмплирование (LLM) |
|
| Загрузка текста (чанки, эмбеддинги) |
|
| Гибридный поиск (vector+BM25) |
|
| Список документов | — |
| Очистить векторное хранилище | — |
| Brave API (мок, если нет ключа) |
|
| Tavily API (мок, если нет ключа) |
|
| Кэшированное получение веб-страницы |
|
| Поиск репозиториев GitHub |
|
| Получить репозиторий GitHub |
|
| Получить issue GitHub |
|
| Создать фоновую задачу |
|
| Получить статус задачи |
|
| Получить результат задачи |
|
| Каналы Slack (плагин) | — |
| Отправка сообщения в Slack (плагин) |
|
| Поиск в Slack (плагин) |
|
| Поиск в Notion (плагин) |
|
| Страница Notion (плагин) |
|
| Создание страницы Notion (плагин) |
|
| Issues Linear (плагин) |
|
| Создание issue Linear (плагин) |
|
| Issue Linear (плагин) |
|
📦 Ресурсы (6)
config://server-info— метаданные сервера (JSON, теперь включаетfeatures)greeting://{name}— динамический шаблон приветствияfile:///{+path}— файл в песочнице (ALLOWED_ROOT), список + автодополнение,file:///notes.txtmemory://{key}— KV в памяти, список + автодополнениеdb://{table}/{id}— демо-строка БД (users/notes), список + автодополнениеdocs://{id}— RAG-чанк (загружен черезrag_ingest), список + автодополнение
💬 Промпты (4)
code-review— аргументы:language,codeexplain-concept— аргументы:concept,levelsummarize— аргументы:text,length(short/medium/long),style(bullets/paragraph/tldr)research— аргументы:topic,depth(overview/deep),audience(beginner/expert/executive)
⚙️ Конфигурация клиента
Claude Desktop (claude_desktop_config.json)
{
"mcpServers": {
"mcp-server-base": {
"command": "node",
"args": ["/absolute/path/to/mcp-server/dist/index.js"]
}
}
}HTTP-клиент
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
const client = new Client({ name: 'my-client', version: '1.0.0' });
await client.connect(new StreamableHTTPClientTransport(new URL('http://localhost:3000/mcp')));
const tools = await client.listTools();Inspector
npm run inspect
# or
npx @modelcontextprotocol/inspector node dist/index.js
npx @modelcontextprotocol/inspector http://localhost:3000/mcp🐳 Docker
# Single container
docker build -t mcp-server-base .
docker run -p 3000:3000 --env TRANSPORT=http mcp-server-base
# Full stack (app + redis + postgres + qdrant) — see docker-compose.yml
docker compose up -d
docker compose logs -f app
# → http://localhost:3000/health, http://localhost:3000/mcp
# → redis :6379, postgres :5432, qdrant :6333RAG-демо (загрузка → поиск → docs://)
# via MCP tools (Inspector or Client)
# 1. ingest
rag_ingest { "text": "MCP is Model Context Protocol...", "id": "mcp-intro" }
# 2. search
rag_search { "query": "what is MCP?", "topK": 3 }
# 3. read resource
# docs://mcp-intro → returns ingested text📁 Структура
src/
├── index.ts # entry: stdio + http (helmet/cors/rateLimit/auth/RBAC/OTEL/metrics)
├── server.ts # createMcpServer() factory (v2.1.0, instructions)
├── config.ts # zod env (AUTH, CORS, rateLimit, RAG, cache, integrations, OTEL, admin, tasks)
├── types.ts # Zod schemas
├── middleware/auth.ts # AUTH_MODE none|apiKey|bearer
├── middleware/rateLimit.ts
├── middleware/requestId.ts
├── middleware/rbac.ts # RBAC reader/writer/admin + mcpRbacMiddleware (v2.1)
├── observability/otel-real.ts # OTEL NodeSDK init (v2.1)
├── observability/slo.ts # checkSlo() for /health/ready (v2.1)
├── utils/logger.ts # stderr, JSON/text, redaction, child(requestId)
├── utils/eventStore.ts # InMemoryEventStore
├── utils/redisEventStore.ts # RedisEventStore (scale)
├── utils/cache.ts # MemoryCache (TTL) + defaultCache
├── utils/queue.ts # SimpleQueue
├── utils/metrics.ts # prom-client Registry (v2.1)
├── utils/persistence.ts # save/load backup (v2.1)
├── utils/otel.ts # stub OTEL spans/metrics
├── tools/ # 40 tools: echo, fs, memory, db, shell, rag (hybrid), web, github, elicitation, sampling, tasks
│ ├── filesystem.tool.ts, memory.tool.ts, database.tool.ts, shell.tool.ts
│ ├── rag.tool.ts, web.tool.ts, github.tool.ts, elicitation.tool.ts, sampling.tool.ts, tasks.tool.ts
├── plugin/index.ts # Plugin SDK: definePlugin/registerPlugin (v2.2)
├── integrations/ # slack/notion/linear plugins (v2.2)
├── middleware/tenant.ts # Multi-tenant X-Tenant-Id + scoped stores (v3.0)
├── routes/controlplane.ts# Tenants CRUD + key rotation (v3.0)
├── utils/cluster.ts # Cluster mode horizontal scale (v3.0)
├── resources/ # 6 resources: config, greeting, file, memory, db, docs
├── routes/admin.ts # Admin UI + metrics/spans/stores (v2.0) + /metrics Prometheus (v2.1)
└── prompts/ # 4 prompts: code-review, explain-concept, summarize, researchЧтобы добавить новый инструмент: создайте src/tools/my.tool.ts → экспортируйте registerMyTool(server) → добавьте в src/tools/index.ts.
🔐 Безопасность (Фаза 2)
Helmet заголовки (
x-dns-prefetch-control,x-frame-options,x-content-type-optionsи др.) черезhelmet@7(src/index.ts:1)CORS allowlist (
CORS_ORIGIN=*или список через запятую) с обработкойcorscredentials (src/config.ts:60)Аутентификация
AUTH_MODE=none|apiKey|bearerвsrc/middleware/auth.ts:1—401без валидногоX-API-KeyилиAuthorization: Bearer(health/ready и OPTIONS исключены)Ограничение скорости
express-rate-limit(по умолчанию 100/15мин) на/mcp—429 Too Many Requests(src/middleware/rateLimit.ts:1)RequestId (
X-Request-IdrandomUUID, эхо-заголовок, корреляция дочернего логгера) (src/middleware/requestId.ts:1)Zod валидация env (
src/config.ts:1) —parseEnv()проверяетPORT,AUTH_MODE,API_KEYна перекрёстные поля, быстрый отказ при невалидном envСтруктурированный логгер JSON/текст,
[REDACTED]дляauthorization,apiKey,token(src/utils/logger.ts:24)Возобновляемость
InMemoryEventStore(src/utils/eventStore.ts:1) + карта сессий с сохранением состояния, когдаRESUMABILITY_ENABLED=true(повтор черезLast-Event-ID,GET /mcpпоток,DELETEзакрытие)Укрепление Docker непривилегированный
appuser+HEALTHCHECK(Dockerfile:1)Тесты:
tests/unit/auth.test.ts,tests/unit/logger.test.ts,tests/unit/eventStore.test.ts,tests/e2e/security.test.ts(helmet/auth/rateLimit/resumability) —67 тестов → 130 всего с Фазой 5, 90.89% покрытие
🔗 Интеграции (Фаза 4)
Кэш
MemoryCacheTTL (src/utils/cache.ts:1) —defaultCacheдля web/github,SimpleQueue(src/utils/queue.ts:1)RAG локальный вектор (hash-эмбеддинг 128-мерный, косинус, чанк 500/50) в
src/tools/rag.tool.ts:1—rag_ingest(чанки +sendResourceListChanged),rag_search(topK, threshold),rag_list,rag_clear+ ресурсdocs://{id}Web
src/tools/web.tool.ts:1—brave_search(мок, если нетBRAVE_API_KEY),tavily_search(мок),web_fetch(кэшируется черезdefaultCache,CACHE_TTL_MS)GitHub
src/tools/github.tool.ts:1—github_search_repos,github_get_repo,github_get_issue(кэшируется,GITHUB_TOKENдля лимита скорости)Стек
docker-compose.yml:1(app + redis:7 + postgres:16 + qdrant:v1.12.4) с healthcheckДемо
rag_ingest → rag_search → docs://E2E проверено вtests/integrations.test.ts:1(21 тест)
🏢 Масштабирование и корпоративное использование (Фаза 5 — v3.0) — НОВОЕ
Мультитенантность
src/middleware/tenant.ts:1— заголовокX-Tenant-Id(или?tenant=),tenantMiddlewareвозвращает400, когдаTENANT_REQUIRED=trueи заголовок отсутствует, память с изоляцией тенантовgetTenantMemory(tid)(изолированные хранилища), пространства имён для ключей кэшаtenant:{id}:key, реестрcreateTenant/deleteTenantSSO OIDC
src/middleware/auth.ts:1—AUTH_MODE=oidc: структурная проверка Bearer JWT (3 части,exp,issпротивOIDC_ISSUER,audпротивOIDC_AUDIENCE), claims прикрепляются кreq.oidcClaims; в production подключается проверка подписи JWKSПлоскость управления
src/routes/controlplane.ts:1— CRUD/admin/tenants(POST/GET/PATCH/DELETE+ 409 дубликат/400 неверный id),POST /admin/tenants/:id/rotate-key,GET /admin/tenants/:id/storeпроверка изоляции; защищено admin-токеномМасштабирование в рантайме
src/utils/cluster.ts:1—initCluster()создаётCLUSTER_WORKERS(по умолчанию CPU-1), автоматический перезапуск при завершении воркера,CLUSTER_MODE=true; без состояния +RedisEventStoreдля настоящего горизонтального масштабированияСтек мониторинга
docker-compose.override.yml:1— Prometheus (prometheus.ymlсобирает метрики сapp:3000/metrics) на :9090 + Grafana на :3001Тесты
tests/v3_0.test.ts:1(15 тестов: извлечение тенанта/изоляция/required-400, проверка OIDC-токена + issuer/audience + HTTP 401/200, жизненный цикл control plane 201/409/400/404/rotate-key/проверка хранилища/disabled-404, кластер no-op, сервисы compose) — всего 178
🔌 Экосистема и DX (Фаза 5 — v2.2)
Plugin SDK
src/plugin/index.ts:1—definePlugin({name, version, register}),registerPlugin(server, plugin)(устойчив к дубликатам),getRegisteredPlugins(), автоматические уведомленияsendToolListChangedИнтеграции
src/integrations/—slackPlugin(list/post/search),notionPlugin(search/get/create),linearPlugin(list/create/get) — все замоканы без токенов (SLACK_TOKEN,NOTION_TOKEN); автоматически регистрируются вsrc/server.ts:1Реестр
smithery.yaml:1— конфигурация Smithery + имя MCP Registryio.github.ahmedalbanna/mcp-server-base, поляmcpName/filesвpackage.json:1Гибридный RAG
src/tools/rag.tool.ts:1— режимыrag_searchvector|bm25|hybrid(по умолчанию hybrid, alpha 0.5), BM25 (k1=1.5, b=0.75) нормализован + повторное ранжирование по косинусу; набор для оценкиtests/eval/rag-eval.json(20 вопросов/ответов) с p@5 ≥0.8, проверено вtests/v2_2.test.ts:1Песочница промптов
src/routes/admin.ts:1—POST /admin/prompts/:name/previewрендерит промпты на стороне сервера; UI песочницы в дашборде/adminТесты
tests/v2_2.test.ts:1(16 тестов: Plugin SDK define/register/dup/вызов инструментов, файлы реестра, гибридные режимы, eval p@5, предпросмотр/UI/счётчик) — всего 163
📈 Масштабирование и эксплуатация (Фаза 5 — v2.0)
Версионированный MCP
v2.0.0(package.json:1,config.MCP_SERVER_VERSION) с инструкциями для каждой минорной версии (src/server.ts:1)OTEL трассировка/метрики (
src/utils/otel.ts:1) —createSpan/withSpan,incrementCounter/recordHistogram,getMetrics/getSpans, заглушка JSON-экспорта дляOTEL_EXPORTER_OTLP_ENDPOINT, флагOTEL_ENABLEDRedisEventStore (
src/utils/redisEventStore.ts:1) — реализацияEventStoreсstoreEvent/replayEventsAfter, запасной вариант в памяти,eventStoreFactory.create()для горизонтального масштабирования (EVENT_STORE_TYPE=memory|redis,REDIS_URL)Админ-интерфейс (
src/routes/admin.ts:1) —GET /admin(HTML-дашборд),/admin/tools|resources|prompts|metrics|spans|stores|health(JSON), защищён черезADMIN_TOKEN(X-Admin-Token), флагADMIN_ENABLEDЗадачи (
src/tools/tasks.tool.ts:1) — экспериментальныйdelay_task(если доступны SDK-задачи) + запасныеcreate_task/get_task/get_task_result(в памяти, опрос), инфраструктураSimpleQueue/MemoryCacheБенчмарк
k6/load.js:1—http_req_duration p(95)<100ms,stages10→50 VUs,checks >99%,npm run bench/bench:localCompose
docker-compose.yml:1уже включает redis/postgres/qdrant для масштабированияТесты:
tests/scale.test.ts:1(OTEL spans/metrics, RedisEventStore replay, TTL кэша, очередь, admin HTML/metrics/token/ready, задачи create/poll, версия, k6-скрипт) — всего 130 (теперь 147 с v2.1)Деплой готов для Fly.io/Cloud Run (без состояния + RedisEventStore), GHCR через
release.yml, npm2.0.0
🔒 Укрепление и наблюдаемость (Фаза 5 — v2.1) — НОВОЕ
OTEL Real
src/observability/otel-real.ts:1—initOtel()динамический импорт@opentelemetry/sdk-node+OTLPTraceExporter(запасной вариант — консоль),OTEL_ENABLED+OTEL_EXPORTER_OTLP_ENDPOINT, корректное завершениеshutdownпо SIGTERMSLO
src/observability/slo.ts:1—checkSlo()(память/rag/кэш/аптайм,latencyMs),GET /health→{status, checks, uptime, version, otel, eventStore}+GET /ready→503, если неok,GET /metrics→ Prometheustext/plainчерезprom-client(mcp_http_requests_total,mcp_http_request_duration_ms,mcp_sessions_active)RBAC
src/middleware/rbac.ts:1—reader < writer < admin(заголовокX-Role, заглушка JWT), картаTOOL_ROLES(31 инструмент),mcpRbacMiddlewareпроверяет телоtools/call→403, еслиreaderпытается вызватьwrite_file/shell_execute,GET /admin→ требуетсяadminРезервное копирование
src/utils/persistence.ts:1—saveBackup()/loadBackup()/scheduleSave()(дебаунс 500 мс) вALLOWED_ROOT/.backup.json(динамическийgetBackupFile()), логирует заглушку синхронизации Redis при установленномREDIS_URL,loadBackup()при запуске вsrc/index.ts:1Метрики
src/utils/metrics.ts:1—prom-clientRegistry+collectDefaultMetrics,httpRequestsTotal/httpRequestDuration/mcpToolCallsTotal/mcpSessionsActive, обработчикGET /metricsТесты
tests/v2_1.test.ts:1(13 тестов: проверки SLO, RBAChasRole/X-Role403/200,SLO health/metrics200 + текст Prometheus, OTEL span, резервное копирование save/load +scheduleSaveчерезmemory_set,initOtelвыключен/включён) +tests/unit/rbac.test.ts:1(4 теста) — всего 147Логгер безопасен для stderr, никогда не логирует секреты (редактирование)
Zod → JSON Schema через SDK (
src/types.ts:1,src/tools/*.tool.ts)Таймаут на fetch (10 с) + структурированные ошибки
Корректное завершение (
SIGINT/SIGTERM)Health (
GET /health) и ready (GET /ready) отдельно от MCPБез состояния по умолчанию (
sessionIdGenerator: undefined), с состоянием приRESUMABILITY_ENABLED=true(src/index.ts:22)Type-safe, строгий TS + ESLint flat + Prettier + husky + lint-staged
Покрытие 85% строк / 70% веток enforced (
vitest.config.ts:1), 178 тестов: unit + e2e HTTP/security/capabilities/integrations/scale/v2.1/v2.2/v3.0
📚 Документация
Полная документация в docs/:
Архитектура — диаграмма, карта модулей, жизненный цикл запроса
Конфигурация — все переменные окружения + правила валидации
Справочник API — инструменты/ресурсы/промпты/эндпоинты
Безопасность — аутентификация, RBAC, OIDC, аренда, чек-лист укрепления
Плагины — руководство по Plugin SDK + распространение через реестр
Развёртывание — Docker, кластер/мульти-реплика масштабирование, мониторинг, k6
Тестирование — карта набора тестов, паттерны, CI
🤝 Вклад
См. CONTRIBUTING.md — nvm use, npm test, добавьте инструмент/ресурс/промпт, убедитесь, что lint/typecheck/test проходят. См. CODE_OF_CONDUCT.md.
📚 MCP Документация
This server cannot be deployed
Maintenance
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
A Model Context Protocol server for Wix AI tools
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
Persistent memory, hybrid search and a goal graph for AI agents, over stdio or remote HTTP.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceA robust server implementing the Model Context Protocol with SSE and STDIO transport, enabling real-time communication and extensible tooling for AI models.237 npm4MIT
- AlicenseBqualityCmaintenanceA production-packaged Model Context Protocol server for coding agents that routes large file, git, web, database, and other tasks through token-budgeted tools and workflows.62 npm1MIT
- AlicenseNot gradedqualityDmaintenanceA production-ready Model Context Protocol suite over Streamable HTTP providing a sandboxed file server with tools, resources, prompts, and both manual and AI-driven clients.MIT
- AlicenseBqualityCmaintenanceEnables running a Model Context Protocol server with a validated echo tool over stdio or Streamable HTTP, including strict schemas, tests, and hardened container deployment.11MIT