# Agent access — calling the determinations

The Probity Institute publishes governance-rights determinations for 53 DAO and protocol
tokens. Everything is free, keyless and CC-BY-4.0. Two surfaces exist: the published JSON
files, and an MCP endpoint that reads those same files and hands back a slice.

Nothing here is advice, and nothing here is a rating of a team. A determination states that
specific governance rights are enforced by specific contracts at a specific block, recorded
`as_of` a stated date, with dated observations since. Where a record cannot verify something,
the record says so.

## Which surface to use

| You want | Use |
|---|---|
| One field from one token, cheaply | `GET /data/determinations/<slug>.json` |
| The whole universe as a table | `GET /data/determinations/determinations.csv` |
| A shape you can codegen against | `GET /data/determinations/gsa-openapi.json` |
| To ask a question in prose and get the slice | `POST /mcp` |
| To know how current a determination is | `GET /data/determinations/freshness.json` |

The MCP endpoint is a convenience over the same files, not a separate dataset. It cannot be
more current than the files, and it does not add judgement to them.

## MCP endpoint

- **Endpoint:** `https://probity-institute.pages.dev/mcp`
- **Transport:** streamable HTTP, JSON responses
- **Session:** stateless — no session id is issued, nothing to terminate
- **Methods:** `POST` (JSON-RPC 2.0, single message or batch). `GET` and `DELETE` return 405
- **Auth:** none. No key, no registration, no rate-limit account
- **Accept header:** not enforced; `application/json, text/event-stream` is fine

### Client configuration

For a client that takes a URL:

```json
{
  "mcpServers": {
    "probity-institute": {
      "url": "https://probity-institute.pages.dev/mcp"
    }
  }
}
```

### Handshake, by hand

```bash
curl -s https://probity-institute.pages.dev/mcp \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","clientInfo":{"name":"curl","version":"0"}}}'
```

The server answers with its protocol version, `capabilities.tools`, `serverInfo`, and an
`instructions` field carrying the descriptive-only framing. Then `{"method":"tools/list"}`
returns the seven tools, and `{"method":"tools/call","params":{"name":"...","arguments":{...}}}`
runs one.

## Tools

| Tool | Arguments | Returns |
|---|---|---|
| `list_daos` | `tier`, `structure`, `gsa` + `verdict`, `cycle_state`, `event_watch`, `limit` | The 53 scored tokens with tier, structure label and GSA-1..GSA-8 verdicts |
| `get_determination` | `dao` (slug, name or token symbol) | One full record: verdicts, key finding, flags, exercisability block, events since `as_of` |
| `get_freshness` | `dao` (optional) | Verification recency, next review date, and watch events — one row or the whole universe |
| `list_watch_events` | `dao`, `since`, `impact`, `limit` | Dated events observed after a determination's `as_of`, newest first |
| `get_exercisability` | `dao` (optional) | What a controlling voting block costs under the published formula, with its inputs, or a typed reason it cannot be derived |
| `get_recheck_queue` | — | Reviews in motion, recently closed items, watch-only events |
| `dataset_provenance` | — | Licence, dataset hash, schema and methodology version, how to cite |

A tool result carries both `content` (a text summary a model can read) and `structuredContent`
(the same data, unflattened, for a program). Failures split two ways, deliberately: an unknown
tool is a JSON-RPC error (`-32602`), while a valid call that cannot be answered — an unknown
DAO, say — returns `isError: true` with the close matches in the body, because "no such token"
is an answer, not a protocol fault.

### Worked call

```bash
curl -s https://probity-institute.pages.dev/mcp \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"get_determination","arguments":{"dao":"UNI"}}}'
```

That resolves the token symbol to the record and returns the verdicts, the key finding, the
control-cost block and every dated event since `as_of`, alongside the record's own
`source_dataset.sha256`. Cite that hash and the `as_of` date; quote the transaction or block
the record cites rather than the record alone.

## What the tools will not do

They will not tell you how to vote, whether to buy, or whether a proposal is good. They will
not rank tokens by desirability. They will not return a number where the underlying record
could not derive one — an unavailable control cost comes back as a typed reason, not a zero.
And they will not move a verdict: determinations change only through the frozen methodology at
a scheduled re-check, and the events exposed here are dated observations that sit beside the
determination rather than changing it.

`/llms.txt` lists every published surface, and `/data/determinations/index.json` carries an
`agent_interfaces` block naming them.

---

<!-- seo:begin -->
<link rel="canonical" href="https://probity-institute.pages.dev/docs/mcp.md">
<meta property="og:type" content="article">
<meta property="og:site_name" content="Probity Institute">
<meta property="og:title" content="Agent access — calling the determinations — Probity Institute">
<meta property="og:description" content="The Probity Institute publishes governance-rights determinations for 53 DAO and protocol tokens. Everything is free, keyless and CC-BY-4.0.">
<meta property="og:url" content="https://probity-institute.pages.dev/docs/mcp.md">
<meta property="og:locale" content="en_GB">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Agent access — calling the determinations — Probity Institute">
<meta name="twitter:description" content="The Probity Institute publishes governance-rights determinations for 53 DAO and protocol tokens. Everything is free, keyless and CC-BY-4.0.">
<!-- seo:end -->
