@selfagency/beans-mcp 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.beans.yml +6 -0
- package/.claude/settings.local.json +18 -0
- package/.editorconfig +13 -0
- package/.github/workflows/release.yml +235 -0
- package/.github/workflows/test.yml +80 -0
- package/.husky/pre-commit +1 -0
- package/.nvmrc +1 -0
- package/.oxfmtrc.json +11 -0
- package/.oxlintrc.json +37 -0
- package/.vscode/settings.json +3 -0
- package/CHANGELOG.md +140 -0
- package/CONTRIBUTING.md +139 -0
- package/LICENSE.txt +21 -0
- package/README.md +4 -4
- package/dist/README.md +307 -0
- package/dist/beans-mcp-server.cjs.map +1 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +31676 -0
- package/dist/index.js.map +1 -0
- package/dist/package.json +43 -0
- package/package.json +64 -27
- package/pnpm-workspace.yaml +2 -0
- package/scripts/release.js +433 -0
- package/scripts/write-dist-package.js +53 -0
- package/src/cli.ts +14 -0
- package/src/index.ts +21 -0
- package/src/internal/graphql.ts +33 -0
- package/src/internal/queryHelpers.ts +157 -0
- package/src/server/BeansMcpServer.ts +600 -0
- package/src/server/backend.ts +358 -0
- package/src/test/BeansMcpServer.test.ts +514 -0
- package/src/test/handlers.unit.test.ts +184 -0
- package/src/test/parseCliArgs.test.ts +69 -0
- package/src/test/protocol.e2e.test.ts +884 -0
- package/src/test/queryHelpers.test.ts +524 -0
- package/src/test/startBeansMcpServer.test.ts +146 -0
- package/src/test/tools-integration.test.ts +912 -0
- package/src/test/utils.test.ts +80 -0
- package/src/types.ts +46 -0
- package/src/utils.ts +20 -0
- package/tsconfig.json +24 -0
- package/tsup.config.ts +42 -0
- package/vitest.config.ts +18 -0
- package/index.js +0 -15350
- /package/{beans-mcp-server.cjs → dist/beans-mcp-server.cjs} +0 -0
- /package/{index.cjs → dist/index.cjs} +0 -0
- /package/{index.d.ts → dist/index.d.ts} +0 -0
package/LICENSE.txt
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 The Self Agency, LLC
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# beans-mcp
|
|
1
|
+
# @selfagency/beans-mcp 🫘
|
|
2
|
+
|
|
3
|
+
[](https://github.com/selfagency/beans-mcp/actions/workflows/test.yml) [](https://codecov.io/gh/selfagency/beans-mcp)
|
|
2
4
|
|
|
3
5
|
MCP (Model Context Protocol) server for [Beans](https://github.com/hmans/beans) issue tracker. Provides programmatic and CLI interfaces for AI-powered interactions with Beans workspaces.
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
<span><strong>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.</strong></span>
|
|
7
|
-
</div>
|
|
7
|
+
> 🤖 **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.**
|
|
8
8
|
|
|
9
9
|
## Usage
|
|
10
10
|
|
package/dist/README.md
ADDED
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
# @selfagency/beans-mcp 🫘
|
|
2
|
+
|
|
3
|
+
[](https://github.com/selfagency/beans-mcp/actions/workflows/test.yml) [](https://codecov.io/gh/selfagency/beans-mcp)
|
|
4
|
+
|
|
5
|
+
MCP (Model Context Protocol) server for [Beans](https://github.com/hmans/beans) issue tracker. Provides programmatic and CLI interfaces for AI-powered interactions with Beans workspaces.
|
|
6
|
+
|
|
7
|
+
> 🤖 **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.**
|
|
8
|
+
|
|
9
|
+
## Usage
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npx @selfagency/beans-mcp /path/to/workspace
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
### Parameters
|
|
16
|
+
|
|
17
|
+
- `--workspace-root` or positional arg: Workspace root path
|
|
18
|
+
- `--cli-path`: Path to Beans CLI
|
|
19
|
+
- `--port`: MCP server port (default: 39173)
|
|
20
|
+
- `--log-dir`: Log directory
|
|
21
|
+
- `-h`, `--help`: Print usage and exit
|
|
22
|
+
|
|
23
|
+
## Summary of public MCP tools
|
|
24
|
+
|
|
25
|
+
- `beans_init` — Initialize the workspace (optional `prefix`).
|
|
26
|
+
- `beans_view` — Fetch full bean details by `beanId`.
|
|
27
|
+
- `beans_create` — Create a new bean (title/type + optional fields).
|
|
28
|
+
- `beans_update` — Consolidated metadata updates (status/type/priority/parent/clearParent/blocking/blockedBy).
|
|
29
|
+
- `beans_delete` — Delete a bean (`beanId`, optional `force`).
|
|
30
|
+
- `beans_reopen` — Reopen a completed or scrapped bean to an active status.
|
|
31
|
+
- `beans_query` — Unified list/search/filter/sort/llm_context/open_config operations.
|
|
32
|
+
- `beans_bean_file` — Read/edit/create/delete files under `.beans`.
|
|
33
|
+
- `beans_output` — Read extension output logs or show guidance.
|
|
34
|
+
|
|
35
|
+
### Notes
|
|
36
|
+
|
|
37
|
+
- The `beans_query` tool is intentionally broad: prefer it for listing, searching, filtering or sorting beans, and for generating Copilot instructions (`operation: 'llm_context'`).
|
|
38
|
+
- All file and log operations validate paths to keep them within the workspace or the VS Code log directory.
|
|
39
|
+
- `beans_update` replaces many fine-grained update tools; callers should use it to keep the public tool surface small and predictable.
|
|
40
|
+
|
|
41
|
+
## Examples
|
|
42
|
+
|
|
43
|
+
### beans_init
|
|
44
|
+
|
|
45
|
+
Request:
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{ "prefix": "project" }
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Response (structuredContent):
|
|
52
|
+
|
|
53
|
+
```json
|
|
54
|
+
{ "initialized": true }
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### beans_view
|
|
58
|
+
|
|
59
|
+
Request:
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{ "beanId": "bean-abc" }
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Response (structuredContent):
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"bean": {
|
|
70
|
+
"id": "bean-abc",
|
|
71
|
+
"title": "Fix login timeout",
|
|
72
|
+
"status": "todo",
|
|
73
|
+
"type": "bug",
|
|
74
|
+
"priority": "critical",
|
|
75
|
+
"body": "...markdown...",
|
|
76
|
+
"createdAt": "2025-12-01T12:00:00Z",
|
|
77
|
+
"updatedAt": "2025-12-02T08:00:00Z"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### beans_create
|
|
83
|
+
|
|
84
|
+
Request:
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
{
|
|
88
|
+
"title": "Add dark mode",
|
|
89
|
+
"type": "feature",
|
|
90
|
+
"status": "todo",
|
|
91
|
+
"priority": "normal",
|
|
92
|
+
"description": "Implement theme toggle and styles"
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Response (structuredContent):
|
|
97
|
+
|
|
98
|
+
```json
|
|
99
|
+
{
|
|
100
|
+
"bean": {
|
|
101
|
+
"id": "new-1",
|
|
102
|
+
"title": "Add dark mode",
|
|
103
|
+
"status": "todo",
|
|
104
|
+
"type": "feature"
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### beans_update
|
|
110
|
+
|
|
111
|
+
Request (change status and add blocking):
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
{
|
|
115
|
+
"beanId": "bean-abc",
|
|
116
|
+
"status": "in-progress",
|
|
117
|
+
"blocking": ["bean-def"]
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Response (structuredContent):
|
|
122
|
+
|
|
123
|
+
```json
|
|
124
|
+
{
|
|
125
|
+
"bean": {
|
|
126
|
+
"id": "bean-abc",
|
|
127
|
+
"status": "in-progress",
|
|
128
|
+
"blockingIds": ["bean-def"]
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### beans_delete
|
|
134
|
+
|
|
135
|
+
Request:
|
|
136
|
+
|
|
137
|
+
```json
|
|
138
|
+
{ "beanId": "bean-old", "force": false }
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Response:
|
|
142
|
+
|
|
143
|
+
```json
|
|
144
|
+
{ "deleted": true, "beanId": "bean-old" }
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### beans_reopen
|
|
148
|
+
|
|
149
|
+
Request:
|
|
150
|
+
|
|
151
|
+
```json
|
|
152
|
+
{
|
|
153
|
+
"beanId": "bean-closed",
|
|
154
|
+
"requiredCurrentStatus": "completed",
|
|
155
|
+
"targetStatus": "todo"
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Response:
|
|
160
|
+
|
|
161
|
+
```json
|
|
162
|
+
{ "bean": { "id": "bean-closed", "status": "todo" } }
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### beans_query — examples
|
|
166
|
+
|
|
167
|
+
Refresh (list all beans):
|
|
168
|
+
|
|
169
|
+
```json
|
|
170
|
+
{ "operation": "refresh" }
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Response (partial):
|
|
174
|
+
|
|
175
|
+
```json
|
|
176
|
+
{ "count": 12, "beans": [] }
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Filter (statuses/types/tags):
|
|
180
|
+
|
|
181
|
+
```json
|
|
182
|
+
{
|
|
183
|
+
"operation": "filter",
|
|
184
|
+
"statuses": ["in-progress", "todo"],
|
|
185
|
+
"types": ["bug", "feature"],
|
|
186
|
+
"tags": ["auth"]
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Search (full-text):
|
|
191
|
+
|
|
192
|
+
```json
|
|
193
|
+
{ "operation": "search", "search": "authentication", "includeClosed": false }
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Sort (modes: `status-priority-type-title`, `updated`, `created`, `id`):
|
|
197
|
+
|
|
198
|
+
```json
|
|
199
|
+
{ "operation": "sort", "mode": "updated" }
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
LLM context (generate Copilot instructions; optional write-to-workspace):
|
|
203
|
+
|
|
204
|
+
```json
|
|
205
|
+
{ "operation": "llm_context", "writeToWorkspaceInstructions": true }
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Response (structuredContent):
|
|
209
|
+
|
|
210
|
+
```json
|
|
211
|
+
{
|
|
212
|
+
"graphqlSchema": "...",
|
|
213
|
+
"generatedInstructions": "...",
|
|
214
|
+
"instructionsPath": "/workspace/.github/instructions/tasks.instructions.md"
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### beans_bean_file
|
|
219
|
+
|
|
220
|
+
Request (read):
|
|
221
|
+
|
|
222
|
+
```json
|
|
223
|
+
{ "operation": "read", "path": "beans-vscode-123--title.md" }
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Response:
|
|
227
|
+
|
|
228
|
+
```json
|
|
229
|
+
{
|
|
230
|
+
"path": "/workspace/.beans/beans-vscode-123--title.md",
|
|
231
|
+
"content": "---\n...frontmatter...\n---\n# Title\n"
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### beans_output
|
|
236
|
+
|
|
237
|
+
Request (read last 200 lines):
|
|
238
|
+
|
|
239
|
+
```json
|
|
240
|
+
{ "operation": "read", "lines": 200 }
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Response:
|
|
244
|
+
|
|
245
|
+
```json
|
|
246
|
+
{
|
|
247
|
+
"path": "/workspace/.vscode/logs/beans-output.log",
|
|
248
|
+
"content": "...log lines...",
|
|
249
|
+
"linesReturned": 200
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## Programmatic usage
|
|
254
|
+
|
|
255
|
+
### Installation
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
npm install beans-mcp
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Example
|
|
262
|
+
|
|
263
|
+
```typescript
|
|
264
|
+
import { createBeansMcpServer, parseCliArgs } from "@selfagency/beans-mcp";
|
|
265
|
+
|
|
266
|
+
const server = await createBeansMcpServer({
|
|
267
|
+
workspaceRoot: "/path/to/workspace",
|
|
268
|
+
cliPath: "beans", // or path to beans CLI
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
// Connect to stdio transport or your own transport
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### API
|
|
275
|
+
|
|
276
|
+
#### createBeansMcpServer(opts)
|
|
277
|
+
|
|
278
|
+
Creates and initializes a Beans MCP server instance.
|
|
279
|
+
|
|
280
|
+
**Options:**
|
|
281
|
+
|
|
282
|
+
- `workspaceRoot` (string): Path to the Beans workspace
|
|
283
|
+
- `cliPath` (string, optional): Path to Beans CLI executable (default: 'beans')
|
|
284
|
+
- `name` (string, optional): Server name (default: 'beans-mcp-server')
|
|
285
|
+
- `version` (string, optional): Server version
|
|
286
|
+
- `logDir` (string, optional): Directory for server logs
|
|
287
|
+
- `backend` (BackendInterface, optional): Custom backend implementation
|
|
288
|
+
|
|
289
|
+
**Returns:** `{ server: McpServer; backend: BackendInterface }`
|
|
290
|
+
|
|
291
|
+
#### startBeansMcpServer(argv)
|
|
292
|
+
|
|
293
|
+
CLI-compatible entrypoint for launching the server.
|
|
294
|
+
|
|
295
|
+
### Utility Functions
|
|
296
|
+
|
|
297
|
+
- `parseCliArgs(argv: string[])`: Parse CLI arguments
|
|
298
|
+
- `isPathWithinRoot(root: string, target: string): boolean`: Check if path is contained within root
|
|
299
|
+
- `sortBeans(beans, mode)`: Sort beans by specified mode
|
|
300
|
+
|
|
301
|
+
### Types & Schemas
|
|
302
|
+
|
|
303
|
+
Export of GraphQL schema, Zod validation schemas, and TypeScript types for Beans records and operations.
|
|
304
|
+
|
|
305
|
+
## License
|
|
306
|
+
|
|
307
|
+
MIT
|