paperclip-mcp 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 +703 -0
- package/dist/auth.d.ts +9 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +17 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +17 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +94 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +7 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/activity.d.ts +3 -0
- package/dist/tools/activity.d.ts.map +1 -0
- package/dist/tools/activity.js +106 -0
- package/dist/tools/activity.js.map +1 -0
- package/dist/tools/agents.d.ts +3 -0
- package/dist/tools/agents.d.ts.map +1 -0
- package/dist/tools/agents.js +373 -0
- package/dist/tools/agents.js.map +1 -0
- package/dist/tools/approvals.d.ts +3 -0
- package/dist/tools/approvals.d.ts.map +1 -0
- package/dist/tools/approvals.js +306 -0
- package/dist/tools/approvals.js.map +1 -0
- package/dist/tools/attachments.d.ts +3 -0
- package/dist/tools/attachments.d.ts.map +1 -0
- package/dist/tools/attachments.js +125 -0
- package/dist/tools/attachments.js.map +1 -0
- package/dist/tools/comments.d.ts +3 -0
- package/dist/tools/comments.d.ts.map +1 -0
- package/dist/tools/comments.js +75 -0
- package/dist/tools/comments.js.map +1 -0
- package/dist/tools/dashboard.d.ts +3 -0
- package/dist/tools/dashboard.d.ts.map +1 -0
- package/dist/tools/dashboard.js +24 -0
- package/dist/tools/dashboard.js.map +1 -0
- package/dist/tools/documents.d.ts +3 -0
- package/dist/tools/documents.d.ts.map +1 -0
- package/dist/tools/documents.js +150 -0
- package/dist/tools/documents.js.map +1 -0
- package/dist/tools/goals.d.ts +3 -0
- package/dist/tools/goals.d.ts.map +1 -0
- package/dist/tools/goals.js +128 -0
- package/dist/tools/goals.js.map +1 -0
- package/dist/tools/identity.d.ts +3 -0
- package/dist/tools/identity.d.ts.map +1 -0
- package/dist/tools/identity.js +44 -0
- package/dist/tools/identity.js.map +1 -0
- package/dist/tools/index.d.ts +25 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +49 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/issues.d.ts +3 -0
- package/dist/tools/issues.d.ts.map +1 -0
- package/dist/tools/issues.js +297 -0
- package/dist/tools/issues.js.map +1 -0
- package/dist/tools/projects.d.ts +3 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +233 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/routines.d.ts +3 -0
- package/dist/tools/routines.d.ts.map +1 -0
- package/dist/tools/routines.js +305 -0
- package/dist/tools/routines.js.map +1 -0
- package/dist/tools/validation.d.ts +24 -0
- package/dist/tools/validation.d.ts.map +1 -0
- package/dist/tools/validation.js +33 -0
- package/dist/tools/validation.js.map +1 -0
- package/dist/types.d.ts +36 -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 +61 -0
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { validate, handleApiError } from "./validation.js";
|
|
3
|
+
const ApprovalIdInput = z.object({
|
|
4
|
+
approvalId: z.string().min(1).describe("Approval UUID"),
|
|
5
|
+
});
|
|
6
|
+
const ListApprovalsInput = z.object({
|
|
7
|
+
status: z.string().optional().describe("Filter by status (e.g. 'pending,approved')"),
|
|
8
|
+
});
|
|
9
|
+
const CreateApprovalInput = z.object({
|
|
10
|
+
title: z.string().min(1).describe("Approval request title"),
|
|
11
|
+
description: z.string().optional().describe("Description / justification (markdown)"),
|
|
12
|
+
linkedIssueIds: z.array(z.string()).optional().describe("Issue UUIDs to link to this approval"),
|
|
13
|
+
});
|
|
14
|
+
const ApprovalCommentInput = z.object({
|
|
15
|
+
approvalId: z.string().min(1).describe("Approval UUID"),
|
|
16
|
+
body: z.string().min(1).describe("Comment body (markdown)"),
|
|
17
|
+
});
|
|
18
|
+
const RejectInput = z.object({
|
|
19
|
+
approvalId: z.string().min(1).describe("Approval UUID"),
|
|
20
|
+
reason: z.string().optional().describe("Reason for rejection"),
|
|
21
|
+
});
|
|
22
|
+
const RequestRevisionInput = z.object({
|
|
23
|
+
approvalId: z.string().min(1).describe("Approval UUID"),
|
|
24
|
+
feedback: z.string().optional().describe("Feedback on what needs to change"),
|
|
25
|
+
});
|
|
26
|
+
const ResubmitInput = z.object({
|
|
27
|
+
approvalId: z.string().min(1).describe("Approval UUID"),
|
|
28
|
+
comment: z.string().optional().describe("Summary of changes made"),
|
|
29
|
+
});
|
|
30
|
+
const CreateAgentHireInput = z.object({
|
|
31
|
+
name: z.string().min(1).describe("Agent display name"),
|
|
32
|
+
role: z.string().min(1).describe("Agent role (e.g. engineer, cto)"),
|
|
33
|
+
title: z.string().optional().describe("Job title"),
|
|
34
|
+
capabilities: z.string().optional().describe("Free-text capability description"),
|
|
35
|
+
goalId: z.string().optional().describe("Goal UUID to link the hire to"),
|
|
36
|
+
projectId: z.string().optional().describe("Project UUID to associate"),
|
|
37
|
+
});
|
|
38
|
+
export const approvalTools = [
|
|
39
|
+
{
|
|
40
|
+
name: "paperclip_list_approvals",
|
|
41
|
+
description: "List approval requests for the current company. Optionally filter by status (comma-separated).",
|
|
42
|
+
inputSchema: {
|
|
43
|
+
type: "object",
|
|
44
|
+
properties: {
|
|
45
|
+
status: {
|
|
46
|
+
type: "string",
|
|
47
|
+
description: "Comma-separated status values (e.g. 'pending,approved')",
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
required: [],
|
|
51
|
+
},
|
|
52
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
53
|
+
async handler(args, client) {
|
|
54
|
+
try {
|
|
55
|
+
const input = validate(ListApprovalsInput, args);
|
|
56
|
+
const params = new URLSearchParams();
|
|
57
|
+
if (input.status)
|
|
58
|
+
params.set("status", input.status);
|
|
59
|
+
const qs = params.toString();
|
|
60
|
+
const path = `/api/companies/${client.companyId}/approvals${qs ? `?${qs}` : ""}`;
|
|
61
|
+
const data = await client.get(path);
|
|
62
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
return handleApiError(err);
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: "paperclip_get_approval",
|
|
71
|
+
description: "Get a single approval request by ID, including its status and linked issues.",
|
|
72
|
+
inputSchema: {
|
|
73
|
+
type: "object",
|
|
74
|
+
properties: {
|
|
75
|
+
approvalId: { type: "string", description: "Approval UUID" },
|
|
76
|
+
},
|
|
77
|
+
required: ["approvalId"],
|
|
78
|
+
},
|
|
79
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
80
|
+
async handler(args, client) {
|
|
81
|
+
try {
|
|
82
|
+
const { approvalId } = validate(ApprovalIdInput, args);
|
|
83
|
+
const data = await client.get(`/api/approvals/${approvalId}`);
|
|
84
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
return handleApiError(err);
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: "paperclip_create_approval",
|
|
93
|
+
description: "Create a new approval request. Run ID header is injected automatically.",
|
|
94
|
+
inputSchema: {
|
|
95
|
+
type: "object",
|
|
96
|
+
properties: {
|
|
97
|
+
title: { type: "string", description: "Approval request title" },
|
|
98
|
+
description: { type: "string", description: "Description / justification (markdown)" },
|
|
99
|
+
linkedIssueIds: {
|
|
100
|
+
type: "array",
|
|
101
|
+
items: { type: "string" },
|
|
102
|
+
description: "Issue UUIDs to link to this approval",
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
required: ["title"],
|
|
106
|
+
},
|
|
107
|
+
annotations: { destructiveHint: false, openWorldHint: false },
|
|
108
|
+
async handler(args, client) {
|
|
109
|
+
try {
|
|
110
|
+
const input = validate(CreateApprovalInput, args);
|
|
111
|
+
const body = { title: input.title };
|
|
112
|
+
if (input.description !== undefined)
|
|
113
|
+
body.description = input.description;
|
|
114
|
+
if (input.linkedIssueIds !== undefined)
|
|
115
|
+
body.linkedIssueIds = input.linkedIssueIds;
|
|
116
|
+
const data = await client.post(`/api/companies/${client.companyId}/approvals`, body);
|
|
117
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
return handleApiError(err);
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: "paperclip_approve",
|
|
126
|
+
description: "Approve an approval request. Run ID header is injected automatically.",
|
|
127
|
+
inputSchema: {
|
|
128
|
+
type: "object",
|
|
129
|
+
properties: {
|
|
130
|
+
approvalId: { type: "string", description: "Approval UUID" },
|
|
131
|
+
},
|
|
132
|
+
required: ["approvalId"],
|
|
133
|
+
},
|
|
134
|
+
annotations: { destructiveHint: true, openWorldHint: false },
|
|
135
|
+
async handler(args, client) {
|
|
136
|
+
try {
|
|
137
|
+
const { approvalId } = validate(ApprovalIdInput, args);
|
|
138
|
+
const data = await client.post(`/api/approvals/${approvalId}/approve`);
|
|
139
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
return handleApiError(err);
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
name: "paperclip_reject",
|
|
148
|
+
description: "Reject an approval request. Run ID header is injected automatically.",
|
|
149
|
+
inputSchema: {
|
|
150
|
+
type: "object",
|
|
151
|
+
properties: {
|
|
152
|
+
approvalId: { type: "string", description: "Approval UUID" },
|
|
153
|
+
reason: { type: "string", description: "Reason for rejection" },
|
|
154
|
+
},
|
|
155
|
+
required: ["approvalId"],
|
|
156
|
+
},
|
|
157
|
+
annotations: { destructiveHint: true, openWorldHint: false },
|
|
158
|
+
async handler(args, client) {
|
|
159
|
+
try {
|
|
160
|
+
const { approvalId, reason } = validate(RejectInput, args);
|
|
161
|
+
const body = {};
|
|
162
|
+
if (reason !== undefined)
|
|
163
|
+
body.reason = reason;
|
|
164
|
+
const data = await client.post(`/api/approvals/${approvalId}/reject`, body);
|
|
165
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
return handleApiError(err);
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
name: "paperclip_request_revision",
|
|
174
|
+
description: "Request a revision on a pending approval. Run ID header is injected automatically.",
|
|
175
|
+
inputSchema: {
|
|
176
|
+
type: "object",
|
|
177
|
+
properties: {
|
|
178
|
+
approvalId: { type: "string", description: "Approval UUID" },
|
|
179
|
+
feedback: { type: "string", description: "Feedback on what needs to change" },
|
|
180
|
+
},
|
|
181
|
+
required: ["approvalId"],
|
|
182
|
+
},
|
|
183
|
+
annotations: { destructiveHint: false, openWorldHint: false },
|
|
184
|
+
async handler(args, client) {
|
|
185
|
+
try {
|
|
186
|
+
const { approvalId, feedback } = validate(RequestRevisionInput, args);
|
|
187
|
+
const body = {};
|
|
188
|
+
if (feedback !== undefined)
|
|
189
|
+
body.feedback = feedback;
|
|
190
|
+
const data = await client.post(`/api/approvals/${approvalId}/request-revision`, body);
|
|
191
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
return handleApiError(err);
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
name: "paperclip_resubmit_approval",
|
|
200
|
+
description: "Resubmit an approval request after addressing revision feedback. Run ID header is injected automatically.",
|
|
201
|
+
inputSchema: {
|
|
202
|
+
type: "object",
|
|
203
|
+
properties: {
|
|
204
|
+
approvalId: { type: "string", description: "Approval UUID" },
|
|
205
|
+
comment: { type: "string", description: "Summary of changes made" },
|
|
206
|
+
},
|
|
207
|
+
required: ["approvalId"],
|
|
208
|
+
},
|
|
209
|
+
annotations: { destructiveHint: false, openWorldHint: false },
|
|
210
|
+
async handler(args, client) {
|
|
211
|
+
try {
|
|
212
|
+
const { approvalId, comment } = validate(ResubmitInput, args);
|
|
213
|
+
const body = {};
|
|
214
|
+
if (comment !== undefined)
|
|
215
|
+
body.comment = comment;
|
|
216
|
+
const data = await client.post(`/api/approvals/${approvalId}/resubmit`, body);
|
|
217
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
return handleApiError(err);
|
|
221
|
+
}
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
name: "paperclip_list_approval_comments",
|
|
226
|
+
description: "List comments on an approval request.",
|
|
227
|
+
inputSchema: {
|
|
228
|
+
type: "object",
|
|
229
|
+
properties: {
|
|
230
|
+
approvalId: { type: "string", description: "Approval UUID" },
|
|
231
|
+
},
|
|
232
|
+
required: ["approvalId"],
|
|
233
|
+
},
|
|
234
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
235
|
+
async handler(args, client) {
|
|
236
|
+
try {
|
|
237
|
+
const { approvalId } = validate(ApprovalIdInput, args);
|
|
238
|
+
const data = await client.get(`/api/approvals/${approvalId}/comments`);
|
|
239
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
240
|
+
}
|
|
241
|
+
catch (err) {
|
|
242
|
+
return handleApiError(err);
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
name: "paperclip_add_approval_comment",
|
|
248
|
+
description: "Post a markdown comment on an approval request. Run ID header is injected automatically.",
|
|
249
|
+
inputSchema: {
|
|
250
|
+
type: "object",
|
|
251
|
+
properties: {
|
|
252
|
+
approvalId: { type: "string", description: "Approval UUID" },
|
|
253
|
+
body: { type: "string", description: "Comment body (markdown)" },
|
|
254
|
+
},
|
|
255
|
+
required: ["approvalId", "body"],
|
|
256
|
+
},
|
|
257
|
+
annotations: { destructiveHint: false, openWorldHint: false },
|
|
258
|
+
async handler(args, client) {
|
|
259
|
+
try {
|
|
260
|
+
const { approvalId, body } = validate(ApprovalCommentInput, args);
|
|
261
|
+
const data = await client.post(`/api/approvals/${approvalId}/comments`, { body });
|
|
262
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
return handleApiError(err);
|
|
266
|
+
}
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
name: "paperclip_create_agent_hire",
|
|
271
|
+
description: "Create an agent hire request (triggers the approval and onboarding flow). Run ID header is injected automatically.",
|
|
272
|
+
inputSchema: {
|
|
273
|
+
type: "object",
|
|
274
|
+
properties: {
|
|
275
|
+
name: { type: "string", description: "Agent display name" },
|
|
276
|
+
role: { type: "string", description: "Agent role (e.g. engineer, cto)" },
|
|
277
|
+
title: { type: "string", description: "Job title" },
|
|
278
|
+
capabilities: { type: "string", description: "Free-text capability description" },
|
|
279
|
+
goalId: { type: "string", description: "Goal UUID to link the hire to" },
|
|
280
|
+
projectId: { type: "string", description: "Project UUID to associate" },
|
|
281
|
+
},
|
|
282
|
+
required: ["name", "role"],
|
|
283
|
+
},
|
|
284
|
+
annotations: { destructiveHint: false, openWorldHint: false },
|
|
285
|
+
async handler(args, client) {
|
|
286
|
+
try {
|
|
287
|
+
const input = validate(CreateAgentHireInput, args);
|
|
288
|
+
const body = { name: input.name, role: input.role };
|
|
289
|
+
if (input.title !== undefined)
|
|
290
|
+
body.title = input.title;
|
|
291
|
+
if (input.capabilities !== undefined)
|
|
292
|
+
body.capabilities = input.capabilities;
|
|
293
|
+
if (input.goalId !== undefined)
|
|
294
|
+
body.goalId = input.goalId;
|
|
295
|
+
if (input.projectId !== undefined)
|
|
296
|
+
body.projectId = input.projectId;
|
|
297
|
+
const data = await client.post(`/api/companies/${client.companyId}/agent-hires`, body);
|
|
298
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
299
|
+
}
|
|
300
|
+
catch (err) {
|
|
301
|
+
return handleApiError(err);
|
|
302
|
+
}
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
];
|
|
306
|
+
//# sourceMappingURL=approvals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvals.js","sourceRoot":"","sources":["../../src/tools/approvals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../../src/tools/attachments.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAsBjD,eAAO,MAAM,eAAe,EAAE,cAAc,EAuG3C,CAAC"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { basename } from "node:path";
|
|
4
|
+
import { validate, IssueIdSchema, handleApiError } from "./validation.js";
|
|
5
|
+
const ListAttachmentsInput = IssueIdSchema;
|
|
6
|
+
const UploadAttachmentInput = z.object({
|
|
7
|
+
issueId: z.string().min(1).describe("Issue ID or identifier (e.g. PAP-22)"),
|
|
8
|
+
filePath: z.string().min(1).describe("Absolute path to the local file to upload"),
|
|
9
|
+
filename: z
|
|
10
|
+
.string()
|
|
11
|
+
.optional()
|
|
12
|
+
.describe("Override filename in the upload (defaults to basename of filePath)"),
|
|
13
|
+
mimeType: z
|
|
14
|
+
.string()
|
|
15
|
+
.optional()
|
|
16
|
+
.describe("MIME type of the file (e.g. text/plain, application/pdf)"),
|
|
17
|
+
});
|
|
18
|
+
const AttachmentIdInput = z.object({
|
|
19
|
+
attachmentId: z.string().min(1).describe("Attachment UUID"),
|
|
20
|
+
});
|
|
21
|
+
export const attachmentTools = [
|
|
22
|
+
{
|
|
23
|
+
name: "paperclip_list_attachments",
|
|
24
|
+
description: "List all attachments on an issue.",
|
|
25
|
+
inputSchema: {
|
|
26
|
+
type: "object",
|
|
27
|
+
properties: {
|
|
28
|
+
issueId: { type: "string", description: "Issue ID or identifier (e.g. PAP-22)" },
|
|
29
|
+
},
|
|
30
|
+
required: ["issueId"],
|
|
31
|
+
},
|
|
32
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
33
|
+
async handler(args, client) {
|
|
34
|
+
try {
|
|
35
|
+
const { issueId } = validate(ListAttachmentsInput, args);
|
|
36
|
+
const data = await client.get(`/api/issues/${issueId}/attachments`);
|
|
37
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
return handleApiError(err);
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: "paperclip_upload_attachment",
|
|
46
|
+
description: "Upload a local file as an attachment to an issue. Provide the absolute file path. Run ID header is injected automatically.",
|
|
47
|
+
inputSchema: {
|
|
48
|
+
type: "object",
|
|
49
|
+
properties: {
|
|
50
|
+
issueId: { type: "string", description: "Issue ID or identifier (e.g. PAP-22)" },
|
|
51
|
+
filePath: { type: "string", description: "Absolute path to the local file to upload" },
|
|
52
|
+
filename: {
|
|
53
|
+
type: "string",
|
|
54
|
+
description: "Override filename in the upload (defaults to basename of filePath)",
|
|
55
|
+
},
|
|
56
|
+
mimeType: {
|
|
57
|
+
type: "string",
|
|
58
|
+
description: "MIME type of the file (e.g. text/plain, application/pdf)",
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
required: ["issueId", "filePath"],
|
|
62
|
+
},
|
|
63
|
+
annotations: { destructiveHint: false, openWorldHint: false },
|
|
64
|
+
async handler(args, client) {
|
|
65
|
+
try {
|
|
66
|
+
const { issueId, filePath, filename, mimeType } = validate(UploadAttachmentInput, args);
|
|
67
|
+
const fileBuffer = await readFile(filePath);
|
|
68
|
+
const uploadName = filename ?? basename(filePath);
|
|
69
|
+
const form = new FormData();
|
|
70
|
+
const blob = new Blob([fileBuffer], { type: mimeType ?? "application/octet-stream" });
|
|
71
|
+
form.append("file", blob, uploadName);
|
|
72
|
+
const data = await client.postForm(`/api/companies/${client.companyId}/issues/${issueId}/attachments`, form);
|
|
73
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
return handleApiError(err);
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: "paperclip_download_attachment",
|
|
82
|
+
description: "Download the content of an attachment by ID. Returns the content as base64.",
|
|
83
|
+
inputSchema: {
|
|
84
|
+
type: "object",
|
|
85
|
+
properties: {
|
|
86
|
+
attachmentId: { type: "string", description: "Attachment UUID" },
|
|
87
|
+
},
|
|
88
|
+
required: ["attachmentId"],
|
|
89
|
+
},
|
|
90
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
91
|
+
async handler(args, client) {
|
|
92
|
+
try {
|
|
93
|
+
const { attachmentId } = validate(AttachmentIdInput, args);
|
|
94
|
+
const data = await client.get(`/api/attachments/${attachmentId}/content`);
|
|
95
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
return handleApiError(err);
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: "paperclip_delete_attachment",
|
|
104
|
+
description: "Delete an attachment from an issue. Run ID header is injected automatically.",
|
|
105
|
+
inputSchema: {
|
|
106
|
+
type: "object",
|
|
107
|
+
properties: {
|
|
108
|
+
attachmentId: { type: "string", description: "Attachment UUID" },
|
|
109
|
+
},
|
|
110
|
+
required: ["attachmentId"],
|
|
111
|
+
},
|
|
112
|
+
annotations: { destructiveHint: true, openWorldHint: false },
|
|
113
|
+
async handler(args, client) {
|
|
114
|
+
try {
|
|
115
|
+
const { attachmentId } = validate(AttachmentIdInput, args);
|
|
116
|
+
const data = await client.delete(`/api/attachments/${attachmentId}`);
|
|
117
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
return handleApiError(err);
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
];
|
|
125
|
+
//# sourceMappingURL=attachments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/tools/attachments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../src/tools/comments.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAcjD,eAAO,MAAM,YAAY,EAAE,cAAc,EA4DxC,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { validate, handleApiError } from "./validation.js";
|
|
3
|
+
const ListCommentsInput = z.object({
|
|
4
|
+
issueId: z.string().min(1),
|
|
5
|
+
after: z.string().optional(),
|
|
6
|
+
order: z.enum(["asc", "desc"]).optional(),
|
|
7
|
+
});
|
|
8
|
+
const AddCommentInput = z.object({
|
|
9
|
+
issueId: z.string().min(1),
|
|
10
|
+
body: z.string().min(1),
|
|
11
|
+
});
|
|
12
|
+
export const commentTools = [
|
|
13
|
+
{
|
|
14
|
+
name: "paperclip_list_comments",
|
|
15
|
+
description: "List comments for an issue. Supports cursor-based incremental fetching via the `after` parameter.",
|
|
16
|
+
inputSchema: {
|
|
17
|
+
type: "object",
|
|
18
|
+
properties: {
|
|
19
|
+
issueId: { type: "string", description: "Issue ID or identifier (e.g. PAP-21)" },
|
|
20
|
+
after: {
|
|
21
|
+
type: "string",
|
|
22
|
+
description: "Comment ID cursor — returns only comments posted after this ID",
|
|
23
|
+
},
|
|
24
|
+
order: {
|
|
25
|
+
type: "string",
|
|
26
|
+
enum: ["asc", "desc"],
|
|
27
|
+
description: "Sort order (default: asc)",
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
required: ["issueId"],
|
|
31
|
+
},
|
|
32
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
33
|
+
async handler(args, client) {
|
|
34
|
+
try {
|
|
35
|
+
const input = validate(ListCommentsInput, args);
|
|
36
|
+
const params = new URLSearchParams();
|
|
37
|
+
if (input.after)
|
|
38
|
+
params.set("after", input.after);
|
|
39
|
+
if (input.order)
|
|
40
|
+
params.set("order", input.order);
|
|
41
|
+
const qs = params.toString();
|
|
42
|
+
const path = `/api/issues/${input.issueId}/comments${qs ? `?${qs}` : ""}`;
|
|
43
|
+
const data = await client.get(path);
|
|
44
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
return handleApiError(err);
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: "paperclip_add_comment",
|
|
53
|
+
description: "Post a markdown comment on an issue. Run ID header is injected automatically for audit trail.",
|
|
54
|
+
inputSchema: {
|
|
55
|
+
type: "object",
|
|
56
|
+
properties: {
|
|
57
|
+
issueId: { type: "string", description: "Issue ID or identifier (e.g. PAP-21)" },
|
|
58
|
+
body: { type: "string", description: "Comment body (markdown)" },
|
|
59
|
+
},
|
|
60
|
+
required: ["issueId", "body"],
|
|
61
|
+
},
|
|
62
|
+
annotations: { destructiveHint: false, openWorldHint: false },
|
|
63
|
+
async handler(args, client) {
|
|
64
|
+
try {
|
|
65
|
+
const { issueId, body } = validate(AddCommentInput, args);
|
|
66
|
+
const data = await client.post(`/api/issues/${issueId}/comments`, { body });
|
|
67
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
return handleApiError(err);
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
//# sourceMappingURL=comments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/tools/comments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/tools/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,eAAO,MAAM,cAAc,EAAE,cAAc,EAqB1C,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { validate, NoInput, handleApiError } from "./validation.js";
|
|
2
|
+
export const dashboardTools = [
|
|
3
|
+
{
|
|
4
|
+
name: "paperclip_get_dashboard",
|
|
5
|
+
description: "Return the company-level health summary including active goals, projects, issues by status, and agent workload.",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: "object",
|
|
8
|
+
properties: {},
|
|
9
|
+
required: [],
|
|
10
|
+
},
|
|
11
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
12
|
+
async handler(args, client) {
|
|
13
|
+
try {
|
|
14
|
+
validate(NoInput, args);
|
|
15
|
+
const data = await client.get(`/api/companies/${client.companyId}/dashboard`);
|
|
16
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
return handleApiError(err);
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/tools/dashboard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEpE,MAAM,CAAC,MAAM,cAAc,GAAqB;IAC9C;QACE,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EACT,iHAAiH;QACnH,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,EAAE;SACb;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;QACzD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM;YACxB,IAAI,CAAC;gBACH,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBACxB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAU,kBAAkB,MAAM,CAAC,SAAS,YAAY,CAAC,CAAC;gBACvF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACrE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/tools/documents.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAwBjD,eAAO,MAAM,aAAa,EAAE,cAAc,EA+HzC,CAAC"}
|