Strata PlatformDocs

Business definitions and MCP

Your data owners write business definitions for a shared database once, in Strata: what "customer" means there, the exact SQL of "revenue", which tables join how, the rules every answer keeps. The same approved definitions can be read by your other tools, so a dashboard, a notebook or another AI computes "active customers" the way Strata does instead of keeping a second definition that drifts.

There are two ways in, both behind the definitions:read scope (shown as Read business definitions when you create a key):

  • GET /v1/definitions and GET /v1/definitions/{connection_id}, for programs.
  • POST /v1/mcp, an MCP server for AI clients.

Both answer from the same rule, so they never disagree.

Who sees what

A key reads what its actor may use: the shared databases that person or service account sees in Strata, by the same access rule, and only while your organization lets the actor use SQL Server. A new service account holds the default member role; to change what its key reads, change that account's access under Organization → Database connections, or create the key for a person instead.

Three things never leave:

  • A draft. Only the version a data owner approved is served.
  • An action's SQL. Actions are listed with their name, description, inputs and limits, the way Strata's own AI sees them, and run only inside Strata, where a person approves them. Nothing on this API runs one.
  • A database the actor may not use. Asking for one answers exactly like asking for one that does not exist.

If the access list or the definitions cannot be read, the request is refused with 503 and Retry-After: 5, never answered with an empty list that would read as "nothing is defined".

REST

GET /v1/definitions lists the databases with approved definitions:

{
  "data": [
    {
      "connection_id": "6c0e1d2a-…",
      "name": "Sales",
      "description": "The sales warehouse",
      "version": 7,
      "approved_at": "2026-10-20T10:00:00.000Z",
      "counts": { "entities": 12, "metrics": 9, "relationships": 14, "rules": 4, "terms": 6, "actions": 2 }
    }
  ]
}

GET /v1/definitions/{connection_id} returns one database's approved set, whole:

{
  "connection_id": "6c0e1d2a-…",
  "name": "Sales",
  "description": "The sales warehouse",
  "version": 7,
  "approved_at": "2026-10-20T10:00:00.000Z",
  "counts": { "entities": 1, "metrics": 1, "relationships": 1, "rules": 1, "terms": 1, "actions": 1 },
  "settings": { "writes_only_through_actions": true },
  "definitions": {
    "entities": [{ "name": "Customer", "table": "dbo.Customers", "key": "CustomerID", "filter": "IsTest = 0", "description": "A paying account.", "synonyms": ["client"] }],
    "metrics": [{ "name": "Revenue", "sql": "SELECT SUM(Total) FROM dbo.Orders WHERE Status = 'paid'", "unit": "USD", "description": null, "synonyms": ["sales"] }],
    "relationships": [{ "from": "dbo.Orders.CustomerID", "to": "dbo.Customers.CustomerID", "description": null }],
    "rules": [{ "text": "Never count test accounts." }],
    "terms": [{ "term": "ARR", "means": "Annual recurring revenue." }],
    "actions": [{ "name": "Change tier", "description": "Move a customer to another tier.", "inputs": [{ "name": "id", "type": "number", "required": true, "description": null }], "max_rows": 1, "who": "editors", "ask": "always" }]
  }
}

Use a metric's sql as written. version rises with every approval, so a cache keyed on it is never stale.

Both are read-only: POST, PUT, PATCH and DELETE return 405 with Allow: GET. Data owners change definitions in Strata, where each version is approved by a person.

MCP

https://app.strata.kronisys.com/v1/mcp is an MCP server (Streamable HTTP) with two read-only tools:

ToolWhat it returns
list_databasesThe databases with approved definitions this key may read, with each one's id and counts.
get_business_definitionsOne database's definitions, by its id or exact name. Pass names (up to 30) to look definitions up by name, term or synonym, with every rule alongside; pass kinds to keep only some kinds.

It runs no queries and makes no changes, and it offers no resources or prompts.

Connect any client that lets you set a request header. Send the key as Authorization: Bearer sk_strata_live_…. In Claude Code, for example:

claude mcp add --transport http strata https://app.strata.kronisys.com/v1/mcp \
  --header "Authorization: Bearer sk_strata_live_…"

A client that can only sign in to an MCP server with OAuth cannot use an API key; use one that takes a header.

Protocol versions

The endpoint speaks both eras of MCP and keeps nothing between requests:

  • A request carrying the per-request _meta of revision 2026-07-28 is served by that revision. Its MCP-Protocol-Version, Mcp-Method and Mcp-Name headers must match the body (-32020 HeaderMismatch otherwise), server/discover describes the server, and every result carries resultType and the server's identity.
  • A client that opens with initialize is served as 2025-11-25 or 2025-06-18, whichever it asks for, without a session id.

One JSON-RPC message per request; batches are refused. Answers are always application/json. GET and DELETE return 405 with Allow: POST, since there is no server stream and no session to end.

Errors

What happenedWhat you get
No key, or a key that is not valid401, as everywhere on the API
The key lacks definitions:read403 insufficient_scope
An Origin header that is not an origin (null, for example)403, before the key is read
A tool cannot do what it was asked (a database the key may not read, SQL Server turned off for the actor, an argument it cannot use)A tool result with isError: true and a sentence saying why
An unknown toolJSON-RPC -32602
A 2026-07-28 request missing _meta fields400, JSON-RPC -32602
A protocol version this server does not speak400, JSON-RPC -32022, listing the versions it does

Related