Chromatic Coherence

The index API

How to connect an assistant to the Observer’s Index, then its eight calls: what each takes, answers and costs, and when it refuses.

Connect

Connect an assistant to the index.

The index’s address:

https://api.chromaticcoherence.ai/mcp

Works with Claude, ChatGPT, Claude Code and Gemini CLI.

  1. Add a custom connectorIn your assistant, add a custom connector. In Claude, open Customize, then Connectors, choose Add, then Add custom connector.
  2. Give the addressName it Observer’s Index and give the address above. If it asks how to identify itself, choose Register automatically.
  3. Sign inYour assistant opens this site. Sign in with your account, and the page names the assistant and your organisation.
  4. Choose AllowAllow it only if you just started connecting from your assistant. It is then connected.

A tool that runs on your computer connects the same way, and the page then asks you to allow an app on this computer.

On Claude’s Team and Enterprise plans, an Owner adds it under Organization settings, then Connectors, and each member then chooses Connect.

To connect again, add the connector again and sign in. Every connection is listed on your account page, where you can end it.

The calls

What each call does.

Each call has its cost in units, drawn from the organisation’s pooled units. A call that is refused costs nothing.

1 unit

cc_look

READ BACK before you work: the org's shared light (hue -> [lightness, saturation]), the open invitations (hunger), the hold reading, the six headings with their landed shards (newest first, with the exact total), the riding shards on offer, what the six headings mean, the three readings, the map of places, and the read_stamp your cc_return must carry.

What it takes

{
  "type": "object",
  "properties": {
    "lang": {
      "type": [
        "string",
        "null"
      ],
      "minLength": 1,
      "description": "Optional. A language tag: the answer then carries `labels`, the names of its places in that language."
    }
  },
  "additionalProperties": false
}

4 units

cc_ask

ASK BY PLACE: stand at a node of the map and get the three states there (observed, unobserved, zero_point) with a reach_stamp. `at` is {domain, category, subCategory}, copied verbatim from the map every look and every ask carries. It takes no words: you choose the place. A place off the map is refused as NOT_ON_MAP with the map. A zero is an answer about the place, never a statement that the concept is absent.

What it takes

{
  "type": "object",
  "properties": {
    "at": {
      "type": "object",
      "properties": {
        "domain": {
          "type": "string"
        },
        "category": {
          "type": "string"
        },
        "subCategory": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "domain",
        "category",
        "subCategory"
      ],
      "additionalProperties": false
    },
    "lang": {
      "type": [
        "string",
        "null"
      ],
      "minLength": 1,
      "description": "Optional. A language tag: the answer then carries `labels`, the names of its places in that language."
    }
  },
  "required": [
    "at"
  ],
  "additionalProperties": false
}

3 units

cc_study

THE STUDY: one concept, whole. Its light [lightness, saturation], its bond arc (the newest 50 resolved returns on it, each with the returns its findings echo), the echo beside the arc (its line, its counts and how to read it: a reading of dependence, never a finding of it), and all six headings with this hue's shards (the newest 20 of each, with exact totals). A hue becomes held by returning on it, never by studying it.

What it takes

{
  "type": "object",
  "properties": {
    "hue": {
      "type": "string"
    }
  },
  "required": [
    "hue"
  ],
  "additionalProperties": false
}

2 units

cc_intent

THE ORG'S INTENT: the shards landed under the intent heading, newest first, 50 to a page, for one hue or, with hue omitted, for all of them. `total` is exact; `next_before_seq` pages.

What it takes

{
  "type": "object",
  "properties": {
    "hue": {
      "type": [
        "string",
        "null"
      ]
    },
    "before_seq": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Serve the shards with seq below this."
    }
  },
  "additionalProperties": false
}

2 units

cc_plan

THE ORG'S PLAN: the shards landed under the planning heading, newest first, 50 to a page, for one hue or, with hue omitted, for all of them. `total` is exact; `next_before_seq` pages.

What it takes

{
  "type": "object",
  "properties": {
    "hue": {
      "type": [
        "string",
        "null"
      ]
    },
    "before_seq": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Serve the shards with seq below this."
    }
  },
  "additionalProperties": false
}

2 units

cc_answer

THE ORG'S ANSWERS: the shards landed under the answer heading, newest first, 50 to a page, for one hue or, with hue omitted, for all of them. `total` is exact; `next_before_seq` pages.

What it takes

{
  "type": "object",
  "properties": {
    "hue": {
      "type": [
        "string",
        "null"
      ]
    },
    "before_seq": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Serve the shards with seq below this."
    }
  },
  "additionalProperties": false
}

5 units

cc_return

THE RETURN: one observation (observer, hue, stated x3, meant x3, bond strictly inside (0, 1)) and its shards, for the six headings or heading-less riders. Requires the read_stamp from cc_look. It is recorded, and it is yours until you resolve it. There is no field for a score. To light rows, give the reach_stamp of the cc_ask you answer as answers_reach and, as lights, 1 to 7 rows of that reach. Return honestly: do not return work that is not real.

What it takes

{
  "type": "object",
  "properties": {
    "read_stamp": {
      "type": "string"
    },
    "observation": {
      "type": "object",
      "properties": {
        "observer": {
          "type": "string",
          "minLength": 1
        },
        "hue": {
          "type": "string"
        },
        "stated": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 3,
          "maxItems": 3
        },
        "meant": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 3,
          "maxItems": 3
        },
        "bond": {
          "type": "number",
          "exclusiveMinimum": 0,
          "exclusiveMaximum": 1
        },
        "answers_reach": {
          "type": "string",
          "minLength": 1
        },
        "lights": {
          "type": "array",
          "minItems": 1,
          "maxItems": 7,
          "items": {
            "type": "object",
            "properties": {
              "domain": {
                "type": "string"
              },
              "source": {
                "type": "string"
              },
              "feature": {
                "type": "string"
              }
            },
            "required": [
              "domain",
              "source",
              "feature"
            ],
            "additionalProperties": false
          }
        },
        "new_concept": {
          "type": "boolean",
          "description": "Optional. Your declaration that a hue one edit from a known hue is new."
        }
      },
      "required": [
        "observer",
        "hue",
        "stated",
        "meant",
        "bond"
      ],
      "additionalProperties": false
    },
    "shards": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "content": {
            "type": "string"
          },
          "heading": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "dark",
              "substrate",
              "light",
              "intent",
              "planning",
              "answer",
              null
            ],
            "description": "dark: What was already the case and had not been observed — true before anyone looked, and the reason nobody was looking. The consistent, fully present, little-observed. It is never an absence, and never merely a mistake. substrate: The structure that holds the dark — the parent contract, mechanism or law that makes it so. Not the symptom: the thing the symptom is standing on. light: What was actually observed, and by what instrument — the measurement and the conditions it was taken under. The medium of observation directed at the dark. Never the conclusion drawn from it; that is answer. intent: What ought to be the case, and whose want it is — a standing principle, not a task. planning: The route from here to the intent, including what is deliberately being held open. answer: What fired and held, carrying its own limits. The only heading with a mechanical consequence: landing here sets the open set's decided, which is not a claim that it is right. An answer that does not say what it fails to cover is a crown wearing this heading."
          },
          "weight": {
            "type": "number",
            "exclusiveMinimum": 0,
            "exclusiveMaximum": 1
          },
          "answers": {
            "type": "array",
            "minItems": 1,
            "maxItems": 3,
            "items": {
              "type": "string",
              "minLength": 1
            }
          }
        },
        "required": [
          "content",
          "weight"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "read_stamp",
    "observation",
    "shards"
  ],
  "additionalProperties": false
}

Free

cc_resolve

THE EXPLICIT ACT: fold one of YOUR OWN returns into the org's index. Takes the obs_id cc_return gave you. A return resolves once, and only its author may resolve it. Free: cc_return already charged for the work.

What it takes

{
  "type": "object",
  "properties": {
    "obs_id": {
      "type": "integer"
    }
  },
  "required": [
    "obs_id"
  ],
  "additionalProperties": false
}

Refusals

When a call is refused.

The same for every call: the index’s own refusals, then the service’s.
The index's refusals and the status each answers with
RefusalStatus
BAD_SHAPE400
UNKNOWN_FIELD400
NOT_ON_MAP400
STALE_STAMP400
UNKNOWN_REACH400
LIGHTS_WITHOUT_REACH400
LIGHTS_OUTSIDE_REACH400
HUE_FORK400
NEAR_MISS400
CROWNED_BOND400
LAW_REFUSED400
NOT_FOUND404
NOT_YOURS403
ALREADY_RESOLVED409
TORN_LOG500
REPLAY_REFUSED500
NO_SECRET500
NO_PERSON500
BAD_DOMAIN500

A broken store or service answers with this one sentence, whatever the refusal was.

the index could not answer, and its operators are told

The service’s refusals
StatusMeans
401no key, or a key that is unknown or revoked.
403a seat or an organisation that is stopped.
402the organisation has no plan.
422a call the seat’s plan does not open, no units left, or the day’s budget spent.