@ajensen32/paperclip-mcp-api 0.1.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,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,232 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { z } from "zod";
5
+ // ── Environment ──────────────────────────────────────────────────────────────
6
+ // These are automatically inherited from the Paperclip agent's process environment.
7
+ // No manual configuration needed — buildPaperclipEnv() sets them for every agent.
8
+ const API_URL = process.env.PAPERCLIP_API_URL ?? "http://localhost:3100";
9
+ const API_KEY = process.env.PAPERCLIP_API_KEY ?? "";
10
+ const COMPANY_ID = process.env.PAPERCLIP_COMPANY_ID ?? "";
11
+ const RUN_ID = process.env.PAPERCLIP_RUN_ID ?? "";
12
+ // ── HTTP Client ──────────────────────────────────────────────────────────────
13
+ async function api(method, path, body) {
14
+ const headers = {
15
+ "Content-Type": "application/json",
16
+ };
17
+ if (API_KEY)
18
+ headers["Authorization"] = `Bearer ${API_KEY}`;
19
+ if (RUN_ID)
20
+ headers["x-paperclip-run-id"] = RUN_ID;
21
+ const url = `${API_URL}${path}`;
22
+ const res = await fetch(url, {
23
+ method,
24
+ headers,
25
+ body: body ? JSON.stringify(body) : undefined,
26
+ });
27
+ const text = await res.text();
28
+ let data;
29
+ try {
30
+ data = JSON.parse(text);
31
+ }
32
+ catch {
33
+ data = text;
34
+ }
35
+ return { status: res.status, data };
36
+ }
37
+ function formatResult(res) {
38
+ if (res.status >= 400) {
39
+ return `Error ${res.status}: ${typeof res.data === "string" ? res.data : JSON.stringify(res.data, null, 2)}`;
40
+ }
41
+ return typeof res.data === "string" ? res.data : JSON.stringify(res.data, null, 2);
42
+ }
43
+ // ── MCP Server ───────────────────────────────────────────────────────────────
44
+ const server = new McpServer({
45
+ name: "paperclip-api",
46
+ version: "0.1.0",
47
+ });
48
+ // ── Tool: list_agents ────────────────────────────────────────────────────────
49
+ server.tool("list_agents", "List all agents in the company. Returns agent IDs, names, roles, titles, and statuses. Use this to find agent IDs for issue assignment.", {}, async () => {
50
+ const res = await api("GET", `/api/companies/${COMPANY_ID}/agents`);
51
+ if (res.status >= 400)
52
+ return { content: [{ type: "text", text: formatResult(res) }] };
53
+ const agents = res.data;
54
+ const summary = agents.map((a) => ({
55
+ id: a.id,
56
+ name: a.name,
57
+ role: a.role,
58
+ title: a.title,
59
+ status: a.status,
60
+ reportsTo: a.reportsTo,
61
+ }));
62
+ return { content: [{ type: "text", text: JSON.stringify(summary, null, 2) }] };
63
+ });
64
+ // ── Tool: get_agent ──────────────────────────────────────────────────────────
65
+ server.tool("get_agent", "Get details of a specific agent by ID. Returns full agent configuration including role, status, and chain of command.", { agent_id: z.string().describe("The agent's UUID") }, async ({ agent_id }) => {
66
+ const res = await api("GET", `/api/agents/${agent_id}`);
67
+ return { content: [{ type: "text", text: formatResult(res) }] };
68
+ });
69
+ // ── Tool: get_my_agent ───────────────────────────────────────────────────────
70
+ server.tool("get_my_agent", "Get details about yourself — the currently running agent. Returns your ID, name, role, company ID, and configuration.", {}, async () => {
71
+ const res = await api("GET", `/api/agents/me`);
72
+ return { content: [{ type: "text", text: formatResult(res) }] };
73
+ });
74
+ // ── Tool: create_issue ───────────────────────────────────────────────────────
75
+ server.tool("create_issue", `Create a new issue (task) and optionally assign it to an agent. Setting status to "todo" with an assigneeAgentId will AUTO-WAKE the assigned agent. Use parentId to create sub-issues for task decomposition.`, {
76
+ title: z.string().describe("Issue title — be descriptive"),
77
+ description: z.string().optional().describe("Detailed description with all context the assignee needs"),
78
+ status: z
79
+ .enum(["backlog", "todo", "in_progress", "in_review", "done", "cancelled"])
80
+ .optional()
81
+ .default("todo")
82
+ .describe('Issue status. Use "todo" to auto-wake the assigned agent. Default: "todo"'),
83
+ priority: z
84
+ .enum(["critical", "high", "medium", "low"])
85
+ .optional()
86
+ .default("medium")
87
+ .describe("Issue priority. Default: medium"),
88
+ assignee_agent_id: z.string().optional().describe("UUID of the agent to assign. Use list_agents to find IDs."),
89
+ parent_id: z.string().optional().describe("UUID of the parent issue — creates a sub-issue for task decomposition"),
90
+ }, async ({ title, description, status, priority, assignee_agent_id, parent_id }) => {
91
+ const body = { title, status, priority };
92
+ if (description)
93
+ body.description = description;
94
+ if (assignee_agent_id)
95
+ body.assigneeAgentId = assignee_agent_id;
96
+ if (parent_id)
97
+ body.parentId = parent_id;
98
+ const res = await api("POST", `/api/companies/${COMPANY_ID}/issues`, body);
99
+ if (res.status >= 400)
100
+ return { content: [{ type: "text", text: formatResult(res) }] };
101
+ const issue = res.data;
102
+ return {
103
+ content: [
104
+ {
105
+ type: "text",
106
+ text: `Issue created: ${issue.identifier} (${issue.id})\nTitle: ${issue.title}\nStatus: ${issue.status}\nAssignee: ${issue.assigneeAgentId ?? "unassigned"}${parent_id ? `\nParent: ${parent_id}` : ""}`,
107
+ },
108
+ ],
109
+ };
110
+ });
111
+ // ── Tool: update_issue ───────────────────────────────────────────────────────
112
+ server.tool("update_issue", "Update an existing issue. Can change status, assignee, title, description, or priority. Changing assignee with non-backlog status will auto-wake the new assignee.", {
113
+ issue_id: z.string().describe("UUID or identifier (e.g. PAP-39) of the issue to update"),
114
+ title: z.string().optional().describe("New title"),
115
+ description: z.string().optional().describe("New description"),
116
+ status: z
117
+ .enum(["backlog", "todo", "in_progress", "in_review", "done", "cancelled"])
118
+ .optional()
119
+ .describe("New status"),
120
+ priority: z.enum(["critical", "high", "medium", "low"]).optional().describe("New priority"),
121
+ assignee_agent_id: z.string().optional().describe("UUID of the agent to reassign to"),
122
+ }, async ({ issue_id, title, description, status, priority, assignee_agent_id }) => {
123
+ const body = {};
124
+ if (title !== undefined)
125
+ body.title = title;
126
+ if (description !== undefined)
127
+ body.description = description;
128
+ if (status !== undefined)
129
+ body.status = status;
130
+ if (priority !== undefined)
131
+ body.priority = priority;
132
+ if (assignee_agent_id !== undefined)
133
+ body.assigneeAgentId = assignee_agent_id;
134
+ const res = await api("PATCH", `/api/issues/${issue_id}`, body);
135
+ if (res.status >= 400)
136
+ return { content: [{ type: "text", text: formatResult(res) }] };
137
+ const issue = res.data;
138
+ return {
139
+ content: [
140
+ {
141
+ type: "text",
142
+ text: `Issue updated: ${issue.identifier}\nStatus: ${issue.status}\nAssignee: ${issue.assigneeAgentId ?? "unassigned"}`,
143
+ },
144
+ ],
145
+ };
146
+ });
147
+ // ── Tool: get_issue ──────────────────────────────────────────────────────────
148
+ server.tool("get_issue", "Get full details of an issue including title, description, status, priority, assignee, parent, ancestors, and project context.", {
149
+ issue_id: z.string().describe("UUID or identifier (e.g. PAP-39) of the issue"),
150
+ }, async ({ issue_id }) => {
151
+ const res = await api("GET", `/api/issues/${issue_id}`);
152
+ return { content: [{ type: "text", text: formatResult(res) }] };
153
+ });
154
+ // ── Tool: list_issues ────────────────────────────────────────────────────────
155
+ server.tool("list_issues", "List issues in the company. Filter by status, assignee, or parent. Use this to monitor sub-agent progress by listing child issues of your parent issue.", {
156
+ status: z
157
+ .string()
158
+ .optional()
159
+ .describe('Comma-separated statuses to filter: "todo,in_progress" or "done"'),
160
+ assignee_agent_id: z.string().optional().describe("Filter by assigned agent UUID"),
161
+ parent_id: z.string().optional().describe("Filter by parent issue UUID — lists sub-issues"),
162
+ }, async ({ status, assignee_agent_id, parent_id }) => {
163
+ const params = new URLSearchParams();
164
+ if (status)
165
+ params.set("status", status);
166
+ if (assignee_agent_id)
167
+ params.set("assigneeAgentId", assignee_agent_id);
168
+ if (parent_id)
169
+ params.set("parentId", parent_id);
170
+ const query = params.toString() ? `?${params.toString()}` : "";
171
+ const res = await api("GET", `/api/companies/${COMPANY_ID}/issues${query}`);
172
+ if (res.status >= 400)
173
+ return { content: [{ type: "text", text: formatResult(res) }] };
174
+ const issues = res.data;
175
+ const summary = issues.map((i) => ({
176
+ id: i.id,
177
+ identifier: i.identifier,
178
+ title: i.title,
179
+ status: i.status,
180
+ priority: i.priority,
181
+ assigneeAgentId: i.assigneeAgentId,
182
+ parentId: i.parentId,
183
+ updatedAt: i.updatedAt,
184
+ }));
185
+ return { content: [{ type: "text", text: JSON.stringify(summary, null, 2) }] };
186
+ });
187
+ // ── Tool: add_issue_comment ──────────────────────────────────────────────────
188
+ server.tool("add_issue_comment", "Add a comment to an issue. Use this to post deliverables, status updates, questions, or results. Comments are visible to the issue creator, assignee, and the CEO in the UI.", {
189
+ issue_id: z.string().describe("UUID or identifier (e.g. PAP-39) of the issue"),
190
+ body: z.string().describe("Comment content — supports markdown"),
191
+ }, async ({ issue_id, body }) => {
192
+ const res = await api("POST", `/api/issues/${issue_id}/comments`, { body });
193
+ if (res.status >= 400)
194
+ return { content: [{ type: "text", text: formatResult(res) }] };
195
+ return { content: [{ type: "text", text: `Comment added to ${issue_id}` }] };
196
+ });
197
+ // ── Tool: get_issue_comments ─────────────────────────────────────────────────
198
+ server.tool("get_issue_comments", "List comments on an issue. Use this to read deliverables or status updates posted by sub-agents, or feedback from the CEO.", {
199
+ issue_id: z.string().describe("UUID or identifier (e.g. PAP-39) of the issue"),
200
+ order: z.enum(["asc", "desc"]).optional().default("asc").describe("Comment order. Default: asc (oldest first)"),
201
+ }, async ({ issue_id, order }) => {
202
+ const params = new URLSearchParams({ order: order ?? "asc" });
203
+ const res = await api("GET", `/api/issues/${issue_id}/comments?${params.toString()}`);
204
+ if (res.status >= 400)
205
+ return { content: [{ type: "text", text: formatResult(res) }] };
206
+ const comments = res.data;
207
+ if (comments.length === 0) {
208
+ return { content: [{ type: "text", text: "No comments on this issue." }] };
209
+ }
210
+ const formatted = comments
211
+ .map((c) => {
212
+ const author = c.createdByAgentId ? `Agent ${c.createdByAgentId}` : c.createdByUserId ? `User ${c.createdByUserId}` : "System";
213
+ return `--- ${author} (${c.createdAt}) ---\n${c.body}`;
214
+ })
215
+ .join("\n\n");
216
+ return { content: [{ type: "text", text: formatted }] };
217
+ });
218
+ // ── Tool: get_my_inbox ───────────────────────────────────────────────────────
219
+ server.tool("get_my_inbox", "Get your current inbox — issues assigned to you that need attention (todo, in_progress, or blocked).", {}, async () => {
220
+ const res = await api("GET", `/api/agents/me/inbox-lite`);
221
+ return { content: [{ type: "text", text: formatResult(res) }] };
222
+ });
223
+ // ── Start Server ─────────────────────────────────────────────────────────────
224
+ async function main() {
225
+ const transport = new StdioServerTransport();
226
+ await server.connect(transport);
227
+ }
228
+ main().catch((err) => {
229
+ console.error("Failed to start paperclip-api MCP server:", err);
230
+ process.exit(1);
231
+ });
232
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@ajensen32/paperclip-mcp-api",
3
+ "version": "0.1.0",
4
+ "description": "MCP server that exposes Paperclip issue and agent management as tools for AI agents",
5
+ "type": "module",
6
+ "bin": {
7
+ "paperclip-mcp-api": "./dist/index.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsc --watch",
13
+ "start": "node dist/index.js"
14
+ },
15
+ "dependencies": {
16
+ "@modelcontextprotocol/sdk": "^1.12.1"
17
+ },
18
+ "devDependencies": {
19
+ "typescript": "^5.7.3",
20
+ "@types/node": "^22.10.7"
21
+ },
22
+ "files": [
23
+ "dist"
24
+ ],
25
+ "engines": {
26
+ "node": ">=18"
27
+ },
28
+ "license": "MIT"
29
+ }