I'mBoardDocs
Guides

MCP — install & tool reference

Connect I'mBoard to claude.ai with one URL (no install), or install the MCP server in Claude Code, Claude Desktop, Cursor, Cline, and other MCP-aware clients. Includes the full live tool catalog.

I'mBoard ships an MCP (Model Context Protocol) server that wraps the I'mBoard REST API and gives any MCP-aware AI client — Claude Code, Claude Desktop, Cursor, Cline, and others — direct access to your boards, meetings, documents, reports, dashboards, ontology, and knowledge graph through natural language.

This page is install + reference. Each section is independent — jump to your client of choice and copy the snippet, then come back for the tool catalog and workflow examples.

API vs CLI vs MCP

ApproachBest For
REST API (curl, SDK)Custom integrations, CI/CD, programmatic access
CLIQuick lookups, scripting, agent workflows, terminal power users
MCP server (Claude/Cursor/Cline/…)Interactive exploration, ad-hoc queries, AI-assisted workflows

All three speak to the same API using the same personal access token (the hosted connector below mints a scoped one for you when you sign in).


Fastest: claude.ai on the web — no install, no token

I'mBoard runs this same server as a hosted remote endpoint (streamable HTTP, signed in with OAuth).

  1. In claude.ai, open Settings → Connectors → Add custom connector.
  2. Paste the URL https://app.imboard.ai/mcp (also shown with a Copy button under Account → API Access in I'mBoard). Keep the detected options Sign in now and Register automatically.
  3. Sign in to I'mBoard when asked, and choose Full access or Read only. Access always respects your board permissions.

The connection appears under Account → API Access as "Claude (MCP connector)". Revoke it there at any time; that disconnects it immediately.

Other clients that support remote MCP servers can use the same URL. In Claude Code, for example:

claude mcp add --transport http imboard https://app.imboard.ai/mcp

The rest of this page covers the local (stdio) install, which uses an API token you create yourself.


1. Get a token

The local (stdio) MCP server authenticates with an I'mBoard API token. There are two kinds, and which one you pick changes what the agent can reach:

TokenPrefixIdentityReachUse for
Personal access token (PAT)imb_pat_Acts as youEvery board you can access, plus your profile and portfolioYour own agent across all your boards
Board access token (BAT)imb_bat_A board service principal — no user identityA single board only, read-only by defaultA scoped, single-board agent (e.g. a read-only reporting bot, a shared board assistant, a CI job)

Rule of thumb: if the agent only needs one board and should not be able to touch anything else, use a BAT. If you want an agent that acts as you across all your boards, use a PAT. See Board tokens vs personal tokens below for the full comparison and the downstream proof.

Personal access token (PAT)

  1. Open I'mBoard and navigate to Account → API Access.
  2. Click Create Token.
  3. Name it after the client (e.g. claude-desktop, cursor) so you can revoke per-client later, and choose the shortest expiry that fits your use case.
  4. Copy the token immediately — it starts with imb_pat_ and is only shown once.

Board access token (BAT)

A BAT is minted from the board's own settings (not your account), so its lifecycle belongs to the board rather than to you. It is pinned to that one board, carries the Board read only scope preset by default, and has no access to your profile, your other boards, or portfolio data.

  1. Open the board and go to Board settings → Access tokens. (Only board owners and admins can create tokens; other members see the list read-only.)
  2. Click Create board access token and name it after the agent (e.g. acme-reporting-bot).
  3. Choose a scope preset — Read only (default) or Read & write (read + write this board; never create/delete boards) — and an expiry.
  4. Copy the imb_bat_… token immediately — like a PAT, it is only shown once.

Use it anywhere this guide says IMBOARD_API_TOKEN (see the snippets below — just swap the imb_pat_ value for your imb_bat_ value). For the full BAT vs PAT contract, scoping rules, and minting walkthrough, see Authentication → Board Access Tokens.


2. Install per client

Pick your client. Every snippet below uses the same npm package (@imboard.ai/mcp-server) over stdio transport — for claude.ai on the web, use the hosted URL instead. The only thing that changes between clients is where you paste the config.

Claude Code

Add to your project's .mcp.json (or to ~/.claude/settings.json under mcpServers for global access):

{
  "mcpServers": {
    "imboard": {
      "command": "npx",
      "args": ["-y", "@imboard.ai/mcp-server"],
      "env": {
        "IMBOARD_API_BASE_URL": "https://app.imboard.ai",
        "IMBOARD_API_TOKEN": "imb_pat_YOUR_TOKEN"
      }
    }
  }
}

Restart Claude Code (or reload MCP servers). Verify:

"List my I'mBoard boards."

Claude should call list_boards and return your boards.

Claude Desktop

Edit claude_desktop_config.json (location: Settings → Developer → Edit Config, or ~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows):

{
  "mcpServers": {
    "imboard": {
      "command": "npx",
      "args": ["-y", "@imboard.ai/mcp-server"],
      "env": {
        "IMBOARD_API_BASE_URL": "https://app.imboard.ai",
        "IMBOARD_API_TOKEN": "imb_pat_YOUR_TOKEN"
      }
    }
  }
}

Fully quit Claude Desktop (Cmd-Q on macOS — closing the window is not enough) and relaunch. Verify by typing in any chat:

"List my I'mBoard boards."

The hammer icon at the bottom of the input should show imboard as an available server.

Cursor

Create .cursor/mcp.json in your project root (or ~/.cursor/mcp.json for global access):

{
  "mcpServers": {
    "imboard": {
      "command": "npx",
      "args": ["-y", "@imboard.ai/mcp-server"],
      "env": {
        "IMBOARD_API_BASE_URL": "https://app.imboard.ai",
        "IMBOARD_API_TOKEN": "imb_pat_YOUR_TOKEN"
      }
    }
  }
}

Open Settings → MCP in Cursor to confirm imboard is listed and toggled on. Verify in the Composer or chat panel:

"List my I'mBoard boards."

Cline (VS Code extension)

Open the Cline extension's MCP settings (click the server icon in the Cline sidebar, then Edit MCP Servers) and add:

{
  "mcpServers": {
    "imboard": {
      "command": "npx",
      "args": ["-y", "@imboard.ai/mcp-server"],
      "env": {
        "IMBOARD_API_BASE_URL": "https://app.imboard.ai",
        "IMBOARD_API_TOKEN": "imb_pat_YOUR_TOKEN"
      },
      "disabled": false,
      "autoApprove": []
    }
  }
}

Cline reloads MCP servers automatically. Verify with the same prompt:

"List my I'mBoard boards."

Continue, Goose, and other clients

Continue (~/.continue/config.json) and Goose (~/.config/goose/config.yaml) both support MCP servers with the same shape — command, args, env. Use the Claude Desktop snippet above as a template and adapt to the client's config syntax.

These configurations are community-contributed and not currently verified end-to-end by the I'mBoard team. If a snippet doesn't work for your client, please file an issue with the client name and version.

ChatGPT Apps

Coming soon — pending GA of the ChatGPT Apps platform for third-party MCP servers.


3. Auto-discovery via .well-known/mcp.json

For MCP-aware clients and directories (Smithery, the Anthropic MCP directory, etc.) that support auto-configuration, I'mBoard publishes a discovery manifest at a stable, unauthenticated URL:

curl https://app.imboard.ai/.well-known/mcp.json | jq .

The manifest follows the RFC 8615 .well-known/ URI convention and lists:

  • name, displayName, description, version — server identity
  • transport — install command (npx -y @imboard.ai/mcp-server) and the env vars the client must set (IMBOARD_API_BASE_URL, IMBOARD_API_TOKEN)
  • remote — the hosted endpoint (type: streamable-http, url: https://app.imboard.ai/mcp) and its OAuth discovery URLs (auth.protected_resource_metadata, auth.authorization_server_metadata); omitted while the hosted endpoint is switched off
  • tools — the full live catalog of MCP tools (auto-generated from the same route registry as the section below — never hand-maintained)
  • links — deep links to install pages for common clients and to this documentation

Clients that consume .well-known/mcp.json can configure the I'mBoard server without users editing JSON by hand. The manifest is cached by the CDN (5 min browser, 15 min edge) and refreshes on every deploy.


Board tokens (BAT) vs personal tokens (PAT)

The MCP server forwards your IMBOARD_API_TOKEN to the API as a bearer token and is completely token-type-blind — it never inspects the imb_pat_ / imb_bat_ prefix. That means a board access token works through every read tool that admits board tokens with no configuration change beyond the token value itself; tools that act as a user — e.g. get_board_context and the meeting-document tools such as list_meeting_documents — answer FORBIDDEN to one. Choosing the right token is purely a permissions decision:

Personal access token (PAT)Board access token (BAT)
Prefiximb_pat_imb_bat_
Minted fromAccount → API AccessBoard settings → Access tokens (owners/admins)
IdentityActs as youService principal — no user; get_me / list_my_boards are out of scope
Board reachEvery board you can accessExactly one board — the board it was minted on
Other boardsVisibleNot-found (existence is not even leaked)
Default permissionsYou choose Read-only or Full accessRead-only preset by default
Cross-board / portfolioget_portfolio_data available with portfolio:readNever — portfolio and other-board data are unreachable
Lifecycle ownerYouThe board

When to use a BAT:

  • A read-only reporting or analytics agent that should only ever see one board.
  • A shared assistant that several board members use, where you do not want it acting as any one person.
  • A CI job or automation that prepares one board's pack and must be incapable of touching anything else.

When to use a PAT:

  • A personal agent that should roam across all the boards you belong to.
  • Any workflow that needs your profile, your notifications across boards, or portfolio-level aggregation.

A BAT is read-only by default and board-scoped at the auth layer. Even if a tool that writes (or a tool on a different board) is invoked, the API rejects it — a write tool returns FORBIDDEN, and a tool aimed at any board other than the token's board returns not-found. You cannot accidentally over-grant a BAT by pointing an agent at the wrong tool.

Configure the MCP server with a BAT

Identical to any client snippet above — only the token value changes:

{
  "mcpServers": {
    "imboard-acme-board": {
      "command": "npx",
      "args": ["-y", "@imboard.ai/mcp-server"],
      "env": {
        "IMBOARD_API_BASE_URL": "https://app.imboard.ai",
        "IMBOARD_API_TOKEN": "imb_bat_YOUR_BOARD_TOKEN"
      }
    }
  }
}

Name the server after the board (e.g. imboard-acme-board) so it's obvious in the client which board the agent is scoped to.

Downstream proof — verify a BAT is board-scoped

This is a repeatable check that the board token does what it claims: it reads its own board and is blind to every other one. Run it after minting a BAT (use a disposable token and revoke it afterward).

  1. Find two board IDs — the board your BAT is minted on (OWN_BOARD_ID) and any other board ID (OTHER_BOARD_ID). With a PAT you can list them: curl https://app.imboard.ai/api/v1/boards -H "Authorization: Bearer $YOUR_PAT" | jq '.data[].id'.

  2. Export the disposable BAT:

    export BAT="imb_bat_YOUR_BOARD_TOKEN"

    Confirm what the token is before you go further — whoami echoes the board it is pinned to:

    curl -s https://app.imboard.ai/api/v1/whoami -H "Authorization: Bearer $BAT" | jq '{authType, boardId, boardName}'
    # → { "authType": "board_token", "boardId": "OWN_BOARD_ID", "boardName": "Acme Inc." }
  3. Read the token's own board — expect 200 with data:

    curl -s -o /dev/null -w '%{http_code}\n' \
      https://app.imboard.ai/api/v1/boards/OWN_BOARD_ID/meetings \
      -H "Authorization: Bearer $BAT"
    # → 200
  4. Read a different board with the same token — expect 404 (not-found, not 403):

    curl -s -o /dev/null -w '%{http_code}\n' \
      https://app.imboard.ai/api/v1/boards/OTHER_BOARD_ID/meetings \
      -H "Authorization: Bearer $BAT"
    # → 404  (board existence is deliberately not leaked)
  5. In the MCP client itself, configure the server with the BAT (snippet above) and ask:

    "List the meetings for board OWN_BOARD_ID."

    The agent calls list_board_meetings and returns the meetings. Then ask it to list meetings for OTHER_BOARD_ID — it gets a not-found error and cannot see that board.

  6. Revoke the disposable token when you're done.

If step 4 returns 200 instead of 404, the token is not board-scoped — stop and report it. The MCP server requires no code change for any of this: it forwards the bearer token and surfaces the API's response unchanged. (This contract is locked by an automated test in the MCP server package: tests/api-client/bat-downstream-proof.test.ts.)


Tool reference

The I'mBoard MCP server exposes every API endpoint flagged for AI consumption. Tools are organized by domain. Each row shows the tool name, the HTTP verb + path on the underlying REST API, and the API token scope required when authenticating with a personal access token (JWT sessions bypass scope checks).

Auto-generated from the route registry at build time. 153 tools across 32 domains.

Action Items

ToolMethodPathScopeDescription
create_action_itemPOST/boards/:boardId/meetings/:meetingId/action-itemsboards:writeCreates an action item on a meeting. Requires board collaborator access. Items created via an API token are attributed to the agent. An assigneeUserId must be a board member; assigneeName defaults to that member's display name.
list_my_action_itemsGET/api/action-items/myboards:readLists action items assigned to the authenticated user across all boards
update_action_item_statusPATCH/api/action-items/:actionItemId/statusboards:writeUpdates an action item status (in_progress, completed, cancelled)
update_board_action_itemPATCH/boards/:boardId/meetings/:meetingId/action-items/:actionItemIdboards:writePartially updates one action item on a meeting (title, notes, assignee, order, status). Only the fields sent change; other fields and other action items are untouched.

Agent Chat

ToolMethodPathScopeDescription
get_agent_conversationGET/boards/:boardId/sections/:sectionName/chatboards:readGet the active agent conversation history for a board section, including messages and extracted data so far.
send_agent_messagePOST/boards/:boardId/sections/:sectionName/chatboards:writeSend a message to the board section agent. The agent helps fill section data through conversation, using persona dossiers and schema knowledge. Returns the agent reply and any extracted field values.
submit_agent_dataPOST/boards/:boardId/sections/:sectionName/chat/submitboards:writeSubmit the data extracted by the agent as a section submission. The agent must have extracted data via conversation before this can be called. The data is validated against the current section schema, as submit_section_data is: invalid data, or any key the section does not declare, is rejected with the errors (and, for unknown keys, the list of valid fields), nothing is stored, and the conversation stays active so the values can be corrected and resubmitted.

Audit Log

ToolMethodPathScopeDescription
get_board_audit_logGET/api/auditlog/:boardIdaudit:readGets the audit trail for a board (oldest first)

Board Context

ToolMethodPathScopeDescription
get_board_contextGET/boards/:boardId/contextboards:readGet everything needed to draft a board pack in one call: board and members with roles, the target meeting (by meetingId, or the next upcoming one) with its agenda (each item with its id and the documents placed on it, null for a token without documents:read; a section holds no documents), the last finalized meeting minutes as text, open action items (owner and status only), and KPI values with their period, prior-period value and canonical ontology definition and source. The board block also carries measurementConventions (the chosen measurement bases, e.g. the contractor FTE factor, with effectiveFrom), and each KPI basisLabel reflects the convention in force for the period of that value. Each KPI is { value, state, reason?, missing?, assumedZero?, valueText }: state known → value is the number (0 is a real 0; assumedZero lists optional lines counted as 0); unknown → value is null and missing names the inputs never entered; undefined → value is null and reason says why the maths has no value (e.g. not_burning). valueText is the plain reading of a non-known value ("Not burning cash", "N/A · cash not entered") — quote it; never restate such a value as 0 or infinite.

Board Cycles

ToolMethodPathScopeDescription
capture_post_meetingPOST/boards/:boardId/cycles/:cycleId/post-meetingcycles:writeCapture post-meeting data (minutes, action items, bets) and transition cycle to post_meeting status. Supports manual entry and AI-extracted sources.
clear_section_stalenessPOST/boards/:boardId/cycles/:cycleId/sections/:sectionName/clear-stalenesscycles:writeClear staleness flags on a section. Pass an optional rogueIds array to clear only matching flags; omit to clear all. Used for the explicit "reviewed, still correct" action.
compile_board_packagePOST/boards/:boardId/cycles/:cycleId/compilecycles:writeCompile all submitted sections into a board package with KPI dashboard, validation results, bet tracking, and previous action items. A numeric KPI never entered stays on the dashboard as an unknown row (state "unknown", value null, display "N/A · not entered"), never 0.
create_betPOST/boards/:boardId/cycles/:cycleId/betscycles:writeCreate a bet tied to a board cycle. Bets are surfaced in future cycles for follow-up tracking.
create_board_cyclePOST/boards/:boardId/cyclescycles:writeCreate a new board prep cycle. Requires title, cadence, and meetingDate. Auto-generates timeline and section assignments from the board schema.
delete_betDELETE/boards/:boardId/bets/:betIdcycles:writeDelete a bet.
delete_board_cycleDELETE/boards/:boardId/cycles/:cycleIdcycles:writeDelete a board prep cycle. Only cycles in draft or cancelled status can be deleted.
dismiss_validation_flagPATCH/boards/:boardId/validation-flags/:flagIdcycles:writeDismiss or explain a validation flag. Set status to "dismissed" (no explanation needed) or "explained" (with explanation that becomes documentation).
dispatch_board_cyclePOST/boards/:boardId/cycles/:cycleId/dispatchcycles:writeDispatch a board prep cycle — notify section owners of their assignments, link previous submissions, and transition cycle to active. Sections with no assigned owner are skipped.
distribute_post_meeting_minutesPOST/boards/:boardId/cycles/:cycleId/post-meeting/distributecycles:writeDistribute post-meeting minutes to all board members via notification. Cycle must be in post_meeting status.
get_board_cycleGET/boards/:boardId/cycles/:cycleIdcycles:readGet a single board prep cycle by ID, including timeline milestones and section assignment statuses.
get_cycle_progressGET/boards/:boardId/cycles/:cycleId/progresscycles:readGet progress summary for a board prep cycle — who's submitted, who hasn't, stats, next deadline, and cross-section dependency warnings.
get_cycle_stalenessGET/boards/:boardId/cycles/:cycleId/stalenesscycles:readGet cross-section staleness state for a board cycle. Returns which sections have shared rogueIds whose values are stale because a sibling section updated them, plus the per-section shared-KPI map for the editor UI.
get_post_meeting_summaryGET/boards/:boardId/cycles/:cycleId/post-meetingcycles:readGet post-meeting summary for a cycle: minutes, action items, and bets created.
get_validation_flagsGET/boards/:boardId/cycles/:cycleId/validation-flagscycles:readGet cross-section validation flags for a cycle. Optionally filter by status (open, dismissed, explained).
list_betsGET/boards/:boardId/betscycles:readList all bets for a board. Optionally filter by status (open, in_progress, completed, missed, deferred).
list_board_cyclesGET/boards/:boardId/cyclescycles:readList board prep cycles for a board. Optionally filter by status (draft, active, collecting, etc.).
run_cross_validationPOST/boards/:boardId/cycles/:cycleId/validatecycles:writeRun cross-section validation for a board prep cycle. Compares shared KPIs across sections and flags discrepancies (e.g., Finance ARR vs Sales ARR).
send_cycle_remindersPOST/boards/:boardId/cycles/:cycleId/remindcycles:writeSend reminder notifications to section owners who haven't submitted yet. Returns count of reminders sent and skipped.
update_betPATCH/boards/:boardId/bets/:betIdcycles:writeUpdate a bet — status, outcome, gap explanation, target date, or owner.
update_board_cyclePATCH/boards/:boardId/cycles/:cycleIdcycles:writeUpdate a board prep cycle (title, cadence, meetingDate, timeline overrides). Changing meetingDate recalculates the timeline.
update_board_cycle_statusPATCH/boards/:boardId/cycles/:cycleId/statuscycles:writeTransition a board prep cycle to a new status. Only valid transitions are allowed (e.g., draft → active → collecting).
update_section_assignment_statusPATCH/boards/:boardId/cycles/:cycleId/assignments/:assignmentId/statuscycles:writeUpdate the status of a section assignment within a board prep cycle (not_started → in_progress → submitted → reviewed → final).

Board Pack

ToolMethodPathScopeDescription
get_board_packGET/boards/:boardId/meetings/:meetingId/board-packdocuments:readGets the board packs published to a meeting: the current (or ?version=n) version's Markdown, hash and publish details, the version history, and — for board collaborators/admins — who has opened it.
publish_to_boardPOST/boards/:boardId/meetings/:meetingId/board-packdocuments:writePublishes a board pack (Markdown) to a board meeting as an immutable, distributed version: stores the content with its SHA-256 hash, marks it distributed to all board members, and returns the version, hash, timestamp and link. Republishing the same title to the same meeting creates the next version; earlier versions stay readable. Requires board collaborator access.

Board Schemas

ToolMethodPathScopeDescription
adopt_rogue_kpiPOST/boards/:boardId/schema/adoptboards:writeAdopt a Rogue KPI into a board schema section. Pins the rogueId and sets a custom label.
create_custom_kpiPOST/boards/:boardId/schema/custom-kpiboards:writeCreate a custom KPI — simultaneously adds it to Rogue as a draft and to the board schema.
get_board_schemaGET/boards/:boardId/schemaboards:readGet the data schema for a specific board.
list_board_schema_versionsGET/boards/:boardId/schema/versionsboards:readList version history for a board schema.
update_board_schemaPUT/boards/:boardId/schemaboards:writeReplace the board schema with a new set of sections and fields.

Board User Unregistered

ToolMethodPathScopeDescription
archive_board_user_unregisteredPOST/boards/:boardId/unregistered-members/:id/archiveboards:writeSoft-delete an unregistered member (sets status to "archived"). Reversible via unarchive. Hard delete is a separate admin action.
create_board_user_unregisteredPOST/boards/:boardId/unregistered-membersboards:writeCreate an unregistered member record on a board. Unregistered members exist as data only and never receive a session or login (#1260 architectural principle); they may receive scoped, single-use meeting-vote links and calendar invites if an email is on file (meeting invites and proposed-slot vote CTAs, #3737). Requires displayName; email, board_position, and notes are optional. Emails are deliverability-gated the same way board invites are — a disposable-domain address is rejected with 400 INVALID_REQUEST_BODY (#3738). displayName must contain at least one letter or number and no control or format characters — a content-free value such as *** is rejected with 400 INVALID_REQUEST_BODY, while non-Latin scripts and apostrophes are accepted. The length cap is measured against the trimmed value (#3750).
dismiss_board_user_unregistered_bounce_flagPOST/boards/:boardId/unregistered-members/:id/dismiss-bounce-flagboards:writeDismiss the persistent-bounce flag on an unregistered member (#1286). Hides the warning in the roster but keeps the underlying flag history. A new qualifying SendGrid bounce/dropped/spam_report/unsubscribe event will resurrect the flag with a fresh flaggedAt timestamp.
list_board_user_unregisteredGET/boards/:boardId/unregistered-membersboards:readList unregistered members on a board. Optional ?status=active|archived|all (default active). Promoted records (with promotedToUserId set) are always excluded.
scrub_board_user_unregisteredPOST/boards/:boardId/unregistered-members/:id/scrubboards:writeData-deletion-on-request: PII-scrub an unregistered member. Replaces displayName with "[Deleted]", clears email/notes, empties board_position, sets status to archived, and locks the record from future edits. Historical KG references stay resolvable but no longer expose PII. Irreversible — to add a fresh record, create a new unregistered member.
unarchive_board_user_unregisteredPOST/boards/:boardId/unregistered-members/:id/unarchiveboards:writeRestore an archived unregistered member (sets status back to "active"). Idempotent on records that are already active.
update_board_user_unregisteredPATCH/boards/:boardId/unregistered-members/:idboards:writeUpdate an unregistered member (displayName, email, board_position, notes). At least one field must be provided. displayName cannot be cleared. Pass null to clear email, board_position, or notes. Changing email to a disposable-domain address is rejected with 400 INVALID_REQUEST_BODY; re-sending the unchanged email is not re-gated (#3738). displayName must contain at least one letter or number and no control or format characters — a content-free value such as *** is rejected with 400 INVALID_REQUEST_BODY, while non-Latin scripts and apostrophes are accepted. The length cap is measured against the trimmed value (#3750).

Boards

ToolMethodPathScopeDescription
assign_member_rolesPUT/api/board/:boardId/members/:userId/rolesboards:writeAssigns roles, positions, access types, and a free-text title to a board member
create_boardPOST/api/boardboards:writeCreates a new board, optionally with company context. A boardless user must provide a first and last name first; otherwise the request is rejected with 409 PROFILE_NAMES_REQUIRED. The board name must contain at least one letter or number and no control or format characters — a content-free name such as *** is rejected with 400, while non-Latin scripts and apostrophes are accepted (#3750).
get_boardGET/boards/:boardIdboards:readReturns details for a specific board
list_board_action_itemsGET/api/board/:boardId/action-itemsboards:readLists action items for a board (open/in-progress by default)
list_boardsGET/boardsboards:readLists boards the authenticated user has access to
search_board_documentsPOST/api/board/:boardId/searchboards:readSemantic search across the board documents the caller may see (management drafts are excluded unless the caller is a board admin, a management member, or the document creator)
update_boardPUT/api/board/:boardIdboards:writeUpdates board details (name, description, settings). The board name must contain at least one letter or number and no control or format characters — a content-free name such as *** is rejected with 400, while non-Latin scripts and apostrophes are accepted (#3750).

Documents

ToolMethodPathScopeDescription
create_documentPOST/api/documents/:boardId/documents:writeCreates a new document with an initial version. An explicitly whitespace-only title is rejected with 400; an omitted title falls back to an auto-derived one (AI-derived → filename → date-default) (#3751). A user-provided or filename-derived title already used by an active document in the same VISIBILITY SCOPE is rejected with 409 DOCUMENT_TITLE_TAKEN, carrying details.suggestedTitle = the first free "<title> (n)" (#3858, scoped by #4105: board-wide titles are compared against board-wide documents, a committee document against its own committee's)
create_document_versionPOST/api/documents/:boardId/:documentId/versiondocuments:writeCreates a new version of a document
delete_documentDELETE/api/documents/:boardId/:documentId/documents:writeDeletes a document from a board. Refused (409 DOCUMENT_PINNED_BY_MEETING; details.meetings lists the meetings you may see) while a completed or finalized meeting keeps the document in its record.
get_documentGET/boards/:boardId/documents/:documentIddocuments:readReturns details for a specific document; a management draft — or a committee-scoped document the caller is not a member of — returns 404 (not 403), so its existence is never disclosed. Committee scope has no board-admin bypass
list_board_documentsGET/boards/:boardId/documentsdocuments:readLists the board documents the caller may see (management drafts are excluded unless the caller is a board admin, a management member, or the document creator; a board access token sees none). Documents scoped to a committee are excluded unless the caller is a member of that committee — board admins and management members do NOT bypass that gate
update_documentPUT/api/documents/:boardId/:documentId/documents:writeUpdates document details (title, meeting associations, working copy link). An explicitly whitespace-only title is rejected with 400; an omitted title leaves the existing title unchanged (#3751). Renaming to a title already used by another active document in the same VISIBILITY SCOPE is rejected with 409 DOCUMENT_TITLE_TAKEN (+ details.suggestedTitle); renaming onto the document's own title is a no-op success (#3858, scoped by #4105)
update_document_statusPUT/api/documents/:boardId/:documentId/statusdocuments:writeChanges a document's status. Statuses only move forward: managementDrafts, then internallyReviewed, then externallyReviewed, then published (steps may be skipped); published is final, and any other change is refused (400, naming the allowed statuses). Only the document's creator can change it (403). While the document is on an agenda item it must stay published: a change to any other status is refused (409 DOCUMENT_ON_AGENDA; details.meetings lists the meetings you may see) until it is removed from those agenda items. To publish a document as you place it on an agenda item, use attach_meeting_document or move_meeting_document with publish: true.

FX

ToolMethodPathScopeDescription
get_fx_ratesGET/api/fx/ratesportfolio:readGets current foreign exchange rates

Invites

ToolMethodPathScopeDescription
accept_invitePUT/api/invite/accept/:boardInviteIdinvites:writeAccepts a board invite. A boardless user must save a first and last name first; otherwise the route returns 409 PROFILE_NAMES_REQUIRED without mutating the invite or membership.
create_invitePOST/api/invite/:boardIdinvites:writeInvites a user to a board by email
decline_invitePUT/api/invite/decline/:boardInviteIdinvites:writeDeclines a board invite
list_board_invitesGET/api/invite/:boardId/invitesinvites:readLists pending invites for a board
retract_invitePUT/api/invite/retract/:boardInviteIdinvites:writeRetracts a sent board invite

KG

ToolMethodPathScopeDescription
get_board_prep_briefGET/boards/:boardId/kg/prep-briefboards:readGet a board preparation brief from the knowledge graph: graph health, advisor history (completed cycles vs the advisor minimum), governance advisories grouped by status (open/dismissed/snoozed/resolved) with per-rule display strings, director question patterns, and narrative themes. Pass ?include=users for a self-contained payload with name + position resolution. Requires advisory audience access (default: CEO, CFO, Chief of Staff) or board owner. Findings about a report the caller may not open (a draft or archived report, unless they are a board admin or internal management) are left out of every status group, and so are findings that reference a dashboard the caller may not open.
get_knowledge_graph_summaryGET/boards/:boardId/kg/summaryboards:readGet knowledge graph index stats for a board: node counts by type, edge count, health metrics (open contradictions, open questions, stale bets), governance coverage gaps, dropped topics, compiled summary, and recent ingestion history. Requires board admin or internal management role.
get_open_itemsGET/boards/:boardId/kg/open-itemsboards:readGet open items from the knowledge graph. Filter by type: "contradictions" (conflicting data across sources), "questions" (unanswered or deferred director questions), or "bets" (approved/proposed decisions pending follow-up). Omit type to get all. Requires board admin or internal management role.
query_knowledge_graphPOST/boards/:boardId/kg/queryboards:readAsk a natural language question against the board knowledge graph. The system retrieves relevant graph data (contradictions, decisions, questions, topics, themes, KPI mentions) and synthesizes an answer using an LLM. Requires board admin or internal management role.

KG Advisory

ToolMethodPathScopeDescription
get_governance_advisoriesGET/boards/:boardId/knowledge-graph/governance-advisoryboards:readList KG governance advisories for a board. Returns all statuses by default (consumer groups by status). Filter via status, ruleType, or limit. Includes a top-level users map resolving any userId references in the response (owner, raisedBy, dismissedBy). Pass reportId to list only findings about one report (use get_report/list_board_reports to find ids). includeCounts: true adds counts next to advisories (open/snoozed/dismissed/resolved, per rule type, highest open severity, last review). On a kpi_consistency advisory, payload.fields names the dashboard and KPI (rogueId) that triggered it (other rule types carry no fields); payload.fields[].value is the value at detection time — compare it with the live dashboard value before telling the user the number is still wrong. sourceCitations carry a human-readable label (e.g. "Report: Q3 2026 Board Report · Customers dashboard") — quote the label, never the raw id. Requires the caller's board position to be in the advisory audience (default CEO, CFO, Chief of Staff); a personal access token acts as its owner, and a board access token cannot read these. Findings about a report the caller may not open (a draft or archived report, unless they are a board admin or internal management) are left out of the list and of counts alike, and so are findings that reference a dashboard the caller may not open.
get_governance_advisory_runsGET/boards/:boardId/knowledge-graph/governance-advisory/runsboards:readList recent KG governance advisory review runs for a board (paginated, newest first). Audit/retro surface. A run's per-rule finding counts (findingCounts) count every finding the run detected, so they are returned only to a caller who sees every advisory on the board (a board admin) and omitted for anyone whose view is narrowed by report visibility or dashboard access.
run_governance_advisory_reviewPOST/boards/:boardId/knowledge-graph/governance-advisory/runboards:writeTrigger a KG governance advisory review pass for a board. Returns status: started once the review is queued — no review ID yet; follow it with get_governance_advisory_runs — or, when a review of this board started in the last 60 s and is still running, status: already_running with its advisoryReviewId. Use after fixing a flagged value to confirm the finding resolves.

Me

ToolMethodPathScopeDescription
get_meGET/meuser:readReturns the authenticated user profile

Meeting Creation Suggestions

ToolMethodPathScopeDescription
accept_meeting_creation_suggestionPOST/boards/:boardId/meeting-creation-suggestions/:suggestionId/acceptmeetings:writeAccepts a suggestion and creates a finalized meeting from extracted document data
dismiss_meeting_creation_suggestionPATCH/boards/:boardId/meeting-creation-suggestions/:suggestionIdmeetings:writeDismisses a meeting creation suggestion
list_board_meeting_creation_suggestionsGET/boards/:boardId/meeting-creation-suggestionsmeetings:readLists pending meeting creation suggestions for a board (from document intelligence)
list_document_meeting_creation_suggestionsGET/boards/:boardId/documents/:documentId/meeting-creation-suggestionsmeetings:readLists pending meeting creation suggestions for a specific document

Meeting Minutes Items

ToolMethodPathScopeDescription
delete_minutes_itemDELETE/boards/:boardId/meetings/:meetingId/minutes/items/:itemIdmeetings:writeDeletes ONE meeting minutes item by id; every other item, the frozen quorum line and all recorded votes are untouched. A finalized meeting's minutes are locked: 409 details.reason MINUTES_LOCKED, nothing changes. An item whose vote is still collecting by link returns 409 BALLOT_COLLECTING. Requires board collaborator access and the right to edit the meeting.
upsert_minutes_itemPUT/boards/:boardId/meetings/:meetingId/minutes/items/:itemIdmeetings:writeAdds or updates ONE meeting minutes item (title, status discussed|approved, order). Only the fields you send change; every other minutes item, the frozen quorum line and any recorded vote are left untouched — this is never a whole-minutes replace. Omit itemId to add a new item (title required; appended after the last one unless you pass order); pass an itemId from get_meeting to update that item, or a new id of your own to add an item safely on retry. Votes cannot be written here; a status that contradicts an item's recorded vote returns 409 details.reason MINUTES_ITEM_STATUS_SET_BY_VOTE. A finalized meeting's minutes are locked: 409 details.reason MINUTES_LOCKED, nothing changes. A minutes editor left open in the app with unsaved changes can still overwrite these writes when it saves. Requires board collaborator access and the right to edit the meeting (organizer, board owner, or a guest allowed to edit).

Meetings

ToolMethodPathScopeDescription
attach_meeting_documentPOST/api/meetings/:boardId/:meetingId/documentsdocuments:writeAttaches a board document to a meeting. Omit agendaItemId to attach it at meeting level, or pass the id of an agenda item (an agenda entry with isSection false, from get_meeting; a section holds no documents) to place it on that item; attaching to an item replaces a meeting-level link, and a document may sit on several items. Attaching to an agenda item publishes the document: an agenda item only holds published documents, so one that is not published yet is refused (409 DOCUMENT_NOT_PUBLISHED) unless you pass publish: true, which publishes it first - only its creator can. Publishing is permanent (every board member can then open the document, and it can no longer be deleted or returned to a draft), so confirm with the user before passing publish: true. At meeting level drafts stay allowed and publish is ignored. 409 when it is already at that placement, or already on items when attaching at meeting level. An agenda-item placement needs the right to edit the meeting and is refused (403) once the meeting is finalized; a meeting-level one needs to be the document's creator, a board admin or a collaborator. Needs a token with documents:write (meetings:write is not enough; board access tokens are refused). Within a meeting a document is either at meeting level or on one or more agenda items. Removing it from its last item returns it to meeting level. Detaching never deletes the document.
build_minutes_from_agendaPOST/api/meetings/:boardId/:meetingId/minutes/from-agendameetings:writeBuilds a meeting's minutes from its agenda (replaces the current minutes items): keeps the Quorum Verification item first, then adds one minutes item per agenda item, plus one per agenda section that has no items, in agenda order, status discussed, each linked to its agenda entry by agendaItemId. A snapshot - later agenda edits do not change the minutes. Refused with 409 when any minutes item already has a recorded vote or the agenda has no items to copy, and with 403 when the meeting is finalized or the caller may not edit it. Returns the meeting.
change_meeting_statusPUT/api/meetings/:boardId/:meetingId/statusmeetings:writeChanges meeting status (draft, planned, scheduled, completed, finalized)
create_meetingPOST/boards/:boardId/meetingsmeetings:writeCreates a new meeting on a board
delete_meetingDELETE/api/meetings/:boardId/:meetingId/meetings:writeDeletes a meeting
detach_meeting_documentDELETE/api/meetings/:boardId/:meetingId/documents/:documentIddocuments:writeDetaches a document from the whole meeting - meeting level and every agenda item; the document itself stays on the board. 404 when it is not linked to the meeting. Needs a token with documents:write (meetings:write is not enough; board access tokens are refused). Within a meeting a document is either at meeting level or on one or more agenda items. Removing it from its last item returns it to meeting level. Detaching never deletes the document.
get_meetingGET/boards/:boardId/meetings/:meetingIdmeetings:readReturns details for a specific meeting, including its minutes (where the caller may read them), its action items, and its agenda in order: each entry with its id, order, title, isSection and the documents on it (id, title). The id of an item (isSection false) is the agendaItemId the meeting-document tools take; a section is a header and holds no documents. documents is null for a board access token or a token without documents:read; meeting-level documents are listed by list_meeting_documents. Another member's draft meeting returns 404.
list_board_meetingsGET/boards/:boardId/meetingsmeetings:readLists meetings for a board with filtering by status and date range. Draft meetings are private to their creator, so status=draft returns only the caller's own drafts and a board access token sees none.
list_meeting_documentsGET/api/meetings/:boardId/:meetingId/documentsdocuments:readLists the documents placed on a meeting that you may see: one row per placement (documentId, title, documentType, documentStatus, activeVersionId, agendaItemId - null at meeting level - order, pinnedVersionId, displayVersionId and hasNewerVersion), in agenda order with meeting-level documents last; a document on two agenda items appears twice. A completed meeting keeps the document versions it had: displayVersionId is the version the meeting shows (its pinnedVersionId, else the active version) - read that one for the meeting's record; hasNewerVersion means the document has a newer version since (use_latest_meeting_document_version switches to it). Needs a token with documents:read (board access tokens are refused). Within a meeting a document is either at meeting level or on one or more agenda items. Removing it from its last item returns it to meeting level. Detaching never deletes the document.
move_meeting_documentPATCH/api/meetings/:boardId/:meetingId/documents/:documentId/movedocuments:writeMoves a document from one placement of a meeting to another: fromAgendaItemId and toAgendaItemId are agenda item ids (entries with isSection false), null for meeting level. Moving a document onto an agenda item publishes it, as attaching does: one that is not published yet is refused (409 DOCUMENT_NOT_PUBLISHED) unless you pass publish: true - only its creator can publish it. Publishing is permanent, so confirm with the user before passing publish: true. 404 when the document is not at the source placement; 409 when it is already at the target, or when moving to meeting level while it is still on other items (use remove_meeting_document_from_item). Needs a token with documents:write (meetings:write is not enough; board access tokens are refused). Within a meeting a document is either at meeting level or on one or more agenda items. Removing it from its last item returns it to meeting level. Detaching never deletes the document.
remove_meeting_document_from_itemDELETE/api/meetings/:boardId/:meetingId/documents/:documentId/agenda-items/:agendaItemIddocuments:writeRemoves a document from ONE agenda item of a meeting; when that was its last item it returns to meeting level (fellBackToMeetingLevel: true). 404 when it is not on that item. Needs a token with documents:write (meetings:write is not enough; board access tokens are refused). Within a meeting a document is either at meeting level or on one or more agenda items. Removing it from its last item returns it to meeting level. Detaching never deletes the document.
reorder_meeting_documentsPUT/api/meetings/:boardId/:meetingId/documents/orderdocuments:writeReorders the documents at ONE placement of a meeting: agendaItemId (an agenda item id, or null for meeting level) and documentIds - every document at that placement you can see, each once, in the new order (400 otherwise, naming the ids that are missing, extra or repeated). Needs a token with documents:write (meetings:write is not enough; board access tokens are refused). Within a meeting a document is either at meeting level or on one or more agenda items. Removing it from its last item returns it to meeting level. Detaching never deletes the document.
update_meetingPATCH/boards/:boardId/meetings/:meetingIdmeetings:writeUpdates an existing meeting. Another member's draft meeting returns 404 and is left unchanged. Setting startTime on a meeting that is still collecting slot votes (draft/planned, no booked time) with open proposed slots returns 409 details.reason SLOT_POLL_OPEN — book via a proposed slot's confirm endpoint or remove the slots first.
use_latest_meeting_document_versionPOST/api/meetings/:boardId/:meetingId/documents/:documentId/use-latestdocuments:writeSwitches one placement of a document on a completed meeting to the document's latest version. A completed meeting keeps showing the document versions it had: each placement is pinned when the meeting completes (or when attached to an already completed meeting), and list_meeting_documents shows hasNewerVersion when the document has changed since. Pass agendaItemId (an agenda item id) or null for the meeting-level placement. The placement stays pinned, now to the latest version, and the change is audited; changed: false when there is nothing to switch. Needs the right to edit the meeting's agenda and is refused (403) once the meeting is finalized - its record is locked; 404 when the document is not at that placement; 409 when the document has no version to switch to. Needs a token with documents:write (meetings:write is not enough; board access tokens are refused). Within a meeting a document is either at meeting level or on one or more agenda items. Removing it from its last item returns it to meeting level. Detaching never deletes the document.

Members

ToolMethodPathScopeDescription
get_board_memberGET/boards/:boardId/members/:memberIdboards:readReturns details for a specific board member
list_board_membersGET/boards/:boardId/membersboards:readLists members of a board

Merge Recommendations

ToolMethodPathScopeDescription
accept_merge_recommendationPOST/boards/:boardId/merge-recommendations/:recommendationId/acceptdocuments:writeAccepts a merge recommendation — moves source versions to target and deletes the standalone entry. Refused (409 DOCUMENT_PINNED_BY_MEETING; details.meetings lists the meetings you may see) while a completed or finalized meeting keeps the source document in its record.
dismiss_merge_recommendationPATCH/boards/:boardId/merge-recommendations/:recommendationIddocuments:writeDismisses a merge recommendation
list_board_merge_recommendationsGET/boards/:boardId/merge-recommendationsdocuments:readLists pending merge recommendations for a board (version detection suggestions)
list_document_merge_recommendationsGET/boards/:boardId/documents/:documentId/merge-recommendationsdocuments:readLists pending merge recommendations for a specific document

Notifications

ToolMethodPathScopeDescription
list_notificationsGET/api/notification/notifications:readLists notifications for the authenticated user
mark_all_notifications_readPUT/api/notification/read/allnotifications:writeMarks all notifications as read
mark_notification_readPUT/api/notification/read/:notificationIdnotifications:writeMarks a single notification as read

Organizational Functions

ToolMethodPathScopeDescription
create_organizational_functionPOST/boards/:boardId/functionsfunctions:writeCreate a new organizational function on a board. Requires name, slug, and optionally owner, members, ownedKpis, ownedSections.
delete_organizational_functionDELETE/boards/:boardId/functions/:slugfunctions:writeDelete an organizational function from a board.
get_organizational_functionGET/boards/:boardId/functions/:slugfunctions:readGet a single organizational function by its slug (e.g., "finance", "sales").
list_organizational_functionsGET/boards/:boardId/functionsfunctions:readList all organizational functions for a board. Functions map people to KPIs and schema sections.
seed_default_organizational_functionsPOST/boards/:boardId/functions/seed-defaultsfunctions:writeSeed the 7 default organizational functions (Finance, Sales, HR, R&D, Product, Legal, Operations) for a board with default KPI ownership from the Rogue catalog. Idempotent — skips functions that already exist.
update_organizational_functionPATCH/boards/:boardId/functions/:slugfunctions:writeUpdate an organizational function. Supports partial updates: name, description, owner, members, ownedKpis, ownedSections.

Orgs

ToolMethodPathScopeDescription
get_org_portfolioGET/orgs/:orgId/portfolioportfolio:readRead a monitoring org's portfolio of boards (up to 5) as one values-dense payload of CURRENT board signals — counts and values only, never board content. Pass detail="full" for the broad per-board projection (metrics, fundraising stage, cadence, member counts) or "summary" for the lean table view. advisories: { open, highestOpenSeverity, byRuleType, lastReviewAt, lastReviewTriggeredBy, advisorPath } or an N/A flag. COUNTS ONLY (open counts include findings on draft, archived or deleted reports, and exclude findings that reference a dashboard, which the portfolio reader can never open) — the findings themselves are visible only to each board's advisory audience; to read them, the caller must be in that audience and use get_governance_advisories on that board. Findings on a draft, archived or deleted report are listed only to a board admin or internal-management member, and findings citing a dashboard only to a viewer who may open it, so that call can return fewer or more findings than open even when viewerCanViewAdvisories is true. A personal access token acts as its owner: each row's board ref carries viewerCanViewAdvisories, true when the token's owner is in that board's audience. advisorPath is the app path a human in the audience can open; prefix it with the app origin (production: https://app.imboard.ai) when you hand it to a person. Read-only.

Persona Dossiers

ToolMethodPathScopeDescription
get_persona_dossierGET/boards/:boardId/dossiers/:functionSlugboards:readGet a per-persona dossier for a board function (e.g., finance, sales, hr, r-and-d). Returns a markdown document with section overview, field-by-field guidance, data acquisition hints, and common pitfalls — designed to guide an LLM in helping the persona fill their board section.

Portfolio

ToolMethodPathScopeDescription
get_portfolio_dataGET/api/portfolio/dataportfolio:readGets portfolio data aggregated across all boards

Reports

ToolMethodPathScopeDescription
create_dashboardPOST/api/reports/:boardId/:reportId/dashboardsreports:writeCreates a custom dashboard in a report
create_dashboard_versionPOST/api/reports/:boardId/:reportId/dashboards/:dashboardId/versionsreports:writeCreates a new version of a dashboard
create_followup_reportPOST/api/reports/:boardId/:reportId/followupreports:writeCreates a follow-up report from an existing report. Rejected with 409 CONFLICT when a periodic report with the exact same period (identical periodStart + periodEnd) already exists on the board — pick a different period. Not retryable.
create_reportPOST/api/reports/:boardIdreports:writeCreates a new report for a board. Rejected with 409 CONFLICT when a periodic report with the exact same period (identical periodStart + periodEnd) already exists on the board — the message names the existing report; choose a different period or delete it. Not retryable.
get_board_feedbackGET/api/reports/:boardId/:reportId/board-feedbackreports:readGets board-level feedback on a report
get_dashboardGET/boards/:boardId/reports/:reportId/dashboards/:dashboardIdreports:readReturns details for a specific dashboard. If the parent report is draft or archived this returns 404 unless the caller is a board admin or internal-management member; board access tokens never qualify.
get_dashboard_chatGET/api/reports/:boardId/:reportId/dashboards/:dashboardId/chatreports:readGets discussion comments on a dashboard
get_historical_metricsGET/api/boards/:boardId/historical-metricsreports:readGets historical KPI data for a dashboard
get_metrics_comparisonGET/api/boards/:boardId/metrics-comparisonreports:readCompares metrics across time periods
get_reportGET/boards/:boardId/reports/:reportIdreports:readReturns details for a specific report. A draft or archived report returns 404 — indistinguishable from a missing report — unless the caller is a board admin or internal-management member; board access tokens never qualify.
get_report_auditGET/api/reports/:boardId/:reportId/audits/:auditIdreports:readGets details of a specific report audit. Findings that reference a dashboard the caller may not open are left out, and summary (totals, severity counts, dashboardsChecked) is recomputed from the findings returned.
get_report_fullGET/boards/:boardId/reports/:reportId/fullreports:readReturns the entire board pack in one call: report metadata plus every dashboard’s latest normalized KPI content (all types — cash, sales, customers, pipeline, fundraising, HR, product, and custom narrative) and deterministic data-quality flags. Use this instead of fetching dashboards one by one. A draft or archived report returns 404 unless the caller is a board admin or internal-management member; board access tokens never qualify.
get_uniform_dashboardsGET/api/reports/:boardId/:reportId/uniform-dashboardsreports:readLists a uniform report's dashboards and their field rogueIds. An archived report returns 404 unless the caller is a board admin or internal-management member; on a draft report the caller sees only the dashboards they own or are authorized on.
list_board_reportsGET/boards/:boardId/reportsreports:readLists reports for a board. Draft and archived reports are omitted unless the caller is a board admin or internal-management member — board access tokens never see them, so a filter on status=draft can legitimately return an empty list.
list_report_auditsGET/api/reports/:boardId/:reportId/auditsreports:readLists audit history for a report. Findings that reference a dashboard the caller may not open are left out, and summary (totals, severity counts, dashboardsChecked) is recomputed from the findings returned.
list_report_dashboardsGET/boards/:boardId/reports/:reportId/dashboardsreports:readLists dashboards for a report. If the parent report is draft or archived this returns 404 (not an empty list) unless the caller is a board admin or internal-management member; board access tokens never qualify.
post_board_feedbackPOST/api/reports/:boardId/:reportId/board-feedbackreports:writePosts board-level feedback on a report
post_dashboard_chatPOST/api/reports/:boardId/:reportId/dashboards/:dashboardId/chatreports:writePosts a comment on a dashboard
promote_report_statusPUT/api/reports/:boardId/:reportId/promotereports:writePromotes report status (draft -> review -> published)
set_uniform_dashboard_fieldsPUT/api/reports/:boardId/:reportId/uniform-dashboards/:dashboardIdreports:writeSets uniform dashboard field values by canonical rogueId
trigger_report_auditPOST/api/reports/:boardId/:reportId/auditreports:writeTriggers an AI audit of a report. Findings that reference a dashboard the caller may not open are left out, and summary (totals, severity counts, dashboardsChecked) is recomputed from the findings returned.
update_dashboard_review_statusPUT/api/reports/:boardId/:reportId/dashboards/:dashboardId/review-statusreports:writeUpdates dashboard review status
update_reportPUT/api/reports/:boardId/:reportIdreports:writeUpdates report details

Rogue Kpis

ToolMethodPathScopeDescription
compare_kpisGET/rogue-kpis/compare—Compare two Rogue KPIs side by side. Pass a and b as canonical rogueIds (e.g. a=fundraising.pre_money_valuation, b=fundraising.post_money_valuation). Returns both full enriched payloads (same shape as get_rogue_kpi, including formula, whyItMatters, interpretationGuidance, relatedKpiIds, and benchmark when mapped) plus a derived relationship block: aReferencesB / bReferencesA (true when one KPI cites the other in its formula or relatedKpiIds), sameDomain, and benchmarkOverlap (medians + comparable flag, null when either KPI lacks a benchmark or units differ). Use this tool when reasoning about how two KPIs interact — direct arithmetic links, intent-vs-realized pairs, or cross-domain comparisons.
create_draft_rogue_kpiPOST/rogue-kpisrogue-kpis:writeCreate a new draft Rogue KPI. Used when a company defines a custom KPI not yet in the catalog.
get_rogue_kpiGET/rogue-kpis/*rogueId—Get a single Rogue KPI by its canonical rogueId (e.g., sales.arr). Returns the full definition plus, when populated, structured AI-consumption fields: formula (plain-text calculation), whyItMatters (board-level significance), interpretationGuidance (how to read a value), and relatedKpiIds (cross-KPI links for follow-up reasoning). When present, also returns the agent-safe computation contract: calculationPolicy (inclusion/exclusion/required-input/edge-case/validation rules an agent applies when computing the KPI from messy data) and metricBasis (machine-filterable measurement axes — timeBasis, moneyBasis, dateBasis, cohortBasis, production); both omitted for KPIs without one. Also includes the industry benchmark distribution (p25/median/p75, source, year) by default when the KPI has a mapped benchmark; the field is omitted for unmapped KPIs. Note (#3408): point lookup by exact rogueId resolves rows of ANY maturity, including draft — drafts are excluded only from list/catalog enumeration (list_rogue_kpis), so a board can keep reading its own custom KPIs by id. When populated, the response also carries basisLabel (the short measurement basis shown under the KPI name), basisDetail (the full basis lines) and meaningChanges (ascending history of definition changes: version, date, summary, compatibility) — before comparing values from different periods or ontology versions, apply each entry's compatibility note.
list_rogue_kpisGET/rogue-kpis—Browse the Rogue KPI catalog. Filter by domain, maturity, stage, or free-text search. Only reviewed rows are served: maturity: draft entries are board-scoped evidence pending editorial review and are excluded from this public catalog (#3408) — a maturity=draft filter returns an empty collection. Each entry includes the canonical definitionSource (published or editorial); when populated, structured AI-consumption fields: formula (plain-text calculation), whyItMatters (what a board reads from it), interpretationGuidance (how to read a value), and relatedKpiIds (other rogueIds it pairs with); and a benchmark distribution (p25/median/p75) when the KPI has a mapped industry reference (omitted otherwise). Rows are LEAN by default — the per-KPI computation contract (calculationPolicy / metricBasis) is NOT included; call get_rogue_kpi for a specific KPI, or pass detail=full to include it on every row (token-heavy on large result sets). Every row (both detail levels) also carries, when populated, basisLabel (short measurement basis, e.g. "live customers, period end"), basisDetail (full basis lines) and meaningChanges (ascending history of changes to what the rogueId means: version, date, summary, compatibility). Check meaningChanges before comparing a KPI's values across periods or ontology versions.

Schema Onboarding

ToolMethodPathScopeDescription
generate_board_schemaPOST/boards/:boardId/schema/generateboards:writeGenerate a board schema from company context. Supports two paths: rogue-template (full generation) and start-lean (selected KPIs only).
get_company_contextGET/boards/:boardId/company-contextboards:readGet the company context (stage, industry, team size, business model, functional leaders) for a board.
put_company_contextPUT/boards/:boardId/company-contextboards:writeSet company context for a board — stage, industry, team size, business model, and which functional leaders exist.

Section Submissions

ToolMethodPathScopeDescription
get_section_submissionGET/boards/:boardId/schema/sections/:sectionName/submissionboards:readGet the latest data submission for a board schema section.
submit_section_dataPOST/boards/:boardId/schema/sections/:sectionName/submitboards:writeSubmit data for a board schema section. data is an object keyed by the rogueIds of the section's declared fields ONLY (read them with get_board_schema); values are validated against each field (type, min/max, allowed values, required). Any key the section does not declare is rejected — free text belongs in a declared text field, never an ad-hoc key. A rejection is a 400 INVALID_REQUEST_BODY that stores nothing; for unknown keys its message names them and lists the valid fields, and error.details carries unknownFields plus validFields (rogueId, label, fieldType, required per field) so the call can be corrected and retried. Send null for a value that is not entered (or to clear it), never 0; 0 means a real, entered zero. An empty or whitespace-only string is stored as null.

Slots

ToolMethodPathScopeDescription
confirm_meeting_slotPOST/boards/:boardId/meetings/:meetingId/slots/:slotId/confirmmeetings:writeConfirms a proposed slot as the meeting scheduled time. Rejected with 409 details.reason MEETING_FINALIZED on a finalized meeting. Confirming the slot whose time the meeting already carries is idempotent — the meeting is returned unchanged.
create_meeting_slotPOST/boards/:boardId/meetings/:meetingId/slotsmeetings:writeProposes a new time slot for a meeting. Rejected with 409 CONFLICT when a second slot would land on the same start time (the existing slot id is returned in details.slotId — treat that as already-proposed rather than retrying), or with 409 details.reason SLOT_VOTES_CLOSED when the meeting is no longer collecting slot votes (its status is past planned) — not retryable.
delete_meeting_slotDELETE/boards/:boardId/meetings/:meetingId/slots/:slotIdmeetings:writeRemoves a proposed time slot from a meeting. Rejected with 409 when the meeting is no longer collecting slots (details.reason SLOT_VOTES_CLOSED) or the slot backs the booked meeting time (details.reason SLOT_IS_PROMOTED); 403 unless the caller is the meeting organizer, the slot’s creator, or the board owner.
list_meeting_slotsGET/boards/:boardId/meetings/:meetingId/slotsmeetings:readLists proposed time slots with vote tallies for a meeting
vote_on_slotPUT/boards/:boardId/meetings/:meetingId/slots/:slotId/votemeetings:writeCasts or updates a vote on a proposed meeting time slot. Rejected with 409 details.reason SLOT_VOTES_CLOSED once the meeting stops collecting votes (status past planned) — not retryable.

Unassigned Attachments

ToolMethodPathScopeDescription
list_unassigned_attachmentsGET/api/unassigned-emails/documents:readLists email attachments awaiting assignment to documents
reject_attachmentPUT/api/unassigned-emails/attachment/:attachmentIddocuments:writeRejects an unassigned email attachment

User

ToolMethodPathScopeDescription
get_storage_usageGET/api/user/storageuser:readReturns storage usage for unassigned email attachments
list_my_boardsGET/api/user/allboardsuser:readLists all board memberships and pending invites for the authenticated user

Advisories

  • get_governance_advisories takes reportId (list only the findings about one report) and includeCounts (true adds counts next to the list: per status, per rule type, the highest open severity and the last review). On a kpi_consistency finding, payload.fields[].value is the value at detection time, not the live value; other rule types carry no fields.
  • get_org_portfolio returns advisory counts only per board, plus viewerCanViewAdvisories on each board ref. Read the findings per board with get_governance_advisories.
  • A board access token (BAT) cannot read advisories: the advisory endpoints return 403 for it. Use a personal access token whose owner is in the board's advisory audience (default CEO, CFO, Chief of Staff).
  • Findings about a draft or archived report follow that report's visibility: only a board admin or an internal-management member gets them. Anyone else in the audience also loses the findings about a deleted report. For them, get_governance_advisories (list and counts) and get_board_prep_brief leave these findings out. Two counts still include them: the get_org_portfolio advisory counts, and each run's per-rule finding counts in get_governance_advisory_runs. Either can be higher than what that person can list.

Example workflows

The MCP server's job is to make agents useful — not to make every API endpoint visible. Three patterns that show up in real chair / CEO / VP-Finance work:

1. Prep the next monthly board package

"For board def456, compile next month's board package: collect the latest dashboard snapshots, list any open commitments still unresolved from last cycle, and surface the top three KPI variances vs. plan. Draft a one-paragraph cover note for the chair."

Behind the scenes the agent typically chains: list_board_cycles → get_board_cycle → compile_board_package → list_commitments → get_dashboard for each dashboard referenced → freeform narrative drafting.

2. Draft an investor update from recent KPI changes

"Look at board def456's last two cycle snapshots. Find KPIs that moved more than 15% in either direction. Group by domain. Write a four-paragraph investor update — opening hook, growth highlights, the one number we missed and why, and what we're focused on next month."

Common chain: list_board_cycles → two get_cycle_progress calls → list_board_documents for context → narrative drafting.

3. Audit commitments before the meeting

"Show me every commitment on board def456 that's overdue or due in the next seven days. Group by owner. For each owner, surface the most recent status update and the original target date. Highlight anyone with three or more overdue items."

Common chain: list_commitments with date filtering → get_board_member for each owner.


Troubleshooting

SymptomLikely causeFix
MCP server missing from the client's server listConfig not loadedConfirm the JSON file is at the right path for your client (see install per client). Restart the client fully (Cmd-Q on macOS for Claude Desktop — closing the window is not enough).
UNAUTHENTICATED / 401 error on every callMissing or malformed tokenVerify IMBOARD_API_TOKEN is set in the client's env block and starts with imb_pat_ (personal) or imb_bat_ (board). Token must be in the env of the MCP server config, not in the prompt.
INVALID_API_TOKEN / 403 errorToken expired, revoked, or scoped too narrowlyCreate a fresh token at Account → API Access (PAT) or Board settings → Access tokens (BAT). If the failing tool requires boards:write and your token is read-only, scope it up.
RESOURCE_NOT_FOUND / 404 on a board you know existsUsing a board token (BAT) against a different boardA BAT only reaches the one board it was minted on; every other board reads as not-found. Use that board's token, or a PAT for cross-board work.
FORBIDDEN on a write tool with a board tokenA BAT is read-only by defaultRead-only board tokens cannot call write tools. Mint a read-write BAT, or use a PAT with the matching write scope.
FORBIDDEN on a specific boardInsufficient board membership or access typeCheck your role on the target board. Some tools require Editor or Admin access.
npx -y @imboard.ai/mcp-server hangs or fails to downloadFirewall / corporate proxy blocking npmjs.orgPre-install: npm install -g @imboard.ai/mcp-server, then in the config replace "command": "npx" + "args": ["-y", "@imboard.ai/mcp-server"] with "command": "imboard-mcp-server" and an empty "args": [].
Tool returns stale dataPersonal token has its own cached identity in the agent's processRestart the MCP server (most clients have a "reload servers" command), or restart the client.
Schema or KPI changes not showing upThe client cached the tool list from the previous server versionReload MCP servers in the client. The server reports its tool list on connect; once reconnected, new tools appear.

Security notes

  • Never commit tokens to source control. Use .env files excluded from git, or your OS keychain. Cursor and Cline both support per-workspace env files; Claude Desktop and Claude Code accept env inline in the config — those config files should themselves be outside any tracked repo.
  • Use short-lived, narrowly-scoped tokens. Create one token per tool so you can revoke them independently when a laptop is lost or a contract ends.
  • Audit access regularly. The same Account → API Access page lists every active token with last-used timestamps.

On this page