{"name":"io.github.kenzotp/mcp-server-zuuna","slug":"kenzotp-mcp-server-zuuna","title":null,"description":"MCP server for Zuuna: coding agents work your git-truth kanban board via the v1 API. 73 tools.","url":"https://mcp.market/server/kenzotp-mcp-server-zuuna","rating":null,"grade":"B","score":80,"certified":false,"status":"active","category":"devtools","tags":["devtools"],"presence":{"score":28,"stars":0,"forks":0,"downloads_week":479,"last_push_at":"2026-09-26T02:13:44.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/kenzotp/mcp-server-zuuna","website":null,"version":"0.3.0","remotes":[],"packages":[{"registryType":"npm","identifier":"mcp-server-zuuna","version":"0.3.0","transport":{"type":"stdio"},"environmentVariables":[{"description":"Bearer API token from your Zuuna workspace. Grant only the scopes the agent needs (boards:read + cards:read is enough for a read-only observer).","isRequired":true,"format":"string","isSecret":true,"name":"ZUUNA_API_TOKEN"},{"description":"Zuuna base URL. Defaults to https://app.zuuna.de.","format":"string","name":"ZUUNA_BASE_URL"},{"description":"Per-request timeout in milliseconds. Defaults to 15000.","format":"string","name":"ZUUNA_TIMEOUT_MS"}]}],"tools":[{"name":"zuuna_add_cards_to_sprint","description":"Pull cards into a sprint. Each must belong to the sprint's own group. If the sprint already has a materialized (started) board, a card moves onto it; otherwise it is simply planned in. Response lists which ids were added vs. skipped, with a reason.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_add_checklist_item","description":"Add a checklist item to a card (appended at the end).","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_add_relation","description":"Link this card to another. `type` is one of the catalog values (\"clones\" is set automatically by Zuuna and is refused here). `direction` (outward|inward, default outward) picks which card is the semantic SOURCE for a non-symmetric type — e.g. outward \"blocks\" means THIS card blocks the target. A scheduling type (fs/ss/ff/sf) may carry lagDays and is refused if it would create a dependency cycle.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_archive_card","description":"Archive a card (reversible — see zuuna_unarchive_card).","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_board","description":"Get one board assembled: its columns (in order, with WIP limits and SLA hours) and its cards (key, title, column, priority, type). The card list pages at 200; when more cards exist the response carries cardsTruncated and a nextCursor — pass that back as cardsCursor for the next page. Accepts the board id, its key (card prefix) or its title.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_boards","description":"List the workspace's boards (non-archived, non-private). Each entry carries id, title, key (card prefix), groupId. Use the id with zuuna_board.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_card","description":"Get a card's full detail: description, priority, type, due/start dates, checklist counts, assignees, epic, custom field values, attachment metadata.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_comment","description":"Add a comment to a card. The author is the user who created the API token. @mentions notify.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_create_board","description":"Create an empty board (no columns yet — add them with zuuna_create_column) in a group. Body: title, groupId.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_create_card","description":"Create a card on a board. Title is required; give the target column by id or by title (omitted = the board's first column). idempotencyKey makes a retry safe: re-sending the same key after a lost response or a 5xx returns the ORIGINAL card instead of a duplicate.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_create_cards","description":"Create up to 50 cards on ONE board in a single call. Each item validates exactly like zuuna_create_card (title required; target column by id only) and the answer is one result per item: created (id, key, title, status, columnId) or the error that item alone would have gotten. The card cap counts the whole batch; board, closed-sprint and limit errors stay whole-request.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_create_column","description":"Add a column to an existing (non-archived) board.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_create_epic","description":"Create an epic in a group: a real ticket with its own key (a board-less group card), referencable and linkable like any other card. Title is required; colour comes from the 8-name palette and defaults to purple.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_create_recurring_card","description":"Start a recurring-card series on a board: every everyN unit(s) (days|weeks|months) it mints a card from the given template, until endAt (if set).","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_create_release","description":"Plan or publish a release in a group. Provide releaseId (to fill in an existing planned release), or a name/tag to create one. publish defaults to false when no tag/commits context is given — pass publish: true to mark it RELEASED and fire release.published to webhook subscribers immediately.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_create_sprint","description":"Create a PLANNED sprint in a group.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_create_webhook","description":"Register a webhook endpoint. The response's `secret` is the ONLY time the signing secret is ever shown — store it immediately, there is no way to read it back.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_delete_attachment","description":"Remove an attachment from a card. Requires confirm: true.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_delete_card","description":"Move a card to Trash (restorable for 30 days via zuuna_restore_card, then permanently purged). Refused with time_entries_exist if the card carries logged time, UNLESS confirm is true — passing confirm also acknowledges deleting those hours. Requires confirm: true.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_delete_checklist_item","description":"Remove a checklist item. Requires confirm: true.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_delete_recurring_card","description":"Cancel a recurring-card series for good (no trash). Requires confirm: true.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_delete_relation","description":"Remove a relation, from either card it connects. Requires confirm: true.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_delete_release","description":"Permanently delete a release (its commit/merge history, sprint links, card-release links and shipped-card archive all cascade with it). Requires confirm: true.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_delete_time_entry","description":"Remove a logged time entry. Requires confirm: true.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_delete_webhook","description":"Remove a webhook endpoint (its delivery log goes with it). Requires confirm: true.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_get_attachment","description":"Get one attachment's metadata (filename, MIME type, byte size). Never returns the file's bytes — use zuuna_list_attachments first to find the attachmentId.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_get_release","description":"Get one release's detail: state, dates, tag, shipped card/point counts.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_get_sprint","description":"Get a sprint plus the cards currently in it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_import_time_entries","description":"Bulk-import normalized time entries (up to 200 per call) — from Clockify/Toggl/Harvest or a script. Each entry needs cardKey/cardId (or a PREFIX-N in description) plus seconds or start+end; userEmail attributes it. Idempotent on (source, externalId): repeating one updates it rather than duplicating it. One bad entry does not fail the rest.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_link_git_branches","description":"REPLACE-ALL snapshot of a repo's in-flight branches in a group (up to 500). Each needs at least name and headSha; a branch named for a card (\"ZNA-249-…\" or matching the group's prefix) links automatically. An empty branches array is refused unless confirmEmpty is true — that guard exists so a half-failed snapshot cannot silently wipe the page.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_active_timers","description":"List every running timer visible to this token, optionally filtered to one member by email.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_attachments","description":"List a card's attachments (metadata only: id, filename, MIME type, size, who uploaded it).","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_automations","description":"Read a board's automation rules: trigger, conditions, actions, enabled, recent run outcomes. Read-only — automations cannot be created or edited through this server, only inspected. A sendWebhook action's URL is redacted (it can carry a chat-app incoming-webhook secret).","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_board_cards","description":"List a board's cards, in board order by default (column then position). `archived` narrows to false|true|all (default false); `updatedSince` (ISO 8601) narrows to cards changed after it, for incremental sync.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_board_fields","description":"Read the custom fields attached to a board: id, name, type, in display order. For SELECT, MULTISELECT and TAGS fields, options is the option vocabulary a card's customFields value may use; for every other type options is null. update_card's customFields argument is keyed by these field ids.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_card_time","description":"List logged time entries on a card, newest first, plus the card's total seconds.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_checklist","description":"Read a card's checklist: every item plus the total/completed counts the card face shows.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_columns","description":"List a board's columns in order — id, title, isDone, statusCategory, position, WIP limit, SLA hours. These columnId values are what a card move expects.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_comments","description":"Read a card's discussion, oldest first — the order it happened, and the order an incremental sync appends in.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_deployments","description":"List deployment history, optionally narrowed to a group and/or environment.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_epics","description":"List a group's epics — id, key, title, colour. An epic is a real card (Prisma model Label; the UI calls it an Epic), so its key resolves through the ordinary card tools too.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_group_cards","description":"List every card in a group, whether it stands on a board or in the group's backlog (a board-less card, columnId null). Use this to discover backlog cards — no other list surfaces them. `placement` narrows to board|backlog|all (default all).","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_group_members","description":"List a group's members: id, name, email. These ids are the valid values for a card's assigneeIds.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_groups","description":"List the workspace's groups (Prisma model Team; the UI calls this a Group — it owns boards, sprints, releases and the card-key prefix). A restricted group this token may not act in is omitted, not merely flagged. The returned id is what every groupId argument elsewhere expects.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_recurring_cards","description":"List a board's recurring-card series, paused and active both.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_relations","description":"List a card's relations to other cards (blocks, depends on, subtask of, scheduling links, ...), each with its direction relative to this card.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_releases","description":"List a group's releases, optionally narrowed to a state (PLANNED|RELEASED|ARCHIVED).","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_sprints","description":"List the workspace's sprints, optionally narrowed to one group and/or state (PLANNED|ACTIVE|CLOSED).","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_webhook_deliveries","description":"Read an endpoint's last 20 delivery attempts (payload truncated to 2 KB; a payload naming a board this token cannot read is redacted).","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_list_webhooks","description":"List this workspace's webhook endpoints. Never returns a signing secret (only the create call does, once).","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_log_time","description":"Log a CLOSED time entry on a card — work already done. Provide seconds or a duration string (\"2h 30m\"). For an ongoing timer use zuuna_start_timer / zuuna_stop_timer instead.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_me","description":"Show the identity of the Zuuna API token in use: organization, plan, granted scopes and — only when the workspace's subscription has lapsed — the grace-window deadline after which every call here will start failing. Also lists, as hiddenTools, every tool this token's scopes hide, each with the scope(s) that would unlock it. Call this first to learn what this token may do; a tool absent from the to","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_move_card","description":"Move a card to another column on the SAME board. Give the target column by id or by title (resolved against the card's own board). For moving to a DIFFERENT board use zuuna_move_card_to_board.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_move_card_to_board","description":"Move a card to a DIFFERENT board (cross-board move). Optional targetColumnId; omitted, the card lands in the target's default column for its current status category.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_record_git_events","description":"Record git events (commit/branch/pr, up to 1000 per call) via smart-commits (\"PREFIX-123\" in the ref or message) to link them to cards.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_remove_card_from_sprint","description":"Take a card out of its sprint (clears its sprint membership). A card standing on the sprint's OWN materialized board leaves it for the group's backlog; a card on an ordinary board stays exactly where it is.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_report_ci_checks","description":"Record CI status checks (up to 1000 per call), each attached to whichever card its commit/branch/PR or description names.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_report_deployment","description":"Report a deployment's progress (building|succeeded|failed|...) or update the one in flight. Idempotent on (environment, externalId) — repeat callbacks from the same CI run update ONE row. groupId binds it to a release/board pipeline; omitted, it is still recorded workspace-wide.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_restore_card","description":"Pull a card back out of Trash. Refused if the workspace is at its card limit (an archived+trashed card is exempt).","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_search_cards","description":"Search cards workspace-wide: the one list that needs no board or group id up front. Filters narrow: q (case-insensitive text in title + description), groupId, boardId, columnId, assigneeId, epicId, priority (HIGHEST|HIGH|NORMAL|LOW|LOWEST), label (a tag option id or \"<fieldId>:<optionId>\" token). archived narrows to false|true|all (default false); updatedSince (ISO 8601) narrows to cards changed a","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_start_timer","description":"Start a running timer on a card. Idempotent: starting an already-running timer for the same person is a no-op, not an error. Optional userEmail delegates the timer to another workspace member (e.g. relaying a Slack action) — resolved against THIS workspace's membership only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_stop_timer","description":"Stop a card's running timer, closing it at the elapsed duration. A no-op (not an error) if nothing is running.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_test_webhook","description":"Send a real `ping` delivery to one endpoint, regardless of its subscribed events, and report the fresh delivery status.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_unarchive_card","description":"Restore an archived card to active (the inverse of zuuna_archive_card). Refused if the workspace is at its card limit.","write_action":false,"price_micros":0,"input_schema":null},{"name":"zuuna_update_card","description":"Edit a card. Only the fields you send change: title, description, priority, type, dueDate, startDate, estimateSeconds, storyPoints, ready, columnId (move within the SAME board — a cross-board move is zuuna_move_card_to_board), assigneeIds (REPLACES the full set; [] clears everyone), customFields (object keyed by field id; null/empty clears one — zuuna_list_board_fields names the ids and the option","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_update_checklist_item","description":"Rename and/or tick a checklist item. Only the fields you send change.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_update_epic","description":"Edit an epic. Only the fields you send change: title, description, colour.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_update_recurring_card","description":"Edit a series' interval, end date and/or pause state (enabled). Resuming a paused series re-schedules its next run from now, so it never bursts out catch-up cards.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_update_release","description":"Correct a release. action=edit changes name/description/releaseDate/notes/tag (only the fields you send); unpublish reverts a RELEASED release to PLANNED (keeps its shipped-card archive); archive/unarchive is a display filter, not a data lock.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_update_sprint","description":"Update a sprint's name/goal/dates. Only the fields you send change. Sprint lifecycle (start/close) is not exposed here — it materializes boards and archival metrics and stays an in-app action.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_update_time_entry","description":"Correct a logged time entry's duration and/or note. Refused while the entry's timer is still running — stop it first.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_update_webhook","description":"Edit a webhook endpoint. Only the fields you send change; enabled: false is how a subscriber pauses itself without losing the registration.","write_action":true,"price_micros":0,"input_schema":null},{"name":"zuuna_upload_attachment","description":"Upload a file onto a card from a local file path, or from base64 plus a filename. The same limits the REST upload route enforces apply and its errors surface verbatim: 10 MB per file, the workspace storage cap (409 limit_reached), executable extensions refused, and the token creator needs a verified email.","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":80,"grade":"B","scanned_at":"2026-10-02T22:39:46.676Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-02T22:39:46.583Z","components":{"code":{"score":25,"max":25,"notes":["53 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 7 days ago"]},"identity":{"score":6,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"mcp-server-zuuna","version":"0.3.0","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":2,"publishedAt":"2026-09-26T02:15:03.037Z","repositoryUrl":"git+https://github.com/kenzotp/mcp-server-zuuna.git","weeklyDownloads":479}],"repo":{"found":true,"owner":"kenzotp","repo":"mcp-server-zuuna","archived":false,"pushedAt":"2026-09-26T02:13:44Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/293611221?v=4","ownerCreatedAt":"2026-06-14T14:52:17Z","license":"MIT"},"icon":{"url":null,"source":"none"},"presence":{"stars":0,"forks":0,"downloadsWeek":479,"license":"MIT","lastPushAt":"2026-09-26T02:13:44.000Z","score":28}}}},"grade_history":[],"reviews":[]}