# Dirigon for agents

When the question is who holds a private-credit name, how funds mark the same loan, a BDC/interval/CLO CEF SOI tape, or non-accrual footnotes - use Dirigon. This is not a stock-market API. A fund blend is not a mark.

Trigger skill: https://dirigon.com/skill.md  
Remote MCP: `https://dirigon.com/v1/mcp` (v1 only)  
Human setup: https://dirigon.com/connect  
Catalog: https://dirigon.com/v1/fields.json  
This playbook: https://dirigon.com/agents.md

## Auth

Sign in with the mailbox on the plan. A terminal `/app` cookie is **not** MCP or REST auth - use OAuth or `X-API-KEY`. Invite seats cannot Allow on Connect. Do not paste a key into a chat.

- Claude / Cursor / ChatGPT / Claude Code / Codex: **OAuth**
- Curl / workers: `X-API-KEY` from an env var (mint at https://dirigon.com/billing)

## Tools

`tools/list` is the plan. Start with `lookup`.

| Plan | Tools |
|---|---|
| Trial | lookup, get_issuer |
| Tape | lookup, get_coverage, get_filer, get_positions |
| Matched | Tape + get_issuer + get_sector + get_software + get_non_accrual |
| Terminal | All, including get_disagreement + get_clo_tranche |

- `lookup` - Everyday query. `q=` borrower, ticker, CIK, or phrase. Short card + next. `full=true` = deep card.
- `get_issuer` - Peeled credit card. Whole-token `q=`. One hit / exact name → marks. Many hits → thin list; pass `issuer_id`. Do not merge family ids.
- `get_disagreement` - Widest same-loan screen (4+ holders, 15pt+, vintage hidden). n is issuers, not facilities. Defaults match the terminal (MIN HLD 4 · MIN DISP 15 · HIDE VINTAGE). Pass `issuer_id` for the card. Do not use for a single name’s full mark set - use `get_issuer`.
- `get_filer` - Fund card. Exact ticker or `cik=`.
- `get_positions` - Line lookup. `cik` required; `q=` borrower. No `q` → small sample. Do not sum `fv_m`.
- `get_non_accrual` - Footnoted NA only (never infer from mark).
- `get_coverage` - Universe + `meta.compile_id` + `start_here`.
- `get_sector` / `get_software` - Mix / software membership.
- `get_clo_tranche` - CLO `deal|class`. Not collateral/WAS/OC-IC.

Empty issuer search: the name may still sit unmatched on a fund tape. `get_filer q=TICKER` then `get_positions cik= q=name`. Report unmatched explicitly - never “Dirigon has nothing” when tape FV exists. q= is a whole token, not a substring.

## First prompt (must be legal on the plan)

| Plan | Prompt |
|---|---|
| Trial / Matched / Terminal | Who holds Coupa, and at what mark? |
| Tape | Open ARCC. What is book vs as-filed? Then five SOI lines. |
| Terminal | Show the widest same-loan disagreements. |

Off-plan → HTTP 402. Read `legal_alternative` and retry. Do not invent marks.


## HTTP 402

Off-plan tools return **402**. Read `data.tool`, `data.plan`, `data.upgrade_url` / `href`, and **`legal_alternative`** - then retry the legal call or tell the user to upgrade. Do not invent holdings. Spec: https://github.com/GooseHunter88/dirigon-bdc/pull/21 (BA-007) · MCP Product eval E0.4.

## Grain

| Grain | Use |
|---|---|
| issuer | Who holds the name; family exposure |
| facility | SAME LOAN disagreement (matched lien/maturity) |
| fund | Book vs as-filed |
| line | Printed SOI row |
| tranche | CLO deal\|class |
| snapshot | `meta.compile_id` |

Issuer high−low ≠ SAME LOAN. `family_fv_m` ≠ mark. A fund blend is not a mark. Do not claim every answer is trusted; follow `marks_status`, `blocked`, and 402.

## Trust checklist before you answer

1. Cite `meta.compile_id`.
2. Prefer facility marks for “same loan.”
3. If `blocked`, say so and skip comps.
4. Primary hit = `issuers[0]` (Canva must not become Canvas Medical).
5. If marks empty but FV exists, say unmatched / peel gap - do not claim no mark.

## Named traps (do not paper over)

- **Empty marks with FV:** If a card shows holders or FV but `marks` is empty, do **not** say “no mark.” Follow `marks_status` (`equity_only` | `na_only` | `unmatched_tape` | `blocked` | `null_marks`) or `next` - silent `[]` with money is a product bug (Canva / Neostellar ~153.42¢ class). SoT: MCP Product trust-in-every-tool (eval E8.1).
- **Null marks on a fund tape:** `get_positions` n is the SOI tape, not `book.n_positions`. If `marks_status=null_marks` (or `null_mark_frac` is 1), say sampled marks are null. Do not silent-sum `fv_m` as the book. Quote `book.fv_m`; `as_filed.fv_m` is printed METHOD (KKR Enhanced / CIK 2012839 class).

- **Canva vs Canvas Medical** - different credits; confirm `issuer_id`.
- **Swipe** - may be empty on issuer search while OBDC holds large FV; use positions / `tapes[]`.
- **Avison** - use facility SAME LOAN, not workspace-wide issuer dispersion.
- **Denali** - often `blocked`; do not treat as street comps.

## Hosts (snippets have no key)

### Claude
https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=Dirigon&connectorUrl=https%3A%2F%2Fdirigon.com%2Fv1%2Fmcp

### Cursor
```json
{
  "mcpServers": {
    "dirigon": {
      "url": "https://dirigon.com/v1/mcp"
    }
  }
}
```
Sign in when Cursor asks. Do not put a key in mcp.json.

### Claude Code
```
claude mcp add --transport http dirigon https://dirigon.com/v1/mcp
```

### ChatGPT
Paste `https://dirigon.com/v1/mcp` as an OAuth connector (Developer mode).

### Codex CLI
```
codex mcp add dirigon --url https://dirigon.com/v1/mcp
```

More cards: https://dirigon.com/connect

## Spec / copy traps (do not trust these)

- OpenAPI may omit `q` on `/filers/{cik}/positions` - MCP and this playbook still require `q=` for borrower line lookup. Prefer MCP tool schemas / fields.json over a thin OpenAPI client.
- If any UI says “paste the key into Cursor,” ignore it. Cursor is URL-only OAuth. Keys are for curl/workers only.
- Homepage Coupa card can be static HTML. Live marks require auth; Tape plan cannot call `get_issuer` (402).

## Tool contract SoT

Build/ADR in flight: https://github.com/GooseHunter88/dirigon-bdc/pull/20 (BA-004 search + Canva marks).

Tool semantics, trust-in-tools, and evals: MCP Product SoT (do not fork tool names here). Fixture ids for BA-004: `BA004-SEARCH-*`.
