Beans MCP について
Beans MCPは、Beans issue trackerのワークスペース操作をAIツールやプログラムから利用できるようにします。beanの作成、検索、一括更新に加え、ワークスペース内のファイルや出力ログも扱えます。
主な機能
- 01beanの作成、表示、更新、アーカイブ
- 02一括作成・更新と項目ごとの結果返却
- 03ステータス、種類、タグによる検索と絞り込み
- 04.beansファイルの読み取りと編集
- 05拡張機能の出力ログの読み取り
活用シーン
- 01issue trackerでタスクや不具合を管理
- 02beanのステータスや親子関係を一括変更
- 03条件に合うbeanを検索
- 04ワークスペースの.beansファイルを読み取り・編集
MCP 対応
MCPサーバーは、Beansワークスペースのbean管理、検索、ファイル操作、ログ読み取りのツールを公開します。CLIから起動する方法と、TypeScript APIでインスタンスを作成する方法があります。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
14掲載時のツール一覧 · 3 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| prefix | string | いいえ | Bean ID に付ける任意のワークスペースプレフィックス |
詳細
@selfagency/beans-mcp 🫘
Beans の課題トラッカー向け MCP(Model Context Protocol)サーバーです。Beans ワークスペースを AI で活用するためのプログラムインターフェイスと CLI インターフェイスを提供します。
ドキュメント: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 | 完了済みまたは破棄された 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 の例
更新(すべての 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" }
LLM コンテキスト(Copilot の指示を生成。ワークスペースへの書き込みは任意):
{ "operation": "llm_context", "writeToWorkspaceInstructions": true }
レスポンス(structuredContent):
{
"graphqlSchema": "...",
"generatedInstructions": "...",
"instructionsPath": "/workspace/.github/instructions/beans-prime.instructions.md"
}
GraphQL の生データのパススルー(CLI と beans query の互換性):
{
"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 を並べ替えます
型とスキーマ
Beans のレコードと操作に関する GraphQL スキーマ、Zod 検証スキーマ、TypeScript 型をエクスポートします。
エージェントスキル(skills-npm、skills.sh)
このパッケージには、skills/ に組み込みのエージェントスキルが含まれており、skills.sh で紹介されている、より幅広いオープンスキルエコシステムに適した形式でも公開されています。
- パッケージ内のスキルパス:
skills/beans-mcp/SKILL.md - 公開されているスキル成果物:
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をスキャンする検出ツールと互換性があります
つまり、skills-npm などの npm ベースのワークフローで使用できるほか、skills.sh のようなスキルカタログで使用される公開スキル成果物や検出インデックスを、エコシステムのツールから参照することもできます。
インストール済みの npm パッケージのスキルをエージェントのワークスペースにシンボリックリンクするには、利用側のプロジェクトで skills-npm を使用できます。
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。