@becklabs/beck-mcp-server 1.0.0
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/README.md +135 -0
- package/dist/client.d.ts +151 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +217 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/dist/resources.d.ts +18 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +92 -0
- package/dist/resources.js.map +1 -0
- package/dist/tools/documents.d.ts +30 -0
- package/dist/tools/documents.d.ts.map +1 -0
- package/dist/tools/documents.js +184 -0
- package/dist/tools/documents.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +739 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/tasks.d.ts +70 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +474 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/types.d.ts +281 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +43 -0
package/README.md
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# @becklabs/beck-mcp-server
|
|
2
|
+
|
|
3
|
+
MCP (Model Context Protocol) server for Beck project management. This enables Claude Code to work directly on Beck documents, epics, and tasks.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
**Identity & workspaces**
|
|
8
|
+
- **whoami** — Token identity
|
|
9
|
+
- **list_workspaces** — Discover workspaces this token can see (org-scoped; not a default)
|
|
10
|
+
- **create_workspace** — Create a workspace (default: only if the human asked)
|
|
11
|
+
|
|
12
|
+
**Documents**
|
|
13
|
+
- **list_documents** / **read_document** / **create_document** / **write_document** — Planning corpus (etag required on write)
|
|
14
|
+
- **delete_document** / **list_document_versions** / **restore_document** — Etag-guarded delete and version restore
|
|
15
|
+
|
|
16
|
+
**Epics & Plan it**
|
|
17
|
+
- **list_epics** / **get_epic** — Spec, last-plan provenance, tasks, suggested breakdown
|
|
18
|
+
- **plan_it** — Snapshot docs into epics and break down tasks (a human imports)
|
|
19
|
+
- **link_epic_github** / **get_epic_github** — Manual branch / PR on an epic
|
|
20
|
+
|
|
21
|
+
**Tasks**
|
|
22
|
+
- **list_tasks** — Filter by status, epic, assignee, or icebox
|
|
23
|
+
- **get_task** / **get_task_context** — Details plus comments, spec, related work
|
|
24
|
+
- **recommend_task** — What to work on next
|
|
25
|
+
- **start_task** / **finish_task** — Claim and submit for review
|
|
26
|
+
- **accept_task** / **reject_task** — Complete or send back (default: only if the human asked you to review)
|
|
27
|
+
- **update_task** — Title, type, points, tags, epic, description, blocked, criteria, files
|
|
28
|
+
- **set_relevant_files** — Files that matter for the next session
|
|
29
|
+
- **add_comment** / **list_comments**
|
|
30
|
+
- **log_progress** / **list_progress** — Structured work logs
|
|
31
|
+
|
|
32
|
+
**Resources**
|
|
33
|
+
- `beck://skill.md` and `beck://llms.txt` — live agent pack
|
|
34
|
+
- `beck://workspace/{id}/document/{path}` — document bodies
|
|
35
|
+
|
|
36
|
+
## Installation
|
|
37
|
+
|
|
38
|
+
### For Claude Code
|
|
39
|
+
|
|
40
|
+
**Option 1: CLI Command (Recommended)**
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
claude mcp add beck --transport stdio \
|
|
44
|
+
-e BECK_API_TOKEN=beck_your_token_here \
|
|
45
|
+
-e BECK_API_URL=https://beck.bot \
|
|
46
|
+
--scope user -- npx -y @becklabs/beck-mcp-server
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Option 2: Manual Configuration**
|
|
50
|
+
|
|
51
|
+
Add to your `~/.claude.json`:
|
|
52
|
+
|
|
53
|
+
```json
|
|
54
|
+
{
|
|
55
|
+
"mcpServers": {
|
|
56
|
+
"beck": {
|
|
57
|
+
"type": "stdio",
|
|
58
|
+
"command": "npx",
|
|
59
|
+
"args": ["-y", "@becklabs/beck-mcp-server"],
|
|
60
|
+
"env": {
|
|
61
|
+
"BECK_API_TOKEN": "beck_your_token_here",
|
|
62
|
+
"BECK_API_URL": "https://beck.bot"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
After setup, restart Claude Code and run `/mcp` to verify the server is connected.
|
|
70
|
+
|
|
71
|
+
### Environment Variables
|
|
72
|
+
|
|
73
|
+
| Variable | Required | Default | Description |
|
|
74
|
+
|----------|----------|---------|-------------|
|
|
75
|
+
| `BECK_API_TOKEN` | Yes | - | API token from Beck (Settings > API Tokens) |
|
|
76
|
+
| `BECK_API_URL` | No | `https://beck.bot` | Beck instance URL |
|
|
77
|
+
|
|
78
|
+
## Usage
|
|
79
|
+
|
|
80
|
+
Agents should read `https://beck.bot/llms.txt` and `https://beck.bot/skill.md` first (also available as MCP resources). Those are canonical; a locally installed skill copy goes stale.
|
|
81
|
+
|
|
82
|
+
Typical start: the human pastes a prompt from Documents → Point an agent (workspace name + id). Then:
|
|
83
|
+
|
|
84
|
+
1. **Bind**: use only that workspace. `list_workspaces` and ask if none was named. `create_workspace` only if they asked.
|
|
85
|
+
2. **Plan**: `list_documents` → create `prd` if missing → `write_document` with etag
|
|
86
|
+
3. **Plan it** when asked. `get_epic` to re-read the snapshot spec. A human imports tasks unless they asked you to.
|
|
87
|
+
4. **Execute**: `start_task` → work → `log_progress` → `finish_task`. `accept_task` / `reject_task` only if they asked you to review.
|
|
88
|
+
|
|
89
|
+
Defaults live in `/skill.md`, not in access control. The human's prompt overrides those defaults. The tools always exist.
|
|
90
|
+
|
|
91
|
+
## Development
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# From this package directory
|
|
95
|
+
npx tsc --project tsconfig.json
|
|
96
|
+
|
|
97
|
+
# Or from the repo root
|
|
98
|
+
pnpm --filter @becklabs/beck-mcp-server build
|
|
99
|
+
|
|
100
|
+
# Run locally
|
|
101
|
+
BECK_API_TOKEN=beck_xxx node dist/index.js
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
After changing `src/`, rebuild `dist/` — that is what the stdio server runs. Do not run `pnpm build` from this folder; the workspace script builds the Next.js app.
|
|
105
|
+
|
|
106
|
+
## API Reference
|
|
107
|
+
|
|
108
|
+
The MCP server wraps the Beck REST API:
|
|
109
|
+
|
|
110
|
+
- `GET /api/v1/me` - Token identity
|
|
111
|
+
- `GET /api/v1/workspaces` - List workspaces
|
|
112
|
+
- `POST /api/v1/workspaces` - Create a workspace
|
|
113
|
+
- `GET /api/v1/workspaces/:id/tasks` - List tasks
|
|
114
|
+
- `GET /api/v1/workspaces/:id/recommend` - Recommend next task
|
|
115
|
+
- `GET /api/v1/workspaces/:id/documents` - List documents
|
|
116
|
+
- `GET/PUT/DELETE /api/v1/workspaces/:id/documents/:path` - Read / write / delete
|
|
117
|
+
- `GET /api/v1/workspaces/:id/documents/:path/versions` - Version history
|
|
118
|
+
- `POST /api/v1/workspaces/:id/documents/:path/restore` - Restore a version
|
|
119
|
+
- `GET /api/v1/workspaces/:id/epics` - List epics
|
|
120
|
+
- `POST /api/v1/workspaces/:id/plan` - Plan it
|
|
121
|
+
- `GET /api/v1/epics/:id` - Get epic
|
|
122
|
+
- `GET/PATCH /api/v1/epics/:id/github` - Epic GitHub link
|
|
123
|
+
- `GET /api/v1/tasks/:id` - Get task
|
|
124
|
+
- `GET /api/v1/tasks/:id/context` - Task context
|
|
125
|
+
- `POST /api/v1/tasks/:id/start` - Start task
|
|
126
|
+
- `POST /api/v1/tasks/:id/finish` - Finish task
|
|
127
|
+
- `POST /api/v1/tasks/:id/accept` - Accept review
|
|
128
|
+
- `POST /api/v1/tasks/:id/reject` - Reject review (`reason` required)
|
|
129
|
+
- `PATCH /api/v1/tasks/:id` - Update task
|
|
130
|
+
- `GET/POST /api/v1/tasks/:id/comments` - Comments
|
|
131
|
+
- `GET/POST /api/v1/tasks/:id/progress` - Progress updates
|
|
132
|
+
|
|
133
|
+
## License
|
|
134
|
+
|
|
135
|
+
MIT
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import type { Task, Workspace, Comment, TaskContext, ProgressUpdate, TaskRecommendation, Document, DocumentVersion, EpicDetail, EpicSummary, Me } from "./types.js";
|
|
2
|
+
export interface BeckClientConfig {
|
|
3
|
+
apiUrl: string;
|
|
4
|
+
apiToken: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Client for the Beck REST API
|
|
8
|
+
*/
|
|
9
|
+
export declare class BeckAPIClient {
|
|
10
|
+
private baseUrl;
|
|
11
|
+
private token;
|
|
12
|
+
constructor(config: BeckClientConfig);
|
|
13
|
+
private request;
|
|
14
|
+
/**
|
|
15
|
+
* List all workspaces accessible by the authenticated user
|
|
16
|
+
*/
|
|
17
|
+
listWorkspaces(): Promise<Workspace[]>;
|
|
18
|
+
createWorkspace(input: {
|
|
19
|
+
name: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
}): Promise<{
|
|
22
|
+
id: string;
|
|
23
|
+
}>;
|
|
24
|
+
/**
|
|
25
|
+
* List tasks in a workspace
|
|
26
|
+
*/
|
|
27
|
+
listTasks(workspaceId: string, options?: {
|
|
28
|
+
status?: "not_started" | "started" | "ready_for_review" | "completed";
|
|
29
|
+
epicId?: string;
|
|
30
|
+
assigneeId?: string;
|
|
31
|
+
isIcebox?: boolean;
|
|
32
|
+
}): Promise<Task[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Get a single task by ID
|
|
35
|
+
*/
|
|
36
|
+
getTask(taskId: string): Promise<Task>;
|
|
37
|
+
/**
|
|
38
|
+
* Start working on a task
|
|
39
|
+
*/
|
|
40
|
+
startTask(taskId: string): Promise<Task>;
|
|
41
|
+
/**
|
|
42
|
+
* Submit a task for review
|
|
43
|
+
*/
|
|
44
|
+
finishTask(taskId: string): Promise<Task>;
|
|
45
|
+
acceptTask(taskId: string): Promise<Task>;
|
|
46
|
+
rejectTask(taskId: string, reason: string): Promise<Task>;
|
|
47
|
+
/**
|
|
48
|
+
* Update a task
|
|
49
|
+
*/
|
|
50
|
+
updateTask(taskId: string, updates: {
|
|
51
|
+
title?: string;
|
|
52
|
+
description?: string;
|
|
53
|
+
type?: "feature" | "bug" | "chore";
|
|
54
|
+
status?: "not_started" | "started" | "ready_for_review" | "completed";
|
|
55
|
+
points?: number;
|
|
56
|
+
isBlocked?: boolean;
|
|
57
|
+
blockedReason?: string;
|
|
58
|
+
isDelivered?: boolean;
|
|
59
|
+
acceptanceCriteria?: Array<{
|
|
60
|
+
text: string;
|
|
61
|
+
completed: boolean;
|
|
62
|
+
}>;
|
|
63
|
+
tags?: string[];
|
|
64
|
+
relevantFiles?: Array<{
|
|
65
|
+
path: string;
|
|
66
|
+
purpose?: string;
|
|
67
|
+
}>;
|
|
68
|
+
epicId?: string | null;
|
|
69
|
+
}): Promise<{
|
|
70
|
+
id: string;
|
|
71
|
+
}>;
|
|
72
|
+
/**
|
|
73
|
+
* List comments on a task
|
|
74
|
+
*/
|
|
75
|
+
listComments(taskId: string): Promise<Comment[]>;
|
|
76
|
+
/**
|
|
77
|
+
* Add a comment to a task
|
|
78
|
+
*/
|
|
79
|
+
addComment(taskId: string, content: string): Promise<string>;
|
|
80
|
+
/**
|
|
81
|
+
* Get rich context for a task (for starting work)
|
|
82
|
+
* Includes task details, epic with spec, related tasks, comments, and activity
|
|
83
|
+
*/
|
|
84
|
+
getTaskContext(taskId: string): Promise<TaskContext>;
|
|
85
|
+
/**
|
|
86
|
+
* List progress updates for a task
|
|
87
|
+
*/
|
|
88
|
+
listProgressUpdates(taskId: string): Promise<ProgressUpdate[]>;
|
|
89
|
+
/**
|
|
90
|
+
* Log a structured progress update
|
|
91
|
+
*/
|
|
92
|
+
logProgress(taskId: string, progress: {
|
|
93
|
+
whatAttempted: string;
|
|
94
|
+
whatSucceeded?: string;
|
|
95
|
+
whatFailed?: string;
|
|
96
|
+
questions?: string[];
|
|
97
|
+
blockers?: string[];
|
|
98
|
+
}): Promise<string>;
|
|
99
|
+
/**
|
|
100
|
+
* Link a GitHub branch or PR to an epic
|
|
101
|
+
*/
|
|
102
|
+
linkEpicGithub(epicId: string, options: {
|
|
103
|
+
branch?: string;
|
|
104
|
+
prUrl?: string;
|
|
105
|
+
}): Promise<void>;
|
|
106
|
+
/**
|
|
107
|
+
* Get GitHub info for an epic
|
|
108
|
+
*/
|
|
109
|
+
getEpicGithub(epicId: string): Promise<{
|
|
110
|
+
githubBranch: string | null;
|
|
111
|
+
githubPrUrl: string | null;
|
|
112
|
+
}>;
|
|
113
|
+
getMe(): Promise<Me>;
|
|
114
|
+
getEpic(epicId: string): Promise<EpicDetail>;
|
|
115
|
+
deleteDocument(workspaceId: string, path: string, etag: string): Promise<void>;
|
|
116
|
+
listDocumentVersions(workspaceId: string, path: string): Promise<{
|
|
117
|
+
documentId: string;
|
|
118
|
+
path: string;
|
|
119
|
+
versions: DocumentVersion[];
|
|
120
|
+
}>;
|
|
121
|
+
restoreDocument(workspaceId: string, path: string, input: {
|
|
122
|
+
versionId: string;
|
|
123
|
+
etag: string;
|
|
124
|
+
}): Promise<Document>;
|
|
125
|
+
listDocuments(workspaceId: string): Promise<Document[]>;
|
|
126
|
+
getDocument(workspaceId: string, path: string): Promise<Document>;
|
|
127
|
+
createDocument(workspaceId: string, input: {
|
|
128
|
+
path: string;
|
|
129
|
+
title?: string;
|
|
130
|
+
body?: string;
|
|
131
|
+
}): Promise<Document>;
|
|
132
|
+
writeDocument(workspaceId: string, path: string, input: {
|
|
133
|
+
title?: string;
|
|
134
|
+
body?: string;
|
|
135
|
+
path?: string;
|
|
136
|
+
etag: string;
|
|
137
|
+
}): Promise<Document>;
|
|
138
|
+
listEpics(workspaceId: string): Promise<EpicSummary[]>;
|
|
139
|
+
planIt(workspaceId: string, input: {
|
|
140
|
+
documentIds?: string[];
|
|
141
|
+
paths?: string[];
|
|
142
|
+
epicIds?: string[];
|
|
143
|
+
title?: string;
|
|
144
|
+
runBreakdown?: boolean;
|
|
145
|
+
}): Promise<unknown>;
|
|
146
|
+
recommendTasks(workspaceId: string, options?: {
|
|
147
|
+
epicId?: string;
|
|
148
|
+
limit?: number;
|
|
149
|
+
}): Promise<TaskRecommendation[]>;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client for the Beck REST API
|
|
3
|
+
*/
|
|
4
|
+
export class BeckAPIClient {
|
|
5
|
+
baseUrl;
|
|
6
|
+
token;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
// Remove trailing slash from URL
|
|
9
|
+
this.baseUrl = config.apiUrl.replace(/\/$/, "");
|
|
10
|
+
this.token = config.apiToken;
|
|
11
|
+
}
|
|
12
|
+
async request(method, path, body, extraHeaders) {
|
|
13
|
+
const url = `${this.baseUrl}${path}`;
|
|
14
|
+
const response = await fetch(url, {
|
|
15
|
+
method,
|
|
16
|
+
headers: {
|
|
17
|
+
Authorization: `Bearer ${this.token}`,
|
|
18
|
+
"Content-Type": "application/json",
|
|
19
|
+
...extraHeaders,
|
|
20
|
+
},
|
|
21
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
22
|
+
});
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
const errorBody = await response.json().catch(() => ({
|
|
25
|
+
error: `HTTP ${response.status}: ${response.statusText}`,
|
|
26
|
+
}));
|
|
27
|
+
throw new Error(errorBody.error || `Request failed: ${response.status}`);
|
|
28
|
+
}
|
|
29
|
+
// Handle 204 No Content
|
|
30
|
+
if (response.status === 204) {
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
return response.json();
|
|
34
|
+
}
|
|
35
|
+
// ============ Workspaces ============
|
|
36
|
+
/**
|
|
37
|
+
* List all workspaces accessible by the authenticated user
|
|
38
|
+
*/
|
|
39
|
+
async listWorkspaces() {
|
|
40
|
+
const response = await this.request("GET", "/api/v1/workspaces");
|
|
41
|
+
return response.workspaces;
|
|
42
|
+
}
|
|
43
|
+
async createWorkspace(input) {
|
|
44
|
+
return this.request("POST", "/api/v1/workspaces", input);
|
|
45
|
+
}
|
|
46
|
+
// ============ Tasks ============
|
|
47
|
+
/**
|
|
48
|
+
* List tasks in a workspace
|
|
49
|
+
*/
|
|
50
|
+
async listTasks(workspaceId, options) {
|
|
51
|
+
const params = new URLSearchParams();
|
|
52
|
+
if (options?.status)
|
|
53
|
+
params.set("status", options.status);
|
|
54
|
+
if (options?.epicId)
|
|
55
|
+
params.set("epicId", options.epicId);
|
|
56
|
+
if (options?.assigneeId)
|
|
57
|
+
params.set("assigneeId", options.assigneeId);
|
|
58
|
+
if (options?.isIcebox)
|
|
59
|
+
params.set("isIcebox", "true");
|
|
60
|
+
const query = params.toString();
|
|
61
|
+
const path = `/api/v1/workspaces/${workspaceId}/tasks${query ? `?${query}` : ""}`;
|
|
62
|
+
const response = await this.request("GET", path);
|
|
63
|
+
return response.tasks;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get a single task by ID
|
|
67
|
+
*/
|
|
68
|
+
async getTask(taskId) {
|
|
69
|
+
const response = await this.request("GET", `/api/v1/tasks/${taskId}`);
|
|
70
|
+
return response.task;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Start working on a task
|
|
74
|
+
*/
|
|
75
|
+
async startTask(taskId) {
|
|
76
|
+
const response = await this.request("POST", `/api/v1/tasks/${taskId}/start`);
|
|
77
|
+
return response.task;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Submit a task for review
|
|
81
|
+
*/
|
|
82
|
+
async finishTask(taskId) {
|
|
83
|
+
const response = await this.request("POST", `/api/v1/tasks/${taskId}/finish`);
|
|
84
|
+
return response.task;
|
|
85
|
+
}
|
|
86
|
+
async acceptTask(taskId) {
|
|
87
|
+
const response = await this.request("POST", `/api/v1/tasks/${taskId}/accept`);
|
|
88
|
+
return response.task;
|
|
89
|
+
}
|
|
90
|
+
async rejectTask(taskId, reason) {
|
|
91
|
+
const response = await this.request("POST", `/api/v1/tasks/${taskId}/reject`, { reason });
|
|
92
|
+
return response.task;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Update a task
|
|
96
|
+
*/
|
|
97
|
+
async updateTask(taskId, updates) {
|
|
98
|
+
return this.request("PATCH", `/api/v1/tasks/${taskId}`, updates);
|
|
99
|
+
}
|
|
100
|
+
// ============ Comments ============
|
|
101
|
+
/**
|
|
102
|
+
* List comments on a task
|
|
103
|
+
*/
|
|
104
|
+
async listComments(taskId) {
|
|
105
|
+
const response = await this.request("GET", `/api/v1/tasks/${taskId}/comments`);
|
|
106
|
+
return response.comments;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Add a comment to a task
|
|
110
|
+
*/
|
|
111
|
+
async addComment(taskId, content) {
|
|
112
|
+
const response = await this.request("POST", `/api/v1/tasks/${taskId}/comments`, { content });
|
|
113
|
+
return response.id;
|
|
114
|
+
}
|
|
115
|
+
// ============ Task Context ============
|
|
116
|
+
/**
|
|
117
|
+
* Get rich context for a task (for starting work)
|
|
118
|
+
* Includes task details, epic with spec, related tasks, comments, and activity
|
|
119
|
+
*/
|
|
120
|
+
async getTaskContext(taskId) {
|
|
121
|
+
return this.request("GET", `/api/v1/tasks/${taskId}/context`);
|
|
122
|
+
}
|
|
123
|
+
// ============ Progress Updates ============
|
|
124
|
+
/**
|
|
125
|
+
* List progress updates for a task
|
|
126
|
+
*/
|
|
127
|
+
async listProgressUpdates(taskId) {
|
|
128
|
+
const response = await this.request("GET", `/api/v1/tasks/${taskId}/progress`);
|
|
129
|
+
return response.progressUpdates;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Log a structured progress update
|
|
133
|
+
*/
|
|
134
|
+
async logProgress(taskId, progress) {
|
|
135
|
+
const response = await this.request("POST", `/api/v1/tasks/${taskId}/progress`, progress);
|
|
136
|
+
return response.id;
|
|
137
|
+
}
|
|
138
|
+
// ============ Epic GitHub Integration ============
|
|
139
|
+
/**
|
|
140
|
+
* Link a GitHub branch or PR to an epic
|
|
141
|
+
*/
|
|
142
|
+
async linkEpicGithub(epicId, options) {
|
|
143
|
+
await this.request("PATCH", `/api/v1/epics/${epicId}/github`, options);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get GitHub info for an epic
|
|
147
|
+
*/
|
|
148
|
+
async getEpicGithub(epicId) {
|
|
149
|
+
return this.request("GET", `/api/v1/epics/${epicId}/github`);
|
|
150
|
+
}
|
|
151
|
+
async getMe() {
|
|
152
|
+
return this.request("GET", "/api/v1/me");
|
|
153
|
+
}
|
|
154
|
+
async getEpic(epicId) {
|
|
155
|
+
const response = await this.request("GET", `/api/v1/epics/${epicId}`);
|
|
156
|
+
return response.epic;
|
|
157
|
+
}
|
|
158
|
+
async deleteDocument(workspaceId, path, etag) {
|
|
159
|
+
if (!etag) {
|
|
160
|
+
throw new Error("etag is required to delete a document. Read the document first and pass its etag.");
|
|
161
|
+
}
|
|
162
|
+
const encoded = path.split("/").map(encodeURIComponent).join("/");
|
|
163
|
+
await this.request("DELETE", `/api/v1/workspaces/${workspaceId}/documents/${encoded}`, undefined, { "If-Match": etag });
|
|
164
|
+
}
|
|
165
|
+
async listDocumentVersions(workspaceId, path) {
|
|
166
|
+
const encoded = path.split("/").map(encodeURIComponent).join("/");
|
|
167
|
+
return this.request("GET", `/api/v1/workspaces/${workspaceId}/documents/${encoded}/versions`);
|
|
168
|
+
}
|
|
169
|
+
async restoreDocument(workspaceId, path, input) {
|
|
170
|
+
if (!input.etag) {
|
|
171
|
+
throw new Error("etag is required to restore a document. Read the document first and pass its etag.");
|
|
172
|
+
}
|
|
173
|
+
const encoded = path.split("/").map(encodeURIComponent).join("/");
|
|
174
|
+
const response = await this.request("POST", `/api/v1/workspaces/${workspaceId}/documents/${encoded}/restore`, { versionId: input.versionId }, { "If-Match": input.etag });
|
|
175
|
+
return response.document;
|
|
176
|
+
}
|
|
177
|
+
async listDocuments(workspaceId) {
|
|
178
|
+
const response = await this.request("GET", `/api/v1/workspaces/${workspaceId}/documents`);
|
|
179
|
+
return response.documents;
|
|
180
|
+
}
|
|
181
|
+
async getDocument(workspaceId, path) {
|
|
182
|
+
const encoded = path.split("/").map(encodeURIComponent).join("/");
|
|
183
|
+
const response = await this.request("GET", `/api/v1/workspaces/${workspaceId}/documents/${encoded}`);
|
|
184
|
+
return response.document;
|
|
185
|
+
}
|
|
186
|
+
async createDocument(workspaceId, input) {
|
|
187
|
+
const response = await this.request("POST", `/api/v1/workspaces/${workspaceId}/documents`, input);
|
|
188
|
+
return response.document;
|
|
189
|
+
}
|
|
190
|
+
async writeDocument(workspaceId, path, input) {
|
|
191
|
+
if (!input.etag) {
|
|
192
|
+
throw new Error("etag is required to write a document. Read the document first and pass its etag.");
|
|
193
|
+
}
|
|
194
|
+
const encoded = path.split("/").map(encodeURIComponent).join("/");
|
|
195
|
+
const response = await this.request("PUT", `/api/v1/workspaces/${workspaceId}/documents/${encoded}`, { title: input.title, body: input.body, path: input.path }, { "If-Match": input.etag });
|
|
196
|
+
return response.document;
|
|
197
|
+
}
|
|
198
|
+
async listEpics(workspaceId) {
|
|
199
|
+
const response = await this.request("GET", `/api/v1/workspaces/${workspaceId}/epics`);
|
|
200
|
+
return response.epics;
|
|
201
|
+
}
|
|
202
|
+
async planIt(workspaceId, input) {
|
|
203
|
+
return this.request("POST", `/api/v1/workspaces/${workspaceId}/plan`, input);
|
|
204
|
+
}
|
|
205
|
+
async recommendTasks(workspaceId, options) {
|
|
206
|
+
const params = new URLSearchParams();
|
|
207
|
+
if (options?.epicId)
|
|
208
|
+
params.set("epicId", options.epicId);
|
|
209
|
+
if (options?.limit)
|
|
210
|
+
params.set("limit", String(options.limit));
|
|
211
|
+
const query = params.toString();
|
|
212
|
+
const path = `/api/v1/workspaces/${workspaceId}/recommend${query ? `?${query}` : ""}`;
|
|
213
|
+
const response = await this.request("GET", path);
|
|
214
|
+
return response.recommendations;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { CallToolRequestSchema, ListResourceTemplatesRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import { BeckAPIClient } from "./client.js";
|
|
6
|
+
import { listResources, readResource, RESOURCE_TEMPLATES } from "./resources.js";
|
|
7
|
+
import { TOOLS, handleToolCall } from "./tools/index.js";
|
|
8
|
+
// Configuration from environment variables
|
|
9
|
+
const BECK_API_URL = process.env.BECK_API_URL || "https://beck.bot";
|
|
10
|
+
const BECK_API_TOKEN = process.env.BECK_API_TOKEN;
|
|
11
|
+
if (!BECK_API_TOKEN) {
|
|
12
|
+
console.error("Error: BECK_API_TOKEN environment variable is required");
|
|
13
|
+
console.error("");
|
|
14
|
+
console.error("To configure the Beck MCP server:");
|
|
15
|
+
console.error("1. Generate an API token in Beck (Settings > API Tokens)");
|
|
16
|
+
console.error("2. Set the environment variable:");
|
|
17
|
+
console.error(" export BECK_API_TOKEN=beck_your_token_here");
|
|
18
|
+
console.error("");
|
|
19
|
+
console.error("Optional: Set BECK_API_URL for self-hosted instances");
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
// Initialize the Beck API client
|
|
23
|
+
const beckClient = new BeckAPIClient({
|
|
24
|
+
apiUrl: BECK_API_URL,
|
|
25
|
+
apiToken: BECK_API_TOKEN,
|
|
26
|
+
});
|
|
27
|
+
// Create the MCP server
|
|
28
|
+
const server = new Server({
|
|
29
|
+
name: "beck-mcp",
|
|
30
|
+
version: "1.0.0",
|
|
31
|
+
}, {
|
|
32
|
+
capabilities: {
|
|
33
|
+
tools: {},
|
|
34
|
+
resources: {},
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
38
|
+
return { tools: TOOLS };
|
|
39
|
+
});
|
|
40
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
41
|
+
const { name, arguments: args } = request.params;
|
|
42
|
+
return handleToolCall(beckClient, name, args || {});
|
|
43
|
+
});
|
|
44
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
45
|
+
return { resources: await listResources(beckClient, BECK_API_URL) };
|
|
46
|
+
});
|
|
47
|
+
server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => {
|
|
48
|
+
return { resourceTemplates: RESOURCE_TEMPLATES };
|
|
49
|
+
});
|
|
50
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
51
|
+
const content = await readResource(beckClient, BECK_API_URL, request.params.uri);
|
|
52
|
+
return { contents: [content] };
|
|
53
|
+
});
|
|
54
|
+
async function main() {
|
|
55
|
+
const transport = new StdioServerTransport();
|
|
56
|
+
await server.connect(transport);
|
|
57
|
+
// Log startup info to stderr (not stdout, which is for MCP protocol)
|
|
58
|
+
console.error("Beck MCP Server started");
|
|
59
|
+
console.error(`API URL: ${BECK_API_URL}`);
|
|
60
|
+
console.error(`Token: ${BECK_API_TOKEN.substring(0, 12)}...`);
|
|
61
|
+
}
|
|
62
|
+
main().catch((error) => {
|
|
63
|
+
console.error("Fatal error:", error);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,kCAAkC,EAClC,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEzD,2CAA2C;AAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,kBAAkB,CAAC;AACpE,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAElD,IAAI,CAAC,cAAc,EAAE,CAAC;IACpB,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IACxE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClB,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACnD,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC1E,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAClD,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAC/D,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClB,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,GAAG,IAAI,aAAa,CAAC;IACnC,MAAM,EAAE,YAAY;IACpB,QAAQ,EAAE,cAAc;CACzB,CAAC,CAAC;AAEH,wBAAwB;AACxB,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;QACT,SAAS,EAAE,EAAE;KACd;CACF,CACF,CAAC;AAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IAC1D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IACjD,OAAO,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,iBAAiB,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;IAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,CAAC;AACtE,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,iBAAiB,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;IACtE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,iBAAiB,CAAC,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IACpE,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjF,OAAO,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;AACjC,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,qEAAqE;IACrE,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACzC,OAAO,CAAC,KAAK,CAAC,YAAY,YAAY,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,KAAK,CAAC,UAAU,cAAe,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Resource, ResourceTemplate } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import type { BeckAPIClient } from "./client.js";
|
|
3
|
+
export declare const SKILL_URI = "beck://skill.md";
|
|
4
|
+
export declare const LLMS_URI = "beck://llms.txt";
|
|
5
|
+
export declare const RESOURCE_TEMPLATES: ResourceTemplate[];
|
|
6
|
+
export declare function staticResources(origin: string): Resource[];
|
|
7
|
+
export declare function documentResourceUri(workspaceId: string, path: string): string;
|
|
8
|
+
export declare function parseDocumentResourceUri(uri: string): {
|
|
9
|
+
workspaceId: string;
|
|
10
|
+
path: string;
|
|
11
|
+
} | null;
|
|
12
|
+
export declare function listResources(client: BeckAPIClient, origin: string): Promise<Resource[]>;
|
|
13
|
+
export declare function readResource(client: BeckAPIClient, origin: string, uri: string): Promise<{
|
|
14
|
+
uri: string;
|
|
15
|
+
mimeType: string;
|
|
16
|
+
text: string;
|
|
17
|
+
}>;
|
|
18
|
+
//# sourceMappingURL=resources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,SAAS,oBAAoB,CAAC;AAC3C,eAAO,MAAM,QAAQ,oBAAoB,CAAC;AAE1C,eAAO,MAAM,kBAAkB,EAAE,gBAAgB,EAQhD,CAAC;AAEF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CAe1D;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,MAAM,GACV;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAO9C;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,EAAE,CAAC,CAmBrB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAkC1D"}
|