This is the specification as proposed. Codossier starts sending and reading the block with its quick skills (triage, consult, document review), not yet available. The shape is published now so agents can be built to it. Other legal vendors are invited to adopt it: it is deliberately small, and the identifier is https://codossier.com/a2a/ext/legal-context/v1.
Why
When an agent hands a legal question to another agent, the frame gets lost: the jurisdiction, whether the asker is a party or their lawyer, whether the answer is privileged. The receiving agent guesses, and the answer comes back without saying what it assumed. This block makes the frame explicit in both directions: what the caller states, and what the answer assumed and how it may be handled.
Declaring it
- A2A 1.0: in the agent card's
capabilities.extensionswithuriset to the identifier andrequired: false. A caller activates it by sending the identifier in theA2A-Extensionsheader, and puts the block in the message'smetadataunder the identifier. - MCP: in
_metaundercom.codossier/legal-context, on the tool call in and on the result out. - REST: the
contextobject of a quick ask (codossier.quick-ask/1) in, and thelegal_contextobject of the answer (codossier.insight/1) out.
Inbound: what a caller may state
| Field | Where | Required | Meaning |
|---|---|---|---|
jurisdiction | block | no | Where the matter sits: US-CA for a state, US for federal or general, or a country code. |
forum | block | no | The forum, if known: state trial court, federal district court, agency… |
audience | block | no | professional or individual: the register of the answer. |
role | block | no | The asker's role: party, counsel, advisor, family, other. |
matter | block | no | A matter of the caller's own to read with the ask. It is read only if the caller's credentials may read it. |
on_behalf_of | block | no | The person an agent acts for, when it acts for someone. |
privilege | block | no | attorney_client, work_product, none or unknown, as the caller understands it. |
A stated value always beats an inferred one, and comes back marked basis: "stated".
Outbound: what every answer carries
{
"jurisdiction": { "value": "US-CA", "basis": "inferred", "forum": "state trial court" },
"audience": "individual",
"role": "party",
"privilege": "none",
"handling": "Not privileged. Do not assume confidentiality protections; share only with the person and their counsel.",
"retention": "kept 12 months under the account; delete it from the account's history",
"source": "Codossier practitioner knowledge base; not case-law research",
"notice": "Legal information, not legal advice. No lawyer-client relationship is formed."
}| Field | Rule |
|---|---|
jurisdiction.basis | stated (the caller said so), inferred (read from the text or the document) or default (nothing to go on: US). |
privilege | work_product only when a professional works a matter they own; none for individuals, because Codossier is not their lawyer; unknown when the caller did not say. |
handling | Fixed text per privilege label, so a receiving agent can carry it verbatim. |
notice | Present for individuals: legal information, not legal advice. |
Isolation
- Naming a matter never widens access: the caller's credentials decide what may be read, as on every other door.
- No ask reads any matter unless one is named.
- Values are open lists: a receiver must accept a value it does not know and treat it as unknown.
Versioning
The identifier carries the major version. Additions that a receiver may ignore keep v1; anything that would change the meaning of a field is v2 at a new identifier. The schema is codossier.legal-context/1.0 in the contract registry.