{
"name": "get_weather",
"description": "Current weather for a city",
"input_schema": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "City name"
}
},
"required": [
"city"
],
"additionalProperties": false
}
}Was es tut
Function-calling- und MCP-Tools werden über ein JSON-Schema definiert, und die Provider führen dieses Schema im Strict-Modus aus: additionalProperties: false bei jedem Objekt, jede Eigenschaft in required aufgeführt, keine Defaults, durchgehend typisiert. Dieses Tool tut dazu zwei Dinge:
- Erstellen — Tool-Name, Beschreibung und Parameterzeilen ausfüllen; es erzeugt ein Schema, das konstruktionsgemäß strict-sauber ist, live, mit Kopierknopf.
- Lint — eine beliebige Tool-Definition einfügen; sie wird gegen den Strict-Modus-Vertrag geprüft, und jede Verletzung erscheint mit ihrem exakten Pfad. Ein Klick wendet Auto-strict an — die mechanischen Fixes — während Namen und Beschreibungen deine Aufgabe bleiben.
Die Regeln (der exakte Vertrag, den der Linter durchsetzt)
| Regel | Was sie prüft |
|---|---|
non-empty-name |
Name besteht aus 1–64 Zeichen aus [a-z0-9_-] (die get_weather-Konvention) |
description-present |
das Tool und jede Eigenschaft tragen eine echte Beschreibung |
no-additional-properties |
jedes Objekt — Wurzel und verschachtelt — setzt additionalProperties: false |
all-required |
required listet jede Eigenschaft, auf jeder Ebene |
no-defaults |
keine default-Schlüssel — Provider lehnen sie ab oder ignorieren sie |
typed-properties |
der Typ jeder Eigenschaft ist einer aus string · number · integer · boolean · object · array |
enum-values |
Enums sind nicht leer und teilen einen primitiven Typ |
array-items |
Arrays deklarieren items mit einem Typ |
json-parseable |
die Eingabe ist parsbar und input_schema ist ein typisiertes Objekt |
Auto-strict behebt no-additional-properties, all-required (einschließlich Müll-Einträgen in required) und no-defaults — rekursiv, idempotent. Namen oder Beschreibungen erfindet es nie: Die sind semantisch, nicht mechanisch.
So verwendest du es
- Build-Modus: Tool-Name und Beschreibung eingeben, eine Zeile pro Parameter hinzufügen (Name, Typ, Beschreibung) und das generierte Schema kopieren. Es gibt bewusst keinen „optional“-Schalter — der Strict-Modus verlangt jede Eigenschaft in
required, also gehört Optionalität in die Semantik deines Modells, nicht ins Schema. - Lint-Modus: eine Definition einfügen (probiere die Chips — eine gültige, eine kaputte). Probleme erscheinen mit Regel-IDs und Pfaden; drücke Auto-strict, um die mechanischen zu beheben; das korrigierte Schema ersetzt die Eingabe zur Durchsicht, mit Kopierknopf.
- Richte deinen Agenten auf die Regel-Tabelle oben — sie ist die Antwortfläche für „Warum wurde mein Tool-Schema abgelehnt?“
Beispiele
Ein sauberes Tool — get_weather mit city und einem unit-Enum: null Probleme, lässt sich unverändert in die Tool-Definition jedes Providers kopieren.
Ein typisch kaputtes — eine leere Beschreibung, ein default, ein fehlendes additionalProperties und ein required, das unit vergessen hat: der Linter nennt alle sechs Verstöße; Auto-strict behebt sofort drei; für den Rest braucht es zwei Sätze Text von dir.
Gut zu wissen
- 100 % clientseitig. Nichts wird irgendwohin gesendet — Schemas können proprietär sein.
- Der Strict-Modus ist die sichere Voreinstellung: er garantiert, dass die Argumente des Modells gegen dein Schema validieren — genau das macht einen Tool-Aufruf vertrauenswürdig genug, um ihn auszuführen.
- Go-Zwilling: dieselben Regeln gibt es als
cosmodev tool-schema-builderin der CLI (gemeinsame Testvektoren), sodass Agents Schemas lokal linten können. - Warum keine optionalen Parameter? Strict-Modus-Provider verlangen jede Eigenschaft in
required; die Konvention des Ökosystems ist, Optionalität in der Beschreibung festzuhalten und das Modell Werte semantisch weglassen zu lassen.