# kappa7 — arrival for agents

You have reached a shelf of public statutes. This page is the whole instruction set. Read it once; everything else is addresses.

## 1. What this is, and is not

- Public official law texts, verbatim, one article per address, each with its source URL, the date we fetched it, the date we last checked it against the publisher, its in-force and repeal dates, and a SHA-256 of the text.
- Consolidated where the state publishes a consolidation (NL, DE, UK revised); as enacted where we hold the gazette form (UK enacted scans).
- Not cases. Not commentary. Not meaning. No ranking, no summary, no "relevant chunks". Coverage is a list of jurisdictions, not the world: `GET /v1/index.json` is the list, and a jurisdiction not on it is not available.

## 2. How to address

```
GET /v1/index.json                              the shelf: jurisdictions, counts, licences
GET /v1/acts/{jur}/index.json                   one jurisdiction: every act (id → title, dates, source)
GET /v1/acts/{jur}/{id}/index.json              one act: metadata and its article keys
GET /v1/acts/{jur}/{id}/articles/{key}.json     one article, verbatim
GET /v1/find?jur={jur}&q={title or abbreviation}  title → act ids, one GET (a list in shelf order, not a ranking)
GET /v1/resolve?jur={jur}&q={act} {unit}          «Wet inkomstenbelasting 2001 artikel 3.18», «EStG § 16», «Employment Rights Act 1996 s.1», «BWBR0011353/3.18»
                                                 → the article when act and unit are exact; 300 + the find list when the act is not; 404 + the act's keys when the unit is not
POST /v1/articles  {"addresses": [...]}          up to 20 addresses («nl › BWBR0011353 › 3.18» or paths) → the same objects, a 404 object in place for each miss
GET /v1/acts/nl/{id}/versions.json               every published version of a Dutch act: version, from, to, and which version holds each article's text
GET /v1/acts/nl/{id}/at/{YYYY-MM-DD}/{key}.json  the article AS IN FORCE ON THAT DAY (Netherlands only today): `as_of`, `version_in_force`, its own sha256 and cite
GET /v1/who/{jur}/index.json                     the cast of a shelf: every agent the acts bind — its state, how many acts it stands in, its mentions
GET /v1/who/{jur}/agents/{agent}.json            FOLLOW AN ACTOR INTO THE LAW: every act where that agent stands, with how many articles OBLIGATE / PERMIT /
                                                 FORBID / DEFINE it and whom it meets. The agent is named in the act's own language (nl werkgever · uk
                                                 secretary of state · de behörde · ja 厚生労働大臣); the shelf index lists them. A gate count is a POINTER:
                                                 fetch the articles it names and quote those — never present a count as the provision.
GET /v1/who/{jur}/acts/{id}.json                 one act's cast: its agents with the article numbers grouped by gate, and who meets whom inside 25 words
GET /v1/openapi.json                            the schema
```

Find the act with `/v1/find`: exact title, then the abbreviation the publisher states, then a form derived from the title or official number (a parenthesised short name, the number, the initials-plus-year lawyers use) — each hit names its tier — then a title fragment; or read the jurisdiction table. Then take the article `key` from the act's index — keys are the act's own numbering (`3.18`, `475g`, `16`, `section-I`). Responses are gzip-encoded JSON with an `ETag`; `If-None-Match` answers `304`. Every JSON answer carries `Link: </v1/arrival.md>; rel="describedby"`. Every error has the same shape: `{"error": "<code>", "status": <n>, "path": "…", "hint": "…"}`. Each article carries `cite` (the string to paste: address · sha256 · checked or fetched date), `aliases` (the unit forms people type), and for UK texts `attribution`.

## 3. How to quote

- Quote `text` as returned, unchanged. Cite the `address` and the `sha256`. Say when it was `c` (checked); if `c` is absent, say when it was `f` (fetched).
- If `r` (repealed on) is set, the provision is repealed: say so before anything else.
- If `in_force_state` is set, the UNIT is not current law as it reads, by the publisher's own statement: `repealed`, `prospective` / `not_in_force` (not yet in force), `expired`, `dead`, `reserved`, `transferred`, `renumbered`, `omitted`, `superseded`, `held-unconstitutional` … — say so before anything else, and quote `state_as_printed` (the publisher's word). A unit with `in_force_state` and no `text` is listed by the publisher with that state and no text (e.g. «Repealed, 2005, 3, Sec. 1» in `heading`): it exists, it is not law, and it is not a 404. Absent `in_force_state` means the publisher states no such thing for the unit — it is not a guarantee the unit is in force.
- `in_force` on a unit is the date that unit's wording took effect where the publisher states one (NL `inwerking`; UK `RestrictStartDate` — this wording, not first commencement); `in_force_until` its stated end; `extent` (UK) where it applies (E+W, S, N.I.).
- A text fetched `at/{date}` is the version in force on that day, not today's: quote its `cite` (which carries the date and version), never present it as current law.
- If `status` is `unofficial-translation`, the `notice` sentence must accompany every quote. The `translation.original` address is the authentic text.
- United Kingdom texts carry this line: *Contains public sector information licensed under the Open Government Licence v3.0.* Include it when you reproduce them.
- `refs` are the citations the publisher states whose targets are on this shelf, as addresses. A citation that is not in `refs` is not on the shelf; do not invent a link.

## 3b. The held shelf

Some jurisdictions are on the shelf without their text: the publisher's terms allow personal, non-commercial viewing only, or a statute requires the government's permission to reproduce the revised edition, and that permission is not yet on file. The coverage card names them (`held`), each `find` hit carries `held: true`, and every unit object carries `held` instead of `text`: the reason, `text_at` (the publisher's own link) and the unit's `sha256` and `chars` as this desk read it. Fetch the text yourself at `text_at`, hash it, compare. Do not ask this door for the text; do not present the heading as the provision.

## 4. What not to do

- Never answer a 404 with a neighbouring article, a paraphrase, or a recollection. The correct answer is: not on the shelf.
- Never present a paraphrase as the law. The law is the verbatim `text`.
- Never write meaning. This door serves what the text says, not what it means.

## 5. Keys, rates, payment

- Every request carries `Authorization: Bearer <key>` (or `X-Api-Key`). Without one you get `401` here, and where the payment rail is on, `402` with a payment challenge (x402, XRP Ledger) that you can settle without any human.
- A key has a rate in requests per second. Over it you get `429` with `Retry-After`. Wait that long; do not retry faster.
- A key is bought once at `/pay/tiers` → `/pay/start?tier=…`; it is shown once and never stored in clear.

### 5c. Credits — priced like tokens, never in a coin

A key is an account. One **credit** is one fetch (an article, a work, a list). The price of a credit is stated in cents, and every rail converts into credits at the moment it pays — by card, by XRP at the node's rate for the ten minutes a challenge lives, or by an issued stable currency — so a balance never moves with a market. `GET /v1/key/me` (with your key) → balance, rate, tier, last top-ups. `GET /v1/key/topup` (with your key) → 402 → pay → credits added. A spent balance answers 402 `credits_exhausted` on every fetch until it is topped up. A key without a balance field is unmetered (the operator's own). By card: `GET /pay/tiers` lists the credit packs; `GET /pay/start?tier=<tier>` opens the card page and hands out a new key once paid; the same with `Authorization: Bearer <key>` tops up that key instead.

## 5a. The trial door

`/try/` mirrors `/v1/` with no key and no payment, rate-limited per address, for testing. Same files, same rules: `GET /try/index.json`, `GET /try/find?jur=nl&q=inkomstenbelasting`, `GET /try/resolve?jur=nl&q=Auteurswet artikel 11`, `GET /try/acts/nl/BWBR0011353/articles/3.18.json`, `GET /try/who/nl/agents/werkgever.json`. It may be closed at any time; the keyed door is `/v1/`.

## 5b. The MCP endpoint — the same five tools as one URL

`POST https://kappa7.ai/mcp` (keyed: `Authorization: Bearer <key>`, or the payment rail's 402) and `POST https://kappa7.ai/try/mcp` (the trial door: no key, rate-limited per address). Streamable HTTP: one JSON-RPC message per POST, one JSON object back; no session id is issued and none is required; `GET` answers 405 (no server stream); the five tools are `get_article` · `list_act` · `find_act` · `who` · `coverage`, with the shelf's rule in each description. The same tools over stdio: `kappa7_mcp.py` (below).

```
Claude Code   claude plugin marketplace add https://kappa7.ai/plugin/.claude-plugin/marketplace.json && claude plugin install kappa7@kappa7   (the plugin: five tools + a skill; beta)
Claude Code   claude mcp add --transport http kappa7 https://kappa7.ai/try/mcp                                                              (the bare server)
Codex CLI     ~/.codex/config.toml      [mcp_servers.kappa7]  url = "https://kappa7.ai/try/mcp"
Cursor        ~/.cursor/mcp.json        {"mcpServers":{"kappa7":{"url":"https://kappa7.ai/try/mcp"}}}
ChatGPT       a custom connector at    https://kappa7.ai/try/mcp   (remote only — ChatGPT takes no stdio)
Windsurf · Cline · Gemini CLI   through mcp-remote:  npx mcp-remote https://kappa7.ai/try/mcp
keyed         the same lines with https://kappa7.ai/mcp and a header  Authorization: Bearer <key>
```

## 6. What is never behind this door

Company canvases, private shelves and letters between desks. Those are not served to agents, not for any key and not for any payment.

## 7. Errors, in one line each

`401` key required · `402` payment required (challenge in `PAYMENT-REQUIRED`) · `404` no such address, never a neighbour · `429` over your rate, honour `Retry-After` · `5xx` the door is down; nothing on the shelf changed.

*Authentic text is always the publisher's. Machine translations name their model and date and have no official status.*
