beans-mcp について
beans-mcpはBeans課題トラッカー向けのMCPサーバーで、AIエージェントやプログラムからワークスペース内の項目を管理できます。Beans CLIを介して、バッチ操作、検索・絞り込み、ファイル操作を提供します。
主な機能
- 01項目の作成、更新、削除
- 02項目の一括作成・更新
- 03状態、種類、テキストで検索
- 04.beansファイルの読み書き
- 05拡張機能の出力ログを確認
活用シーン
- 01ワークスペースでプロジェクトタスクを管理
- 02状態や親項目をまとめて変更
- 03未完了の課題を検索・絞り込み
- 04項目ファイルや拡張ログを確認
MCP 対応
Beans CLIによる課題管理操作をMCPツールとして公開し、項目管理、検索、ファイル操作、ログ読み取りを提供します。ワークスペースを指定してコマンドラインから起動できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
14掲載時のツール一覧 · 1 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| prefix | string | いいえ | Bean ID に付ける任意のワークスペースプレフィックス |
詳細
@voxslopuli/beans-mcp 🫘
Beans の課題トラッカー用 MCP(Model Context Protocol)サーバーです。Beans ワークスペースと AI を活用してやり取りするための、プログラムインターフェースと CLI インターフェースを提供します。
ドキュメント:beans-mcp.voxslopuli.org
🤖 VS Code で GitHub Copilot と完全に統合された Beans をお試しください!selfagency.beans-vscode 拡張機能をインストールしてください。
使用方法
npx @voxslopuli/beans-mcp /path/to/workspace
同梱の beans CLI
beans CLI バイナリは、プラットフォーム固有のオプション依存パッケージ
(@voxslopuli/beans-cli-darwin-arm64、-darwin-x64、-linux-arm64、
-linux-x64、-win32-x64)を通じて同梱されており、サポート対象の Beans バージョン(0.4.2)に固定されています。
起動時、サーバーはまず同梱されたバイナリを解決し、見つからない場合は PATH 内の
beans コマンドにフォールバックします。--cli-path が明示的に指定されている場合は、常にそちらが優先されます。
Beans の新しいバージョンが公開されたときに、新しいプラットフォームパッケージをリリースするには:
# 1. Bump beansCli.version + optionalDependencies in package.json
pnpm fetch-beans-binaries --version <beans-version>
# 2. Verify staged binaries in build/beans-cli/, then publish
pnpm publish-beans-cli # add --dry-run to preview
または、GitHub Actions で Beans CLI パッケージのリリース ワークフローを実行してください。
バージョン管理
@voxslopuli/beans-mcp は独自のパッケージバージョン管理を行います。Beans CLI との互換性は別途管理されています。
起動時、サーバーはインストールされている beans CLI のバージョンと、ハードコードされたサポート対象の Beans バージョン 0.4.2 を比較します。異なる場合は標準エラー出力に警告を表示し、起動を続行します。
パラメーター
--workspace-rootまたは位置引数:ワークスペースのルートパス--cli-path:Beans CLI のパス--port:MCP サーバーのポート(デフォルト:39173)--log-dir:ログディレクトリ-h、--help:使用方法を表示して終了
公開 MCP ツールの概要
| ツール | 説明 |
|---|---|
beans_init | ワークスペースを初期化します(任意の prefix を指定できます)。 |
beans_archive | 完了済みまたは破棄された beans をアーカイブします。 |
beans_view | beanId または beanIds を指定して、bean の詳細を取得します。 |
beans_create | 新しい bean を作成します(タイトル/タイプと、任意の本文/親)。 |
beans_bulk_create | 1 回の呼び出しで複数の beans を作成します。任意で共通の親を指定できます。 |
beans_update | メタデータと本文をまとめて更新します(ステータス/タイプ/優先度/親/親の解除/ブロック/ブロック元/本文/本文の追記/本文の置換)。任意で楽観的同時実行制御のヒント(ifMatch)を指定できます。 |
beans_bulk_update | 1 回の呼び出しで複数の beans を更新します。任意で共通の親に再割り当てできます。 |
beans_complete_tasks | bean 内のすべての Markdown チェックリストタスクを完了済みにします。 |
beans_delete | 1 つまたは複数の beans を削除します(beanId または beanIds、任意の force)。 |
beans_reopen | 完了済みまたは破棄された bean を再開し、アクティブなステータスにします。 |
beans_query | GraphQL パススルーを備えた、一覧表示/検索/フィルタリング/並べ替え/準備完了操作を統合したツールです。 |
beans_bean_file | .beans 内のファイルを読み取り/編集/作成/削除します。 |
beans_output | 拡張機能の出力ログを読み取るか、ガイダンスを表示します。 |
注記
- `beans_query` ツールは意図的に幅広い用途に対応しています。Bean の一覧表示、検索、フィルタリング、並べ替え、および Copilot の指示の生成(`operation: 'llm_context'`)には、こちらを優先して使用してください。 - すべてのファイル操作とログ操作では、パスがワークスペース内または VS Code のログディレクトリ内に収まるよう検証されます。`.beans/` プレフィックスは自動的に削除されるため、`some-bean.md` と `.beans/some-bean.md` のどちらを指定しても結果は同じです。 - `beans_update` は多くの細分化された更新ツールを置き換えます。呼び出し元は、公開されるツールの種類を少なく予測しやすく保つために、これを使用してください。 - `beans_archive` は、完了または破棄された Bean をアーカイブするための CLI との同等機能を提供します。 - `beans_update` で親 Bean を閉じると(`status: completed` または `status: scrapped`)、すべての子孫にも同じステータスが適用されます。 - `beans_reopen` で親 Bean を再開すると、閉じている子孫(`completed`/`scrapped`)に対象のステータスが適用されます。 - `beans_bulk_create` と `beans_bulk_update` はベストエフォートで動作します。各項目を順番に処理し、アトミックに失敗するのではなく、成功またはエラーの結果を項目ごとに含む配列を返します。 - frontmatter の `title:` の値は、書き込み時に自動的に二重引用符で囲まれます。タイトルはそのまま渡してください。引用符付けとエスケープは自動で処理されます。 - `beans_bean_file` は、frontmatter のみをアトミックに書き込む `update_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 examples
更新(すべての Bean を一覧表示):
{ "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" }
準備完了(実行可能な Bean のみ):
{ "operation": "ready" }
LLM コンテキスト(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 '@voxslopuli/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 型をエクスポートします。
エージェントスキル(skills-npm、skills.sh)
このパッケージには、skills/ に組み込みのエージェントスキルが含まれており、skills.sh で紹介されている、より広範なオープンスキルエコシステムに適した形式でも公開されています。
- パッケージ内のスキルパス:
skills/beans-mcp/SKILL.md - 公開されているスキル成果物:
https://beans-mcp.voxslopuli.org/.well-known/agent-skills/beans-mcp/SKILL.md - 公開されている検出インデックス:
https://beans-mcp.voxslopuli.org/.well-known/agent-skills/index.json - 次のパスをスキャンする検出ツールと互換性があります:
node_modules/**/skills/*/SKILL.md
つまり、skills-npm などの npm ベースのワークフローで利用できるほか、skills.sh のようなスキルカタログで使われる公開済みのスキル成果物や検出インデックスを、エコシステムのツールから参照することもできます。
インストール済みの npm パッケージ内のスキルをエージェントのワークスペースにシンボリックリンクするには、利用側のプロジェクトで skills-npm を使用できます。
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。