mcp-server-template
mcp-server-template
Ein produktionsreifer Ausgangspunkt für einen MCP-Server.
Der Schnellstart in der MCP-Dokumentation liefert dir in zehn Zeilen ein funktionierendes Tool. Das ist das, was du in den folgenden drei Wochen hinzufügst, sobald dieses Tool von etwas aufgerufen wird, das du nicht kontrollierst.
@mcp.tool()
def add(a: int, b: int) -> int:
return a + b # fine on a laptopWas dort fehlt, sind keine Funktionen. Es ist das, was passiert, wenn das Tool hängt, eine Exception auslöst, einen Roman zurückgibt oder vierzig Mal gleichzeitig aufgerufen wird – und was das Modell in diesen Fällen sehen darf.
Das Problem, das dieses Template löst
Der Aufrufer eines MCP-Tools ist ein Sprachmodell, und das verändert die Technik.
Ein Modell kann keinen Stacktrace lesen, aber es gibt freudig einen an deine Benutzer weiter. Ein ausgeleckter Stacktrace ist also sowohl nutzlos als auch eine Offenlegung.
Ein Modell hat eine eigene Deadline. Ein Tool, das hängt, erzeugt keine langsame Antwort; es erzeugt eine tote Konversation.
Ein Modell kann ein abgeschnittenes Ergebnis nicht von einem vollständigen unterscheiden. Wenn sein Kontext stillschweigend überläuft, wird kein Fehler ausgelöst – es verschlechtert die Antwort, und du erfährst es von einem Kunden.
Ein Modell wird wiederholen, wenn du es lässt. „Nicht gefunden" und „Upstream ist down" müssen also unterschiedliche Antworten sein, sonst hämmert es einen Dienst für einen Datensatz, der nie existiert hat.
Jeder dieser Fälle wird nur einmal behandelt, und zwar an einer zentralen Stelle, sodass ein Tool, das am Freitagnachmittag hinzugefügt wird, denselben Schutz erbt wie das, das am ersten Tag sorgfältig geschrieben wurde.
Related MCP server: Graft
Was du bekommst
Timeout pro Tool | Wirklicher Abbruch, nicht nur eine Warnung im Nachhinein. Gibt einen |
Parallelitäts-Obergrenze | Begrenzte parallele Ausführung, sodass eine Burst nicht das überrennt, was deine Tools aufrufen |
Fehlergrenze | Deklarierte Fehler erreichen den Aufrufer; unerwartete werden zu |
Geheimnis-Schwärzung | Wird auf Logs und ausgehende Nachrichten angewendet, weil Schlüssel häufiger über interpolierte Exception-Strings nach außen gelangen als über Code |
Sichtbare Kürzung | Zu große Ergebnisse werden sichtbar abgeschnitten, niemals still |
Korrelations-IDs | Eine ID pro Aufruf, im Log und im Fehler – die der Benutzer dir nennen kann |
Strukturierte Logs auf stderr | stdout gehört zum Protokoll – ein falsches |
Fail-fast-Konfiguration | Falsche Einstellungen stoppen Server beim Boot, spät nicht bei der ersten Anfrage |
Offline-Tests | Die Suite läuft im Zug. Keine Live-Schlüssel, kein Netzwerk |
Schnellstart
git clone https://github.com/muhammadwaqasmbd/mcp-server-template
cd mcp-server-template
make install
make test
make run # stdio, ready for a desktop MCP clientStattdessen über das meinene Firefox anbieten:
TRANSPORT=streamable-http PORT=8000 python -m mcp_server_templateEinen Desktop-Client darauf gespeichert
{
"mcpServers": {
"template": {
"command": "python",
"args": ["-m", "mcp_server_template"],
"cwd": "/absolute/path/to/mcp-server-template"
}
}
}Ein eigenes Tool hinzufügen
Schreibe die Funktion. Sonst nichts.
# src/mcp_server_template/tools/orders.py
from ..errors import InvalidInput, UpstreamUnavailable
async def cancel_order(order_id: str) -> dict:
"""Cancel an order. Returns the order's new state."""
if not order_id.strip():
raise InvalidInput("order_id must not be empty") # model can fix this
...
raise UpstreamUnavailable("order service timed out") # model may retryRegistriere es hinter der Die „schütz“:
mcp.tool(name="cancel_order", description="Cancel an order by id.")(
guard.wrap(orders.cancel_order)
)Es hat jetzt den Timeout, die Obergrenze, die Fehlergrenze, die Kürzung und es Logging. Du hast davon nichts geschrieben.
Wirf InvalidInput, wenn das Modell es korrigieren kann. Wirf UpstreamUnavailable, wenn ein weiterer Versuch helfen könnte. Gib für schlicht negative Ergebnisse einfach normal zurück – ein fehlender Datensatz ist eine Antwort, kein Fehler.
Stylish
server.py the ONLY module that imports the MCP SDK
│
├── guard.py timeout · concurrency · error boundary · truncation · timing
├── errors.py what a model is allowed to see, and secret redaction
├── observability.py JSON logs on stderr, correlation ids
├── config.py validated once at boot, immutable thereafter
└── tools/ plain functions. No protocol knowledge. No decoratorsDer Beunruhigt Diepteilt zeigt in eine Richtung: Tools wissen nichts über das Programm, und die Schutzschicht weiß nichts über Tools. Deshalb laufen die Tests in Millisekunden ohne einen Server, und deshalb betrifft eine SD-Kerne genau eine Datei.
Was dieses Bewusst nicht tut
Die „Ränder“ ehrlich darüber zu sagen ist gerade Funktionen mehr.
Keine Authentifizierung. Über stdio der System des Betriebssystems ist die Sicherheitsgrenze. Wenn du in HTTP machst, Getreide ein echter Schulschutz davor – die SDK unterstützt das, es hier zu verdrahten in einem Gefahrenmodell implizieren.
Keine Retry-Logik in den Tools. Die
STUFFgibt mit, ob ein Fehler wieder anfällig ist; sagt euch nicht ob, der Aufrufer hat die Kontext und das Budget.Keine Beschleunigungsbegrenzung pro Anfrage. Die Obergrenze begrenzt die Gesamtarbeit, nicht die Fairness zwischen Identitäten. Wenn du das brauchst, brauchst du zuerst eine Identität.
Keine anhaltende, Warteschlange oder Scheduler. Der Tool-Erf ist zu einem „Job Runner“ ohne Schritt wurde und wurde dies, ist ein verteiltes System, das niemanden absichtlich entwaren – eine Wendung.
Keine Streaming-Ergebnisse. Sinnvoll einge, wenn langlaufende Tools, kannst du es an; die Fehlergrenze macht es schwieriger – die meisten Tools brauchen es nicht.
Testen
make testZuversicht, die Suite schlägt fehl: Es gibt keinen Fehler, einangehaltenes Tool wird abgebrochen, eine unerwartete Exception kann die Nachricht nicht warten, Überdimensionierte Ausgabe wird sichtbar gekürzt, die Obergrenze keine unter zehn Aufrufen liegt, und es wird kein nicht blockierender Sync-Tool kann jedoch den Event-Loop nicht wirklich – ale.
Lizenz
MIT – Siehe LICENSE.
Gebaut von Muhammad Waqas, der den größten Teil seiner Zeit im Agentensystemen verbraucht in regulierten Regionen, wo eine sichere falsche Antwort ein meldepflichtiger Unfall ist.
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
- AlicenseAqualityDmaintenanceA production-grade, extensible Python template for building Model Context Protocol servers with support for Streamable HTTP and stdio transports. It provides a structured framework for implementing tools, resources, and prompts with built-in authentication, observability, and background task management.11MIT
- AlicenseNot gradedqualityCmaintenanceEnables building agent-ready APIs that expose tools as both HTTP and MCP endpoints from a single server definition, with automatic OpenAPI, discovery docs, and interactive API reference.5Apache 2.0
- AlicenseNot gradedqualityDmaintenanceA production-grade MCP server designed for multi-tenant, authenticated, and observable AI agent systems, enabling secure tool execution across heterogeneous data sources.57MIT
- AlicenseAqualityCmaintenanceA production-ready foundation for building secure, observable MCP servers with built-in authentication, rate limiting, and reference tools like database-query and semantic-search.1578MIT
Related MCP Connectors
Hosted MCP server for LLM cost estimation, model comparison, and budget-aware routing.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
An MCP server for Arcjet - the runtime security platform that ships with your AI code.
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/muhammadwaqasmbd/mcp-server-template'
If you have feedback or need assistance with the MCP directory API, please join our Discord server