Skip to content

MCP tools

Blarass PM exposes a FastMCP streamable-HTTP server.

Connecting an MCP client

  • Endpoint: https://pm-mcp.blarass.com/mcp (also served via https://pm-api.blarass.com/mcp — same service, two faces)
  • Transport: streamable HTTP (initialize handshake, then session confirmed via mcp-session-id header)
  • Auth: every request carries Authorization: Bearer <member key> — the key resolves to a member (human/agent/app) the same way REST does

Example MCP client config (placeholders only, never real keys):

{
"mcpServers": {
"blarass-pm": {
"url": "https://pm-mcp.blarass.com/mcp",
"headers": { "Authorization": "Bearer <your-blarass-key>" }
}
}
}

On connect, the client sends the MCP initialize handshake. After that you can call any of the 21 tools below; the caller’s roles and visibility apply to every result.

whoami is the fastest way to confirm a connection works:

{ "tool": "whoami", "arguments": {} }

Tasks

ToolArgsDoes
list_my_tasksproject_id? uuid, status? enum(backlog…)Tasks assigned to the calling member
list_tasksproject_id? uuid, module_id? uuid, milestone_id? uuid, status? enum, assignee_principal_id? uuid, order? enum(due)Filtered workspace task list (assigned-only narrowing applies)
get_tasktask_id uuidTask detail + blockers + derived blocked
create_taskproject_id uuid, title string, module_id? uuid, milestone_id? uuid, description? string, assignee_principal_id? uuid, estimate_days? number, metadata? record, due_date? YYYY-MM-DDCreate task
update_tasktask_id uuid, status? enum, title? string, description? string, estimate_days? number, module_id? uuid, milestone_id? uuid, metadata? record, due_date? string/nullUpdate any subset of updatable fields
assign_tasktask_id uuid, assignee_principal_id uuidAssign to any workspace principal
add_task_blockertask_id uuid, blocker_task_id uuidAdd blocker edge (same project only; 409 cycle)
remove_task_blockertask_id uuid, blocker_task_id uuidRemove edge
list_task_blockerstask_id uuidBlocker list
add_task_commenttask_id uuid, body stringAppend comment (author = calling member)
list_task_commentstask_id uuidList comments

Projects

ToolArgsDoes
list_projectsProjects with derived progress_pct
create_projectname string, description? string, status? enum(active, paused, done, archived)Create project
update_projectproject_id uuid, name? / description? / status?Update (archive = no hard delete)
whoamiShow the calling member, workspace, and roles

Milestones

ToolArgsDoes
list_milestonesproject_id? uuidMilestones, with progress
create_milestoneproject_id uuid, name string, target_date? stringCreate under a project
update_milestonemilestone_id uuid, name? / target_date? / status? enum(planned, active, hit, missed) / position? intUpdate fields
list_roadmapproject_id? uuid, from? YYYY-MM-DD, to? YYYY-MM-DDMilestones by target date

Modules

ToolArgsDoes
create_modulemilestone_id uuid, name string, position? intCreate under a milestone

Progress

ToolArgsDoes
get_project_progressproject_id? uuidDerived module→milestone→project roll-up

Blockers / visibility semantics

All MCP tools share one behavior: the caller’s authorization model applies identically — workspace role ladder (owner/admin/member) plus project role ladder (viewer/commenter/editor) are evaluated server-side before the SQL runs, so a tool call either returns the rows you’re entitled to or a readable error.

Three error families you may see:

  • forbidden: you do not have access to … rows in this workspace — RLS denial (row-level visibility)
  • conflict: that value already exists — unique violation (duplicate member name, etc.)
  • invalid reference: the referenced record does not exist (or is in another workspace) — FK mismatch

Also: passing an argument the tool doesn’t declare gets rejected before touching the DB:

unknown argument(s): xyz — valid: task_id, status, title, ...