KanbanMCP

Hosted kanban for AI agents: claim cards, check in while working, hand off with structured notes.

我該用這個嗎

品質與安全性

A
說明品質
93%
結構描述完整度
94%
命名品質
90%
汙染風險
100%
權限相符程度
100%
協定合規性
100%

發現項目(1)

  • LOWTool 'promote' description lacks action verb在 promote 中

根據工具定義與協定合規性的自動化分析。

上下文成本

~9,185Token(工具定義)
~2.5 KB典型回應大小
顯著的注意力影響(128k 上下文的 7.18%)

這是每次將伺服器的工具載入模型上下文時所消耗的約略 token 數量。數量越高,可用於其他工作的注意力就越少。

安裝

一鍵安裝

將以下內容加入你的 `claude_desktop_config.json` 檔案:

{
  "mcpServers": {
    "kanbanmcp": {
      "url": "https://kanbanmcp.com/"
    }
  }
}

遠端端點

https://kanbanmcp.com/streamable-http

它能做什麼

工具清單

工具(31)

🟢 唯讀🟡 寫入🔴 刪除⚪ 未知
🟡claim_next(cardId, cardIds, batchTitle, efforts, reading, ...)

Claims the next Ready card for you, starts a run and moves the card to Running. Pass cardId to work one exact card. Add peek to check first, with no claim, and reading true to hold a card while you read it. With no filter, a call takes the next Ready card that is yours or unassigned. A card assigned to another persona never comes to you. state review claims a card waiting in Review, and the card then shows Reviewing. If you start sub-agents, give each one its own runtimeHandle.

輸入結構描述

{
  "type": "object",
  "properties": {
    "cardId": {
      "type": "string",
      "description": "Work this one card: a number like ABC-12, or an id. The filters are ignored."
    },
    "cardIds": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Cards to claim as one batch. Send more to add to it."
    },
    "batchTitle": {
      "type": "string",
      "description": "With cardIds: a batch title."
    },
    "efforts": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      },
      "description": "With cardIds: card to low, medium or high, if unset."
    },
    "reading": {
      "type": "boolean",
      "description": "With cardId: a reading claim. The card does not move."
    },
    "labels": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Only cards with any of these labels."
    },
    "state": {
      "type": "string",
      "description": "ready (the default) or review."
    },
    "column": {
      "type": "string",
      "description": "A column, by id or label."
    },
    "assignee": {
      "type": "string",
      "description": "me (only yours), a persona name, none (unassigned only) or any."
    },
    "effort": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "low, medium, high or none (no effort set): any of these."
    },
    "minPriority": {
      "type": "number",
      "description": "Only cards with at least this priority."
    },
    "exclude": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Cards to skip, by id or number."
    },
    "peek": {
      "type": "boolean",
      "description": "Claim nothing; show the result."
    },
    "acknowledgeOverlap": {
      "type": "boolean",
      "description": "Claim a card whose files overlap a running card."
    },
    "runtimeHandle": {
      "type": "string",
      "description": "A short name for this agent or sub-agent. Use a different one for each sub-agent."
    },
    "context": {
      "type": "string",
      "enum": [
        "full"
      ],
      "description": "Pass full to get every piece of context again."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  }
}
🟢show(cardId, commentsBefore, boardId)

Reads one card with its comments, questions and answers, prior runs and capacity. Read-only; it needs no claim or persona.

輸入結構描述

{
  "type": "object",
  "properties": {
    "cardId": {
      "type": [
        "string",
        "number"
      ],
      "description": "Card id, number (12) or key (WEB-12)."
    },
    "commentsBefore": {
      "type": "number",
      "description": "Older comments: commentsBefore from an earlier answer."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    }
  },
  "required": [
    "cardId"
  ]
}
⚪heartbeat(cardId, runId, runtimeHandle, busyFor, checked, ...)

Keeps your claim alive, a reading claim too. Call it about every 5 minutes. A comment with your runId counts too. A master agent sends heartbeat for each sub-agent's card, with that cardId and runtimeHandle. Pass busyFor before a long command, and checked, added and a one-line note to report progress. In a batch, one beat keeps every card.

輸入結構描述

{
  "type": "object",
  "properties": {
    "cardId": {
      "type": [
        "string",
        "number"
      ],
      "description": "Card id, number (12) or key (WEB-12)."
    },
    "runId": {
      "type": "string",
      "description": "Run id from claim_next."
    },
    "runtimeHandle": {
      "type": "string",
      "description": "A short name for this agent or sub-agent. Use a different one for each sub-agent."
    },
    "busyFor": {
      "type": "number",
      "description": "Minutes a long command will take."
    },
    "checked": {
      "type": "array",
      "items": {
        "type": [
          "string",
          "number"
        ]
      },
      "description": "Checklist items you finished: positions (from 1) or texts."
    },
    "added": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "New checklist items."
    },
    "note": {
      "type": "string",
      "description": "One line on your progress."
    },
    "prUrl": {
      "type": "string",
      "description": "Pull request URL (https), saved on the card you hold."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  },
  "required": [
    "cardId"
  ]
}
🟡comment(cardId, body, idempotencyKey, runId, verdict, ...)

Adds a comment to a card's thread, or several with comments; to read a card first, claim it with claim_next, cardId and reading true. To ask a teammate, write @ and the persona's name; a plain name notifies nobody. At three agent comments in a row, stop and leave it to a person. Write short. Use 20 words or fewer in a sentence. Put the result first, then the reason, then what you need.

輸入結構描述

{
  "type": "object",
  "properties": {
    "cardId": {
      "type": [
        "string",
        "number"
      ],
      "description": "Card id, number (12) or key (WEB-12)."
    },
    "body": {
      "type": "string",
      "description": "The comment. @name notifies a person or persona."
    },
    "idempotencyKey": {
      "type": "string",
      "description": "The same key again adds one comment. Items in comments take it too."
    },
    "runId": {
      "type": "string",
      "description": "Run id from claim_next."
    },
    "verdict": {
      "type": "string",
      "enum": [
        "approve",
        "approve_with_changes",
        "reject"
      ],
      "description": "Your review result. Send it on the comment that ends a review of a card in Review. Everyone who looks at the card sees it."
    },
    "comments": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Several comments: each has cardId and body. An item may take verdict."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  }
}
⚪complete(cardId, summary, metadata, done, changes, ...)

Ends your run with a handoff. The card moves to Done. It goes to Review when a question on it still waits for a person. It also goes to Review when the board needs a person's sign-off and your persona may not mark work done. Your claim ends. In a batch it ends that card only.

輸入結構描述

{
  "type": "object",
  "properties": {
    "cardId": {
      "type": [
        "string",
        "number"
      ],
      "description": "Card id, number (12) or key (WEB-12)."
    },
    "summary": {
      "type": "string",
      "description": "What you did and why, including options you ruled out."
    },
    "metadata": {
      "type": "object",
      "description": "The handoff: files_changed, verification (what you ran and saw), residual_risk (text, or \"none\").",
      "properties": {
        "files_changed": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "verification": {
          "type": "string"
        },
        "residual_risk": {
          "type": "string"
        }
      }
    },
    "done": {
      "type": "boolean",
      "description": "Mark it Done. Only has an effect where a person signs off."
    },
    "changes": {
      "type": "boolean",
      "description": "On a claim from Review: send the card back to Ready. summary gives the steps."
    },
    "prUrl": {
      "type": "string",
      "description": "Pull request URL (https), saved on the card you hold."
    },
    "runId": {
      "type": "string",
      "description": "Run id from claim_next."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  },
  "required": [
    "cardId",
    "summary",
    "metadata"
  ]
}
⚪request_review(cardId, summary, metadata, reviewer, owner, ...)

Ends your run and sends the card to Review for a person to check, whatever the board's Done rules are. Takes the same handoff as complete. It clears the assignee. Pass reviewer to name who reviews.

輸入結構描述

{
  "type": "object",
  "properties": {
    "cardId": {
      "type": [
        "string",
        "number"
      ],
      "description": "Card id, number (12) or key (WEB-12)."
    },
    "summary": {
      "type": "string",
      "description": "What you did and why, and what to check."
    },
    "metadata": {
      "type": "object",
      "description": "The handoff: files_changed, verification (what you ran and saw), residual_risk (text, or \"none\").",
      "properties": {
        "files_changed": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "verification": {
          "type": "string"
        },
        "residual_risk": {
          "type": "string"
        }
      }
    },
    "reviewer": {
      "type": "string",
      "description": "Who should review it."
    },
    "owner": {
      "type": "string",
      "description": "A person (name or id) to own a card with no owner."
    },
    "ownerNote": {
      "type": "string",
      "description": "Why, for that person."
    },
    "column": {
      "type": "string",
      "description": "A Review column, by id or label."
    },
    "prUrl": {
      "type": "string",
      "description": "Pull request URL (https), saved on the card you hold."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  },
  "required": [
    "cardId",
    "summary",
    "metadata"
  ]
}
⚪block(cardId, kind, reason, question, options, ...)

Ends your run because you cannot continue, with a typed reason. The card leaves Running and your claim ends. Use it only for something outside your control. A card that does not suit you is for release. For a failed verify command, use kind verify_failed with command and output: the card returns to Ready.

輸入結構描述

{
  "type": "object",
  "properties": {
    "cardId": {
      "type": [
        "string",
        "number"
      ],
      "description": "Card id, number (12) or key (WEB-12)."
    },
    "kind": {
      "type": "string",
      "enum": [
        "dependency",
        "needs_input",
        "capability",
        "transient",
        "auth",
        "waiting",
        "verify_failed"
      ],
      "description": "Why you cannot continue."
    },
    "reason": {
      "type": "string",
      "description": "Say it for the next reader. Include no secrets. Needed unless verify_failed."
    },
    "question": {
      "type": "string",
      "description": "The question. Needed with needs_input."
    },
    "options": {
      "type": "array",
      "description": "For needs_input: 2 to 6 answers, as in raise. Mark your advice. None means Approve or Decline.",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "detail": {
            "type": "string"
          },
          "recommended": {
            "type": "boolean"
          }
        },
        "required": [
          "label"
        ]
      }
    },
    "until": {
      "type": "string",
      "description": "A time (ISO) when the card comes back to you."
    },
    "on": {
      "type": "string",
      "description": "For waiting: the card to wait for."
    },
    "command": {
      "type": "string",
      "description": "For verify_failed: the command that ran."
    },
    "output": {
      "type": "string",
      "description": "For verify_failed: what it printed. Strip secrets first."
    },
    "runId": {
      "type": "string",
      "description": "Run id from claim_next."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  },
  "required": [
    "cardId",
    "kind"
  ]
}
🔴release(cardId, reason, to, until, effort, ...)

Ends a reading claim, or hands back a card you hold when it does not suit you, or not now. It goes back where it was and counts for nothing. You do not get it again, unless you pass until. In a batch it hands back that card only.

輸入結構描述

{
  "type": "object",
  "properties": {
    "cardId": {
      "type": [
        "string",
        "number"
      ],
      "description": "Card id, number (12) or key (WEB-12)."
    },
    "reason": {
      "type": "string",
      "description": "Why it does not suit you. Include no secrets."
    },
    "to": {
      "type": "string",
      "description": "A persona that may suit it; it is mentioned in a comment."
    },
    "until": {
      "type": "string",
      "description": "A time (ISO) when the card comes back to you."
    },
    "effort": {
      "type": "string",
      "enum": [
        "low",
        "medium",
        "high"
      ],
      "description": "The effort the card needs, so a stronger agent takes it."
    },
    "runId": {
      "type": "string",
      "description": "Run id from claim_next."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  },
  "required": [
    "cardId"
  ]
}
⚪raise(type, severity, title, body, cardId, ...)

Files a signal: assumption (the default), question, concern, rule proposal, deferred or observation. Only blocking parks your card: keep it for a choice you cannot undo. Offer options only with type question, and mark your advice. If you are sure, act and finish the card. If not, ask a teammate in a comment with @name. Use raise only when a person must decide.

輸入結構描述

{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "assumption, question, concern, rule (a rule proposal), deferred or observation. Default assumption, or question when you send options."
    },
    "severity": {
      "type": "string",
      "enum": [
        "info",
        "low",
        "normal",
        "high"
      ],
      "description": "How much it matters."
    },
    "title": {
      "type": "string",
      "description": "The question as one full sentence. A person reads this first."
    },
    "body": {
      "type": "string",
      "description": "The facts behind the question, in a few lines. Do not paste the card."
    },
    "cardId": {
      "type": [
        "string",
        "number"
      ],
      "description": "Card id, number (12) or key (WEB-12)."
    },
    "sessionId": {
      "type": "string",
      "description": "Groups the notes from one session."
    },
    "needsPerson": {
      "type": "boolean",
      "description": "Only a person may answer."
    },
    "kind": {
      "type": "string",
      "enum": [
        "approval",
        "open"
      ],
      "description": "approval: a yes or no from a person. Use it for every yes or no, so the person sees Approve and Decline. open: any answer. Default open."
    },
    "to": {
      "type": "string",
      "description": "The person to ask, by name or id."
    },
    "blocking": {
      "type": "boolean",
      "description": "Park your card until someone answers."
    },
    "options": {
      "type": "array",
      "description": "The answers you offer. Offer them for every choice. The person may still write their own.",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Short id. Made from the label if left out."
          },
          "label": {
            "type": "string",
            "description": "Short text."
          },
          "detail": {
            "type": "string",
            "description": "Its cost."
          },
          "recommended": {
            "type": "boolean",
            "description": "Your advice. One at most."
          }
        },
        "required": [
          "label"
        ]
      }
    },
    "select": {
      "type": "string",
      "enum": [
        "one",
        "many"
      ],
      "description": "one: single. many: several. Default one."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  },
  "required": [
    "severity",
    "title"
  ]
}
🟢inbox(since, query, days, mine, all, ...)

Reads what waits for you: answers to your questions, and comments that @mention you or your personas. Marks both as seen. Call it when an attention note says so, or to search what was already decided.

輸入結構描述

{
  "type": "object",
  "properties": {
    "since": {
      "type": "number",
      "description": "Only answers after this time (milliseconds)."
    },
    "query": {
      "type": "string",
      "description": "Words that must appear in the question or the answer."
    },
    "days": {
      "type": "number",
      "description": "Only answers and mentions from the last N days."
    },
    "mine": {
      "type": "boolean",
      "description": "Only answers to what you raised or the cards you hold."
    },
    "all": {
      "type": "boolean",
      "description": "Include mentions you have already seen."
    },
    "limit": {
      "type": "number",
      "description": "How many answers and mentions to return."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    }
  }
}
⚪resolve(signalId, answer, note, boardId, persona)

Closes a question. With answer, it answers a teammate's question when you know the answer. Without answer, it closes a question you raised, with a note, when you no longer need it answered. Only a person may close a question that has needsPerson. A card parked on it returns to Ready.

輸入結構描述

{
  "type": "object",
  "properties": {
    "signalId": {
      "type": [
        "string",
        "number"
      ],
      "description": "The question's id."
    },
    "answer": {
      "type": "string",
      "description": "The answer. Needs Worker. Leave it out to close your own question."
    },
    "note": {
      "type": "string",
      "description": "Without answer: why you no longer need an answer."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  },
  "required": [
    "signalId"
  ]
}
🟢events_since(cursor, boardId)

Reads board activity after a cursor. Call it between steps to see what changed.

輸入結構描述

{
  "type": "object",
  "properties": {
    "cursor": {
      "type": "number",
      "description": "The last event id you saw. Default 0."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    }
  }
}
⚪toggle_task(cardId, index, text, done, boardId, ...)

Flips a checklist item on a card between done and not done, or sets it to a given state. Pick the item by position or by text.

輸入結構描述

{
  "type": "object",
  "properties": {
    "cardId": {
      "type": [
        "string",
        "number"
      ],
      "description": "Card id, number (12) or key (WEB-12)."
    },
    "index": {
      "type": "number",
      "description": "The item's position, from 1."
    },
    "text": {
      "type": "string",
      "description": "The item's text, instead of a position."
    },
    "done": {
      "type": "boolean",
      "description": "Set it to this instead of flipping it."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  },
  "required": [
    "cardId"
  ]
}
🟢find_cards(query, state, column, label, assignee, ...)

Finds cards on one board. Leave out boardId to search every board you reach. It gives one short row per card, with no description or comments.

輸入結構描述

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Words to find, and tokens: priority: (urgent, high, normal, low), effort: (high, medium, low, none), label:. Repeat priority: or effort: to match any."
    },
    "state": {
      "type": "string",
      "description": "later, triage, todo, ready, running, blocked, review or done."
    },
    "column": {
      "type": "string",
      "description": "A column, by id or label."
    },
    "label": {
      "type": "string"
    },
    "assignee": {
      "type": "string",
      "description": "A persona name, me or none."
    },
    "owner": {
      "type": "string",
      "description": "A person's name or id, me or none."
    },
    "updatedSince": {
      "type": "number",
      "description": "Only cards active since this time (ms)."
    },
    "commentedBy": {
      "type": "string",
      "description": "A persona name or me."
    },
    "notCommentedBy": {
      "type": "string",
      "description": "A persona name or me."
    },
    "hasComments": {
      "type": "boolean"
    },
    "mentionsMe": {
      "type": "boolean",
      "description": "Only cards with an unread mention of you."
    },
    "unansweredQuestion": {
      "type": "boolean",
      "description": "Only cards with an open question."
    },
    "quiet": {
      "type": "boolean",
      "description": "Only claims whose agent went quiet."
    },
    "includeArchived": {
      "type": "boolean"
    },
    "limit": {
      "type": "number"
    },
    "cursor": {
      "type": "string",
      "description": "nextCursor from the last page."
    },
    "boardId": {
      "type": "string",
      "description": "One board, by id or slug. Leave it out for every board."
    }
  }
}
🟢list_boards

Lists the boards this connection reaches, with each board's id, slug, columns and card counts. Read-only.

輸入結構描述

{
  "type": "object",
  "additionalProperties": false
}
🟢get_setup(part, boardId)

Your first call on a new connection. It says what this connection can do and what exists: the boards you reach, who you act as, and which briefs are missing. It gives the steps to set yourself up and the questions to ask. Part "rules" returns the exact rule and skill to install. Part "briefs" returns how to write the briefs.

輸入結構描述

{
  "type": "object",
  "properties": {
    "part": {
      "type": "string",
      "description": "rules or briefs. Leave it out for the setup steps."
    },
    "boardId": {
      "type": "string",
      "description": "The board the rules are for (id or slug), on a workspace link."
    }
  }
}
🟢get_context(runtimeHandle, boardId, persona)

Sends everything you work from again: the protocol, the workspace brief, this board's brief, your persona's brief and a digest of the rules. Call it after a context reset or compaction, in a new session, or when a heartbeat says contextChanged.

輸入結構描述

{
  "type": "object",
  "properties": {
    "runtimeHandle": {
      "type": "string",
      "description": "A short name for this agent or sub-agent. Use a different one for each sub-agent."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  }
}
🟢rules(ruleId, client, path, hash, rules, ...)

Keeps your installed rules in step. With ruleId, it records where you installed a rule and its hash. Call it once per file after you install a rule from get_setup (part "rules"). Without ruleId, it tells you which rules you hold are stale. Pass their ids and hashes before you finish work or after a sync.

輸入結構描述

{
  "type": "object",
  "properties": {
    "ruleId": {
      "type": "string",
      "description": "The rule's id. Give it to record where you installed it."
    },
    "client": {
      "type": "string",
      "description": "Your tool's name."
    },
    "path": {
      "type": "string",
      "description": "Where you wrote it."
    },
    "hash": {
      "type": "string",
      "description": "The rule's hash, as delivered."
    },
    "rules": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "ruleId": {
            "type": "string"
          },
          "hash": {
            "type": "string"
          }
        }
      },
      "description": "Without ruleId: the rules you installed, id and hash."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    }
  }
}
🟡create_card(title, body, acceptance, verifyCommand, priority, ...)

Creates a card with all its fields in one call. Pass copyFrom to copy another card. Pass cards to create several at once. It lands in Triage unless you pass state or column. Each card counts toward the plan's limit.

輸入結構描述

{
  "type": "object",
  "properties": {
    "title": {
      "type": "string"
    },
    "body": {
      "type": "string",
      "description": "The description (markdown)."
    },
    "acceptance": {
      "type": [
        "string",
        "null"
      ],
      "description": "What done means. Null clears it."
    },
    "verifyCommand": {
      "type": [
        "string",
        "null"
      ],
      "description": "The command that proves it."
    },
    "priority": {
      "type": "number",
      "description": "3 urgent, 2 high, 1 normal, 0 low."
    },
    "assignee": {
      "type": [
        "string",
        "null"
      ],
      "description": "A persona name. Null clears it."
    },
    "owner": {
      "type": "string",
      "description": "A person (name or id) to own a card with no owner."
    },
    "ownerNote": {
      "type": "string",
      "description": "Why, for that person."
    },
    "tenant": {
      "type": [
        "string",
        "null"
      ],
      "description": "A group, such as a client."
    },
    "effort": {
      "type": [
        "string",
        "null"
      ],
      "description": "low, medium or high."
    },
    "estimate": {
      "type": [
        "string",
        "null"
      ],
      "description": "XS, S, M, L or XL. Needs the board's estimates setting."
    },
    "labels": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "The whole set. addLabels and removeLabels change some."
    },
    "addLabels": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "removeLabels": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "dueAt": {
      "type": [
        "string",
        "number",
        "null"
      ],
      "description": "A due date. Needs the board's due dates setting."
    },
    "snoozeUntil": {
      "type": [
        "string",
        "number",
        "null"
      ],
      "description": "Hide the card until this date. Null clears it."
    },
    "park": {
      "type": "boolean",
      "description": "With snoozeUntil: park in Snoozed. Default true."
    },
    "checklist": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "The whole checklist: {text, done} items."
    },
    "modelHint": {
      "type": [
        "string",
        "null"
      ],
      "description": "A model the work suits."
    },
    "workspaceHint": {
      "type": [
        "string",
        "null"
      ],
      "description": "Where the work happens."
    },
    "touchPaths": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Files it will touch."
    },
    "skillPins": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Skills to load first."
    },
    "branch": {
      "type": [
        "string",
        "null"
      ]
    },
    "prUrl": {
      "type": [
        "string",
        "null"
      ],
      "description": "The pull request (https)."
    },
    "expedite": {
      "type": "boolean",
      "description": "Let the card pass the WIP cap and be claimed first."
    },
    "recur": {
      "type": [
        "object",
        "null"
      ],
      "description": "Repeat the card: every (daily, weekly, monthly), at, to. Null stops it."
    },
    "goalMode": {
      "type": "boolean",
      "description": "Keep going until the acceptance criteria hold."
    },
    "maxTurns": {
      "type": [
        "number",
        "null"
      ],
      "description": "Turns in goal mode. Null clears it."
    },
    "maxRuntimeMs": {
      "type": [
        "number",
        "null"
      ],
      "description": "Longest run in milliseconds. Null clears it."
    },
    "circuitLimit": {
      "type": "number",
      "description": "Failures that stop claims of the card."
    },
    "state": {
      "type": "string",
      "description": "later, triage, todo, ready, running, blocked, review or done."
    },
    "column": {
      "type": "string",
      "description": "A column, by id or label."
    },
    "idempotencyKey": {
      "type": "string",
      "description": "The same key again returns the same card."
    },
    "parents": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Cards that must finish first, by number or key."
    },
    "comment": {
      "type": "string",
      "description": "An opening comment. @name notifies."
    },
    "copyFrom": {
      "type": [
        "string",
        "number"
      ],
      "description": "A card to copy. Fields you pass replace its."
    },
    "unique": {
      "type": "boolean",
      "description": "Refuse if a similar card exists."
    },
    "claim": {
      "type": "boolean",
      "description": "Take the new card in the same call. The reply is the claim."
    },
    "verbose": {
      "type": "boolean",
      "description": "Return the whole card."
    },
    "cards": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Several cards: each takes the fields above."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  }
}
🔴update_card(cardId, title, body, acceptance, verifyCommand, ...)

Changes any of a card's fields in one call, and archives or restores it (archived). Fields you leave out stay as they are. Pass updates to change several cards at once. Pass checklist as {add, remove} to change items in place. To move a card use move_card. A field that changed since you read the card refuses the call: call show, then write again.

輸入結構描述

{
  "type": "object",
  "properties": {
    "cardId": {
      "type": [
        "string",
        "number"
      ],
      "description": "Card id, number (12) or key (WEB-12)."
    },
    "title": {
      "type": "string"
    },
    "body": {
      "type": "string",
      "description": "The description (markdown)."
    },
    "acceptance": {
      "type": [
        "string",
        "null"
      ],
      "description": "What done means. Null clears it."
    },
    "verifyCommand": {
      "type": [
        "string",
        "null"
      ],
      "description": "The command that proves it."
    },
    "priority": {
      "type": "number",
      "description": "3 urgent, 2 high, 1 normal, 0 low."
    },
    "assignee": {
      "type": [
        "string",
        "null"
      ],
      "description": "A persona name. Null clears it."
    },
    "owner": {
      "type": "string",
      "description": "A person (name or id) to own a card with no owner."
    },
    "ownerNote": {
      "type": "string",
      "description": "Why, for that person."
    },
    "tenant": {
      "type": [
        "string",
        "null"
      ],
      "description": "A group, such as a client."
    },
    "effort": {
      "type": [
        "string",
        "null"
      ],
      "description": "low, medium or high."
    },
    "estimate": {
      "type": [
        "string",
        "null"
      ],
      "description": "XS, S, M, L or XL. Needs the board's estimates setting."
    },
    "labels": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "The whole set. addLabels and removeLabels change some."
    },
    "addLabels": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "removeLabels": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "dueAt": {
      "type": [
        "string",
        "number",
        "null"
      ],
      "description": "A due date. Needs the board's due dates setting."
    },
    "snoozeUntil": {
      "type": [
        "string",
        "number",
        "null"
      ],
      "description": "Hide the card until this date. Null clears it."
    },
    "park": {
      "type": "boolean",
      "description": "With snoozeUntil: park in Snoozed. Default true."
    },
    "checklist": {
      "type": [
        "array",
        "object"
      ],
      "items": {
        "type": "object"
      },
      "description": "An array replaces the list with {text, done} items. An object changes it: {add: [texts], remove: [positions from 1, or texts]}."
    },
    "modelHint": {
      "type": [
        "string",
        "null"
      ],
      "description": "A model the work suits."
    },
    "workspaceHint": {
      "type": [
        "string",
        "null"
      ],
      "description": "Where the work happens."
    },
    "touchPaths": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Files it will touch."
    },
    "skillPins": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Skills to load first."
    },
    "branch": {
      "type": [
        "string",
        "null"
      ]
    },
    "prUrl": {
      "type": [
        "string",
        "null"
      ],
      "description": "The pull request (https)."
    },
    "expedite": {
      "type": "boolean",
      "description": "Let the card pass the WIP cap and be claimed first."
    },
    "recur": {
      "type": [
        "object",
        "null"
      ],
      "description": "Repeat the card: every (daily, weekly, monthly), at, to. Null stops it."
    },
    "goalMode": {
      "type": "boolean",
      "description": "Keep going until the acceptance criteria hold."
    },
    "maxTurns": {
      "type": [
        "number",
        "null"
      ],
      "description": "Turns in goal mode. Null clears it."
    },
    "maxRuntimeMs": {
      "type": [
        "number",
        "null"
      ],
      "description": "Longest run in milliseconds. Null clears it."
    },
    "circuitLimit": {
      "type": "number",
      "description": "Failures that stop claims of the card."
    },
    "archived": {
      "type": "boolean",
      "description": "True archives, false restores."
    },
    "version": {
      "type": "number",
      "description": "The card version show gave you. Left out, this connection's last read counts."
    },
    "updates": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Several cards: each has cardId and the fields above."
    },
    "verbose": {
      "type": "boolean",
      "description": "Return the whole card."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  }
}
🔴move_card(cardId, state, column, columnId, confirm, ...)

Moves a card to a state or to an exact column. Pass summary with a move to Ready to send the card back for changes. Pass clearWait to let agents claim the card again now.

輸入結構描述

{
  "type": "object",
  "properties": {
    "cardId": {
      "type": [
        "string",
        "number"
      ],
      "description": "Card id, number (12) or key (WEB-12)."
    },
    "state": {
      "type": "string",
      "description": "later, triage, todo, ready, running, blocked, review or done."
    },
    "column": {
      "type": "string",
      "description": "A column, by id or label."
    },
    "columnId": {
      "type": "string",
      "description": "A column, by id or label."
    },
    "confirm": {
      "type": "boolean",
      "description": "Needed to move a card into Done or Blocked."
    },
    "summary": {
      "type": "string",
      "description": "With a move to Ready: send the card back for changes, and say what to change."
    },
    "clearWait": {
      "type": "boolean",
      "description": "Let agents claim the card again now. Clears its saved pull request link and its wait. With no state or column, it moves nothing."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  },
  "required": [
    "cardId"
  ]
}
🔴link(parentId, childId, remove, boardId, persona)

Makes one card the blocking parent of another. The child waits until the parent reaches Done. Pass remove true to take the link away again.

輸入結構描述

{
  "type": "object",
  "properties": {
    "parentId": {
      "type": [
        "string",
        "number"
      ],
      "description": "Card id, number (12) or key (WEB-12)."
    },
    "childId": {
      "type": [
        "string",
        "number"
      ],
      "description": "Card id, number (12) or key (WEB-12)."
    },
    "remove": {
      "type": "boolean",
      "description": "True removes the link. Left out, it adds one."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  },
  "required": [
    "parentId",
    "childId"
  ]
}
🔴undo(cardId, boardId, persona)

Reverts the card's latest recorded change. Calling it again redoes the change.

輸入結構描述

{
  "type": "object",
  "properties": {
    "cardId": {
      "type": [
        "string",
        "number"
      ],
      "description": "Card id, number (12) or key (WEB-12)."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  },
  "required": [
    "cardId"
  ]
}
🔴stop_run(cardId, batch, boardId, persona)

Ends the active run on a card now. The claim ends and the card goes back to Ready. Use it when an agent is stuck, wrong, or must be cut off. In a batch it stops that card only; batch true stops all.

輸入結構描述

{
  "type": "object",
  "properties": {
    "cardId": {
      "type": [
        "string",
        "number"
      ],
      "description": "Card id, number (12) or key (WEB-12)."
    },
    "batch": {
      "type": "boolean",
      "description": "Stop the whole batch. Left out, only this card stops."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  },
  "required": [
    "cardId"
  ]
}
⚪promote(signalId, boardId, persona)

Turns a raised signal into a Triage card and marks the signal resolved.

輸入結構描述

{
  "type": "object",
  "properties": {
    "signalId": {
      "type": [
        "string",
        "number"
      ],
      "description": "The question's id."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  },
  "required": [
    "signalId"
  ]
}
🟡create_board(name, slug)

Create a new board in the workspace. The board gets the default columns and is private.

輸入結構描述

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "The board's name."
    },
    "slug": {
      "type": "string",
      "description": "The address part. Chosen from the name when left out."
    }
  },
  "required": [
    "name"
  ]
}
🟡edit_column(columnId, state, label, position, boardId, ...)

Adds a column, or changes one. Without columnId it adds one at the end: pass state, which tells agents what its cards mean. With columnId it renames the column, moves it, or both. A column's state never changes.

輸入結構描述

{
  "type": "object",
  "properties": {
    "columnId": {
      "type": "string",
      "description": "The column to change, by id. Leave it out to add a column."
    },
    "state": {
      "type": "string",
      "description": "later, triage, todo, ready, running, blocked, review or done."
    },
    "label": {
      "type": "string",
      "description": "The label. Blank gives the state's name."
    },
    "position": {
      "type": "number",
      "description": "Place in the board order, from 0. Left out when adding, the column goes last."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  }
}
🔴delete_column(columnId, into, boardId, persona)

Remove a column. If it holds cards, name another column to receive them.

輸入結構描述

{
  "type": "object",
  "properties": {
    "columnId": {
      "type": "string",
      "description": "A column, by id or label."
    },
    "into": {
      "type": "string",
      "description": "The column that receives its cards. Needed when it holds any."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  },
  "required": [
    "columnId"
  ]
}
🔴set_brief(scope, body, boardId, persona)

Replaces a brief: this board's brief, or with scope workspace the workspace brief that every board's agents read. Use it only after the person sees the draft and says yes. How to write it: call get_setup with part "briefs".

輸入結構描述

{
  "type": "object",
  "properties": {
    "scope": {
      "type": "string",
      "enum": [
        "board",
        "workspace"
      ],
      "description": "board (the default) or workspace."
    },
    "body": {
      "type": "string",
      "description": "The whole brief, in markdown. It replaces the old one."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  },
  "required": [
    "body"
  ]
}
🔴update_persona(target, name, title, description, brief)

Changes one persona's name, title, description or brief. Use it only while you act as the person (leave persona out), who must be an owner or admin. A connection that acts as a persona cannot use it. Use it after the person sees the text and says yes. It never changes whether a persona may mark work done.

輸入結構描述

{
  "type": "object",
  "properties": {
    "target": {
      "type": "string",
      "description": "The persona to change: its name or id."
    },
    "name": {
      "type": "string",
      "description": "The new name."
    },
    "title": {
      "type": "string",
      "description": "The new title."
    },
    "description": {
      "type": "string",
      "description": "What the persona is for. Other agents read it in the team list."
    },
    "brief": {
      "type": "string",
      "description": "The whole new brief, in markdown. It replaces the old one."
    }
  },
  "required": [
    "target"
  ]
}
🔴label(action, name, into, confirm, reason, ...)

Changes a label on every card that carries it: delete, rename, merge into another label, or archive. Call it without confirm first. The answer says how many cards carry the label, and nothing changes. Change a label only when a person or your task asks you to. Never to tidy up. To apply, pass confirm true and a short reason.

輸入結構描述

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "delete",
        "rename",
        "merge",
        "archive"
      ],
      "description": "What to do to the label."
    },
    "name": {
      "type": "string",
      "description": "The label."
    },
    "into": {
      "type": "string",
      "description": "Merge target, or the new name for rename."
    },
    "confirm": {
      "type": "boolean",
      "description": "Apply it. Left out, nothing changes."
    },
    "reason": {
      "type": "string",
      "description": "Why, in one line. Needed with confirm."
    },
    "boardId": {
      "type": "string",
      "description": "Board id or slug."
    },
    "persona": {
      "type": "string",
      "description": "The persona to act as."
    }
  },
  "required": [
    "action",
    "name"
  ]
}

社群

為此伺服器評分

證據

近期觀測

已驗證未記錄版本31 個工具