Der MCP-Server stellt das Framework für die Verbindung der Funktionen Ihrer App (MCP-Tools) mit der Connected Apps Platform bereit. Damit die Ergebnisse Ihres Dienstes zuverlässiger ausgewählt, aufgerufen und verarbeitet werden können, muss Ihre MCP-Konfiguration die folgenden Standards strikt einhalten.
Grundprinzipien
Konzentrieren Sie sich bei jeder Funktion auf die Nutzerabsicht und die Anwendungsfälle und nicht auf die Funktionen der Funktion. Die Beschreibung ist die wichtigste Möglichkeit, dem Modell mitzuteilen, wofür Ihr Tool gedacht ist und auf welche Anwendungsfälle es reagieren kann.
Versionsverwaltung
Um skalierbare und robuste MCP-Bereitstellungen zu unterstützen, sollten Sie eine strukturierte URI-Architektur mit pfadbasierter Versionsverwaltung verwenden, z. B. /v1, /v2. So können Sie die Abwärtskompatibilität aufrechterhalten und neue Funktionen freigeben.
Durch die Ergänzung mit anbieterspezifischen Subdomains wie https://gemini.mcp.company.com/mcp/v1 wird eine detaillierte Traffic-Verwaltung und die Optimierung von Tooldefinitionen ermöglicht, die auf den individuellen Kontext und das Verarbeitungsverhalten verschiedener KI-Modelle zugeschnitten sind.
Kompatibilität der MCP-Protokollversionen
Die Connected Apps Platform unterstützt die Spezifikation des Model Context Protocol (MCP) bis Version 2025-11-25. Neuere Spezifikationsversionen werden noch nicht unterstützt.
- Verantwortung des Entwicklers: Sie sind dafür verantwortlich, dass Ihr MCP-Server während des
initialize-Handshakes und bei allen Tool- und Schemadefinitionen strikt eine Protokollversion einhält, die von der Connected Apps Platform (2025-11-25) unterstützt wird. - Abwärtskompatibilität der Plattform: Da die Connected Apps Platform in Zukunft neuere MCP-Spezifikationsversionen übernimmt, bleibt unser Client abwärtskompatibel mit zuvor unterstützten Protokollversionen, sodass bestehende Produktionsintegrationen ohne Unterbrechung funktionieren.
- Upgrades verwalten: Wenn Sie eine neu unterstützte MCP-Spezifikation übernehmen oder Schemaänderungen einführen möchten, stellen Sie diese Aktualisierungen über einen neuen versionierten URI-Pfad (z. B.
/mcp/v2) bereit, während Sie Ihren vorhandenen Endpunkt (/mcp/v1) für aktiven Traffic beibehalten.
Änderungen an MCP-Schemas sind zwischen App-Versionen zulässig. Wir empfehlen, diese Funktion zu nutzen und die MCP-Endpunkte zu versionieren, um eine schrittweise Einführung neuer Funktionen zu ermöglichen, oder sich strikt auf abwärtskompatible Änderungen zu verlassen.
Spezifikation des Transportprotokolls
Die Connected Apps Platform unterstützt ausschließlich die Streamable HTTP-Transport-Spezifikation des Model Context Protocol Version 2025-03-26 und höher. Das Legacy-HTTP mit SSE-Transport, das in der Spezifikation vom 05.11.2024 beschrieben wird, wird nicht unterstützt.
- Einzelner HTTP-Endpunkt. Der in der Connected Console angegebene MCP-Endpunkt (z. B.
https://api.example.com/mcp) ist die einzige URL, an die entsprechende Google-Produkte alle JSON-RPC-Anfragen (initialize,tools/list,tools/call) über Standard-HTTP POSTsenden. - SSE-Streaming innerhalb von streamfähigem HTTP. Der Legacy-SSE-Transport mit mehreren Endpunkten wird nicht unterstützt, aber Server-Sent Events wie
text/event-streamwerden in Streamable HTTP unterstützt. Ausgehende Anfragen von entsprechenden Google-Produkten enthaltenAccept: application/json, text/event-stream. Das bedeutet, dass Ihr Server entweder eine Standard-application/json-Nutzlast zurückgeben oder inkrementelle Antworten mitContent-Type: text/event-streamdirekt imHTTP POST-Antworttext streamen kann. - GET-Stream und 405 Method Not Allowed. Clients können einen optionalen
GET-Stream auf dem Endpunkt für Server-zu-Client-Benachrichtigungen versuchen. Wenn Ihr Server zustandslos ist oder nur Anfragen und Antworten verarbeitet, wird die Rückgabe vonHTTP 405 Method Not Allowedexplizit unterstützt und vom Client-Proxy des entsprechenden Google-Produkts sauber verarbeitet.
Anleitung für Server
Die Connected Apps Platform ist für die Aufnahme von Serveranweisungen optimiert. Dadurch ist ein gewisses Maß an Kontrolle über das Verhalten des Modells möglich, das auf andere Weise nicht erreicht werden kann.
Folgen Sie der Anleitung für den Server.
Als „Modellhinweis“ mit Nutzungskontext behandeln
Beachten Sie die folgenden Richtlinien, wenn Sie Modellen Hinweise geben.
- Schreiben Sie Anweisungen als allgemeinen „Hinweis“ oder Leitfaden, damit das LLM den allgemeinen Zweck und die Funktionen des Servers versteht.
- Beschreiben Sie, was der Server tun kann, anstatt Funktionen aufzulisten oder zu beschreiben, wie das Modell die Tools und Ressourcen des Servers verwenden soll. Wenn das Modell das „Was“ richtig versteht, kann es das „Wie“ anhand der User Journey recht gut bestimmen.
- Gehen Sie davon aus, dass dieser Text direkt dem System-Prompt des Modells hinzugefügt wird. Formulieren Sie klar, direkt und token-effizient.
Ergänzen, nicht duplizieren
Verwenden Sie diesen Bereich für globalen Kontext, der für alle Tools gilt, um Redundanz mit einzelnen Toolbeschreibungen zu vermeiden.
Beispiele für Serveranweisungen
Die folgenden Beispiele zeigen, was Sie beim Schreiben von Serveranweisungen tun und lassen sollten.
| Empfohlen | Nicht empfohlen |
|---|---|
Du bist ein spezialisierter GitHub-Repository-Maintainer. Dieser Server bietet umfassenden Zugriff auf Repository-Metadaten, Issue Tracker und PR-Workflows. Verwenden Sie es, um den Zustand des Projekts zu erhalten, die Triage zu automatisieren und Codestandards zu gewährleisten. Sofern nicht anders angegeben, werden alle Aktionen im Kontext der authentifizierten Organisation ausgeführt. Priorisieren Sie die Identifizierung veralteter Threads oder nicht verknüpfter PRs, um das Repository organisiert zu halten. Prägnant, direkt und ergänzend zum Modell
|
Dieser Server hat Tools für GitHub. Du solltest das Tool
|
Richtlinien für Tools
In den folgenden Richtlinien werden Best Practices für das Erstellen von MCP-Serverkonfigurationen für verschiedene Funktionen oder Tools in Ihrer App beschrieben.
Namenskonventionen für Tools
Beachten Sie die folgenden Richtlinien für die Benennung Ihres Tools:
Verwenden Sie intuitive, menschenlesbare Namen.
Verwenden Sie menschenlesbare Namen mit klarer, intuitiver Bedeutung anstelle von mehrdeutigen Namen. get_user_information ist beispielsweise einfacher als userInfo.
Achten Sie auf die richtige Groß-/Kleinschreibung.
Beachten Sie die folgenden Regeln für die Groß-/Kleinschreibung von Toolfunktionsnamen und App-Triggern:
- Groß-/Kleinschreibung bei Toolfunktionen Verwenden Sie
snake_caseodercamelCasefür Toolfunktionsnamen, die in Ihrem MCP-Schema definiert sind (z. B.get_user_informationoderpublishDraft). - Gehäuse des App-Ziehpunktes Bei App-Triggern und Erwähnungen (z. B.
@MyTwoWordApp) wird die Groß-/Kleinschreibung nicht berücksichtigt. Die Plattform normalisiert Nutzereingaben in Kleinbuchstaben (@mytwowordapp), PascalCase (@MyTwoWordApp) und camelCase (@myTwoWordApp). - Formatierung des Anzeigenamens: Registrieren Sie den offiziellen Titel Ihrer App mit PascalCase oder Standardleerzeichen, damit er in UI-Elementen gut lesbar ist.
- Umgang mit Tippfehlern: Während Groß- und Kleinschreibung automatisch berücksichtigt wird, werden Tippfehler (z. B.
@mytwowrodapp) nicht durch direkten Stringabgleich, sondern durch die Erkennung von Fallback-Intents erkannt. Entwickler sollten in der Dokumentation auf die korrekte Schreibweise von Handles achten.
Explizite Verb-Nomen-Benennung verwenden
Verwenden Sie spezifische verb_noun-Namen und vermeiden Sie Mehrdeutigkeiten. publish_draft ist beispielsweise besser als handle_content.
Detaillierungsgrad des Tools
Beachten Sie die folgenden Richtlinien zur Tool-Granularität.
Tools als atomare Endpunkte behandeln
Behandeln Sie Tools als atomare Endpunkte ohne interne Tool-Bedingungen oder mehrere Funktionen mit den jeweils erforderlichen Parametern. Mit granularen Tools kann das Modell Schritte logisch verketten, was Halluzinationen reduziert.
Flachere Schemas verwenden
Wenn Sie tief verschachtelte Objekte oder komplexe oneOf- oder anyOf-Schemalogik benötigen, um Eingaben zu validieren, ist Ihr Tool wahrscheinlich zu breit gefächert.
Schutzmaßnahmen für Voraggregation und Nutzlast beachten
Obwohl die Vorabaggregation von Daten für kleine, begrenzte Nutzlasten nicht strikt durch das Protokoll erzwungen wird, ist sie in der Praxis dringend erforderlich, wenn mit großen Datensätzen, Längsschnittverläufen und Datensätzen aus mehreren Quellen gearbeitet wird. Die Connected Apps Platform erzwingt Schutzmaßnahmen in Bezug auf Kontextfensterlimits, Ausführungslatenz und Modell-Reasoning-Schritte. Beachten Sie die folgenden Richtlinien, um diese Schutzmaßnahmen einzuhalten:
- Filtern und Zusammenfassen im Backend Filtern, aggregieren oder fassen Sie große Datenstreams auf Ihrem MCP-Server immer vor, bevor Sie Antworten an die entsprechenden Google-Produkte zurückgeben.
- Rohdaten vermeiden: Geben Sie niemals Rohdatenbankzeilen oder vollständige nicht indexierte Logs in die Rückgabe-Nutzlast des Tools ein.
Interne und Meta-Tools weglassen
Geben Sie in der tools/list-Antwort Ihres Servers nur modellbezogene Funktionen an:
- Hilfstools filtern: Lassen Sie alle internen, administrativen oder Meta-Tools weg, die nicht vom Modell aufgerufen werden sollen (z. B. Server-Systemdiagnosen, interne Einrichtungsroutinen oder Entwickler-Hilfsprogramme).
- Effizienz des Kontextfensters: Wenn Sie unnötige Tools ausschließen, bleibt Ihr MCP-Schema kompakt, der Tokenverbrauch im Kontextfenster wird reduziert und Verwirrung bei der Tool-Weiterleitung des Modells wird vermieden. MCP-Server, die Dutzende von Tools oder tief verschachtelte „Mega-Tool“-Schemas bereitstellen, werden bei der Überprüfung zur Behebung gekennzeichnet.
Empfohlene und zu vermeidende Vorgehensweisen für die Granularität des Tools
Die folgenden Beispiele zeigen, was Sie bei der Benennung von Tools und der Verwendung von Granularität tun und lassen sollten.
| Empfohlen | Nicht empfohlen |
|---|---|
|
Spezifische Tools mit klaren Namen und Parametern Das Eingabeschema für jedes Tool ist strikt. Wenn das LLM einen Nutzer erstellen möchte, muss es eine E-Mail-Adresse angeben. Wenn es löschen möchte, muss es eine ID angeben. Es gibt kein Rätselraten. |
Toolname: manage_user Description: "Use this tool to create, update, delete, or retrieve users." |
Tool-Anmerkungen für die Sicherheit deklarieren
Konfigurieren Sie Protokollannotationen in Ihren Tooldefinitionen, um das Ausführungsverhalten zu vermitteln und integrierte Sicherheitsprüfungen in den entsprechenden Google-Produkten auszulösen:
- Bestätigungs-Gates zur Laufzeit: In den entsprechenden Google-Produkten werden
annotations.destructiveHint: trueundannotations.openWorldHint: trueals wichtige Flags verwendet, um Bestätigungsaufforderungen für Nutzer zur Laufzeit auszulösen. Deklarieren SiedestructiveHint: truefür zustandsändernde, schreibende oder destruktive Aktionen und legen SieopenWorldHint: truefür Tools fest, die mit Open-World- oder externen Umgebungen interagieren, damit die Oberfläche den Nutzer vor der Ausführung nativ zur Bestätigung auffordert. - Hinweis für schreibgeschützte Abfragen: Legen Sie
readOnlyHint: truefür Abfragetools fest, die nur Daten abrufen, ohne den Backend-Status zu ändern. - Explizite Annotationsstandardwerte: Gemäß der Spezifikation des Model Context Protocol führt das Weglassen von
readOnlyHintdazu, dass Clients aus Sicherheitsgründen standardmäßigreadOnlyHint: falseunddestructiveHint: trueannehmen. Durch die explizite Deklaration von Annotationen für alle Tools wird ein vorhersehbares Modell-Routing und eine ordnungsgemäße Ausführungssicherheit gewährleistet.
Toolbeschreibungen
Die Beschreibung ist der einzige Kontext, den das Modell hat, um zu entscheiden, ob Ihr Tool das aktuelle Problem lösen kann. Beachten Sie beim Verfassen von Beschreibungen die folgenden Richtlinien:
Anweisungen schreiben, keine Kommentare
Schreiben Sie Toolbeschreibungen als Anweisungen und nicht als Codekommentare, die oft passiv sind. LLMs reagieren gut auf Anweisungen.
Das „Wie“ erklären
Eine gute Beschreibung schließt die Lücke zwischen „Ich habe ein Tool“ und „Ich weiß, wie ich dieses Tool in eine Unterhaltung einbinde“.
Erklären Sie das „Warum“
Unterscheiden Sie dieses Tool von ähnlichen Tools, z. B. „Verwenden Sie dieses Tool für interne Nutzer und customer_update für externe Nutzer“.
Link angeben
Teilen Sie dem Modell mit, wo die Argumente zu finden sind, z. B. „aus dem Tool order_search“.
Format angeben
Geben Sie Einheiten (Meter oder Fuß) und Formate (ISO-Daten, semantische Versionen) an.
Modellermessen vermeiden
Weisen Sie das Modell nicht an, nach „bestem Wissen und Gewissen“ zu handeln, und schlagen Sie keine optionalen, ungesteuerten Aktionen vor.
Beispiele für Toolbeschreibungen
Die folgenden Beispiele zeigen, was Sie beim Schreiben von Toolbeschreibungen tun und lassen sollten.
| Empfohlen | Nicht empfohlen |
|---|---|
|
Informationsquelle "Updates a user's email. Sie müssen die UUID „id“ verwenden, die vom Tool (Die Ausgabe eines Tools wird explizit mit der Eingabe dieses Tools verknüpft.) |
„Aktualisiert die E‑Mail-Adresse des Nutzers.“ (Das Modell könnte eine ID wie 12345 erraten.) |
|
Format und Einschränkung „Plane eine Besprechung. „date“ muss im ISO 8601-Format (JJJJ-MM-TT) angegeben werden. Wenn der Nutzer „morgen“ oder einen anderen relativen Bezug verwendet, berechne das Datum basierend auf dem aktuellen Kontext.“ |
„Plane eine Besprechung für das angegebene Datum.“ (sieht für einen Menschen korrekt aus, z. B. „morgen“, schlägt aber bei der Schemavalidierung fehl, da „2025-10-12“ erforderlich ist) |
|
Erwartungen an die Ausgabe "Retrieves server logs. Gibt die letzten 50 Zeilen des Rohtexts zurück. Fordern Sie für die Analyse kleinere Zeitfenster an, um Tokenlimits zu vermeiden.“ |
Server-Logs abrufen (Das Modell ruft möglicherweise ein Tool auf, das eine Zusammenfassung erwartet, erhält einen rohen 5‑MB-JSON-Dump und liefert möglicherweise eine schlechte Nutzererfahrung.) |
Diese Beschreibung dient als Kurzanleitung. Sie verarbeitet die Quelle (wo die ID abgerufen werden soll), die Einschränkungen (gültige Enums) und die Aktion. |
Hierbei wird die gesamte Arbeit von den Variablennamen erledigt. Das Modell muss die gültigen Werte für „status“ erraten. |
Toolparameter
Beschreiben Sie neben dem Tool selbst auch die Parameter, um sie eindeutig zu machen.
Explizite Typen
Verwenden Sie starke, spezifische Typen (string, integer, boolean, array).
Enums für feste Wertesätze verwenden
Wenn ein Parameter nur einen festen Satz von Werten akzeptiert (z. B. daylight, cool, warm), listen Sie sie in einem enum-Array auf. Dadurch wird die Genauigkeit erheblich verbessert.
Erforderliche Parameter klar angeben
Definieren Sie klar, welche Parameter für die Funktion erforderlich sind.
Semantischen Schemaabgleich anwenden
Beim Einbinden Ihrer App ist möglicherweise ein semantischer Schemaabgleich zwischen den Parametern Ihrer Tools und der Branche, für die Sie entwickeln, erforderlich. Sie erhalten das erwartete vertikale Schema (ein JSON-Schema) während des Onboarding-Prozesses.
Beispiele für Toolparameter
Die folgenden Beispiele zeigen, was Sie beim Umgang mit Toolparametern tun und lassen sollten.
| Empfohlen | Nicht empfohlen |
|---|---|
|
Argumentformate und ‑einheiten radius: "Der Radius in Metern. Muss eine Gleitkommazahl > 0 sein.“ (verhindert KI-Halluzinationen bei Einheiten) |
radius: „Der Radius des Kreises.“ |
|
ID-Formate und Kontext user_id: "Die Datenbank-UUID (z. B. 550e8400-e29b...). Verwenden Sie hier keine E‑Mail-Adressen.“ Hinweis: Als Best Practice sollten alle numerischen ID-Felder als Stringwerte behandelt werden. Wenn Ihre ID mehr als 10 Ziffern hat, besteht die Gefahr, dass sie von internen Systemen abgeschnitten wird (erzwungene Speicherung in einem 32-Bit-Container) und diese Version vom Modell in zukünftigen Toolaufrufen verwendet wird. (verhindert Typfehler) |
user_id: „Die ID des Nutzers.“ |
|
Erwartungen an den Rückgabewert "Updates the record and returns the updated JSON object including the new timestamp." (Teilt dem Modell mit, dass es nach dem „update“ nicht sofort ein „get“-Tool aufrufen muss, um die Änderung zu prüfen.) |
„Aktualisiert den Eintrag.“ |
|
Das LLM weiß nicht, welche Syntax „query“ unterstützt (SQL? Regex? Nur-Text?) Das maximale Limit ist nicht bekannt. |
Antworten und Fehlerbehandlung
Gemäß dem Grundprinzip Die Antwort ist der nächste Prompt meldet das Tool das Ergebnis seiner zugrunde liegenden Ausführung, indem es eine Datennutzlast zurückgibt, die dann direkt in das Kontextfenster des LLM eingefügt wird. Der Erfolg oder Misserfolg des Ergebnisses bestimmt, was als Nächstes passiert:
- Wenn der Aufruf erfolgreich ist: Das Modell benötigt den Rückgabewert, um zu wissen, was passiert ist, und den nächsten Schritt zu entscheiden.
- Wenn es fehlschlägt: Das Modell muss wissen, warum es fehlgeschlagen ist und wie das Problem behoben werden kann. Ein Absturz (500-Fehler) beendet die Unterhaltung. Eine aussagekräftige Fehlermeldung ermöglicht es dem Modell, sich selbst zu korrigieren.
Unabhängig davon, ob die zugrunde liegende Logik Ihres Tools erfolgreich ist oder fehlschlägt, müssen Sie die Nutzlast des Rückgabewerts so formatieren, dass das Modell sie leicht parsen kann. Beachten Sie beim Verpacken der Antwortnutzlast die folgenden Best Practices.
JSON verwenden
Strukturierte Daten in TextContent formatieren (vorübergehende Einschränkung). Da structuredContent auf der Connected Apps Platform noch nicht unterstützt wird, müssen Sie Ihre Daten manuell serialisieren. Auch wenn Sie eine einfache Liste zurückgeben, json.dumps() Sie sie.
URLs in Antwort einbeziehen
Die zurückgegebenen URLs sollten relativ kurz sein und nicht viele Parameter enthalten. Es wird empfohlen, URL-Kürzungsdienste zu verwenden, um Tokens zu sparen und das Risiko von Halluzinationen zu verringern.
Selbstbeschreibende Anti-Halluzinations-Nutzlasten
Verknüpfen Sie Rohcodes oder interne IDs immer mit menschenlesbaren Anzeigenamen, expliziten Maßeinheiten und Referenzbereichen. Geben Sie niemals komprimierte Wörterbuchschlüssel oder nicht zugeordnete numerische Codes zurück, die das Modell dazu zwingen, den Kontext abzuleiten.
Robuste Fehlerbehandlung implementieren
Geben Sie klare, aussagekräftige Fehlermeldungen zurück, damit das Modell versteht, was schiefgelaufen ist, und den Nutzer informieren kann. Weitere Informationen finden Sie unter MCP-Fehlerbehandlung.
try/except verwenden
Verpacken Sie die Tool-Logik in try/except-Blöcke und geben Sie Fehler als Strings zurück.
Fehler mit Lösungsvorschlägen bereitstellen
Schlagen Sie in der Fehlermeldung den nächsten Schritt vor (z. B. „Versuchen Sie es zuerst mit Tool X“).
Aktionen bestätigen
Geben Sie für Tools mit Nebenwirkungen (Erstellen/Aktualisieren/Löschen) keine leeren Strings zurück.
Beispiele für Antworten und Fehlerbehandlung
Die folgenden Beispiele zeigen, was Sie bei Antworten und der Fehlerbehandlung tun und lassen sollten.
| Empfohlen | Nicht empfohlen |
|---|---|
|
Explizite Serialisierung |
|
|
Abfangen und informieren (Das Tool „funktioniert“ technisch gesehen, d. h., es gibt einen String zurück, aber der String enthält die Fehlerdetails. Das Modell liest dies, erkennt, dass die ID nicht existiert, und kann den Nutzer nach der richtigen ID fragen. |
(Wenn |
|
Leere Antworten |
LLMs werden durch leere Antworten oft verwirrt. Sie könnten „Das Tool ist fehlgeschlagen“ halluzinieren oder den Aufruf einfach wiederholen. |
|
Selbstbeschreibende Anti-Halluzinations-Nutzlast Verknüpfen Sie Rohcodes oder interne IDs immer mit menschenlesbaren Anzeigenamen, expliziten Maßeinheiten und normalen Referenzbereichen. (So erfährt das Modell genau, was der Wert bedeutet, ohne dass es Einheiten oder Referenzschwellenwerte ableiten muss.) |
Roh-IDs, benutzerdefinierte Komprimierung oder nicht zugeordnete Codes Rückgabe von internen Roh-IDs, benutzerdefinierten Wörterbuchabkürzungen oder numerischen Codes ohne Labels. (Das Modell muss raten, worauf sich 105 bezieht, was zu halluzinierten Einheiten, fehlendem Kontext oder ungenauen Erklärungen führt.) |
MCP-Fehlerbehandlung
Es ist wichtig, Fehler angemessen zu behandeln.
- Bei behebbaren Fehlern (z. B. ungültige Nutzer-ID oder fehlender optionaler Parameter) geben Sie in der Toolantwort einen normalen Textstring mit beschreibenden Fehlerdetails zurück. So kann das Modell das Feedback prüfen, verstehen, was schiefgelaufen ist, und sich selbst korrigieren oder den Nutzer um Klarstellung bitten.
- Lösen Sie bei Terminalfehlern (z. B. Ratenbegrenzung, Authentifizierungs- oder Berechtigungsfehler oder Ausfälle von Backend-Servern) eine
McpErrormit dem entsprechenden Fehlercode aus, damit die Plattform den Fehler systematisch verarbeiten kann.
Beispiel für einen Fehlerantworttext (JSON)
{
"jsonrpc": "2.0",
"error": {
"code": -32302,
"message": "User permission denied for the requested operation.",
"data": null
},
"id": 1
}
Message enthält einen JSON-Dump des Felds ErrorData des MCP. Wenn die richtigen code und die für das Modell sichtbaren message zurückgegeben werden, kann die Connected Apps Platform die Fehlermeldung lesen und dem Nutzer eine hilfreiche Erklärung in natürlicher Sprache zurückgeben. Beispiel: „Tut mir leid, ich konnte den Veranstaltungsort mit dieser ID nicht finden. Könnten Sie den Namen bitte überprüfen?“
Das MCP ermöglicht es Clients, sich über die JSON-RPC 2.0-Spezifikation mit MCP-Servern zu verbinden. JSON-RPC hat bestimmte vordefinierte Fehler, die bei häufig auftretenden Fehlern wie ungültigen Anfragen, Parsing-Fehlern usw. gesendet werden. In diesem Leitfaden wird beschrieben, wie MCP-Server benutzerdefinierte Fehler zurücksenden können.
| Status Code |
Nachricht | Nutzung | Muss explizit zurückgegeben werden? |
|---|---|---|---|
| Nutzer-/Kundenfehler | |||
| -32300 | USER_RATE_LIMITED | Der Nutzer hat das maximale Nutzungslimit erreicht. | JA |
| -32301 | MISSING_REQUIRED_INFORMATION | Die Eingabeanfrage enthält nicht alle erforderlichen Informationen | JA |
| -32302 | USER_PERMISSION_DENIED | Der Nutzer hat die Berechtigung zur Verwendung des Tools verweigert. Beispielsweise kann es sein, dass Nutzer ein Arbeitskonto haben müssen, eine Altersbeschränkung gilt, ein bestimmter Standort erforderlich ist oder Nutzer kein Enterprise-Abo des Tools haben dürfen. | JA |
| Anwendungsfehler/Geschäftslogikfehler | |||
| -32400 | RUNTIME_ERROR | Bei der Ausführung des Servercodes ist ein Fehler aufgetreten | JA |
| -32401 | NULL_POINTER_EXCEPTION | Versuch, einen Nullzeiger oder ein Nullobjekt auszuführen | JA |
| -32402 | OUT_OF_MEMORY | Nicht genügend Speicher im Servercode, um ihn einem Objekt zuzuweisen | JA |
| Infrastrukturfehler | |||
| -32500 | DEADLINE_EXCEEDED | Die Anfrage dauert länger als zulässig. Kann viele Ursachen haben, z.B. überlasteter Server, Netzwerkprobleme usw. | JA |
| -32501 | RESOURCE_EXHAUSTED | Der Server hat keinen Arbeitsspeicher, Speicherplatz, Threads, CPU-Zeit usw. mehr. | JA |
| -32502 | SERVICE_UNAVAILABLE | Abhängiger Dienst (z.B. ein anderer Mikrodienst, eine Datenbank, ein Cache usw.) ist nicht verfügbar | JA |
| JSON-RPC-Fehler (diese Fehler sind Teil des MCP-Transports) | |||
| -32700 | PARSE_ERROR | Die Anfrage konnte nicht auf dem Server geparst werden. | NEIN |
| -32600 | INVALID_REQUEST | Fehlerhafte Clientanfrage | NEIN |
| -32601 | METHOD_NOT_FOUND | Ungültiger MCP-Toolname | NEIN |
| -32602 | INVALID_PARAMS | Ungültige Anfrageparameter, einschließlich fehlender Parameter oder nicht übereinstimmender Parametertypen | NEIN |
| -32603 | INTERNAL_ERROR | Standardantwort | NEIN |
Im Folgenden finden Sie ein Beispiel dafür, wie Sie mit dem offiziellen Python SDK (mcp) einen MCP-Fehler auf Ihrem Server auslösen können. Lösen Sie einen McpError mit einer ErrorData-Nutzlast aus, die vom SDK automatisch in das erforderliche JSON-RPC-Fehlerformat mit dem Fehlerstatus serialisiert wird.
from mcp import types
from mcp.shared.exceptions import McpError
@mcp.tool()
def foo_tool() -> list[types.TextContent]:
"""Always returns an error."""
raise McpError(
types.ErrorData(
code=-32302, # USER_PERMISSION_DENIED
message="Message to show to the model."
),
)
Toolkontext
Anwendbare Google-Produkte unterstützen eine Tool Context API, um Signale an MCP-Server zu übergeben. Diese API wird in gültigen Anwendungsfällen verwendet, die vertrauliche Informationen erfordern, z. B. Metadaten, die nicht Teil der Kerndefinition des Tools sind, wie im Fall einer Sprache für Tools, die lokalisiert werden müssen. Die Tool Context API ist nur über die Connected Console verfügbar.
Wenn Sie ein Signal wie current_user_location_fine in der Connected Console für Ihre App registrieren, ergänzen die entsprechenden Google-Produkte MCP-Anfragen (tools/call) um einen zusätzlichen _meta-Eintrag mit den angeforderten Daten. Die folgenden Signale werden unterstützt:
current_user_location_fine(nur Gemini, für zulässige Branchen)user_localecurrent_user_location_coarse
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "find-restaurant",
"arguments": {"query": "restaurants near me"},
"_meta": {
"current_user_location_fine": {
"latitude_degrees": 37.7749,
"longitude_degrees": -122.4194,
"accuracy_meters": 112.4221
},
"user_locale": {
"language_code": "en",
"region_code": "US"
}
}
}
}
So entpacken Sie diese Daten:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("remote_mcp")
@mcp.tool()
async def find_restaurants(query: str, ctx: Context) -> str:
# Access context directly from _meta
request_context = ctx.request_context
meta_dict = ctx.request_context.meta.model_dump() if ctx.request_context.meta else {}
location_context = meta_dict.get("current_user_location_fine", {})
lat = location_context.get("latitude_degrees")
lng = location_context.get("longitude_degrees")
if lat and lng:
return f"Finding '{query}' near ({lat}, {lng})"
return f"Finding '{query}' (no location provided)"
Rendering der UX
MCP-Apps
Anwendbare Google-Produkte unterstützen MCP-Anwendungsintegrationen für ausgewählte User Journeys, um benutzerdefinierte Benutzeroberflächen zu erstellen. Folgen Sie der Spezifikation, um allgemeine Integrationsanleitungen zu erhalten.
Für die Einbindung von MCP-Anwendungen in entsprechende Google-Produkte gelten die folgenden Einschränkungen.
Ressourcenaufnahme bei der Registrierung
Anwendbare Google-Produkte rufen UI-Ressourcen während der Toolaufnahme ab, ähnlich wie die Toolliste und die Toolbeschreibungen. Das bedeutet, dass Ressourcenaktualisierungen, z. B. Änderungen in JavaScript, nicht automatisch übernommen werden und die Tools neu aufgenommen werden müssen.
Eine einzelne UI-Ressource darf nicht größer als 15 MB sein und die kumulative Größe der UI-Ressourcen auf Ihrem Server darf 100 MB nicht überschreiten.
UI-Ressourcen müssen einen der unterstützten MIME-Typen verwenden: text/html, text/javascript, text/css oder text/html;profile=mcp-app. Nicht standardmäßige oder plattformspezifische MIME-Typen schlagen bei der Validierung fehl, wenn sie in die Vorschau übertragen werden.
Richtlinien für CSPs
Die entsprechenden Google-Produkte folgen der offiziellen MCP-Apps-Spezifikation, die CSP [1], [2] umfasst, und blockieren alle Anfragen, die gegen CSP-Anweisungen verstoßen.
Bei anwendbaren Google-Produkten müssen zusätzlich blob: und data: zur CSP hinzugefügt werden, falls verwendet. Diese werden nicht standardmäßig hinzugefügt. Es liegt im Ermessen der Entwickler, sie der CSP hinzuzufügen oder nicht.
„script-src“ ist eine Ausnahme
Die einzigen zulässigen Anweisungen sind: unsafe-inline (standardmäßig hinzugefügt), wasm-unsafe-eval und data: (falls in resource_domains enthalten). Wenn der iFrame externe Skripts lädt, kann dies entweder durch das Bündeln von JS in HTML oder durch die Verwendung eines SRI-Hashs (Subresource Integrity) gelöst werden.
Option 1: JS inline in HTML einfügen / bündeln (am einfachsten)
JS-Code bündeln:
Fügen Sie den Inhalt von
component-init.jsdirekt in<script>-Tags in der HTML-Nutzlast ein, die für die UI-Ressource zurückgegeben wird:<script> // Paste component-init.js content directly here </script>
Remote-
<script src>-Tags entfernen- Löschen Sie
<script src="https://api.mycompany.com/...">-Verweise aus dem HTML-Dokument.
- Löschen Sie
Tool zum erneuten Importieren/Aktualisieren
Option 2: SRI-Hash (Subresource Integrity) verwenden:
Verwenden Sie diese Option, wenn das Script extern unter
https://api.company.com/...gehostet bleiben muss.- SHA-256-Hash des Skripts berechnen
- Base64-SHA-256-Hash von
component-init.jsgenerieren
- Base64-SHA-256-Hash von
- Fügen Sie den Hash zu
resourceDomainshinzu (muss das Präfixsha256-enthalten, um mit dem Attributintegrityübereinzustimmen). - HTML-Tag
<script>aktualisieren- Fügen Sie dem Script-Tag im HTML-Widget die Attribute
integrityundcrossoriginhinzu.
- Fügen Sie dem Script-Tag im HTML-Widget die Attribute
- CORS-Header auf CDN/Server prüfen
- Achten Sie darauf, dass
api.company.comcomponent-init.jsmitAccess-Control-Allow-Origin: *bereitstellt (oderscf.usercontent.googzulässt), damit der Browser den Antworttext für die SRI-Überprüfung lesen kann.
- Achten Sie darauf, dass
- Tool zum erneuten Importieren/Aktualisieren
- SHA-256-Hash des Skripts berechnen
Sicherheitsrichtlinien für die Beschreibung von MCP-Tools
Da die Beschreibung der einzige Kontext ist, den das Modell hat, um die Funktionen des Tools zu verstehen, muss sie genau und sicher formuliert sein, um unbeabsichtigtes Verhalten zu verhindern. Beachten Sie beim Verfassen der Toolbeschreibungen die folgenden Richtlinien.
- Beschreiben Sie die Funktionalität, aber geben Sie kein Verhalten vor. Die Beschreibung muss genau beschreiben, was das Tool tut, und nicht dem Modell befehlen, nachfolgende Aktionen auszuführen.
- Umfang und Anforderungen definieren Geben Sie das Hauptziel des Tools, die spezifischen Umstände (Wann) für seine Verwendung und alle erforderlichen Eingaben (Parameter/Argumente) klar an.
- Wahrheitsgehalt sicherstellen: Die Beschreibung muss eine wahrheitsgemäße Darstellung des zugrunde liegenden Codes des Tools sein. Behaupten Sie nicht, dass ein Tool schreibgeschützt ist, wenn es einen Schreib- oder Löschvorgang ausführt.
Sicherheitsrisiken und wie sie vermieden werden können
| Risikobereich | Empfohlen | Vermeiden Sie diese Vorgehensweise unbedingt. |
|---|---|---|
Prompt Injection |
Verwenden Sie eine sachliche, deklarative Sprache, um den Zweck und die Funktionen des Tools klar zu beschreiben. |
Verwenden Sie imperative Befehle, um das Modellverhalten zu überschreiben oder Systemabläufe zu ändern (z. B. „Du MUSST sagen…“, „Nach dem Laufen MÜSSEN Sie…“). Imperative Begriffe wie MUSS oder KRITISCH sind nur zulässig, wenn strukturierte Parametereinschränkungen oder Nutzungsregeln definiert werden. |
Verwenden Sie für den Beschreibungstext des Tools eine standardmäßige, einfache Formatierung. |
Aufmerksamkeitserregende Formatierungen verwenden, z. B. übermäßige Großschreibung und Tags wie |
|
Konzentrieren Sie sich ausschließlich auf die Funktion und das erwartete Verhalten des Tools. |
Anweisungen für Rollenspiele oder Befehle zum Ignorieren vorheriger Anweisungen enthalten. |
|
Tool-Shadowing und -Hijacking |
Die Beschreibung muss spezifisch sein und sich auf die tatsächlichen, zugehörigen Funktionen des Tools beschränken. |
Die Toolbeschreibung ist zu allgemein oder vage oder es wird behauptet, dass ein einzelnes Tool viele nicht zusammenhängende Funktionen ausführt. |
Wählen Sie einen eindeutigen, aussagekräftigen und sinnvollen Toolnamen aus. |
Verwenden Sie einen Toolnamen, der eine geringfügige Abwandlung eines vertrauenswürdigen Tools ist, oder einen allgemeinen Namen (z. B. |
|
Erwähnen Sie in der Beschreibung keine anderen Apps oder Tools von externen Plattformen namentlich. |
Explizit auf andere Tools verweisen oder neue Regeln dafür aufstellen, wann oder wie andere Tools eingesetzt werden sollen. |
|
Dem Planer des Modells erlauben, das am besten geeignete Tool basierend auf dem Nutzerkontext auszuwählen. |
Wettbewerbswidrige Formulierungen oder SEO-Prompts, die das Modell anweisen, Ihr Tool ähnlichen Tools vorzuziehen. |
|
Trigger-Manipulation |
Die Beschreibung bezieht sich nicht auf allgemeine Phrasen aus dem Unterhaltungsverlauf und reagiert auch nicht darauf. |
Bedingte Logik erstellen, die eine schädliche Aktion basierend auf gängigen, harmlosen Nutzerformulierungen auslöst (z. B. „Danke“, „Zusammenfassend“). |
Missbrauch von Parametern |
Definieren Sie nur Parameter, die für die Funktion des Tools erforderlich sind, und verwenden Sie Namen, die für die Eingabedaten spezifisch sind (z. B. |
Definieren Sie Funktionsparameter mit Namen, die den internen Zustand des Agenten widerspiegeln (z. B. |
Daten-Exfiltration |
Privacy by Design – nicht transparente IDs und vom Host verwaltete Authentifizierung. |
personenidentifizierbare Informationen, geschützte Gesundheitsdaten oder andere personenbezogene und/oder vertrauliche Informationen vom Nutzer, personenbezogene oder geschäftliche Daten oder Entitäten in einer Weise anfordern, die gegen die Nutzungsbedingungen der entsprechenden Google-Produkte verstößt. |
Best Practices für Funktionen und Benennung
Neben der Absicherung der Beschreibung Ihres Tools müssen Sie dafür sorgen, dass das Modell es zuverlässig und ohne Verwechslungen auswählen und ausführen kann. Halten Sie sich an die folgenden Best Practices für Funktionen und Benennung:
- Parametergenauigkeit: Achten Sie darauf, dass alle Parameternamen und ‑typen in der Beschreibung genau mit der tatsächlichen Implementierung des Tools übereinstimmen.
- Sinnvolle Benennung: Der Name des Tools sollte ein starker, klarer Hinweis auf seine Funktion sein. Vermeiden Sie zu allgemeine Namen wie „execute“. Der Name muss auch mit dem breiteren Tool-Ökosystem übereinstimmen.
Anhang: Zulassungsliste für Infrastruktur und Netzwerk
Wenn Ihre Hosting-Infrastruktur, Ihr API-Gateway oder Ihre Firewall eingehende Verbindungen nach Quell-IP-Adresse einschränkt, setzen Sie die folgenden ausgehenden CIDR-Blöcke von Google auf die Zulassungsliste:
108.177.64.0/20142.250.88.0/22172.217.80.0/20192.178.20.0/22192.179.0.0/2074.125.232.0/24136.121.40.0/21
Achten Sie darauf, dass Ihre Umgebung Traffic von diesen IP-Bereichen über den HTTPS-Port 443 zulässt, damit die entsprechenden Google-Produkte Ihren Remote-MCP-Server für die MCP-Initialisierung, die Toolerkennung und die Anfrageausführung erreichen können.