@tickernelz/paperclip-pro-mcp-server 2026.925.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.
@@ -0,0 +1,340 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { PaperclipApiClient } from "./client.js";
3
+ import { createToolDefinitions } from "./tools.js";
4
+ function makeClient() {
5
+ return new PaperclipApiClient({
6
+ apiUrl: "http://localhost:3100/api",
7
+ apiKey: "token-123",
8
+ companyId: "11111111-1111-1111-1111-111111111111",
9
+ agentId: "22222222-2222-2222-2222-222222222222",
10
+ runId: "33333333-3333-3333-3333-333333333333",
11
+ });
12
+ }
13
+ function getTool(name) {
14
+ const tool = createToolDefinitions(makeClient()).find((candidate) => candidate.name === name);
15
+ if (!tool)
16
+ throw new Error(`Missing tool ${name}`);
17
+ return tool;
18
+ }
19
+ function mockJsonResponse(body, status = 200) {
20
+ return new Response(JSON.stringify(body), {
21
+ status,
22
+ headers: { "Content-Type": "application/json" },
23
+ });
24
+ }
25
+ describe("paperclip MCP tools", () => {
26
+ beforeEach(() => {
27
+ vi.restoreAllMocks();
28
+ });
29
+ it("adds auth headers and run id to mutating requests", async () => {
30
+ const fetchMock = vi.fn().mockResolvedValue(mockJsonResponse({ ok: true }));
31
+ vi.stubGlobal("fetch", fetchMock);
32
+ const tool = getTool("paperclipUpdateIssue");
33
+ await tool.execute({
34
+ issueId: "PAP-1135",
35
+ status: "done",
36
+ });
37
+ expect(fetchMock).toHaveBeenCalledTimes(1);
38
+ const [url, init] = fetchMock.mock.calls[0];
39
+ expect(String(url)).toBe("http://localhost:3100/api/issues/PAP-1135");
40
+ expect(init.method).toBe("PATCH");
41
+ expect(init.headers["Authorization"]).toBe("Bearer token-123");
42
+ expect(init.headers["X-Paperclip-Run-Id"]).toBe("33333333-3333-3333-3333-333333333333");
43
+ });
44
+ it("lists the company skill library with the default company id", async () => {
45
+ const fetchMock = vi.fn().mockResolvedValue(mockJsonResponse([{ key: "paperclipai/bundled/product/wireframe", name: "wireframe" }]));
46
+ vi.stubGlobal("fetch", fetchMock);
47
+ const tool = getTool("paperclipListSkills");
48
+ const response = await tool.execute({});
49
+ expect(fetchMock).toHaveBeenCalledTimes(1);
50
+ const [url] = fetchMock.mock.calls[0];
51
+ expect(String(url)).toBe("http://localhost:3100/api/companies/11111111-1111-1111-1111-111111111111/skills");
52
+ expect(response.content[0]?.text).toContain("wireframe");
53
+ });
54
+ it("uses default company id for company-scoped list tools", async () => {
55
+ const fetchMock = vi.fn().mockResolvedValue(mockJsonResponse([{ id: "issue-1" }]));
56
+ vi.stubGlobal("fetch", fetchMock);
57
+ const tool = getTool("paperclipListIssues");
58
+ const response = await tool.execute({});
59
+ expect(fetchMock).toHaveBeenCalledTimes(1);
60
+ const [url] = fetchMock.mock.calls[0];
61
+ expect(String(url)).toBe("http://localhost:3100/api/companies/11111111-1111-1111-1111-111111111111/issues");
62
+ expect(response.content[0]?.text).toContain("issue-1");
63
+ });
64
+ it("uses default agent id for checkout requests", async () => {
65
+ const fetchMock = vi.fn().mockResolvedValue(mockJsonResponse({ id: "PAP-1135", status: "in_progress" }));
66
+ vi.stubGlobal("fetch", fetchMock);
67
+ const tool = getTool("paperclipCheckoutIssue");
68
+ await tool.execute({
69
+ issueId: "PAP-1135",
70
+ });
71
+ const [, init] = fetchMock.mock.calls[0];
72
+ expect(JSON.parse(String(init.body))).toEqual({
73
+ agentId: "22222222-2222-2222-2222-222222222222",
74
+ expectedStatuses: ["todo", "backlog", "blocked"],
75
+ });
76
+ });
77
+ it("allows create issue requests to omit status so the API applies assignee defaults", async () => {
78
+ const fetchMock = vi.fn().mockResolvedValue(mockJsonResponse({ id: "issue-1", status: "todo" }));
79
+ vi.stubGlobal("fetch", fetchMock);
80
+ const tool = getTool("paperclipCreateIssue");
81
+ await tool.execute({
82
+ title: "Assigned follow-up",
83
+ assigneeAgentId: "22222222-2222-2222-2222-222222222222",
84
+ });
85
+ const [url, init] = fetchMock.mock.calls[0];
86
+ expect(String(url)).toBe("http://localhost:3100/api/companies/11111111-1111-1111-1111-111111111111/issues");
87
+ expect(init.method).toBe("POST");
88
+ expect(JSON.parse(String(init.body))).toEqual({
89
+ title: "Assigned follow-up",
90
+ workMode: "standard",
91
+ priority: "medium",
92
+ assigneeAgentId: "22222222-2222-2222-2222-222222222222",
93
+ requestDepth: 0,
94
+ });
95
+ });
96
+ it("defaults issue document format to markdown", async () => {
97
+ const fetchMock = vi.fn().mockResolvedValue(mockJsonResponse({ key: "plan", latestRevisionNumber: 2 }));
98
+ vi.stubGlobal("fetch", fetchMock);
99
+ const tool = getTool("paperclipUpsertIssueDocument");
100
+ await tool.execute({
101
+ issueId: "PAP-1135",
102
+ key: "plan",
103
+ body: "# Updated",
104
+ });
105
+ const [, init] = fetchMock.mock.calls[0];
106
+ expect(JSON.parse(String(init.body))).toEqual({
107
+ format: "markdown",
108
+ body: "# Updated",
109
+ });
110
+ });
111
+ it("controls issue workspace services through the current execution workspace", async () => {
112
+ const fetchMock = vi.fn()
113
+ .mockResolvedValueOnce(mockJsonResponse({
114
+ currentExecutionWorkspace: {
115
+ id: "44444444-4444-4444-8444-444444444444",
116
+ runtimeServices: [],
117
+ },
118
+ }))
119
+ .mockResolvedValueOnce(mockJsonResponse({
120
+ operation: { id: "operation-1" },
121
+ workspace: {
122
+ id: "44444444-4444-4444-8444-444444444444",
123
+ runtimeServices: [
124
+ {
125
+ id: "55555555-5555-4555-8555-555555555555",
126
+ serviceName: "web",
127
+ status: "running",
128
+ url: "http://127.0.0.1:5173",
129
+ },
130
+ ],
131
+ },
132
+ }));
133
+ vi.stubGlobal("fetch", fetchMock);
134
+ const tool = getTool("paperclipControlIssueWorkspaceServices");
135
+ await tool.execute({
136
+ issueId: "PAP-1135",
137
+ action: "restart",
138
+ workspaceCommandId: "web",
139
+ });
140
+ expect(fetchMock).toHaveBeenCalledTimes(2);
141
+ const [lookupUrl, lookupInit] = fetchMock.mock.calls[0];
142
+ expect(String(lookupUrl)).toBe("http://localhost:3100/api/issues/PAP-1135/heartbeat-context");
143
+ expect(lookupInit.method).toBe("GET");
144
+ const [controlUrl, controlInit] = fetchMock.mock.calls[1];
145
+ expect(String(controlUrl)).toBe("http://localhost:3100/api/execution-workspaces/44444444-4444-4444-8444-444444444444/runtime-services/restart");
146
+ expect(controlInit.method).toBe("POST");
147
+ expect(JSON.parse(String(controlInit.body))).toEqual({
148
+ workspaceCommandId: "web",
149
+ });
150
+ });
151
+ it("waits for an issue workspace runtime service URL", async () => {
152
+ const fetchMock = vi.fn()
153
+ .mockResolvedValueOnce(mockJsonResponse({
154
+ currentExecutionWorkspace: {
155
+ id: "44444444-4444-4444-8444-444444444444",
156
+ runtimeServices: [
157
+ {
158
+ id: "55555555-5555-4555-8555-555555555555",
159
+ serviceName: "web",
160
+ status: "running",
161
+ healthStatus: "healthy",
162
+ url: "http://127.0.0.1:5173",
163
+ },
164
+ ],
165
+ },
166
+ }));
167
+ vi.stubGlobal("fetch", fetchMock);
168
+ const tool = getTool("paperclipWaitForIssueWorkspaceService");
169
+ const response = await tool.execute({
170
+ issueId: "PAP-1135",
171
+ serviceName: "web",
172
+ timeoutSeconds: 1,
173
+ });
174
+ expect(fetchMock).toHaveBeenCalledTimes(1);
175
+ expect(response.content[0]?.text).toContain("http://127.0.0.1:5173");
176
+ });
177
+ it("creates suggest_tasks interactions with the expected issue-scoped payload", async () => {
178
+ const fetchMock = vi.fn().mockResolvedValue(mockJsonResponse({ id: "interaction-1", kind: "suggest_tasks" }));
179
+ vi.stubGlobal("fetch", fetchMock);
180
+ const tool = getTool("paperclipSuggestTasks");
181
+ await tool.execute({
182
+ issueId: "PAP-1135",
183
+ idempotencyKey: "run-1:suggest",
184
+ payload: {
185
+ version: 1,
186
+ tasks: [{ clientKey: "task-1", title: "One" }],
187
+ },
188
+ });
189
+ const [url, init] = fetchMock.mock.calls[0];
190
+ expect(String(url)).toBe("http://localhost:3100/api/issues/PAP-1135/interactions");
191
+ expect(init.method).toBe("POST");
192
+ expect(JSON.parse(String(init.body))).toEqual({
193
+ kind: "suggest_tasks",
194
+ continuationPolicy: "wake_assignee",
195
+ idempotencyKey: "run-1:suggest",
196
+ payload: {
197
+ version: 1,
198
+ tasks: [{ clientKey: "task-1", title: "One" }],
199
+ },
200
+ });
201
+ });
202
+ it("creates request_confirmation interactions with plan target payloads", async () => {
203
+ const fetchMock = vi.fn().mockResolvedValue(mockJsonResponse({ id: "interaction-1", kind: "request_confirmation" }));
204
+ vi.stubGlobal("fetch", fetchMock);
205
+ const tool = getTool("paperclipRequestConfirmation");
206
+ await tool.execute({
207
+ issueId: "PAP-1135",
208
+ idempotencyKey: "confirmation:PAP-1135:plan:33333333-3333-4333-8333-333333333333",
209
+ title: "Plan approval",
210
+ payload: {
211
+ version: 1,
212
+ prompt: "Accept this plan?",
213
+ acceptLabel: "Accept plan",
214
+ allowDeclineReason: true,
215
+ rejectLabel: "Request changes",
216
+ rejectRequiresReason: true,
217
+ supersedeOnUserComment: true,
218
+ target: {
219
+ type: "issue_document",
220
+ key: "plan",
221
+ revisionId: "33333333-3333-4333-8333-333333333333",
222
+ revisionNumber: 3,
223
+ },
224
+ },
225
+ });
226
+ const [url, init] = fetchMock.mock.calls[0];
227
+ expect(String(url)).toBe("http://localhost:3100/api/issues/PAP-1135/interactions");
228
+ expect(init.method).toBe("POST");
229
+ expect(JSON.parse(String(init.body))).toEqual({
230
+ kind: "request_confirmation",
231
+ continuationPolicy: "none",
232
+ idempotencyKey: "confirmation:PAP-1135:plan:33333333-3333-4333-8333-333333333333",
233
+ title: "Plan approval",
234
+ payload: {
235
+ version: 1,
236
+ prompt: "Accept this plan?",
237
+ acceptLabel: "Accept plan",
238
+ allowDeclineReason: true,
239
+ rejectLabel: "Request changes",
240
+ rejectRequiresReason: true,
241
+ supersedeOnUserComment: true,
242
+ target: {
243
+ type: "issue_document",
244
+ key: "plan",
245
+ revisionId: "33333333-3333-4333-8333-333333333333",
246
+ revisionNumber: 3,
247
+ },
248
+ },
249
+ });
250
+ });
251
+ it("creates request_checkbox_confirmation interactions with checkbox payloads", async () => {
252
+ const fetchMock = vi.fn().mockResolvedValue(mockJsonResponse({ id: "interaction-1", kind: "request_checkbox_confirmation" }));
253
+ vi.stubGlobal("fetch", fetchMock);
254
+ const tool = getTool("paperclipRequestCheckboxConfirmation");
255
+ await tool.execute({
256
+ issueId: "PAP-1135",
257
+ idempotencyKey: "confirmation:PAP-1135:files",
258
+ title: "Choose files",
259
+ payload: {
260
+ version: 1,
261
+ prompt: "Which files should be included?",
262
+ detailsMarkdown: "Pick the files to attach.",
263
+ options: [
264
+ { id: "file-a", label: "File A", description: "Primary draft" },
265
+ { id: "file-b", label: "File B" },
266
+ ],
267
+ defaultSelectedOptionIds: ["file-a"],
268
+ minSelected: 1,
269
+ maxSelected: 2,
270
+ acceptLabel: "Use selected files",
271
+ rejectLabel: "Do not attach files",
272
+ rejectRequiresReason: true,
273
+ allowDeclineReason: false,
274
+ },
275
+ });
276
+ const [url, init] = fetchMock.mock.calls[0];
277
+ expect(String(url)).toBe("http://localhost:3100/api/issues/PAP-1135/interactions");
278
+ expect(init.method).toBe("POST");
279
+ expect(JSON.parse(String(init.body))).toEqual({
280
+ kind: "request_checkbox_confirmation",
281
+ continuationPolicy: "wake_assignee",
282
+ idempotencyKey: "confirmation:PAP-1135:files",
283
+ title: "Choose files",
284
+ payload: {
285
+ version: 1,
286
+ prompt: "Which files should be included?",
287
+ detailsMarkdown: "Pick the files to attach.",
288
+ options: [
289
+ { id: "file-a", label: "File A", description: "Primary draft" },
290
+ { id: "file-b", label: "File B" },
291
+ ],
292
+ defaultSelectedOptionIds: ["file-a"],
293
+ minSelected: 1,
294
+ maxSelected: 2,
295
+ acceptLabel: "Use selected files",
296
+ rejectLabel: "Do not attach files",
297
+ rejectRequiresReason: true,
298
+ allowDeclineReason: false,
299
+ },
300
+ });
301
+ });
302
+ it("creates approvals with the expected company-scoped payload", async () => {
303
+ const fetchMock = vi.fn().mockResolvedValue(mockJsonResponse({ id: "approval-1" }));
304
+ vi.stubGlobal("fetch", fetchMock);
305
+ const tool = getTool("paperclipCreateApproval");
306
+ await tool.execute({
307
+ type: "hire_agent",
308
+ payload: { branch: "pap-1167" },
309
+ issueIds: ["44444444-4444-4444-4444-444444444444"],
310
+ });
311
+ expect(fetchMock).toHaveBeenCalledTimes(1);
312
+ const [url, init] = fetchMock.mock.calls[0];
313
+ expect(String(url)).toBe("http://localhost:3100/api/companies/11111111-1111-1111-1111-111111111111/approvals");
314
+ expect(init.method).toBe("POST");
315
+ expect(JSON.parse(String(init.body))).toEqual({
316
+ type: "hire_agent",
317
+ payload: { branch: "pap-1167" },
318
+ issueIds: ["44444444-4444-4444-4444-444444444444"],
319
+ });
320
+ });
321
+ it("rejects invalid generic request paths", async () => {
322
+ vi.stubGlobal("fetch", vi.fn());
323
+ const tool = getTool("paperclipApiRequest");
324
+ const response = await tool.execute({
325
+ method: "GET",
326
+ path: "issues",
327
+ });
328
+ expect(response.content[0]?.text).toContain("path must start with /");
329
+ });
330
+ it("rejects generic request paths that escape /api", async () => {
331
+ vi.stubGlobal("fetch", vi.fn());
332
+ const tool = getTool("paperclipApiRequest");
333
+ const response = await tool.execute({
334
+ method: "GET",
335
+ path: "/../../secret",
336
+ });
337
+ expect(response.content[0]?.text).toContain("must not contain '..'");
338
+ });
339
+ });
340
+ //# sourceMappingURL=tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../src/tools.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@tickernelz/paperclip-pro-mcp-server",
3
+ "version": "2026.925.0",
4
+ "license": "MIT",
5
+ "homepage": "https://github.com/tickernelz/paperclip-pro",
6
+ "bugs": {
7
+ "url": "https://github.com/tickernelz/paperclip-pro/issues"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/tickernelz/paperclip-pro",
12
+ "directory": "packages/mcp-server"
13
+ },
14
+ "type": "module",
15
+ "bin": {
16
+ "paperclip-mcp-server": "./dist/stdio.js"
17
+ },
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "import": "./dist/index.js"
22
+ }
23
+ },
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "files": [
28
+ "dist",
29
+ "README.md"
30
+ ],
31
+ "dependencies": {
32
+ "@modelcontextprotocol/sdk": "^1.30.0",
33
+ "@tickernelz/paperclip-pro-shared": "2026.925.0",
34
+ "zod": "^4.4.3"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^24.0.0",
38
+ "typescript": "^7.0.2",
39
+ "vitest": "^4.1.11"
40
+ },
41
+ "engines": {
42
+ "node": ">=24.11.0"
43
+ },
44
+ "scripts": {
45
+ "build": "tsc",
46
+ "clean": "rm -rf dist",
47
+ "typecheck": "tsc --noEmit",
48
+ "test": "vitest run"
49
+ },
50
+ "main": "./dist/index.js",
51
+ "types": "./dist/index.d.ts"
52
+ }