MCP — install & tool reference
Install the I'mBoard 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
| Approach | Best For |
|---|---|
| REST API (curl, SDK) | Custom integrations, CI/CD, programmatic access |
| CLI | Quick 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.
1. Get a token
The MCP server authenticates with an I'mBoard API token. There are two kinds, and which one you pick changes what the agent can reach:
| Token | Prefix | Identity | Reach | Use for |
|---|---|---|---|---|
| Personal access token (PAT) | imb_pat_ | Acts as you | Every board you can access, plus your profile and portfolio | Your own agent across all your boards |
| Board access token (BAT) | imb_bat_ | A board service principal — no user identity | A single board only, read-only by default | A 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)
- Open I'mBoard and navigate to Account → API Access.
- Click Create Token.
- 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. - 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.
- 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.)
- Click Create board access token and name it after the agent (e.g.
acme-reporting-bot). - Choose a scope preset — Read only (default) or Read & write (read + write this board; never create/delete boards) — and an expiry.
- 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 uses the same npm package (@imboard.ai/mcp-server) over stdio transport. 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 identitytransport— install command (npx -y @imboard.ai/mcp-server) and the env vars the client must set (IMBOARD_API_BASE_URL,IMBOARD_API_TOKEN)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 with no configuration change beyond the token value itself. Choosing the right token is purely a permissions decision:
| Personal access token (PAT) | Board access token (BAT) | |
|---|---|---|
| Prefix | imb_pat_ | imb_bat_ |
| Minted from | Account → API Access | Board settings → Access tokens (owners/admins) |
| Identity | Acts as you | Service principal — no user; get_me / list_my_boards are out of scope |
| Board reach | Every board you can access | Exactly one board — the board it was minted on |
| Other boards | Visible | Not-found (existence is not even leaked) |
| Default permissions | You choose Read-only or Full access | Read-only preset by default |
| Cross-board / portfolio | get_portfolio_data available with portfolio:read | Never — portfolio and other-board data are unreachable |
| Lifecycle owner | You | The 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).
-
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'. -
Export the disposable BAT:
export BAT="imb_bat_YOUR_BOARD_TOKEN"Confirm what the token is before you go further —
whoamiechoes 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." } -
Read the token's own board — expect
200with 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 -
Read a different board with the same token — expect
404(not-found, not403):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) -
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_meetingsand returns the meetings. Then ask it to list meetings forOTHER_BOARD_ID— it gets a not-found error and cannot see that board. -
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. 140 tools across 29 domains.
Action Items
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
create_action_item | POST | /boards/:boardId/meetings/:meetingId/action-items | boards:write | Creates an action item on a meeting. Requires board collaborator access. Items created via an API token are attributed to the agent. |
list_my_action_items | GET | /api/action-items/my | boards:read | Lists action items assigned to the authenticated user across all boards |
update_action_item_status | PATCH | /api/action-items/:actionItemId/status | boards:write | Updates an action item status (in_progress, completed, cancelled) |
Agent Chat
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
get_agent_conversation | GET | /boards/:boardId/sections/:sectionName/chat | boards:read | Get the active agent conversation history for a board section, including messages and extracted data so far. |
send_agent_message | POST | /boards/:boardId/sections/:sectionName/chat | boards:write | Send 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_data | POST | /boards/:boardId/sections/:sectionName/chat/submit | boards:write | Submit the data extracted by the agent as a section submission. The agent must have extracted data via conversation before this can be called. |
Audit Log
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
get_board_audit_log | GET | /api/auditlog/:boardId | audit:read | Gets the audit trail for a board |
Board Cycles
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
capture_post_meeting | POST | /boards/:boardId/cycles/:cycleId/post-meeting | cycles:write | Capture post-meeting data (minutes, action items, commitments) and transition cycle to post_meeting status. Supports manual entry and AI-extracted sources. |
clear_section_staleness | POST | /boards/:boardId/cycles/:cycleId/sections/:sectionName/clear-staleness | cycles:write | Clear 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_package | POST | /boards/:boardId/cycles/:cycleId/compile | cycles:write | Compile all submitted sections into a board package with KPI dashboard, validation results, commitment tracking, and previous action items. |
create_board_cycle | POST | /boards/:boardId/cycles | cycles:write | Create a new board prep cycle. Requires title, cadence, and meetingDate. Auto-generates timeline and section assignments from the board schema. |
create_commitment | POST | /boards/:boardId/cycles/:cycleId/commitments | cycles:write | Create a commitment tied to a board cycle. Commitments are surfaced in future cycles for follow-up tracking. |
delete_board_cycle | DELETE | /boards/:boardId/cycles/:cycleId | cycles:write | Delete a board prep cycle. Only cycles in draft or cancelled status can be deleted. |
delete_commitment | DELETE | /boards/:boardId/commitments/:commitmentId | cycles:write | Delete a commitment. |
dismiss_validation_flag | PATCH | /boards/:boardId/validation-flags/:flagId | cycles:write | Dismiss or explain a validation flag. Set status to "dismissed" (no explanation needed) or "explained" (with explanation that becomes documentation). |
dispatch_board_cycle | POST | /boards/:boardId/cycles/:cycleId/dispatch | cycles:write | Dispatch 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_minutes | POST | /boards/:boardId/cycles/:cycleId/post-meeting/distribute | cycles:write | Distribute post-meeting minutes to all board members via notification. Cycle must be in post_meeting status. |
get_board_cycle | GET | /boards/:boardId/cycles/:cycleId | cycles:read | Get a single board prep cycle by ID, including timeline milestones and section assignment statuses. |
get_cycle_progress | GET | /boards/:boardId/cycles/:cycleId/progress | cycles:read | Get progress summary for a board prep cycle — who's submitted, who hasn't, stats, next deadline, and cross-section dependency warnings. |
get_cycle_staleness | GET | /boards/:boardId/cycles/:cycleId/staleness | cycles:read | Get 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_summary | GET | /boards/:boardId/cycles/:cycleId/post-meeting | cycles:read | Get post-meeting summary for a cycle: minutes, action items, and commitments created. |
get_validation_flags | GET | /boards/:boardId/cycles/:cycleId/validation-flags | cycles:read | Get cross-section validation flags for a cycle. Optionally filter by status (open, dismissed, explained). |
list_board_cycles | GET | /boards/:boardId/cycles | cycles:read | List board prep cycles for a board. Optionally filter by status (draft, active, collecting, etc.). |
list_commitments | GET | /boards/:boardId/commitments | cycles:read | List all commitments for a board. Optionally filter by status (open, in_progress, completed, missed, deferred). |
run_cross_validation | POST | /boards/:boardId/cycles/:cycleId/validate | cycles:write | Run 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_reminders | POST | /boards/:boardId/cycles/:cycleId/remind | cycles:write | Send reminder notifications to section owners who haven't submitted yet. Returns count of reminders sent and skipped. |
update_board_cycle | PATCH | /boards/:boardId/cycles/:cycleId | cycles:write | Update a board prep cycle (title, cadence, meetingDate, timeline overrides). Changing meetingDate recalculates the timeline. |
update_board_cycle_status | PATCH | /boards/:boardId/cycles/:cycleId/status | cycles:write | Transition a board prep cycle to a new status. Only valid transitions are allowed (e.g., draft → active → collecting). |
update_commitment | PATCH | /boards/:boardId/commitments/:commitmentId | cycles:write | Update a commitment — status, outcome, gap explanation, target date, or owner. |
update_section_assignment_status | PATCH | /boards/:boardId/cycles/:cycleId/assignments/:assignmentId/status | cycles:write | Update the status of a section assignment within a board prep cycle (not_started → in_progress → submitted → reviewed → final). |
Board Schemas
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
adopt_rogue_kpi | POST | /boards/:boardId/schema/adopt | boards:write | Adopt a Rogue KPI into a board schema section. Pins the rogueId and sets a custom label. |
create_custom_kpi | POST | /boards/:boardId/schema/custom-kpi | boards:write | Create a custom KPI — simultaneously adds it to Rogue as a draft and to the board schema. |
get_board_schema | GET | /boards/:boardId/schema | boards:read | Get the data schema for a specific board. |
list_board_schema_versions | GET | /boards/:boardId/schema/versions | boards:read | List version history for a board schema. |
update_board_schema | PUT | /boards/:boardId/schema | boards:write | Replace the board schema with a new set of sections and fields. |
Board User Unregistered
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
archive_board_user_unregistered | POST | /boards/:boardId/unregistered-members/:id/archive | boards:write | Soft-delete an unregistered member (sets status to "archived"). Reversible via unarchive. Hard delete is a separate admin action. |
create_board_user_unregistered | POST | /boards/:boardId/unregistered-members | boards:write | Create an unregistered member record on a board. Unregistered members exist as data only — they never receive a session, login, or scoped URL (#1260 architectural principle). Requires displayName; email, board_position, and notes are optional. |
dismiss_board_user_unregistered_bounce_flag | POST | /boards/:boardId/unregistered-members/:id/dismiss-bounce-flag | boards:write | Dismiss 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_unregistered | GET | /boards/:boardId/unregistered-members | boards:read | List unregistered members on a board. Optional ?status=active|archived|all (default active). Promoted records (with promotedToUserId set) are always excluded. |
scrub_board_user_unregistered | POST | /boards/:boardId/unregistered-members/:id/scrub | boards:write | Data-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_unregistered | POST | /boards/:boardId/unregistered-members/:id/unarchive | boards:write | Restore an archived unregistered member (sets status back to "active"). Idempotent on records that are already active. |
update_board_user_unregistered | PATCH | /boards/:boardId/unregistered-members/:id | boards:write | Update 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. |
Boards
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
assign_member_roles | PUT | /api/board/:boardId/members/:userId/roles | boards:write | Assigns roles, positions, and access types to a board member |
create_board | POST | /api/board | boards:write | Creates a new board, optionally with company context |
get_board | GET | /boards/:boardId | boards:read | Returns details for a specific board |
list_board_action_items | GET | /api/board/:boardId/action-items | boards:read | Lists action items for a board (open/in-progress by default) |
list_boards | GET | /boards | boards:read | Lists boards the authenticated user has access to |
search_board_documents | POST | /api/board/:boardId/search | boards:read | Semantic search across all documents in a board |
update_board | PUT | /api/board/:boardId | boards:write | Updates board details (name, description, settings) |
update_board_action_item | PATCH | /api/board/:boardId/action-items/:actionItemId | boards:write | Updates action item status (in_progress, completed, cancelled) |
Documents
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
create_document | POST | /api/documents/:boardId/ | documents:write | Creates a new document with an initial version |
create_document_version | POST | /api/documents/:boardId/:documentId/version | documents:write | Creates a new version of a document |
delete_document | DELETE | /api/documents/:boardId/:documentId/ | documents:write | Deletes a document from a board |
get_document | GET | /boards/:boardId/documents/:documentId | documents:read | Returns details for a specific document |
list_board_documents | GET | /boards/:boardId/documents | documents:read | Lists documents for a board |
update_document | PUT | /api/documents/:boardId/:documentId/ | documents:write | Updates document details (title, meeting associations, working copy link) |
update_document_status | PUT | /api/documents/:boardId/:documentId/status | documents:write | Changes document status (draft, review, approved, etc.) |
FX
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
get_fx_rates | GET | /api/fx/rates | portfolio:read | Gets current foreign exchange rates |
Invites
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
accept_invite | PUT | /api/invite/accept/:boardInviteId | invites:write | Accepts a board invite |
create_invite | POST | /api/invite/:boardId | invites:write | Invites a user to a board by email |
decline_invite | PUT | /api/invite/decline/:boardInviteId | invites:write | Declines a board invite |
list_board_invites | GET | /api/invite/:boardId/invites | invites:read | Lists pending invites for a board |
retract_invite | PUT | /api/invite/retract/:boardInviteId | invites:write | Retracts a sent board invite |
KG
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
get_board_prep_brief | GET | /boards/:boardId/kg/prep-brief | boards:read | Get a board preparation brief from the knowledge graph: graph health, governance advisories grouped by status (open/dismissed/snoozed/resolved) with per-rule display strings, open textual contradictions, 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. |
get_knowledge_graph_summary | GET | /boards/:boardId/kg/summary | boards:read | Get knowledge graph index stats for a board: node counts by type, edge count, health metrics (open contradictions, open questions, stale commitments), governance coverage gaps, dropped topics, compiled summary, and recent ingestion history. Requires board admin or internal management role. |
get_open_items | GET | /boards/:boardId/kg/open-items | boards:read | Get open items from the knowledge graph. Filter by type: "contradictions" (conflicting data across sources), "questions" (unanswered or deferred director questions), or "commitments" (approved/proposed decisions pending follow-up). Omit type to get all. Requires board admin or internal management role. |
query_knowledge_graph | POST | /boards/:boardId/kg/query | boards:read | Ask 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
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
get_governance_advisories | GET | ? | boards:read | List KG governance advisories for a board. Returns all statuses by default; use ?status=, ?ruleType=, ?limit=, ?offset= to filter. Requires audience access (default: ceo, cfo, chief of staff). |
get_governance_advisory_runs | GET | ? | boards:read | List recent KG governance advisory review runs for a board (paginated, newest first). Audit/retro surface. |
run_governance_advisory_review | POST | ? | boards:write | Trigger a KG governance advisory review pass for a board. Returns immediately with the review ID. A 60s soft check returns the in-flight review if one already started in the last minute. |
Me
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
get_me | GET | /me | user:read | Returns the authenticated user profile |
Meeting Creation Suggestions
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
accept_meeting_creation_suggestion | POST | /boards/:boardId/meeting-creation-suggestions/:suggestionId/accept | meetings:write | Accepts a suggestion and creates a finalized meeting from extracted document data |
dismiss_meeting_creation_suggestion | PATCH | /boards/:boardId/meeting-creation-suggestions/:suggestionId | meetings:write | Dismisses a meeting creation suggestion |
list_board_meeting_creation_suggestions | GET | /boards/:boardId/meeting-creation-suggestions | meetings:read | Lists pending meeting creation suggestions for a board (from document intelligence) |
list_document_meeting_creation_suggestions | GET | /boards/:boardId/documents/:documentId/meeting-creation-suggestions | meetings:read | Lists pending meeting creation suggestions for a specific document |
Meetings
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
change_meeting_status | PUT | /api/meetings/:boardId/:meetingId/status | meetings:write | Changes meeting status (draft, planned, scheduled, completed, finalized) |
create_meeting | POST | /boards/:boardId/meetings | meetings:write | Creates a new meeting on a board |
delete_meeting | DELETE | /api/meetings/:boardId/:meetingId/ | meetings:write | Deletes a meeting |
get_meeting | GET | /boards/:boardId/meetings/:meetingId | meetings:read | Returns details for a specific meeting |
list_board_meetings | GET | /boards/:boardId/meetings | meetings:read | Lists meetings for a board with filtering by status and date range |
update_meeting | PATCH | /boards/:boardId/meetings/:meetingId | meetings:write | Updates an existing meeting |
Members
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
get_board_member | GET | /boards/:boardId/members/:memberId | boards:read | Returns details for a specific board member |
list_board_members | GET | /boards/:boardId/members | boards:read | Lists members of a board |
Merge Recommendations
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
accept_merge_recommendation | POST | /boards/:boardId/merge-recommendations/:recommendationId/accept | documents:write | Accepts a merge recommendation — moves source versions to target and deletes the standalone entry |
dismiss_merge_recommendation | PATCH | /boards/:boardId/merge-recommendations/:recommendationId | documents:write | Dismisses a merge recommendation |
list_board_merge_recommendations | GET | /boards/:boardId/merge-recommendations | documents:read | Lists pending merge recommendations for a board (version detection suggestions) |
list_document_merge_recommendations | GET | /boards/:boardId/documents/:documentId/merge-recommendations | documents:read | Lists pending merge recommendations for a specific document |
Notifications
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
list_notifications | GET | /api/notification/ | notifications:read | Lists notifications for the authenticated user |
mark_all_notifications_read | PUT | /api/notification/read/all | notifications:write | Marks all notifications as read |
mark_notification_read | PUT | /api/notification/read/:notificationId | notifications:write | Marks a single notification as read |
Organizational Functions
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
create_organizational_function | POST | /boards/:boardId/functions | functions:write | Create a new organizational function on a board. Requires name, slug, and optionally owner, members, ownedKpis, ownedSections. |
delete_organizational_function | DELETE | /boards/:boardId/functions/:slug | functions:write | Delete an organizational function from a board. |
get_organizational_function | GET | /boards/:boardId/functions/:slug | functions:read | Get a single organizational function by its slug (e.g., "finance", "sales"). |
list_organizational_functions | GET | /boards/:boardId/functions | functions:read | List all organizational functions for a board. Functions map people to KPIs and schema sections. |
seed_default_organizational_functions | POST | /boards/:boardId/functions/seed-defaults | functions:write | Seed 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_function | PATCH | /boards/:boardId/functions/:slug | functions:write | Update an organizational function. Supports partial updates: name, description, owner, members, ownedKpis, ownedSections. |
Orgs
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
get_org_portfolio | GET | /orgs/:orgId/portfolio | portfolio:read | Read 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. Read-only. |
Persona Dossiers
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
get_persona_dossier | GET | /boards/:boardId/dossiers/:functionSlug | boards:read | Get 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
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
get_portfolio_data | GET | /api/portfolio/data | portfolio:read | Gets portfolio data aggregated across all boards |
Reports
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
create_dashboard | POST | /api/reports/:boardId/:reportId/dashboards | reports:write | Creates a custom dashboard in a report |
create_dashboard_version | POST | /api/reports/:boardId/:reportId/dashboards/:dashboardId/versions | reports:write | Creates a new version of a dashboard |
create_followup_report | POST | /api/reports/:boardId/:reportId/followup | reports:write | Creates a follow-up report from an existing report |
create_report | POST | /api/reports/:boardId | reports:write | Creates a new report for a board |
get_board_feedback | GET | /api/reports/:boardId/:reportId/board-feedback | reports:read | Gets board-level feedback on a report |
get_dashboard | GET | /boards/:boardId/reports/:reportId/dashboards/:dashboardId | reports:read | Returns details for a specific dashboard |
get_dashboard_chat | GET | /api/reports/:boardId/:reportId/dashboards/:dashboardId/chat | reports:read | Gets discussion comments on a dashboard |
get_historical_metrics | GET | /api/boards/:boardId/historical-metrics | reports:read | Gets historical KPI data for a dashboard |
get_metrics_comparison | GET | /api/boards/:boardId/metrics-comparison | reports:read | Compares metrics across time periods |
get_report | GET | /boards/:boardId/reports/:reportId | reports:read | Returns details for a specific report |
get_report_audit | GET | /api/reports/:boardId/:reportId/audits/:auditId | reports:read | Gets details of a specific report audit |
get_report_full | GET | /boards/:boardId/reports/:reportId/full | reports:read | Returns 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. |
get_uniform_dashboards | GET | /api/reports/:boardId/:reportId/uniform-dashboards | reports:read | Lists a uniform report's dashboards and their field rogueIds |
list_board_reports | GET | /boards/:boardId/reports | reports:read | Lists reports for a board |
list_report_audits | GET | /api/reports/:boardId/:reportId/audits | reports:read | Lists audit history for a report |
list_report_dashboards | GET | /boards/:boardId/reports/:reportId/dashboards | reports:read | Lists dashboards for a report |
post_board_feedback | POST | /api/reports/:boardId/:reportId/board-feedback | reports:write | Posts board-level feedback on a report |
post_dashboard_chat | POST | /api/reports/:boardId/:reportId/dashboards/:dashboardId/chat | reports:write | Posts a comment on a dashboard |
promote_report_status | PUT | /api/reports/:boardId/:reportId/promote | reports:write | Promotes report status (draft -> review -> published) |
set_uniform_dashboard_fields | PUT | /api/reports/:boardId/:reportId/uniform-dashboards/:dashboardId | reports:write | Sets uniform dashboard field values by canonical rogueId |
trigger_report_audit | POST | /api/reports/:boardId/:reportId/audit | reports:write | Triggers an AI audit of a report |
update_dashboard_review_status | PUT | /api/reports/:boardId/:reportId/dashboards/:dashboardId/review-status | reports:write | Updates dashboard review status |
update_report | PUT | /api/reports/:boardId/:reportId | reports:write | Updates report details |
Rogue Kpis
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
compare_kpis | GET | /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_kpi | POST | /rogue-kpis | rogue-kpis:write | Create a new draft Rogue KPI. Used when a company defines a custom KPI not yet in the catalog. |
get_rogue_kpi | GET | /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. |
list_rogue_kpis | GET | /rogue-kpis | — | Browse the Rogue KPI catalog. Filter by domain, maturity, stage, or free-text search. 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). |
Schema Onboarding
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
generate_board_schema | POST | /boards/:boardId/schema/generate | boards:write | Generate a board schema from company context. Supports two paths: rogue-template (full generation) and start-lean (selected KPIs only). |
get_company_context | GET | /boards/:boardId/company-context | boards:read | Get the company context (stage, industry, team size, business model, functional leaders) for a board. |
put_company_context | PUT | /boards/:boardId/company-context | boards:write | Set company context for a board — stage, industry, team size, business model, and which functional leaders exist. |
Section Submissions
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
get_section_submission | GET | /boards/:boardId/schema/sections/:sectionName/submission | boards:read | Get the latest data submission for a board schema section. |
submit_section_data | POST | /boards/:boardId/schema/sections/:sectionName/submit | boards:write | Submit data for a board schema section. Validates against the schema and stores the submission. |
Slots
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
confirm_meeting_slot | POST | /boards/:boardId/meetings/:meetingId/slots/:slotId/confirm | meetings:write | Confirms a proposed slot as the meeting scheduled time |
create_meeting_slot | POST | /boards/:boardId/meetings/:meetingId/slots | meetings:write | Proposes a new time slot for a meeting |
delete_meeting_slot | DELETE | /boards/:boardId/meetings/:meetingId/slots/:slotId | meetings:write | Removes a proposed time slot from a meeting |
list_meeting_slots | GET | /boards/:boardId/meetings/:meetingId/slots | meetings:read | Lists proposed time slots with vote tallies for a meeting |
vote_on_slot | PUT | /boards/:boardId/meetings/:meetingId/slots/:slotId/vote | meetings:write | Casts or updates a vote on a proposed meeting time slot |
Unassigned Attachments
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
list_unassigned_attachments | GET | /api/unassigned-emails/ | documents:read | Lists email attachments awaiting assignment to documents |
reject_attachment | PUT | /api/unassigned-emails/attachment/:attachmentId | documents:write | Rejects an unassigned email attachment |
User
| Tool | Method | Path | Scope | Description |
|---|---|---|---|---|
get_storage_usage | GET | /api/user/storage | user:read | Returns storage usage for unassigned email attachments |
list_my_boards | GET | /api/user/allboards | user:read | Lists all board memberships and pending invites for the authenticated user |
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
def456that'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
| Symptom | Likely cause | Fix |
|---|---|---|
| MCP server missing from the client's server list | Config not loaded | Confirm 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 call | Missing or malformed token | Verify 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 error | Token expired, revoked, or scoped too narrowly | Create 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 exists | Using a board token (BAT) against a different board | A 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 token | A BAT is read-only by default | Read-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 board | Insufficient board membership or access type | Check your role on the target board. Some tools require Editor or Admin access. |
npx -y @imboard.ai/mcp-server hangs or fails to download | Firewall / corporate proxy blocking npmjs.org | Pre-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 data | Personal token has its own cached identity in the agent's process | Restart the MCP server (most clients have a "reload servers" command), or restart the client. |
| Schema or KPI changes not showing up | The client cached the tool list from the previous server version | Reload 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
.envfiles 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.