AgileHero

MCP server documentation

AgileHero ships a built-in MCP server: connect any MCP-capable AI assistant with a personal token and it works your projects with exactly your permissions — 49 tools across boards, backlog, epics, wiki, whiteboards, retrospectives, and roadmap. This reference is generated from the server itself, so it is always current.

Connect your AI client

Three facts are all any MCP client needs. Create a token in the app under Settings → MCP Server: pick your client there and the config below comes back with the token already filled in. Tokens are shown once and stored only as a hash; make one per client so you can revoke them one at a time.

Endpoint
https://api.agilehero.io/mcp
Transport
Streamable HTTP (POST)
Authentication
Authorization: Bearer <token> — a personal token, one per client

Claude Code

Run once in a terminal; Claude Code stores the server in your user-level config.

claude mcp add --transport http --scope user agilehero https://api.agilehero.io/mcp \
  --header "Authorization: Bearer <YOUR_TOKEN>"

Use an environment variable instead

export AGILEHERO_MCP_TOKEN=<YOUR_TOKEN>
claude mcp add --transport http --scope user agilehero https://api.agilehero.io/mcp \
  --header 'Authorization: Bearer ${AGILEHERO_MCP_TOKEN}'
  • All flags must come before the server name.

Verify: Run claude mcp list — agilehero should show as connected. If it connects but lists no tools, update Claude Code (older builds dropped custom headers).

Claude Code documentation · verified against the vendor docs on 2026-09-09

Cursor

Add to ~/.cursor/mcp.json for every project, or .cursor/mcp.json inside one project.

~/.cursor/mcp.json

{
  "mcpServers": {
    "agilehero": {
      "url": "https://api.agilehero.io/mcp",
      "headers": { "Authorization": "Bearer <YOUR_TOKEN>" }
    }
  }
}

Use an environment variable instead

{
  "mcpServers": {
    "agilehero": {
      "url": "https://api.agilehero.io/mcp",
      "headers": { "Authorization": "Bearer ${env:AGILEHERO_MCP_TOKEN}" }
    }
  }
}

Verify: Open Cursor → Settings → MCP: agilehero should be switched on and list its tools.

Cursor documentation · verified against the vendor docs on 2026-09-09

VS Code (GitHub Copilot)

Add to .vscode/mcp.json in a workspace, or run "MCP: Open User Configuration" for all workspaces.

.vscode/mcp.json

{
  "servers": {
    "agilehero": {
      "type": "http",
      "url": "https://api.agilehero.io/mcp",
      "headers": { "Authorization": "Bearer <YOUR_TOKEN>" }
    }
  }
}

Prompt for the token instead of storing it in the file

{
  "inputs": [
    {
      "type": "promptString",
      "id": "agilehero-token",
      "description": "AgileHero MCP token",
      "password": true
    }
  ],
  "servers": {
    "agilehero": {
      "type": "http",
      "url": "https://api.agilehero.io/mcp",
      "headers": { "Authorization": "Bearer ${input:agilehero-token}" }
    }
  }
}
  • "type": "http" is required — without it VS Code treats the URL as a command to run.

Verify: Run "MCP: List Servers", start agilehero, and check that its tools appear in the Chat view.

VS Code (GitHub Copilot) documentation · verified against the vendor docs on 2026-09-09

Codex

Add to ~/.codex/config.toml — shared by the Codex CLI, the IDE extension, and the ChatGPT desktop app.

~/.codex/config.toml

[mcp_servers.agilehero]
url = "https://api.agilehero.io/mcp"
http_headers = { Authorization = "Bearer <YOUR_TOKEN>" }

Use an environment variable instead

# shell profile
export AGILEHERO_MCP_TOKEN=<YOUR_TOKEN>

# ~/.codex/config.toml
[mcp_servers.agilehero]
url = "https://api.agilehero.io/mcp"
bearer_token_env_var = "AGILEHERO_MCP_TOKEN"
  • Restart Codex after editing the file.

Verify: Restart Codex and ask it to list your AgileHero projects — the first successful call confirms the connection.

Codex documentation · verified against the vendor docs on 2026-09-09

Claude Desktop

Claude Desktop reaches remote servers through the mcp-remote bridge in claude_desktop_config.json (needs Node.js).

claude_desktop_config.json (Settings → Developer → Edit Config)

{
  "mcpServers": {
    "agilehero": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://api.agilehero.io/mcp", "--header", "Authorization:${AGILEHERO_AUTH}"],
      "env": { "AGILEHERO_AUTH": "Bearer <YOUR_TOKEN>" }
    }
  }
}
  • Keep Authorization:${AGILEHERO_AUTH} without a space after the colon — the bridge splits arguments on spaces, and the environment variable carries the space inside its value.
  • Custom connectors (Settings → Connectors → Add custom connector) can take the token as a request header, but that option is in beta for a limited set of organizations. When you see a "Request headers" section: URL https://api.agilehero.io/mcp, Authentication "None", header authorization = Bearer <your token>. Never enter one token for a whole organization — every call runs as the token's owner.

Verify: Restart Claude Desktop — agilehero appears in the tools menu of a new chat.

Claude Desktop documentation · verified against the vendor docs on 2026-09-09

Gemini CLI

Add to ~/.gemini/settings.json, or add it from the terminal.

~/.gemini/settings.json

{
  "mcpServers": {
    "agilehero": {
      "httpUrl": "https://api.agilehero.io/mcp",
      "headers": { "Authorization": "Bearer <YOUR_TOKEN>" }
    }
  }
}

Or add it from the terminal

gemini mcp add --transport http --header "Authorization: Bearer <YOUR_TOKEN>" agilehero https://api.agilehero.io/mcp
  • Use httpUrl, not url — url selects the legacy SSE transport.

Verify: Run /mcp inside Gemini CLI — agilehero should be listed with its tools.

Gemini CLI documentation · verified against the vendor docs on 2026-09-09

Zed

Add to settings.json, or use Settings → AI → MCP Servers → Add Remote Server.

~/.config/zed/settings.json

{
  "context_servers": {
    "agilehero": {
      "url": "https://api.agilehero.io/mcp",
      "headers": { "Authorization": "Bearer <YOUR_TOKEN>" }
    }
  }
}

Verify: Restart Zed and ask it to list your AgileHero projects — the first successful call confirms the connection.

Zed documentation · verified against the vendor docs on 2026-09-09

Cline

Add to Cline's MCP settings (MCP Servers panel → Configure), or ~/.cline/mcp.json for the CLI.

cline_mcp_settings.json

{
  "mcpServers": {
    "agilehero": {
      "type": "streamableHttp",
      "url": "https://api.agilehero.io/mcp",
      "headers": { "Authorization": "Bearer <YOUR_TOKEN>" }
    }
  }
}
  • "type": "streamableHttp" is required — without it Cline falls back to legacy SSE.

Verify: Restart Cline and ask it to list your AgileHero projects — the first successful call confirms the connection.

Cline documentation · verified against the vendor docs on 2026-09-09

OpenCode

Add to opencode.json (project) or the global OpenCode config.

opencode.json

{
  "mcp": {
    "agilehero": {
      "type": "remote",
      "url": "https://api.agilehero.io/mcp",
      "headers": { "Authorization": "Bearer <YOUR_TOKEN>" },
      "enabled": true
    }
  }
}

Use an environment variable instead

{
  "mcp": {
    "agilehero": {
      "type": "remote",
      "url": "https://api.agilehero.io/mcp",
      "headers": { "Authorization": "Bearer {env:AGILEHERO_MCP_TOKEN}" },
      "enabled": true
    }
  }
}

Verify: Restart OpenCode and ask it to list your AgileHero projects — the first successful call confirms the connection.

OpenCode documentation · verified against the vendor docs on 2026-09-09

Google Antigravity

Add to ~/.gemini/config/mcp_config.json, or Settings → Customizations → Installed MCP Servers.

~/.gemini/config/mcp_config.json

{
  "mcpServers": {
    "agilehero": {
      "serverUrl": "https://api.agilehero.io/mcp",
      "headers": { "Authorization": "Bearer <YOUR_TOKEN>" }
    }
  }
}
  • Use serverUrl — url and httpUrl are rejected.

Verify: Restart Google Antigravity and ask it to list your AgileHero projects — the first successful call confirms the connection.

Google Antigravity documentation · verified against the vendor docs on 2026-09-09

Kiro

Add to ~/.kiro/settings/mcp.json (all projects) or .kiro/settings/mcp.json (one project).

~/.kiro/settings/mcp.json

{
  "mcpServers": {
    "agilehero": {
      "url": "https://api.agilehero.io/mcp",
      "headers": { "Authorization": "Bearer <YOUR_TOKEN>" }
    }
  }
}

Verify: Restart Kiro and ask it to list your AgileHero projects — the first successful call confirms the connection.

Kiro documentation · verified against the vendor docs on 2026-09-09

Warp

Paste into Settings → Agents → MCP servers.

{
  "agilehero": {
    "url": "https://api.agilehero.io/mcp",
    "headers": { "Authorization": "Bearer <YOUR_TOKEN>" }
  }
}

Verify: Restart Warp and ask it to list your AgileHero projects — the first successful call confirms the connection.

Warp documentation · verified against the vendor docs on 2026-09-09

Amp

Add to ~/.config/amp/settings.json (or .amp/settings.json in a project).

~/.config/amp/settings.json

{
  "amp.mcpServers": {
    "agilehero": {
      "url": "https://api.agilehero.io/mcp",
      "headers": { "Authorization": "Bearer <YOUR_TOKEN>" }
    }
  }
}

Use an environment variable instead

{
  "amp.mcpServers": {
    "agilehero": {
      "url": "https://api.agilehero.io/mcp",
      "headers": { "Authorization": "Bearer ${AGILEHERO_MCP_TOKEN}" }
    }
  }
}

Verify: Restart Amp and ask it to list your AgileHero projects — the first successful call confirms the connection.

Amp documentation · verified against the vendor docs on 2026-09-09

GitHub Copilot CLI

Add to ~/.copilot/mcp-config.json, or .mcp.json inside a repository.

~/.copilot/mcp-config.json

{
  "mcpServers": {
    "agilehero": {
      "type": "http",
      "url": "https://api.agilehero.io/mcp",
      "headers": { "Authorization": "Bearer <YOUR_TOKEN>" }
    }
  }
}

Verify: Restart GitHub Copilot CLI and ask it to list your AgileHero projects — the first successful call confirms the connection.

GitHub Copilot CLI documentation · verified against the vendor docs on 2026-09-09

Roo Code

Add to .roo/mcp.json in a project, or the global mcp_settings.json.

.roo/mcp.json

{
  "mcpServers": {
    "agilehero": {
      "type": "streamable-http",
      "url": "https://api.agilehero.io/mcp",
      "headers": { "Authorization": "Bearer <YOUR_TOKEN>" }
    }
  }
}

Verify: Restart Roo Code and ask it to list your AgileHero projects — the first successful call confirms the connection.

Roo Code documentation · verified against the vendor docs on 2026-09-09

Raycast AI

Raycast Pro: run "Install MCP Server" and fill in the form.

Transport: HTTP
URL: https://api.agilehero.io/mcp
HTTP headers: Authorization = Bearer <YOUR_TOKEN>

Verify: Restart Raycast AI and ask it to list your AgileHero projects — the first successful call confirms the connection.

Raycast AI documentation · verified against the vendor docs on 2026-09-09

JetBrains AI Assistantvia mcp-remote

Settings → Tools → AI Assistant → Model Context Protocol → add a server that runs the mcp-remote bridge (the remote-server form has no headers field yet). Needs Node.js.

{
  "mcpServers": {
    "agilehero": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://api.agilehero.io/mcp", "--header", "Authorization:${AGILEHERO_AUTH}"],
      "env": { "AGILEHERO_AUTH": "Bearer <YOUR_TOKEN>" }
    }
  }
}
  • Keep Authorization:${AGILEHERO_AUTH} without a space after the colon — the bridge splits arguments on spaces, and the environment variable carries the space inside its value.

Verify: Restart JetBrains AI Assistant and ask it to list your AgileHero projects — the first successful call confirms the connection.

JetBrains AI Assistant documentation · verified against the vendor docs on 2026-09-09

Continuevia mcp-remote

Add a file under .continue/mcpServers/ that runs the mcp-remote bridge (remote servers have no documented headers field). Needs Node.js.

.continue/mcpServers/agilehero.yaml

name: AgileHero
version: 0.0.1
schema: v1
mcpServers:
  - name: agilehero
    command: npx
    args: ["-y", "mcp-remote", "https://api.agilehero.io/mcp", "--header", "Authorization:${AGILEHERO_AUTH}"]
    env:
      AGILEHERO_AUTH: "Bearer <YOUR_TOKEN>"
  • Keep Authorization:${AGILEHERO_AUTH} without a space after the colon — the bridge splits arguments on spaces, and the environment variable carries the space inside its value.

Verify: Restart Continue and ask it to list your AgileHero projects — the first successful call confirms the connection.

Continue documentation · verified against the vendor docs on 2026-09-09

Claude.ai and Claude Desktop connectorsbeta

Custom connectors can send the token as a request header. The option is in beta for a limited set of organizations.

Settings → Connectors → Add custom connector
Name: AgileHero
URL: https://api.agilehero.io/mcp
Authentication: None
Request headers: authorization = Bearer <YOUR_TOKEN>
  • If there is no "Request headers" section, your organization does not have the beta yet — use Claude Code or the Claude Desktop config file instead.
  • Team and Enterprise admins: a connector credential is shared with the whole organization. Do not enter one AgileHero token for everyone — every call runs as that token's owner, with their permissions.

Verify: Start a new chat — AgileHero is listed under connectors once the connector is enabled.

Claude.ai and Claude Desktop connectors documentation · verified against the vendor docs on 2026-09-09

Other client

Any client with remote MCP support needs only the endpoint and the Authorization header. A client that cannot send headers can run the mcp-remote bridge as a local command instead.

npx -y mcp-remote https://api.agilehero.io/mcp --header "Authorization:Bearer <YOUR_TOKEN>"
  • Write Authorization:Bearer without a space after the colon when the header is one argument — several clients split arguments on spaces, which silently breaks authentication.

Verify: Restart your client and ask it to list your AgileHero projects — the first successful call confirms the connection.

Other client documentation · verified against the vendor docs on 2026-09-09

ChatGPTnot yet

ChatGPT connectors require OAuth sign-in, which AgileHero does not offer yet. Codex — the CLI, the IDE extension, and the Codex tab of the ChatGPT desktop app — works with a token.

ChatGPT documentation · verified against the vendor docs on 2026-09-09

Server instructions

Every MCP client receives these conventions at initialize time:

AgileHero MCP server.

Every id parameter and every id in a response is a short uid — always use uids returned by list/get/search tools, never invent one. Most tools need a project uid — call list_projects first to discover workspaces and projects. Prefer search (full-text, all content types) over search_cards (title-substring, one project).

On update tools, prefer the add_*/remove_* delta fields for collections (incremental, safe); the plain collection fields (assigned_to, labels, checklists, cards_relations, links, attachments) REPLACE the prior state and cannot be combined with their deltas. Checklist items are { description, checked }. Catch up on changes with updated_since on list_cards / list_epics.

Use move_card (not update_card) to change a card's list or position; an empty list_id means the backlog.

Wiki, whiteboard, retrospective, and roadmap tools require the project's workspace to be on a Pro or trial plan. Whiteboard element writes are batch tools and all-or-nothing; element uids come from get_whiteboard. Retrospective items are managed with add_retro_items and move_retro_item (move_card refuses retrospective cards).

Daily limits: tool calls are metered per user per workspace — 500/day on the Free plan, 5,000/day on Pro or trial, resetting at 00:00 UTC. get_ahm_spec and list_projects are never counted (nor is any call not attributable to a single workspace, like an unscoped search). Over the limit, tools return a daily-limit error until the reset or an upgrade.

ALL rich text (wiki pages, card/epic descriptions, comments) is AgileHero Markup (AHM) — strict XML, NEVER markdown or HTML; call get_ahm_spec once before writing any. Rich-text edits are two-step by design: preview_wiki_page_update / preview_description_update (consequences + preview_token), then the matching update tool with that token.

Full tool documentation: https://agilehero.io/docs/mcp

AHM specification: https://agilehero.io/docs/mcp/agilehero-markup

Tools (49)

list_projectsread-only

List every workspace and project the token's user can access, so the agent can resolve the project uid that most other tools require. Call this first whenever no project uid is known — never ask the user to paste one. Returns workspaces (uid, name, plan, your role) with their projects (uid, name, url). Pro-pillar tools (wiki, metrics) need the workspace's plan to be pro or trial.

The product's global full-text search (OpenSearch): cards, epics, wiki pages and projects, matching titles, descriptions, comments, checklist items and attachment filenames, relevance-ranked with a recency boost. Use this to find anything by content ("the card where we discussed the migration"); use search_cards only for title-substring lookups inside one project. Each result carries a type, an action-ready uid (cards feed get_card/update_card, epics get_epic, wiki_pages show_wiki_page, projects the project_id parameters), a deep-link url, and <mark>-highlighted snippets showing why it matched. Optionally scope with project_id or assigned_to_me. Paginate with page/per_page; total_count is the full match count.

ParameterTypeRequiredDescription
querystringyesFree-text search query
project_idstringOptional project uid to scope the search to
assigned_to_mebooleanOnly results assigned to the token's user
pageintegerPage number (default 1)
per_pageintegerResults per page, 1-50 (default 20)

get_cardread-only

Retrieve detailed information about a card by its ID

ParameterTypeRequiredDescription
idstringyesThe unique identifier of the card

get_epicread-only

Retrieve detailed information about an epic by its ID

ParameterTypeRequiredDescription
idstringyesThe unique identifier of the epic

list_wiki_pathsPro · wikiread-only

List all wiki paths (pages and folders) for a project

ParameterTypeRequiredDescription
project_idstringyesThe unique identifier of the project

show_wiki_pagePro · wikiread-only

Retrieve a wiki page as AgileHero Markup (AHM) with its document_version. Content is AHM, not markdown — block ids, <discussion> anchors, and <image/>/<attachment/> references are part of the document; read get_ahm_spec before editing. Edit via preview_wiki_page_update then update_wiki_page, using the block ids and document_version returned here.

ParameterTypeRequiredDescription
idstringyesThe unique identifier of the page path

get_ahm_specread-only

The AgileHero Markup (AHM) v1.0 specification — the ONLY rich-text format AgileHero accepts (markdown and HTML are rejected). Read this ONCE before writing or editing any rich text (wiki pages, card/epic descriptions, comments): vocabulary, attributes, escaping rules, and a worked example. Same text on the web: https://agilehero.io/docs/mcp/agilehero-markup

create_wiki_pagePro · wiki

Create a wiki page (optionally inside a folder) with AgileHero Markup (AHM) content. Content must be wrapped in <agile-hero-markup version="1.0"> — markdown and HTML are rejected; read get_ahm_spec first. Returns the new page's uid, url, document_version and content. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
project_idstringyesThe unique identifier (uid) of the project
namestringyesPage title
parent_idstringOptional folder uid (from list_wiki_paths)
contentstringPage body as AHM; omit for an empty page

preview_wiki_page_updatePro · wikiread-only

REQUIRED first step of every wiki page update: validates the operations and returns the server-computed consequences (blocks added/removed/changed, files that would be permanently deleted, team discussions that would lose their anchors, possible-markdown warnings) plus the preview_token that update_wiki_page requires. Nothing is modified. Operations are block-addressed (replace_block / insert_after / delete_block / move_block) with AHM content — read get_ahm_spec first, and get block ids + document_version from show_wiki_page. Review the consequences before saving: a listed file deletion or discussion unanchoring is only acceptable when the user asked for it.

ParameterTypeRequiredDescription
idstringyesPage path uid
document_versionstringyesFrom show_wiki_page — proves freshness
operationsarray of objectyesApplied in order against the evolving document

update_wiki_pagePro · wikidestructive

Apply a previously previewed update to a wiki page. Requires the preview_token from preview_wiki_page_update for EXACTLY these operations and this document_version — saving without previewing is impossible by design. Every save creates a page version humans can revert in the app. Returns the updated page (AHM + new document_version) and the applied consequences.

ParameterTypeRequiredDescription
idstringyesPage path uid
document_versionstringyesThe version the preview was taken against
operationsarray of objectyesThe exact operations that were previewed
preview_tokenstringyesFrom preview_wiki_page_update

preview_description_updateread-only

REQUIRED first step of every card or epic description edit: validates the block operations and returns the server-computed consequences plus the preview_token that update_description requires. Nothing is modified. Content is AgileHero Markup (AHM, description surface: no tables, colors, alignment, discussions, or file attachments) — read get_ahm_spec first; block ids and document_version come from get_card / get_epic.

ParameterTypeRequiredDescription
resource_typeenum: card | epicyes
idstringyesCard or epic uid
document_versionstringyesFrom get_card / get_epic
operationsarray of objectyesApplied in order against the evolving description

update_descriptiondestructive

Apply a previously previewed description update to a card or epic. Requires the preview_token from preview_description_update for EXACTLY these operations and this document_version — saving without previewing is impossible by design. Returns the updated description (AHM + new document_version).

ParameterTypeRequiredDescription
resource_typeenum: card | epicyes
idstringyesCard or epic uid
document_versionstringyesThe version the preview was taken against
operationsarray of objectyesThe exact operations that were previewed
preview_tokenstringyesFrom preview_description_update

list_whiteboardsPro · whiteboardread-only

List the whiteboards of a project (uid, name, element count, url). Use get_whiteboard to read a board's elements. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
project_idstringyesThe unique identifier of the project

create_whiteboardPro · whiteboard

Create an empty whiteboard on a project. Add content with create_whiteboard_elements. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
project_idstringyesThe unique identifier of the project
namestringyesWhiteboard name

get_whiteboardPro · whiteboardread-only

Read a whiteboard as a compact text representation: board bounds plus one line per element — "<type> <uid> at <x>,<y> size <w>x<h> [color] [parent <frame-uid>] [linked <card|epic> <uid>] \"text\"", connectors as "connector <uid> <from> -> <to>". Element uids from here are the handles every whiteboard write tool takes. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
idstringyesThe unique identifier of the whiteboard

create_whiteboard_elementsPro · whiteboard

Create up to 100 whiteboard elements in one transactional call (all-or-nothing, one realtime event). Native sizes, colors, and text placement are applied server-side — usually give just type + text (+ color). Omit x/y and elements are auto-arranged (grid by default; arrange: row|column|grid, origin_x/origin_y/gap to tune); give x/y for full control. Frames contain elements via parent_id (an existing frame uid) or parent_ref (the ref of a frame earlier in THIS call). Connectors bind elements by uid (source_id/target_id) or batch ref (source_ref/target_ref) — never coordinates; anchors are computed by the UI. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
whiteboard_idstringyesThe unique identifier of the whiteboard
elementsarray of objectyesCreated in array order — refs only resolve backwards
arrangeenum: grid | row | columnLayout for elements without explicit x/y (default grid)
origin_xnumberAuto-arrange start x (default 100)
origin_ynumberAuto-arrange start y (default 100)
gapnumberAuto-arrange spacing in px (default 20)

create_whiteboard_diagramPro · whiteboard

Draw a diagram (flowchart, process, dependency graph) on a whiteboard from a semantic graph — nodes, edges, optional groups, NO coordinates: the server does layered top-to-bottom layout with native sizes and returns the created element uids keyed by your node ids. Placed below existing board content. Transactional (all-or-nothing, one realtime event). Max 20 nodes — split bigger flows into two diagrams. Keep shapes plain (rectangle) unless the semantics demand one (diamond = decision, stadium = start/end, cylinder = data store). Edit the result with update_whiteboard_elements — the layout never runs again. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
whiteboard_idstringyesThe unique identifier of the whiteboard
titlestringDiagram title (frame title, or a heading when groups are used)
nodesarray of objectyes
edgesarray of object
groupsarray of object
origin_xnumberOptional top-left x; defaults below existing content
origin_ynumberOptional top-left y; defaults below existing content

update_whiteboard_elementsPro · whiteboard

Update up to 100 whiteboard elements in one all-or-nothing call: move (x/y), resize, restack (z_index), retext, recolor, reparent (parent_id — a frame uid, or "" to detach), and connector arrow/path/label. Element uids come from get_whiteboard; element types cannot be changed. Only supplied fields change — unrelated properties are preserved. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
whiteboard_idstringyesThe unique identifier of the whiteboard
updatesarray of objectyes

delete_whiteboard_elementsPro · whiteboarddestructive

Delete up to 100 whiteboard elements in one transactional call. Deleting a frame or mind-map node releases its children onto the board (they are NOT deleted — include their uids explicitly to delete them too). Connectors attached to deleted elements are not removed and will dangle. Element uids come from get_whiteboard. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
whiteboard_idstringyesThe unique identifier of the whiteboard
idsarray of stringyesElement uids to delete

review_whiteboardPro · whiteboardread-only

Run deterministic quality checks on a whiteboard: text likely overflowing its element, visibly overlapping elements, connectors with unbound or dangling endpoints, colors outside the UI palette, off-grid positions, and elements whose parent was deleted. Advisory — findings are suggestions, not errors, and a board with findings may be exactly what the user wants. Use after drawing to sanity-check, fix at most once, and do not loop chasing an empty report. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
idstringyesThe unique identifier of the whiteboard

convert_whiteboard_elementPro · whiteboard

Convert a whiteboard element into a backlog item: a sticky note into a card or an epic, or a frame into an epic (the frame's sticky-note children become cards on that epic; already-converted children are re-assigned, not duplicated). The element stays on the board, linked to what it became — get_whiteboard shows the link. An element can only be converted once. The note/frame text becomes the title unless you pass one. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
idstringyesElement uid (a sticky_note or frame, from get_whiteboard)
toenum: card | epicyesWhat to create
titlestringCard title / epic name; defaults to the element's text
list_idstringCard only: target list uid; omit for the backlog
colorstringEpic only: hex color; defaults to the element's color

convert_mind_mapPro · whiteboard

Convert a mind map into backlog items with a per-node mapping: the root can become a new epic (role "epic") or attach to an existing one (role "existing_epic" + target_epic_id); other nodes become cards on that epic (role "card") or project labels (role "label" — label nodes above a card node in the tree are applied to that card); role "skip" ignores a node. Pass the ROOT element uid as id and every node you want converted in nodes (unlisted nodes are ignored). One conversion per node: already-converted nodes are rejected up front — resubmit without them. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
idstringyesThe ROOT mind-map node uid (from get_whiteboard)
nodesarray of objectyes
target_epic_idstringEpic uid, required with role "existing_epic" on the root

list_retrospectivesPro · retrospectivesread-only

List a project's retrospective meetings, most recent first (uid, name, date, url). Use get_retrospective for a board's columns and items. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
project_idstringyesThe unique identifier of the project

create_retrospectivePro · retrospectives

Create a retrospective meeting. The board is seeded with the standard columns (Kudos, Liked, Disliked, Questions, Discussion, Actions) and their uids are returned, so add_retro_items can be called immediately. Pass previous_retrospective_id to carry the previous meeting's Actions column over as a read-only "Past actions" view (nothing is copied — the link is live). Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
project_idstringyesThe unique identifier of the project
namestringyesMeeting name
starts_atstringMeeting date, ISO-8601 (YYYY-MM-DD); defaults to today
previous_retrospective_idstringOptional uid of an earlier retrospective in this project (from list_retrospectives)

get_retrospectivePro · retrospectivesread-only

Read a retrospective meeting: its columns (with uids — the handles add_retro_items and move_retro_item take), every item with its votes, the read-only "Past actions" carried over from the linked previous meeting, and live timer state. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
idstringyesThe unique identifier of the retrospective meeting

add_retro_itemsPro · retrospectives

Add items to a retrospective board, several at once. Each item is { column, text }: column is a column name (Kudos, Liked, Disliked, Questions, Discussion, Actions — case-insensitive) or a column uid from get_retrospective; items are appended in the given order. PARTIAL failure: valid items are created, invalid ones are reported per index — check the "failed" array. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
retrospective_idstringyesThe retrospective meeting uid
itemsarray of objectyes

move_retro_itemPro · retrospectives

Move a retrospective item to another column of its retro board. Item uids come from get_retrospective; column is a name (case-insensitive) or column uid. Only works on retrospective boards — use move_card for kanban cards. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
idstringyesThe retro item uid (from get_retrospective)
columnstringyesTarget column name or uid
positionintegerPosition in the target column; omit for the top

list_project_usersread-only

List the members of a project so the agent can resolve assignee uids

ParameterTypeRequiredDescription
project_idstringyesThe unique identifier of the project

list_board_listsread-only

List the lists of a project's kanban board so the agent can resolve a valid move_card destination. Returns each active list in display order with its uid (usable as a move_card target) and display name. The backlog is included as a selectable entry with an empty-string id.

ParameterTypeRequiredDescription
project_idstringyesThe unique identifier (uid) of the project

list_epicsread-only

List a project's epics so the agent can resolve epic uids for get_epic and card assignment. Returns each epic in display order (position ascending) with its uid, number, name, description (Markdown), color, start/end dates and card counts.

ParameterTypeRequiredDescription
project_idstringyesThe unique identifier (uid) of the project
updated_sincestringOnly epics whose record changed at or after this ISO-8601 date or datetime. Caveat: collection edits (checklists, links) may not bump an epic's change time; name/date/description edits always do.

list_labelsread-only

List a project's labels so the agent can reuse the existing taxonomy instead of creating near-duplicates on card writes. Returns each label in display order (position ascending) with its uid, name and position.

ParameterTypeRequiredDescription
project_idstringyesThe unique identifier (uid) of the project

list_cardsread-only

List the cards of one kanban list, or of the project's backlog when list_id is omitted or empty, in board display order (top of the column first, i.e. placement position descending — the same order the product UI shows). Filters combine with AND: epic_id, label_id, assigned_user_id and reporter_id take uids (an unknown uid matches nothing); due_date keeps cards due on or before the given date. Returns action-sufficient card summaries (uid, title, list + position, epic, labels, assignees, reporter, due date) ready for get_card / move_card / update_card, paginated with limit (default 50, max 100) and offset; total_count is the full filtered count.

ParameterTypeRequiredDescription
project_idstringyesThe unique identifier (uid) of the project
list_idstringList uid to read; omit or pass an empty string for the backlog
epic_idstringOnly cards in this epic (epic uid)
label_idstringOnly cards carrying this label (label uid)
assigned_user_idstringOnly cards assigned to this user (user uid)
reporter_idstringOnly cards reported (created) by this user (user uid)
due_datestringOnly cards due on or before this date (ISO-8601, e.g. 2026-06-10)
updated_sincestringOnly cards whose record changed at or after this ISO-8601 date or datetime — the "what changed since I last ran" filter. Caveat: edits to attached collections (labels, checklists, links) may not bump a card's change time; title/description/scalar edits always do.
limitintegerPage size, 1-100 (default 50)
offsetintegerNumber of cards to skip (default 0)

search_cardsread-only

Title-substring card search within one project (kanban board and backlog), matching the product's in-project live card search exactly (database case-insensitive substring on the card title only — descriptions and comments are not searched; use the search tool for full-text search across all content types), ordered newest-created first. Returns action-sufficient card summaries (uid, title, list placement + position, epic, labels, assignees, reporter, due date); a query with no matches returns an empty cards array, not an error. Paginate with limit (default 50, max 100) and offset; total_count is the full match count.

ParameterTypeRequiredDescription
project_idstringyesThe unique identifier (uid) of the project
querystringyesText to match against card titles (case-insensitive substring)
limitintegerPage size, 1-100 (default 50)
offsetintegerNumber of matching cards to skip (default 0)

list_attention_cardsPro · metricsread-only

List the cards needing attention on a project's kanban board — the same lists as the product's Metrics pages. Kinds: stuck (sitting in a column, not backlog/Done, unmoved for over 7 days; longest-stuck first), blocking (undone cards that other cards are blocked by), overdue (due within the next 7 days or already past due; soonest first). kind selects one list or 'all' (default). Optionally filter by an assignee uid or the literal 'unassigned'. Each requested section returns card summaries ready for get_card / move_card / update_card, capped at limit with the full total_count. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
project_idstringyesThe unique identifier (uid) of the project
kindenum: stuck | blocking | overdue | allWhich attention list to return (default 'all' = every list as its own section)
assignee_idstringOnly cards assigned to this user uid, or 'unassigned' for cards with no assignee
limitintegerMax cards per section, 1-100 (default 50)

get_metrics_summaryPro · metricsread-only

One-call counts of the cards needing attention on a project's kanban board: overdue_cards_count, blocking_cards_count and stuck_cards_count — the same definitions as list_attention_cards, which returns the cards behind each count. Cheap; call this first to decide whether a deeper look is worth it. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
project_idstringyesThe unique identifier (uid) of the project

list_roadmap_slotsPro · roadmapread-only

List a project's roadmap slots overlapping a date window (default: this month through five months out). A slot schedules an epic between two dates and can carry assignees; one epic may hold several slots, overlaps included — that is by design. Returns at most 200 slots — narrow the window if capped. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
project_idstringyesThe unique identifier of the project
start_datestringWindow start, ISO-8601 (YYYY-MM-DD); default: start of this month
end_datestringWindow end, ISO-8601; default: start_date + 6 months

create_roadmap_slotPro · roadmap

Schedule an epic on the project roadmap: a slot from start_date to end_date, optionally with assignees. An epic may hold several slots and overlaps are allowed by design — check list_roadmap_slots first if you mean to extend an existing slot rather than add one. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
project_idstringyesThe unique identifier of the project
epic_idstringyesEpic uid (from list_epics); must belong to this project
start_datestringyesISO-8601 (YYYY-MM-DD)
end_datestringyesISO-8601; same day as start_date is allowed
assigned_toarray of stringUser uids to assign (project members — see list_project_users)

update_roadmap_slotPro · roadmap

Update a roadmap slot: reschedule or resize (start_date/end_date), move it to another epic of the same project (epic_id), or set its assignees. Only supplied fields change, EXCEPT assigned_to which REPLACES the full assignee set — read the slot first and send everyone who should remain. Slot uids come from list_roadmap_slots. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
idstringyesThe roadmap slot uid
epic_idstringNew epic uid (same project)
start_datestringISO-8601 (YYYY-MM-DD)
end_datestringISO-8601
assigned_toarray of stringREPLACES all assignees (user uids, project members); [] clears

delete_roadmap_slotPro · roadmapdestructive

PERMANENTLY delete a roadmap slot (and its assignee links). This cannot be undone — there is no trash for roadmap slots. The epic itself is not touched; to reschedule, prefer update_roadmap_slot. Requires a Pro or trial workspace.

ParameterTypeRequiredDescription
idstringyesThe roadmap slot uid (from list_roadmap_slots)

create_label

Create a new label on a project by name. If a label with the same name already exists (case-insensitive), the existing label is returned unchanged instead of creating a near-duplicate. The new label is appended at the end of the display order.

ParameterTypeRequiredDescription
project_idstringyesProject uid the label belongs to
namestringyes

create_card

Create a new card on a project's kanban board, with any combination of supported fields

ParameterTypeRequiredDescription
project_idstringyesProject uid the card belongs to (the card is created on the project's kanban board)
list_idstringList uid; omit to place in backlog
positioninteger
typeenum: story | bug | chore | research
titlestringyes
descriptionstringAgileHero Markup (AHM) — never markdown or HTML; read get_ahm_spec first. Description surface: no tables, colors, alignment, or discussions.
epic_idstringEpic uid; must already exist on the project
estimationenum: 0 | 1 | 2 | 3 | 5 | 8 | 13Complexity estimate in story points (Fibonacci scale), not a time estimate
due_datestringISO-8601 date
assigned_toarray of stringAssignee user uids, discoverable via list_project_users
labelsarray of stringLabel names; unknown names are created on the project
checklistsarray of objectEach { name, items: [{ description, checked }] }; items keep the supplied order
cards_relationsarray of objectEach { type, target_card_id (a card uid on the same board) }
linksarray of objectEach { url, description }
attachmentsarray of objectEach { url, name }; the file is fetched from the url

update_carddestructive

Update an existing card by its uid. For collections, prefer the add_*/remove_* delta fields (safe incremental edits: add_labels, remove_assignees, add_checklist_items, check_items, …); the plain collection fields (labels, assigned_to, checklists, cards_relations, links, attachments) REPLACE the prior state destructively and cannot be combined with their deltas. Use move_card to change list or position, and preview_description_update / update_description to edit the description.

ParameterTypeRequiredDescription
idstringyesCard uid
typeenum: story | bug | chore | research
titlestring
epic_idstring
estimationenum: 0 | 1 | 2 | 3 | 5 | 8 | 13Complexity estimate in story points (Fibonacci scale), not a time estimate
due_datestringISO-8601 date
assigned_toarray of stringAssignee user uids, discoverable via list_project_users; replaces the card's assignees
labelsarray of stringLabel names; unknown names are created on the project; replaces the card's labels
checklistsarray of objectEach { name, items: [{ description, checked }] }; items keep the supplied order; replaces the card's checklists
cards_relationsarray of objectEach { type, target_card_id (a card uid on the same board) }; replaces the card's relations
linksarray of objectEach { url, description }; replaces the card's links
attachmentsarray of objectEach { url, name }; the file is fetched from the url; replaces the card's attachments
add_labelsarray of stringAdd labels by name (unknown names are created); keeps existing labels
remove_labelsarray of stringRemove labels by name (case-insensitive); absent names are no-ops
add_assigneesarray of stringAdd assignees by user uid; keeps existing assignees
remove_assigneesarray of stringRemove assignees by user uid; absent uids are no-ops
add_checklist_itemsarray of objectAppend items: each { checklist, description, checked? } — the named checklist is created if it does not exist
check_itemsarray of objectMark items done, matched by exact description within the named checklist
uncheck_itemsarray of objectMark items not done (same matching as check_items)
remove_checklist_itemsarray of objectDelete items; absent items are no-ops
add_relationsarray of objectAdd relations; keeps existing relations
remove_relationsarray of objectRemove matching relations; absent ones are no-ops
add_linksarray of objectAdd links: each { url, description? }; keeps existing links
remove_linksarray of stringRemove links by exact url; absent urls are no-ops

delete_carddestructive

Soft-delete a card by its uid

ParameterTypeRequiredDescription
idstringyesCard uid

move_card

Move a card to a different list (or change its position within the same list). Only cards on a kanban board can be moved; cards on retrospective boards are rejected. Pass an empty string for list_id to move the card to the kanban backlog. Omit position to use the list-default placement (top for to_do/in_progress, bottom for backlog/done).

ParameterTypeRequiredDescription
idstringyesCard uid
list_idstringyesTarget list uid; empty string moves to backlog (kanban only)
positionintegerZero-based position within the target list

create_epic

Create a new epic on a project, with any combination of supported fields

ParameterTypeRequiredDescription
project_idstringyesProject uid the epic belongs to
namestringyes
descriptionstringAgileHero Markup (AHM) — never markdown or HTML; read get_ahm_spec first. Description surface: no tables, colors, alignment, or discussions.
colorstringHex color like #0060F0
start_datestringISO-8601 date
end_datestringISO-8601 date
assigned_toarray of stringAssignee user uids, discoverable via list_project_users
checklistsarray of objectEach { name, items: [{ description, checked }] }; items keep the supplied order
linksarray of objectEach { url, description }
attachmentsarray of objectEach { url, name }; the file is fetched from the url

update_epicdestructive

Update an existing epic by its uid; only supplied fields are changed. For collections, prefer the add_*/remove_* delta fields (safe incremental edits); the plain collection fields (assigned_to, checklists, links, attachments) REPLACE the prior state destructively and cannot be combined with their deltas. Use preview_description_update / update_description to edit the description.

ParameterTypeRequiredDescription
idstringyesEpic uid
namestring
colorstringHex color like #0060F0
start_datestringISO-8601 date
end_datestringISO-8601 date
assigned_toarray of stringAssignee user uids, discoverable via list_project_users; replaces the epic's assignees
checklistsarray of objectEach { name, items: [{ description, checked }] }; replaces the epic's checklists
linksarray of objectEach { url, description }; replaces the epic's links
attachmentsarray of objectEach { url, name }; the file is fetched from the url; replaces the epic's attachments
add_assigneesarray of stringAdd assignees by user uid; keeps existing assignees
remove_assigneesarray of stringRemove assignees by user uid; absent uids are no-ops
add_checklist_itemsarray of objectAppend items: each { checklist, description, checked? } — the named checklist is created if it does not exist
check_itemsarray of objectMark items done, matched by exact description within the named checklist
uncheck_itemsarray of objectMark items not done (same matching as check_items)
remove_checklist_itemsarray of objectDelete items; absent items are no-ops
add_linksarray of objectAdd links: each { url, description? }; keeps existing links
remove_linksarray of stringRemove links by exact url; absent urls are no-ops

delete_epicdestructive

Soft-delete an epic by its uid. Its cards are NOT deleted — they stay on the board, detached from the epic. The epic's roadmap slots ARE permanently deleted (a slot schedules an epic, so it is meaningless without one), and whiteboard elements linked to the epic are unlinked.

ParameterTypeRequiredDescription
idstringyesEpic uid

create_comment

Add a comment to a card or to an epic. Provide exactly one of card_id or epic_id. Content is AgileHero Markup (AHM, comment surface: no tables, media, colors, alignment, or discussions) — never markdown or HTML; read get_ahm_spec first. The comment is attributed to the user who owns the MCP token and appears in subsequent get_card / get_epic responses. Comments cannot be edited via MCP; delete_comment removes your own (correct mistakes by delete + repost). Pass parent_comment_id to reply to an existing comment. Threads are one level deep: replying to a reply attaches the new comment to that reply's thread root instead, so do not attempt to nest replies. The parent must be a comment on the same card or epic — a uid from anywhere else is rejected.

ParameterTypeRequiredDescription
card_idstringCard uid to comment on (mutually exclusive with epic_id)
epic_idstringEpic uid to comment on (mutually exclusive with card_id)
contentstringyesComment body as AgileHero Markup (AHM)
parent_comment_idstringOptional uid of a comment on the SAME card or epic to reply to. Omit for a top-level comment. Replying to a reply normalises to that reply's thread root (threads are one level deep).

delete_commentdestructive

Delete a comment YOU posted (comments are attributed to the user who owns the MCP token — other people's comments cannot be deleted). The correction pattern is delete + post a corrected comment with create_comment. A deleted comment that has replies remains visible as a tombstone in its thread. Comment uids come from get_card / get_epic.

ParameterTypeRequiredDescription
idstringyesComment uid

Start with two seats, free forever

Every plan begins as a 14-day trial of every premium module. Set up your first project in minutes.

Try it for free

14-day free trial · no credit card required