Skip to main content
Glama
ahmedalbanna

mcp-server-base

by ahmedalbanna

MCP Server Base v2.0 — Skalierung & Betriebsfähigkeit (2026)

CI Node 20+ MCP SDK 1.12.1 TypeScript 5.7 License MIT Coverage 91% Version 2.0.0

Moderner Model Context Protocol-Server auf der Grundlage des neuesten Stacks:

  • MCP SDK 1.12+McpServer-High-Level-API + StreamableHTTPServerTransport (neu) & StdioServerTransport

  • TypeScript 5.7 ESM + NodeNext-Modul

  • Zod-Validierung → automatisch JSON-Schema + Env-Validierung (src/config.ts:1)

  • Express 4 + helmet + CORS-Zulassungsliste + Ratenbegrenzung + Health/Ready + Admin-Oberfläche

  • Doppelter Transport: STDIO (Claude Desktop) und Streamable HTTP (remote, Spezifikation 2025‑03, zustandslos + zustandsbehaftete Fortsetzbarkeit über RedisEventStore)

  • Strukturierte Tool-/Ressourcen-/Prompt-Module + RAG (lokal, vektorbasiert), Web (gecacht), GitHub-Integrationen

  • OTEL-Tracing/Metriken (src/utils/otel.ts:1), Tasks (experimentell + create_task), k6-Lasttests

  • tsx Watch, vitest (130 Tests, 91% Abdeckung), Graceful Shutdown, docker-compose (redis, postgres, qdrant)


🚀 Schnellstart

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/health

Entwicklung

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 build

CI

.github/workflows/ci.yml läuft bei push/PR auf main mit einer Node‑20+22-Matrix: lint, format:check, typecheck, test:coverage, build, docker build.


Related MCP server: MCP Server

🔌 Transporte

Transport

Verwendung

Befehl

STDIO

Lokale Clients (Claude Desktop)

node dist/index.js

Streamable HTTP

Remote / Docker / Cloud

node dist/index.js --http

Streamable HTTP ist der neue Standard und ersetzt SSE (seit März 2025 veraltet).


🧰 Werkzeuge (31)

Werkzeug

Beschreibung

Eingabe

echo

Echo-Nachricht

Nachricht, uppercase?

calculator

add/sub/mul/div

operation, a, b

get_time

Aktuelle Uhrzeit

timezone?

fetch_url

URL abrufen

url, maxLength?

list_files

Dateien unter ALLOWED_ROOT auflisten

path?, recursive?

read_file

Datei lesen (1-MB-Limit)

path

write_file

Datei schreiben + Ressourcenänderung auslösen

path, content

search_files

Text in Dateien durchsuchen

query, path?, maxResults?

memory_set

KV im Speicher setzen

key, value

memory_get

KV abrufen

key

memory_delete

KV löschen

key

memory_list

Alle KVs auflisten

memory_clear

Alles löschen

database_query

SQL über alasql (users, notes)

sql

database_tables

Tabellen mit Zeilenanzahl auflisten

shell_execute

Shell (Zulassungsliste, standardmäßig deaktiviert)

command, timeout?

collect_user_info

Elicitation-Demo (Kontakt/Präferenzen)

infoType?

generate_with_sampling

Sampling-Demo (LLM)

prompt, maxTokens?

rag_ingest

Text erfassen (in Blöcken, eingebettet)

text, id?, metadata?, chunk?

rag_search

Vektorsuche (Kosinus)

query, topK?, Schwellenwert?

rag_list

Dokumente auflisten

rag_clear

Vektorspeicher leeren

brave_search

Brave-API (Mock, wenn kein Schlüssel)

query, count?

tavily_search

Tavily-API (Mock, wenn kein Schlüssel)

query, maxResults?, includeAnswer?

web_fetch

Web-Abruf mit Zwischenspeicher

url, useCache?, maxLength?

github_search_repos

GitHub-Repositories durchsuchen

query, perPage?

github_get_repo

GitHub-Repository abrufen

repo

github_get_issue

GitHub-Issue abrufen

repo, issueNumber

create_task

Hintergrund-Task erstellen

duration?, payload?

get_task

Task-Status abrufen

taskId

get_task_result

Task-Ergebnis abrufen

taskId

📦 Ressourcen (6)

  • config://server-info — Server-Metadaten (JSON, jetzt mit features)

  • greeting://{name} — dynamische Begrüßungsvorlage

  • file:///{+path} — Datei in der Sandbox (ALLOWED\_ROOT), Liste + Vervollständigen, file:///tmp/debug.txt

  • memory://{key} — KV im Speicher, Liste + Vervollständigen, memory://notes

  • db://{table}/{id} — Zeile der Beispiel-DB (users/notes), Liste + Vervollständigen

  • docs://{id} — RAG-Chunk (über rag_ingest erfasst), Liste + Vervollständigen

💬 Prompts (4)

  • code-review — Argumente: language, code

  • explain-concept — Argumente: concept, level

  • summle — Argumente: text, length (kurz/mittel/lang), style (Stichpunkte/Absatz/tldr)

  • research — Argumente: topic, depth (Überblick/tief), audience (Anfänger/Fortgeschrittene/Entscheider)


⚙️ Client-Konfiguration

Claude Desktop (claude_desktop_config.json)

{
  "mcpServers": {
    "mcp-server-base": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-server/dist/index.js"]
    }
  }
}

HTTP-Client

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 :6333

RAG-Demo (Erfassung → Suche → 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

📁 Projektstruktur

src/
├── index.ts              # entry: stdio + http (helmet/cors/rateLimit/auth/resumability)
├── server.ts             # createMcpServer() factory
├── config.ts             # zod env (AUTH, CORS, rateLimit, RAG, cache, integrations)
├── types.ts              # Zod schemas
├── middleware/auth.ts    # AUTH_MODE none|apiKey|bearer
├── middleware/rateLimit.ts
├── middleware/requestId.ts
├── utils/logger.ts       # stderr, JSON/text, redaction, child(requestId)
├── utils/eventStore.ts   # InMemoryEventStore for Last-Event-ID
├── utils/cache.ts        # MemoryCache (TTL) + defaultCache
├── utils/queue.ts        # SimpleQueue
├── tools/                # 31 tools: echo, fs, memory, db, shell, rag, 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
├── resources/            # 6 resources: config, greeting, file, memory, db, docs
├── routes/admin.ts       # Admin UI + metrics + spans
└── prompts/              # 4 prompts: code-review, explain-concept, summarize, research

Neues Werkzeug hinzufügen: src/tools/my.tool.ts erstellen → registerMyTool(server) exportieren → in src/tools/index.ts aufnehmen.


🔐 Sicherheit (Phase 2)

  • Helmet Header (x-dns-prefetch-control, x-frame-options, x-content-type-options usw.) über helmet@7 (src/index.ts:1)

  • CORS-Zulassungsliste (CORS_ORIGIN=* oder Komma-Liste) mit cors-Credentials-Handling (src/config.ts:60)

  • Auth AUTH_MODE=none|apiKey|bearer in src/middleware/auth.ts:1401 ohne gültige X-API-Key-Angabe oder Authorization: Bearer (health/ready und OPTIONS ausgenommen)

  • Ratenbegrenzung express-rate-limit (Standard 100/15min) auf /mcp420 Zu viele Anfragen (src/middleware/rateLimit.ts:1)

  • RequestId (X-Request-Id randomUUID, Echo-Header, Korrelation über untergeordneten Logger) (src/middleware/requestId.ts:1)

  • Zod-Env-Validierung (src/config.ts:1) — parseEnv() validiert PORT, AUTH_MODE, API_KEY feldübergreifend, mit sofortigem Scheitern bei ungültiger Umgebung

  • Strukturierter Logger JSON/Text, [REDACTED] für authorization, apiKey, token (src/utils/logger.ts:24)

  • Resumability InMemoryEventStore (src/utils/eventStore.ts:1) + zustandsbehaftete Session-Map, wenn RESUMABILITY_ENABLED=true (Replay über ID, Zeitvermerk...)

  • Docker-Härtung nicht-Root appuser + HEALTHCHECK (Dockerfile:1)

  • Tests: tests/unit/auth.test.ts, tests/unit/logger.test.ts, tests/unit/eventStore.test.ts, tests/e2e/security.test.ts (helmet/auth, Ratenbegrenzung/RateLimit, Fortsetzbarkeit) — 67 Tests → 130 gesamt mit Phase 5, 90.89% Abdeckung

🔗 Integrationen (Phase 4)

  • Cache MemoryCache TTL (src/utils/cache.ts:1) — defaultCache für Web/GitHub, SimpleQueue (src/utils/queue.ts:1)

  • RAG lokale Vektorsuche (Hash-Embedding 128-dim, Kosinus, Chance=500/50) in src/tools/rag.tool.ts:1rag_ingest (Chunking + sendResourceListChanged), rag_search (topK, Grenzwert), rag_list, rag_clear + Ressourcen-docs://{id}

  • Web src/tools/web.tool.ts:1brave_search (Mock ohne BRAVE_API_KEY), tavily_search (ohne Key), web_fetch (Cache über defaultCache und CACHE_TTL_MS)

  • GitHub src/tools/github.tool.ts:1github_search_repos, github_get_repo, github_get_issue (gecacht, GITHUB_TOKEN für Rate-Limits)

  • Stack docker-compose.yml:1 (App + redis:7 + postgresql:16 + qdrant:v1.12.4) inkl. Healthchecks

  • Demo rag_ingest → rag_search → docs:// E2E-verifiziert in tests/integrations.test.ts:1 (21 Tests)

📈 Skalierung & Betriebsfähigkeit (Phase 5 — v2.0)

  • Versioniertes MCP v2.0.0 (package.json:1, config.MCP_SERVER_VERSION) mit Handlungsanleitungen je Minor (src/server.ts:1)

  • OTEL Tracing/Metriken (src/utils/otel.ts:1) — createSpan/withSpan, incrementCounter/recordHistogram, getMetriken/getSpans, JSON-Export-Stub für OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_ENABLED-Flag

  • RedisEventStore (src/utils/redisEventStore.ts:1) — EventStore-Implementierung mit storeEvent/replayEventsAfter, In-Memory-Fallback, eventStoreFactory.create() für horizontale Skalierung (EVENT_STORE_TYPE=memory|redis, REDIS_URL)

  • Admin-UI (src/routes/admin.ts:1) — GET /admin (HTML-Dashboard), /admin/tools|resources|prompts|metrics|spans|stores|health (JSON), durch ADMIN_TOKEN geschützt (X-AdminToken), ADMIN_ENABLED-Flag

  • Tasks (src/tools/tasks.tool.ts:1) — experimentelles delay_task (falls SDK-Tasks verfügbar) + Fallback create_task/get_task/get_task_result (In-Memory, Polling), Infrastruktur SimpleQueue/MemoryCache

  • Benchmark k6/load.js:1http_req_duration p95<100, stages 10→50 VUs, checks >99%, npm run bench / bench:local

  • Compose docker-compose.yml:1 enthält bereits redis/postgres/qdrant für den schnellen Skalen

  • Tests: tests/scale.test.ts:1 (OTEL-Spans/Metriken, RedisEventStore-Replay, Cache-TTL, Warteschlange, Admin HTML/metriken/token/ready, Task-Erstellung/Abfrage, Version, k6-Skript) — 130 gesamt

  • Deployment bereit für Fly.io/Cloud Run (zustandslos + RedisEventStore), GHCR per release.yml, npm 2.0.0

  • Logger ist stderr-sicher, protokolliert niemals Secrets (Redaction)

  • Zod → JSON-Schema über SDK (src/types.ts)

  • Timeout bei fetch (10s) + strukturierte Fehler

  • Graceful shutdown auf Räumen (SIGINT/SIGTERM)

  • Getrennte Gesundheit (GET /health) und Bereitschaft (GET /ready) außerhalb MCP

  • Standard ist zustandsarm (sessionIdGenerator: undefined), zustandsbehaftet nur wenn RESUMABILITY_ENABLED=true (src/index.ts:22)

  • Typsicher, striktes TS + ESLint flat + Prettier + husky + lint-staged

  • Abdeckung: 85% Linien / 70% SSH erzwingen (vitest.config.ts:1), 130 Tests: Unit- und E2E-Systemtest, Sicherheit, Features, Interops, Skalierung

🤝 Mitwirken

Siehe CONTRIBUTING.mdnvm use, npm test, Werkzeug/Ressource/Prompt hinzufügen, lint/typecheck/test erfolgreich. Siehe CODE_OF_CONDUCT.md.


📚 MCP-Dokumentation

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

View all related MCP servers

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

  • Personal assistant MCP server with search, execute, packages, jobs, secrets, and integrations.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ahmedalbanna/mcp-server-base'

If you have feedback or need assistance with the MCP directory API, please join our Discord server