io.github.selfagency/beans-mcp
编码与调试by selfagency
以 agent 方式与 Beans CLI issue tracker 交互,实现问题查询与处理流程自动化。
什么是 io.github.selfagency/beans-mcp?
以 agent 方式与 Beans CLI issue tracker 交互,实现问题查询与处理流程自动化。
README
@selfagency/beans-mcp 🫘
<img src="docs/assets/icon.png" alt="beans-mcp icon" width="300" />MCP (Model Context Protocol) server for Beans issue tracker. Provides programmatic and CLI interfaces for AI-powered interactions with Beans workspaces.
Documentation: beans-mcp.self.agency
🤖 Try Beans fully-integrated with GitHub Copilot in VS Code! Install the <a href="https://marketplace.visualstudio.com/items?itemName=selfagency.beans-vscode">selfagency.beans-vscode</a> extension.
Usage
npx @selfagency/beans-mcp /path/to/workspace
Versioning
@selfagency/beans-mcp has its own package versioning. Compatibility with the
Beans CLI is tracked separately.
At startup, the server compares the installed beans CLI version against the
hardcoded supported Beans version: 0.4.2. If they differ, it prints a warning
to stderr and continues startup.
Parameters
--workspace-rootor positional arg: Workspace root path--cli-path: Path to Beans CLI--port: MCP server port (default: 39173)--log-dir: Log directory-h,--help: Print usage and exit
Summary of public MCP tools
| Tool | Description |
|---|---|
beans_init | Initialize the workspace (optional prefix). |
beans_archive | Archive completed/scrapped beans. |
beans_view | Fetch full bean details by beanId or beanIds. |
beans_create | Create a new bean (title/type + optional body/parent). |
beans_bulk_create | Create multiple beans in one call, optionally under a shared parent. |
beans_update | Consolidated metadata + body updates (status/type/priority/parent/clearParent/blocking/blockedBy/body/bodyAppend/bodyReplace) plus optional optimistic concurrency hint (ifMatch). |
beans_bulk_update | Update multiple beans in one call, optionally reassigning them to a shared parent. |
beans_complete_tasks | Mark all markdown checklist tasks within a bean as complete. |
beans_delete | Delete one or many beans (beanId or beanIds, optional force). |
beans_reopen | Reopen a completed or scrapped bean to an active status. |
beans_query | Unified list/search/filter/sort/ready operations, with GraphQL passthrough. |
beans_bean_file | Read/edit/create/delete files under .beans. |
beans_output | Read extension output logs or show guidance. |
- The
beans_querytool is intentionally broad: prefer it for listing, searching, filtering or sorting beans, and for generating Copilot instructions (operation: 'llm_context'). - All file and log operations validate paths to keep them within the workspace or the VS Code log directory. The
.beans/prefix is automatically stripped from paths — you can pass eithersome-bean.mdor.beans/some-bean.mdand the result is the same. beans_updatereplaces many fine-grained update tools; callers should use it to keep the public tool surface small and predictable.beans_archiveprovides CLI parity for archiving completed/scrapped beans.- Closing a parent bean via
beans_update(status: completedorstatus: scrapped) cascades the same status to all descendants. - Reopening a parent bean via
beans_reopencascades the target status to closed descendants (completed/scrapped). beans_bulk_createandbeans_bulk_updateare best-effort: they process each item sequentially and return a per-item result array with success/error entries rather than failing atomically.- Frontmatter
title:values are automatically double-quoted on write. Pass raw titles — quoting and escaping is handled for you. beans_bean_filesupportsupdate_frontmatterfor atomic frontmatter-only writes; supported fields includeprandbranch.- Unfiltered list results are cached with a short burst TTL and a timestamp-probe refresh strategy. Mutation tools (
beans_create,beans_update,beans_delete, etc.) invalidate the cache immediately. - Version mismatches between
beans-mcpand the Beans CLI are warning-only and non-blocking by design. - When
beanIdis missing in tool input, validation errors include a hint:Did you mean \beanId`?`.
Examples
<details> <summary>beans_init</summary>Request:
{ "prefix": "project" }
Response (structuredContent):
{ "initialized": true }
Request:
{ "beanId": "bean-abc" }
Request (multiple beans):
{ "beanIds": ["bean-abc", "bean-def"] }
Response (structuredContent):
{
"bean": {
"id": "bean-abc",
"title": "Fix login timeout",
"status": "todo",
"type": "bug",
"priority": "critical",
"body": "...markdown...",
"createdAt": "2025-12-01T12:00:00Z",
"updatedAt": "2025-12-02T08:00:00Z"
}
}
Request:
{}
Response (example):
{ "archived": true, "archivedCount": 3 }
Request:
{
"title": "Add dark mode",
"type": "feature",
"status": "todo",
"priority": "normal",
"body": "Implement theme toggle and styles",
"parent": "epic-123"
}
descriptionis accepted as a deprecated alias forbody.
Response (structuredContent):
{
"bean": {
"id": "new-1",
"title": "Add dark mode",
"status": "todo",
"type": "feature"
}
}
Request:
{
"parent": "epic-123",
"beans": [
{ "title": "Design mockups", "type": "task" },
{ "title": "Implement API", "type": "task", "priority": "high" },
{ "title": "Write tests", "type": "task", "parent": "epic-456" }
]
}
The top-level parent is applied as a default to any bean that does not specify its own parent. Here Design mockups and Implement API are assigned to epic-123; Write tests overrides with epic-456.
Response (structuredContent):
{
"requestedCount": 3,
"successCount": 3,
"failedCount": 0,
"results": [
{ "bean": { "id": "task-1", "title": "Design mockups" } },
{ "bean": { "id": "task-2", "title": "Implement API" } },
{ "bean": { "id": "task-3", "title": "Write tests" } }
]
}
Request (move a batch of tasks to in-progress and assign them to a parent):
{
"parent": "epic-123",
"beans": [
{ "beanId": "task-1", "status": "in-progress" },
{ "beanId": "task-2", "status": "in-progress" },
{ "beanId": "task-3", "status": "in-progress", "parent": "epic-456" }
]
}
Response (structuredContent):
{
"requestedCount": 3,
"successCount": 3,
"failedCount": 0,
"results": [
{ "beanId": "task-1", "bean": { "id": "task-1", "status": "in-progress" } },
{ "beanId": "task-2", "bean": { "id": "task-2", "status": "in-progress" } },
{ "beanId": "task-3", "bean": { "id": "task-3", "status": "in-progress" } }
]
}
</details> <details> <summary>beans_update</summary>Both bulk tools are best-effort: partial failures are reported per-item rather than aborting the whole batch.
Request (change status and add blocking):
{
"beanId": "bean-abc",
"status": "in-progress",
"blocking": ["bean-def"],
"ifMatch": "etag-value"
}
Request (atomic body modifications):
{
"beanId": "bean-abc",
"bodyReplace": [
{ "old": "- [ ] Task 1", "new": "- [x] Task 1" },
{ "old": "- [ ] Task 2", "new": "- [x] Task 2" }
],
"bodyAppend": "## Summary\n\nAll checklist items completed."
}
Note:
body(full replacement) cannot be combined withbodyAppendorbodyReplacein the same request.
Response (structuredContent):
{
"bean": {
"id": "bean-abc",
"status": "in-progress",
"blockingIds": ["bean-def"]
}
}
Request:
{ "beanId": "bean-old", "force": false }
Response:
{ "deleted": true, "beanId": "bean-old" }
Batch request:
{ "beanIds": ["bean-old", "bean-older"], "force": false }
Batch response (summary):
{
"requestedCount": 2,
"deletedCount": 2,
"failedCount": 0,
"results": [
{ "beanId": "bean-old", "deleted": true },
{ "beanId": "bean-older", "deleted": true }
]
}
Request:
{
"beanId": "bean-closed",
"requiredCurrentStatus": "completed",
"targetStatus": "todo"
}
Response:
{ "bean": { "id": "bean-closed", "status": "todo" } }
Request:
{ "beanId": "bean-abc" }
Response:
{
"bean": {
"id": "bean-abc",
"status": "todo"
},
"totalTaskCount": 5,
"updatedTaskCount": 3,
"unchangedTaskCount": 2
}
Refresh (list all beans):
{ "operation": "refresh" }
Response (partial):
{ "count": 12, "beans": [] }
Filter (statuses/types/tags):
{
"operation": "filter",
"statuses": ["in-progress", "todo"],
"types": ["bug", "feature"],
"tags": ["auth"]
}
Search (full-text):
{ "operation": "search", "search": "authentication", "includeClosed": false }
Sort (modes: status-priority-type-title, updated, created, id):
{ "operation": "sort", "mode": "updated" }
Ready (actionable beans only):
{ "operation": "ready" }
LLM context (generate Copilot instructions; optional write-to-workspace):
{ "operation": "llm_context", "writeToWorkspaceInstructions": true }
Response (structuredContent):
{
"graphqlSchema": "...",
"generatedInstructions": "...",
"instructionsPath": "/workspace/.github/instructions/beans-prime.instructions.md"
}
Raw GraphQL passthrough (CLI parity with beans query):
{
"operation": "graphql",
"graphql": "{ beans(filter: { type: [\"bug\"] }) { id title status } }"
}
With variables:
{
"operation": "graphql",
"graphql": "query($q: String!) { beans(filter: { search: $q }) { id title } }",
"variables": { "q": "authentication" }
}
Request (read):
{ "operation": "read", "path": "beans-vscode-123--title.md" }
Response:
{
"path": "/workspace/.beans/beans-vscode-123--title.md",
"content": "---\n...frontmatter...\n---\n# Title\n"
}
Request (atomic frontmatter update):
{
"operation": "update_frontmatter",
"path": "beans-vscode-123--title.md",
"fields": {
"status": "in-progress",
"pr": "123",
"branch": "feature/cascade-status-and-skills-npm"
}
}
Response:
{
"path": "/workspace/.beans/beans-vscode-123--title.md",
"bytes": 256,
"updatedFields": ["status", "pr", "branch"],
"frontmatter": {
"status": "in-progress",
"pr": "123",
"branch": "feature/cascade-status-and-skills-npm"
}
}
Request (read last 200 lines):
{ "operation": "read", "lines": 200 }
Response:
{
"path": "/workspace/.vscode/logs/beans-output.log",
"content": "...log lines...",
"linesReturned": 200
}
Programmatic usage
Installation
npm install beans-mcp
Example
import { createBeansMcpServer, parseCliArgs } from '@selfagency/beans-mcp';
const server = await createBeansMcpServer({
workspaceRoot: '/path/to/workspace',
cliPath: 'beans', // or path to beans CLI
});
// Connect to stdio transport or your own transport
API
createBeansMcpServer(opts)
Creates and initializes a Beans MCP server instance.
Options:
workspaceRoot(string): Path to the Beans workspacecliPath(string, optional): Path to Beans CLI executable (default: 'beans')name(string, optional): Server name (default: 'beans-mcp-server')version(string, optional): Server versionlogDir(string, optional): Directory for server logsbackend(BackendInterface, optional): Custom backend implementation
Returns: { server: McpServer; backend: BackendInterface }
startBeansMcpServer(argv)
CLI-compatible entrypoint for launching the server.
Utility Functions
parseCliArgs(argv: string[]): Parse CLI argumentsisPathWithinRoot(root: string, target: string): boolean: Check if path is contained within rootsortBeans(beans, mode): Sort beans by specified mode
Types & Schemas
Export of GraphQL schema, Zod validation schemas, and TypeScript types for Beans records and operations.
Agent Skills (skills-npm, skills.sh)
This package ships a built-in Agent Skill under skills/ and also publishes that skill in a format that fits the broader open skills ecosystem surfaced by skills.sh.
- Skill path in package:
skills/beans-mcp/SKILL.md - Published skill artifact:
https://beans-mcp.self.agency/.well-known/agent-skills/beans-mcp/SKILL.md - Published discovery index:
https://beans-mcp.self.agency/.well-known/agent-skills/index.json - Compatible with discovery tools that scan:
node_modules/**/skills/*/SKILL.md
That means you can use it with npm-based workflows such as skills-npm, while also pointing ecosystem tooling at the published skill artifact and discovery index used by skills catalogs like skills.sh.
To symlink installed npm-packaged skills into your agent workspace, you can use skills-npm in your consuming project.
License
MIT
常见问题
io.github.selfagency/beans-mcp 是什么?
以 agent 方式与 Beans CLI issue tracker 交互,实现问题查询与处理流程自动化。
相关 Skills
网页构建器
by anthropics
面向复杂 claude.ai HTML artifact 开发,快速初始化 React + Tailwind CSS + shadcn/ui 项目并打包为单文件 HTML,适合需要状态管理、路由或多组件交互的页面。
✎ 在 claude.ai 里做复杂网页 Artifact 很省心,多组件、状态和路由都能顺手搭起来,React、Tailwind 与 shadcn/ui 组合效率高、成品也更精致。
前端设计
by anthropics
面向组件、页面、海报和 Web 应用开发,按鲜明视觉方向生成可直接落地的前端代码与高质感 UI,适合做 landing page、Dashboard 或美化现有界面,避开千篇一律的 AI 审美。
✎ 想把页面做得既能上线又有设计感,就用前端设计:组件到整站都能产出,难得的是能避开千篇一律的 AI 味。
网页应用测试
by anthropics
用 Playwright 为本地 Web 应用编写自动化测试,支持启动开发服务器、校验前端交互、排查 UI 异常、抓取截图与浏览器日志,适合调试动态页面和回归验证。
✎ 借助 Playwright 一站式验证本地 Web 应用前端功能,调 UI 时还能同步查看日志和截图,定位问题更快。
相关 MCP Server
GitHub
编辑精选by GitHub
GitHub 是 MCP 官方参考服务器,让 Claude 直接读写你的代码仓库和 Issues。
✎ 这个参考服务器解决了开发者想让 AI 安全访问 GitHub 数据的问题,适合需要自动化代码审查或 Issue 管理的团队。但注意它只是参考实现,生产环境得自己加固安全。
Context7 文档查询
编辑精选by Context7
Context7 是实时拉取最新文档和代码示例的智能助手,让你告别过时资料。
✎ 它能解决开发者查找文档时信息滞后的问题,特别适合快速上手新库或跟进更新。不过,依赖外部源可能导致偶尔的数据延迟,建议结合官方文档使用。
by tldraw
tldraw 是让 AI 助手直接在无限画布上绘图和协作的 MCP 服务器。
✎ 这解决了 AI 只能输出文本、无法视觉化协作的痛点——想象让 Claude 帮你画流程图或白板讨论。最适合需要快速原型设计或头脑风暴的开发者。不过,目前它只是个基础连接器,你得自己搭建画布应用才能发挥全部潜力。