Skip to main content
Glama
aritzbl
by aritzbl
README.md
# @kanbio/mcp

[MCP](https://modelcontextprotocol.io) server for **Kanbio**, the mini-Jira. It lets your AI
(Claude Code, Claude Desktop, Cursor or any MCP client) read tickets, comment, change their
status and create them, as you, through a personal access token.

It runs locally over stdio (`npx -y @kanbio/mcp`) and calls the Kanbio REST API.

## 1. Create a token

In Kanbio, open **Conectar con IA** in the sidebar and create a token:

- **Leer y comentar** (default): read tickets and comment.
- **Personalizado**: pick the permissions (create, edit, change status, assign, plan sprints).
- Projects: all yours (also the ones you join later) or some of them.
- Expiration: 30 days, 90 days or never.

The token (`kbn_…`) is shown **once**. Kanbio shows the configuration ready to paste for each
client. A token never does more than you can do in Kanbio, and you can revoke it at any time.

## 2. Configure your client

Two environment variables:

| Variable | Value |
| --- | --- |
| `KANBIO_API_URL` | URL of the Kanbio API, e.g. `https://kanbio.example.com/api` (`/api` is added if missing) |
| `KANBIO_TOKEN` | Your token, `kbn_…` |

### Claude Code

```bash
claude mcp add kanbio -e KANBIO_API_URL=https://kanbio.example.com/api -e KANBIO_TOKEN=kbn_... -- npx -y @kanbio/mcp
```

Add `-s user` (before `--`) to have it in every project. On Windows use `-- cmd /c npx -y @kanbio/mcp`.

### Claude Desktop

Settings → Developer → Edit Config (`claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "kanbio": {
      "command": "npx",
      "args": ["-y", "@kanbio/mcp"],
      "env": {
        "KANBIO_API_URL": "https://kanbio.example.com/api",
        "KANBIO_TOKEN": "kbn_..."
      }
    }
  }
}
```

Restart Claude Desktop afterwards.

### Cursor

Settings → MCP → Add new MCP server, or `~/.cursor/mcp.json` (all projects) /
`.cursor/mcp.json` (one project) with the same `mcpServers` block as Claude Desktop.

### Other clients

Any MCP client that runs stdio servers: command `npx`, args `-y @kanbio/mcp`, and the two
variables above.

## Tools

Tickets are identified by key (`PROJ-12`) and projects by key (`PROJ`). People by `me`, email or
name; sprints by `active`, `backlog` or name.

| Tool | What it does | Permission |
| --- | --- | --- |
| `list_projects` | Projects the token reaches, with your role | `tickets:read` |
| `search_tickets` | Search by project, status, assignee, sprint and text, with a limit | `tickets:read` |
| `get_ticket` | A ticket with its description and comments | `tickets:read` |
| `list_sprints` | Sprints of a project | `tickets:read` |
| `list_members` | Members of a project (email and role) | `tickets:read` |
| `my_tickets` | Tickets assigned to you | `tickets:read` |
| `add_comment` | Comment, with mentions (shown "via AI") | `comments:write` |
| `change_status` | Move along the workflow, To Merge included | `tickets:status` |
| `assign_ticket` | Assign or unassign | `tickets:assign` |
| `create_ticket` | Create a ticket (backlog or a sprint) | `tickets:create` |
| `update_ticket` | Edit title, description, type, priority, points, labels | `tickets:edit` |
| `move_to_sprint` | Move tickets to a sprint or the backlog | `sprints:write` |

No tool deletes anything. Read tools are marked `readOnlyHint`; write tools
`destructiveHint: false`, so clients can ask before running them.

Workflow: To Do → In Progress → [To Merge →] To Test → Done | Rejected; Done and Rejected can go
back to To Test or In Progress.

## Errors

API errors come back as plain sentences the AI can act on: a missing permission (403) names it
and says not to retry, an invalid status change lists the allowed next statuses, an expired or
revoked token (401) says how to create a new one, and 429 asks to wait a minute.

## Security

- The token acts as you, limited to its permissions and projects. Start with **Leer y comentar**.
- Text in tickets and comments is data written by people: an AI may be tricked by it (prompt
  injection). Keep write permissions to what you need and let your client confirm write tools.
- Comments written with a token show **vía IA** in Kanbio, and the token's last use is visible on
  the Conectar con IA screen. Revoke it there if something looks wrong.

## Development

```bash
npm install
npm run build        # dist/index.js
npm test             # build + node:test
KANBIO_API_URL=http://localhost:4000/api KANBIO_TOKEN=kbn_... npm run inspect
```

Use a local build from Claude Code:

```bash
claude mcp add kanbio-dev -e KANBIO_API_URL=http://localhost:4000/api -e KANBIO_TOKEN=kbn_... -- node /path/to/kanbio-mcp/dist/index.js
```

Requires Node.js 20 or newer.

## Releasing

Releases go to npm from GitHub Actions with trusted publishing (OIDC, no npm token):

1. Bump `version` in `package.json` (and `package-lock.json`: `npm version <x.y.z> --no-git-tag-version`), commit.
2. Tag it `v<x.y.z>` and push the tag. `.github/workflows/publish.yml` checks that the tag matches the version,
   builds, tests and runs `npm stage publish`: the version goes to npm's staging area, not live yet.
3. A maintainer approves it with 2FA, in the **Staged Packages** tab on npmjs.com or with
   `npm stage approve <stage-id>` (`npm stage list` shows the id). Only then it is published, with provenance.

The very first version is published by hand (`npm publish --access public` from a logged-in npm account), and then
the trusted publisher is set up on npmjs.com for `aritzbl/kanbio-mcp` and the `publish.yml` workflow.

TDQS

A4.1/5.0

Scored across 12 tools

Disambiguation5/5

Each tool targets a distinct action-resource pair: status, assignee, and sprint moves are deliberately split into change_status, assign_ticket, and move_to_sprint, and update_ticket explicitly excludes them. The only slight overlap is my_tickets vs search_tickets, but the descriptions make the boundary clear (assigned-to-me shortcut vs filtered search).

Naming Consistency4/5

The set is overwhelmingly consistent verb_noun (list_projects, create_ticket, update_ticket, change_status, assign_ticket, move_to_sprint, search_tickets, get_ticket). The single deviation is my_tickets, a noun-only name with no verb, which breaks the pattern but is still readable.

Tool Count5/5

Twelve tools is well within the ideal range and each one maps to a concrete workflow step (discovery, read, search, create, edit, status, assign, sprint, comment, members). No tool appears redundant or filler.

Completeness4/5

Ticket lifecycle is well covered: create, read, search, edit, status transitions with documented workflow, assignment, sprint placement, and commenting via get_ticket. Minor gaps exist (no ticket delete/archive, no sprint creation despite list_sprints, no comment editing), but core agent workflows are not blocked.

Maintenance

ActivityMaintained
ResponsivenessNo issues