@abe-ing/mcp
v0.5.0
Published
Model Context Protocol server for driving ABE project boards and tasks from Claude Code and other MCP clients.
Readme
@abe-ing/mcp — ABE Model Context Protocol server
A stdio MCP server that gives Claude Code (and any MCP-capable agent) typed tools to drive ABE project boards and tasks — so you can run engineering issues inside ABE instead of GitHub, straight from your editor:
"list my ABE boards" · "create a board called Sprint 12 with columns todo, doing, done" · "add a P0 bug to Sprint 12 assigned to [email protected]" · "move task 91 to review"
It wraps the ABE REST API and authenticates with a Personal Access Token.
Setup in Claude Code
- Generate a Personal Access Token in the ABE web app: Settings → Developer → Generate a token (scope
full, ortasks+boards). Copy it — it's shown once. - Add the server.
CLI:
claude mcp add --transport stdio \
--env ABE_TOKEN=abe_pat_xxxx \
--env ABE_API_URL=https://api.abe.ing \
abe -- npx -y @abe-ing/mcpOr .mcp.json (commit to a project; keep the secret out of git via shell expansion):
{
"mcpServers": {
"abe": {
"command": "npx",
"args": ["-y", "@abe-ing/mcp"],
"env": {
"ABE_API_URL": "https://api.abe.ing",
"ABE_TOKEN": "${ABE_TOKEN}"
}
}
}
}Environment
| Var | Required | Default | Notes |
|-----|----------|---------|-------|
| ABE_TOKEN | yes | — | Personal Access Token (abe_pat_…). The server exits if unset. |
| ABE_API_URL | no | http://localhost:3000 | ABE API base URL. Use https://api.abe.ing for production. |
There is no tenant setting — a PAT is bound to its workspace at generation time, so the target workspace is whichever you minted the token for.
Tools
| Tool | Purpose |
|------|---------|
| list_boards | List project boards (id, slug, name, columns). Call first before creating tasks. |
| create_board | Create a project board: name, optional columns[], description. |
| update_board_columns | Replace a project board's columns: board (slug/name/id), columns[]. |
| list_tasks | List tasks. Filters: board, status, type, label, all, include_done, limit. Default = your open tasks. |
| get_task | Fetch one task by id, including its body: body_markdown (the linked worksheet doc rendered as markdown — source of truth) and description (create-time text; can be stale). |
| get_worksheet | Fetch a worksheet (doc) by id with bodyMarkdown rendered server-side. Use with a task's worksheet_id, or for any other doc. Returns id, title, body, bodyMarkdown, visibility, lastEditedAt, createdByName (never the share token or owner email). |
| update_worksheet | Replace a doc's body from markdown (body_markdown, converted server-side, previous body versioned) and/or set title. Whole-doc replace — get_worksheet first if you mean to edit. Last write wins against an open editor. |
| create_task | Create a task: board, title, + description, type, priority, size, labels[], assignee_email, due_date, start_date, end_date, estimate, column. |
| update_task | Update any property by id (incl. status, move via board). Nullable fields accept null to clear. body_markdown (or description — same meaning as on create) replaces the task doc; the previous body is kept as a version. |
| move_task | Move a task to a column. |
| complete_task | Mark a task complete. |
| assign_task | Assign by assignee_email (resolved server-side). |
| add_task_comment | Add a PR-style comment/status note to a task (id, body). Recorded as authored by the agent (origin: "agent"). |
| list_task_comments | List a task's comments (id), chronological. |
| update_task_comment | Edit a comment (id, comment_id, body) — own comments only (server-enforced). |
| delete_task_comment | Delete a comment (id, comment_id) — own comments only. |
| get_task_history | Fetch a task's full timeline (id): field/status events + comments + worksheet edits, merged chronologically. |
| delete_task | PERMANENTLY delete a task (id). Irreversible — only when the user explicitly asks; otherwise prefer complete_task. |
| list_members | List workspace members (admin/full token). Optional — assigning by email works without it. |
Enumerations are enforced by the tool schemas: priority (P0/P1/P2/urgent/high/normal), task_type (task/feature/bug/suggestion/improvement/ops), size (XS/S/M/L/XL), status (open/completed), dates as YYYY-MM-DD. column is free-form (per-board) and validated by the server.
Assignees are resolved by email or name on the server — the model never needs internal user ids. Boards are referenced by slug, name, or id (resolved automatically).
Error handling
Tools never throw at the protocol level. On failure they return a model-recoverable isError result with guidance — e.g. an invalid column tells the model to call list_boards for the valid set; a 401 tells it the token is invalid/revoked; a 402 explains the workspace billing is locked (blocking reads and writes).
Develop
npm install
npm run build # tsc → dist/
npm test # vitest
npm run typecheckPinned to @modelcontextprotocol/[email protected] (exact). A future SDK major renames the package and moves to zod v4 — do not cross that boundary without rewriting the imports and re-checking registerTool.
