mcp-typescript-starter
MCP TypeScript Starter
MCP TypeScript Starter ist eine produktionsorientierte Grundlage für die Entwicklung eines Model Context Protocol-Servers mit TypeScript. Der Starter enthält ein typisiertes Beispiel-Tool, stdio- und Streamable-HTTP-Transporte, strikte Validierung, Tests, einen gehärteten Container und automatisierte GHCR-Veröffentlichung.
Klonen Sie das Repository, ersetzen Sie die Beispiel-Domäne und behalten Sie die Infrastruktur, die echte MCP-Server benötigen.
Navigation
Related MCP server: mcp-server-http-streamable
Verwendung dieses Starters
Klicken Sie auf GitHub auf Use this template, um einen neuen MCP-Server mit einer unabhängigen Git-Historie zu erstellen. Ersetzen Sie anschließend das Beispiel-Tool und aktualisieren Sie die Projektidentität gemäß Anpassen des Starters.
Forken Sie dieses Repository, wenn Sie Verbesserungen über einen Pull Request beisteuern möchten. Lesen Sie Mitwirken, bevor Sie Änderungen einreichen.
Wenn Ihnen dieser Starter geholfen hat, erwägen Sie, dem Repository einen Stern zu geben. Das hilft anderen TypeScript-Entwicklern, das Projekt zu entdecken.
Über
Der Starter demonstriert den vollständigen Weg von einer validierten MCP-Tool-Definition zu einem für Clients sichtbaren strukturierten Ergebnis. Der Server verwendet das aktuelle modulare MCP TypeScript SDK und das Web-Standard-HTTP-Modell von Hono anstelle eines eigenen Server-Frameworks.
Der standardmäßige stdio-Transport ist für lokale Clients gedacht, die den Server als Kindprozess starten. Streamable HTTP ist zustandslos und erstellt für jede Anfrage einen neuen MCP-Server, sodass der Transport ohne gemeinsam genutzten Sitzungsspeicher repliziert werden kann.
Das Beispiel führt begrenzte In-Memory-Arbeit aus. Es gibt keine Telemetrie, Anwendungsdatenbank, persistenten Speicher, Authentifizierung oder Abhängigkeit von externen Diensten.
Funktionen
Registriert Tools mit strikten Zod-Eingabe- und -Ausgabeschemas.
Gibt sowohl menschenlesbare Inhalte als auch typisierte strukturierte Inhalte zurück.
Enthält präzise MCP-Sicherheitsannotationen.
Unterstützt stdio und zustandsloses Streamable HTTP.
Verwendet Hono mit Host- und Origin-Validierung gegen DNS-Rebinding.
Bindet HTTP standardmäßig an Loopback und erfordert für andere Schnittstellen eine Allowlist.
Begrenzt Tool-Eingaben und HTTP-Anforderungstexte.
Hält stdout im stdio-Modus exklusiv für MCP-Protokollnachrichten.
Behandelt SIGINT und SIGTERM mit idempotentem Graceful Shutdown.
Läuft als Nicht-Root-Container mit Unterstützung für ein schreibgeschütztes Root-Dateisystem.
Testet Konfiguration, stdio-Anbindung, MCP-Verhalten, Hono-Routen und echten HTTP-Verkehr.
Veröffentlicht Multi-Architektur-Images erst nach bestandenen Qualitätsprüfungen.
MCP-Tools
echo
Gibt eine validierte Nachricht und optionale String-Metadaten zurück. Es ist bewusst einfach gehalten, damit das Repository MCP-Schemas, Registrierung, Annotationen und Ergebnisse vermittelt, ohne eine Geschäftsdomäne zu erfinden.
Beispieleingabe:
{
"message": "Hello, MCP!",
"metadata": {
"source": "example-client"
}
}Beispiel für die strukturierte Ausgabe:
{
"message": "Hello, MCP!",
"metadata": {
"source": "example-client"
}
}Nachrichten sind auf 10.000 Zeichen begrenzt. Metadaten akzeptieren höchstens 20 Einträge; Schlüssel sind auf 64 Zeichen und Werte auf 1.024 Zeichen begrenzt.
Tech-Stack
TypeScript mit strengen Projektregeln
Installation
Voraussetzungen
Node.js 24+ und pnpm 11 für die lokale Entwicklung.
Docker und Docker Compose für die Container-Bereitstellung.
Docker Compose
Die empfohlene HTTP-Bereitstellung verwendet das veröffentlichte Multi-Architektur-Image:
ghcr.io/lukegskw/mcp-typescript-starter:latestLaden Sie das Compose-Beispiel herunter und geben Sie den Hostnamen an, den Clients verwenden werden:
curl -O https://raw.githubusercontent.com/lukegskw/mcp-typescript-starter/main/compose.example.yaml
export MCP_ALLOWED_HOSTS='mcp.example.internal'
docker compose -f compose.example.yaml up -dDie Streamable-HTTP- und Health-Endpunkte sind verfügbar unter:
http://<host>:3000/mcp
http://<host>:3000/healthzUm einen anderen Host-Port zu veröffentlichen, setzen Sie MCP_PUBLISHED_PORT. Die Anwendung verwendet im Container weiterhin Port 3000.
Das latest-Tag folgt dem neuesten erfolgreichen Build aus dem Standard-Branch. Verwenden Sie für eine kontrollierte Bereitstellung und ein Rollback ein Versions- oder unveränderliches sha-*-Tag.
Docker run
docker run -d \
--name mcp-typescript-starter \
--restart unless-stopped \
--read-only \
--user 10001:10001 \
--cap-drop ALL \
--security-opt no-new-privileges:true \
--tmpfs /tmp:size=16m,mode=1777 \
-e MCP_TRANSPORT=streamable-http \
-e MCP_HOST=0.0.0.0 \
-e MCP_ALLOWED_HOSTS=127.0.0.1,localhost,mcp.example.internal \
-p 3000:3000 \
ghcr.io/lukegskw/mcp-typescript-starter:latestContainer aus dem Quellcode erstellen
git clone https://github.com/lukegskw/mcp-typescript-starter.git
cd mcp-typescript-starter
docker buildx build --load -t mcp-typescript-starter:local .Lokale Node.js-Installation
git clone https://github.com/lukegskw/mcp-typescript-starter.git
cd mcp-typescript-starter
pnpm install --frozen-lockfile
pnpm build
pnpm start -- --transport stdioFür die lokale Streamable-HTTP-Entwicklung:
MCP_TRANSPORT=streamable-http pnpm devKonfiguration
Variable | Erforderlich | Standard | Beschreibung |
| Nein |
|
|
| Nein |
| HTTP-Bind-Adresse. |
| Nein |
| HTTP-Listening-Port. |
| Außerhalb von Loopback | Keine | Durch Kommas getrennte Allowlist für Host- und Origin-Hostnamen. |
Die Befehlszeilenoption --transport überschreibt MCP_TRANSPORT. MCP_ALLOWED_HOSTS enthält Hostnamen, keine URLs; nehmen Sie jeden Hostnamen auf, den legitime Clients und Health-Checks verwenden.
Der Server enthält keine Geheimnisse in seiner Beispielkonfiguration. Fügen Sie Domänen-Anmeldeinformationen über die Bereitstellungsplattform oder die Umgebung hinzu, niemals als MCP-Tool-Argumente oder in eingecheckten Dateien.
MCP-Client-Einrichtung
Für einen Client, der Streamable-HTTP-Serverdefinitionen akzeptiert:
mcp_servers:
starter:
url: http://127.0.0.1:3000/mcpFür einen Client, der einen lokalen stdio-Server startet:
{
"mcpServers": {
"starter": {
"command": "node",
"args": [
"/absolute/path/to/mcp-typescript-starter/dist/main.js",
"--transport",
"stdio"
]
}
}
}Damit ein lokaler Client den Container über stdio starten kann, verwenden Sie docker run -i --rm und übergeben Sie --transport stdio nach dem Image-Namen. -i ist erforderlich, damit der Client MCP-Nachrichten über Standardeingabe und -ausgabe austauschen kann.
Die Konfigurationsformate der Clients unterscheiden sich. Konsultieren Sie die Dokmentation des Clients für das genaue Schema und starten Sie den Client nach der Änderung seiner Serverdefinition neu oder laden Sie ihn neu.
Anpassen des Starters
Die wichtigsten Erweiterungspunkte sind bewusst direkt:
Kopieren oder ersetzen Sie
src/tools/echo.ts.Definieren Sie strikte Eingabe- und Ausgabeschemas, bevor Sie den Handler schreiben.
Registrieren Sie das Tool in
src/server.ts.Fügen Sie MCP-Verhaltenstests und gegebenenfalls Domänen-Integrationstests hinzu.
Ersetzen Sie Paketname, Serveridentität, Image-Referenzen und README-Inhalt.
Halten Sie Tool-Module für ihre eigenen Schemas und Handler verantwortich. Halen Sie Transportmodul uninabhängig von Domänen-Tools. Führen Sie Dienste oder Persistenz nur ein, wenn echtes Verhalten sie erfordert.
Verifizierung
Führen Sie die vollständige Repositor-Testsuite aus:
pnpm install --frozen-lockfile
pnpm format:check
pnpm lint
pnpm typecheck
pnpm test:unit
pnpm test:integration
pnpm buildFür Container-Änderungen:
docker buildx build --load -t mcp-typescript-starter:test .Verbinden Sie abschließend einen MCP-Client und bestätigen Sie, dass echo aufgelistet ist und sowoht Text als auch strukturierte Inhalte zurückgibt. Bestätigen Sie im HTTP-Modus, dass /healthz {"status":"ok"} meldet.
Einschränkungen
Das Beispiel stellt ein Tool und keine Ressourcen oder Prompts bereit.
Streamable HTTP hat keine Authentifizierung. Beschränken Sie es auf Loopback, ein vertauenswürdiges LAN, ein VPN, ein privates Containernetzwerk oder einen authentifizierten Reverse-Proxy.
Host- und Origin-Allowlists verhindern bestimmte Klassen von DNS-Rebinding-Angrifen, authentizieren Aufrufer jedoch nicht.
Der HTTP-Server ist zustandslos und enthält keine gemeinsame Persistenz oder verteilte Koordination.
Rate Limiting, Tracing, Metriken und domänenspezifisches Logging sind nicht enthalten.
Das Repositorium ist ein Quellcode-Starter, keine veröffentlichte npm-Bibliothek.
Lesen Sie SECURITY.md, bevor Sie den HTTP-Transport öffentlich zugänglich machen oder ein Sicherheitsproblem melden.
Mitwirken
Beiträge sind willkommen. Bevor Sie einen Pull Request öffnen:
pnpm install --frozen-lockfile
pnpm format:check
pnpm lint
pnpm typecheck
pnpm test
pnpm build
docker buildx build --load -t mcp-typescript-starter:test .Änderungen müssen strenge Typisierung, begrenzte Validierung, strukturierte MCP-Ergebnisse, die Reinheit des stdout-Protokolls, sichere HTTP-Standardwerte, deterministische Tests und Dokumentation benutzersichtbaren Verhaltens bewahren. Fügen Sie keine Abstraktionen hinzu, ohne einen konkreten Anwendungsfall für sie zu haben.
Lizenz
MIT. Siehe LICENSE.
Available Tools
1 toolechoEchoBRead-onlyIdempotent
Echo a validated message and optional string metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | ||
| metadata | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| metadata | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety and side-effect expectations. The description adds minimal behavioral context, mainly 'validated', which hints that inputs are checked but not how. No contradiction with annotations; the bar is lower, so a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with no unnecessary words. The verb is front-loaded, and the optional part is clearly flagged. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a trivial echo tool, the description is nearly sufficient. The output schema exists, and annotations cover read-only/idempotent behavior, so return-value details are not needed. The only gap is vague 'validated' wording, but the tool is simple enough that an agent can invoke it correctly with the given information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It names 'message' and 'optional string metadata', but the schema already provides types and constraints. Calling metadata 'string metadata' is potentially misleading because the schema defines metadata as an object with string values, not a string. This adds little value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('echo') and resource ('a validated message and optional string metadata'), making the core function clear. There are no sibling tools to differentiate from, so the lack of distinction is not a flaw. However, 'validated' is slightly ambiguous — it might imply an extra validation step that is actually handled by the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool or what to prefer it over. There are no siblings, but the description still does not state typical scenarios (e.g., debugging, round-trip testing). The intended usage is only implied by the verb 'echo'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.1.0- First observed
echo
TDQS
Scored across 1 tool
With only one tool, there is no possibility of confusion or overlap. The single 'echo' tool is clearly distinct by virtue of being the only tool available.
The single tool name 'echo' is short, clear, and directly describes its function. Since there is only one tool, naming consistency is trivially satisfied.
One tool feels minimal even for a starter server, but it is a common pattern for a simple template. The count is at the lower edge of being acceptable rather than egregiously insufficient.
The server only provides an echo function, which is useful for testing connectivity but lacks any real domain operations. There are no CRUD or workflow capabilities, representing a significant gap for any practical use beyond a basic demo.
Maintenance
Related MCP Connectors
Enable secure connectivity between Sentry issues and debugging data, and LLM clients, using a Model Context Protocol (MCP) server.
A Model Context Protocol server for Wix AI tools
Ovanek MCP: Model Context Protocol server for Ovanek platform tools; writes are dry-run by default.
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
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA stateless Model Context Protocol server that implements a simple echo functionality with resource, tool, and prompt components, enabling LLMs to echo back messages through standardized MCP interactions.1ISC
- AlicenseNot gradedqualityDmaintenanceA minimal Model Context Protocol server that facilitates network-based client connections using Streamable HTTP transport. It provides a greeting tool and is optimized for consistent deployment across local environments, Docker, and Kubernetes.MIT
- AlicenseNot gradedqualityFmaintenanceA robust server implementing the Model Context Protocol with SSE and STDIO transport, enabling real-time communication and extensible tooling for AI models.402 npm4MIT
- AlicenseNot gradedqualityBmaintenanceProvides a production-ready Model Context Protocol server with dual STDIO and Streamable HTTP transports, enabling file operations, memory, database queries, RAG, web search, GitHub integration, background tasks, and prompt-based workflows.MIT