formbro-mcp-server 1.0.0 → 1.0.2
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 +386 -48
- package/dist/index.js +58 -14
- package/dist/index.js.map +1 -1
- package/dist/services/api-client.d.ts +7 -0
- package/dist/services/api-client.d.ts.map +1 -1
- package/dist/services/api-client.js +113 -2
- package/dist/services/api-client.js.map +1 -1
- package/dist/services/idempotency.d.ts +6 -0
- package/dist/services/idempotency.d.ts.map +1 -0
- package/dist/services/idempotency.js +9 -0
- package/dist/services/idempotency.js.map +1 -0
- package/dist/tools/applications-extra.d.ts +3 -0
- package/dist/tools/applications-extra.d.ts.map +1 -0
- package/dist/tools/applications-extra.js +62 -0
- package/dist/tools/applications-extra.js.map +1 -0
- package/dist/tools/audit.d.ts +3 -0
- package/dist/tools/audit.d.ts.map +1 -0
- package/dist/tools/audit.js +34 -0
- package/dist/tools/audit.js.map +1 -0
- package/dist/tools/employers.d.ts.map +1 -1
- package/dist/tools/employers.js +17 -29
- package/dist/tools/employers.js.map +1 -1
- package/dist/tools/export.d.ts +3 -0
- package/dist/tools/export.d.ts.map +1 -0
- package/dist/tools/export.js +247 -0
- package/dist/tools/export.js.map +1 -0
- package/dist/tools/extract.d.ts +3 -0
- package/dist/tools/extract.d.ts.map +1 -0
- package/dist/tools/extract.js +208 -0
- package/dist/tools/extract.js.map +1 -0
- package/dist/tools/find.js +1 -1
- package/dist/tools/find.js.map +1 -1
- package/dist/tools/patch.d.ts +10 -0
- package/dist/tools/patch.d.ts.map +1 -0
- package/dist/tools/patch.js +276 -0
- package/dist/tools/patch.js.map +1 -0
- package/dist/tools/program-keys.d.ts +3 -0
- package/dist/tools/program-keys.d.ts.map +1 -0
- package/dist/tools/program-keys.js +13 -0
- package/dist/tools/program-keys.js.map +1 -0
- package/dist/tools/system.d.ts +3 -0
- package/dist/tools/system.d.ts.map +1 -0
- package/dist/tools/system.js +84 -0
- package/dist/tools/system.js.map +1 -0
- package/dist/tools/validate.d.ts +3 -0
- package/dist/tools/validate.d.ts.map +1 -0
- package/dist/tools/validate.js +68 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/tools/write.d.ts +4 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +786 -0
- package/dist/tools/write.js.map +1 -0
- package/package.json +7 -3
- package/server.json +67 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { makeApiRequest, handleApiError } from "../services/api-client.js";
|
|
3
|
+
import { getProgramLookupKeys } from "./program-keys.js";
|
|
4
|
+
// ============================================================================
|
|
5
|
+
// Input Schemas
|
|
6
|
+
// ============================================================================
|
|
7
|
+
const PatchPersonSchema = z.object({
|
|
8
|
+
person_id: z.string().describe("Person (applicant) MongoDB ObjectId."),
|
|
9
|
+
updates: z.record(z.unknown()).describe("Partial update dict matching the applicant model fields. " +
|
|
10
|
+
"Use dot-notation keys for nested fields (e.g. personal.first_name)."),
|
|
11
|
+
expected_version: z.number().optional().describe("Optimistic locking version. Include to prevent overwriting concurrent changes."),
|
|
12
|
+
}).strict();
|
|
13
|
+
const PatchApplicationCaseSchema = z.object({
|
|
14
|
+
application_id: z.string().describe("Application MongoDB ObjectId."),
|
|
15
|
+
program_key: z.string().describe("Program key — used to route to the correct PATCH endpoint."),
|
|
16
|
+
updates: z.record(z.unknown()).describe("Partial update dict. Keys must match the application model fields."),
|
|
17
|
+
expected_version: z.number().optional().describe("Optimistic locking version."),
|
|
18
|
+
}).strict();
|
|
19
|
+
const PatchEmployerSchema = z.object({
|
|
20
|
+
employer_id: z.string().describe("LMIA employer MongoDB ObjectId."),
|
|
21
|
+
updates: z.record(z.unknown()).describe("Partial update dict matching the LMIAEmployer model fields."),
|
|
22
|
+
}).strict();
|
|
23
|
+
const AddNoteSchema = z.object({
|
|
24
|
+
entity_id: z.string().describe("Entity MongoDB ObjectId."),
|
|
25
|
+
entity_type: z.enum(["applicant", "application", "employer"]).describe("Entity type to add a note to."),
|
|
26
|
+
note: z.string().describe("Note text to append."),
|
|
27
|
+
}).strict();
|
|
28
|
+
const ValidatePersonForProgramSchema = z.object({
|
|
29
|
+
person_id: z.string().describe("Applicant MongoDB ObjectId."),
|
|
30
|
+
program_key: z.string().describe("Program key to validate against."),
|
|
31
|
+
role: z.string().describe("Role within the program (applicant|spouse|sponsor|employer etc)."),
|
|
32
|
+
}).strict();
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// Helpers
|
|
35
|
+
// ============================================================================
|
|
36
|
+
async function getFormIdForRole(program_key, role) {
|
|
37
|
+
try {
|
|
38
|
+
for (const lookupKey of getProgramLookupKeys(program_key)) {
|
|
39
|
+
try {
|
|
40
|
+
const prog = await makeApiRequest(`/api/programs/${encodeURIComponent(lookupKey)}`, "GET");
|
|
41
|
+
const formId = prog.form_ids?.[role] ?? prog.form_ids?.applicant ?? null;
|
|
42
|
+
if (formId)
|
|
43
|
+
return formId;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export async function getProgramInfo(program_key) {
|
|
56
|
+
for (const lookupKey of getProgramLookupKeys(program_key)) {
|
|
57
|
+
try {
|
|
58
|
+
const prog = await makeApiRequest(`/api/programs/${encodeURIComponent(lookupKey)}`, "GET");
|
|
59
|
+
if (prog.api_endpoint && prog.category) {
|
|
60
|
+
return {
|
|
61
|
+
api_endpoint: prog.api_endpoint,
|
|
62
|
+
category: prog.category,
|
|
63
|
+
form_ids: prog.form_ids,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
export function buildApplicationPatchUrl(api_endpoint, category, application_id) {
|
|
74
|
+
// LMIA: /api/lmia/{stream}/applications/{id}
|
|
75
|
+
// TR/PR: /api/tr|pr/{endpoint}/{id}
|
|
76
|
+
if (category === "LMIA") {
|
|
77
|
+
return `${api_endpoint}/applications/${encodeURIComponent(application_id)}`;
|
|
78
|
+
}
|
|
79
|
+
return `${api_endpoint}/${encodeURIComponent(application_id)}`;
|
|
80
|
+
}
|
|
81
|
+
export function expandDotNotation(updates) {
|
|
82
|
+
const expanded = {};
|
|
83
|
+
for (const [key, value] of Object.entries(updates)) {
|
|
84
|
+
if (!key.includes(".")) {
|
|
85
|
+
expanded[key] = value;
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
const parts = key.split(".").filter(Boolean);
|
|
89
|
+
if (parts.length === 0)
|
|
90
|
+
continue;
|
|
91
|
+
let cursor = expanded;
|
|
92
|
+
for (const part of parts.slice(0, -1)) {
|
|
93
|
+
const existing = cursor[part];
|
|
94
|
+
if (!existing || typeof existing !== "object" || Array.isArray(existing)) {
|
|
95
|
+
cursor[part] = {};
|
|
96
|
+
}
|
|
97
|
+
cursor = cursor[part];
|
|
98
|
+
}
|
|
99
|
+
cursor[parts[parts.length - 1]] = value;
|
|
100
|
+
}
|
|
101
|
+
return expanded;
|
|
102
|
+
}
|
|
103
|
+
/** Look up the PATCH URL for an application by matching its program_name against /api/programs. */
|
|
104
|
+
async function getApplicationPatchUrl(application_id) {
|
|
105
|
+
try {
|
|
106
|
+
const app = await makeApiRequest(`/api/applications/${encodeURIComponent(application_id)}`, "GET");
|
|
107
|
+
if (!app.program_name)
|
|
108
|
+
return null;
|
|
109
|
+
const programs = await makeApiRequest("/api/programs", "GET");
|
|
110
|
+
for (const prog of Object.values(programs)) {
|
|
111
|
+
if (prog.db_name === app.program_name && prog.api_endpoint && prog.category) {
|
|
112
|
+
return buildApplicationPatchUrl(prog.api_endpoint, prog.category, application_id);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// ============================================================================
|
|
122
|
+
// Tool Registration
|
|
123
|
+
// ============================================================================
|
|
124
|
+
export function registerPatchTools(server) {
|
|
125
|
+
// 1. patch_person
|
|
126
|
+
server.registerTool("patch_person", {
|
|
127
|
+
title: "Patch Person (Applicant)",
|
|
128
|
+
description: "Partially update an applicant's data. Sends only the provided fields — other fields are unchanged. " +
|
|
129
|
+
"Provide expected_version to use optimistic locking (recommended when multiple agents may edit). " +
|
|
130
|
+
"Returns the updated applicant object.",
|
|
131
|
+
inputSchema: PatchPersonSchema.shape,
|
|
132
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
|
|
133
|
+
}, async ({ person_id, updates, expected_version }) => {
|
|
134
|
+
try {
|
|
135
|
+
const params = { skip_validation: false };
|
|
136
|
+
if (expected_version !== undefined) {
|
|
137
|
+
params.if_match = expected_version;
|
|
138
|
+
}
|
|
139
|
+
const url = `/api/applicants/${encodeURIComponent(person_id)}`;
|
|
140
|
+
const data = await makeApiRequest(url, "PATCH", expandDotNotation(updates), {
|
|
141
|
+
...params,
|
|
142
|
+
skip_validation: true,
|
|
143
|
+
});
|
|
144
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
return { isError: true, content: [{ type: "text", text: handleApiError(error) }] };
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
// 2. patch_application_case
|
|
151
|
+
server.registerTool("patch_application_case", {
|
|
152
|
+
title: "Patch Application / Case",
|
|
153
|
+
description: "Partially update an application or LMIA case. " +
|
|
154
|
+
"Dispatches to the unified applications PATCH endpoint. " +
|
|
155
|
+
"Optionally include expected_version for optimistic locking. " +
|
|
156
|
+
"Returns the updated application object.",
|
|
157
|
+
inputSchema: PatchApplicationCaseSchema.shape,
|
|
158
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
|
|
159
|
+
}, async ({ application_id, program_key, updates, expected_version }) => {
|
|
160
|
+
try {
|
|
161
|
+
const progInfo = await getProgramInfo(program_key);
|
|
162
|
+
if (!progInfo) {
|
|
163
|
+
return {
|
|
164
|
+
isError: true,
|
|
165
|
+
content: [{ type: "text", text: `Error: Unknown program_key '${program_key}'. Use list_programs to find valid keys.` }],
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
const params = { skip_validation: true };
|
|
169
|
+
if (expected_version !== undefined) {
|
|
170
|
+
params.if_match = expected_version;
|
|
171
|
+
}
|
|
172
|
+
const url = buildApplicationPatchUrl(progInfo.api_endpoint, progInfo.category, application_id);
|
|
173
|
+
const data = await makeApiRequest(url, "PATCH", updates, params);
|
|
174
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
return { isError: true, content: [{ type: "text", text: handleApiError(error) }] };
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
// 3. patch_employer
|
|
181
|
+
server.registerTool("patch_employer", {
|
|
182
|
+
title: "Patch LMIA Employer",
|
|
183
|
+
description: "Partially update an LMIA employer record. " +
|
|
184
|
+
"Only the provided fields are updated. " +
|
|
185
|
+
"Returns the updated employer object.",
|
|
186
|
+
inputSchema: PatchEmployerSchema.shape,
|
|
187
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
|
|
188
|
+
}, async ({ employer_id, updates }) => {
|
|
189
|
+
try {
|
|
190
|
+
const url = `/api/lmia/employers/${encodeURIComponent(employer_id)}`;
|
|
191
|
+
const data = await makeApiRequest(url, "PATCH", updates);
|
|
192
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
return { isError: true, content: [{ type: "text", text: handleApiError(error) }] };
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
// 4. add_note
|
|
199
|
+
server.registerTool("add_note", {
|
|
200
|
+
title: "Add Note to Entity",
|
|
201
|
+
description: "Append a text note to an applicant, application, or employer. " +
|
|
202
|
+
"Uses PATCH to add the note to the entity's notes array. " +
|
|
203
|
+
"Returns the updated entity.",
|
|
204
|
+
inputSchema: AddNoteSchema.shape,
|
|
205
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
|
|
206
|
+
}, async ({ entity_id, entity_type, note }) => {
|
|
207
|
+
try {
|
|
208
|
+
// Backend's `notes` field is a string (not array). Read current value
|
|
209
|
+
// and append the new note with a timestamp separator.
|
|
210
|
+
let getUrl;
|
|
211
|
+
let patchUrl;
|
|
212
|
+
let patchParams;
|
|
213
|
+
if (entity_type === "applicant") {
|
|
214
|
+
getUrl = `/api/applicants/${encodeURIComponent(entity_id)}`;
|
|
215
|
+
patchUrl = getUrl;
|
|
216
|
+
patchParams = { skip_validation: true };
|
|
217
|
+
}
|
|
218
|
+
else if (entity_type === "application") {
|
|
219
|
+
getUrl = `/api/applications/${encodeURIComponent(entity_id)}`;
|
|
220
|
+
const appPatchUrl = await getApplicationPatchUrl(entity_id);
|
|
221
|
+
if (!appPatchUrl) {
|
|
222
|
+
return {
|
|
223
|
+
isError: true,
|
|
224
|
+
content: [{ type: "text", text: `Error: Could not resolve PATCH URL for application '${entity_id}'. Ensure the application exists.` }],
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
patchUrl = appPatchUrl;
|
|
228
|
+
patchParams = { skip_validation: true };
|
|
229
|
+
}
|
|
230
|
+
else if (entity_type === "employer") {
|
|
231
|
+
getUrl = `/api/lmia/employers/${encodeURIComponent(entity_id)}`;
|
|
232
|
+
patchUrl = getUrl;
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
return {
|
|
236
|
+
isError: true,
|
|
237
|
+
content: [{ type: "text", text: `Error: Unknown entity_type '${entity_type}'.` }],
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
const current = await makeApiRequest(getUrl, "GET");
|
|
241
|
+
const timestamp = new Date().toISOString();
|
|
242
|
+
const newNote = `[${timestamp}] ${note}`;
|
|
243
|
+
const combinedNotes = current.notes ? `${current.notes}\n${newNote}` : newNote;
|
|
244
|
+
const data = await makeApiRequest(patchUrl, "PATCH", { notes: combinedNotes }, patchParams);
|
|
245
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
return { isError: true, content: [{ type: "text", text: handleApiError(error) }] };
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
// 5. validate_person_for_program
|
|
252
|
+
server.registerTool("validate_person_for_program", {
|
|
253
|
+
title: "Validate Person for Program",
|
|
254
|
+
description: "Run validation on a saved applicant for a specific program and role. " +
|
|
255
|
+
"Returns validation errors with field paths, error types, and fix suggestions. " +
|
|
256
|
+
"Use after editing a person to confirm they are ready for form filling.",
|
|
257
|
+
inputSchema: ValidatePersonForProgramSchema.shape,
|
|
258
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: false, openWorldHint: false },
|
|
259
|
+
}, async ({ person_id, program_key, role }) => {
|
|
260
|
+
try {
|
|
261
|
+
const form_id = await getFormIdForRole(program_key, role);
|
|
262
|
+
if (!form_id) {
|
|
263
|
+
return {
|
|
264
|
+
isError: true,
|
|
265
|
+
content: [{ type: "text", text: `Unknown program_key '${program_key}' or role '${role}'. Use list_programs to find valid program keys and roles.` }],
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
const data = await makeApiRequest(`/api/validate/${encodeURIComponent(form_id)}/${encodeURIComponent(person_id)}`, "POST", {});
|
|
269
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
return { isError: true, content: [{ type: "text", text: handleApiError(error) }] };
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=patch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/tools/patch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program-keys.d.ts","sourceRoot":"","sources":["../../src/tools/program-keys.ts"],"names":[],"mappings":"AAKA,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAGjE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const PROGRAM_KEY_ALIASES = {
|
|
2
|
+
pgp: "parent-sponsorship",
|
|
3
|
+
sps: "spouse-sponsorship",
|
|
4
|
+
};
|
|
5
|
+
export function normalizeProgramKey(programKey) {
|
|
6
|
+
const key = programKey.trim().toLowerCase();
|
|
7
|
+
return PROGRAM_KEY_ALIASES[key] ?? programKey;
|
|
8
|
+
}
|
|
9
|
+
export function getProgramLookupKeys(programKey) {
|
|
10
|
+
const normalized = normalizeProgramKey(programKey);
|
|
11
|
+
return normalized === programKey ? [programKey] : [programKey, normalized];
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=program-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program-keys.js","sourceRoot":"","sources":["../../src/tools/program-keys.ts"],"names":[],"mappings":"AAAA,MAAM,mBAAmB,GAA2B;IAClD,GAAG,EAAE,oBAAoB;IACzB,GAAG,EAAE,oBAAoB;CAC1B,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,OAAO,mBAAmB,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,UAAkB;IACrD,MAAM,UAAU,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACnD,OAAO,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC7E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../src/tools/system.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAapE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+F3D"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { makeApiRequest, handleApiError } from "../services/api-client.js";
|
|
3
|
+
import { normalizeProgramKey } from "./program-keys.js";
|
|
4
|
+
const EmptySchema = z.object({}).strict();
|
|
5
|
+
const ProgramKeySchema = z.object({
|
|
6
|
+
program_key: z.string().describe("Program key e.g. 'spouse-sponsorship', 'sp-out', 'lws'"),
|
|
7
|
+
}).strict();
|
|
8
|
+
const SchemaQuerySchema = z.object({
|
|
9
|
+
program_key: z.string(),
|
|
10
|
+
role: z.enum(["applicant", "spouse", "dependent", "sponsor", "co_signer", "employer"]),
|
|
11
|
+
}).strict();
|
|
12
|
+
export function registerSystemTools(server) {
|
|
13
|
+
server.registerTool("list_programs", {
|
|
14
|
+
title: "List FormBro Programs",
|
|
15
|
+
description: "List all 16 FormBro programs (TR/PR/LMIA). Returns program_key, display_name, category, person_roles, form_ids, api_endpoint. Call first to discover available programs.",
|
|
16
|
+
inputSchema: EmptySchema,
|
|
17
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
18
|
+
}, async () => {
|
|
19
|
+
try {
|
|
20
|
+
const data = await makeApiRequest("/api/programs", "GET");
|
|
21
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
return { isError: true, content: [{ type: "text", text: handleApiError(error) }] };
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
server.registerTool("describe_program", {
|
|
28
|
+
title: "Describe a FormBro Program",
|
|
29
|
+
description: "Get one program's full metadata by program_key. Returns person_roles (which entities are required/optional), form_ids, api_endpoint. Call before quick_create_person to know which roles are needed.",
|
|
30
|
+
inputSchema: ProgramKeySchema,
|
|
31
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
32
|
+
}, async ({ program_key }) => {
|
|
33
|
+
try {
|
|
34
|
+
const data = await makeApiRequest(`/api/programs/${encodeURIComponent(normalizeProgramKey(program_key))}`, "GET");
|
|
35
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
return { isError: true, content: [{ type: "text", text: handleApiError(error) }] };
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
server.registerTool("describe_person_schema", {
|
|
42
|
+
title: "Get JSON Schema for Program Role",
|
|
43
|
+
description: "Get JSON Schema for a (program_key, role) pair — shows exactly which fields are required/optional. Use before quick_create_person.",
|
|
44
|
+
inputSchema: SchemaQuerySchema,
|
|
45
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
46
|
+
}, async ({ program_key, role }) => {
|
|
47
|
+
try {
|
|
48
|
+
const data = await makeApiRequest(`/api/programs/${encodeURIComponent(normalizeProgramKey(program_key))}/schema`, "GET", undefined, { role });
|
|
49
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
return { isError: true, content: [{ type: "text", text: handleApiError(error) }] };
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
server.registerTool("whoami", {
|
|
56
|
+
title: "Who Am I",
|
|
57
|
+
description: "Identify the current authenticated user/token: returns user_id, scopes, plan. Use to verify token works before further operations.",
|
|
58
|
+
inputSchema: EmptySchema,
|
|
59
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
60
|
+
}, async () => {
|
|
61
|
+
try {
|
|
62
|
+
const data = await makeApiRequest("/api/auth/whoami", "GET");
|
|
63
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
return { isError: true, content: [{ type: "text", text: handleApiError(error) }] };
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
server.registerTool("health", {
|
|
70
|
+
title: "FormBro Health Check",
|
|
71
|
+
description: "Check FormBro service health (api_version, db_status, build_sha).",
|
|
72
|
+
inputSchema: EmptySchema,
|
|
73
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
74
|
+
}, async () => {
|
|
75
|
+
try {
|
|
76
|
+
const data = await makeApiRequest("/health", "GET");
|
|
77
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
return { isError: true, content: [{ type: "text", text: handleApiError(error) }] };
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system.js","sourceRoot":"","sources":["../../src/tools/system.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/tools/validate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuBpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2D7D"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { makeApiRequest, handleApiError } from "../services/api-client.js";
|
|
3
|
+
const ValidateDataSchema = z.object({
|
|
4
|
+
entity_type: z.string().describe("Form ID e.g. 'tr-sp-out-applicant', 'pr-spouse-sponsorship-applicant'"),
|
|
5
|
+
data: z.record(z.unknown()).describe("Entity data to validate"),
|
|
6
|
+
tab: z.string().optional().describe("Validate only a specific tab"),
|
|
7
|
+
}).strict();
|
|
8
|
+
const ValidateByIdSchema = z.object({
|
|
9
|
+
entity_type: z.string().describe("Form ID e.g. 'tr-visa-out-applicant', 'pr-general-applicant', 'lmia-employer'. Use list_programs to find the correct form_id."),
|
|
10
|
+
entity_id: z.string().describe("MongoDB ObjectId of the entity"),
|
|
11
|
+
tab: z.string().optional(),
|
|
12
|
+
}).strict();
|
|
13
|
+
const ValidateOperationSchema = z.object({
|
|
14
|
+
operation: z.enum(["fill_webform", "fill_webform_tr", "generate_pdf", "generate_pdf_tr", "make_appendix", "fill_supplementary_pdfs"]),
|
|
15
|
+
entity_type: z.string().describe("Form ID for the entity"),
|
|
16
|
+
entity_id: z.string().optional(),
|
|
17
|
+
entity_data: z.record(z.unknown()).optional(),
|
|
18
|
+
}).strict();
|
|
19
|
+
export function registerValidateTools(server) {
|
|
20
|
+
server.registerTool("validate_entity_data", {
|
|
21
|
+
title: "Validate Entity Data",
|
|
22
|
+
description: "Validate unsaved entity data (no DB lookup). Returns errors with field path, type, and source.",
|
|
23
|
+
inputSchema: ValidateDataSchema,
|
|
24
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: false, openWorldHint: false },
|
|
25
|
+
}, async ({ entity_type, data, tab }) => {
|
|
26
|
+
try {
|
|
27
|
+
const url = tab
|
|
28
|
+
? `/api/validate/${encodeURIComponent(entity_type)}?tab=${encodeURIComponent(tab)}`
|
|
29
|
+
: `/api/validate/${encodeURIComponent(entity_type)}`;
|
|
30
|
+
const result = await makeApiRequest(url, "POST", data);
|
|
31
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
return { isError: true, content: [{ type: "text", text: handleApiError(error) }] };
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
server.registerTool("validate_entity_by_id", {
|
|
38
|
+
title: "Validate Entity by ID",
|
|
39
|
+
description: "Validate an entity loaded from DB by ID. Use after PATCH or to check current state.",
|
|
40
|
+
inputSchema: ValidateByIdSchema,
|
|
41
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: false, openWorldHint: false },
|
|
42
|
+
}, async ({ entity_type, entity_id, tab }) => {
|
|
43
|
+
try {
|
|
44
|
+
const base = `/api/validate/${encodeURIComponent(entity_type)}/${encodeURIComponent(entity_id)}`;
|
|
45
|
+
const url = tab ? `${base}?tab=${encodeURIComponent(tab)}` : base;
|
|
46
|
+
const result = await makeApiRequest(url, "POST", {});
|
|
47
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
return { isError: true, content: [{ type: "text", text: handleApiError(error) }] };
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
server.registerTool("validate_for_operation", {
|
|
54
|
+
title: "Validate for Operation",
|
|
55
|
+
description: "Check prerequisites for fill_webform, generate_pdf, etc. before triggering the operation. Returns validation errors and missing prerequisites.",
|
|
56
|
+
inputSchema: ValidateOperationSchema,
|
|
57
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: false, openWorldHint: false },
|
|
58
|
+
}, async (args) => {
|
|
59
|
+
try {
|
|
60
|
+
const result = await makeApiRequest("/api/validate/operation", "POST", args);
|
|
61
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
return { isError: true, content: [{ type: "text", text: handleApiError(error) }] };
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/tools/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
export declare function buildStartApplicationBody(applicant_id?: string): Record<string, unknown>;
|
|
3
|
+
export declare function registerWriteTools(server: McpServer): void;
|
|
4
|
+
//# sourceMappingURL=write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmIpE,wBAAgB,yBAAyB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGxF;AA6RD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgf1D"}
|