@omnicoreos/planka-mcp 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +86 -0
- package/CONTRIBUTING.md +37 -0
- package/CREDITS.md +39 -0
- package/LICENSE +22 -0
- package/README.es.md +213 -0
- package/README.md +213 -0
- package/dist/client.d.ts +96 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +281 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +85 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +226 -0
- package/dist/errors.js.map +1 -0
- package/dist/identity.generated.d.ts +3 -0
- package/dist/identity.generated.d.ts.map +1 -0
- package/dist/identity.generated.js +4 -0
- package/dist/identity.generated.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/operations/attachments.d.ts +34 -0
- package/dist/operations/attachments.d.ts.map +1 -0
- package/dist/operations/attachments.js +89 -0
- package/dist/operations/attachments.js.map +1 -0
- package/dist/operations/board-id.d.ts +9 -0
- package/dist/operations/board-id.d.ts.map +1 -0
- package/dist/operations/board-id.js +86 -0
- package/dist/operations/board-id.js.map +1 -0
- package/dist/operations/boards.d.ts +143 -0
- package/dist/operations/boards.d.ts.map +1 -0
- package/dist/operations/boards.js +391 -0
- package/dist/operations/boards.js.map +1 -0
- package/dist/operations/cards.d.ts +36 -0
- package/dist/operations/cards.d.ts.map +1 -0
- package/dist/operations/cards.js +81 -0
- package/dist/operations/cards.js.map +1 -0
- package/dist/operations/comments.d.ts +28 -0
- package/dist/operations/comments.d.ts.map +1 -0
- package/dist/operations/comments.js +53 -0
- package/dist/operations/comments.js.map +1 -0
- package/dist/operations/labels.d.ts +60 -0
- package/dist/operations/labels.d.ts.map +1 -0
- package/dist/operations/labels.js +146 -0
- package/dist/operations/labels.js.map +1 -0
- package/dist/operations/lists.d.ts +15 -0
- package/dist/operations/lists.d.ts.map +1 -0
- package/dist/operations/lists.js +40 -0
- package/dist/operations/lists.js.map +1 -0
- package/dist/operations/projects.d.ts +24 -0
- package/dist/operations/projects.d.ts.map +1 -0
- package/dist/operations/projects.js +61 -0
- package/dist/operations/projects.js.map +1 -0
- package/dist/operations/tasks.d.ts +30 -0
- package/dist/operations/tasks.d.ts.map +1 -0
- package/dist/operations/tasks.js +111 -0
- package/dist/operations/tasks.js.map +1 -0
- package/dist/schemas/entities.d.ts +389 -0
- package/dist/schemas/entities.d.ts.map +1 -0
- package/dist/schemas/entities.js +202 -0
- package/dist/schemas/entities.js.map +1 -0
- package/dist/schemas/requests.d.ts +539 -0
- package/dist/schemas/requests.d.ts.map +1 -0
- package/dist/schemas/requests.js +187 -0
- package/dist/schemas/requests.js.map +1 -0
- package/dist/schemas/responses.d.ts +2626 -0
- package/dist/schemas/responses.d.ts.map +1 -0
- package/dist/schemas/responses.js +75 -0
- package/dist/schemas/responses.js.map +1 -0
- package/dist/tools/attachments.d.ts +270 -0
- package/dist/tools/attachments.d.ts.map +1 -0
- package/dist/tools/attachments.js +247 -0
- package/dist/tools/attachments.js.map +1 -0
- package/dist/tools/cards.d.ts +401 -0
- package/dist/tools/cards.d.ts.map +1 -0
- package/dist/tools/cards.js +368 -0
- package/dist/tools/cards.js.map +1 -0
- package/dist/tools/comments.d.ts +217 -0
- package/dist/tools/comments.d.ts.map +1 -0
- package/dist/tools/comments.js +208 -0
- package/dist/tools/comments.js.map +1 -0
- package/dist/tools/index.d.ts +1293 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +62 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/labels.d.ts +214 -0
- package/dist/tools/labels.d.ts.map +1 -0
- package/dist/tools/labels.js +302 -0
- package/dist/tools/labels.js.map +1 -0
- package/dist/tools/lists.d.ts +117 -0
- package/dist/tools/lists.d.ts.map +1 -0
- package/dist/tools/lists.js +178 -0
- package/dist/tools/lists.js.map +1 -0
- package/dist/tools/navigation.d.ts +106 -0
- package/dist/tools/navigation.d.ts.map +1 -0
- package/dist/tools/navigation.js +151 -0
- package/dist/tools/navigation.js.map +1 -0
- package/dist/tools/queries.d.ts +380 -0
- package/dist/tools/queries.d.ts.map +1 -0
- package/dist/tools/queries.js +256 -0
- package/dist/tools/queries.js.map +1 -0
- package/dist/tools/tasks.d.ts +223 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +169 -0
- package/dist/tools/tasks.js.map +1 -0
- package/docs/planka-2x-gotchas.md +192 -0
- package/docs/tools.md +659 -0
- package/docs/troubleshooting.md +138 -0
- package/package.json +71 -0
- package/project.identity.json +7 -0
- package/scripts/bootstrap-board.mjs +160 -0
- package/scripts/lib/planka-api.mjs +244 -0
- package/scripts/lib/workflow-template.mjs +26 -0
- package/scripts/setup.mjs +236 -0
- package/scripts/setup.sh +48 -0
- package/scripts/sync-identity.mjs +57 -0
- package/server.json +43 -0
- package/tests/smoke/planka-smoke.mjs +920 -0
- package/workflow/README.md +232 -0
- package/workflow/board-template.md +115 -0
- package/workflow/skills/planka-close-card/SKILL.md +81 -0
- package/workflow/skills/planka-orchestrator/SKILL.md +126 -0
- package/workflow/worktrees/README.md +104 -0
- package/workflow/worktrees/wt.conf.example +24 -0
- package/workflow/worktrees/wt.sh +345 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented here.
|
|
4
|
+
|
|
5
|
+
## [0.2.0] - 2026-08-24
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Nine tools, bringing the server to twenty-four.
|
|
10
|
+
- Attachments: `planka_add_attachment` uploads a local file and re-reads the card
|
|
11
|
+
to confirm it landed, `planka_get_attachments` lists what a card holds,
|
|
12
|
+
`planka_view_attachment` returns content — images as MCP image content up to
|
|
13
|
+
3 MB, text inline up to 50 KB, anything else as metadata and a URL — and
|
|
14
|
+
`planka_delete_attachment` removes one.
|
|
15
|
+
- `planka_manage_comment`, to edit or delete an existing comment.
|
|
16
|
+
- Scoped reads that answer a narrower question than `planka_get_board` and return
|
|
17
|
+
proportionally less text: `planka_list_lists` (columns and card counts),
|
|
18
|
+
`planka_board_summary` (columns, labels, and the cards awaiting a decision),
|
|
19
|
+
`planka_list_cards` (one column, paginated), and `planka_find_cards` (search by
|
|
20
|
+
label, text, or column). Measured on a board of 100 cards, they return between
|
|
21
|
+
16 and 56 times less than `planka_get_board`.
|
|
22
|
+
- Honest clipping on every scoped read: `total`, `returned`, `hasMore`, and
|
|
23
|
+
`nextOffset`, so a partial answer is never mistaken for a complete one.
|
|
24
|
+
- Actionable input errors. A rejected call now names the tool, the field, the
|
|
25
|
+
declared type and description, what was expected, and what actually arrived.
|
|
26
|
+
Missing required fields are caught before the handler runs, and a Planka
|
|
27
|
+
response that does not match the expected shape is labelled as an API mismatch
|
|
28
|
+
rather than an argument problem.
|
|
29
|
+
- Diagnosis for a project ID passed where a board ID belongs. Both are strings of
|
|
30
|
+
digits, and Planka answers the mistake with a bare 404. The server now resolves
|
|
31
|
+
it automatically when the project has exactly one board, and otherwise explains
|
|
32
|
+
what the ID is and lists the boards it could have meant.
|
|
33
|
+
- Documentation for the smoke test's optional environment variables:
|
|
34
|
+
`PLANKA_SMOKE_LIST_ID` and `PLANKA_SMOKE_FAIL_AFTER`, which injects a failure to
|
|
35
|
+
prove the cleanup path still runs.
|
|
36
|
+
|
|
37
|
+
### Changed
|
|
38
|
+
|
|
39
|
+
- The smoke test grew from a first-failure abort over seven tools to 64 named
|
|
40
|
+
checks covering all twenty-four end to end, each write cross-checked against the
|
|
41
|
+
raw Planka HTTP API. Cleanup runs in a `finally` and on `SIGINT`/`SIGTERM`, over
|
|
42
|
+
raw HTTP so the safety net does not depend on the component under test.
|
|
43
|
+
- `npm run test:smoke` builds first, so it can no longer test a stale `dist/`.
|
|
44
|
+
- Internal operation signatures take a single input object everywhere, validated
|
|
45
|
+
through one shared path. No tool payload changed.
|
|
46
|
+
|
|
47
|
+
### Fixed
|
|
48
|
+
|
|
49
|
+
- Long columns truncated in silence. `GET /api/lists/:id/cards` pages at 50 and
|
|
50
|
+
ignores `?limit=`; its cursor is composite (`before[id]` plus
|
|
51
|
+
`before[listChangedAt]`). A column of 77 cards returned 50 with no indication
|
|
52
|
+
that 27 were missing. The cursor is now followed, and a read that still could
|
|
53
|
+
not be completed reports `truncated: true` instead of looking complete.
|
|
54
|
+
|
|
55
|
+
## [0.1.0] - 2026-08-21
|
|
56
|
+
|
|
57
|
+
### Identity
|
|
58
|
+
|
|
59
|
+
- Working repository name: `planka-mcp`.
|
|
60
|
+
- Working npm identity: `@omnicoreos/planka-mcp`.
|
|
61
|
+
- `project.identity.json` is the source of truth for repository, package, binary,
|
|
62
|
+
MCP Registry, and repository URL names. After changing it, run
|
|
63
|
+
`npm run sync:identity`.
|
|
64
|
+
|
|
65
|
+
### Added
|
|
66
|
+
|
|
67
|
+
- Fifteen stdio MCP tools for Planka projects, boards, cards, tasks, comments,
|
|
68
|
+
labels, and lists.
|
|
69
|
+
- Guided macOS/Linux setup with authentication validation, board selection,
|
|
70
|
+
optional board bootstrap, Claude Code configuration, and real smoke verification.
|
|
71
|
+
- Unit tests for schemas, parsing, request construction, the dedicated comments
|
|
72
|
+
endpoint, label criteria deletion, label aliases, list creation, and bootstrap
|
|
73
|
+
idempotency.
|
|
74
|
+
- Opt-in smoke test that executes MCP tools and verifies every mutation against the
|
|
75
|
+
raw Planka API before deleting its temporary card.
|
|
76
|
+
- Optional board, director/worker, and worktree methodology.
|
|
77
|
+
- English and Spanish documentation.
|
|
78
|
+
|
|
79
|
+
### Fixed from upstream
|
|
80
|
+
|
|
81
|
+
- Empty comments on Planka 2.x.
|
|
82
|
+
- Whole-board failures caused by new label colors.
|
|
83
|
+
- Silent no-op `labelIds` requests.
|
|
84
|
+
- Incorrect label-removal URL.
|
|
85
|
+
- Missing `type` in list creation.
|
|
86
|
+
- Internal `archive` and `trash` list types rejected on board reads.
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Thanks for improving Planka 2.x support.
|
|
4
|
+
|
|
5
|
+
## Local checks
|
|
6
|
+
|
|
7
|
+
Node.js 18 or newer is required.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm ci
|
|
11
|
+
npm run build
|
|
12
|
+
npm test
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Keep unit tests offline. A real Planka test is opt-in because it writes a temporary
|
|
16
|
+
card:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
export PLANKA_BASE_URL="https://planka.example.com"
|
|
20
|
+
export PLANKA_AGENT_EMAIL="agent@example.com"
|
|
21
|
+
export PLANKA_AGENT_PASSWORD="<YOUR_PASSWORD>"
|
|
22
|
+
export PLANKA_SMOKE_BOARD_ID="<BOARD_ID>"
|
|
23
|
+
npm run test:smoke
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The smoke test must clean up after itself and must compare MCP claims with the raw
|
|
27
|
+
API. A `success: true` response alone is not proof.
|
|
28
|
+
|
|
29
|
+
## Pull requests
|
|
30
|
+
|
|
31
|
+
- Add a regression test for every Planka compatibility fix.
|
|
32
|
+
- Keep Node 18 compatibility.
|
|
33
|
+
- Never commit credentials, private hosts, real customer data, or screenshots with
|
|
34
|
+
personal information.
|
|
35
|
+
- Preserve upstream attribution and the MIT license.
|
|
36
|
+
- Update both `README.md` and `README.es.md` when setup behavior changes.
|
|
37
|
+
- Do not broaden the optional workflow into a requirement for MCP-only users.
|
package/CREDITS.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Credits and fork history
|
|
2
|
+
|
|
3
|
+
This repository is a fork of
|
|
4
|
+
[`gogogadgetbytes/planka-mcp`](https://github.com/gogogadgetbytes/planka-mcp),
|
|
5
|
+
released under the MIT License. The original 2026 copyright notice remains in
|
|
6
|
+
[`LICENSE`](LICENSE). The additional contributor notice covers changes made in this
|
|
7
|
+
fork and the optional workflow documentation.
|
|
8
|
+
|
|
9
|
+
This is not presented as an original MCP implementation.
|
|
10
|
+
|
|
11
|
+
## Why this fork exists
|
|
12
|
+
|
|
13
|
+
The upstream repository is functionally abandoned. Its four commits are the initial
|
|
14
|
+
release plus registry housekeeping from 2026-02-03; there have been no code changes
|
|
15
|
+
since that release batch. Two compatibility pull requests remain open and unmerged:
|
|
16
|
+
|
|
17
|
+
- [PR #5: read comments from the Planka 2.x card-comments endpoint](https://github.com/gogogadgetbytes/planka-mcp/pull/5)
|
|
18
|
+
- [PR #1: accept backend label colors on read paths](https://github.com/gogogadgetbytes/planka-mcp/pull/1)
|
|
19
|
+
|
|
20
|
+
Both were still open when this fork was prepared on 2026-08-21.
|
|
21
|
+
|
|
22
|
+
## Compatibility work in this fork
|
|
23
|
+
|
|
24
|
+
This fork carries four Planka 2.x fixes:
|
|
25
|
+
|
|
26
|
+
1. Comments are read from `GET /api/cards/:cardId/comments` instead of an empty
|
|
27
|
+
`included.comments` array.
|
|
28
|
+
2. `planka_set_card_labels` accepts the natural `labelIds` argument as well as
|
|
29
|
+
`addLabelIds`, then verifies the final card state.
|
|
30
|
+
3. Label removal uses Planka's criteria path,
|
|
31
|
+
`/card-labels/labelId:<labelId>`, instead of a junction-record ID.
|
|
32
|
+
4. Label colors returned by Planka are open-ended on read paths, so a new backend
|
|
33
|
+
color cannot invalidate the whole board response.
|
|
34
|
+
|
|
35
|
+
It also sends the required `type` when creating Planka 2.x lists, accepts internal
|
|
36
|
+
`archive` and `trash` list types on reads, adds unit and raw-API-verified smoke tests,
|
|
37
|
+
and provides the optional board/worktree method under [`workflow/`](workflow/).
|
|
38
|
+
|
|
39
|
+
See [docs/planka-2x-gotchas.md](docs/planka-2x-gotchas.md) for the technical details.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 gogogadgetbytes
|
|
4
|
+
Copyright (c) 2026 planka-mcp contributors
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
SOFTWARE.
|
package/README.es.md
ADDED
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# planka-mcp
|
|
2
|
+
|
|
3
|
+
Manejá un tablero Planka 2.x desde Claude Code mediante 24 tools MCP.
|
|
4
|
+
Las escrituras se releen y verifican: un éxito informado coincide con el board.
|
|
5
|
+
Un flujo opcional convierte ese board en memoria durable para el trabajo con agentes.
|
|
6
|
+
|
|
7
|
+
[Read in English](README.md)
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
Vos hablás con Claude Code
|
|
11
|
+
│
|
|
12
|
+
▼
|
|
13
|
+
planka-mcp (stdio) ─── HTTPS + JSON ───▶ Planka 2.x
|
|
14
|
+
│ │
|
|
15
|
+
└──── vuelve a leer el resultado ◀─┘
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
> [!WARNING]
|
|
19
|
+
> El paquete viejo `@gogogadgetbytes/planka-mcp` puede informar éxito sin haber
|
|
20
|
+
> hecho nada en Planka 2.x. Leé [los cinco fallos silenciosos](docs/planka-2x-gotchas.md)
|
|
21
|
+
> antes de reemplazar una instalación existente.
|
|
22
|
+
|
|
23
|
+
## ¿Es tu primer MCP? Leé esto primero
|
|
24
|
+
|
|
25
|
+
MCP es un estándar que permite que Claude Code llame tools provistas por otro programa.
|
|
26
|
+
Este repo ejecuta un programa local pequeño que traduce esas llamadas a pedidos a la API de Planka.
|
|
27
|
+
Necesita credenciales de Planka porque actúa como un usuario dedicado de Planka, no como Claude.
|
|
28
|
+
Las credenciales quedan en tu máquina y nunca se escriben en el archivo de proyecto `.mcp.json`.
|
|
29
|
+
Claude Code carga los servidores MCP al iniciar una sesión, así que reinicialo después del setup o de cambiar la configuración.
|
|
30
|
+
|
|
31
|
+
## Requisitos
|
|
32
|
+
|
|
33
|
+
- Node.js 18 o posterior y `npm`
|
|
34
|
+
- Una instancia Planka 2.x accesible
|
|
35
|
+
- Un usuario dedicado de Planka que pueda ver el proyecto y board elegidos
|
|
36
|
+
- Claude Code instalado y disponible como `claude`
|
|
37
|
+
- Rol de project manager sólo si el setup debe crear un board
|
|
38
|
+
|
|
39
|
+
Funciona en Linux y macOS. Bun no es un requisito.
|
|
40
|
+
|
|
41
|
+
## Instalación en 5 minutos
|
|
42
|
+
|
|
43
|
+
Cloná el repo y ejecutá el instalador guiado:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
git clone https://github.com/omnicoreos/planka-mcp.git
|
|
47
|
+
cd planka-mcp
|
|
48
|
+
./scripts/setup.sh
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
El setup pide la URL de Planka, email o usuario del agente y password. Valida esas
|
|
52
|
+
credenciales antes de escribir configuración, permite elegir o crear un board y
|
|
53
|
+
ejecuta un smoke real de crear, etiquetar, comentar y borrar una card.
|
|
54
|
+
|
|
55
|
+
Ofrece dos formas de configurar Claude Code:
|
|
56
|
+
|
|
57
|
+
| Opción | Cuándo usarla | Dónde vive |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| `claude mcp add` | Querés la instalación personal más simple | Configuración de usuario de Claude Code |
|
|
60
|
+
| `.mcp.json` de proyecto | Un equipo debe compartir la entrada del servidor | `<TU_PROYECTO>/.mcp.json`, se puede commitear |
|
|
61
|
+
|
|
62
|
+
En ambos casos, el setup guarda las credenciales fuera de Git en
|
|
63
|
+
`~/.config/planka-mcp/config.json` con modo `0600` y crea el launcher privado
|
|
64
|
+
`~/.local/bin/planka-mcp`. La configuración compartida no contiene el password:
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"mcpServers": {
|
|
69
|
+
"planka": {
|
|
70
|
+
"type": "stdio",
|
|
71
|
+
"command": "${HOME}/.local/bin/planka-mcp",
|
|
72
|
+
"args": []
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Podés volver a ejecutar el instalador. Actualiza la entrada `planka`, reutiliza las
|
|
79
|
+
listas y labels existentes del método y borra la card temporal del smoke test.
|
|
80
|
+
|
|
81
|
+
## Verificá que funciona
|
|
82
|
+
|
|
83
|
+
Primero, inspeccioná la configuración de Claude Code:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
claude mcp list
|
|
87
|
+
claude mcp get planka
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Después cerrá y volvé a abrir Claude Code por completo. Si elegiste `.mcp.json`,
|
|
91
|
+
abrí Claude Code dentro de ese proyecto y aprobá el servidor de proyecto cuando lo pida.
|
|
92
|
+
|
|
93
|
+
Pedile a Claude Code:
|
|
94
|
+
|
|
95
|
+
```text
|
|
96
|
+
Mostrame mis proyectos y boards de Planka. En la lista Pending, creá una card llamada
|
|
97
|
+
"MCP está funcionando" con la descripción "Creada desde Claude Code" y volvé a leerla.
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Si Claude no ve las tools, reinicialo primero y después seguí
|
|
101
|
+
[Solución de problemas](docs/troubleshooting.md).
|
|
102
|
+
|
|
103
|
+
## Las 24 tools
|
|
104
|
+
|
|
105
|
+
Los IDs son strings. Empezá con `planka_get_structure` y usá los IDs que devuelve
|
|
106
|
+
Planka; no los adivines.
|
|
107
|
+
|
|
108
|
+
| Tool | Qué hace |
|
|
109
|
+
|---|---|
|
|
110
|
+
| `planka_get_structure` | Lista proyectos, boards y listas visibles |
|
|
111
|
+
| `planka_get_board` | Lee un board con listas, cards, labels y conteos opcionales de tareas |
|
|
112
|
+
| `planka_list_lists` | Lista las columnas de un board con sus conteos de cards, sin las cards |
|
|
113
|
+
| `planka_board_summary` | Resumen en una llamada: columnas, labels y las cards que esperan una decisión |
|
|
114
|
+
| `planka_list_cards` | Lee una sola columna, paginada y sin descripciones por defecto |
|
|
115
|
+
| `planka_find_cards` | Busca cards de un board por label, texto o columna |
|
|
116
|
+
| `planka_create_card` | Crea una card y puede agregar tareas y labels |
|
|
117
|
+
| `planka_get_card` | Lee el detalle completo de una card |
|
|
118
|
+
| `planka_update_card` | Actualiza título, descripción, vencimiento o estado de completado |
|
|
119
|
+
| `planka_move_card` | Mueve una card a otra lista o posición |
|
|
120
|
+
| `planka_delete_card` | Borra una card permanentemente |
|
|
121
|
+
| `planka_create_tasks` | Agrega tareas de checklist a una card |
|
|
122
|
+
| `planka_update_task` | Renombra o completa una tarea |
|
|
123
|
+
| `planka_delete_task` | Borra una tarea |
|
|
124
|
+
| `planka_manage_labels` | Crea, actualiza o borra labels del board |
|
|
125
|
+
| `planka_set_card_labels` | Agrega o quita labels y verifica el estado final |
|
|
126
|
+
| `planka_add_comment` | Agrega un comentario por el endpoint dedicado de Planka 2.x |
|
|
127
|
+
| `planka_get_comments` | Lee comentarios por el endpoint dedicado |
|
|
128
|
+
| `planka_manage_comment` | Edita o borra un comentario existente |
|
|
129
|
+
| `planka_manage_lists` | Crea, actualiza o borra listas del board |
|
|
130
|
+
| `planka_add_attachment` | Sube un archivo local a una card y verifica que quedó |
|
|
131
|
+
| `planka_get_attachments` | Lista los adjuntos de una card con tipo, tamaño y URL de descarga |
|
|
132
|
+
| `planka_view_attachment` | Devuelve el contenido de un adjunto; las imágenes vuelven visibles |
|
|
133
|
+
| `planka_delete_attachment` | Borra un adjunto |
|
|
134
|
+
|
|
135
|
+
`planka_get_board` devuelve el board entero, que suele ser más de lo que la
|
|
136
|
+
pregunta necesita. Las cuatro lecturas acotadas responden preguntas más chicas y
|
|
137
|
+
devuelven mucho menos texto: medido sobre un board de 100 cards,
|
|
138
|
+
`planka_list_lists` devolvió 39 veces menos que `planka_get_board`,
|
|
139
|
+
`planka_board_summary` 16 veces menos, y `planka_find_cards` entre 18 y 56 veces
|
|
140
|
+
menos según el filtro. Además informan `total`, `returned` y `hasMore`, así que
|
|
141
|
+
una respuesta recortada nunca parece completa.
|
|
142
|
+
|
|
143
|
+
Todos los campos y un payload completo por tool están en la
|
|
144
|
+
[referencia de tools](docs/tools.md).
|
|
145
|
+
|
|
146
|
+
## Flujo de agentes opcional
|
|
147
|
+
|
|
148
|
+
El servidor MCP funciona por sí solo. El método opcional resuelve otro problema:
|
|
149
|
+
preservar por qué existe un trabajo, qué cambió y qué sigue siendo cierto entre
|
|
150
|
+
sesiones de agentes.
|
|
151
|
+
|
|
152
|
+
Adoptalo por capas:
|
|
153
|
+
|
|
154
|
+
1. Usá sólo las tools MCP.
|
|
155
|
+
2. Sumá los estados del board, la plantilla de card y los handshakes humanos.
|
|
156
|
+
3. Sumá un worktree por card con un director que coordina obreros.
|
|
157
|
+
|
|
158
|
+
Empezá por [Un board que sobrevive a la sesión](workflow/README.md). La
|
|
159
|
+
[plantilla del board](workflow/board-template.md), las
|
|
160
|
+
[skills copiables de Claude Code](workflow/skills/) y el
|
|
161
|
+
[helper opcional de worktrees](workflow/worktrees/README.md) son piezas independientes.
|
|
162
|
+
|
|
163
|
+
## Solución de problemas
|
|
164
|
+
|
|
165
|
+
- [Síntomas, causas y fixes exactos](docs/troubleshooting.md)
|
|
166
|
+
- [Por qué Planka 2.x rompe MCP viejos en silencio](docs/planka-2x-gotchas.md)
|
|
167
|
+
- [Payloads completos de las tools](docs/tools.md)
|
|
168
|
+
|
|
169
|
+
Al reportar un bug, incluí la versión de Planka, la de Node, el nombre de la tool
|
|
170
|
+
y el texto del error. Nunca pegues credenciales ni access tokens.
|
|
171
|
+
|
|
172
|
+
## Créditos y licencia
|
|
173
|
+
|
|
174
|
+
Este es un fork con licencia MIT de
|
|
175
|
+
[`gogogadgetbytes/planka-mcp`](https://github.com/gogogadgetbytes/planka-mcp),
|
|
176
|
+
no una implementación original desde cero. [CREDITS.md](CREDITS.md) documenta
|
|
177
|
+
la atribución del upstream, los fixes mantenidos y los pull requests sin respuesta.
|
|
178
|
+
|
|
179
|
+
[LICENSE](LICENSE) conserva los avisos del autor original y de los contribuidores actuales.
|
|
180
|
+
|
|
181
|
+
## Desarrollo
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
npm ci
|
|
185
|
+
npm run build
|
|
186
|
+
npm test
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
El smoke real es opt-in porque modifica un board escribible y después limpia lo
|
|
190
|
+
creado. Ejercita las 24 tools por stdio y contrasta cada escritura contra la API
|
|
191
|
+
cruda de Planka: 64 checks con nombre.
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
export PLANKA_BASE_URL="https://planka.example.com"
|
|
195
|
+
export PLANKA_AGENT_EMAIL="agent@example.com"
|
|
196
|
+
export PLANKA_AGENT_PASSWORD="<TU_PASSWORD>"
|
|
197
|
+
export PLANKA_SMOKE_BOARD_ID="1234567890123456789"
|
|
198
|
+
npm run test:smoke
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
`npm run test:smoke` compila primero, así que no puede testear un `dist/` viejo.
|
|
202
|
+
Cuatro variables opcionales lo ajustan:
|
|
203
|
+
|
|
204
|
+
| Variable | Qué hace |
|
|
205
|
+
|---|---|
|
|
206
|
+
| `PLANKA_SMOKE_LIST_ID` | Columna donde se crea la card descartable. Sin esto elige una columna que parezca de descarte y, si no la hay, la primera |
|
|
207
|
+
| `PLANKA_SMOKE_FAIL_AFTER` | Inyecta un fallo después del check `<n>`, para probar que la limpieza igual corre |
|
|
208
|
+
| `PLANKA_MCP_ENTRY` | Punto de entrada del servidor. Por defecto `dist/index.js` |
|
|
209
|
+
| `VERBOSE` | Poné `1` para imprimir el payload de cada check |
|
|
210
|
+
|
|
211
|
+
Leé [CONTRIBUTING.md](CONTRIBUTING.md) antes de abrir un cambio. La identidad de
|
|
212
|
+
release está centralizada en [project.identity.json](project.identity.json):
|
|
213
|
+
actualizala y ejecutá `npm run sync:identity` antes de publicar con tu namespace.
|
package/README.md
ADDED
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# planka-mcp
|
|
2
|
+
|
|
3
|
+
Control a Planka 2.x board from Claude Code through 24 MCP tools.
|
|
4
|
+
Writes are re-read and verified, so a reported success matches the board.
|
|
5
|
+
An optional workflow turns that board into durable memory for agent work.
|
|
6
|
+
|
|
7
|
+
[Leer en español](README.es.md)
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
You talk to Claude Code
|
|
11
|
+
│
|
|
12
|
+
▼
|
|
13
|
+
planka-mcp (stdio) ─── HTTPS + JSON ───▶ Planka 2.x
|
|
14
|
+
│ │
|
|
15
|
+
└──── reads the result back ◀──────┘
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
> [!WARNING]
|
|
19
|
+
> The old `@gogogadgetbytes/planka-mcp` package can report success while doing
|
|
20
|
+
> nothing on Planka 2.x. Read [the five silent-failure gotchas](docs/planka-2x-gotchas.md)
|
|
21
|
+
> before replacing an existing installation.
|
|
22
|
+
|
|
23
|
+
## New to MCP? Read this first
|
|
24
|
+
|
|
25
|
+
MCP is a standard that lets Claude Code call tools provided by another program.
|
|
26
|
+
This repository runs a small local program that translates those tool calls into Planka API requests.
|
|
27
|
+
It needs Planka credentials because it acts as a dedicated Planka user, not as Claude itself.
|
|
28
|
+
The credentials stay on your machine and are never written into the project-level `.mcp.json` file.
|
|
29
|
+
Claude Code loads MCP servers when a session starts, so restart it after setup or configuration changes.
|
|
30
|
+
|
|
31
|
+
## Requirements
|
|
32
|
+
|
|
33
|
+
- Node.js 18 or newer and `npm`
|
|
34
|
+
- A reachable Planka 2.x instance
|
|
35
|
+
- A dedicated Planka user that can see the target project and board
|
|
36
|
+
- Claude Code installed and available as `claude`
|
|
37
|
+
- A project-manager role only if setup must create a board
|
|
38
|
+
|
|
39
|
+
Linux and macOS are supported. No Bun runtime is required.
|
|
40
|
+
|
|
41
|
+
## Install in 5 minutes
|
|
42
|
+
|
|
43
|
+
Clone the repository and run the guided installer:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
git clone https://github.com/omnicoreos/planka-mcp.git
|
|
47
|
+
cd planka-mcp
|
|
48
|
+
./scripts/setup.sh
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Setup asks for the Planka URL, agent email or username, and password. It validates
|
|
52
|
+
those credentials before writing configuration, lets you select or create a board,
|
|
53
|
+
and then runs a real create/label/comment/delete smoke test.
|
|
54
|
+
|
|
55
|
+
It offers two Claude Code configurations:
|
|
56
|
+
|
|
57
|
+
| Choice | Use it when | Where it lives |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| `claude mcp add` | You want the easiest personal setup | Claude Code user configuration |
|
|
60
|
+
| Project `.mcp.json` | A team should share the server entry | `<YOUR_PROJECT>/.mcp.json`, safe to commit |
|
|
61
|
+
|
|
62
|
+
In both cases, setup stores credentials outside Git in
|
|
63
|
+
`~/.config/planka-mcp/config.json` with mode `0600` and creates the private launcher
|
|
64
|
+
`~/.local/bin/planka-mcp`. A generated team configuration contains no password:
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"mcpServers": {
|
|
69
|
+
"planka": {
|
|
70
|
+
"type": "stdio",
|
|
71
|
+
"command": "${HOME}/.local/bin/planka-mcp",
|
|
72
|
+
"args": []
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
The installer is safe to rerun. It updates the `planka` entry, reuses existing
|
|
79
|
+
workflow lists and labels, and deletes its temporary smoke-test card.
|
|
80
|
+
|
|
81
|
+
## Verify it works
|
|
82
|
+
|
|
83
|
+
First, inspect Claude Code's configuration:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
claude mcp list
|
|
87
|
+
claude mcp get planka
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Then fully restart Claude Code. If you chose `.mcp.json`, open Claude Code in that
|
|
91
|
+
project and approve the project-scoped server when prompted.
|
|
92
|
+
|
|
93
|
+
Ask Claude Code:
|
|
94
|
+
|
|
95
|
+
```text
|
|
96
|
+
Show me my Planka projects and boards. In the Pending list, create a card named
|
|
97
|
+
"MCP is working" with the description "Created from Claude Code", then read it back.
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
If Claude cannot see the tools, restart first and then follow
|
|
101
|
+
[Troubleshooting](docs/troubleshooting.md).
|
|
102
|
+
|
|
103
|
+
## The 24 tools
|
|
104
|
+
|
|
105
|
+
IDs are strings. Start with `planka_get_structure`, then use IDs returned by
|
|
106
|
+
Planka; do not guess them.
|
|
107
|
+
|
|
108
|
+
| Tool | What it does |
|
|
109
|
+
|---|---|
|
|
110
|
+
| `planka_get_structure` | Lists visible projects, boards, and lists |
|
|
111
|
+
| `planka_get_board` | Reads one board with its lists, cards, labels, and optional task counts |
|
|
112
|
+
| `planka_list_lists` | Lists a board's columns with card counts, and no cards |
|
|
113
|
+
| `planka_board_summary` | One-call briefing: columns, labels, and the cards waiting on a decision |
|
|
114
|
+
| `planka_list_cards` | Reads one column, paginated, without descriptions by default |
|
|
115
|
+
| `planka_find_cards` | Searches a board's cards by label, text, or column |
|
|
116
|
+
| `planka_create_card` | Creates a card and can attach tasks and labels |
|
|
117
|
+
| `planka_get_card` | Reads complete card details |
|
|
118
|
+
| `planka_update_card` | Updates title, description, due date, or completion |
|
|
119
|
+
| `planka_move_card` | Moves a card to another list or position |
|
|
120
|
+
| `planka_delete_card` | Permanently deletes a card |
|
|
121
|
+
| `planka_create_tasks` | Adds checklist tasks to a card |
|
|
122
|
+
| `planka_update_task` | Renames or completes a task |
|
|
123
|
+
| `planka_delete_task` | Deletes a task |
|
|
124
|
+
| `planka_manage_labels` | Creates, updates, or deletes board labels |
|
|
125
|
+
| `planka_set_card_labels` | Adds or removes labels and verifies the final state |
|
|
126
|
+
| `planka_add_comment` | Adds a comment through Planka 2.x's dedicated endpoint |
|
|
127
|
+
| `planka_get_comments` | Reads comments through the dedicated endpoint |
|
|
128
|
+
| `planka_manage_comment` | Edits or deletes an existing comment |
|
|
129
|
+
| `planka_manage_lists` | Creates, updates, or deletes board lists |
|
|
130
|
+
| `planka_add_attachment` | Uploads a local file to a card and verifies it landed |
|
|
131
|
+
| `planka_get_attachments` | Lists a card's attachments with type, size, and download URL |
|
|
132
|
+
| `planka_view_attachment` | Returns an attachment's content; images come back viewable |
|
|
133
|
+
| `planka_delete_attachment` | Deletes an attachment |
|
|
134
|
+
|
|
135
|
+
`planka_get_board` returns the entire board, which is often more than the
|
|
136
|
+
question needs. The four scoped reads answer narrower questions and return far
|
|
137
|
+
less text: measured on a board of 100 cards, `planka_list_lists` returned 39
|
|
138
|
+
times less than `planka_get_board`, `planka_board_summary` 16 times less, and
|
|
139
|
+
`planka_find_cards` between 18 and 56 times less depending on the filter. They
|
|
140
|
+
also report `total`, `returned`, and `hasMore`, so a clipped answer never looks
|
|
141
|
+
complete.
|
|
142
|
+
|
|
143
|
+
Every input field and a complete payload for every tool are in
|
|
144
|
+
[Tools reference](docs/tools.md).
|
|
145
|
+
|
|
146
|
+
## Optional agent workflow
|
|
147
|
+
|
|
148
|
+
The MCP server works on its own. The optional method solves a different problem:
|
|
149
|
+
preserving why work exists, what changed, and what remains true between agent
|
|
150
|
+
sessions.
|
|
151
|
+
|
|
152
|
+
Adopt it in layers:
|
|
153
|
+
|
|
154
|
+
1. Use only the MCP tools.
|
|
155
|
+
2. Add the board states, card template, and human handshakes.
|
|
156
|
+
3. Add one worktree per card with a director coordinating workers.
|
|
157
|
+
|
|
158
|
+
Start with [A board that survives the session](workflow/README.md). The
|
|
159
|
+
[board template](workflow/board-template.md), copyable
|
|
160
|
+
[Claude Code skills](workflow/skills/), and optional
|
|
161
|
+
[worktree helper](workflow/worktrees/README.md) are independent pieces.
|
|
162
|
+
|
|
163
|
+
## Troubleshooting
|
|
164
|
+
|
|
165
|
+
- [Symptoms, causes, and exact fixes](docs/troubleshooting.md)
|
|
166
|
+
- [Why Planka 2.x breaks older MCP servers silently](docs/planka-2x-gotchas.md)
|
|
167
|
+
- [Complete tool payloads](docs/tools.md)
|
|
168
|
+
|
|
169
|
+
When reporting a bug, include the Planka version, Node version, the tool name,
|
|
170
|
+
and the error text. Never paste credentials or access tokens.
|
|
171
|
+
|
|
172
|
+
## Credits and license
|
|
173
|
+
|
|
174
|
+
This is an MIT-licensed fork of
|
|
175
|
+
[`gogogadgetbytes/planka-mcp`](https://github.com/gogogadgetbytes/planka-mcp),
|
|
176
|
+
not an original-from-scratch implementation. See [CREDITS.md](CREDITS.md) for
|
|
177
|
+
the upstream attribution, maintained fixes, and unanswered pull requests.
|
|
178
|
+
|
|
179
|
+
See [LICENSE](LICENSE) for the original and current contributor notices.
|
|
180
|
+
|
|
181
|
+
## Development
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
npm ci
|
|
185
|
+
npm run build
|
|
186
|
+
npm test
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
The real smoke test is opt-in because it mutates a writable board and then cleans
|
|
190
|
+
up after itself. It drives all 24 tools over stdio and cross-checks every write
|
|
191
|
+
against the raw Planka API — 64 named checks:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
export PLANKA_BASE_URL="https://planka.example.com"
|
|
195
|
+
export PLANKA_AGENT_EMAIL="agent@example.com"
|
|
196
|
+
export PLANKA_AGENT_PASSWORD="<YOUR_PASSWORD>"
|
|
197
|
+
export PLANKA_SMOKE_BOARD_ID="1234567890123456789"
|
|
198
|
+
npm run test:smoke
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
`npm run test:smoke` builds first, so it cannot test a stale `dist/`. Four
|
|
202
|
+
optional variables tune it:
|
|
203
|
+
|
|
204
|
+
| Variable | What it does |
|
|
205
|
+
|---|---|
|
|
206
|
+
| `PLANKA_SMOKE_LIST_ID` | Column where the scratch card is created. Without it, a scratch-looking column is picked, falling back to the first one |
|
|
207
|
+
| `PLANKA_SMOKE_FAIL_AFTER` | Injects a failure after check `<n>`, to prove that cleanup still runs |
|
|
208
|
+
| `PLANKA_MCP_ENTRY` | Server entry point. Defaults to `dist/index.js` |
|
|
209
|
+
| `VERBOSE` | Set to `1` to print each check's payload |
|
|
210
|
+
|
|
211
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) before opening a change. Release identity
|
|
212
|
+
is centralized in [project.identity.json](project.identity.json); update it and
|
|
213
|
+
run `npm run sync:identity` before publishing under your own namespace.
|