MCP tools
Blarass PM exposes a FastMCP streamable-HTTP server.
Connecting an MCP client
- Endpoint:
https://pm-mcp.blarass.com/mcp(also served viahttps://pm-api.blarass.com/mcp— same service, two faces) - Transport: streamable HTTP (
initializehandshake, then session confirmed viamcp-session-idheader) - 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
| Tool | Args | Does |
|---|---|---|
list_my_tasks | project_id? uuid, status? enum(backlog…) | Tasks assigned to the calling member |
list_tasks | project_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_task | task_id uuid | Task detail + blockers + derived blocked |
create_task | project_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-DD | Create task |
update_task | task_id uuid, status? enum, title? string, description? string, estimate_days? number, module_id? uuid, milestone_id? uuid, metadata? record, due_date? string/null | Update any subset of updatable fields |
assign_task | task_id uuid, assignee_principal_id uuid | Assign to any workspace principal |
add_task_blocker | task_id uuid, blocker_task_id uuid | Add blocker edge (same project only; 409 cycle) |
remove_task_blocker | task_id uuid, blocker_task_id uuid | Remove edge |
list_task_blockers | task_id uuid | Blocker list |
add_task_comment | task_id uuid, body string | Append comment (author = calling member) |
list_task_comments | task_id uuid | List comments |
Projects
| Tool | Args | Does |
|---|---|---|
list_projects | — | Projects with derived progress_pct |
create_project | name string, description? string, status? enum(active, paused, done, archived) | Create project |
update_project | project_id uuid, name? / description? / status? | Update (archive = no hard delete) |
whoami | — | Show the calling member, workspace, and roles |
Milestones
| Tool | Args | Does |
|---|---|---|
list_milestones | project_id? uuid | Milestones, with progress |
create_milestone | project_id uuid, name string, target_date? string | Create under a project |
update_milestone | milestone_id uuid, name? / target_date? / status? enum(planned, active, hit, missed) / position? int | Update fields |
list_roadmap | project_id? uuid, from? YYYY-MM-DD, to? YYYY-MM-DD | Milestones by target date |
Modules
| Tool | Args | Does |
|---|---|---|
create_module | milestone_id uuid, name string, position? int | Create under a milestone |
Progress
| Tool | Args | Does |
|---|---|---|
get_project_progress | project_id? uuid | Derived 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, ...