formbro-mcp-server 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.
Files changed (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +166 -0
  3. package/dist/constants.d.ts +9 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/constants.js +15 -0
  6. package/dist/constants.js.map +1 -0
  7. package/dist/index.d.ts +15 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +299 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/schemas/common.d.ts +77 -0
  12. package/dist/schemas/common.d.ts.map +1 -0
  13. package/dist/schemas/common.js +42 -0
  14. package/dist/schemas/common.js.map +1 -0
  15. package/dist/services/api-client.d.ts +38 -0
  16. package/dist/services/api-client.d.ts.map +1 -0
  17. package/dist/services/api-client.js +125 -0
  18. package/dist/services/api-client.js.map +1 -0
  19. package/dist/tools/applicants.d.ts +6 -0
  20. package/dist/tools/applicants.d.ts.map +1 -0
  21. package/dist/tools/applicants.js +261 -0
  22. package/dist/tools/applicants.js.map +1 -0
  23. package/dist/tools/applications.d.ts +6 -0
  24. package/dist/tools/applications.d.ts.map +1 -0
  25. package/dist/tools/applications.js +225 -0
  26. package/dist/tools/applications.js.map +1 -0
  27. package/dist/tools/employers.d.ts +6 -0
  28. package/dist/tools/employers.d.ts.map +1 -0
  29. package/dist/tools/employers.js +243 -0
  30. package/dist/tools/employers.js.map +1 -0
  31. package/dist/tools/find.d.ts +6 -0
  32. package/dist/tools/find.d.ts.map +1 -0
  33. package/dist/tools/find.js +122 -0
  34. package/dist/tools/find.js.map +1 -0
  35. package/dist/types.d.ts +86 -0
  36. package/dist/types.d.ts.map +1 -0
  37. package/dist/types.js +3 -0
  38. package/dist/types.js.map +1 -0
  39. package/package.json +54 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/schemas/common.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAE5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE3E,oBAAoB;AACpB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;SACd,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,SAAS,CAAC;SACd,OAAO,CAAC,aAAa,CAAC;SACtB,QAAQ,CAAC,0DAA0D,CAAC;IACvE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;SACf,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,OAAO,CAAC,CAAC,CAAC;SACV,QAAQ,CAAC,0CAA0C,CAAC;CACxD,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,yBAAyB;AACzB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,eAAe,EAAE,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC;SAC1C,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC;SAChC,QAAQ,CAAC,6EAA6E,CAAC;CAC3F,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,wCAAwC;AACxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAE9E,sBAAsB;AACtB,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;SACX,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,0CAA0C,CAAC;CACxD,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,wBAAwB;AACxB,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAEvE,gBAAgB;AAChB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;SACf,QAAQ,EAAE;SACV,QAAQ,CAAC,6DAA6D,CAAC;CAC3E,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,0BAA0B;AAC1B,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { AxiosInstance } from "axios";
2
+ /**
3
+ * Initialize the default API client (for STDIO mode)
4
+ */
5
+ export declare function initializeApiClient(baseUrl: string, token: string): void;
6
+ /**
7
+ * Set base URL for HTTP mode (without token)
8
+ */
9
+ export declare function setBaseUrl(baseUrl: string): void;
10
+ /**
11
+ * Create an API client for a specific request with its own token
12
+ */
13
+ export declare function createApiClientWithToken(token: string): AxiosInstance;
14
+ /**
15
+ * Run a function with a specific API client in context
16
+ */
17
+ export declare function runWithApiClient<T>(apiClient: AxiosInstance, fn: () => T): T;
18
+ /**
19
+ * Get the API client for current request context
20
+ */
21
+ export declare function getApiClient(): AxiosInstance;
22
+ /**
23
+ * Make an API request to FormBro backend
24
+ */
25
+ export declare function makeApiRequest<T>(endpoint: string, method?: "GET" | "POST" | "PUT" | "PATCH" | "DELETE", data?: unknown, params?: Record<string, unknown>): Promise<T>;
26
+ /**
27
+ * Handle API errors and return user-friendly messages
28
+ */
29
+ export declare function handleApiError(error: unknown): string;
30
+ /**
31
+ * Check if the API client is properly configured
32
+ */
33
+ export declare function isApiClientConfigured(): boolean;
34
+ /**
35
+ * Get the base URL
36
+ */
37
+ export declare function getBaseUrl(): string | null;
38
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/services/api-client.ts"],"names":[],"mappings":"AAEA,OAAc,EAAE,aAAa,EAAc,MAAM,OAAO,CAAC;AAUzD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAWxE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAarE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAE5E;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,aAAa,CAW5C;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,CAAC,EACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAgB,EAC3D,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC,CASZ;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CA6BrD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAE1C"}
@@ -0,0 +1,125 @@
1
+ // FormBro API Client with Token Authentication
2
+ import axios, { AxiosError } from "axios";
3
+ import { API_TIMEOUT } from "../constants.js";
4
+ let defaultApiClient = null;
5
+ let defaultBaseUrl = null;
6
+ // AsyncLocalStorage for per-request API client
7
+ import { AsyncLocalStorage } from "async_hooks";
8
+ const requestContext = new AsyncLocalStorage();
9
+ /**
10
+ * Initialize the default API client (for STDIO mode)
11
+ */
12
+ export function initializeApiClient(baseUrl, token) {
13
+ defaultBaseUrl = baseUrl.replace(/\/$/, "");
14
+ defaultApiClient = axios.create({
15
+ baseURL: defaultBaseUrl,
16
+ timeout: API_TIMEOUT,
17
+ headers: {
18
+ "Content-Type": "application/json",
19
+ "Accept": "application/json",
20
+ "Authorization": `Bearer ${token}`
21
+ }
22
+ });
23
+ }
24
+ /**
25
+ * Set base URL for HTTP mode (without token)
26
+ */
27
+ export function setBaseUrl(baseUrl) {
28
+ defaultBaseUrl = baseUrl.replace(/\/$/, "");
29
+ }
30
+ /**
31
+ * Create an API client for a specific request with its own token
32
+ */
33
+ export function createApiClientWithToken(token) {
34
+ if (!defaultBaseUrl) {
35
+ throw new Error("API base URL not configured. Set FORMBRO_API_URL environment variable.");
36
+ }
37
+ return axios.create({
38
+ baseURL: defaultBaseUrl,
39
+ timeout: API_TIMEOUT,
40
+ headers: {
41
+ "Content-Type": "application/json",
42
+ "Accept": "application/json",
43
+ "Authorization": `Bearer ${token}`
44
+ }
45
+ });
46
+ }
47
+ /**
48
+ * Run a function with a specific API client in context
49
+ */
50
+ export function runWithApiClient(apiClient, fn) {
51
+ return requestContext.run({ apiClient }, fn);
52
+ }
53
+ /**
54
+ * Get the API client for current request context
55
+ */
56
+ export function getApiClient() {
57
+ const store = requestContext.getStore();
58
+ if (store?.apiClient) {
59
+ return store.apiClient;
60
+ }
61
+ if (!defaultApiClient) {
62
+ throw new Error("API client not initialized. For HTTP mode, include Authorization header. For STDIO mode, set FORMBRO_API_TOKEN.");
63
+ }
64
+ return defaultApiClient;
65
+ }
66
+ /**
67
+ * Make an API request to FormBro backend
68
+ */
69
+ export async function makeApiRequest(endpoint, method = "GET", data, params) {
70
+ const client = getApiClient();
71
+ const response = await client.request({
72
+ method,
73
+ url: endpoint,
74
+ data,
75
+ params
76
+ });
77
+ return response.data;
78
+ }
79
+ /**
80
+ * Handle API errors and return user-friendly messages
81
+ */
82
+ export function handleApiError(error) {
83
+ if (error instanceof AxiosError) {
84
+ if (error.response) {
85
+ const status = error.response.status;
86
+ const detail = error.response.data?.detail || error.response.data?.message;
87
+ switch (status) {
88
+ case 401:
89
+ return "Error: Authentication failed. Please check your FORMBRO_API_TOKEN is valid.";
90
+ case 403:
91
+ return "Error: Permission denied. You don't have access to this resource.";
92
+ case 404:
93
+ return `Error: Resource not found. ${detail || "Please check the ID is correct."}`;
94
+ case 422:
95
+ return `Error: Invalid request. ${detail || "Please check your parameters."}`;
96
+ case 429:
97
+ return "Error: Rate limit exceeded. Please wait before making more requests.";
98
+ case 500:
99
+ return "Error: FormBro server error. Please try again later.";
100
+ default:
101
+ return `Error: API request failed with status ${status}. ${detail || ""}`;
102
+ }
103
+ }
104
+ else if (error.code === "ECONNABORTED") {
105
+ return "Error: Request timed out. Please try again.";
106
+ }
107
+ else if (error.code === "ECONNREFUSED") {
108
+ return "Error: Could not connect to FormBro server. Please check FORMBRO_API_URL.";
109
+ }
110
+ }
111
+ return `Error: Unexpected error occurred: ${error instanceof Error ? error.message : String(error)}`;
112
+ }
113
+ /**
114
+ * Check if the API client is properly configured
115
+ */
116
+ export function isApiClientConfigured() {
117
+ return defaultApiClient !== null || defaultBaseUrl !== null;
118
+ }
119
+ /**
120
+ * Get the base URL
121
+ */
122
+ export function getBaseUrl() {
123
+ return defaultBaseUrl;
124
+ }
125
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/services/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Register applicant tools with the MCP server
4
+ */
5
+ export declare function registerApplicantTools(server: McpServer): void;
6
+ //# sourceMappingURL=applicants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applicants.d.ts","sourceRoot":"","sources":["../../src/tools/applicants.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8FpE;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqM9D"}
@@ -0,0 +1,261 @@
1
+ // Applicant Tools for FormBro MCP Server
2
+ import { z } from "zod";
3
+ import { makeApiRequest, handleApiError } from "../services/api-client.js";
4
+ import { ListWithSearchSchema, IdWithFormatSchema } from "../schemas/common.js";
5
+ import { ResponseFormat, CHARACTER_LIMIT } from "../constants.js";
6
+ // Extended schema for listing applicants
7
+ const ListApplicantsSchema = ListWithSearchSchema.extend({
8
+ program: z.string()
9
+ .optional()
10
+ .describe("Filter by program type (e.g., 'tr', 'pr', 'lmia')")
11
+ }).strict();
12
+ /**
13
+ * Format applicant list item as Markdown (flattened structure from list endpoint)
14
+ */
15
+ function formatApplicantListItemMarkdown(applicant) {
16
+ const lines = [];
17
+ const name = `${applicant.first_name || ""} ${applicant.last_name || ""}`.trim() || "Unknown";
18
+ lines.push(`## ${name} (${applicant.id})`);
19
+ lines.push("");
20
+ if (applicant.email)
21
+ lines.push(`- **Email**: ${applicant.email}`);
22
+ if (applicant.phone)
23
+ lines.push(`- **Phone**: ${applicant.phone}`);
24
+ if (applicant.dob)
25
+ lines.push(`- **DOB**: ${applicant.dob}`);
26
+ if (applicant.identifier)
27
+ lines.push(`- **Identifier**: ${applicant.identifier}`);
28
+ lines.push("");
29
+ lines.push(`- **Status**: ${applicant.is_active ? "Active" : "Deleted"}`);
30
+ lines.push(`- **Created**: ${applicant.created_date}`);
31
+ return lines.join("\n");
32
+ }
33
+ /**
34
+ * Format full applicant data as Markdown (nested structure from detail endpoint)
35
+ */
36
+ function formatApplicantMarkdown(applicant) {
37
+ const lines = [];
38
+ const personal = applicant.personal || {};
39
+ lines.push(`## ${personal.first_name || ""} ${personal.last_name || ""} (${applicant.id})`);
40
+ lines.push("");
41
+ if (personal.email)
42
+ lines.push(`- **Email**: ${personal.email}`);
43
+ if (personal.phone)
44
+ lines.push(`- **Phone**: ${personal.phone}`);
45
+ if (personal.dob)
46
+ lines.push(`- **Date of Birth**: ${personal.dob}`);
47
+ if (personal.sex)
48
+ lines.push(`- **Sex**: ${personal.sex}`);
49
+ if (personal.country_of_birth)
50
+ lines.push(`- **Country of Birth**: ${personal.country_of_birth}`);
51
+ if (personal.city_of_birth)
52
+ lines.push(`- **City of Birth**: ${personal.city_of_birth}`);
53
+ if (personal.citizenship?.length) {
54
+ lines.push(`- **Citizenship**: ${personal.citizenship.join(", ")}`);
55
+ }
56
+ lines.push("");
57
+ lines.push(`- **Status**: ${applicant.is_active ? "Active" : "Deleted"}`);
58
+ lines.push(`- **Created**: ${applicant.created_date}`);
59
+ if (applicant.last_modified_date) {
60
+ lines.push(`- **Last Modified**: ${applicant.last_modified_date}`);
61
+ }
62
+ lines.push(`- **Version**: ${applicant.version}`);
63
+ return lines.join("\n");
64
+ }
65
+ /**
66
+ * Format applicant list as Markdown
67
+ */
68
+ function formatApplicantsListMarkdown(applicants, total, offset) {
69
+ const lines = [
70
+ "# Applicants List",
71
+ "",
72
+ `Found ${total} applicants (showing ${applicants.length} from offset ${offset})`,
73
+ ""
74
+ ];
75
+ for (const applicant of applicants) {
76
+ lines.push(formatApplicantListItemMarkdown(applicant));
77
+ lines.push("---");
78
+ lines.push("");
79
+ }
80
+ return lines.join("\n");
81
+ }
82
+ /**
83
+ * Register applicant tools with the MCP server
84
+ */
85
+ export function registerApplicantTools(server) {
86
+ // List Applicants Tool
87
+ server.registerTool("formbro_list_applicants", {
88
+ title: "List FormBro Applicants",
89
+ description: `List applicants in the FormBro immigration management system.
90
+
91
+ This tool retrieves a paginated list of applicants with their personal information,
92
+ contact details, and metadata. Supports filtering by search query and program type.
93
+
94
+ Args:
95
+ - limit (number): Maximum results to return, 1-100 (default: 20)
96
+ - offset (number): Number of results to skip for pagination (default: 0)
97
+ - search (string, optional): Search query to filter by name, email, etc.
98
+ - program (string, optional): Filter by program type ('tr', 'pr', 'lmia')
99
+ - response_format ('markdown' | 'json'): Output format (default: 'markdown')
100
+
101
+ Returns:
102
+ Paginated list of applicants with personal information, contact details, and status.
103
+
104
+ Examples:
105
+ - "List all applicants" -> params: {}
106
+ - "Find applicants named John" -> params: { search: "John" }
107
+ - "Get PR program applicants" -> params: { program: "pr" }`,
108
+ inputSchema: ListApplicantsSchema,
109
+ annotations: {
110
+ readOnlyHint: true,
111
+ destructiveHint: false,
112
+ idempotentHint: true,
113
+ openWorldHint: true
114
+ }
115
+ }, async (params) => {
116
+ try {
117
+ const queryParams = {
118
+ skip: params.offset,
119
+ limit: params.limit
120
+ };
121
+ if (params.search)
122
+ queryParams.search = params.search;
123
+ if (params.program)
124
+ queryParams.program = params.program;
125
+ // Backend returns array directly (flattened list items)
126
+ const applicants = await makeApiRequest("/api/applicants", "GET", undefined, queryParams);
127
+ const total = applicants.length;
128
+ if (!applicants.length) {
129
+ return {
130
+ content: [{
131
+ type: "text",
132
+ text: params.search
133
+ ? `No applicants found matching '${params.search}'`
134
+ : "No applicants found"
135
+ }]
136
+ };
137
+ }
138
+ const output = {
139
+ total,
140
+ count: applicants.length,
141
+ offset: params.offset,
142
+ items: applicants.map(a => ({
143
+ id: a.id,
144
+ name: `${a.first_name || ""} ${a.last_name || ""}`.trim() || "Unknown",
145
+ email: a.email,
146
+ phone: a.phone,
147
+ dob: a.dob,
148
+ identifier: a.identifier,
149
+ is_active: a.is_active,
150
+ created_date: a.created_date
151
+ })),
152
+ has_more: total > params.offset + applicants.length,
153
+ ...(total > params.offset + applicants.length ? {
154
+ next_offset: params.offset + applicants.length
155
+ } : {})
156
+ };
157
+ let textContent;
158
+ if (params.response_format === ResponseFormat.MARKDOWN) {
159
+ textContent = formatApplicantsListMarkdown(applicants, total, params.offset);
160
+ }
161
+ else {
162
+ textContent = JSON.stringify(output, null, 2);
163
+ }
164
+ // Truncate if too large
165
+ if (textContent.length > CHARACTER_LIMIT) {
166
+ textContent = textContent.substring(0, CHARACTER_LIMIT) +
167
+ "\n\n[Response truncated. Use smaller limit or offset to see more results.]";
168
+ }
169
+ return {
170
+ content: [{ type: "text", text: textContent }],
171
+ structuredContent: output
172
+ };
173
+ }
174
+ catch (error) {
175
+ return {
176
+ isError: true,
177
+ content: [{ type: "text", text: handleApiError(error) }]
178
+ };
179
+ }
180
+ });
181
+ // Get Single Applicant Tool
182
+ server.registerTool("formbro_get_applicant", {
183
+ title: "Get FormBro Applicant Details",
184
+ description: `Get detailed information about a specific applicant in FormBro.
185
+
186
+ This tool retrieves comprehensive information about an applicant including:
187
+ - Personal information (name, DOB, contact details)
188
+ - Addresses and ID documents
189
+ - Family members and dependents
190
+ - Education and employment history
191
+ - Travel history and other background
192
+
193
+ Args:
194
+ - id (string): The applicant's unique identifier (MongoDB ObjectId)
195
+ - response_format ('markdown' | 'json'): Output format (default: 'markdown')
196
+
197
+ Returns:
198
+ Complete applicant profile with all available information.
199
+
200
+ Examples:
201
+ - "Get applicant 507f1f77bcf86cd799439011" -> params: { id: "507f1f77bcf86cd799439011" }`,
202
+ inputSchema: IdWithFormatSchema,
203
+ annotations: {
204
+ readOnlyHint: true,
205
+ destructiveHint: false,
206
+ idempotentHint: true,
207
+ openWorldHint: true
208
+ }
209
+ }, async (params) => {
210
+ try {
211
+ const applicant = await makeApiRequest(`/api/applicants/${params.id}`, "GET");
212
+ let textContent;
213
+ if (params.response_format === ResponseFormat.MARKDOWN) {
214
+ const lines = [
215
+ "# Applicant Details",
216
+ "",
217
+ formatApplicantMarkdown(applicant)
218
+ ];
219
+ // Add additional sections if available
220
+ if (applicant.education?.length) {
221
+ lines.push("", "### Education", "");
222
+ for (const edu of applicant.education) {
223
+ lines.push(`- ${edu.institution || "Unknown"} (${edu.start_date || "?"} - ${edu.end_date || "present"})`);
224
+ }
225
+ }
226
+ if (applicant.employment?.length) {
227
+ lines.push("", "### Employment", "");
228
+ for (const emp of applicant.employment) {
229
+ lines.push(`- ${emp.employer_name || "Unknown"}: ${emp.job_title || "Unknown"} (${emp.start_date || "?"} - ${emp.end_date || "present"})`);
230
+ }
231
+ }
232
+ if (applicant.family?.length) {
233
+ lines.push("", "### Family Members", "");
234
+ for (const member of applicant.family) {
235
+ lines.push(`- ${member.first_name || ""} ${member.last_name || ""} (${member.relationship || "Unknown"})`);
236
+ }
237
+ }
238
+ textContent = lines.join("\n");
239
+ }
240
+ else {
241
+ textContent = JSON.stringify(applicant, null, 2);
242
+ }
243
+ // Truncate if too large
244
+ if (textContent.length > CHARACTER_LIMIT) {
245
+ textContent = textContent.substring(0, CHARACTER_LIMIT) +
246
+ "\n\n[Response truncated due to size. Use JSON format for complete data.]";
247
+ }
248
+ return {
249
+ content: [{ type: "text", text: textContent }],
250
+ structuredContent: applicant
251
+ };
252
+ }
253
+ catch (error) {
254
+ return {
255
+ isError: true,
256
+ content: [{ type: "text", text: handleApiError(error) }]
257
+ };
258
+ }
259
+ });
260
+ }
261
+ //# sourceMappingURL=applicants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applicants.js","sourceRoot":"","sources":["../../src/tools/applicants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Register application tools with the MCP server
4
+ */
5
+ export declare function registerApplicationTools(server: McpServer): void;
6
+ //# sourceMappingURL=applications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applications.d.ts","sourceRoot":"","sources":["../../src/tools/applications.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiEpE;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4LhE"}