@briefgate/mcp 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.
- package/LICENSE +21 -0
- package/README.md +329 -0
- package/dist/client.d.ts +128 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +138 -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 +188 -0
- package/dist/index.js.map +1 -0
- package/dist/tools.d.ts +616 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +591 -0
- package/dist/tools.js.map +1 -0
- package/dist/webhook.d.ts +54 -0
- package/dist/webhook.d.ts.map +1 -0
- package/dist/webhook.js +94 -0
- package/dist/webhook.js.map +1 -0
- package/package.json +68 -0
package/dist/tools.js
ADDED
|
@@ -0,0 +1,591 @@
|
|
|
1
|
+
// Tool definitions, Zod validation, and execute functions for all 7 BriefGate MCP tools.
|
|
2
|
+
// TOOLS is the JSON-schema array sent to the MCP client in ListTools.
|
|
3
|
+
// executeTool dispatches CallTool requests to typed execute functions.
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { createHash } from 'node:crypto';
|
|
6
|
+
import { createIntake, listIntakes, getIntakeStatus, getIntakeResults, addItems, requestRevision, sendChase, } from './client.js';
|
|
7
|
+
// ─── Shared Zod schemas (exported for testing) ────────────────────────────────
|
|
8
|
+
export const itemKeySchema = z
|
|
9
|
+
.string()
|
|
10
|
+
.min(1)
|
|
11
|
+
.max(64)
|
|
12
|
+
.regex(/^[a-z][a-z0-9_]*$/, 'Item key must be snake_case: start with a lowercase letter, then letters/digits/underscores (e.g. "logo", "hero_copy", "ga4_id")');
|
|
13
|
+
const itemTypeSchema = z.enum([
|
|
14
|
+
'text',
|
|
15
|
+
'longtext',
|
|
16
|
+
'file',
|
|
17
|
+
'file_list',
|
|
18
|
+
'image',
|
|
19
|
+
'color_list',
|
|
20
|
+
'select',
|
|
21
|
+
'boolean',
|
|
22
|
+
'url',
|
|
23
|
+
'secret',
|
|
24
|
+
'structured',
|
|
25
|
+
]);
|
|
26
|
+
const constraintsSchema = z
|
|
27
|
+
.object({
|
|
28
|
+
formats: z.array(z.string().min(1).max(10)).max(20).optional(),
|
|
29
|
+
min_width: z.number().int().positive().max(20000).optional(),
|
|
30
|
+
min_height: z.number().int().positive().max(20000).optional(),
|
|
31
|
+
max_width: z.number().int().positive().max(20000).optional(),
|
|
32
|
+
max_height: z.number().int().positive().max(20000).optional(),
|
|
33
|
+
max_bytes: z.number().int().positive().optional(),
|
|
34
|
+
min_chars: z.number().int().nonnegative().optional(),
|
|
35
|
+
max_chars: z.number().int().positive().optional(),
|
|
36
|
+
min_count: z.number().int().nonnegative().max(200).optional(),
|
|
37
|
+
max_count: z.number().int().positive().max(200).optional(),
|
|
38
|
+
transparent_background: z.boolean().optional(),
|
|
39
|
+
})
|
|
40
|
+
.optional();
|
|
41
|
+
const itemOptionSchema = z.object({
|
|
42
|
+
value: z.string().min(1).max(200),
|
|
43
|
+
label: z.string().min(1).max(200),
|
|
44
|
+
});
|
|
45
|
+
export const itemDefinitionSchema = z
|
|
46
|
+
.object({
|
|
47
|
+
key: itemKeySchema,
|
|
48
|
+
type: itemTypeSchema,
|
|
49
|
+
label: z.string().min(1).max(200),
|
|
50
|
+
help: z.string().max(1000).optional(),
|
|
51
|
+
required: z.boolean().default(true),
|
|
52
|
+
constraints: constraintsSchema,
|
|
53
|
+
schema: z.record(z.unknown()).optional(),
|
|
54
|
+
options: z.array(itemOptionSchema).max(100).optional(),
|
|
55
|
+
pattern: z.string().max(300).optional(),
|
|
56
|
+
})
|
|
57
|
+
.superRefine((item, ctx) => {
|
|
58
|
+
if (item.type === 'select' && (!item.options || item.options.length === 0)) {
|
|
59
|
+
ctx.addIssue({
|
|
60
|
+
code: z.ZodIssueCode.custom,
|
|
61
|
+
path: ['options'],
|
|
62
|
+
message: 'type=select requires a non-empty options array',
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
if (item.type === 'structured' && !item.schema) {
|
|
66
|
+
ctx.addIssue({
|
|
67
|
+
code: z.ZodIssueCode.custom,
|
|
68
|
+
path: ['schema'],
|
|
69
|
+
message: 'type=structured requires a JSON Schema object in `schema`',
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
const clientSchema = z.object({
|
|
74
|
+
email: z.string().email().max(320),
|
|
75
|
+
name: z.string().max(200).optional(),
|
|
76
|
+
language: z.enum(['cs', 'en', 'de']).optional(),
|
|
77
|
+
timezone: z.string().optional(),
|
|
78
|
+
phone: z
|
|
79
|
+
.string()
|
|
80
|
+
.regex(/^\+[1-9]\d{6,14}$/, 'Phone must be E.164 format, e.g. +420601123456')
|
|
81
|
+
.optional(),
|
|
82
|
+
});
|
|
83
|
+
const brandingSchema = z.object({
|
|
84
|
+
logo_url: z.string().url().optional(),
|
|
85
|
+
accent_color: z
|
|
86
|
+
.string()
|
|
87
|
+
.regex(/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/, 'Expected a hex color like #1B2A4A')
|
|
88
|
+
.optional(),
|
|
89
|
+
sender_name: z.string().min(1).max(100).optional(),
|
|
90
|
+
reply_to: z.string().email().optional(),
|
|
91
|
+
});
|
|
92
|
+
const defineIntakeSchema = z.object({
|
|
93
|
+
project_name: z.string().min(1).max(200),
|
|
94
|
+
client: clientSchema,
|
|
95
|
+
due_date: z
|
|
96
|
+
.string()
|
|
97
|
+
.regex(/^\d{4}-\d{2}-\d{2}$/, 'Expected YYYY-MM-DD')
|
|
98
|
+
.optional(),
|
|
99
|
+
branding: brandingSchema.optional(),
|
|
100
|
+
chase_schedule: z.enum(['default', 'gentle', 'aggressive', 'off']).optional(),
|
|
101
|
+
items: z.array(itemDefinitionSchema).min(1).max(100),
|
|
102
|
+
template: z.string().max(100).optional(),
|
|
103
|
+
auto_approve_hours: z.number().int().min(0).max(720).optional(),
|
|
104
|
+
retention: z
|
|
105
|
+
.object({
|
|
106
|
+
mode: z.enum(['days', 'on_delivery']).optional(),
|
|
107
|
+
days: z.number().int().min(1).max(3650).optional(),
|
|
108
|
+
anonymize: z.boolean().optional(),
|
|
109
|
+
})
|
|
110
|
+
.optional(),
|
|
111
|
+
send: z.boolean().optional(),
|
|
112
|
+
});
|
|
113
|
+
// ─── MCP tool definitions (JSON schema, sent to the MCP client) ───────────────
|
|
114
|
+
export const TOOLS = [
|
|
115
|
+
{
|
|
116
|
+
name: 'define_intake',
|
|
117
|
+
description: `Create a new client intake request — a branded portal where the client submits logos, copy, files, credentials, and other assets. BriefGate sends the invite email and chases the client automatically until all items are collected.
|
|
118
|
+
|
|
119
|
+
Call this once at the start of a project, after you know what assets you need. Returns { intake_id, portal_url, status }. Save intake_id — you need it for all follow-up calls.
|
|
120
|
+
|
|
121
|
+
Example:
|
|
122
|
+
{
|
|
123
|
+
"project_name": "Website for Kramolíšová Finance",
|
|
124
|
+
"client": { "email": "klient@firma.cz", "name": "Michaela K.", "language": "cs" },
|
|
125
|
+
"due_date": "2026-08-15",
|
|
126
|
+
"branding": { "accent_color": "#1B2A4A", "sender_name": "Radim" },
|
|
127
|
+
"items": [
|
|
128
|
+
{ "key": "logo", "type": "image", "label": "Company logo",
|
|
129
|
+
"constraints": { "formats": ["svg","png"], "min_width": 512 } },
|
|
130
|
+
{ "key": "hero_copy", "type": "longtext", "label": "Homepage headline (2–3 sentences)",
|
|
131
|
+
"constraints": { "max_chars": 400 } },
|
|
132
|
+
{ "key": "wp_admin", "type": "secret", "label": "WordPress admin credentials" },
|
|
133
|
+
{ "key": "photos", "type": "file_list", "label": "Photos (5–10 images)",
|
|
134
|
+
"constraints": { "formats": ["jpg","png","heic"], "min_count": 5, "max_count": 15 } }
|
|
135
|
+
]
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
Item types: text, longtext, file, file_list, image, color_list, select (requires options[]), boolean, url, secret (encrypted, one-time reveal), structured (requires schema with JSON Schema).
|
|
139
|
+
Item keys must be snake_case (e.g. "logo", "hero_copy", "ga4_id") — they become property names in get_intake_results.`,
|
|
140
|
+
inputSchema: {
|
|
141
|
+
type: 'object',
|
|
142
|
+
properties: {
|
|
143
|
+
project_name: {
|
|
144
|
+
type: 'string',
|
|
145
|
+
description: 'Human-readable project name shown in the invite email and portal heading.',
|
|
146
|
+
},
|
|
147
|
+
client: {
|
|
148
|
+
type: 'object',
|
|
149
|
+
description: 'Client contact details.',
|
|
150
|
+
properties: {
|
|
151
|
+
email: { type: 'string', description: 'Client email address (required).' },
|
|
152
|
+
name: { type: 'string', description: 'Client name for personalised emails.' },
|
|
153
|
+
language: {
|
|
154
|
+
type: 'string',
|
|
155
|
+
enum: ['cs', 'en', 'de'],
|
|
156
|
+
description: 'Portal and email language. Default: en.',
|
|
157
|
+
},
|
|
158
|
+
timezone: {
|
|
159
|
+
type: 'string',
|
|
160
|
+
description: 'IANA timezone (e.g. Europe/Prague) for quiet-hours scheduling.',
|
|
161
|
+
},
|
|
162
|
+
phone: {
|
|
163
|
+
type: 'string',
|
|
164
|
+
description: 'E.164 phone number (e.g. +420601123456) — required for SMS reminders.',
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
required: ['email'],
|
|
168
|
+
},
|
|
169
|
+
due_date: {
|
|
170
|
+
type: 'string',
|
|
171
|
+
description: 'Deadline in YYYY-MM-DD format. Shown in the portal and used to escalate chase cadence.',
|
|
172
|
+
},
|
|
173
|
+
branding: {
|
|
174
|
+
type: 'object',
|
|
175
|
+
description: 'Override account-level branding for this intake.',
|
|
176
|
+
properties: {
|
|
177
|
+
logo_url: { type: 'string', description: 'https URL of your logo (shown in portal header).' },
|
|
178
|
+
accent_color: { type: 'string', description: 'Hex accent color, e.g. #1B2A4A.' },
|
|
179
|
+
sender_name: { type: 'string', description: 'Name shown as email sender, e.g. "Radim".' },
|
|
180
|
+
reply_to: { type: 'string', description: 'Reply-to email address.' },
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
chase_schedule: {
|
|
184
|
+
type: 'string',
|
|
185
|
+
enum: ['default', 'gentle', 'aggressive', 'off'],
|
|
186
|
+
description: 'Automated reminder cadence. default=T+2d,T+5d,T+9d,weekly. gentle=T+3d,T+8d,biweekly. aggressive=T+1d,T+3d,T+5d,every-other-day. off=no auto reminders.',
|
|
187
|
+
},
|
|
188
|
+
items: {
|
|
189
|
+
type: 'array',
|
|
190
|
+
description: 'List of assets to collect. Each item has key, type, label, and optional constraints.',
|
|
191
|
+
items: {
|
|
192
|
+
type: 'object',
|
|
193
|
+
properties: {
|
|
194
|
+
key: {
|
|
195
|
+
type: 'string',
|
|
196
|
+
description: 'snake_case identifier (e.g. "logo", "hero_copy"). Becomes the property name in get_intake_results output.',
|
|
197
|
+
},
|
|
198
|
+
type: {
|
|
199
|
+
type: 'string',
|
|
200
|
+
enum: [
|
|
201
|
+
'text',
|
|
202
|
+
'longtext',
|
|
203
|
+
'file',
|
|
204
|
+
'file_list',
|
|
205
|
+
'image',
|
|
206
|
+
'color_list',
|
|
207
|
+
'select',
|
|
208
|
+
'boolean',
|
|
209
|
+
'url',
|
|
210
|
+
'secret',
|
|
211
|
+
'structured',
|
|
212
|
+
],
|
|
213
|
+
},
|
|
214
|
+
label: { type: 'string', description: 'Human-readable label shown to the client.' },
|
|
215
|
+
help: { type: 'string', description: 'Additional instructions shown below the label.' },
|
|
216
|
+
required: { type: 'boolean', description: 'Whether the client must fill this in. Default: true.' },
|
|
217
|
+
constraints: {
|
|
218
|
+
type: 'object',
|
|
219
|
+
description: 'Type-specific constraints: formats, min_width/min_height (image), min_chars/max_chars (text), min_count/max_count (file_list).',
|
|
220
|
+
},
|
|
221
|
+
schema: {
|
|
222
|
+
type: 'object',
|
|
223
|
+
description: 'JSON Schema for type=structured. Required when type=structured.',
|
|
224
|
+
},
|
|
225
|
+
options: {
|
|
226
|
+
type: 'array',
|
|
227
|
+
description: 'Dropdown options for type=select. Required when type=select. Each item: { value, label }.',
|
|
228
|
+
items: {
|
|
229
|
+
type: 'object',
|
|
230
|
+
properties: {
|
|
231
|
+
value: { type: 'string' },
|
|
232
|
+
label: { type: 'string' },
|
|
233
|
+
},
|
|
234
|
+
required: ['value', 'label'],
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
|
+
pattern: { type: 'string', description: 'Regex pattern for type=text validation (e.g. "^G-[A-Z0-9]+$").' },
|
|
238
|
+
},
|
|
239
|
+
required: ['key', 'type', 'label'],
|
|
240
|
+
},
|
|
241
|
+
minItems: 1,
|
|
242
|
+
maxItems: 100,
|
|
243
|
+
},
|
|
244
|
+
template: {
|
|
245
|
+
type: 'string',
|
|
246
|
+
description: 'Template slug to pre-populate items (e.g. "restaurant-website", "consulting-firm").',
|
|
247
|
+
},
|
|
248
|
+
auto_approve_hours: {
|
|
249
|
+
type: 'number',
|
|
250
|
+
description: 'Hours after submission before an item is auto-approved without agent review. Default: 72. Set to 0 to require explicit approval.',
|
|
251
|
+
},
|
|
252
|
+
retention: {
|
|
253
|
+
type: 'object',
|
|
254
|
+
description: 'How long BriefGate keeps this intake after it is finished. Default: purged 90 days after the client completes. ' +
|
|
255
|
+
'Use mode "on_delivery" when the intake holds anything sensitive (credentials, personal photos): the contents are ' +
|
|
256
|
+
'then removed shortly after YOU collect them with get_intake_results, because at that point you already have the ' +
|
|
257
|
+
'files and there is no reason for a copy to sit on our server. An intake you never collect still expires on the ' +
|
|
258
|
+
'day count, so this can only ever delete data earlier, never later. ' +
|
|
259
|
+
'Example: { "mode": "on_delivery" } — or { "mode": "days", "days": 7 } to just shorten the window.',
|
|
260
|
+
properties: {
|
|
261
|
+
mode: {
|
|
262
|
+
type: 'string',
|
|
263
|
+
enum: ['days', 'on_delivery'],
|
|
264
|
+
description: '"days" (default): purge N days after the client finishes. "on_delivery": purge ~24h after you collect the results.',
|
|
265
|
+
},
|
|
266
|
+
days: {
|
|
267
|
+
type: 'number',
|
|
268
|
+
description: 'Days to keep after completion. Only valid with mode "days". Defaults to the account setting (90).',
|
|
269
|
+
},
|
|
270
|
+
anonymize: {
|
|
271
|
+
type: 'boolean',
|
|
272
|
+
description: 'Default true: keep the project record (name, item labels, statuses, dates) and delete everything belonging to ' +
|
|
273
|
+
'the client — files, secrets, submitted values, email, name, phone, and the portal link. Set false to delete the ' +
|
|
274
|
+
'whole intake including its history.',
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
send: {
|
|
279
|
+
type: 'boolean',
|
|
280
|
+
description: 'Whether to send the invite email immediately. Default: true. Set to false to create a draft and call /v1/intakes/:id/send later.',
|
|
281
|
+
},
|
|
282
|
+
},
|
|
283
|
+
required: ['project_name', 'client', 'items'],
|
|
284
|
+
},
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
name: 'get_intake_status',
|
|
288
|
+
description: `Check the completion status of a client intake — which items are submitted, pending, or need revision; the history of automated chase emails sent; and when the client last opened the portal.
|
|
289
|
+
|
|
290
|
+
Use this to decide whether to send a manual reminder (send_chase), request a revision (request_revision), or fetch results (get_intake_results). Returns per-item status and chase history.`,
|
|
291
|
+
inputSchema: {
|
|
292
|
+
type: 'object',
|
|
293
|
+
properties: {
|
|
294
|
+
intake_id: {
|
|
295
|
+
type: 'string',
|
|
296
|
+
description: 'Intake ID returned by define_intake (e.g. "in_8f3k").',
|
|
297
|
+
},
|
|
298
|
+
},
|
|
299
|
+
required: ['intake_id'],
|
|
300
|
+
},
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
name: 'get_intake_results',
|
|
304
|
+
description: `Retrieve the typed submitted values from a client intake.
|
|
305
|
+
|
|
306
|
+
Files are returned as signed URLs valid for 24 hours — download them promptly or store the URL for reuse within that window.
|
|
307
|
+
|
|
308
|
+
Secrets (type=secret, e.g. passwords, API keys) are decrypted and returned in plaintext on the FIRST call only. After the first retrieval the secret is marked as read: subsequent calls return first_reveal: false in meta and omit the value. Store secrets immediately before proceeding — you cannot retrieve them again.
|
|
309
|
+
|
|
310
|
+
Use only_new=true to get only items submitted since the last call (useful in webhook-driven workflows). Use include_pending=true to also return partially filled items.
|
|
311
|
+
|
|
312
|
+
Returns { results: { <key>: <typed value> }, meta: { <key>: { type, status, submitted_at, first_reveal? } } }.`,
|
|
313
|
+
inputSchema: {
|
|
314
|
+
type: 'object',
|
|
315
|
+
properties: {
|
|
316
|
+
intake_id: {
|
|
317
|
+
type: 'string',
|
|
318
|
+
description: 'Intake ID returned by define_intake.',
|
|
319
|
+
},
|
|
320
|
+
only_new: {
|
|
321
|
+
type: 'boolean',
|
|
322
|
+
description: 'Return only items submitted or updated since the previous get_intake_results call. Default: false.',
|
|
323
|
+
},
|
|
324
|
+
include_pending: {
|
|
325
|
+
type: 'boolean',
|
|
326
|
+
description: 'Include items not yet submitted (useful for partial progress checks). Default: false.',
|
|
327
|
+
},
|
|
328
|
+
},
|
|
329
|
+
required: ['intake_id'],
|
|
330
|
+
},
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
name: 'request_revision',
|
|
334
|
+
description: `Ask the client to resubmit a specific item with a note explaining what is wrong.
|
|
335
|
+
|
|
336
|
+
Use this after reviewing get_intake_results and finding an item that does not meet requirements — for example a blurry logo, copy that is too long, or a broken URL. The client is notified automatically and the item status moves to needs_revision.
|
|
337
|
+
|
|
338
|
+
Returns { status: "revision_requested", item_key }.`,
|
|
339
|
+
inputSchema: {
|
|
340
|
+
type: 'object',
|
|
341
|
+
properties: {
|
|
342
|
+
intake_id: {
|
|
343
|
+
type: 'string',
|
|
344
|
+
description: 'Intake ID returned by define_intake.',
|
|
345
|
+
},
|
|
346
|
+
item_key: {
|
|
347
|
+
type: 'string',
|
|
348
|
+
description: 'The key of the item to revise (e.g. "logo", "hero_copy").',
|
|
349
|
+
},
|
|
350
|
+
note: {
|
|
351
|
+
type: 'string',
|
|
352
|
+
description: 'Plain-language explanation shown to the client (e.g. "Logo is blurry — we need at least 512 px wide in SVG or PNG with a transparent background").',
|
|
353
|
+
},
|
|
354
|
+
},
|
|
355
|
+
required: ['intake_id', 'item_key', 'note'],
|
|
356
|
+
},
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
name: 'send_chase',
|
|
360
|
+
description: `Send a manual reminder to the client outside the automatic schedule.
|
|
361
|
+
|
|
362
|
+
Use when a deadline is approaching and the client has not responded to automatic reminders, or when you want to send an SMS after email attempts have failed. The automatic chase schedule continues after this call — this is an extra nudge, not a replacement.
|
|
363
|
+
|
|
364
|
+
Returns { sent: true }.`,
|
|
365
|
+
inputSchema: {
|
|
366
|
+
type: 'object',
|
|
367
|
+
properties: {
|
|
368
|
+
intake_id: {
|
|
369
|
+
type: 'string',
|
|
370
|
+
description: 'Intake ID returned by define_intake.',
|
|
371
|
+
},
|
|
372
|
+
channel: {
|
|
373
|
+
type: 'string',
|
|
374
|
+
enum: ['email', 'sms'],
|
|
375
|
+
description: 'Delivery channel. Default: email. Use "sms" only if the client provided a phone number and has not responded to emails.',
|
|
376
|
+
},
|
|
377
|
+
},
|
|
378
|
+
required: ['intake_id'],
|
|
379
|
+
},
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
name: 'list_intakes',
|
|
383
|
+
description: `List all intakes in your account, optionally filtered by status or client email.
|
|
384
|
+
|
|
385
|
+
Use this to get an overview of active projects, find a specific intake by the client's email when you have lost the intake_id, or check how many intakes are currently in progress.
|
|
386
|
+
|
|
387
|
+
Returns { intakes: [...], total } where each intake includes intake_id, project_name, status, created_at, due_date, and portal_url.`,
|
|
388
|
+
inputSchema: {
|
|
389
|
+
type: 'object',
|
|
390
|
+
properties: {
|
|
391
|
+
status: {
|
|
392
|
+
type: 'string',
|
|
393
|
+
enum: ['draft', 'sent', 'in_progress', 'completed', 'archived'],
|
|
394
|
+
description: 'Filter by intake status. Omit to return all.',
|
|
395
|
+
},
|
|
396
|
+
client_email: {
|
|
397
|
+
type: 'string',
|
|
398
|
+
description: 'Filter by client email address.',
|
|
399
|
+
},
|
|
400
|
+
limit: {
|
|
401
|
+
type: 'number',
|
|
402
|
+
description: 'Maximum number of results (1–100). Default: 20.',
|
|
403
|
+
},
|
|
404
|
+
offset: {
|
|
405
|
+
type: 'number',
|
|
406
|
+
description: 'Pagination offset. Default: 0.',
|
|
407
|
+
},
|
|
408
|
+
},
|
|
409
|
+
required: [],
|
|
410
|
+
},
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
name: 'add_items',
|
|
414
|
+
description: `Add new items to an already-sent intake — for example, when you realise mid-project that you also need a favicon, social media assets, or additional credentials.
|
|
415
|
+
|
|
416
|
+
The client is notified about the new items. Existing items and their submitted values are not affected. Returns the updated intake object.
|
|
417
|
+
|
|
418
|
+
Items must follow the same key/type/label rules as define_intake (snake_case keys, type-specific constraints).`,
|
|
419
|
+
inputSchema: {
|
|
420
|
+
type: 'object',
|
|
421
|
+
properties: {
|
|
422
|
+
intake_id: {
|
|
423
|
+
type: 'string',
|
|
424
|
+
description: 'Intake ID returned by define_intake.',
|
|
425
|
+
},
|
|
426
|
+
items: {
|
|
427
|
+
type: 'array',
|
|
428
|
+
description: 'New items to add. Same schema as define_intake items.',
|
|
429
|
+
items: {
|
|
430
|
+
type: 'object',
|
|
431
|
+
properties: {
|
|
432
|
+
key: { type: 'string', description: 'snake_case key, unique within the intake.' },
|
|
433
|
+
type: {
|
|
434
|
+
type: 'string',
|
|
435
|
+
enum: [
|
|
436
|
+
'text', 'longtext', 'file', 'file_list', 'image',
|
|
437
|
+
'color_list', 'select', 'boolean', 'url', 'secret', 'structured',
|
|
438
|
+
],
|
|
439
|
+
},
|
|
440
|
+
label: { type: 'string', description: 'Human-readable label shown to the client.' },
|
|
441
|
+
help: { type: 'string' },
|
|
442
|
+
required: { type: 'boolean' },
|
|
443
|
+
constraints: { type: 'object' },
|
|
444
|
+
schema: { type: 'object' },
|
|
445
|
+
options: { type: 'array', items: { type: 'object' } },
|
|
446
|
+
pattern: { type: 'string' },
|
|
447
|
+
},
|
|
448
|
+
required: ['key', 'type', 'label'],
|
|
449
|
+
},
|
|
450
|
+
minItems: 1,
|
|
451
|
+
maxItems: 50,
|
|
452
|
+
},
|
|
453
|
+
},
|
|
454
|
+
required: ['intake_id', 'items'],
|
|
455
|
+
},
|
|
456
|
+
},
|
|
457
|
+
];
|
|
458
|
+
// ─── Idempotency key ──────────────────────────────────────────────────────────
|
|
459
|
+
// Derive a stable key from project name + client email + a canonical hash of
|
|
460
|
+
// the items list. Including items prevents two *different* intakes for the same
|
|
461
|
+
// client/project (e.g. a new project a year later with a different scope) from
|
|
462
|
+
// colliding on the server: same project_name + client but different items →
|
|
463
|
+
// different key → two distinct intakes. Retries with identical args still
|
|
464
|
+
// produce the same key, so the server correctly deduplicates them.
|
|
465
|
+
function deriveIdempotencyKey(projectName, clientEmail, items) {
|
|
466
|
+
// Sort by key so insertion order doesn't affect the hash.
|
|
467
|
+
const sortedItems = [...items].sort((a, b) => (a.key > b.key ? 1 : -1));
|
|
468
|
+
const itemsFingerprint = createHash('sha256')
|
|
469
|
+
.update(JSON.stringify(sortedItems))
|
|
470
|
+
.digest('hex')
|
|
471
|
+
.slice(0, 16);
|
|
472
|
+
return createHash('sha256')
|
|
473
|
+
.update(`${projectName}\0${clientEmail}\0${itemsFingerprint}`)
|
|
474
|
+
.digest('hex')
|
|
475
|
+
.slice(0, 40);
|
|
476
|
+
}
|
|
477
|
+
function validationError(issues) {
|
|
478
|
+
const messages = issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ');
|
|
479
|
+
return { text: `Validation error: ${messages}`, isError: true };
|
|
480
|
+
}
|
|
481
|
+
// ─── Execute functions ────────────────────────────────────────────────────────
|
|
482
|
+
export async function callDefineIntake(config, args) {
|
|
483
|
+
const parsed = defineIntakeSchema.safeParse(args);
|
|
484
|
+
if (!parsed.success)
|
|
485
|
+
return validationError(parsed.error.issues);
|
|
486
|
+
const { project_name, client, items, ...rest } = parsed.data;
|
|
487
|
+
const idempotencyKey = deriveIdempotencyKey(project_name, client.email, items);
|
|
488
|
+
const result = await createIntake(config, { project_name, client, items, ...rest }, idempotencyKey);
|
|
489
|
+
return {
|
|
490
|
+
text: JSON.stringify({ intake_id: result.intake_id, portal_url: result.portal_url, status: result.status }, null, 2),
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
export async function callGetIntakeStatus(config, args) {
|
|
494
|
+
const parsed = z.object({ intake_id: z.string().min(1) }).safeParse(args);
|
|
495
|
+
if (!parsed.success)
|
|
496
|
+
return validationError(parsed.error.issues);
|
|
497
|
+
const result = await getIntakeStatus(config, parsed.data.intake_id);
|
|
498
|
+
return { text: JSON.stringify(result, null, 2) };
|
|
499
|
+
}
|
|
500
|
+
export async function callGetIntakeResults(config, args) {
|
|
501
|
+
const parsed = z
|
|
502
|
+
.object({
|
|
503
|
+
intake_id: z.string().min(1),
|
|
504
|
+
only_new: z.boolean().optional(),
|
|
505
|
+
include_pending: z.boolean().optional(),
|
|
506
|
+
})
|
|
507
|
+
.safeParse(args);
|
|
508
|
+
if (!parsed.success)
|
|
509
|
+
return validationError(parsed.error.issues);
|
|
510
|
+
const { intake_id, only_new, include_pending } = parsed.data;
|
|
511
|
+
const result = await getIntakeResults(config, intake_id, {
|
|
512
|
+
only_new: only_new ?? false,
|
|
513
|
+
include_pending: include_pending ?? false,
|
|
514
|
+
});
|
|
515
|
+
return { text: JSON.stringify(result, null, 2) };
|
|
516
|
+
}
|
|
517
|
+
export async function callRequestRevision(config, args) {
|
|
518
|
+
const parsed = z
|
|
519
|
+
.object({
|
|
520
|
+
intake_id: z.string().min(1),
|
|
521
|
+
item_key: z.string().min(1),
|
|
522
|
+
note: z.string().min(1).max(2000),
|
|
523
|
+
})
|
|
524
|
+
.safeParse(args);
|
|
525
|
+
if (!parsed.success)
|
|
526
|
+
return validationError(parsed.error.issues);
|
|
527
|
+
const result = await requestRevision(config, parsed.data.intake_id, parsed.data.item_key, parsed.data.note);
|
|
528
|
+
return { text: JSON.stringify(result, null, 2) };
|
|
529
|
+
}
|
|
530
|
+
export async function callSendChase(config, args) {
|
|
531
|
+
const parsed = z
|
|
532
|
+
.object({
|
|
533
|
+
intake_id: z.string().min(1),
|
|
534
|
+
channel: z.enum(['email', 'sms']).optional(),
|
|
535
|
+
})
|
|
536
|
+
.safeParse(args);
|
|
537
|
+
if (!parsed.success)
|
|
538
|
+
return validationError(parsed.error.issues);
|
|
539
|
+
const result = await sendChase(config, parsed.data.intake_id, parsed.data.channel);
|
|
540
|
+
return { text: JSON.stringify(result, null, 2) };
|
|
541
|
+
}
|
|
542
|
+
export async function callListIntakes(config, args) {
|
|
543
|
+
const parsed = z
|
|
544
|
+
.object({
|
|
545
|
+
status: z
|
|
546
|
+
.enum(['draft', 'sent', 'in_progress', 'completed', 'archived'])
|
|
547
|
+
.optional(),
|
|
548
|
+
client_email: z.string().email().optional(),
|
|
549
|
+
limit: z.number().int().min(1).max(100).optional(),
|
|
550
|
+
offset: z.number().int().min(0).optional(),
|
|
551
|
+
})
|
|
552
|
+
.safeParse(args);
|
|
553
|
+
if (!parsed.success)
|
|
554
|
+
return validationError(parsed.error.issues);
|
|
555
|
+
const result = await listIntakes(config, parsed.data);
|
|
556
|
+
return { text: JSON.stringify(result, null, 2) };
|
|
557
|
+
}
|
|
558
|
+
export async function callAddItems(config, args) {
|
|
559
|
+
const parsed = z
|
|
560
|
+
.object({
|
|
561
|
+
intake_id: z.string().min(1),
|
|
562
|
+
items: z.array(itemDefinitionSchema).min(1).max(50),
|
|
563
|
+
})
|
|
564
|
+
.safeParse(args);
|
|
565
|
+
if (!parsed.success)
|
|
566
|
+
return validationError(parsed.error.issues);
|
|
567
|
+
const result = await addItems(config, parsed.data.intake_id, parsed.data.items);
|
|
568
|
+
return { text: JSON.stringify(result, null, 2) };
|
|
569
|
+
}
|
|
570
|
+
// ─── Dispatch ─────────────────────────────────────────────────────────────────
|
|
571
|
+
export async function executeTool(name, config, args) {
|
|
572
|
+
switch (name) {
|
|
573
|
+
case 'define_intake':
|
|
574
|
+
return callDefineIntake(config, args);
|
|
575
|
+
case 'get_intake_status':
|
|
576
|
+
return callGetIntakeStatus(config, args);
|
|
577
|
+
case 'get_intake_results':
|
|
578
|
+
return callGetIntakeResults(config, args);
|
|
579
|
+
case 'request_revision':
|
|
580
|
+
return callRequestRevision(config, args);
|
|
581
|
+
case 'send_chase':
|
|
582
|
+
return callSendChase(config, args);
|
|
583
|
+
case 'list_intakes':
|
|
584
|
+
return callListIntakes(config, args);
|
|
585
|
+
case 'add_items':
|
|
586
|
+
return callAddItems(config, args);
|
|
587
|
+
default:
|
|
588
|
+
return { text: `Unknown tool: ${name}`, isError: true };
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|