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.
概览
面向 craaft 看板的远程 MCP 服务器,让助手读取、创建、移动、评论和归档卡片、列与项目。
- 可以做什么
- 列出并查看项目、看板、卡片、卡片详情、活动记录、专注概览和通知
- 创建、更新、移动、归档、恢复和删除卡片,支持批量创建、更新、移动以及整列重排
- 管理卡片上的清单、评论、标签、里程碑、关注和附件
- 创建、更新、导出、导入和删除看板与列,支持模板以及 Trello、Jira、Asana、CSV 导入预览
- 管理成员、邀请、看板权限、Webhook、邮件转卡片入口和公开分享链接
- 适用场景
- 适合团队把工作放在 craaft 看板上,并希望助手在对话中整理卡片、起草或移动任务、汇总看板动态,或批量修改与导入看板的场景。
- 运行要求
- 远程 HTTP 端点,无需本地安装包。需要 craaft 账号,并通过连接器流程进行 OAuth 登录(可选择只读或读写,也可只授权部分看板),或使用 cra_ 个人访问令牌放在 Authorization Bearer 请求头中。
安装
在 SourceWeft 中
- 打开 控制台中的 craaft,将其添加到工作区。
- 连接 所需的 凭据。它们会被私密存储,绝不会在公开页面上展示。
- 为需要使用其工具的对话启用该服务。
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
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:
- In Claude Desktop or claude.ai, go to Settings > Connectors > Add custom connector.
- Paste
https://ai.craaft.io/mcp. - 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)
- Sign in to Craaft → Settings → API keys → create a token
- Add to
~/.config/claude/claude_desktop_config.json:
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:
Install mcp-publisher from the registry's
releases.
Tools
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
Env vars
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版本历史
1- v1.0.2最新Oct 11, 2026
评分
已满足适用检查项的 75%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通必需25 分
- 已声明认证方式必需10 分
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分
请在仓库或注册中心条目中声明许可证。