mcp-express-bolierplate
MCP Node.js Boilerplate
Boilerplate zum Erstellen von MCP-Clients und MCP-Servern mit Node.js + TypeScript. Auf der HTTP-Seite wird Express verwendet. Unterstützt werden:
stdio— der Client startet den Server als Child-Process, geeignet für MCP-Hosts, die lokal laufenStreamable HTTP — der Endpoint liegt unter
/mcpund kann per Cloudflare Tunnel als HTTPS bereitgestellt werdenMock-Tools für CRUD-Operationen auf Users
Statische Resource
users://allund Resource-Templateusers://{id}Prompt
summarize-usersCLI-Client für Discovery, Tool-Aufrufe, Resource-Auslesen und Prompt-Anfragen
Die Ausgangsdaten liegen in src/data/users.json und werden beim Start des Servers in den Speicher geladen. Änderungen über CRUD überschreiben die Datei nicht und werden beim Neustart des Prozesses zurückgesetzt.
Requirements
Node.js 20 oder höher
npm
cloudflarednur für den HTTPS-Tunnel erforderlich
Related MCP server: MCP TypeScript Starter
Installation
npm installBuild und Test prüfen:
npm run checkWichtige Struktur
src/
├── client/
│ └── client.ts # MCP CLI client ใช้ได้ทั้ง stdio และ HTTP
├── data/
│ └── users.json # mock seed data
├── lib/
│ └── api-client.ts # shared Axios instance สำหรับ upstream APIs
├── services/
│ └── user-service.ts # business logic กลางสำหรับ MCP capabilities
└── server/
├── mcp.ts # ประกอบ server และ capability registrations
├── tools/
│ └── user-tools.ts
├── resources/
│ └── user-resources.ts
├── prompts/
│ └── user-prompts.ts
├── schemas/
│ └── user.ts # shared MCP output schema
├── repository.ts # in-memory CRUD repository
├── stdio.ts # stdio entry point
└── http.ts # Express + Streamable HTTP entry point
scripts/
└── build.mjs # compile TypeScript และ copy mock JSON ไป distDie Factory in mcp.ts wird von beiden Transports gemeinsam genutzt, sodass die Fähigkeiten des Servers identisch sind. Tools, Resources und Prompts rufen den zentralen UserService auf, statt direkt an ein Repository gebunden zu sein.
Externe API mit Axios aufrufen
Das Projekt enthält eine gemeinsame Axios-Instanz unter src/lib/api-client.ts mit Base-URL, Timeout und optionalem Bearer-Token. Sie kann in Tools oder Services importiert werden:
import { apiClient } from "../../lib/api-client.js";
const response = await apiClient.get("/users");
console.log(response.data);Konfiguration beim Start des Servers:
API_BASE_URL=https://api.example.com \
API_TIMEOUT_MS=10000 \
API_TOKEN=your-token \
npm run server:httpBeispiel für die Verwendung in einem MCP-Tool:
server.registerTool(
"list-upstream-users",
{
description: "List users from the configured upstream API",
inputSchema: z.object({}),
},
async () => {
const { data } = await apiClient.get("/users");
return {
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
structuredContent: { users: data },
};
},
);Wenn API_BASE_URL nicht gesetzt ist, kann Axios weiterhin direkt eine absolute URL übergeben werden. Vermeiden Sie das Protokollieren von API_TOKEN und bewahren Sie das Token in Production in einem Secret Manager auf.
Ausführung über stdio
Normalerweise muss der stdio-Server nicht separat gestartet werden, da der Client bzw. MCP-Host den Prozess selbst startet.
Demo-Client ausführen, der den Server startet, Capabilities ermittelt, Tools aufruft, Resources liest und einen Prompt anfordert:
npm run client:stdio -- demoServer direkt starten, um auf einen MCP-Host zu warten:
npm run server:stdioWichtiger Hinweis: stdio verwendet stdout als JSON-RPC-Kanal. Server-Logs müssen daher ausschließlich über stderr geschrieben werden, z. B. mit console.error.
Beispielkonfiguration für einen MCP-Host – ersetzen Sie /absolute/path/to/mcp-boilerplate durch den tatsächlichen Pfad:
{
"mcpServers": {
"mock-users": {
"command": "node",
"args": [
"--import",
"tsx",
"/absolute/path/to/mcp-boilerplate/src/server/stdio.ts"
],
"cwd": "/absolute/path/to/mcp-boilerplate"
}
}
}Oder vorher bauen und JavaScript verwenden, ohne zur Laufzeit auf tsx angewiesen zu sein:
npm run build
npm run start:stdioKonfiguration nach dem Build:
{
"mcpServers": {
"mock-users": {
"command": "node",
"args": [
"/absolute/path/to/mcp-boilerplate/dist/server/stdio.js"
],
"cwd": "/absolute/path/to/mcp-boilerplate"
}
}
}Ausführung über Express HTTP
Terminal 1 — Server starten:
npm run server:httpStandardwerte:
MCP-Endpoint:
http://127.0.0.1:3000/mcpHealth Check:
http://127.0.0.1:3000/health
Terminal 2 — HTTP-Client ausführen:
npm run client:http -- demoPort oder Host können über Environment-Variablen geändert werden:
HOST=127.0.0.1 PORT=4000 npm run server:http
MCP_URL=http://127.0.0.1:4000/mcp npm run client:http -- demoFür den Production-Build:
npm run build
npm run start:httpHTTPS mit Cloudflare Tunnel aktivieren
HTTPS wird in diesem Beispiel bei Cloudflare terminiert; der Express-Server lauscht weiterhin nur lokal auf HTTP.
macOS – cloudflared installieren:
brew install cloudflaredTerminal 1 — MCP-HTTP-Server starten:
npm run server:httpTerminal 2 — Quick Tunnel starten:
cloudflared tunnel --url http://127.0.0.1:3000cloudflared zeigt eine temporäre URL an, z. B.:
https://random-words.trycloudflare.comDer externe MCP-Endpoint lautet daher:
https://random-words.trycloudflare.com/mcpTerminal 3 — Test über den HTTPS-Tunnel:
MCP_URL=https://random-words.trycloudflare.com/mcp npm run client:http -- demoQuick Tunnel ist nur für die Entwicklung geeignet, und Cloudflare gibt an, dass SSE nicht unterstützt wird. Daher setzt dieses Boilerplate den Response-Modus auf auto – normale CRUD-/Discovery-Befehle antworten mit JSON, aber Streaming-Funktionen wie langfristige Subscriptions sollten nicht über Quick Tunnel getestet werden. Für Production verwenden Sie einen Named Tunnel, eine eigene Hostname, Authentifizierung und Autorisierung.
Bei Verwendung eines eigenen Hostnames fügen Sie diesen zur Allowlist hinzu:
ALLOWED_HOSTS=mcp.example.com npm run server:httpMehrere Hostnames mit Komma trennen:
ALLOWED_HOSTS=mcp.example.com,mcp-staging.example.com npm run server:httplocalhost, 127.0.0.1, ::1 und *.trycloudflare.com sind für die Entwicklung bereits erlaubt.
MCP-Client-Befehle
Die Syntax ist für client:stdio und client:http identisch – nur der Script-Name ändert sich.
Tools anzeigen:
npm run client:stdio -- list-tools
npm run client:http -- list-toolsResources oder Prompts anzeigen:
npm run client:stdio -- list-resources
npm run client:stdio -- list-promptsCRUD-Tools aufrufen:
npm run client:stdio -- call list-users '{}'
npm run client:stdio -- call get-user '{"id":"1"}'
npm run client:stdio -- call create-user '{"name":"Margaret Hamilton","email":"margaret@example.com","role":"developer"}'
npm run client:stdio -- call update-user '{"id":"1","role":"viewer"}'
npm run client:stdio -- call delete-user '{"id":"3"}'Resources lesen:
npm run client:stdio -- read users://all
npm run client:stdio -- read users://1Prompt anfordern:
npm run client:stdio -- prompt summarize-users '{"tone":"detailed"}'Für eine andere HTTP-URL setzen Sie MCP_URL:
MCP_URL=https://mcp.example.com/mcp npm run client:http -- call list-users '{}'Hinweis für stdio: Jeder CLI-Befehl startet einen neuen Server-Prozess und beginnt daher jedes Mal mit den ursprünglichen Mock-Daten. Wenn CRUD-Operationen zusammenhängend sein sollen, verwenden Sie einen MCP-Host, der die Verbindung hält, oder starten Sie den HTTP-Server und rufen Sie ihn über client:http auf.
Verfügbare Tools, Resources und Prompts
Typ | Name | Funktion |
Tool |
| Alle Users anzeigen |
Tool |
| User anhand der ID anzeigen |
Tool |
| User erstellen |
Tool |
| User bearbeiten |
Tool |
| User löschen |
Resource |
| JSON-Snapshot aller Users |
Resource-Template |
| JSON eines einzelnen Users, mit ID-Vervollständigung |
Prompt |
| Text erzeugen, damit das Modell User-Daten zusammenfasst |
Environment-Variablen
Variable | Standard | Verwendung |
|
| Bind-Adresse des Express-Servers |
|
| Port des Express-Servers |
|
| Endpoint des HTTP-Clients |
| leer | Zusätzliche Host/Origin, die der Server akzeptiert |
| nicht gesetzt | Base-URL der Upstream-API, die Axios aufruft |
|
| Axios-Request-Timeout in Millisekunden |
| nicht gesetzt | Bearer-Token, den Axios automatisch anhängt |
Beispielwerte finden Sie in .env.example. Das Projekt lädt die Datei .env nicht automatisch; exportieren Sie die Variablen oder setzen Sie sie vor dem Befehl, wie in den Beispielen oben.
Sicherheitshinweise
Dieses Beispiel enthält keine Authentifizierung und Autorisierung. Öffnen Sie niemals einen öffentlichen Endpoint mit echten Daten.
Die Validierung von
HostundOriginerlaubt nur localhost, TryCloudflare und Werte ausALLOWED_HOSTS.Das Mock-Repository liegt im Speicher und persistiert bewusst keine Daten.
Für Production sollten Sie Auth, Rate Limiting, Audit-Logging, eine persistente Datenbank sowie eine TLS-/Trust-Proxy-Konfiguration ergänzen, die zum realen System passt.
Alle Scripts
npm run dev:stdio # stdio server พร้อม watch mode
npm run dev:http # Express HTTP server พร้อม watch mode
npm run server:stdio # stdio server จาก TypeScript
npm run server:http # Express HTTP server จาก TypeScript
npm run client:stdio -- demo
npm run client:http -- demo
npm run build
npm run start:stdio # รัน dist หลัง build
npm run start:http # รัน dist หลัง build
npm test
npm run checkReferenzen: MCP TypeScript SDK, Cloudflare Quick Tunnels
This server cannot be installed
Maintenance
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
- AlicenseNot gradedqualityDmaintenanceA simple MCP server that exposes a createUser tool to add users to a local JSON file via stdio transport.2471MIT
- AlicenseNot gradedqualityBmaintenanceA feature-complete MCP server template in TypeScript demonstrating tools, resources, prompts, and both stdio and HTTP transports.8MIT
- FlicenseNot gradedqualityDmaintenanceA sample MCP server that exposes tools, resources, and prompts for managing users and todos, supporting both stdio and Streamable HTTP transports.
- AlicenseNot gradedqualityDmaintenanceEnables creating MCP (Model Context Protocol) servers with zero boilerplate, full TypeScript support, and multiple transports (stdio and HTTP).101MIT
Related MCP Connectors
An MCP server that let you interact with Cycloid.io Internal Development Portal and Platform
A basic MCP server to operate on the Postman API.
A MCP server built for developers enabling Git based project management with project and personal…
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/Pongsapat1035/mcp-express-bolierplate'
If you have feedback or need assistance with the MCP directory API, please join our Discord server