# Co·Legal Public Assistant — A2A v1.0 agent

> **Canonical HTML:** https://co-legal.be/agent.html
> **Host:** https://agent.co-legal.be
> **AgentCard:** https://agent.co-legal.be/.well-known/agent-card.json
> **Last updated:** 2026-05-19

Publieke A2A v1.0 agent voor algemene vragen over Belgisch privaat-clienteel recht en fiscaliteit.

## Discovery

| Pad | Wat |
|---|---|
| `GET /.well-known/agent-card.json` | A2A v1.0 AgentCard — ES256 detached JWS, JCS-canonical body, JWS protected header met `jku` → JWKS. |
| `GET /.well-known/agent.json` | Legacy alias (A2A v0.x crawlers). |
| `GET /.well-known/jwks.json` | Publieke ES256 sleutel voor signature-verify. |
| `GET /.well-known/mcp.json` | MCP discovery pointer (geen MCP-transport vandaag — verwijst door naar A2A-card). |
| `GET /extendedAgentCard` | Authenticated extended card (API-key vereist; placeholder vandaag, voor paid skills morgen). |
| `GET /icon.svg` | Agent-glyph zoals gerefereerd in `iconUrl` op de AgentCard. |
| `GET /healthz` | Liveness probe — registry-vriendelijk, raakt geen LLM. |

## Publieke skills (vier, gratis)

| Skill ID | Wat | Schema-velden |
|---|---|---|
| `be.legal.lookup` | Belgische wetsreferentie → canonieke Justel-URL | `code` (BW/WVV/WIB92/VCF/WBTW/WBE/Sw/Ger.W), `article` |
| `be.legal.search` | Trefwoord → Justel-zoek-URL + statute-hints | `keyword`, optioneel `limit` |
| `be.kbo.lookup` | KBO/BCE-onderneming opzoeken | `enterprise_number` (10 digits) |
| `be.vies.validate` | EU VIES BTW-validatie | `vat` (incl. landcode) |

Schemas zijn ook op de AgentCard via de `co-legal.be/a2a/extensions/tool-schema/v1` extensie — peer-agents kunnen calls plannen zonder trial-and-error.

## Invocation

JSON-RPC endpoint: `POST https://agent.co-legal.be/a2a/jsonrpc`

Methodes:

- `message/send` — single-turn OF multi-turn (via `taskId` in volgende calls)
- `message/stream` — Server-Sent Events stream
- `tasks/get` — task ophalen incl. history
- `tasks/list` — recente tasks van de caller (gescoped op API-key hash)
- `tasks/cancel` — task in terminal state zetten

### Path A — LLM-routing (natuurlijke taal)

```json
{
  "jsonrpc": "2.0", "id": 1, "method": "message/send",
  "params": {"message": {"parts": [
    {"kind": "text", "text": "Geef de Justel-link voor art. 4.71 BW."}
  ]}}
}
```

De LLM kiest welke skill te callen, voert hem uit, en synthetiseert een antwoord. Multi-turn werkt via `params.taskId` op vervolg-calls — server bewaart de context.

### Path B — Direct skill-dispatch (deterministisch, geen LLM)

```json
{
  "jsonrpc": "2.0", "id": 1, "method": "message/send",
  "params": {"message": {"parts": [
    {"kind": "data", "data": {
      "tool": "be.legal.lookup",
      "args": {"code": "BW", "article": "4.71"}
    }}
  ]}}
}
```

Synchroon, geen LLM-cost, snel (~50ms p50). Geschikt voor peer-agents die de skill kennen en alleen het resultaat willen.

## Quota

| Tier | Rate | Concurrency |
|---|---|---|
| Anoniem | 60 vragen / uur per IP | 1 |
| API-key (free) | 1000 / uur | 4 |

Headers op elke response: `A2A-Version: 1.0`, `RateLimit-Limit/Remaining/Reset` (IETF draft), legacy `X-RateLimit-*`.

## Status mapping

| State | Wanneer |
|---|---|
| `TASK_STATE_SUBMITTED` | net na `message/send` zonder LLM-ronde |
| `TASK_STATE_WORKING` | tijdens streaming |
| `TASK_STATE_COMPLETED` | succesvolle afronding |
| `TASK_STATE_CANCELLED` | via `tasks/cancel` |
| `TASK_STATE_FAILED` | interne fout of context-expiry |

## Wat de agent NIET doet

- Geen specifiek juridisch of fiscaal advies — vervangt geen advocaat, notaris of belastingconsulent.
- Geen toegang tot dossier-data van klanten van Co·Legal.
- Geen schrijfacties of side-effects — pure informatieve Q&A.
- Geen jurisdicties buiten België (Vlaams Gewest primair).
- Geen Jura / monKEY / Stradalex content (license-bound; alleen voor het partner-platform).

## Verder

- [Integration guide](/developers.md)
- [AgentCard live](https://agent.co-legal.be/.well-known/agent-card.json)
