craaft

io.craaft由 craaft.io 發布官方發布者v1.0.2更新於 Oct 24, 2026

Read and update your craaft kanban boards: add and move cards, comment, and tick off checklists.

已驗證Streamable HTTP可網頁執行效率與工作流檔案與儲存

概覽

AI 產生的概覽

面向 craaft 看板的遠端 MCP 伺服器,讓助理讀取、建立、移動、留言與封存卡片、欄位及專案。

可以做什麼
  • 列出並檢視專案、看板、卡片、卡片詳情、活動紀錄、專注概覽與通知
  • 建立、更新、移動、封存、還原與刪除卡片,支援批次建立、更新、移動及整欄重排
  • 管理卡片上的檢查清單、留言、標籤、里程碑、追蹤與附件
  • 建立、更新、匯出、匯入與刪除看板及欄位,支援範本以及 Trello、Jira、Asana、CSV 匯入預覽
  • 管理成員、邀請、看板權限、Webhook、郵件轉卡片入口與公開分享連結
適用情境
適合團隊把工作放在 craaft 看板上,並希望助理在對話中整理卡片、草擬或移動任務、彙整看板動態,或批次修改與匯入看板的情境。
執行需求
遠端 HTTP 端點,不需本機安裝套件。需要 craaft 帳號,並透過連接器流程以 OAuth 登入(可選唯讀或讀寫,也可只授權部分看板),或使用 cra_ 個人存取權杖放在 Authorization Bearer 標頭中。
安裝前請注意
讀寫權限下助理可建立、移動、封存並永久刪除卡片、看板與附件,也能變更成員與角色。Webhook 密鑰每次讀取都會完整回傳。附件、Webhook 與郵件轉卡片需要付費方案。可在「設定 > 已連結應用程式」撤銷授權。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 craaft,將其新增到工作區。
  2. 連接 所需的 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
  3. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.craaft%2Fmcp/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。 客戶端會在首次連接時完成 OAuth 登入。

{
  "mcpServers": {
    "craaft": {
      "type": "http",
      "url": "https://ai.craaft.io/mcp"
    }
  }
}

README

Craaft MCP Server

Model Context Protocol server for Craaft - lets AI assistants read and write your Kanban boards.

Deployed as an HTTP service. Each request authenticates via the caller's Authorization: Bearer header - either a cra_* personal access token (same ones used by the Craaft REST API) or a cro_* OAuth access token minted by signing in through the connector flow below.

Two-factor sign-in on a craaft account doesn't affect either kind of token. Account security settings (password, two-factor, API keys) are browser-only on the platform, so no tool changes them.

Deploy

bash
cd mcpgcloud run deploy craaft-mcp \  --source . \  --region us-central1 \  --allow-unauthenticated \  --set-env-vars CRAAFT_BASE_URL=https://craaft.io,MCP_PUBLIC_URL=https://ai.craaft.io/mcp

The PORT env var is set automatically by Cloud Run.

Connect from Claude (OAuth)

With MCP_PUBLIC_URL set, the server is an OAuth 2.1 protected resource: no token needs to be copied by hand.

craaft is in the Claude directory: connect it from there and skip to step 3. Or add it as a custom connector:

  1. In Claude Desktop or claude.ai, go to Settings > Connectors > Add custom connector.
  2. Paste https://ai.craaft.io/mcp.
  3. Sign in to craaft, choose Read and write or Read only, and approve the connection.

With read-only access, tools that only read (list_projects, get_board, search_cards and the like) work, and every tool that changes something fails with this token is read-only; this request needs a token with read and write access. The same goes for a cra_ key created as read only.

You can also connect it to Chosen boards only. Tools then see just those boards: other boards are not found, and list_projects and search_cards leave them out. create_project, import_board, list_members, list_invitations and the other member tools fail with this token is limited to some boards; this request needs a token for all boards. To change an app's access or boards, connect it again and choose again.

To revoke access later, go to Craaft Settings > Connected apps.

Configure (Claude Desktop, cra_ token)

  1. Sign in to Craaft → Settings → API keys → create a token
  2. Add to ~/.config/claude/claude_desktop_config.json:
json
{  "mcpServers": {    "craaft": {      "url": "https://craaft-mcp-xxxxx.a.run.app/mcp",      "headers": {        "Authorization": "Bearer cra_your_token_here"      }    }  }}

MCP registry

craaft is listed in the official MCP registry as io.craaft/mcp, described by server.json. craaft.io proves it owns the io.craaft namespace by serving a public key at https://craaft.io/.well-known/mcp-registry-auth (platform repo, internal/server/mcpregistry.go). The matching private key is not in this repo.

To publish a change, raise version in server.json (a published version can't be changed or republished), then:

bash
PRIVATE_KEY="$(openssl pkey -in ~/.config/craaft/mcp-registry-key.pem -noout -text | grep -A3 'priv:' | tail -n +2 | tr -d ' :\n')"mcp-publisher login http --domain craaft.io --private-key "$PRIVATE_KEY"mcp-publisher publish

Install mcp-publisher from the registry's releases.

Tools

ToolDescription
list_projectsList all accessible Kanban projects
get_boardGet a board's brief, columns and cards (descriptions omitted)
get_cardGet a single card by ID, including description
get_card_detailCard plus comments, events, checklist and attachments in one call
get_card_promptCard as a Markdown brief for an AI tool, the same text as Copy as prompt
search_cardsCross-project card search (description is a ≤180-char snippet)
create_cardCreate a card at the bottom of a column, with optional metadata (assigned to you unless you name someone)
update_cardUpdate a card's title, description, column, position, priority, assignee, tags, etc.
move_cardMove a card to another column or board
delete_cardPermanently delete a card
add_commentAdd a comment to a card (supports @mentions)
get_commentsList comments on a card
get_focusGet focus overview: due cards, attention cards, hygiene counters
list_notificationsYour notification inbox, newest first, plus the unseen count. Pass kind: mention to list where you were mentioned, with project, card and comment ids
mark_notifications_readMark notifications read by id, by card, or all of them
get_meGet the authenticated user's profile
bulk_create_cardsCreate up to 100 cards in one transaction
bulk_update_cardsApply up to 100 partial card updates in one transaction
bulk_move_cardsSweep up to 100 cards into a column, optionally on another board
rebalance_cardsReorder a whole column in one transaction (positions 1, 2, 3, ...)
get_checklistList a card's checklist items
add_checklist_itemAppend an item to a card's checklist
update_checklist_itemTick, untick or retitle a checklist item
delete_checklist_itemDelete a checklist item
get_card_activityA card's activity log: column and board moves, priority and assignee changes
get_board_activityA board's activity feed, newest first: cards added, moved, archived, deleted, comments, column changes
get_hygieneThe cards behind a get_focus hygiene counter (ghosts, stuck, mine_no_date)
list_attachmentsList the files attached to a card
list_board_filesSearch every file on a board's cards, with the card each is on
download_attachmentFetch an attachment's bytes (text inline, binary base64)
upload_attachmentAttach a file to a card from inline content
delete_attachmentDelete an attachment and its stored bytes
get_projectOne project with columns, counts, brief and your role
create_projectCreate a board, optionally from a template (starts with To Do / In Progress / Done otherwise)
update_projectRename, edit the brief, favourite, change visibility, colour scheme, background, text colour or top-bar buttons
delete_projectDelete a board and everything in it
export_projectExport a board as JSON or CSV
preview_importDry run of an import: what board a Trello, Jira, Asana, CSV or craaft export would create
import_boardCreate a new board from a Trello, Jira, Asana, CSV or craaft export
list_board_templatesThe fixed catalogue of board templates (kanban, sprint, bug tracker, ...)
add_columnAdd a column to a board
update_columnRename, recolour, reorder, or set a WIP limit
delete_columnDelete an empty column
archive_columnArchive every card in a done column, returns the archived ids
archive_cardArchive one card without deleting it
restore_cardRestore an archived card to its original column and position
list_archived_cardsA board's archived cards, newest first
list_webhooksA board's outbound webhook subscriptions plus the event catalogue
create_webhookRegister an outbound webhook (craaft signed / Slack / Discord)
update_webhookPause/resume a webhook, or change its URL, format or event filter
delete_webhookDelete a webhook subscription
get_inbound_emailA board's email-to-card intake address, if configured, and the month's AI card usage
enable_inbound_emailTurn on email-to-card and mint the intake address
update_inbound_emailChange active state, target column, or rotate the token
disable_inbound_emailTurn off email-to-card for a board
list_membersWorkspace members, roles and board access
update_member_roleChange a member's workspace role
remove_memberRemove someone from the workspace
list_invitationsPending invitations
invite_memberInvite by email, optionally with board grants
revoke_invitationRevoke a pending invitation
list_board_membersWho can see a board, and whether access is explicit or implied
grant_board_accessGive a member access to a specific board, or change their board role
revoke_board_accessRemove an explicit board grant
update_commentEdit a comment (author only)
delete_commentDelete a comment (author, or workspace owner/admin)
set_card_followFollow or unfollow a card
list_tagsDistinct tags on a board's cards, sorted, including archived
list_milestonesA board's milestones, earliest due first
add_milestoneAdd a milestone (board admins)
update_milestoneRename, re-date, or mark achieved
delete_milestoneDelete a milestone
enable_sharingTurn on read-only public sharing, returns token + URL
disable_sharingRevoke the public link
get_avatarA user's avatar bytes, or the cue to render a placeholder

The three bulk_* tools are all-or-nothing: one bad item rolls the whole batch back and the error names the offending index, so a failed call never leaves a partially applied board. They send no notification emails (activity events and realtime updates still fire), and each call spends one rate-limit token against a 60-burst budget - which is why they should be preferred over looping the single-card tools.

Endpoints

PathPurpose
POST /mcpMCP Streamable HTTP endpoint
GET /healthHealth check (returns {"status":"ok"}). /healthz answers the same locally, but Cloud Run keeps that path for itself
GET /.well-known/oauth-protected-resource, GET /.well-known/oauth-protected-resource/mcpRFC 9728 protected-resource metadata (only served when MCP_PUBLIC_URL is set)

Env vars

VarDefaultDescription
PORT8080Listen port (Cloud Run sets this automatically)
CRAAFT_BASE_URLhttps://craaft.ioUpstream Craaft API URL
MCP_PUBLIC_URLunset (OAuth metadata off)This server's own public /mcp URL, e.g. https://ai.craaft.io/mcp. When set, serves RFC 9728 protected-resource metadata and 401-challenges missing/invalid tokens to start the OAuth flow. Accepts both cra_ personal access tokens and cro_ OAuth access tokens either way. Must equal the platform's MCP_RESOURCE_URL (both sides lowercase the scheme and host and trim a trailing slash before comparing).

Attachments

This server runs remotely, so it cannot read the caller's filesystem: upload_attachment takes the contents inline (content_text for text, content_base64 for binary), not a path.

download_attachment returns text-ish content types as readable text and everything else base64-encoded. Attachments can be up to 25 MiB, which no conversation wants inline, so it refuses anything over max_bytes (default 256 KiB) and reports the real size instead. Text is truncated rather than refused, since truncated text is still readable; truncated base64 is not, so binary over the limit is skipped entirely.

Attachments are a paid feature. On a Free workspace the upload returns 402 and the error names the current plan. Check canUploadAttachments on the project first - it reflects the board's workspace plan, not the caller's.

Import

preview_import and import_board take the same arguments: filename, the file inline (content_text or content_base64), and optionally source (trello, jira, asana, csv or craaft; detected when left out), name for the new board, and a CSV mapping from craaft fields to headers. Preview first: it writes nothing and, for a CSV, returns the headers, the suggested mapping and sample rows. A mapping replaces the suggestion, so send every field you want. import_board always creates a new private board and counts toward the workspace's board limit (402 when full). Limits: 5 MB, 2,000 cards, 200 columns; attachments aren't imported.

Known platform quirk: archive then delete

archive_column only archives cards in a column flagged isDone, and returns 200 with archived: 0 (and an empty id list) on any other column rather than erroring - check the count. Its returned ids let you undo the sweep with restore_card on each one.

delete_column is blocked by live cards only. Archived cards no longer block it - they are reassigned to the board's first column and the delete proceeds, so they keep existing and stay archived. (This used to fail: the cards_project_column_fk constraint still saw the archived rows, so the delete returned 409 forever. Fixed on the platform side.)

Archive and restore

archive_card takes a card off its board without deleting it; it stays searchable and shows up in list_archived_cards until restore_card puts it back in the exact column and position it was archived from. Archiving an already-archived card, or restoring one that isn't archived, is an error. list_archived_cards uses the same lean board projection as get_board (description omitted), plus archivedAt, capped at 200 rows (newest first) - older archived cards stay reachable through search_cards.

Board templates

list_board_templates is the same fixed catalogue for every caller, no plan gate. Pass a template's key as create_project's template argument to start a board with that column layout. create_project's response never includes columns at all, template or not - that field is only populated by get_project / get_board. Only the default kanban template seeds the historical todo / doing / done column keys anyway, every other template generates its own, so call get_project on the new board before creating cards on it.

Webhooks and email-to-card (board admin, Pro)

Both surfaces are gated the same way: board not visible → not found; visible but you're not a board admin → forbidden; Free workspace → a 402 naming "integrations" as the limit. delete_webhook and disable_inbound_email are not plan-gated, so a workspace that downgraded after setting either up can still turn them off.

A webhook subscription's secret is returned in full on every read (list, create, update) - it is never redacted after creation. It signs craaft format deliveries via the X-Craaft-Signature header; slack and discord deliveries are unsigned chat messages, authenticated only by the receiving service's secret URL. update_webhook's subscription_id argument is the subscription id, not the workspace-level endpoint_id the response also carries.

Email-to-card mints one intake address per board (<token>@<inbound-domain>). Mail becomes a card only when the sender is a workspace member and SPF/DKIM pass; everything else is dropped silently, no error surfaces to the sender. update_inbound_email's rotate flag mints a new token and invalidates the old address immediately - there's no grace period.

Not exposed, and why

GET /projects/{id}/events is the board's SSE realtime stream, not an activity log - a long-lived text/event-stream that doesn't fit a request/response tool. For a board's history use get_board_activity (/projects/{id}/activity), and for one card's history get_card_activity (/cards/{id}/events).

Also absent: POST /projects/{id}/cards/rebalance (internal position maintenance), the board background-image endpoints, and the unauthenticated /public/projects/{token} read - a token-holding agent should just use get_board.

來源:README.md,提交 fb4158b

工具

0
該伺服器需要登入,因此 SourceWeft 無法在沒有帳號的情況下讀取其工具,也未收錄。已連接帳號所能看到的內容可能因帳號及其權限而異。

版本歷史

1
  1. v1.0.2最新Oct 11, 2026

評分

已滿足適用檢查項的 75%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。