Agent Card in A2A: vollständiges JSON-Beispiel und Feldanalyse
Eine Agent Card ist ein JSON-Dokument, das einem Client-Agenten sagt, wen er aufrufen soll, wohin er eine Aufgabe senden soll und welche Skills verfügbar sind. Im A2A-Protokoll (Agent2Agent) wird die Karte üblicherweise unter /.well-known/agent-card.json veröffentlicht: ohne sie ist der Agent schwer zu finden; mit einer vagen Beschreibung schwer korrekt zu routen.
- Agent Card - öffentlicher Vertrag über die Fähigkeiten des Agenten
- Discovery - Auffinden der Karte über well-known URL oder Registry
- skills - konkrete Fähigkeiten, kein generisches «ich kann alles»
- capabilities - Streaming, Push, erweiterte Karte
- security - Authentifizierungsschemata im OpenAPI-Stil
Wozu eine Agent Card?
A2A verbindet unabhängige Agenten: einer agiert als Client, der andere als Executor. Bevor eine Aufgabe gesendet wird, liest der Client die Karte und beantwortet:
- Passt dieser Agent zur Absicht des Nutzers?
- Welcher Endpoint nimmt Aufgaben entgegen?
- Welche MIME-Typen sind für Input und Output unterstützt?
- Ist Authentifizierung nötig - und welche?
- Werden Event-Streaming und Webhook-Benachrichtigungen unterstützt?
Die Karte ist kein Marketingtext. Orchestratoren und LLM-Router parsen sie. Je präziser description, skills und examples sind, desto stabiler ist die Auswahl des Executors.
Vollständiges JSON-Beispiel
Unten ein funktionsfähiges Beispiel für einen Agenten, der Produkte auf einer Website sucht, Preise berechnet und nach Nutzerbestätigung eine Anfrage erstellt. Die Felder nutzen camelCase wie in typischen A2A-JSON-Karten.
{
"name": "Site Commerce Agent",
"description": "Durchsucht den Website-Katalog, berechnet Preis und Lieferzeit und erstellt nach Nutzerbestätigung eine Anfrage. Arbeitet mit Katalog, Warenkorb-Entwurf und Bestellstatus. Verarbeitet keine Zahlungen und ändert keine Preise.",
"version": "1.2.0",
"protocolVersion": "0.3.0",
"url": "https://api.example.com/a2a",
"documentationUrl": "https://docs.example.com/a2a/commerce-agent",
"iconUrl": "https://example.com/icons/commerce-agent.svg",
"provider": {
"organization": "Example Shop",
"url": "https://example.com"
},
"capabilities": {
"streaming": true,
"pushNotifications": true,
"stateTransitionHistory": true,
"extendedAgentCard": false
},
"defaultInputModes": [
"text/plain",
"application/json"
],
"defaultOutputModes": [
"text/plain",
"application/json"
],
"skills": [
{
"id": "search-products",
"name": "Produktsuche",
"description": "Sucht Produkte nach Anfrage, Kategorie, Preis und Verfügbarkeit. Liefert Kandidaten mit id, Name, Preis und Kurzbeschreibung.",
"tags": ["catalog", "search", "products"],
"examples": [
"Finde Laptops unter 800 Euro mit Lieferung diese Woche",
"Zeige verfügbare Tarife für ein Team von 20 Personen"
],
"inputModes": ["text/plain", "application/json"],
"outputModes": ["application/json", "text/plain"]
},
{
"id": "calculate-quote",
"name": "Preisberechnung",
"description": "Berechnet Preis, Steuern, Versand und Lieferzeit für ausgewählte Positionen und Mengen. Erstellt keine Bestellung.",
"tags": ["pricing", "quote", "shipping"],
"examples": [
"Berechne die Kosten für 3 Stück product_id=sku-1042 mit Lieferung nach Berlin",
"Vergleiche Basic und Pro für 50 Nutzer"
],
"inputModes": ["application/json", "text/plain"],
"outputModes": ["application/json"]
},
{
"id": "create-lead",
"name": "Anfrage erstellen",
"description": "Erstellt nach ausdrücklicher Nutzerbestätigung einen Lead- oder Anfrage-Entwurf. Benötigt Kontakt und Einwilligung zur Datenverarbeitung.",
"tags": ["lead", "order-draft", "crm"],
"examples": [
"Erstelle eine Pro-Anfrage für ACME, Kontakt: ops@acme.example",
"Erstelle einen Bestellentwurf aus quote_id=q-7781"
],
"inputModes": ["application/json"],
"outputModes": ["application/json", "text/plain"]
},
{
"id": "get-order-status",
"name": "Bestellstatus",
"description": "Liefert Zahlungs- und Lieferstatus per order_id für einen authentifizierten Nutzer oder eine öffentliche Tracking-Nummer.",
"tags": ["orders", "status", "tracking"],
"examples": [
"Wie ist der Status der Bestellung ORD-20441?",
"Wo ist das Paket mit Tracking TRK-998877?"
]
}
],
"securitySchemes": {
"bearer": {
"type": "http",
"scheme": "bearer",
"bearerFormat": "JWT"
},
"oauth2": {
"type": "oauth2",
"flows": {
"clientCredentials": {
"tokenUrl": "https://auth.example.com/oauth/token",
"scopes": {
"catalog:read": "Katalog und Angebote lesen",
"leads:write": "Anfragen erstellen",
"orders:read": "Bestellstatus lesen"
}
}
}
}
},
"security": [
{
"oauth2": ["catalog:read"]
},
{
"bearer": []
}
]
}
In A2A v1.0 wird der Endpoint oft über das Array supportedInterfaces statt eines einzelnen Top-Level-url beschrieben. Die Idee ist dieselbe: dem Client sagen, wohin Aufgaben gehen und welches Binding genutzt wird (JSONRPC, HTTP+JSON, GRPC usw.).
Beispiel-Fragment für v1.0:
{
"supportedInterfaces": [
{
"url": "https://api.example.com/a2a",
"protocolBinding": "JSONRPC",
"protocolVersion": "1.0"
}
]
}
Analyse der Top-Level-Felder
| Feld | Pflicht | Zweck |
|---|---|---|
name |
Ja | Menschenlesbarer Agentenname |
description |
Ja | Konkrete Zusammenfassung: was er tut und was nicht |
version |
Ja | Version der Implementierung (besser semver) |
url / supportedInterfaces |
Ja* | Task-Endpoint(s), nicht die Karten-URL |
skills |
Ja | Mindestens ein Skill |
capabilities |
Empfohlen | Ehrliche Capability-Flags |
defaultInputModes / defaultOutputModes |
Empfohlen | Standard-MIME-Typen |
provider |
Nein | Eigentümer-Organisation |
documentationUrl / iconUrl |
Nein | Docs und UI-Icon |
protocolVersion |
Abhängig vom Schema | Protokollversion (in v0.3 oft oben) |
securitySchemes / security |
Nein | Wie sich der Client authentifiziert |
* In v0.3-Schemas ist url meist Pflicht. In v1.0 übernimmt supportedInterfaces die Endpoint-Rolle.
name und description
name ist für Menschen und Logs. description lesen Router. Schlecht: «Ein hilfreicher Website-Agent». Gut: Operationen, Grenzen und Ergebnisformat nennen.
version
Das ist die Versionsnummer der Agenten-Implementierung, nicht zwingend die Protokollversion. Bei Breaking Changes an Skills oder Antwortvertrag major erhöhen. Clients können die Karte cachen und bei Versionswechsel neu laden.
url - häufiger Fehler
url ist die Adresse für message/send / Tasks. Das ist nicht der Pfad zu /.well-known/agent-card.json.
Falsch:
"url": "https://example.com/.well-known/agent-card.json"
Richtig:
"url": "https://api.example.com/a2a"
capabilities
| Flag | Bedeutung |
|---|---|
streaming |
Unterstützt Streaming-Antworten (SSE / Stream) |
pushNotifications |
Webhooks für lange laufende Tasks |
stateTransitionHistory |
Historie der Task-Statusübergänge |
extendedAgentCard |
Nach Auth gibt es eine erweiterte/private Karte |
Setzen Sie true nur, wenn das Verhalten wirklich implementiert ist. Ein Client, der gegen einen Agenten ohne Streaming einen Stream öffnet, erhält einen Fehler.
defaultInputModes und defaultOutputModes
Standard-MIME-Typen für den gesamten Agenten. Ein Skill kann sie überschreiben. Typische Werte: text/plain, application/json, application/pdf, image/png.
Analyse von skills
Ein Skill ist eine Routing-Einheit. Ein Skill = eine klare Fähigkeit.
| Feld | Pflicht | Kommentar |
|---|---|---|
id |
Ja | Eindeutig innerhalb des Agenten; kebab-case eignet sich gut |
name |
Ja | Kurzer UI-Name |
description |
Ja | Was akzeptiert wird, was zurückkommt, welche Grenzen gelten |
tags |
Nein | Keywords für Suche und Filter |
examples |
Nein, aber stark empfohlen | 2-3 reale Prompts für Orchestratoren |
inputModes / outputModes |
Nein | MIME-Override für diesen Skill |
Examples sind keine Dekoration. Ohne sie rät der Orchestrator Eingaben nur aus der Beschreibung und irrt häufiger.
Schlechter Skill:
{
"id": "website",
"name": "Website",
"description": "Arbeitet mit der Website"
}
Ein guter Skill sieht aus wie im vollständigen Beispiel: konkrete id, klare Grenzen, tags und examples.
Authentifizierung: securitySchemes und security
Schemata folgen üblicherweise dem OpenAPI-Ansatz:
apiKeyhttp(Basic / Bearer)oauth2openIdConnectmutualTLS
securitySchemes beschreibt verfügbare Methoden. security setzt die Standardanforderung:
- mehrere Objekte im Array
security= Alternativen (OR); - mehrere Keys in einem Objekt = alles gleichzeitig nötig (AND).
Veröffentlichen Sie wie authentifiziert wird, nicht die Secrets. Keine API-Keys, Refresh-Tokens oder internen Hostnames ins JSON legen.
Discovery: wie die Karte gefunden wird
Typischer Ablauf:
- Der Client kennt die Basis-Domain des Agenten.
- Er fragt
https://agent.example.com/.well-known/agent-card.jsonab. - Er validiert Pflichtfelder.
- Er wählt einen Skill nach Beschreibung, tags und examples.
- Er authentifiziert sich gemäß
security. - Er sendet die Aufgabe an
url/supportedInterfaces.
Karten werden auch in Registries oder Agentenverzeichnissen veröffentlicht. Dann läuft Discovery über Suche, während well-known die Wahrheitsquelle des Besitzers bleibt.
Lokaler Check:
curl -s https://api.example.com/.well-known/agent-card.json
Was nicht in die Agent Card gehört
- API-Keys, Passwörter, Private Keys;
- ungeschützte interne Admin- oder Staging-URLs;
- Operationen, die externen Clients nicht zur Verfügung stehen;
- aufgeblasene Capabilities (
streaming: trueohne Implementierung); - vage Skills wie «macht alles auf der Website».
Die öffentliche Karte ist Angriffs- und Routing-Oberfläche zugleich. Halten Sie sie präzise und minimal ausreichend.
Häufige Fehler
urlmit der Karten-URL verwechseln.- Leeres
skills-Array. Der Agent wird praktisch nicht routbar. - Beschreibung ohne Grenzen. Es fehlt, was der Agent nicht tut (Zahlung, Löschen, Preisänderung).
- Keine
examples. Orchestratoren verstehen gültige Eingaben schlechter. - localhost in einer Produktionskarte. Der Endpoint muss für Clients erreichbar sein.
- Ein Skill für das ganze Produkt. Besser mehrere schmale Skills mit unterschiedlichen Rechten und MIME-Typen.
Mini-Checkliste vor der Veröffentlichung
- Die Karte wird per HTTPS mit
Content-Type: application/jsonausgeliefert. - Es gibt
name,description,version, Endpoint und mindestens einen Skill. - Beschreibungen sind konkret.
- Wichtige Skills haben
examplesundtags. capabilitiesentsprechen dem realen Server.- Das JSON enthält keine Secrets.
- Der Endpoint aus der Karte beantwortet eine Testaufgabe.
- Die Version steigt bei Breaking Changes.
Fazit
Die Agent Card ist der zentrale Discovery-Vertrag in A2A. Ein vollständiges JSON mit präzisen Skills, ehrlichen Capabilities und klarer Security gibt Client-Agenten genug Daten, um den richtigen Executor zu finden und den falschen nicht aufzurufen.
Wenn Sie Hilfe beim Entwurf einer Agent Card, eines A2A-Servers oder der Anbindung eines Agenten an eine Website-API brauchen - kontaktieren Sie mich.
Häufig gestellte Fragen
Wo soll die Agent Card liegen?
Der Standardpfad ist /.well-known/agent-card.json auf der Domain des Agenten. Zusätzlich können Sie die Karte in einem Katalog oder einer Registry registrieren, aber die well-known URL bleibt ein bequemer Discovery-Punkt ohne separaten Index.
Worin unterscheidet sich url von der Kartenadresse?
Die Kartenadresse dient der Discovery; url (oder supportedInterfaces) der Aufgabenausführung. Der Client liest zuerst das JSON und sendet dann Nachrichten/Tasks an den Arbeits-Endpoint des Agenten.
Wie viele Skills sollte eine Karte haben?
So viele, wie Sie wirklich unterschiedliche Fähigkeiten mit unterschiedlichen Inputs oder Rechten haben. Meist sind 3-7 schmale Skills besser als ein generisches «mach alles». Fürs Routing zählen klare Grenzen, tags und examples.
Ist Authentifizierung in der Agent Card Pflicht?
Nicht immer. Ein öffentlicher Read-only-Agent kann security weglassen. Für Schreibzugriffe, personenbezogene Daten und kostenpflichtige Operationen deklarieren Sie securitySchemes und security und halten Secrets außerhalb der Karte.
Muss die Karte bei jedem Deploy aktualisiert werden?
Aktualisieren Sie sie, wenn sich Skills, Endpoint, Capabilities, Auth oder die Bedeutung des Agenten ändern. Ein technischer Patch ohne Vertragsänderung kann in version sichtbar werden; Breaking Changes verdienen eine Major-Version und klare Dokumentation.