Skip to content
Chromatic Coherence

API reference

The index API.

Four calls onto your org’s hue index — look, study, work and return. Every call is scoped to your seat and billed in units.

Base & auth

One MCP endpoint, not a REST surface — the tool is named in the body. Every call carries your seat’s bearer token. There is no separate org key: the token is how the index knows whose memory it is reading.

POST https://api.chromaticcoherence.ai/mcp
Authorization: Bearer <seat_token>
Content-Type: application/json
{"method":"tools/call","params":{"name":"cc_look"}}

The four calls

look · 1 unit

The org-wide glance

Which concepts are held, how completely each is accounted for, how seen, and which threads earlier sessions left riding.

{}
study · 3 units

One concept, whole

Its depth, its history, every heading, and everyone who has touched it.

{
  "hue": "renewal_policy"
}
work · 2 units/call

Intent, plan and answer

What the org wants, how it means to get there, and what has already fired and held.

{
  "hue": "renewal_policy"
}
return · 5 units

File an observation

Lands under all six headings at once — dark, substrate, light, intent, planning, answer.

{
  "read_stamp": "<from cc_look>",
  "observation": {
    "observer": "your-session",
    "hue": "renewal_policy",
    "stated": ["...", "...", "..."],
    "meant": ["...", "...", "..."],
    "bond": 0.62
  }
}

When the words do not reach

An ask meets a row by its words, so a concept your org holds under another wording reads exactly like one it has never met. The answer says so, and it hands you the room instead of a blank.

ask · 4 units
{
  "prompt": "carry-over on exit"
}

The ask is its own call, not a fifth step of the loop. Everything below is what it hands back.

map · on a miss

The room’s own positions

Every category the room actually holds, each with its row count, its split by kind, and how many of its rows name what settles them. Read from the room as you ask, never typed.

{
  "map": [{
    "category": "FAMILY LEAVE",
    "rows": 5, "sourced": 4
  }]
}
at · rides on the ask

Stand somewhere and ask again

Copy a position back verbatim and the rows there answer because you stood there, not because a word matched. A name the room does not have is refused rather than quietly swapped for a near one.

{
  "prompt": "carry-over on exit",
  "at": { "category": "FAMILY LEAVE" }
}
truth · beside the row

What a row rests on

A row can name the thing that settles it, where to read it, and the date someone last read the row against it. Absent means unsourced, and the counts say how many of the rows you reached name one.

{
  "truth": {
    "authority": "Employment Rights Act 1996 s.80A",
    "checked": "2026-09-03"
  }
}

Errors

A refusal is honest, typed and free. A concept the index does not hold is not an error — it is recorded as hunger and the call succeeds.

401 · no credential

The request carried no bearer org-token. The protocol is readable without one at /mcp/instructions.

401 · unknown or revoked

The token was minted, then revoked or replaced. A new one comes from the OAuth consent exchange.

402 · NO_TOKENS

The org’s index units are spent. The refusal names the arithmetic that refused it.

422 · refused

Every other refusal, typed and named: NO_SUCH_ASSET, EMPTY_ASSET, SELF_USE, BAD_SHAPE.