Cobenian Steward MCP Server

Connect AI tools like Claude Desktop to the Advisor and your Steward business data.

What is MCP?

The Model Context Protocol (MCP) lets AI applications connect to external data sources and tools. With the Steward MCP server, you can use Claude Desktop (or any MCP-compatible client) to talk to the Advisor and query your business data using natural language.

The server exposes two groups of tools over one endpoint: the Advisor tools (advisor_*) — the Advisor's own findings, grounded Q&A, and one-tap capture, which mirror the Advisor REST API 1:1 and are how the Companion connects — and the domain-data tools for reading the underlying clients, calendar, invoices, and knowledge base. Each tool declares the permission it needs; calls without it are refused.

Setup with Claude Desktop

1. Generate an API key in Settings → API Keys in the Steward dashboard.

2. Open Claude Desktop settings and add this to your MCP configuration:

{
  "mcpServers": {
    "steward": {
      "url": "https://steward.cobenian.com/mcp",
      "headers": {
        "Authorization": "Bearer ovst_your_api_key_here"
      }
    }
  }
}

3. Restart Claude Desktop. You'll see Steward tools available in your conversations.

Authentication

The MCP server uses the same API keys as the REST API. Include your key as a Bearer token:

Authorization: Bearer ovst_your_key_here

API keys are scoped to your account. All tool calls return only your account's data.

Response Shape & Pagination

Tool results are returned as JSON text inside the standard MCP content array. Tools that return a list of items wrap them in an {items, meta} envelope so you can page through large result sets — identical to the REST API's meta, just alongside items instead of data:

{
  "items": [...],
  "meta": {
    "total": 137,
    "count": 20,
    "limit": 20,
    "offset": 0,
    "has_more": true
  }
}

Every list tool accepts the same two pagination arguments:

ArgumentTypeDescription
limitintegerPage size. Default 20 (25 for get_invoices). Clamped to 1..100.
offsetintegerNumber of items to skip. Default 0. Clamped to >= 0.

The meta fields mean: total = all matching items (ignoring limit/offset), count = items in this page, limit/offset = the effective values applied, and has_more = whether another page exists (offset + count < total). Page by increasing offset by limit until has_more is false.

Breaking change: list tools now return an {items, meta} object. They previously returned a bare JSON array — update any client that indexed the result directly to read items instead.

Available Tools

Advisor

The Advisor's own tools. Every one — read and write — requires the read:advisor permission (there is no separate write scope, by design, so a Companion key keeps working). They read and write only the Advisor's own data and never send anything to clients. These mirror the Advisor REST API 1:1.

advisor_findings read:advisor
The Advisor's CURRENT findings — what it has noticed across finance, delivery, and sales, with 'the one thing' first. Read-only.
advisor_ask read:advisor
Ask the Advisor a question. Answers ONLY from your org's structured advisor data (findings, vital signs, open/overdue invoices) — never message content — and cites the ids it used. Never sends anything.
Params: question (required)
advisor_dismiss_finding read:advisor
Dismiss a finding. Recorded on the LEARN ledger; conviction — not approval — governs whether it re-surfaces.
Params: finding_id (required)
advisor_capture_lead read:advisor
Capture a sales lead in one tap.
Params: name (required), value_cents, stage, expected_close (YYYY-MM-DD), notes, client_id (all optional)
advisor_capture_commitment read:advisor
Capture a commitment/promise in one tap.
Params: promise (required), subject_type, subject_id, deadline (YYYY-MM-DD), project_id (all optional)
advisor_set_destination read:advisor
Set or refine the org's Destination (where the owner is steering).
Params: statement (required), horizon (optional)
advisor_set_objectives read:advisor
Replace the org's Destination objectives with the given small, curated set.
Params: objectives (required array of {name, weight?, measure_key?, target?})
advisor_append_owner_fact read:advisor
Append one fact to the owner model. facet is patterns | blind_spots | preferences. For patterns/blind_spots pass fact; for preferences pass key + value.
Params: facet (required), fact OR key+value

Core Data

get_clients read:clients
List clients with health scores. Returns ALL clients (confirmed + unconfirmed) but non-archived only by default. Returns {items, meta}.
Params: confirmed (optional: true, false, all), archived (optional: false, true, all), limit (optional), offset (optional)
get_client_detail read:clients
Get detailed client profile including emails, invoices, and contacts.
Params: client_id (required)
get_events read:events
List upcoming calendar events. Returns {items, meta}.
Params: limit (optional, default 20), offset (optional)
get_invoices read:invoices
List invoices. Returns {items, meta}.
Params: status (optional), client_id (optional), limit (optional, default 25), offset (optional)
search read:clients
Search across clients, emails, and business data. Returns a composite of capped result sections (not paginated).
Params: query (required)

Knowledge base

list_wiki_entries read:wiki
List wiki/KB entries (playbooks, observations, baselines, hand-typed facts). Returns {items, meta}.
Params: client_id (optional), limit (optional), offset (optional)
create_kb_entry write:wiki
Create a new KB entry under an atomic topic. Reserved aggregate index topics are refused.
Params: topic (required), content (required), tags (optional)
edit_kb_entry write:wiki
Replace the content of an existing KB entry by id.
Params: entry_id (required), new_content (required)
delete_kb_entry write:wiki
Delete a KB entry by id. Reserved index topics refused.
Params: entry_id (required)

Example Request

Ask the Advisor a question (requires read:advisor):

curl -X POST https://steward.cobenian.com/mcp \
  -H "Authorization: Bearer ovst_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "advisor_ask",
      "arguments": {"question": "Which clients are going quiet?"}
    }
  }'

Rate Limits

100 requests per minute per API key, shared with the REST API.