MCP Usage — From the Field

A hands-on field guide to the iKanban MCP surface — 96 tools — written from a real run where every tool below was driven against a live server. It covers what each category is for, the exact parameters (including the ones whose names will trip you up), and the gotchas that 400 you.

The authoritative, always-current tool list lives inside the app: Settings → MCP Servers → MCP Capabilities (served live from the server). This page is the field companion — not an exhaustive index, but how the common tools actually behave.


What the MCP server is (and isn't)

iKanban exposes a Model Context Protocol server for supported agent operations. Some agent workflows also use selected REST routes; a vk_ key is restricted by a route deny-list, and many browser-management routes require a browser session. See Setup and Access before wiring REST calls.


1. Connect

claude mcp add --scope user --transport http ikanban-remote \
  https://mcp.i-kanban.com/sse \
  --header "Authorization: Bearer vk_your_key_here"

Generate a key at Settings → API Keys (vk_…). Verify with claude mcp get ikanban-remote → expect ✓ Connected.

Gotcha — transport must be http, not sse. The URL path is /sse for history, but the transport is Streamable HTTP. Register it as sse and it fails silently — ✗ Failed to connect, no tools appear.


2. The tool map

The server exposes 96 tools. The commonly used ones are grouped below. For the complete, always-current list, open Settings → MCP Servers in the app — that is the authoritative catalogue; this table is a curated field subset.

CategoryTools
👥 Teams & Issueslist_teams list_issues get_issue_by_key update_issue_by_key update_team
📋 Tasks & Projectslist_projects create_project get_project update_project list_features create_task update_task list_repos
⚙️ Task Workflowlist_my_issues list_assignees assign_task move_task get_task_details
🏃 Sprintslist_sprints get_sprint create_sprint update_sprint get_sprint_tasks assign_task_to_sprint bulk_assign_tasks_to_sprint
🚀 Releasescreate_release list_releases get_release
📄 Documentslist_documents get_document create_document update_document
📎 File Uploadsget_document_upload_url register_uploaded_document
📁 Folderslist_folders get_folder create_folder update_folder
💬 Commentslist_comments add_comment
📊 Visibility & Analyticslist_workspaces list_team_members get_team_dashboard get_team_graph get_team_chord list_inbox mark_inbox_read snooze_inbox get_pulse get_pulse_summary list_saved_views list_automations list_agent_runs
🏷️ Tagslist_tags create_tag update_tag
🔧 Contextget_context

3. Read this first — the param surprises that cost you a round-trip

The tool names are intuitive; several parameters are not. These are the exact ones that 400'd during the field run:

ToolYou'd reasonably pass…It actually wants…
get_issue_by_keya UUIDan issue key — ENG-42 (a UUID errors: "Use format like 'IKA-123'")
list_reposa workspaceproject_id
list_assigneesteamproject_id
list_saved_viewsteamproject_id
list_automationsteamproject_id
create_documenttitlename
add_commentbodycontent
create_tagjust nametag_name + content — tags are name→text expansions, not bare labels
create_tasktitle+ priority, estimate, task_type, feature_id (all required)
create_releaseany release id will attachonly a project-scoped release attaches (see Releases)
get_contextworks over the networkstdio/session only — it errors over the remote server

Keep this table open the first time and the 400s never happen.


4. The mental model

Workspace  ──>  Team  ──>  Project  ──>  Issue
                 │           ▲
                 │           └── a Project must be ATTACHED to a Team to hold its issues
                 ├── Sprint   (time-boxed cycle — issues are ASSIGNED to it)
                 └── Release  (ship target — issues are FILED under it; project-scoped)

5. The golden path — create → organize → verify

The end-to-end loop, all through MCP (team ENG, placeholder UUIDs — get real ones from list_*):

// 1. project  (create at workspace level, then ATTACH to the team in the UI)
create_project { "workspace_id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "name": "Backend" }
//    ⚠ a fresh project is NOT attached to a team → create_task 400s
//      "project does not belong to this team". Attach: Team → Projects → add.

// 2. issue  (priority + estimate + task_type REQUIRED; assignee omitted ⇒ team's AI Agent)
create_task { "feature_id": "<from list_features>", "team": "ENG", "project_id": "12345678-1234-1234-1234-123456789012",
              "title": "Wire up rate limiting", "priority": 2, "estimate": 3, "task_type": "feature" }

// 3. sprint  (dates are full ISO-8601 WITH timezone)
create_sprint { "team": "ENG", "name": "Sprint 30",
                "start_date": "2026-07-07T00:00:00Z", "end_date": "2026-07-21T00:00:00Z" }

// 4. assign issues to the sprint  (you CANNOT set a sprint on create_task)
bulk_assign_tasks_to_sprint { "team": "ENG", "sprint_id": "…", "task_ids": ["ENG-42","ENG-43"] }

// 5. project-scoped release, then file the issue under it
create_release { "team": "ENG", "name": "v1.4", "project_id": "12345678-…" }   // ← project_id!
create_task    { …, "release_id": "deadbeef-dead-beef-dead-beefdeadbeef" }

// 6. verify
get_sprint_tasks { "team": "ENG", "sprint_id": "…" }

Release gotcha. create_release without project_id makes a team-wide release (project_id NULL). Passing that release's id to create_task silently nulls — an issue only attaches to a release matching its own project. Always pass project_id when you intend to file issues under it. (Omit release_id entirely and the project's active release is auto-assigned.)


6. Category reference — every tool

👥 Teams & Issues

ToolRequired paramsNotes
list_teams—your entry point: returns identifiers (ENG, BLA)
list_issuesteamfilterable by status/assignee
get_issue_by_keyissue_key (ENG-42)not a UUID
update_issue_by_keyissue_key + fields
update_teamteamname / identifier / icon / color

📋 Tasks & Projects

ToolRequired paramsNotes
list_projects—all projects the key can see
create_projectworkspace_id, nameworkspace-level — attach to a team before issues
get_projectproject_id
update_projectproject_idname / status / priority / lead / icon
create_taskteam, project_id, title, priority, estimate, task_type, feature_idthe analytics gate. feature_id comes from list_features — not the same thing as task_type: "feature"
update_tasktask_idtitle / status / assignee / priority / …
list_reposproject_idlinked Git repos

⚙️ Task Workflow

ToolRequired paramsNotes
list_my_issues—across all teams
list_assigneesproject_idwho can be assigned
assign_tasktask_id, assignee_idassignee is a team member id
move_tasktask_id, project_idmove to another project
get_task_detailstask_idone-shot: task + comments + links + tags

🏃 Sprints

ToolRequired paramsNotes
list_sprints / get_sprintteam (+ sprint_id)sprint_id accepts a UUID or slug (sprint-12)
create_sprintteam, name, start_date, end_datedates: full ISO-8601 with tz
update_sprintteam, sprint_idfields / status
get_sprint_tasksteam, sprint_idyour verify step
assign_task_to_sprintteam, sprint_id, task_idid or issue key
bulk_assign_tasks_to_sprintteam, sprint_id, task_ids[](unlink via update_task sprint:"none")

🚀 Releases

ToolRequired paramsNotes
create_releaseteam, name (+ project_id to be issue-linkable)without project_id → team-wide, can't hold issues
list_releasesteam
get_releaseteam, release_id

📄 Documents & 📎 File Uploads

ToolRequired paramsNotes
list_documentsteam
get_documentdocument_id
create_documentteam, name (not title)optional content (markdown), folder_id
update_documentdocument_idtitle / content
get_document_upload_urlworkspace_id (+ file info)step 1 — returns a presigned S3 URL
register_uploaded_documentupload refstep 2 — after your client PUTs the bytes

Uploads are a 3-move dance: get_document_upload_url → your client PUTs the file to S3 → register_uploaded_document. The MCP server never touches the bytes.

📁 Folders

ToolRequired paramsNotes
list_foldersteam
get_folderfolder_id
create_folderteam, nameoptional parent_id for nesting
update_folderfolder_idrename / move

💬 Comments

ToolRequired paramsNotes
list_commentstask_idUUID or issue key
add_commenttask_id, content (not body)

📊 Visibility & Analytics

ToolRequired paramsNotes
list_workspaces—UUIDs + plan; needed for uploads/invites
list_team_membersteamincludes the AI Agent member
get_team_dashboard / get_team_graph / get_team_chordteamKPIs + collaboration graph/chord data
list_inbox / mark_inbox_read / snooze_inbox— / item id / item id + timeyour notifications
get_pulse / get_pulse_summary—recent-activity feed + rollup
list_saved_viewsproject_idsaved filter views
list_automationsproject_idautomation rules
list_agent_runsteam@claude/@copilot/@gemini run lifecycle

🏷️ Tags

ToolRequired paramsNotes
list_tagsteam
create_tagteam, tag_name, contenttags are name→expansion text, not bare labels
update_tagtag idname / color / content

🔧 Context

ToolRequired paramsNotes
get_context—only works over stdio inside an active workspace session — errors over the remote server

7. Value cheat-sheet

FieldAllowed values
priority1 Urgent · 2 High · 3 Medium · 4 Low
estimateinteger story points (e.g. 1–8)
task_typefeature · bug · chore
status (issue)todo · in-progress · in-review · done · cancelled
workspace_role API fieldowner · admin · member · viewer
team role API field (team_assignments)viewer · contributor · maintainer · owner

These are API values. The current workspace invite UI offers Admin/Member; team UI offers Contributor/Maintainer/Viewer/Owner. Workspace Owner/Admin representation is described in Members and Roles. Do not infer a one-to-one UI permission mapping from an API token. | any date | full ISO-8601 with timezone — 2026-07-07T00:00:00Z |


8. Troubleshooting — symptom → cause → fix

You see…CauseFix
✗ Failed to connect, no toolsregistered with --transport ssere-add with --transport http
400 "estimate/priority/task_type is required"analytics gate on create_taskpass all three
400 "feature is required — every task must belong to a Feature"no feature_id on create_taskcall list_features { "team": "ENG" }, pick the closest id, pass it as feature_id. Without it the task lands in the Unclassified queue, which is why it is now rejected outright
400 "project does not belong to this team"project not attached to the teamTeam → Projects → add it
400 "Use format like 'IKA-123'"passed a UUID to get_issue_by_keypass the issue key
missing field 'project_id'used team on list_repos/list_assignees/list_saved_views/list_automationspass project_id
missing field 'name'/'content'/'tag_name'create_document/add_comment/create_tag param naminguse name / content / tag_name+content
created issue has release_id: null after you passed oneteam-wide releasecreate a project-scoped release (project_id) and pass its id
get_context errorsremote server can't serve itit's stdio/session-only — use list_* tools instead
402 "Plan limit reached…"a create operation hit a plan cap; the response identifies the limited resourcecheck Settings → Billing and Plan Limits. Current public paid plans do not cap projects.
need to delete a test entityMCP has no deleteremove it in the web UI

That's the field guide — 96 tools live, the common ones exercised above (full list in Settings → MCP Servers). Keep §3 and §7 handy and the tools do exactly what you'd expect.