@wootsup/mcp 0.1.0-rc.1

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 (135) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/LICENSE +21 -0
  3. package/README.md +179 -0
  4. package/SECURITY.md +163 -0
  5. package/dist/auth/keychain.d.ts +47 -0
  6. package/dist/auth/keychain.js +262 -0
  7. package/dist/auth/keychain.js.map +1 -0
  8. package/dist/auth/oauth-provider.d.ts +68 -0
  9. package/dist/auth/oauth-provider.js +232 -0
  10. package/dist/auth/oauth-provider.js.map +1 -0
  11. package/dist/auth/profiles.d.ts +52 -0
  12. package/dist/auth/profiles.js +200 -0
  13. package/dist/auth/profiles.js.map +1 -0
  14. package/dist/auth/token.d.ts +27 -0
  15. package/dist/auth/token.js +88 -0
  16. package/dist/auth/token.js.map +1 -0
  17. package/dist/index.d.ts +13 -0
  18. package/dist/index.js +137 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/install-skill.d.ts +23 -0
  21. package/dist/install-skill.js +73 -0
  22. package/dist/install-skill.js.map +1 -0
  23. package/dist/modules/apimapper/cache.d.ts +2 -0
  24. package/dist/modules/apimapper/cache.js +71 -0
  25. package/dist/modules/apimapper/cache.js.map +1 -0
  26. package/dist/modules/apimapper/client.d.ts +85 -0
  27. package/dist/modules/apimapper/client.js +523 -0
  28. package/dist/modules/apimapper/client.js.map +1 -0
  29. package/dist/modules/apimapper/connections.d.ts +2 -0
  30. package/dist/modules/apimapper/connections.js +406 -0
  31. package/dist/modules/apimapper/connections.js.map +1 -0
  32. package/dist/modules/apimapper/credential-sanitizer.d.ts +7 -0
  33. package/dist/modules/apimapper/credential-sanitizer.js +70 -0
  34. package/dist/modules/apimapper/credential-sanitizer.js.map +1 -0
  35. package/dist/modules/apimapper/credentials.d.ts +2 -0
  36. package/dist/modules/apimapper/credentials.js +258 -0
  37. package/dist/modules/apimapper/credentials.js.map +1 -0
  38. package/dist/modules/apimapper/diagnose.d.ts +18 -0
  39. package/dist/modules/apimapper/diagnose.js +305 -0
  40. package/dist/modules/apimapper/diagnose.js.map +1 -0
  41. package/dist/modules/apimapper/flows.d.ts +2 -0
  42. package/dist/modules/apimapper/flows.js +372 -0
  43. package/dist/modules/apimapper/flows.js.map +1 -0
  44. package/dist/modules/apimapper/get-skill.d.ts +4 -0
  45. package/dist/modules/apimapper/get-skill.js +88 -0
  46. package/dist/modules/apimapper/get-skill.js.map +1 -0
  47. package/dist/modules/apimapper/graph-builder.d.ts +47 -0
  48. package/dist/modules/apimapper/graph-builder.js +117 -0
  49. package/dist/modules/apimapper/graph-builder.js.map +1 -0
  50. package/dist/modules/apimapper/graph.d.ts +2 -0
  51. package/dist/modules/apimapper/graph.js +117 -0
  52. package/dist/modules/apimapper/graph.js.map +1 -0
  53. package/dist/modules/apimapper/index.d.ts +2 -0
  54. package/dist/modules/apimapper/index.js +43 -0
  55. package/dist/modules/apimapper/index.js.map +1 -0
  56. package/dist/modules/apimapper/inspect.d.ts +20 -0
  57. package/dist/modules/apimapper/inspect.js +86 -0
  58. package/dist/modules/apimapper/inspect.js.map +1 -0
  59. package/dist/modules/apimapper/library.d.ts +2 -0
  60. package/dist/modules/apimapper/library.js +237 -0
  61. package/dist/modules/apimapper/library.js.map +1 -0
  62. package/dist/modules/apimapper/license.d.ts +2 -0
  63. package/dist/modules/apimapper/license.js +142 -0
  64. package/dist/modules/apimapper/license.js.map +1 -0
  65. package/dist/modules/apimapper/local-sources.d.ts +2 -0
  66. package/dist/modules/apimapper/local-sources.js +123 -0
  67. package/dist/modules/apimapper/local-sources.js.map +1 -0
  68. package/dist/modules/apimapper/misc.d.ts +2 -0
  69. package/dist/modules/apimapper/misc.js +149 -0
  70. package/dist/modules/apimapper/misc.js.map +1 -0
  71. package/dist/modules/apimapper/node-schema.d.ts +217 -0
  72. package/dist/modules/apimapper/node-schema.js +218 -0
  73. package/dist/modules/apimapper/node-schema.js.map +1 -0
  74. package/dist/modules/apimapper/normalizers.d.ts +13 -0
  75. package/dist/modules/apimapper/normalizers.js +37 -0
  76. package/dist/modules/apimapper/normalizers.js.map +1 -0
  77. package/dist/modules/apimapper/onboarding.d.ts +51 -0
  78. package/dist/modules/apimapper/onboarding.js +201 -0
  79. package/dist/modules/apimapper/onboarding.js.map +1 -0
  80. package/dist/modules/apimapper/schema.d.ts +2 -0
  81. package/dist/modules/apimapper/schema.js +84 -0
  82. package/dist/modules/apimapper/schema.js.map +1 -0
  83. package/dist/modules/apimapper/settings.d.ts +2 -0
  84. package/dist/modules/apimapper/settings.js +157 -0
  85. package/dist/modules/apimapper/settings.js.map +1 -0
  86. package/dist/modules/apimapper/skill-resources.d.ts +4 -0
  87. package/dist/modules/apimapper/skill-resources.js +85 -0
  88. package/dist/modules/apimapper/skill-resources.js.map +1 -0
  89. package/dist/modules/apimapper/types.d.ts +111 -0
  90. package/dist/modules/apimapper/types.js +14 -0
  91. package/dist/modules/apimapper/types.js.map +1 -0
  92. package/dist/modules/apimapper/use-profile.d.ts +34 -0
  93. package/dist/modules/apimapper/use-profile.js +176 -0
  94. package/dist/modules/apimapper/use-profile.js.map +1 -0
  95. package/dist/modules/apimapper/workflows.d.ts +2 -0
  96. package/dist/modules/apimapper/workflows.js +301 -0
  97. package/dist/modules/apimapper/workflows.js.map +1 -0
  98. package/dist/platform/index.d.ts +71 -0
  99. package/dist/platform/index.js +377 -0
  100. package/dist/platform/index.js.map +1 -0
  101. package/dist/server-http.d.ts +22 -0
  102. package/dist/server-http.js +159 -0
  103. package/dist/server-http.js.map +1 -0
  104. package/dist/setup/detect-clients.d.ts +39 -0
  105. package/dist/setup/detect-clients.js +152 -0
  106. package/dist/setup/detect-clients.js.map +1 -0
  107. package/dist/setup/probe-handshake.d.ts +26 -0
  108. package/dist/setup/probe-handshake.js +159 -0
  109. package/dist/setup/probe-handshake.js.map +1 -0
  110. package/dist/setup/write-config.d.ts +25 -0
  111. package/dist/setup/write-config.js +247 -0
  112. package/dist/setup/write-config.js.map +1 -0
  113. package/dist/setup-cli.d.ts +49 -0
  114. package/dist/setup-cli.js +292 -0
  115. package/dist/setup-cli.js.map +1 -0
  116. package/dist/skill-instructions.d.ts +10 -0
  117. package/dist/skill-instructions.js +68 -0
  118. package/dist/skill-instructions.js.map +1 -0
  119. package/dist/transports/http.d.ts +29 -0
  120. package/dist/transports/http.js +267 -0
  121. package/dist/transports/http.js.map +1 -0
  122. package/dist/transports/stdio.d.ts +9 -0
  123. package/dist/transports/stdio.js +19 -0
  124. package/dist/transports/stdio.js.map +1 -0
  125. package/docs/architecture.md +140 -0
  126. package/docs/customgraph-internal-migration.md +210 -0
  127. package/docs/security.md +126 -0
  128. package/docs/tools.md +230 -0
  129. package/manifest.json +76 -0
  130. package/package.json +61 -0
  131. package/skills/apimapper/SKILL.md +57 -0
  132. package/skills/apimapper/reference/joomla.md +85 -0
  133. package/skills/apimapper/reference/oauth.md +94 -0
  134. package/skills/apimapper/reference/troubleshooting.md +123 -0
  135. package/skills/apimapper/reference/yootheme.md +96 -0
@@ -0,0 +1,406 @@
1
+ import { z } from "zod";
2
+ import { formatResult, autoFormatTable, readOnly, creating, mutating, destructive, errorWithSuggestion, } from "@getimo/mcp-toolkit";
3
+ import { request, hintFor, WP_BASE, WP_USER, authConfigured } from "./client.js";
4
+ export function registerConnectionTools(server) {
5
+ // ── apimapper_health ───────────────────────────────────────────────
6
+ server.registerTool("apimapper_health", {
7
+ title: "API Mapper REST Health",
8
+ description: "Check connectivity + auth against the API Mapper REST namespace. " +
9
+ "Returns {wp_base, wp_user, auth, connectivity, connection_count, http_status}. " +
10
+ "Run this first if any other tool fails." +
11
+ "\n\nExample:\n apimapper_health({})",
12
+ inputSchema: {},
13
+ annotations: readOnly(),
14
+ }, async () => {
15
+ const checks = {
16
+ wp_base: WP_BASE,
17
+ wp_user: WP_USER,
18
+ auth: authConfigured() ? "configured" : "MISSING (set APIMAPPER_WP_APP_PASS)",
19
+ };
20
+ try {
21
+ const r = await request("/connections");
22
+ checks.http_status = r.status ?? 0;
23
+ if (r.success) {
24
+ checks.connectivity = "OK";
25
+ checks.connection_count = Array.isArray(r.data?.connections) ? r.data.connections.length : 0;
26
+ }
27
+ else {
28
+ checks.connectivity = `FAIL: ${r.error}`;
29
+ if (r.errorCode)
30
+ checks.error_code = r.errorCode;
31
+ }
32
+ }
33
+ catch (e) {
34
+ const err = errorWithSuggestion(e, { healthTool: "apimapper_health" });
35
+ checks.connectivity = `ERROR: ${err.message}`;
36
+ }
37
+ return formatResult(checks, false, { maxChars: 2000 });
38
+ });
39
+ // ── apimapper_connection_list ──────────────────────────────────────
40
+ server.registerTool("apimapper_connection_list", {
41
+ title: "List Connections",
42
+ description: "List all API Mapper connections. Use apimapper_connection_get for full details." +
43
+ "\n\nExample:\n apimapper_connection_list({ source: 'user', limit: 25 })",
44
+ inputSchema: {
45
+ source: z
46
+ .enum(["library", "demo", "user", "all"])
47
+ .default("all")
48
+ .describe("Filter by origin"),
49
+ limit: z.number().min(1).max(500).default(50).describe("Max items (1-500)"),
50
+ },
51
+ annotations: readOnly(),
52
+ }, async ({ source, limit }) => {
53
+ const r = await request("/connections");
54
+ if (!r.success) {
55
+ return formatResult({
56
+ error: r.error,
57
+ status: r.status,
58
+ errorCode: r.errorCode,
59
+ context: { source, limit },
60
+ hint: hintFor(r.errorCode),
61
+ }, true);
62
+ }
63
+ let items = Array.isArray(r.data?.connections) ? r.data.connections : [];
64
+ if (source !== "all")
65
+ items = items.filter((c) => c.source === source);
66
+ items = items.slice(0, limit);
67
+ return autoFormatTable(items.map((c) => ({
68
+ id: c.id,
69
+ name: c.name,
70
+ source: c.source,
71
+ endpoint: c.endpoint || "(template)",
72
+ method: c.method || "GET",
73
+ auth_type: c.auth_type || "none",
74
+ credential_id: c.credential_id || "—",
75
+ })), {
76
+ columns: [
77
+ // Width 36 accommodates 30+ char IDs (e.g. legacy template
78
+ // connections like conn_calendly_jla_229fcbce95b7). Truncation
79
+ // produces orphan IDs that downstream tools fail to resolve
80
+ // via *_get; +6 headroom matches the longest historical IDs.
81
+ { key: "id", label: "ID", width: 36 },
82
+ { key: "name", label: "NAME", width: 28 },
83
+ { key: "source", label: "SRC", width: 8 },
84
+ { key: "endpoint", label: "ENDPOINT", width: 30 },
85
+ { key: "method", label: "M", width: 5 },
86
+ { key: "auth_type", label: "AUTH", width: 12 },
87
+ { key: "credential_id", label: "CRED", width: 26 },
88
+ ],
89
+ header: (n) => `${n} connections`,
90
+ footer: "Use apimapper_connection_get <id> for full details.",
91
+ });
92
+ });
93
+ // ── apimapper_connection_get ───────────────────────────────────────
94
+ server.registerTool("apimapper_connection_get", {
95
+ title: "Get Connection",
96
+ description: "Fetch full configuration of a single connection by ID." +
97
+ "\n\nExample:\n apimapper_connection_get({ id: 'con_abc123' })",
98
+ inputSchema: {
99
+ id: z.string().describe('Connection ID (e.g., "conn_Mz33OVPF1z3ap8fbbQtpx"). Use apimapper_connection_list.'),
100
+ },
101
+ annotations: readOnly(),
102
+ }, async ({ id }) => {
103
+ const r = await request(`/connections/${encodeURIComponent(id)}`);
104
+ if (!r.success) {
105
+ return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: { id }, hint: hintFor(r.errorCode) }, true);
106
+ }
107
+ if (!r.data || (typeof r.data === "object" && Object.keys(r.data).length === 0)) {
108
+ return formatResult({ error: "connection not found", status: r.status, context: { id }, hint: hintFor("not_found") }, true);
109
+ }
110
+ return formatResult(r.data, false, { maxChars: 4000 });
111
+ });
112
+ // ── apimapper_connection_create ────────────────────────────────────
113
+ server.registerTool("apimapper_connection_create", {
114
+ title: "Create Connection",
115
+ description: "Create a new connection (custom — not from library)." +
116
+ "\n\nExample:\n apimapper_connection_create({ name: 'Pexels API', endpoint: 'https://api.pexels.com/v1/search', method: 'GET', auth_type: 'bearer', items_path: 'photos' })",
117
+ inputSchema: {
118
+ name: z.string().min(1).describe('Connection name (e.g., "My Blog API")'),
119
+ endpoint: z.string().describe('Endpoint path or full URL (e.g., "https://api.example.com/posts")'),
120
+ method: z.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]).default("GET").describe("HTTP method"),
121
+ auth_type: z.enum(["none", "api_key", "bearer", "basic", "oauth2"]).default("none").describe("Auth type (snake_case wire key)"),
122
+ credential_id: z.string().optional().describe("Credential ID (snake_case wire key) if auth_type requires one"),
123
+ items_path: z.string().optional().describe('JSONPath to items array (snake_case wire key)'),
124
+ cache_ttl: z.number().int().min(0).default(3600).describe("Cache TTL in seconds (snake_case wire key)"),
125
+ description: z.string().optional().describe("Free-text description"),
126
+ },
127
+ annotations: creating(),
128
+ }, async (input) => {
129
+ const r = await request("/connections", {
130
+ method: "POST",
131
+ body: JSON.stringify(input),
132
+ });
133
+ if (!r.success) {
134
+ return formatResult({
135
+ error: r.error,
136
+ status: r.status,
137
+ errorCode: r.errorCode,
138
+ context: { name: input.name, endpoint: input.endpoint },
139
+ hint: hintFor(r.errorCode),
140
+ }, true);
141
+ }
142
+ return formatResult({
143
+ created: true,
144
+ id: r.data?.id,
145
+ name: r.data?.name,
146
+ source: r.data?.source,
147
+ }, false, { maxChars: 2000 });
148
+ });
149
+ // ── apimapper_connection_update ────────────────────────────────────
150
+ server.registerTool("apimapper_connection_update", {
151
+ title: "Update Connection",
152
+ description: "Update fields on an existing connection. Only provided fields are changed. Wire-format is snake_case." +
153
+ "\n\nExample:\n apimapper_connection_update({ id: 'con_abc123', endpoint: 'https://api.pexels.com/v1/curated' })",
154
+ inputSchema: {
155
+ id: z.string().describe("Connection ID. Use apimapper_connection_list to find."),
156
+ patch: z
157
+ .record(z.string(), z.unknown())
158
+ .describe('Fields to update — snake_case keys. ' +
159
+ 'Examples: {"name":"Renamed"}, {"cache_ttl":7200}, {"endpoint":"/v2/posts"}, ' +
160
+ '{"credential_id":"cred_xxx"}'),
161
+ },
162
+ annotations: mutating(),
163
+ }, async ({ id, patch }) => {
164
+ const r = await request(`/connections/${encodeURIComponent(id)}`, {
165
+ method: "PUT",
166
+ body: JSON.stringify(patch),
167
+ });
168
+ if (!r.success) {
169
+ return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: { id }, hint: hintFor(r.errorCode) }, true);
170
+ }
171
+ return formatResult({ updated: true, id: r.data?.id, name: r.data?.name }, false, { maxChars: 2000 });
172
+ });
173
+ // ── apimapper_connection_delete ────────────────────────────────────
174
+ server.registerTool("apimapper_connection_delete", {
175
+ title: "Delete Connection",
176
+ description: "Permanently delete a connection. Any flow referencing it will break. " +
177
+ "Preview-mode (confirm:false) fetches the connection metadata first." +
178
+ "\n\nExample:\n apimapper_connection_delete({ id: 'con_abc123', confirm: false })",
179
+ inputSchema: {
180
+ id: z.string().describe("Connection ID. Use apimapper_connection_list to find."),
181
+ confirm: z
182
+ .boolean()
183
+ .default(false)
184
+ .describe("Must be true to execute. On confirm:false, returns a preview."),
185
+ },
186
+ annotations: destructive(),
187
+ }, async ({ id, confirm }) => {
188
+ if (!confirm) {
189
+ const preview = await request(`/connections/${encodeURIComponent(id)}`);
190
+ return formatResult({
191
+ preview: true,
192
+ warning: "DESTRUCTIVE — Connection delete cannot be undone. Dependent flows will break.",
193
+ target: preview.success && preview.data
194
+ ? {
195
+ id: preview.data.id,
196
+ name: preview.data.name,
197
+ source: preview.data.source,
198
+ endpoint: preview.data.endpoint,
199
+ auth_type: preview.data.auth_type,
200
+ }
201
+ : { id, note: "could not preview — id may not exist" },
202
+ instruction: "Ask user to confirm, then call again with confirm: true.",
203
+ });
204
+ }
205
+ const r = await request(`/connections/${encodeURIComponent(id)}`, { method: "DELETE" });
206
+ if (!r.success) {
207
+ return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: { id }, hint: hintFor(r.errorCode) }, true);
208
+ }
209
+ return formatResult({ deleted: true, id }, false, { maxChars: 1500 });
210
+ });
211
+ // ── apimapper_connection_test ──────────────────────────────────────
212
+ server.registerTool("apimapper_connection_test", {
213
+ title: "Test Connection (Probe)",
214
+ description: "Probe a connection's upstream endpoint to verify reachability + auth. " +
215
+ "Reports actionType from the probe (ok / reauth_required / api_error / etc.)." +
216
+ "\n\nExample:\n apimapper_connection_test({ id: 'con_abc123' })",
217
+ inputSchema: {
218
+ id: z.string().describe("Connection ID. Use apimapper_connection_list to find."),
219
+ },
220
+ annotations: readOnly(),
221
+ }, async ({ id }) => {
222
+ const r = await request("/connections/test", { method: "POST", body: JSON.stringify({ connection_id: id }) }, { unwrapInnerSuccess: true });
223
+ if (!r.success) {
224
+ return formatResult({
225
+ error: r.error,
226
+ status: r.status,
227
+ errorCode: r.errorCode,
228
+ payloadFailed: r.payloadFailed,
229
+ context: { id },
230
+ hint: r.payloadFailed
231
+ ? "Probe ran but reported failure — check the upstream API status, credentials, or connection endpoint."
232
+ : hintFor(r.errorCode),
233
+ }, true);
234
+ }
235
+ return formatResult({
236
+ ok: true,
237
+ id,
238
+ actionType: r.data?.actionType ?? "ok",
239
+ http_code: r.data?.http_code,
240
+ duration_ms: r.data?.duration_ms,
241
+ body_preview: r.data?.body_preview?.slice(0, 500),
242
+ }, false, { maxChars: 2500 });
243
+ });
244
+ // ── apimapper_connection_health_check ──────────────────────────────
245
+ server.registerTool("apimapper_connection_health_check", {
246
+ title: "Health-Check All Connections",
247
+ description: "Probe a set of connections in one batch and report status. May take 10-30s. " +
248
+ "Pass empty array to probe ALL connections." +
249
+ "\n\nExample:\n apimapper_connection_health_check({ connection_ids: ['con_abc123', 'con_def456'] })",
250
+ inputSchema: {
251
+ connection_ids: z
252
+ .array(z.string())
253
+ .default([])
254
+ .describe('Connection IDs to probe (empty = all). REST wire-key: connection_ids.'),
255
+ },
256
+ annotations: readOnly(),
257
+ }, async ({ connection_ids }) => {
258
+ const r = await request("/connections/health-check", {
259
+ method: "POST",
260
+ body: JSON.stringify({ connection_ids }),
261
+ });
262
+ if (!r.success) {
263
+ return formatResult({
264
+ error: r.error,
265
+ status: r.status,
266
+ errorCode: r.errorCode,
267
+ context: { count: connection_ids.length },
268
+ hint: hintFor(r.errorCode),
269
+ }, true);
270
+ }
271
+ const data = (r.data && typeof r.data === "object") ? r.data : {};
272
+ // Summarize per-connection probe results: count ok / fail
273
+ const results = Array.isArray(data.results) ? data.results : Object.values(data);
274
+ const okCount = results.filter((x) => {
275
+ if (!x || typeof x !== "object")
276
+ return false;
277
+ const o = x;
278
+ return o.success === true || o.actionType === "ok";
279
+ }).length;
280
+ return formatResult({
281
+ ok_count: okCount,
282
+ fail_count: results.length - okCount,
283
+ total: results.length,
284
+ results: data,
285
+ }, false, { maxChars: 6000 });
286
+ });
287
+ // ── apimapper_connection_data ──────────────────────────────────────
288
+ server.registerTool("apimapper_connection_data", {
289
+ title: "Fetch Connection Sample Data",
290
+ description: "Fetch sample data from a connection's configured endpoint. The PHP handler reads ALL " +
291
+ "query params as source-context for template substitution." +
292
+ "\n\nExample:\n apimapper_connection_data({ id: 'con_abc123', params: { query: 'nature', per_page: 10 } })",
293
+ inputSchema: {
294
+ id: z.string().describe("Connection ID. Use apimapper_connection_list to find."),
295
+ endpoint: z.string().optional().describe('Override endpoint (e.g., "Scheduled Events")'),
296
+ template_fields: z
297
+ .record(z.string(), z.string())
298
+ .optional()
299
+ .describe('Template field values flattened into query string (e.g., {"spreadsheet_id":"...","user_uri":"..."})'),
300
+ },
301
+ annotations: readOnly(),
302
+ }, async ({ id, endpoint, template_fields }) => {
303
+ const params = new URLSearchParams();
304
+ if (endpoint)
305
+ params.set("endpoint", endpoint);
306
+ // Flatten template_fields directly as query params — PHP handler does
307
+ // array_filter() across get_query_params() and uses each key as a
308
+ // template variable.
309
+ if (template_fields) {
310
+ for (const [k, v] of Object.entries(template_fields)) {
311
+ params.set(k, v);
312
+ }
313
+ }
314
+ const qs = params.toString();
315
+ const r = await request(`/connections/${encodeURIComponent(id)}/data${qs ? `?${qs}` : ""}`);
316
+ if (!r.success) {
317
+ return formatResult({
318
+ error: r.error,
319
+ status: r.status,
320
+ errorCode: r.errorCode,
321
+ context: { id, endpoint, template_fields },
322
+ hint: hintFor(r.errorCode),
323
+ }, true);
324
+ }
325
+ // Summary: surface array-length if response is/contains a list
326
+ const data = r.data;
327
+ const isArray = Array.isArray(data);
328
+ const items = isArray ? data : data && typeof data === "object" && Array.isArray(data.items)
329
+ ? data.items
330
+ : null;
331
+ return formatResult({
332
+ ok: true,
333
+ shape: isArray ? "array" : typeof data,
334
+ item_count: items ? items.length : undefined,
335
+ payload: data,
336
+ }, false, { maxChars: 6000 });
337
+ });
338
+ // ── apimapper_connection_resources ─────────────────────────────────
339
+ server.registerTool("apimapper_connection_resources", {
340
+ title: "List Connection Resources",
341
+ description: "List browseable resources on a connection (drive files, sheets, IG media). " +
342
+ "REST contract: `field` (resource-picker field name) + optional `query` filter." +
343
+ "\n\nExample:\n apimapper_connection_resources({ id: 'con_drive_xyz', field: 'fileId', query: 'budget' })",
344
+ inputSchema: {
345
+ id: z.string().describe("Connection ID. Use apimapper_connection_list to find."),
346
+ field: z
347
+ .string()
348
+ .describe('Resource-picker field name (e.g., "spreadsheet_id", "drive_file_id"). REST wire-key: field.'),
349
+ query: z.string().optional().describe("Free-text search query"),
350
+ },
351
+ annotations: readOnly(),
352
+ }, async ({ id, field, query }) => {
353
+ const params = new URLSearchParams();
354
+ params.set("field", field);
355
+ if (query)
356
+ params.set("query", query);
357
+ const r = await request(`/connections/${encodeURIComponent(id)}/resources?${params.toString()}`);
358
+ if (!r.success) {
359
+ return formatResult({
360
+ error: r.error,
361
+ status: r.status,
362
+ errorCode: r.errorCode,
363
+ context: { id, field, query },
364
+ hint: hintFor(r.errorCode),
365
+ }, true);
366
+ }
367
+ const data = r.data;
368
+ const resources = Array.isArray(data)
369
+ ? data
370
+ : data && typeof data === "object" && Array.isArray(data.resources)
371
+ ? data.resources
372
+ : data && typeof data === "object" && Array.isArray(data.items)
373
+ ? data.items
374
+ : [];
375
+ return formatResult({
376
+ field,
377
+ query: query || null,
378
+ resource_count: resources.length,
379
+ resources: resources.slice(0, 100),
380
+ note: resources.length > 100 ? `Showing first 100 of ${resources.length} resources.` : undefined,
381
+ }, false, { maxChars: 6000 });
382
+ });
383
+ // ── apimapper_connection_pipeline_update ───────────────────────────
384
+ server.registerTool("apimapper_connection_pipeline_update", {
385
+ title: "Update Connection Pipeline",
386
+ description: "Update the connection's pipeline (endpoints, default_params, headers, items_path, items_shape)." +
387
+ "\n\nExample:\n apimapper_connection_pipeline_update({ id: 'con_abc123', items_path: 'photos', items_shape: 'auto', default_params: { per_page: '20' } })",
388
+ inputSchema: {
389
+ id: z.string().describe("Connection ID. Use apimapper_connection_list to find."),
390
+ pipeline: z
391
+ .record(z.string(), z.unknown())
392
+ .describe('Pipeline JSON (e.g., {"endpoints":[...], "items_path":"data", "items_shape":"flat"})'),
393
+ },
394
+ annotations: mutating(),
395
+ }, async ({ id, pipeline }) => {
396
+ const r = await request(`/connections/${encodeURIComponent(id)}/pipeline`, {
397
+ method: "PUT",
398
+ body: JSON.stringify(pipeline),
399
+ });
400
+ if (!r.success) {
401
+ return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: { id }, hint: hintFor(r.errorCode) }, true);
402
+ }
403
+ return formatResult({ updated: true, id: r.data?.id, name: r.data?.name }, false, { maxChars: 2000 });
404
+ });
405
+ }
406
+ //# sourceMappingURL=connections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connections.js","sourceRoot":"","sources":["../../../src/modules/apimapper/connections.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGjF,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,sEAAsE;IACtE,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EACT,mEAAmE;YACnE,iFAAiF;YACjF,yCAAyC;YACzC,sCAAsC;QACxC,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,QAAQ,EAAE;KACxB,EACD,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAoC;YAC9C,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,qCAAqC;SAC9E,CAAC;QACF,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,OAAO,CAAgC,cAAc,CAAC,CAAC;YACvE,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBACd,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC3B,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/F,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;gBACzC,IAAI,CAAC,CAAC,SAAS;oBAAE,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,SAAS,CAAC;YACnD,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,mBAAmB,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACvE,MAAM,CAAC,YAAY,GAAG,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC;QAChD,CAAC;QACD,OAAO,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC,CACF,CAAC;IAEF,sEAAsE;IACtE,MAAM,CAAC,YAAY,CACjB,2BAA2B,EAC3B;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,iFAAiF;YAC9F,0EAA0E;QAC1E,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;iBACxC,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CAAC,kBAAkB,CAAC;YAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;SAC5E;QACD,WAAW,EAAE,QAAQ,EAAE;KACxB,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;QAC1B,MAAM,CAAC,GAAG,MAAM,OAAO,CAAgC,cAAc,CAAC,CAAC;QACvE,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,YAAY,CACjB;gBACE,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;gBAC1B,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;aAC3B,EACD,IAAI,CACL,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,IAAI,MAAM,KAAK,KAAK;YAAE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACvE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC9B,OAAO,eAAe,CACpB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,YAAY;YACpC,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,KAAK;YACzB,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,MAAM;YAChC,aAAa,EAAE,CAAC,CAAC,aAAa,IAAI,GAAG;SACtC,CAAC,CAA8B,EAChC;YACE,OAAO,EAAE;gBACP,2DAA2D;gBAC3D,+DAA+D;gBAC/D,4DAA4D;gBAC5D,6DAA6D;gBAC7D,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;gBACrC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;gBACzC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE;gBACzC,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;gBACjD,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE;gBACvC,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC9C,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;aACnD;YACD,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,cAAc;YACjC,MAAM,EAAE,qDAAqD;SAC9D,CACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,sEAAsE;IACtE,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,wDAAwD;YACrE,gEAAgE;QAChE,WAAW,EAAE;YACX,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oFAAoF,CAAC;SAC9G;QACD,WAAW,EAAE,QAAQ,EAAE;KACxB,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACf,MAAM,CAAC,GAAG,MAAM,OAAO,CAAa,gBAAgB,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,YAAY,CACjB,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EACzG,IAAI,CACL,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YAChF,OAAO,YAAY,CACjB,EAAE,KAAK,EAAE,sBAAsB,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,EAChG,IAAI,CACL,CAAC;QACJ,CAAC;QACD,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC,CACF,CAAC;IAEF,sEAAsE;IACtE,MAAM,CAAC,YAAY,CACjB,6BAA6B,EAC7B;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,sDAAsD;YACnE,6KAA6K;QAC7K,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;YACzE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;YAClG,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;YAChG,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YAC/H,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;YAC9G,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;YAC3F,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC;YACvG,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;SACrE;QACD,WAAW,EAAE,QAAQ,EAAE;KACxB,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,MAAM,CAAC,GAAG,MAAM,OAAO,CAAa,cAAc,EAAE;YAClD,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,YAAY,CACjB;gBACE,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE;gBACvD,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;aAC3B,EACD,IAAI,CACL,CAAC;QACJ,CAAC;QACD,OAAO,YAAY,CACjB;YACE,OAAO,EAAE,IAAI;YACb,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE;YACd,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI;YAClB,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM;SACvB,EACD,KAAK,EACL,EAAE,QAAQ,EAAE,IAAI,EAAE,CACnB,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,sEAAsE;IACtE,MAAM,CAAC,YAAY,CACjB,6BAA6B,EAC7B;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,uGAAuG;YACpH,kHAAkH;QAClH,WAAW,EAAE;YACX,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;YAChF,KAAK,EAAE,CAAC;iBACL,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;iBAC/B,QAAQ,CACP,sCAAsC;gBACpC,8EAA8E;gBAC9E,8BAA8B,CACjC;SACJ;QACD,WAAW,EAAE,QAAQ,EAAE;KACxB,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACtB,MAAM,CAAC,GAAG,MAAM,OAAO,CAAa,gBAAgB,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE;YAC5E,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,YAAY,CACjB,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EACzG,IAAI,CACL,CAAC;QACJ,CAAC;QACD,OAAO,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACxG,CAAC,CACF,CAAC;IAEF,sEAAsE;IACtE,MAAM,CAAC,YAAY,CACjB,6BAA6B,EAC7B;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,uEAAuE;YACvE,qEAAqE;YACrE,mFAAmF;QACrF,WAAW,EAAE;YACX,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;YAChF,OAAO,EAAE,CAAC;iBACP,OAAO,EAAE;iBACT,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CAAC,+DAA+D,CAAC;SAC7E;QACD,WAAW,EAAE,WAAW,EAAE;KAC3B,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACxB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,MAAM,OAAO,CAAa,gBAAgB,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACpF,OAAO,YAAY,CAAC;gBAClB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,+EAA+E;gBACxF,MAAM,EAAE,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI;oBACrC,CAAC,CAAC;wBACE,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;wBACnB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;wBACvB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM;wBAC3B,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ;wBAC/B,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS;qBAClC;oBACH,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,sCAAsC,EAAE;gBACxD,WAAW,EAAE,0DAA0D;aACxE,CAAC,CAAC;QACL,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,gBAAgB,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxF,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,YAAY,CACjB,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EACzG,IAAI,CACL,CAAC;QACJ,CAAC;QACD,OAAO,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC,CACF,CAAC;IAEF,sEAAsE;IACtE,MAAM,CAAC,YAAY,CACjB,2BAA2B,EAC3B;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EACT,wEAAwE;YACxE,8EAA8E;YAC9E,iEAAiE;QACnE,WAAW,EAAE;YACX,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;SACjF;QACD,WAAW,EAAE,QAAQ,EAAE;KACxB,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACf,MAAM,CAAC,GAAG,MAAM,OAAO,CAQrB,mBAAmB,EACnB,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,EAAE,EAC/D,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAC7B,CAAC;QACF,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,YAAY,CACjB;gBACE,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,aAAa,EAAE,CAAC,CAAC,aAAa;gBAC9B,OAAO,EAAE,EAAE,EAAE,EAAE;gBACf,IAAI,EAAE,CAAC,CAAC,aAAa;oBACnB,CAAC,CAAC,sGAAsG;oBACxG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;aACzB,EACD,IAAI,CACL,CAAC;QACJ,CAAC;QACD,OAAO,YAAY,CACjB;YACE,EAAE,EAAE,IAAI;YACR,EAAE;YACF,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,IAAI,IAAI;YACtC,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS;YAC5B,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW;YAChC,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SAClD,EACD,KAAK,EACL,EAAE,QAAQ,EAAE,IAAI,EAAE,CACnB,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,sEAAsE;IACtE,MAAM,CAAC,YAAY,CACjB,mCAAmC,EACnC;QACE,KAAK,EAAE,8BAA8B;QACrC,WAAW,EACT,8EAA8E;YAC9E,4CAA4C;YAC5C,qGAAqG;QACvG,WAAW,EAAE;YACX,cAAc,EAAE,CAAC;iBACd,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;iBACjB,OAAO,CAAC,EAAE,CAAC;iBACX,QAAQ,CAAC,uEAAuE,CAAC;SACrF;QACD,WAAW,EAAE,QAAQ,EAAE;KACxB,EACD,KAAK,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE;QAC3B,MAAM,CAAC,GAAG,MAAM,OAAO,CAA0B,2BAA2B,EAAE;YAC5E,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;SACzC,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,YAAY,CACjB;gBACE,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,OAAO,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE;gBACzC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;aAC3B,EACD,IAAI,CACL,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,IAAgC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/F,0DAA0D;QAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjF,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAU,EAAE,EAAE;YAC5C,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC9C,MAAM,CAAC,GAAG,CAA4B,CAAC;YACvC,OAAO,CAAC,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC;QACrD,CAAC,CAAC,CAAC,MAAM,CAAC;QACV,OAAO,YAAY,CACjB;YACE,QAAQ,EAAE,OAAO;YACjB,UAAU,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO;YACpC,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,OAAO,EAAE,IAAI;SACd,EACD,KAAK,EACL,EAAE,QAAQ,EAAE,IAAI,EAAE,CACnB,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,sEAAsE;IACtE,MAAM,CAAC,YAAY,CACjB,2BAA2B,EAC3B;QACE,KAAK,EAAE,8BAA8B;QACrC,WAAW,EACT,uFAAuF;YACvF,2DAA2D;YAC3D,4GAA4G;QAC9G,WAAW,EAAE;YACX,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;YAChF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;YACxF,eAAe,EAAE,CAAC;iBACf,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;iBAC9B,QAAQ,EAAE;iBACV,QAAQ,CAAC,qGAAqG,CAAC;SACnH;QACD,WAAW,EAAE,QAAQ,EAAE;KACxB,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,QAAQ;YAAE,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC/C,sEAAsE;QACtE,kEAAkE;QAClE,qBAAqB;QACrB,IAAI,eAAe,EAAE,CAAC;YACpB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;gBACrD,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,MAAM,OAAO,CACrB,gBAAgB,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACnE,CAAC;QACF,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,YAAY,CACjB;gBACE,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,OAAO,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE;gBAC1C,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;aAC3B,EACD,IAAI,CACL,CAAC;QACJ,CAAC;QACD,+DAA+D;QAC/D,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACpB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAE,IAAgC,CAAC,KAAK,CAAC;YACvH,CAAC,CAAG,IAAgC,CAAC,KAAmB;YACxD,CAAC,CAAC,IAAI,CAAC;QACT,OAAO,YAAY,CACjB;YACE,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI;YACtC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YAC5C,OAAO,EAAE,IAAI;SACd,EACD,KAAK,EACL,EAAE,QAAQ,EAAE,IAAI,EAAE,CACnB,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,sEAAsE;IACtE,MAAM,CAAC,YAAY,CACjB,gCAAgC,EAChC;QACE,KAAK,EAAE,2BAA2B;QAClC,WAAW,EACT,6EAA6E;YAC7E,gFAAgF;YAChF,2GAA2G;QAC7G,WAAW,EAAE;YACX,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;YAChF,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,CAAC,6FAA6F,CAAC;YAC1G,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;SAChE;QACD,WAAW,EAAE,QAAQ,EAAE;KACxB,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3B,IAAI,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,MAAM,OAAO,CACrB,gBAAgB,kBAAkB,CAAC,EAAE,CAAC,cAAc,MAAM,CAAC,QAAQ,EAAE,EAAE,CACxE,CAAC;QACF,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,YAAY,CACjB;gBACE,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC7B,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;aAC3B,EACD,IAAI,CACL,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACpB,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YACnC,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAE,IAAgC,CAAC,SAAS,CAAC;gBAC9F,CAAC,CAAG,IAAgC,CAAC,SAAuB;gBAC5D,CAAC,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAE,IAAgC,CAAC,KAAK,CAAC;oBAC1F,CAAC,CAAG,IAAgC,CAAC,KAAmB;oBACxD,CAAC,CAAC,EAAE,CAAC;QACX,OAAO,YAAY,CACjB;YACE,KAAK;YACL,KAAK,EAAE,KAAK,IAAI,IAAI;YACpB,cAAc,EAAE,SAAS,CAAC,MAAM;YAChC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YAClC,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,wBAAwB,SAAS,CAAC,MAAM,aAAa,CAAC,CAAC,CAAC,SAAS;SACjG,EACD,KAAK,EACL,EAAE,QAAQ,EAAE,IAAI,EAAE,CACnB,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,sEAAsE;IACtE,MAAM,CAAC,YAAY,CACjB,sCAAsC,EACtC;QACE,KAAK,EAAE,4BAA4B;QACnC,WAAW,EACT,iGAAiG;YACjG,2JAA2J;QAC7J,WAAW,EAAE;YACX,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;YAChF,QAAQ,EAAE,CAAC;iBACR,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;iBAC/B,QAAQ,CACP,sFAAsF,CACvF;SACJ;QACD,WAAW,EAAE,QAAQ,EAAE;KACxB,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACzB,MAAM,CAAC,GAAG,MAAM,OAAO,CAAa,gBAAgB,kBAAkB,CAAC,EAAE,CAAC,WAAW,EAAE;YACrF,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;SAC/B,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,YAAY,CACjB,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EACzG,IAAI,CACL,CAAC;QACJ,CAAC;QACD,OAAO,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACxG,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Recursively strip secret-bearing keys from any value.
3
+ * Arrays and plain objects are traversed; primitives are returned as-is.
4
+ * Replaces removed values with the sentinel "[REDACTED]" so callers can
5
+ * see that a secret WAS present (for debugging) without seeing its value.
6
+ */
7
+ export declare function sanitizeSecrets<T>(input: T): T;
@@ -0,0 +1,70 @@
1
+ // src/modules/apimapper/credential-sanitizer.ts — strip secrets from any object
2
+ // before it crosses the MCP boundary. Defense-in-depth: even if the PHP
3
+ // backend regresses and returns auth_data over the wire, the TS adapter
4
+ // guarantees it never lands in the LLM context.
5
+ //
6
+ // Backed by A4 audit finding 2026-05-18: GET /credentials/{id} currently
7
+ // returns decrypted auth_data. Until the controller is fixed, the adapter
8
+ // must sanitise.
9
+ const SECRET_KEYS = new Set([
10
+ "auth_data",
11
+ "authData",
12
+ "secret",
13
+ "secrets",
14
+ "oauth_refresh_token",
15
+ "oauthRefreshToken",
16
+ "refresh_token",
17
+ "refreshToken",
18
+ "access_token",
19
+ "accessToken",
20
+ "client_secret",
21
+ "clientSecret",
22
+ "api_key",
23
+ "apiKey",
24
+ "password",
25
+ "raw_secret",
26
+ "rawSecret",
27
+ // Defense-in-depth additions (A4 audit round 2):
28
+ "token",
29
+ "bearer_token",
30
+ "bearerToken",
31
+ "private_key",
32
+ "privateKey",
33
+ "signing_key",
34
+ "signingKey",
35
+ "webhook_secret",
36
+ "webhookSecret",
37
+ "consumer_secret",
38
+ "consumerSecret",
39
+ "consumer_key",
40
+ "consumerKey",
41
+ "session_token",
42
+ "sessionToken",
43
+ "id_token",
44
+ "idToken",
45
+ ]);
46
+ /**
47
+ * Recursively strip secret-bearing keys from any value.
48
+ * Arrays and plain objects are traversed; primitives are returned as-is.
49
+ * Replaces removed values with the sentinel "[REDACTED]" so callers can
50
+ * see that a secret WAS present (for debugging) without seeing its value.
51
+ */
52
+ export function sanitizeSecrets(input) {
53
+ if (Array.isArray(input)) {
54
+ return input.map((item) => sanitizeSecrets(item));
55
+ }
56
+ if (input && typeof input === "object") {
57
+ const out = {};
58
+ for (const [k, v] of Object.entries(input)) {
59
+ if (SECRET_KEYS.has(k)) {
60
+ out[k] = "[REDACTED]";
61
+ }
62
+ else {
63
+ out[k] = sanitizeSecrets(v);
64
+ }
65
+ }
66
+ return out;
67
+ }
68
+ return input;
69
+ }
70
+ //# sourceMappingURL=credential-sanitizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-sanitizer.js","sourceRoot":"","sources":["../../../src/modules/apimapper/credential-sanitizer.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,wEAAwE;AACxE,wEAAwE;AACxE,gDAAgD;AAChD,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,iBAAiB;AAEjB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS;IAClC,WAAW;IACX,UAAU;IACV,QAAQ;IACR,SAAS;IACT,qBAAqB;IACrB,mBAAmB;IACnB,eAAe;IACf,cAAc;IACd,cAAc;IACd,aAAa;IACb,eAAe;IACf,cAAc;IACd,SAAS;IACT,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,WAAW;IACX,iDAAiD;IACjD,OAAO;IACP,cAAc;IACd,aAAa;IACb,aAAa;IACb,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,gBAAgB;IAChB,eAAe;IACf,iBAAiB;IACjB,gBAAgB;IAChB,cAAc;IACd,aAAa;IACb,eAAe;IACf,cAAc;IACd,UAAU;IACV,SAAS;CACV,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAI,KAAQ;IACzC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAiB,CAAC;IACpE,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;YACtE,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvB,GAAG,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,OAAO,GAAmB,CAAC;IAC7B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerCredentialTools(server: McpServer): void;