focalboard-mcp

focalboard-mcp

Enables MCP clients to read and manage boards, cards, comments, checklists, and image attachments on a self-hosted Focalboard instance using human-readable property names.

Category
访问服务器

README

focalboard-mcp

CI License: MIT

An MCP server for Focalboard, the self-hosted Trello/Notion/Asana alternative. Lets an MCP client (Claude Code, Claude Desktop, etc.) read and manage boards and cards on a self-hosted Focalboard instance.

Property values are matched by human-readable name and label (e.g. "Status": "Done"), not by Focalboard's internal property/option ids, so the model doesn't need to know your board's schema up front. Unknown property/option names get a "did you mean" suggestion instead of a bare error.

Why another Focalboard MCP server?

A few already exist. This one is built directly against Focalboard's server source (server/api/*.go, server/model/*.go, and the webapp's block components) rather than reverse-engineered from another wrapper, and goes further on feature depth: comments, checklists (with the contentOrder bookkeeping Focalboard's UI needs to actually show them), image attachments returned as real MCP image content, an instance-wide search, and a fuzzy find_cards.

Focalboard quirks this handles (found by reading the source, not guessing)

  • Cards have a dedicated, flat-properties API (/boards/{id}/cards, PATCH /cards/{id}) distinct from the generic blocks API.
  • Creating a block via the generic blocks API requires client-supplied non-zero createAt/updateAt timestamps, or the server 400s.
  • Login itself needs the X-Requested-With CSRF header, not just authenticated requests.
  • Checklist items only render in Focalboard's UI if you also append them to the card's contentOrder.
  • A card's actual body text lives in separate text content blocks, not on the card itself.
  • Image attachments come back from Focalboard's file endpoint as application/octet-stream regardless of the real file type, so get_card derives the MIME type from the filename extension instead of trusting that header.

Scope

Covers boards, cards, comments, checklists, and image attachments — enough for day-to-day project planning. It does not cover board/template creation, member management, or sharing/permissions; PRs welcome if you need those.

Compatibility

Targets standalone Focalboard (Personal Server / Team Edition) using its normal /api/v2 username+password login. Two deployment modes reject that login entirely (confirmed in server/api/auth.go) and won't work with this server:

  • Mattermost plugin mode — Focalboard running as a Boards plugin inside Mattermost authenticates through Mattermost instead; the standalone login endpoint is disabled.
  • Single-user mode — instances configured with a fixed FOCALBOARD_SINGLE_USER_TOKEN also reject username/ password login.

If your instance runs one of those, pnpm smoke will fail fast with a clear error instead of doing anything destructive.

Tools

Tool Description
list_teams List teams visible to the authenticated user
list_boards List boards for a team (teamId optional if the instance has only one team)
get_board Get a board's properties (columns) and their options
search_boards Search board titles across the whole instance
list_cards List cards on a board, with properties resolved to names/labels
find_cards Fuzzy-search card titles on a board
get_card Get a card by id, including properties, body content, comments, checklist items, and any attached images
create_cards Create one or more cards on a board
update_card Update a card's title and/or properties
delete_card Delete a card
add_comment Add a comment to a card
add_checklist_item Add a checklist item to a card
set_checklist_item Check/uncheck a checklist item

Getting Started

This isn't published to npm (yet) — you clone and build it locally, point it at your Focalboard instance, and register it with your MCP client. Requires Node.js >= 20.

1. Clone and build

git clone https://github.com/giordano137/focalboard-mcp.git
cd focalboard-mcp
pnpm install
pnpm build

This produces dist/index.js, the actual server your MCP client will run.

2. Configure credentials

cp .env.example .env

Edit .env with your instance's details:

FOCALBOARD_HOST=https://your-focalboard-instance.example
FOCALBOARD_USERNAME=your-username
FOCALBOARD_PASSWORD=your-password

.env is gitignored — it never gets committed. The server authenticates via Focalboard's session login (POST /api/v2/login) and re-authenticates automatically if the session expires; see Security for why credentials belong in this file and not on the command line.

Sanity-check the connection before registering anything (read-only, touches nothing):

pnpm smoke

3. Register with your MCP client

Claude Code, registered once, available in every session (-s user) — not tied to this repo's directory:

claude mcp add focalboard -s user -- \
  node --env-file=/absolute/path/to/focalboard-mcp/.env /absolute/path/to/focalboard-mcp/dist/index.js

New registrations need a fresh Claude Code session to be picked up — an already-running session won't see it.

Claude Desktop (or any other MCP client that reads a mcpServers JSON config): add this to claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "focalboard": {
      "command": "node",
      "args": [
        "--env-file=/absolute/path/to/focalboard-mcp/.env",
        "/absolute/path/to/focalboard-mcp/dist/index.js"
      ]
    }
  }
}

Then restart the client. Either way: use --env-file pointing at your .env, not -e/--env flags with the credentials inline — those end up in plaintext in the client's own config file and shell history.

4. Use it

Once registered, there's nothing to invoke manually — just talk to your MCP client and it picks the right tools. A few examples of what that looks like:

"What boards do I have on Focalboard?"

Calls list_teams (skipped automatically if you only have one team), then list_boards.

"Show me everything that isn't Done on the Kaizen board"

Calls get_board to see the Status property's valid options, then list_cards and filters by the resolved Status value — no need to know Focalboard's internal property/option ids.

"Create a card 'Fix login bug' with Status Todo and Priority High"

Calls create_cards with properties: {"Status": "Todo", "Priority": "High"} — plain names and labels, matched case-insensitively. A typo like "Statuss" or "Todoo" comes back with a "did you mean" suggestion instead of a bare error.

"What's in the 'Redesign' card, including any screenshots?"

Calls get_card, which returns properties, body text, comments, and checklist items as JSON, plus any attached images inline as actual image content the model can see — not just a filename.

"Mark 'write tests' as done on that card and add a comment that it's ready for review"

Calls set_checklist_item and add_comment.

Development

pnpm dev         # run from source with tsx
pnpm typecheck
pnpm lint
pnpm test        # watch mode
pnpm test:run    # single run
pnpm smoke       # read-only sanity check against your real instance
pnpm backup      # export all teams/boards/cards to backups/*.json (gitignored)
pnpm write-test  # create/update/comment/checklist/delete a throwaway card on a test board, end to end

CI runs typecheck/lint/test/build on Node 20 and 22 for every push and PR (.github/workflows/ci.yml).

Contributing

Issues and PRs welcome — see Scope for what's not covered yet. Keep changes covered by tests; pnpm smoke, pnpm write-test, and pnpm backup are also useful for verifying against a real instance before opening a PR.

Security

Credentials are only ever read from environment variables (see .env.example) — never pass them as CLI flags to an MCP client, since those tend to land in the client's own config file and shell history in plaintext. There's currently no supported way to use a scoped, long-lived personal access token instead of a full username/password session login. Please report security issues via GitHub's private vulnerability reporting rather than a public issue.

License

MIT

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选