mcpField
B
Beans MCP

Beans MCP

本地服务
github.com/selfagency生产力0今天更新

关于 Beans MCP

Beans MCP 将 Beans issue tracker 的工作区操作提供给 AI 工具和程序调用。它支持创建、查询、批量更新条目,以及管理工作区中的文件和输出日志。

主要功能

  1. 01创建、查看、更新和归档 Beans 条目
  2. 02批量创建与更新并返回逐项结果
  3. 03按状态、类型、标签筛选和搜索
  4. 04读取和编辑 .beans 文件
  5. 05查看扩展输出日志

适用场景

  1. 01在 issue tracker 中维护任务与缺陷
  2. 02批量调整条目状态或父级关系
  3. 03查找符合条件的 Beans 条目
  4. 04读取或修改工作区的 .beans 文件

MCP 相关

该 MCP 服务向客户端公开 Beans 工作区的条目管理、查询、文件操作和日志读取工具;可从命令行启动,也可通过 TypeScript API 创建。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"beans": {
"command": "npx",
"args": [
"-y",
"@selfagency/beans-mcp"
]
}
}
}
启动命令npx -y @selfagency/beans-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@selfagency/beans-mcp0.1.4

工具

14

收录的工具列表 · 更新于 3 周前

参数类型必填说明
prefixstring否Bean ID 的可选工作区前缀

详细介绍

@selfagency/beans-mcp 🫘

beans-mcp 图标

测试与构建 codecov NPM 版本

面向 Beans 问题跟踪器的 MCP(模型上下文协议)服务。提供编程接口和命令行接口,支持与 Beans 工作区进行 AI 驱动的交互。

文档:beans-mcp.self.agency

🤖 立即体验在 VS Code 中与 GitHub Copilot 完全集成的 Beans!安装 selfagency.beans-vscode 扩展。

使用方法

npx @selfagency/beans-mcp /path/to/workspace
版本管理

@selfagency/beans-mcp 使用独立的包版本号。与 Beans CLI 的兼容性单独跟踪。

服务启动时,会将已安装的 beans CLI 版本与硬编码的受支持 Beans 版本 0.4.2 进行比较。如果两者不一致,则会向 stderr 输出警告并继续启动。

参数
  • --workspace-root 或位置参数:工作区根路径
  • --cli-path:Beans CLI 路径
  • --port:MCP 服务端口(默认值:39173)
  • --log-dir:日志目录
  • -h、--help:打印用法并退出

MCP 公共工具概述

工具描述
beans_init初始化工作区(可选 prefix)。
beans_archive归档已完成或已废弃的 bean。
beans_view通过 beanId 或 beanIds 获取 bean 的完整详情。
beans_create创建新的 bean(标题/类型 + 可选正文/父项)。
beans_bulk_create一次调用创建多个 bean,可选将它们置于同一个父项下。
beans_update集中更新元数据和正文(状态/类型/优先级/父项/清除父项/阻塞/被阻塞项/正文/追加正文/替换正文),并可选提供乐观并发提示(ifMatch)。
beans_bulk_update一次调用更新多个 bean,可选将它们重新分配到同一个父项下。
beans_complete_tasks将 bean 中所有 Markdown 检查清单任务标记为已完成。
beans_delete删除一个或多个 bean(beanId 或 beanIds,可选 force)。
beans_reopen重新打开已完成或已废弃的 bean,使其恢复为活动状态。
beans_query统一执行列表/搜索/筛选/排序/就绪状态操作,并支持 GraphQL 透传。
beans_bean_file读取/编辑/创建/删除 .beans 下的文件。
beans_output读取扩展程序输出日志或显示指引。
备注 - `beans_query` 工具的用途较广:列出、搜索、筛选或排序 beans,以及生成 Copilot 指令(`operation: 'llm_context'`)时,优先使用它。 - 所有文件和日志操作都会验证路径,确保路径位于工作区或 VS Code 日志目录内。路径中的 `.beans/` 前缀会被自动移除——传入 `some-bean.md` 或 `.beans/some-bean.md`,结果相同。 - `beans_update` 取代了许多细粒度的更新工具;调用方应使用它,以保持公开工具接口精简且可预测。 - `beans_archive` 提供与 CLI 一致的归档功能,可归档已完成或已废弃的 beans。 - 通过 `beans_update` 关闭父 bean(`status: completed` 或 `status: scrapped`)时,所有后代 bean 的状态也会级联更新为相同状态。 - 通过 `beans_reopen` 重新打开父 bean 时,目标状态会级联应用于已关闭的后代 bean(`completed` / `scrapped`)。 - `beans_bulk_create` 和 `beans_bulk_update` 采用尽力而为的方式:依次处理各项,并返回包含成功或错误条目的逐项结果数组,而非以原子方式失败。 - 写入时,Frontmatter 中的 `title:` 值会自动加上双引号。请传入原始标题——加引号和转义会自动处理。 - `beans_bean_file` 支持通过 `update_frontmatter` 仅对 Frontmatter 进行原子写入;支持的字段包括 `pr` 和 `branch`。 - 未筛选的列表结果会进行缓存,缓存采用较短的突发 TTL 和基于时间戳探测的刷新策略。变更工具(`beans_create`、`beans_update`、`beans_delete` 等)会立即使缓存失效。 - `beans-mcp` 与 Beans CLI 之间的版本不匹配只会产生警告,不会阻止操作;这是有意设计的。 - 当工具输入中缺少 `beanId` 时,验证错误会附带提示:`Did you mean \`beanId\`?`。
## 示例
beans_init

请求:

{ "prefix": "project" }

响应(structuredContent):

{ "initialized": true }
beans_view

请求:

{ "beanId": "bean-abc" }

请求(多个 beans):

{ "beanIds": ["bean-abc", "bean-def"] }

响应(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"
  }
}
beans_archive

请求:

{}

响应(示例):

{ "archived": true, "archivedCount": 3 }
beans_create

请求:

{
  "title": "Add dark mode",
  "type": "feature",
  "status": "todo",
  "priority": "normal",
  "body": "Implement theme toggle and styles",
  "parent": "epic-123"
}

description 是已弃用的 body 别名,仍可接受。

响应(structuredContent):

{
  "bean": {
    "id": "new-1",
    "title": "Add dark mode",
    "status": "todo",
    "type": "feature"
  }
}
beans_bulk_create

请求:

{
  "parent": "epic-123",
  "beans": [
    { "title": "Design mockups", "type": "task" },
    { "title": "Implement API", "type": "task", "priority": "high" },
    { "title": "Write tests", "type": "task", "parent": "epic-456" }
  ]
}

顶层的 parent 会作为默认值应用于所有未指定自身 parent 的 bean。此处,Design mockups 和 Implement API 会分配给 epic-123;Write tests 则会覆盖该值,分配给 epic-456。

响应(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" } }
  ]
}
beans_bulk_update

请求(将一批任务移至进行中状态并分配给一个父项):

{
  "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" }
  ]
}

响应(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" } }
  ]
}

这两个批量工具都会尽力完成操作:逐项报告部分失败,而不会中止整个批次。

beans_update

请求(更改状态并添加阻塞项):

{
  "beanId": "bean-abc",
  "status": "in-progress",
  "blocking": ["bean-def"],
  "ifMatch": "etag-value"
}

请求(原子性修改正文):

{
  "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."
}

注意:同一请求中不能将 body(完整替换)与 bodyAppend 或 bodyReplace 一起使用。

响应(structuredContent):

{
  "bean": {
    "id": "bean-abc",
    "status": "in-progress",
    "blockingIds": ["bean-def"]
  }
}
beans_delete

请求:

{ "beanId": "bean-old", "force": false }

响应:

{ "deleted": true, "beanId": "bean-old" }

批量请求:

{ "beanIds": ["bean-old", "bean-older"], "force": false }

批量响应(摘要):

{
  "requestedCount": 2,
  "deletedCount": 2,
  "failedCount": 0,
  "results": [
    { "beanId": "bean-old", "deleted": true },
    { "beanId": "bean-older", "deleted": true }
  ]
}
beans_reopen

请求:

{
  "beanId": "bean-closed",
  "requiredCurrentStatus": "completed",
  "targetStatus": "todo"
}

响应:

{ "bean": { "id": "bean-closed", "status": "todo" } }
beans_complete_tasks

请求:

{ "beanId": "bean-abc" }

响应:

{
  "bean": {
    "id": "bean-abc",
    "status": "todo"
  },
  "totalTaskCount": 5,
  "updatedTaskCount": 3,
  "unchangedTaskCount": 2
}
beans_query 示例

刷新(列出所有 beans):

{ "operation": "refresh" }

响应(部分内容):

{ "count": 12, "beans": [] }

筛选(状态/类型/标签):

{
  "operation": "filter",
  "statuses": ["in-progress", "todo"],
  "types": ["bug", "feature"],
  "tags": ["auth"]
}

搜索(全文):

{ "operation": "search", "search": "authentication", "includeClosed": false }

排序(模式:status-priority-type-title、updated、created、id):

{ "operation": "sort", "mode": "updated" }

就绪(仅显示可执行的 beans):

{ "operation": "ready" }

大模型上下文(生成 Copilot 指令;可选写入工作区):

{ "operation": "llm_context", "writeToWorkspaceInstructions": true }

响应(structuredContent):

{
  "graphqlSchema": "...",
  "generatedInstructions": "...",
  "instructionsPath": "/workspace/.github/instructions/beans-prime.instructions.md"
}

原始 GraphQL 直通(与 beans query 的 CLI 功能一致):

{
  "operation": "graphql",
  "graphql": "{ beans(filter: { type: [\"bug\"] }) { id title status } }"
}

带变量:

{
  "operation": "graphql",
  "graphql": "query($q: String!) { beans(filter: { search: $q }) { id title } }",
  "variables": { "q": "authentication" }
}
beans_bean_file

请求(读取):

{ "operation": "read", "path": "beans-vscode-123--title.md" }

响应:

{
  "path": "/workspace/.beans/beans-vscode-123--title.md",
  "content": "---\n...frontmatter...\n---\n# Title\n"
}

请求(原子性更新 frontmatter):

{
  "operation": "update_frontmatter",
  "path": "beans-vscode-123--title.md",
  "fields": {
    "status": "in-progress",
    "pr": "123",
    "branch": "feature/cascade-status-and-skills-npm"
  }
}

响应:

{
  "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"
  }
}
beans_output

请求(读取最后 200 行):

{ "operation": "read", "lines": 200 }

响应:

{
  "path": "/workspace/.vscode/logs/beans-output.log",
  "content": "...log lines...",
  "linesReturned": 200
}

编程方式使用

安装
npm install beans-mcp
示例
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)

创建并初始化 Beans MCP 服务实例。

选项:

  • workspaceRoot(string):Beans 工作区的路径
  • cliPath(string,可选):Beans CLI 可执行文件的路径(默认值:'beans')
  • name(string,可选):服务名称(默认值:'beans-mcp-server')
  • version(string,可选):服务版本
  • logDir(string,可选):服务日志目录
  • backend(BackendInterface,可选):自定义后端实现

返回值: { server: McpServer; backend: BackendInterface }

startBeansMcpServer(argv)

用于启动服务、兼容 CLI 的入口点。

实用函数
  • parseCliArgs(argv: string[]):解析 CLI 参数
  • isPathWithinRoot(root: string, target: string): boolean:检查路径是否位于根目录内
  • sortBeans(beans, mode):按指定模式对 beans 排序
类型和架构

导出 GraphQL 架构、Zod 验证架构以及 Beans 记录和操作的 TypeScript 类型。

Agent Skills(skills-npm、skills.sh)

此软件包在 skills/ 下内置了一个 Agent Skill,同时也以适配更广泛的开放技能生态的格式发布该 Skill,可通过 skills.sh 浏览。

  • 软件包中的 Skill 路径:skills/beans-mcp/SKILL.md
  • 已发布的 Skill 文件:https://beans-mcp.self.agency/.well-known/agent-skills/beans-mcp/SKILL.md
  • 已发布的发现索引:https://beans-mcp.self.agency/.well-known/agent-skills/index.json
  • 兼容扫描以下路径的发现工具:node_modules/**/skills/*/SKILL.md

这意味着你可以在基于 npm 的工作流中使用它,例如 skills-npm;也可以将生态工具指向已发布的 Skill 文件和发现索引,供 skills.sh 等技能目录使用。

若要将已安装的 npm 打包技能符号链接到 Agent 工作区,可以在使用该技能的项目中使用 skills-npm。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。