@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 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
@@ -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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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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":"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"}
@@ -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"}