@wootsup/mcp 0.3.0 → 0.4.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 (141) hide show
  1. package/CHANGELOG.md +14 -5
  2. package/dist/catalog/build-catalog.d.ts +31 -0
  3. package/dist/catalog/build-catalog.js +68 -0
  4. package/dist/catalog/build-catalog.js.map +1 -0
  5. package/dist/index.js +37 -5
  6. package/dist/index.js.map +1 -1
  7. package/dist/modules/apimapper/auto-layout.d.ts +21 -0
  8. package/dist/modules/apimapper/auto-layout.js +54 -0
  9. package/dist/modules/apimapper/auto-layout.js.map +1 -0
  10. package/dist/modules/apimapper/client.d.ts +54 -4
  11. package/dist/modules/apimapper/client.js +145 -14
  12. package/dist/modules/apimapper/client.js.map +1 -1
  13. package/dist/modules/apimapper/connections-format.d.ts +31 -1
  14. package/dist/modules/apimapper/connections-format.js +97 -5
  15. package/dist/modules/apimapper/connections-format.js.map +1 -1
  16. package/dist/modules/apimapper/connections.d.ts +9 -7
  17. package/dist/modules/apimapper/connections.js +225 -58
  18. package/dist/modules/apimapper/connections.js.map +1 -1
  19. package/dist/modules/apimapper/credentials.js +86 -14
  20. package/dist/modules/apimapper/credentials.js.map +1 -1
  21. package/dist/modules/apimapper/elicitation.d.ts +29 -0
  22. package/dist/modules/apimapper/elicitation.js +62 -0
  23. package/dist/modules/apimapper/elicitation.js.map +1 -1
  24. package/dist/modules/apimapper/example-extract.d.ts +13 -0
  25. package/dist/modules/apimapper/example-extract.js +111 -0
  26. package/dist/modules/apimapper/example-extract.js.map +1 -0
  27. package/dist/modules/apimapper/filter-operators.d.ts +24 -0
  28. package/dist/modules/apimapper/filter-operators.js +103 -0
  29. package/dist/modules/apimapper/filter-operators.js.map +1 -0
  30. package/dist/modules/apimapper/flows-format.js +92 -22
  31. package/dist/modules/apimapper/flows-format.js.map +1 -1
  32. package/dist/modules/apimapper/flows.d.ts +8 -7
  33. package/dist/modules/apimapper/flows.js +216 -44
  34. package/dist/modules/apimapper/flows.js.map +1 -1
  35. package/dist/modules/apimapper/gateway/advanced-read-tool.d.ts +9 -0
  36. package/dist/modules/apimapper/gateway/advanced-read-tool.js +172 -0
  37. package/dist/modules/apimapper/gateway/advanced-read-tool.js.map +1 -0
  38. package/dist/modules/apimapper/gateway/advanced-tool.js +39 -130
  39. package/dist/modules/apimapper/gateway/advanced-tool.js.map +1 -1
  40. package/dist/modules/apimapper/gateway/collect-module-tools.d.ts +17 -0
  41. package/dist/modules/apimapper/gateway/collect-module-tools.js +44 -0
  42. package/dist/modules/apimapper/gateway/collect-module-tools.js.map +1 -0
  43. package/dist/modules/apimapper/gateway/essentials.d.ts +1 -1
  44. package/dist/modules/apimapper/gateway/essentials.js +19 -7
  45. package/dist/modules/apimapper/gateway/essentials.js.map +1 -1
  46. package/dist/modules/apimapper/gateway/gateway-shared.d.ts +21 -0
  47. package/dist/modules/apimapper/gateway/gateway-shared.js +124 -0
  48. package/dist/modules/apimapper/gateway/gateway-shared.js.map +1 -0
  49. package/dist/modules/apimapper/gateway/test-support.d.ts +1 -17
  50. package/dist/modules/apimapper/gateway/test-support.js +4 -33
  51. package/dist/modules/apimapper/gateway/test-support.js.map +1 -1
  52. package/dist/modules/apimapper/get-skill-cores.d.ts +4 -0
  53. package/dist/modules/apimapper/get-skill-cores.js +220 -0
  54. package/dist/modules/apimapper/get-skill-cores.js.map +1 -0
  55. package/dist/modules/apimapper/get-skill.d.ts +1 -1
  56. package/dist/modules/apimapper/get-skill.js +30 -3
  57. package/dist/modules/apimapper/get-skill.js.map +1 -1
  58. package/dist/modules/apimapper/graph-builder.d.ts +85 -2
  59. package/dist/modules/apimapper/graph-builder.js +151 -15
  60. package/dist/modules/apimapper/graph-builder.js.map +1 -1
  61. package/dist/modules/apimapper/graph.js +115 -15
  62. package/dist/modules/apimapper/graph.js.map +1 -1
  63. package/dist/modules/apimapper/index.js +25 -13
  64. package/dist/modules/apimapper/index.js.map +1 -1
  65. package/dist/modules/apimapper/jmespath-test.d.ts +4 -0
  66. package/dist/modules/apimapper/jmespath-test.js +152 -0
  67. package/dist/modules/apimapper/jmespath-test.js.map +1 -0
  68. package/dist/modules/apimapper/library.js +131 -8
  69. package/dist/modules/apimapper/library.js.map +1 -1
  70. package/dist/modules/apimapper/list-footer.d.ts +27 -0
  71. package/dist/modules/apimapper/list-footer.js +57 -0
  72. package/dist/modules/apimapper/list-footer.js.map +1 -0
  73. package/dist/modules/apimapper/local-sources.js +88 -31
  74. package/dist/modules/apimapper/local-sources.js.map +1 -1
  75. package/dist/modules/apimapper/mcp-client-identity.d.ts +32 -0
  76. package/dist/modules/apimapper/mcp-client-identity.js +70 -0
  77. package/dist/modules/apimapper/mcp-client-identity.js.map +1 -0
  78. package/dist/modules/apimapper/merge-constants.d.ts +6 -0
  79. package/dist/modules/apimapper/merge-constants.js +26 -0
  80. package/dist/modules/apimapper/merge-constants.js.map +1 -0
  81. package/dist/modules/apimapper/node-schema.d.ts +52 -2
  82. package/dist/modules/apimapper/node-schema.js +95 -4
  83. package/dist/modules/apimapper/node-schema.js.map +1 -1
  84. package/dist/modules/apimapper/onboarding.d.ts +29 -0
  85. package/dist/modules/apimapper/onboarding.js +117 -9
  86. package/dist/modules/apimapper/onboarding.js.map +1 -1
  87. package/dist/modules/apimapper/read-cache.d.ts +16 -3
  88. package/dist/modules/apimapper/read-cache.js +59 -4
  89. package/dist/modules/apimapper/read-cache.js.map +1 -1
  90. package/dist/modules/apimapper/render/index.js +26 -5
  91. package/dist/modules/apimapper/render/index.js.map +1 -1
  92. package/dist/modules/apimapper/resource-id.d.ts +13 -0
  93. package/dist/modules/apimapper/resource-id.js +69 -0
  94. package/dist/modules/apimapper/resource-id.js.map +1 -0
  95. package/dist/modules/apimapper/tool-result.d.ts +20 -0
  96. package/dist/modules/apimapper/tool-result.js +67 -5
  97. package/dist/modules/apimapper/tool-result.js.map +1 -1
  98. package/dist/modules/apimapper/toolslist-size.d.ts +10 -10
  99. package/dist/modules/apimapper/toolslist-size.js +29 -18
  100. package/dist/modules/apimapper/toolslist-size.js.map +1 -1
  101. package/dist/modules/apimapper/types.d.ts +13 -0
  102. package/dist/modules/apimapper/types.js +1 -1
  103. package/dist/modules/apimapper/types.js.map +1 -1
  104. package/dist/modules/apimapper/whitelist-drift.js +16 -1
  105. package/dist/modules/apimapper/whitelist-drift.js.map +1 -1
  106. package/dist/modules/apimapper/workflows.js +221 -32
  107. package/dist/modules/apimapper/workflows.js.map +1 -1
  108. package/dist/modules/apimapper/yootheme-binding.js +103 -22
  109. package/dist/modules/apimapper/yootheme-binding.js.map +1 -1
  110. package/dist/platform/index.js +7 -0
  111. package/dist/platform/index.js.map +1 -1
  112. package/dist/proxy/bridge.d.ts +35 -0
  113. package/dist/proxy/bridge.js +129 -0
  114. package/dist/proxy/bridge.js.map +1 -0
  115. package/dist/proxy/mode.d.ts +9 -0
  116. package/dist/proxy/mode.js +20 -0
  117. package/dist/proxy/mode.js.map +1 -0
  118. package/dist/setup/probe-auth.d.ts +51 -0
  119. package/dist/setup/probe-auth.js +141 -0
  120. package/dist/setup/probe-auth.js.map +1 -0
  121. package/dist/setup-cli.d.ts +9 -0
  122. package/dist/setup-cli.js +34 -0
  123. package/dist/setup-cli.js.map +1 -1
  124. package/dist/sites/loader.d.ts +7 -0
  125. package/dist/sites/loader.js +16 -1
  126. package/dist/sites/loader.js.map +1 -1
  127. package/dist/skill-instructions.d.ts +14 -1
  128. package/dist/skill-instructions.js +30 -6
  129. package/dist/skill-instructions.js.map +1 -1
  130. package/manifest.json +2 -2
  131. package/package.json +3 -2
  132. package/skills/apimapper/SKILL.md +78 -3
  133. package/skills/apimapper/reference/dynamize-existing-layout.md +158 -0
  134. package/skills/apimapper/reference/jmespath-cookbook.md +241 -0
  135. package/skills/apimapper/reference/jmespath-pitfalls.md +81 -0
  136. package/skills/apimapper/reference/library-template-discovery.md +1 -1
  137. package/skills/apimapper/reference/merge-two-sources-on-key.md +117 -12
  138. package/skills/apimapper/reference/oauth.md +143 -52
  139. package/skills/apimapper/reference/troubleshooting.md +2 -2
  140. package/skills/apimapper/reference/yootheme-source-to-builder-handoff.md +348 -0
  141. package/skills/apimapper/reference/yootheme.md +75 -44
@@ -143,19 +143,74 @@ export function setCached(method, url, data, opts) {
143
143
  storedAt: now,
144
144
  });
145
145
  }
146
+ /**
147
+ * Cross-family invalidation map (A19, mcp-cold-readiness-audit 2026-06-10).
148
+ *
149
+ * Some mutations affect a DIFFERENT resource family than the path they POST
150
+ * to. The path-overlap matcher below only handles same-family + ancestor/
151
+ * descendant invalidation; it cannot know that completing an OAuth flow
152
+ * mutates credential STATUS. Each entry maps a mutation-path prefix to the
153
+ * extra read-family path(s) that must also be flushed.
154
+ *
155
+ * `/oauth` → `/credentials`: oauth_authorize_begin (and the consent callback)
156
+ * refresh a credential's token; without this, a cached GET /credentials keeps
157
+ * serving the pre-authorize "expired" status for the full TTL and the agent
158
+ * re-suggests a reconnect it already completed.
159
+ */
160
+ const CROSS_FAMILY_INVALIDATION = [
161
+ { when: "/oauth", also: ["/credentials"] },
162
+ ];
146
163
  /**
147
164
  * Invalidate cache entries whose request path overlaps with the mutated
148
- * resource. Conservative — clears every entry whose key includes the
149
- * given path-substring. e.g. invalidateByPath('/flows') clears
150
- * `/flows`, `/flows?status=published`, `/flows/abc123`.
165
+ * resource — in BOTH directions. Conservative — clears every entry whose
166
+ * cached path contains the mutation path (descendants + query variants,
167
+ * e.g. invalidateByPath('/flows') clears `/flows`, `/flows?status=…`,
168
+ * `/flows/abc123`) AND every entry whose cached path is an ancestor of
169
+ * the mutation path (e.g. POST `/flows/abc/detect-schema` flushes the
170
+ * cached GET `/flows/abc` and `/flows`).
171
+ *
172
+ * The ancestor direction is load-bearing: 2026-06-09 Round-2 live repro —
173
+ * a sub-resource mutation (`/flows/{id}/detect-schema`) persisted the
174
+ * output schema, but the cached parent GET `/flows/{id}` kept serving the
175
+ * pre-schema flow for the full TTL, so binding_for_flow reported
176
+ * fields:[] while the data was already saved.
177
+ *
178
+ * A19: in addition, a mutation may invalidate a DIFFERENT resource family
179
+ * (see CROSS_FAMILY_INVALIDATION) — e.g. an /oauth mutation flushes the
180
+ * cached /credentials list.
151
181
  *
152
182
  * Called automatically from client.ts on POST/PUT/PATCH/DELETE.
153
183
  */
154
184
  export function invalidateByPath(path) {
155
185
  const needle = path.split("?")[0]; // strip query, match path only
156
186
  for (const key of store.keys()) {
157
- if (key.includes(needle))
187
+ if (key.includes(needle)) {
158
188
  store.delete(key);
189
+ continue;
190
+ }
191
+ // Ancestor match: the cached entry's path-part (key format
192
+ // `METHOD::S|R::url`) is a path-segment prefix of the mutation path.
193
+ const keyPath = (key.split("::")[2] ?? "").split("?")[0];
194
+ if (keyPath !== "" && needle.startsWith(keyPath + "/")) {
195
+ store.delete(key);
196
+ }
197
+ }
198
+ // A19 — cross-family: a mutation under a mapped prefix also flushes the
199
+ // related read-family path(s). Each `also` entry is delegated back through
200
+ // the same descendant/query-variant matcher so `/credentials?…` variants go
201
+ // too. Guarded against self-recursion (an `also` path never re-matches its
202
+ // own `when`).
203
+ for (const rule of CROSS_FAMILY_INVALIDATION) {
204
+ if (needle.includes(rule.when)) {
205
+ for (const alsoPath of rule.also) {
206
+ const alsoNeedle = alsoPath.split("?")[0];
207
+ for (const key of store.keys()) {
208
+ if (key.includes(alsoNeedle)) {
209
+ store.delete(key);
210
+ }
211
+ }
212
+ }
213
+ }
159
214
  }
160
215
  }
161
216
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"read-cache.js","sourceRoot":"","sources":["../../../src/modules/apimapper/read-cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"read-cache.js","sourceRoot":"","sources":["../../../src/modules/apimapper/read-cache.ts"],"names":[],"mappings":"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"}
@@ -8,16 +8,16 @@ import { capRendered, hintFor, HARD_CAP, RESERVE } from "./token-cap.js";
8
8
  // the same affordance when a renderer's Zod schema rejects the payload.
9
9
  const RENDER_ERROR_HINTS = {
10
10
  table: "type:'table' expects an array of objects — fetch with " +
11
- "apimapper_connection_data or apimapper_graph_preview.",
11
+ 'apimapper_connection_data or apimapper_advanced({ tool: "apimapper_graph_preview" }).',
12
12
  "chart-bar": "type:'chart-bar' expects { labels: string[], values: number[] } of equal length.",
13
13
  "chart-line": "type:'chart-line' expects { labels: string[], values: number[] } of equal length.",
14
14
  "schema-diagram": "type:'schema-diagram' expects a schema profile with fields[] — " +
15
- "fetch with apimapper_schema_profile.",
15
+ 'fetch with apimapper_advanced({ tool: "apimapper_schema_profile" }).',
16
16
  "flow-diagram": "type:'flow-diagram' expects a flow object with nodes[]+edges[] — " +
17
- "fetch with apimapper_flow_get.",
17
+ 'fetch with apimapper_advanced({ tool: "apimapper_flow_get" }).',
18
18
  "json-tree": "type:'json-tree' accepts any JSON value — pass the fetched payload directly.",
19
19
  diff: "type:'diff' expects { old, new } — fetch both datasets first " +
20
- "(e.g. two apimapper_schema_profile calls).",
20
+ '(e.g. two apimapper_advanced({ tool: "apimapper_schema_profile" }) calls).',
21
21
  };
22
22
  // MCP CallToolResult outer guard. DERIVED from token-cap.ts's HARD_CAP +
23
23
  // RESERVE so the relationship is compiler-enforced — bumping HARD_CAP in
@@ -62,7 +62,28 @@ export function registerRenderTool(server) {
62
62
  "Example:\n apimapper_render({ type: 'flow-diagram', data: flowObject })",
63
63
  inputSchema: {
64
64
  type: z.enum(RENDER_TYPES).describe("Visualization type"),
65
- data: z.unknown().describe("Data to render. Shape depends on type see description."),
65
+ // MCP clients (and forwarding LLMs) frequently deliver `data` as a
66
+ // JSON *string* — the fetched payload gets serialised on the way in.
67
+ // Pre-parse a JSON string back into its value before the renderer's
68
+ // inner Zod schema runs, otherwise every renderer rejects the string
69
+ // ("table requires an array", etc.). A non-JSON string (e.g. a plain
70
+ // sentence) keeps its original value so it can still render as a
71
+ // primitive leaf. The inner schema stays z.unknown() — per-type
72
+ // validation lives in each renderer.
73
+ data: z
74
+ .preprocess((v) => {
75
+ if (typeof v !== "string")
76
+ return v;
77
+ const trimmed = v.trim();
78
+ try {
79
+ return JSON.parse(trimmed);
80
+ }
81
+ catch {
82
+ return v;
83
+ }
84
+ }, z.unknown())
85
+ .describe("Data to render. Shape depends on type — see description. " +
86
+ "A JSON-encoded string is auto-parsed; a plain string renders as-is."),
66
87
  options: z.object({
67
88
  title: z.string().max(200).optional()
68
89
  .describe("Optional title shown above the visualization"),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/apimapper/render/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAmB,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzE,qEAAqE;AACrE,wEAAwE;AACxE,8EAA8E;AAC9E,wEAAwE;AACxE,MAAM,kBAAkB,GAA+B;IACrD,KAAK,EACH,wDAAwD;QACxD,uDAAuD;IACzD,WAAW,EACT,kFAAkF;IACpF,YAAY,EACV,mFAAmF;IACrF,gBAAgB,EACd,iEAAiE;QACjE,sCAAsC;IACxC,cAAc,EACZ,mEAAmE;QACnE,gCAAgC;IAClC,WAAW,EACT,8EAA8E;IAChF,IAAI,EACF,+DAA+D;QAC/D,4CAA4C;CAC/C,CAAC;AAEF,yEAAyE;AACzE,yEAAyE;AACzE,sEAAsE;AACtE,0EAA0E;AAC1E,0EAA0E;AAC1E,uEAAuE;AACvE,4DAA4D;AAC5D,MAAM,qBAAqB,GAAG,QAAQ,GAAG,OAAO,GAAG,GAAG,CAAC;AAEvD,MAAM,UAAU,kBAAkB,CAAC,MAAqB;IACtD,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,aAAa;QACpB,WAAW;QACT,iEAAiE;QACjE,kEAAkE;QAClE,mEAAmE;QACnE,gEAAgE;QAChE,mEAAmE;QACnE,gEAAgE;QAChE,mDAAmD;QACnD,iEAAiE;YACjE,kEAAkE;YAClE,mEAAmE;YACnE,2CAA2C;YAC3C,kEAAkE;YAClE,6DAA6D;YAC7D,gEAAgE;YAChE,kEAAkE;YAClE,iCAAiC;YACjC,uEAAuE;YACvE,mCAAmC;YACnC,+DAA+D;YAC/D,qEAAqE;YACrE,sCAAsC;YACtC,gFAAgF;YAChF,kEAAkE;YAClE,2EAA2E;YAC3E,iEAAiE;YACjE,oEAAoE;YACpE,4DAA4D;YAC5D,oEAAoE;YACpE,0EAA0E;QAC5E,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YACzD,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CACxB,0DAA0D,CAC3D;YACD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;gBAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;qBAClC,QAAQ,CAAC,8CAA8C,CAAC;gBAC3D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;qBAC9D,QAAQ,CAAC,gDAAgD,CAAC;gBAC7D,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;qBAC5C,QAAQ,CAAC,kDAAkD,CAAC;gBAC/D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;qBACxD,QAAQ,CAAC,qCAAqC,CAAC;gBAClD,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;qBAC/C,QAAQ,CAAC,8DAA8D,CAAC;aAC5E,CAAC,CAAC,QAAQ,EAAE;SACd;QACD,WAAW,EAAE,QAAQ,CAAC;YACpB,KAAK,EAAE,aAAa;YACpB,SAAS,EAAE,KAAK;SACjB,CAAC;KACH,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QAChC,mEAAmE;QACnE,wEAAwE;QACxE,uEAAuE;QACvE,+DAA+D;QAC/D,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YAChD,OAAO,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,qBAAqB,EAAE,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mEAAmE;YACnE,oEAAoE;YACpE,2DAA2D;YAC3D,iFAAiF;YACjF,MAAM,GAAG,GACP,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACvD,kEAAkE;YAClE,mEAAmE;YACnE,mEAAmE;YACnE,gCAAgC;YAChC,MAAM,OAAO,GACX,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACnD,mEAAmE;YACnE,gEAAgE;YAChE,kEAAkE;YAClE,YAAY;YACZ,OAAO,YAAY,CACjB,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC,EAAE,EACxD,IAAI,CACL,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/apimapper/render/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Extract a Google Spreadsheet ID from a pasted URL, or return the input
3
+ * unchanged when it is already a bare ID (or an unrecognised value the
4
+ * backend should validate).
5
+ *
6
+ * Handles:
7
+ * - bare ID: 1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms
8
+ * - standard URL: https://docs.google.com/spreadsheets/d/{ID}/edit
9
+ * - URL with #gid hash: .../spreadsheets/d/{ID}/edit#gid=0
10
+ * - /copy, /view, etc.: .../spreadsheets/d/{ID}/copy
11
+ */
12
+ export declare function extractSpreadsheetId(input: string): string;
13
+ export declare function normalizeResourceIdFields<T extends Record<string, unknown> | undefined>(fields: T): T;
@@ -0,0 +1,69 @@
1
+ // src/modules/apimapper/resource-id.ts — server-bound resource-ID normalizers.
2
+ //
3
+ // A5 (2026-06-10): a cold-agent customer supplies ONLY a Google Drive / Sheets
4
+ // URL (the only thing they have), but the worker template placeholder
5
+ // {{spreadsheet_id}} needs the BARE id. The single URL→ID extractor used to
6
+ // live in the React admin-UI (extractResourceId.ts) and never reached the
7
+ // wire — so an MCP/REST caller pasting a URL produced a broken connection that
8
+ // returned 0 rows with no debuggable signal. We normalize on the MCP→REST
9
+ // boundary so the exact-as-given input works.
10
+ //
11
+ // Port of admin-ui/src/utils/extractResourceId.ts kept deliberately in
12
+ // lockstep — same patterns, same "return input unchanged when nothing
13
+ // matches" contract (the backend still validates).
14
+ /**
15
+ * Extract a Google Spreadsheet ID from a pasted URL, or return the input
16
+ * unchanged when it is already a bare ID (or an unrecognised value the
17
+ * backend should validate).
18
+ *
19
+ * Handles:
20
+ * - bare ID: 1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms
21
+ * - standard URL: https://docs.google.com/spreadsheets/d/{ID}/edit
22
+ * - URL with #gid hash: .../spreadsheets/d/{ID}/edit#gid=0
23
+ * - /copy, /view, etc.: .../spreadsheets/d/{ID}/copy
24
+ */
25
+ export function extractSpreadsheetId(input) {
26
+ const trimmed = input.trim();
27
+ // Already a bare ID (alphanumeric + dash + underscore, 20+ chars).
28
+ if (/^[a-zA-Z0-9_-]{20,}$/.test(trimmed)) {
29
+ return trimmed;
30
+ }
31
+ const urlMatch = trimmed.match(/\/spreadsheets\/d\/([a-zA-Z0-9_-]+)/);
32
+ if (urlMatch?.[1]) {
33
+ return urlMatch[1];
34
+ }
35
+ // Unrecognised — return as-is, let the backend validate.
36
+ return trimmed;
37
+ }
38
+ /**
39
+ * Normalize the well-known resource-ID fields inside a template-field /
40
+ * extra-field map IN PLACE-safe fashion (returns a new object). Currently
41
+ * handles `spreadsheet_id` (Google Sheets); the table is the single place to
42
+ * extend for future URL-shaped resource IDs (drive_file_id, doc_id, ...).
43
+ *
44
+ * Only string values are touched; non-string values pass through verbatim so
45
+ * the wider string|number|boolean schema on connection_data.template_fields
46
+ * is preserved. Returns the input reference unchanged when there is nothing
47
+ * to normalize, so a default call stays byte-identical on the wire.
48
+ */
49
+ const RESOURCE_ID_NORMALIZERS = {
50
+ spreadsheet_id: extractSpreadsheetId,
51
+ };
52
+ export function normalizeResourceIdFields(fields) {
53
+ if (!fields || typeof fields !== "object")
54
+ return fields;
55
+ let changed = false;
56
+ const out = { ...fields };
57
+ for (const [key, normalize] of Object.entries(RESOURCE_ID_NORMALIZERS)) {
58
+ const value = out[key];
59
+ if (typeof value === "string") {
60
+ const next = normalize(value);
61
+ if (next !== value) {
62
+ out[key] = next;
63
+ changed = true;
64
+ }
65
+ }
66
+ }
67
+ return (changed ? out : fields);
68
+ }
69
+ //# sourceMappingURL=resource-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-id.js","sourceRoot":"","sources":["../../../src/modules/apimapper/resource-id.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,+EAA+E;AAC/E,sEAAsE;AACtE,4EAA4E;AAC5E,0EAA0E;AAC1E,+EAA+E;AAC/E,0EAA0E;AAC1E,8CAA8C;AAC9C,EAAE;AACF,uEAAuE;AACvE,sEAAsE;AACtE,mDAAmD;AAEnD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,mEAAmE;IACnE,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACtE,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClB,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,yDAAyD;IACzD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,uBAAuB,GAA0C;IACrE,cAAc,EAAE,oBAAoB;CACrC,CAAC;AAEF,MAAM,UAAU,yBAAyB,CAEvC,MAAS;IACT,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IACzD,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,GAAG,GAA4B,EAAE,GAAG,MAAM,EAAE,CAAC;IACnD,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACvE,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBAChB,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAM,CAAC;AACvC,CAAC"}
@@ -13,6 +13,15 @@ export interface RestErrorLike {
13
13
  errorCode?: ApiErrorCode | string;
14
14
  /** HTTP status, used as the `code` fallback when `errorCode` is absent. */
15
15
  status?: number;
16
+ /**
17
+ * F11 (2026-06-09): the parsed JSON body of a non-2xx response (the WP +
18
+ * Joomla platform paths thread it through as `errorBody`). When the server
19
+ * returns a STRUCTURED domain error — e.g. the 400 `invalid_content_type`
20
+ * payload `{error_code, valid_types, suggestion}` — we surface those fields
21
+ * VERBATIM instead of the coarse `errorCode`/`hintFor()` defaults. Absent for
22
+ * non-JSON errors and for the legacy paths that never set it.
23
+ */
24
+ errorBody?: Record<string, unknown>;
16
25
  }
17
26
  /** Per-site overrides for the canonical REST-error mapping. */
18
27
  export interface RestErrorOpts {
@@ -31,6 +40,17 @@ export interface RestErrorOpts {
31
40
  * `response.errorCode` is absent. Use only where a site pinned a domain code.
32
41
  */
33
42
  code?: string;
43
+ /**
44
+ * F6 (2026-06-09): opt-in scope-aware 403 handling. Set by tools whose 403
45
+ * means "your key lacks the required scope" rather than "your key is
46
+ * invalid" — e.g. the *_delete tools (delete needs admin scope; a valid
47
+ * read+write key still 403s). When true AND the response is a 403 (or the
48
+ * body signals insufficient scope), the suggestion becomes a scope-upgrade
49
+ * hint instead of the generic key-recovery walkthrough. A 401 always stays a
50
+ * genuine bad-key auth failure even under scopeAware. Leave unset everywhere
51
+ * else so non-delete tools keep the legacy auth hint byte-for-byte.
52
+ */
53
+ scopeAware?: boolean;
34
54
  }
35
55
  /**
36
56
  * Build the canonical structured error result for a failed REST request.
@@ -51,13 +51,75 @@ import { hintFor } from "./client.js";
51
51
  */
52
52
  export function restErrorResult(response, details, opts = {}) {
53
53
  const errorCode = response.errorCode;
54
+ const body = response.errorBody;
55
+ // F11: structured server-error passthrough. When the server attached a
56
+ // domain error_code (e.g. invalid_content_type), prefer it for `code`, lift
57
+ // its `suggestion` over the coarse hintFor(), and thread its `valid_types`
58
+ // (and any other primitive hint) into `details` so the agent can
59
+ // self-correct. Only engages when the body actually carries a string
60
+ // `error_code` — so a plain `{success:false, error}` body keeps the legacy
61
+ // path byte-for-byte.
62
+ const serverErrorCode = body && typeof body.error_code === "string" && body.error_code !== ""
63
+ ? body.error_code
64
+ : undefined;
65
+ const serverSuggestion = body && typeof body.suggestion === "string" && body.suggestion !== ""
66
+ ? body.suggestion
67
+ : undefined;
68
+ const serverValidTypes = body && Array.isArray(body.valid_types) ? body.valid_types : undefined;
69
+ // F6: scope-aware 403. A delete tool (scopeAware:true) that gets a 403 — or
70
+ // any body signalling insufficient scope — is missing the admin scope, not
71
+ // holding a bad key. A 401 is always a genuine bad-key failure regardless.
72
+ const bodyScopeSignal = body &&
73
+ ((typeof body.error_code === "string" && /scope/i.test(body.error_code)) ||
74
+ (typeof body.required_scope === "string" && body.required_scope !== ""));
75
+ const isScopeFailure = response.status !== 401 &&
76
+ (opts.scopeAware === true || bodyScopeSignal === true) &&
77
+ (response.status === 403 || bodyScopeSignal === true);
78
+ // F204 — distinguish an OWNERSHIP denial from a plain missing-admin-scope
79
+ // denial. `insufficient_scope_ownership` means the write-scope key tried to
80
+ // delete a flow it did NOT create; the remedy is "delete only your own flows,
81
+ // or use an admin key", not just "create an admin key".
82
+ const isOwnershipFailure = body && typeof body.error_code === "string" && body.error_code === "insufficient_scope_ownership";
83
+ const scopeSuggestion = isOwnershipFailure
84
+ ? "This write-scope key can only delete flows they created (the flow's owner " +
85
+ "kid must match the key's kid). This flow was created by a different key or " +
86
+ "via the dashboard, so it needs the admin scope. Use an admin-scope key " +
87
+ "(API Mapper → ⋮ menu → Settings → MCP Access → New API key, grant the admin " +
88
+ "scope, then re-run `npx -y @wootsup/mcp setup`), or delete it from the dashboard."
89
+ : isScopeFailure
90
+ ? "Your key lacks the admin scope required for delete/destructive operations. " +
91
+ "Create an admin-scope key (API Mapper → ⋮ menu → Settings → MCP Access → New API key, " +
92
+ "grant the admin scope) and re-run `npx -y @wootsup/mcp setup`, or perform the deletion " +
93
+ "from the dashboard."
94
+ : undefined;
95
+ // Suggestion precedence: explicit opts.suggestion → server suggestion (F11)
96
+ // → scope hint (F6) → coarse/message-driven hintFor(). The first three are
97
+ // intentional overrides; hintFor() is the legacy default. F83: pass the
98
+ // upstream `error` message so a JMESPath depth-limit 422 (which classifies to
99
+ // "unknown") routes to the two-transform-split remedy instead of the generic
100
+ // health hint. The depth detection only fires on the depth-limit wording, so
101
+ // every other message keeps the code-based hint byte-for-byte.
102
+ const suggestion = opts.suggestion ??
103
+ serverSuggestion ??
104
+ scopeSuggestion ??
105
+ hintFor(errorCode, response.error);
106
+ // Code precedence: server domain error_code (F11) → coarse errorCode →
107
+ // opts.code → status. The server code is the most specific, so it wins over
108
+ // the coarse classification (which is often just "unknown" for a 400).
109
+ const code = serverErrorCode ??
110
+ (errorCode !== undefined && errorCode !== ""
111
+ ? String(errorCode)
112
+ : opts.code ?? (response.status ? String(response.status) : undefined));
113
+ // Merge server hint fields (valid_types) into details so they reach the
114
+ // agent. Caller-supplied details win on key collision.
115
+ const mergedDetails = serverValidTypes !== undefined
116
+ ? { valid_types: serverValidTypes, ...(details ?? {}) }
117
+ : details;
54
118
  return errorResult({
55
119
  message: response.error ?? opts.message ?? "request failed",
56
- code: errorCode !== undefined && errorCode !== ""
57
- ? String(errorCode)
58
- : opts.code ?? (response.status ? String(response.status) : undefined),
59
- suggestion: opts.suggestion ?? hintFor(errorCode),
60
- ...(details !== undefined ? { details } : {}),
120
+ code,
121
+ suggestion,
122
+ ...(mergedDetails !== undefined ? { details: mergedDetails } : {}),
61
123
  });
62
124
  }
63
125
  //# sourceMappingURL=tool-result.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-result.js","sourceRoot":"","sources":["../../../src/modules/apimapper/tool-result.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,EAAE;AACF,wEAAwE;AACxE,6DAA6D;AAC7D,EAAE;AACF,sBAAsB;AACtB,2BAA2B;AAC3B,mDAAmD;AACnD,wEAAwE;AACxE,0CAA0C;AAC1C,qCAAqC;AACrC,UAAU;AACV,MAAM;AACN,EAAE;AACF,yEAAyE;AACzE,kEAAkE;AAClE,EAAE;AACF,6DAA6D;AAC7D,0EAA0E;AAC1E,yDAAyD;AACzD,2EAA2E;AAC3E,EAAE;AACF,+CAA+C;AAC/C,+EAA+E;AAC/E,+EAA+E;AAC/E,8EAA8E;AAC9E,uDAAuD;AACvD,qEAAqE;AACrE,gFAAgF;AAChF,mEAAmE;AACnE,qDAAqD;AACrD,EAAE;AACF,sEAAsE;AACtE,qEAAqE;AACrE,0EAA0E;AAC1E,2EAA2E;AAC3E,4EAA4E;AAC5E,yCAAyC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,OAAO,EAAqB,MAAM,aAAa,CAAC;AAoCzD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAuB,EACvB,OAAiC,EACjC,OAAsB,EAAE;IAExB,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;IACrC,OAAO,WAAW,CAAC;QACjB,OAAO,EAAE,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,IAAI,gBAAgB;QAC3D,IAAI,EACF,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE;YACzC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,UAAU,EACR,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,SAAqC,CAAC;QACnE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"tool-result.js","sourceRoot":"","sources":["../../../src/modules/apimapper/tool-result.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { type CollectedTool } from "./gateway/test-support.js";
1
+ import { type CollectedTool } from "./gateway/collect-module-tools.js";
2
2
  /**
3
3
  * The minimal `tools/list`-relevant slice of a registered tool: the fields the
4
4
  * MCP client receives and the LLM reads as part of the static catalog.
@@ -23,9 +23,9 @@ export interface ToolsListMeasurement {
23
23
  }
24
24
  /** The full Task-B result: the post-W3 and pre-W3-equivalent surfaces. */
25
25
  export interface ToolsListComparison {
26
- /** Post-W3 `tools/list` — the 19 surface tools the server exposes today. */
26
+ /** Post-W3 `tools/list` — the 21 surface tools the server exposes today. */
27
27
  postW3: ToolsListMeasurement;
28
- /** Pre-W3-equivalent `tools/list` — all 78 tools exposed flat (no gateway). */
28
+ /** Pre-W3-equivalent `tools/list` — all 79 tools exposed flat (no gateways). */
29
29
  preW3Flat: ToolsListMeasurement;
30
30
  /** Absolute byte reduction (preW3Flat.totalBytes − postW3.totalBytes). */
31
31
  bytesSaved: number;
@@ -39,18 +39,18 @@ export interface ToolsListComparison {
39
39
  */
40
40
  export declare function toCatalogEntry(name: string, tool: Pick<CollectedTool, "description" | "inputSchema" | "annotations">): ToolCatalogEntry;
41
41
  /**
42
- * Builds the full 79-tool catalog from the current build and measures the
42
+ * Builds the full 81-tool catalog from the current build and measures the
43
43
  * post-W3 vs pre-W3-equivalent `tools/list` payload sizes.
44
44
  *
45
45
  * Surface composition (verified against `gateway/essentials.ts` + `src/index.ts`,
46
46
  * pinned live in `gateway/gateway.test.ts` — A2):
47
- * - module tools : 15 essentials + `apimapper_advanced` = 16 (on the real
48
- * McpServer) + 60 advanced (gateway registry) = 76
47
+ * - module tools : 16 essentials + `apimapper_advanced` + `apimapper_advanced_read`
48
+ * = 18 (on the real McpServer) + 60 advanced (gateway registry) = 78
49
49
  * - top-level tools: rest_modules_status + use_profile + list_profiles = 3
50
- * total = 79
50
+ * total = 81
51
51
  *
52
- * POST-W3 `tools/list` = the 16 module-real tools + the 3 top-level tools = 19.
53
- * PRE-W3 flat `tools/list` = the 18 non-gateway surface tools + the 60 advanced
54
- * tools = 78 (the `apimapper_advanced` gateway did not exist pre-W3).
52
+ * POST-W3 `tools/list` = the 18 module-real tools + the 3 top-level tools = 21.
53
+ * PRE-W3 flat `tools/list` = the 19 non-gateway surface tools + the 60 advanced
54
+ * tools = 79 (neither gateway existed pre-W3).
55
55
  */
56
56
  export declare function measureToolsList(): Promise<ToolsListComparison>;
@@ -7,15 +7,23 @@
7
7
  // Two figures, both derived from the CURRENT build (canonical counts asserted
8
8
  // live in gateway/gateway.test.ts — A2, 2026-06-03):
9
9
  //
10
- // - POST-W3 `tools/list` — the 19 surface tools the server now exposes
11
- // (15 module essentials + `apimapper_advanced`
12
- // + the 3 src/index.ts top-level tools).
10
+ // - POST-W3 `tools/list` — the 21 surface tools the server now exposes
11
+ // (16 module essentials + `apimapper_advanced`
12
+ // + `apimapper_advanced_read` + the 3
13
+ // src/index.ts top-level tools).
13
14
  // - PRE-W3-equivalent `tools/list` — what `tools/list` WOULD be if all 79
14
15
  // tools were exposed flat (the pre-Gateway
15
- // state): the 19 surface tools minus the
16
- // gateway tool, plus the 60 advanced-registry
17
- // tool configs — 78 flat tools. (Pre-W3 the
18
- // `apimapper_advanced` gateway did not exist.)
16
+ // state): the 21 surface tools minus the TWO
17
+ // gateway tools, plus the 60 advanced-registry
18
+ // tool configs — 79 flat tools. (Pre-W3 neither
19
+ // gateway existed.)
20
+ // F115 (2026-06-11): apimapper_health promoted
21
+ // advanced→essential — surface 19→20, advanced
22
+ // 60→59 then 60. F200b (2026-06-12):
23
+ // apimapper_advanced_read added as a 2nd
24
+ // module-real gateway — surface 20→21; the flat
25
+ // total stays 79 (a gateway is a routing entry,
26
+ // never a flat tool).
19
27
  //
20
28
  // Per-tool serialization mirrors what the MCP SDK puts on the wire for one
21
29
  // `tools/list` entry: `{ name, description, inputSchema, annotations }`, where
@@ -33,7 +41,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
33
41
  import { loadModules } from "@getimo/mcp-toolkit";
34
42
  import { z } from "zod";
35
43
  import { apimapperRestModule } from "./index.js";
36
- import { collectModuleTools } from "./gateway/test-support.js";
44
+ import { collectModuleTools } from "./gateway/collect-module-tools.js";
37
45
  import { registerListProfilesTool, registerUseProfileTool, } from "./use-profile.js";
38
46
  import { ProfileStore } from "../../auth/profiles.js";
39
47
  /**
@@ -137,19 +145,19 @@ function captureTopLevelTools() {
137
145
  return captured;
138
146
  }
139
147
  /**
140
- * Builds the full 79-tool catalog from the current build and measures the
148
+ * Builds the full 81-tool catalog from the current build and measures the
141
149
  * post-W3 vs pre-W3-equivalent `tools/list` payload sizes.
142
150
  *
143
151
  * Surface composition (verified against `gateway/essentials.ts` + `src/index.ts`,
144
152
  * pinned live in `gateway/gateway.test.ts` — A2):
145
- * - module tools : 15 essentials + `apimapper_advanced` = 16 (on the real
146
- * McpServer) + 60 advanced (gateway registry) = 76
153
+ * - module tools : 16 essentials + `apimapper_advanced` + `apimapper_advanced_read`
154
+ * = 18 (on the real McpServer) + 60 advanced (gateway registry) = 78
147
155
  * - top-level tools: rest_modules_status + use_profile + list_profiles = 3
148
- * total = 79
156
+ * total = 81
149
157
  *
150
- * POST-W3 `tools/list` = the 16 module-real tools + the 3 top-level tools = 19.
151
- * PRE-W3 flat `tools/list` = the 18 non-gateway surface tools + the 60 advanced
152
- * tools = 78 (the `apimapper_advanced` gateway did not exist pre-W3).
158
+ * POST-W3 `tools/list` = the 18 module-real tools + the 3 top-level tools = 21.
159
+ * PRE-W3 flat `tools/list` = the 19 non-gateway surface tools + the 60 advanced
160
+ * tools = 79 (neither gateway existed pre-W3).
153
161
  */
154
162
  export async function measureToolsList() {
155
163
  const server = new McpServer({
@@ -175,9 +183,12 @@ export async function measureToolsList() {
175
183
  for (const [name, tool] of topLevelTools) {
176
184
  postEntries.push(toCatalogEntry(name, tool));
177
185
  }
178
- // PRE-W3-equivalent flat surface: the post-W3 surface MINUS the gateway tool
179
- // (it did not exist pre-W3) PLUS every advanced tool exposed flat.
180
- const preEntries = postEntries.filter((e) => e.name !== "apimapper_advanced");
186
+ // PRE-W3-equivalent flat surface: the post-W3 surface MINUS the gateway tools
187
+ // (neither existed pre-W3) PLUS every advanced tool exposed flat. F200b added
188
+ // the apimapper_advanced_read gateway it is a routing entry like
189
+ // apimapper_advanced, not a flat tool, so it is excluded from the pre-W3 flat
190
+ // catalog too (the flat surface still totals 79 real tools).
191
+ const preEntries = postEntries.filter((e) => e.name !== "apimapper_advanced" && e.name !== "apimapper_advanced_read");
181
192
  for (const [name, tool] of Object.entries(moduleTools)) {
182
193
  if (!advancedNames.has(name))
183
194
  continue; // only the advanced tools
@@ -1 +1 @@
1
- {"version":3,"file":"toolslist-size.js","sourceRoot":"","sources":["../../../src/modules/apimapper/toolslist-size.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"toolslist-size.js","sourceRoot":"","sources":["../../../src/modules/apimapper/toolslist-size.ts"],"names":[],"mappings":"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"}
@@ -32,6 +32,11 @@ export interface Connection {
32
32
  template_fields?: Record<string, unknown>;
33
33
  origin_hash?: string;
34
34
  origin_id?: string | null;
35
+ health?: {
36
+ status?: string | null;
37
+ message?: string | null;
38
+ [k: string]: unknown;
39
+ } | null;
35
40
  }
36
41
  export interface Credential {
37
42
  id: string;
@@ -95,6 +100,13 @@ export interface Flow {
95
100
  version?: number;
96
101
  updated_at?: string;
97
102
  created_at?: string;
103
+ created_by?: string | null;
104
+ last_execution?: {
105
+ at?: string;
106
+ output_count?: number;
107
+ step_count?: number;
108
+ had_error?: boolean;
109
+ };
98
110
  }
99
111
  export interface LibraryItem {
100
112
  id: string;
@@ -106,6 +118,7 @@ export interface LibraryItem {
106
118
  is_activated?: boolean;
107
119
  logo_svg?: string;
108
120
  logo_hex?: string;
121
+ featured?: boolean;
109
122
  }
110
123
  export interface NodeSnapshot {
111
124
  id: string;
@@ -7,7 +7,7 @@
7
7
  // - Credential wire format = snake_case (auth_type, auth_data, oauth_provider)
8
8
  // - Graph wire format = camelCase (targetNodeId, forceRefresh)
9
9
  // - Library wire format = snake_case (extra_fields, library_connection)
10
- // - LocalSource wire fmt = camelCase (contentType) with "platform/type" id ("wordpress/posts")
10
+ // - LocalSource wire fmt = camelCase (contentType) with "platform/type" id ("wordpress/post")
11
11
  //
12
12
  // These types reflect the actual REST contract verified against the PHP controllers.
13
13
  // =============================================================================
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/modules/apimapper/types.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,EAAE;AACF,yEAAyE;AACzE,iGAAiG;AACjG,oFAAoF;AACpF,wEAAwE;AACxE,iFAAiF;AACjF,sEAAsE;AACtE,6EAA6E;AAC7E,mGAAmG;AACnG,EAAE;AACF,qFAAqF;AAmJrF,gFAAgF;AAChF,iEAAiE;AACjE,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,MAAM,CAAmB,KAAmB;IAC1D,OAAO,KAAwD,CAAC;AAClE,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/modules/apimapper/types.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,EAAE;AACF,yEAAyE;AACzE,iGAAiG;AACjG,oFAAoF;AACpF,wEAAwE;AACxE,iFAAiF;AACjF,sEAAsE;AACtE,6EAA6E;AAC7E,kGAAkG;AAClG,EAAE;AACF,qFAAqF;AA+KrF,gFAAgF;AAChF,iEAAiE;AACjE,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,MAAM,CAAmB,KAAmB;IAC1D,OAAO,KAAwD,CAAC;AAClE,CAAC"}
@@ -123,7 +123,14 @@ export const TOOL_WIRE_MAP = {
123
123
  },
124
124
  apimapper_oauth_authorize_begin: {
125
125
  route: "POST /oauth/authorize",
126
- bodyKeys: ["existing_credential_id", "scopes"],
126
+ bodyKeys: [
127
+ "existing_credential_id",
128
+ "scopes",
129
+ "oauth_config",
130
+ "client_id",
131
+ "client_secret",
132
+ "credential_name",
133
+ ],
127
134
  kind: "structured",
128
135
  },
129
136
  // ── Flows ──────────────────────────────────────────────────────────
@@ -209,6 +216,14 @@ export const TOOL_WIRE_MAP = {
209
216
  bodyKeys: ["version", "product"],
210
217
  kind: "structured",
211
218
  },
219
+ // P-B (JMESPath superpowers) — POST /jmespath/test sends the expression +
220
+ // the sample rows to evaluate against. Both are accepted by the WP
221
+ // JmespathTestController / Joomla JmespathTestAjaxHandler.
222
+ apimapper_jmespath_test: {
223
+ route: "POST /jmespath/test",
224
+ bodyKeys: ["expression", "sample_rows"],
225
+ kind: "structured",
226
+ },
212
227
  };
213
228
  /**
214
229
  * Resolve the committed fixture path. From this module