@wootsup/mcp 0.1.0-rc.9 → 0.3.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 (240) hide show
  1. package/CHANGELOG.md +148 -83
  2. package/README.md +36 -32
  3. package/SECURITY.md +15 -6
  4. package/dist/auth/keychain.d.ts +27 -1
  5. package/dist/auth/keychain.js +48 -2
  6. package/dist/auth/keychain.js.map +1 -1
  7. package/dist/cli-hint.d.ts +22 -0
  8. package/dist/cli-hint.js +55 -0
  9. package/dist/cli-hint.js.map +1 -0
  10. package/dist/index.d.ts +19 -0
  11. package/dist/index.js +163 -22
  12. package/dist/index.js.map +1 -1
  13. package/dist/install-skill.js +1 -1
  14. package/dist/modules/apimapper/cache.d.ts +2 -2
  15. package/dist/modules/apimapper/cache.js +119 -29
  16. package/dist/modules/apimapper/cache.js.map +1 -1
  17. package/dist/modules/apimapper/client.d.ts +102 -1
  18. package/dist/modules/apimapper/client.js +631 -297
  19. package/dist/modules/apimapper/client.js.map +1 -1
  20. package/dist/modules/apimapper/connections-format.d.ts +51 -0
  21. package/dist/modules/apimapper/connections-format.js +261 -0
  22. package/dist/modules/apimapper/connections-format.js.map +1 -0
  23. package/dist/modules/apimapper/connections-trim.d.ts +82 -0
  24. package/dist/modules/apimapper/connections-trim.js +224 -0
  25. package/dist/modules/apimapper/connections-trim.js.map +1 -0
  26. package/dist/modules/apimapper/connections.d.ts +14 -2
  27. package/dist/modules/apimapper/connections.js +612 -153
  28. package/dist/modules/apimapper/connections.js.map +1 -1
  29. package/dist/modules/apimapper/credential-sanitizer.d.ts +5 -0
  30. package/dist/modules/apimapper/credential-sanitizer.js +60 -1
  31. package/dist/modules/apimapper/credential-sanitizer.js.map +1 -1
  32. package/dist/modules/apimapper/credentials-format.d.ts +21 -0
  33. package/dist/modules/apimapper/credentials-format.js +145 -0
  34. package/dist/modules/apimapper/credentials-format.js.map +1 -0
  35. package/dist/modules/apimapper/credentials.d.ts +12 -2
  36. package/dist/modules/apimapper/credentials.js +226 -73
  37. package/dist/modules/apimapper/credentials.js.map +1 -1
  38. package/dist/modules/apimapper/diagnose.d.ts +54 -2
  39. package/dist/modules/apimapper/diagnose.js +213 -12
  40. package/dist/modules/apimapper/diagnose.js.map +1 -1
  41. package/dist/modules/apimapper/elicitation.d.ts +54 -0
  42. package/dist/modules/apimapper/elicitation.js +90 -0
  43. package/dist/modules/apimapper/elicitation.js.map +1 -0
  44. package/dist/modules/apimapper/flows-format.d.ts +50 -0
  45. package/dist/modules/apimapper/flows-format.js +318 -0
  46. package/dist/modules/apimapper/flows-format.js.map +1 -0
  47. package/dist/modules/apimapper/flows.d.ts +13 -2
  48. package/dist/modules/apimapper/flows.js +312 -122
  49. package/dist/modules/apimapper/flows.js.map +1 -1
  50. package/dist/modules/apimapper/gateway/advanced-tool.d.ts +9 -0
  51. package/dist/modules/apimapper/gateway/advanced-tool.js +265 -0
  52. package/dist/modules/apimapper/gateway/advanced-tool.js.map +1 -0
  53. package/dist/modules/apimapper/gateway/capturing-server.d.ts +81 -0
  54. package/dist/modules/apimapper/gateway/capturing-server.js +87 -0
  55. package/dist/modules/apimapper/gateway/capturing-server.js.map +1 -0
  56. package/dist/modules/apimapper/gateway/essentials.d.ts +4 -0
  57. package/dist/modules/apimapper/gateway/essentials.js +35 -0
  58. package/dist/modules/apimapper/gateway/essentials.js.map +1 -0
  59. package/dist/modules/apimapper/gateway/test-support.d.ts +17 -0
  60. package/dist/modules/apimapper/gateway/test-support.js +43 -0
  61. package/dist/modules/apimapper/gateway/test-support.js.map +1 -0
  62. package/dist/modules/apimapper/get-skill.d.ts +3 -3
  63. package/dist/modules/apimapper/get-skill.js +47 -7
  64. package/dist/modules/apimapper/get-skill.js.map +1 -1
  65. package/dist/modules/apimapper/graph-builder.js +1 -1
  66. package/dist/modules/apimapper/graph-builder.js.map +1 -1
  67. package/dist/modules/apimapper/graph.d.ts +2 -2
  68. package/dist/modules/apimapper/graph.js +170 -35
  69. package/dist/modules/apimapper/graph.js.map +1 -1
  70. package/dist/modules/apimapper/index.d.ts +17 -1
  71. package/dist/modules/apimapper/index.js +68 -17
  72. package/dist/modules/apimapper/index.js.map +1 -1
  73. package/dist/modules/apimapper/inspect.d.ts +3 -2
  74. package/dist/modules/apimapper/inspect.js +97 -13
  75. package/dist/modules/apimapper/inspect.js.map +1 -1
  76. package/dist/modules/apimapper/library.d.ts +2 -2
  77. package/dist/modules/apimapper/library.js +665 -80
  78. package/dist/modules/apimapper/library.js.map +1 -1
  79. package/dist/modules/apimapper/license-format.d.ts +22 -0
  80. package/dist/modules/apimapper/license-format.js +149 -0
  81. package/dist/modules/apimapper/license-format.js.map +1 -0
  82. package/dist/modules/apimapper/license.d.ts +16 -2
  83. package/dist/modules/apimapper/license.js +62 -38
  84. package/dist/modules/apimapper/license.js.map +1 -1
  85. package/dist/modules/apimapper/local-sources.d.ts +2 -2
  86. package/dist/modules/apimapper/local-sources.js +44 -30
  87. package/dist/modules/apimapper/local-sources.js.map +1 -1
  88. package/dist/modules/apimapper/misc.d.ts +30 -2
  89. package/dist/modules/apimapper/misc.js +114 -49
  90. package/dist/modules/apimapper/misc.js.map +1 -1
  91. package/dist/modules/apimapper/node-schema.d.ts +52 -0
  92. package/dist/modules/apimapper/node-schema.js +70 -2
  93. package/dist/modules/apimapper/node-schema.js.map +1 -1
  94. package/dist/modules/apimapper/normalizers.d.ts +1 -0
  95. package/dist/modules/apimapper/normalizers.js +51 -0
  96. package/dist/modules/apimapper/normalizers.js.map +1 -1
  97. package/dist/modules/apimapper/onboarding.d.ts +78 -3
  98. package/dist/modules/apimapper/onboarding.js +428 -26
  99. package/dist/modules/apimapper/onboarding.js.map +1 -1
  100. package/dist/modules/apimapper/read-cache.d.ts +31 -2
  101. package/dist/modules/apimapper/read-cache.js +20 -6
  102. package/dist/modules/apimapper/read-cache.js.map +1 -1
  103. package/dist/modules/apimapper/render/_shared.d.ts +24 -0
  104. package/dist/modules/apimapper/render/_shared.js +84 -0
  105. package/dist/modules/apimapper/render/_shared.js.map +1 -0
  106. package/dist/modules/apimapper/render/dag.d.ts +18 -0
  107. package/dist/modules/apimapper/render/dag.js +70 -0
  108. package/dist/modules/apimapper/render/dag.js.map +1 -0
  109. package/dist/modules/apimapper/render/index.d.ts +2 -0
  110. package/dist/modules/apimapper/render/index.js +112 -0
  111. package/dist/modules/apimapper/render/index.js.map +1 -0
  112. package/dist/modules/apimapper/render/renderers/chart-bar.d.ts +2 -0
  113. package/dist/modules/apimapper/render/renderers/chart-bar.js +70 -0
  114. package/dist/modules/apimapper/render/renderers/chart-bar.js.map +1 -0
  115. package/dist/modules/apimapper/render/renderers/chart-line.d.ts +2 -0
  116. package/dist/modules/apimapper/render/renderers/chart-line.js +71 -0
  117. package/dist/modules/apimapper/render/renderers/chart-line.js.map +1 -0
  118. package/dist/modules/apimapper/render/renderers/diff.d.ts +2 -0
  119. package/dist/modules/apimapper/render/renderers/diff.js +154 -0
  120. package/dist/modules/apimapper/render/renderers/diff.js.map +1 -0
  121. package/dist/modules/apimapper/render/renderers/flow-diagram.d.ts +1 -0
  122. package/dist/modules/apimapper/render/renderers/flow-diagram.js +180 -0
  123. package/dist/modules/apimapper/render/renderers/flow-diagram.js.map +1 -0
  124. package/dist/modules/apimapper/render/renderers/json-tree.d.ts +2 -0
  125. package/dist/modules/apimapper/render/renderers/json-tree.js +87 -0
  126. package/dist/modules/apimapper/render/renderers/json-tree.js.map +1 -0
  127. package/dist/modules/apimapper/render/renderers/schema-diagram.d.ts +2 -0
  128. package/dist/modules/apimapper/render/renderers/schema-diagram.js +83 -0
  129. package/dist/modules/apimapper/render/renderers/schema-diagram.js.map +1 -0
  130. package/dist/modules/apimapper/render/renderers/table.d.ts +2 -0
  131. package/dist/modules/apimapper/render/renderers/table.js +75 -0
  132. package/dist/modules/apimapper/render/renderers/table.js.map +1 -0
  133. package/dist/modules/apimapper/render/schemas.d.ts +23 -0
  134. package/dist/modules/apimapper/render/schemas.js +56 -0
  135. package/dist/modules/apimapper/render/schemas.js.map +1 -0
  136. package/dist/modules/apimapper/render/secret-masking.d.ts +5 -0
  137. package/dist/modules/apimapper/render/secret-masking.js +51 -0
  138. package/dist/modules/apimapper/render/secret-masking.js.map +1 -0
  139. package/dist/modules/apimapper/render/sidecar.d.ts +21 -0
  140. package/dist/modules/apimapper/render/sidecar.js +66 -0
  141. package/dist/modules/apimapper/render/sidecar.js.map +1 -0
  142. package/dist/modules/apimapper/render/token-cap.d.ts +21 -0
  143. package/dist/modules/apimapper/render/token-cap.js +57 -0
  144. package/dist/modules/apimapper/render/token-cap.js.map +1 -0
  145. package/dist/modules/apimapper/schema.d.ts +2 -2
  146. package/dist/modules/apimapper/schema.js +92 -33
  147. package/dist/modules/apimapper/schema.js.map +1 -1
  148. package/dist/modules/apimapper/settings-format.d.ts +23 -0
  149. package/dist/modules/apimapper/settings-format.js +135 -0
  150. package/dist/modules/apimapper/settings-format.js.map +1 -0
  151. package/dist/modules/apimapper/settings.d.ts +2 -2
  152. package/dist/modules/apimapper/settings.js +100 -42
  153. package/dist/modules/apimapper/settings.js.map +1 -1
  154. package/dist/modules/apimapper/sites-tools.d.ts +29 -0
  155. package/dist/modules/apimapper/sites-tools.js +165 -0
  156. package/dist/modules/apimapper/sites-tools.js.map +1 -0
  157. package/dist/modules/apimapper/skill-resources.d.ts +2 -2
  158. package/dist/modules/apimapper/skill-resources.js.map +1 -1
  159. package/dist/modules/apimapper/token-baseline.harness.d.ts +91 -0
  160. package/dist/modules/apimapper/token-baseline.harness.js +291 -0
  161. package/dist/modules/apimapper/token-baseline.harness.js.map +1 -0
  162. package/dist/modules/apimapper/tool-result.d.ts +46 -0
  163. package/dist/modules/apimapper/tool-result.js +63 -0
  164. package/dist/modules/apimapper/tool-result.js.map +1 -0
  165. package/dist/modules/apimapper/toolslist-size.d.ts +56 -0
  166. package/dist/modules/apimapper/toolslist-size.js +192 -0
  167. package/dist/modules/apimapper/toolslist-size.js.map +1 -0
  168. package/dist/modules/apimapper/types.d.ts +44 -8
  169. package/dist/modules/apimapper/types.js +26 -1
  170. package/dist/modules/apimapper/types.js.map +1 -1
  171. package/dist/modules/apimapper/use-profile.d.ts +21 -0
  172. package/dist/modules/apimapper/use-profile.js +56 -2
  173. package/dist/modules/apimapper/use-profile.js.map +1 -1
  174. package/dist/modules/apimapper/whitelist-drift.d.ts +85 -0
  175. package/dist/modules/apimapper/whitelist-drift.js +360 -0
  176. package/dist/modules/apimapper/whitelist-drift.js.map +1 -0
  177. package/dist/modules/apimapper/workflows.d.ts +2 -2
  178. package/dist/modules/apimapper/workflows.js +202 -20
  179. package/dist/modules/apimapper/workflows.js.map +1 -1
  180. package/dist/modules/apimapper/yootheme-binding.d.ts +35 -0
  181. package/dist/modules/apimapper/yootheme-binding.js +186 -0
  182. package/dist/modules/apimapper/yootheme-binding.js.map +1 -0
  183. package/dist/platform/index.d.ts +56 -0
  184. package/dist/platform/index.js +195 -7
  185. package/dist/platform/index.js.map +1 -1
  186. package/dist/setup/detect-clients.d.ts +40 -1
  187. package/dist/setup/detect-clients.js +148 -1
  188. package/dist/setup/detect-clients.js.map +1 -1
  189. package/dist/setup/probe-handshake.js +40 -7
  190. package/dist/setup/probe-handshake.js.map +1 -1
  191. package/dist/setup/remove-config.d.ts +8 -0
  192. package/dist/setup/remove-config.js +145 -0
  193. package/dist/setup/remove-config.js.map +1 -0
  194. package/dist/setup/uninstall.d.ts +34 -0
  195. package/dist/setup/uninstall.js +147 -0
  196. package/dist/setup/uninstall.js.map +1 -0
  197. package/dist/setup-cli.d.ts +60 -0
  198. package/dist/setup-cli.js +155 -5
  199. package/dist/setup-cli.js.map +1 -1
  200. package/dist/sites/loader.d.ts +41 -0
  201. package/dist/sites/loader.js +119 -0
  202. package/dist/sites/loader.js.map +1 -0
  203. package/dist/sites/schema.d.ts +69 -0
  204. package/dist/sites/schema.js +71 -0
  205. package/dist/sites/schema.js.map +1 -0
  206. package/dist/sites/secret-resolver.d.ts +47 -0
  207. package/dist/sites/secret-resolver.js +150 -0
  208. package/dist/sites/secret-resolver.js.map +1 -0
  209. package/dist/skill-instructions.d.ts +1 -1
  210. package/dist/skill-instructions.js +5 -0
  211. package/dist/skill-instructions.js.map +1 -1
  212. package/dist/transports/stdio.js +4 -4
  213. package/dist/transports/stdio.js.map +1 -1
  214. package/dist/uninstall-skill.d.ts +27 -0
  215. package/dist/uninstall-skill.js +89 -0
  216. package/dist/uninstall-skill.js.map +1 -0
  217. package/docs/architecture.md +22 -22
  218. package/docs/customgraph-internal-migration.md +4 -4
  219. package/docs/security.md +2 -21
  220. package/docs/tools.md +40 -12
  221. package/manifest.json +77 -70
  222. package/package.json +68 -60
  223. package/skills/apimapper/SKILL.md +53 -7
  224. package/skills/apimapper/reference/conditional-style-multi-items.md +114 -0
  225. package/skills/apimapper/reference/jmespath-pitfalls.md +108 -0
  226. package/skills/apimapper/reference/joomla.md +1 -1
  227. package/skills/apimapper/reference/library-template-discovery.md +65 -0
  228. package/skills/apimapper/reference/merge-two-sources-on-key.md +99 -0
  229. package/skills/apimapper/reference/render.md +132 -0
  230. package/skills/apimapper/reference/troubleshooting.md +21 -1
  231. package/skills/apimapper/reference/yootheme.md +1 -1
  232. package/dist/auth/oauth-provider.d.ts +0 -68
  233. package/dist/auth/oauth-provider.js +0 -232
  234. package/dist/auth/oauth-provider.js.map +0 -1
  235. package/dist/server-http.d.ts +0 -22
  236. package/dist/server-http.js +0 -159
  237. package/dist/server-http.js.map +0 -1
  238. package/dist/transports/http.d.ts +0 -29
  239. package/dist/transports/http.js +0 -267
  240. package/dist/transports/http.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sites-tools.js","sourceRoot":"","sources":["../../../src/modules/apimapper/sites-tools.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
1
+ import type { ToolRegistrar } from "./gateway/capturing-server.js";
2
2
  export declare const SKILL_RESOURCE_URIS: readonly ["skill://apimapper/getting-started", "skill://apimapper/oauth", "skill://apimapper/yootheme", "skill://apimapper/joomla", "skill://apimapper/troubleshooting"];
3
3
  export type SkillResourceUri = (typeof SKILL_RESOURCE_URIS)[number];
4
- export declare function registerSkillResources(server: McpServer, rootDir?: string): void;
4
+ export declare function registerSkillResources(server: ToolRegistrar, rootDir?: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"skill-resources.js","sourceRoot":"","sources":["../../../src/modules/apimapper/skill-resources.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skill-resources.js","sourceRoot":"","sources":["../../../src/modules/apimapper/skill-resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * A canned REST body — either a raw string sent as-is, or a JSON-serializable
3
+ * object/array that the harness stringifies. Narrowing to these three shapes
4
+ * keeps the `JSON.stringify` branch type-safe without falling back to `unknown`.
5
+ */
6
+ export type CannedBody = string | Record<string, unknown> | unknown[];
7
+ /** A single fetch result the responder hands back for one upstream URL. */
8
+ export interface CannedResponse {
9
+ /** HTTP status. Defaults to 200 when omitted. */
10
+ status?: number;
11
+ /** Response body — an object/array is JSON-stringified; a string is sent as-is. */
12
+ body: CannedBody;
13
+ }
14
+ /** Maps an upstream request (URL + init) to a canned REST response. */
15
+ export type FetchResponder = (url: string, init?: RequestInit) => CannedResponse;
16
+ /** The shape every apimapper tool handler resolves to (MCP CallToolResult). */
17
+ interface ToolCallResult {
18
+ content?: Array<{
19
+ type: string;
20
+ text?: string;
21
+ }>;
22
+ isError?: boolean;
23
+ }
24
+ /** A registered tool: its handler is what the harness invokes. */
25
+ export interface RegisteredHarnessTool {
26
+ handler: (args: Record<string, unknown>, extra?: unknown) => Promise<ToolCallResult> | ToolCallResult;
27
+ }
28
+ /** Per-tool byte tally for one replayed call. */
29
+ export interface SequenceEntry {
30
+ tool: string;
31
+ /**
32
+ * Total UTF-8 bytes of the result's `content[].text` blocks — the raw
33
+ * payload an MCP client receives. This is the historical token-baseline
34
+ * metric and the field the ≥40% goal is measured against.
35
+ */
36
+ bytes: number;
37
+ /**
38
+ * `bytes` minus the toolkit's embedded `<!-- structured-meta:… -->` base64
39
+ * marker(s). Some MCP hosts (the WootsUp Chat UI) strip this marker before
40
+ * the LLM sees the text; generic hosts (Claude Desktop / Cursor) do not.
41
+ * Reporting both keeps the post-W3 measurement honest about which figure a
42
+ * given host actually pays.
43
+ */
44
+ visibleBytes: number;
45
+ }
46
+ /** The full harness measurement. */
47
+ export interface TokenBaselineResult {
48
+ sequence: SequenceEntry[];
49
+ /** Sum of `bytes` (raw text incl. structured-meta marker) across the run. */
50
+ totalBytes: number;
51
+ /** Sum of `visibleBytes` (marker stripped) across the run. */
52
+ totalVisibleBytes: number;
53
+ }
54
+ /**
55
+ * One step of the canonical sequence — the tool to invoke and the canned
56
+ * real-shape arguments to invoke it with.
57
+ */
58
+ interface SequenceStep {
59
+ tool: string;
60
+ args: Record<string, unknown>;
61
+ }
62
+ /**
63
+ * The canonical 8-call walkthrough (the Maria mixed-feed flow): a fresh user
64
+ * discovers the install, activates a library template, inspects a connection,
65
+ * builds and validates a flow, then compiles it. Inputs are real-shape and
66
+ * fixed so the measurement is reproducible.
67
+ */
68
+ export declare const CANONICAL_SEQUENCE: readonly SequenceStep[];
69
+ /** The tool names the canonical sequence exercises, in call order. */
70
+ export declare const CANONICAL_TOOLS: readonly string[];
71
+ /**
72
+ * Canonical fetch responder — routes an upstream URL to its real-shape
73
+ * fixture. Anything unmatched returns an empty-success envelope, which is the
74
+ * benign default for the optional sub-calls inside `apimapper_onboarding`.
75
+ */
76
+ export declare function canonicalFetchResponder(url: string): CannedResponse;
77
+ /**
78
+ * Strip every embedded structured-meta marker from a text block. What remains
79
+ * is the human/LLM-readable text a marker-aware host (the WootsUp Chat UI)
80
+ * presents after extracting the marker into a Rich Card.
81
+ */
82
+ export declare function stripStructuredMeta(text: string): string;
83
+ /**
84
+ * Replay the canonical sequence and measure total token output.
85
+ *
86
+ * @param tools the registered apimapper tools map (name → tool)
87
+ * @param fetchResponder maps each upstream URL to a canned REST response
88
+ * @returns per-tool byte tally + `totalBytes` across the whole sequence
89
+ */
90
+ export declare function runTokenBaseline(tools: Record<string, RegisteredHarnessTool>, fetchResponder: FetchResponder): Promise<TokenBaselineResult>;
91
+ export {};
@@ -0,0 +1,291 @@
1
+ // token-baseline.harness.ts — W3.0.C
2
+ //
3
+ // Deterministic, offline token-output measurement for the canonical API
4
+ // Mapper tool-call sequence. The SAME harness is re-run after Welle 3 ships;
5
+ // the before/after delta is what proves the ≥40% token-reduction goal, so
6
+ // consistency between runs matters more than the absolute number.
7
+ //
8
+ // How it works:
9
+ // 1. The caller passes the registered apimapper tools map (the live
10
+ // `registerTool` config + handler for every tool) and a `fetchResponder`
11
+ // that maps an upstream URL to a canned real-shape REST response.
12
+ // 2. `runTokenBaseline` installs the responder as `globalThis.fetch`,
13
+ // replays the 8-call canonical sequence against the real tool handlers
14
+ // with canned real-shape inputs, sums the UTF-8 byte length of every
15
+ // result's `content[].text` block, and restores `globalThis.fetch`.
16
+ // 3. It returns `{ sequence: [{ tool, bytes }], totalBytes }`.
17
+ //
18
+ // No network, no child process — the tool handlers run in-process and the
19
+ // REST layer is the supplied responder. Given the same tools map and the
20
+ // same responder, the result is byte-for-byte identical (determinism is
21
+ // pinned by token-baseline.test.ts).
22
+ /**
23
+ * The canonical 8-call walkthrough (the Maria mixed-feed flow): a fresh user
24
+ * discovers the install, activates a library template, inspects a connection,
25
+ * builds and validates a flow, then compiles it. Inputs are real-shape and
26
+ * fixed so the measurement is reproducible.
27
+ */
28
+ export const CANONICAL_SEQUENCE = [
29
+ { tool: "apimapper_onboarding", args: {} },
30
+ { tool: "apimapper_library_list", args: { limit: 25 } },
31
+ {
32
+ tool: "apimapper_library_activate",
33
+ args: { id: "pexels", extra_fields: { api_key: "demo-key" } },
34
+ },
35
+ { tool: "apimapper_connection_list", args: {} },
36
+ { tool: "apimapper_connection_data", args: { id: "con_pexels", limit: 10 } },
37
+ {
38
+ tool: "apimapper_flow_create",
39
+ args: {
40
+ name: "Maria Mixed Feed",
41
+ nodes: [
42
+ {
43
+ id: "src1",
44
+ type: "source",
45
+ position: { x: 0, y: 0 },
46
+ data: { connectionId: "con_pexels" },
47
+ },
48
+ {
49
+ id: "out1",
50
+ type: "output-yootheme",
51
+ position: { x: 300, y: 0 },
52
+ data: { name: "Mixed Feed" },
53
+ },
54
+ ],
55
+ edges: [{ id: "e1", source: "src1", target: "out1" }],
56
+ },
57
+ },
58
+ {
59
+ tool: "apimapper_graph_validate",
60
+ args: {
61
+ nodes: [
62
+ {
63
+ id: "src1",
64
+ type: "source",
65
+ position: { x: 0, y: 0 },
66
+ data: { connectionId: "con_pexels" },
67
+ },
68
+ {
69
+ id: "out1",
70
+ type: "output-yootheme",
71
+ position: { x: 300, y: 0 },
72
+ data: { name: "Mixed Feed" },
73
+ },
74
+ ],
75
+ edges: [{ id: "e1", source: "src1", target: "out1" }],
76
+ },
77
+ },
78
+ { tool: "apimapper_flow_compile", args: { id: "flow_maria01" } },
79
+ ];
80
+ /** The tool names the canonical sequence exercises, in call order. */
81
+ export const CANONICAL_TOOLS = CANONICAL_SEQUENCE.map((s) => s.tool);
82
+ // ── Canonical real-shape REST fixtures ──────────────────────────────────
83
+ //
84
+ // One fixture per upstream endpoint the canonical sequence touches. Shapes
85
+ // mirror the actual PHP wire responses (the same shapes the per-module test
86
+ // files assert against). Keeping them here — alongside the sequence — means
87
+ // the determinism test and the scripts/token-baseline.mjs runner measure the
88
+ // exact same byte budget; the responder is a single source of truth.
89
+ // `provider` mirrors the real library.test.ts fixtures — the library_list
90
+ // handler reads it for the client-side provider filter, so shipping it keeps
91
+ // the measured shape faithful to the live PHP wire response.
92
+ const LIBRARY_ITEMS = [
93
+ {
94
+ id: "pexels",
95
+ name: "Pexels",
96
+ provider: "pexels",
97
+ category: "media",
98
+ description: "Free stock photos and videos via the Pexels REST API.",
99
+ auth_type: "apikey",
100
+ popular: true,
101
+ },
102
+ {
103
+ id: "google-sheets",
104
+ name: "Google Sheets",
105
+ provider: "google",
106
+ category: "productivity",
107
+ description: "Read rows from a Google Sheets spreadsheet.",
108
+ auth_type: "oauth2_authcode",
109
+ popular: true,
110
+ },
111
+ {
112
+ id: "instagram",
113
+ name: "Instagram Graph",
114
+ provider: "instagram",
115
+ category: "social",
116
+ description: "Fetch media from an Instagram Business account.",
117
+ auth_type: "oauth2_authcode",
118
+ popular: false,
119
+ },
120
+ ];
121
+ const CONNECTIONS = [
122
+ {
123
+ id: "con_pexels",
124
+ name: "Pexels — Curated",
125
+ source_type: "pexels",
126
+ status: "active",
127
+ credential_id: "cred_pexels1",
128
+ },
129
+ ];
130
+ const PEXELS_ROWS = Array.from({ length: 10 }, (_, i) => ({
131
+ id: 1000 + i,
132
+ title: `Curated photo ${i + 1}`,
133
+ photographer: `Photographer ${i + 1}`,
134
+ image: { url: `https://images.pexels.com/photos/${1000 + i}/photo.jpg` },
135
+ width: 1920,
136
+ height: 1280,
137
+ }));
138
+ const FLOW_OBJECT = {
139
+ id: "flow_maria01",
140
+ name: "Maria Mixed Feed",
141
+ node_count: 2,
142
+ is_compiled: false,
143
+ };
144
+ /**
145
+ * Canonical fetch responder — routes an upstream URL to its real-shape
146
+ * fixture. Anything unmatched returns an empty-success envelope, which is the
147
+ * benign default for the optional sub-calls inside `apimapper_onboarding`.
148
+ */
149
+ export function canonicalFetchResponder(url) {
150
+ if (url.includes("/library/popular")) {
151
+ return { body: { connections: LIBRARY_ITEMS.filter((i) => i.popular) } };
152
+ }
153
+ if (url.includes("/library/featured")) {
154
+ return { body: { connections: LIBRARY_ITEMS.slice(0, 2) } };
155
+ }
156
+ if (url.includes("/library/categories")) {
157
+ return {
158
+ body: {
159
+ categories: [
160
+ { id: "media", name: "Media", count: 4 },
161
+ { id: "social", name: "Social", count: 3 },
162
+ ],
163
+ },
164
+ };
165
+ }
166
+ if (url.includes("/library/pexels/activate")) {
167
+ return {
168
+ body: {
169
+ success: true,
170
+ connection: { id: "con_pexels", name: "Pexels", source_type: "pexels" },
171
+ reused: false,
172
+ },
173
+ };
174
+ }
175
+ if (url.includes("/library")) {
176
+ return { body: { connections: LIBRARY_ITEMS, total: LIBRARY_ITEMS.length } };
177
+ }
178
+ if (url.includes("/connections/con_pexels/data")) {
179
+ // Real backend returns the connection as an OBJECT, not a bare id —
180
+ // mirrors the {data, connection:{…}} envelope the connections.test.ts
181
+ // fixtures assert against, so the byte measurement stays realistic.
182
+ return {
183
+ body: {
184
+ data: PEXELS_ROWS,
185
+ connection: {
186
+ id: "con_pexels",
187
+ name: "Pexels — Curated",
188
+ source_type: "pexels",
189
+ },
190
+ },
191
+ };
192
+ }
193
+ if (url.includes("/connections")) {
194
+ return { body: { connections: CONNECTIONS } };
195
+ }
196
+ if (url.includes("/flows/flow_maria01/compile")) {
197
+ return { body: { compiled: {}, flowId: "flow_maria01" } };
198
+ }
199
+ if (url.includes("/flows")) {
200
+ return { body: { success: true, flow: FLOW_OBJECT } };
201
+ }
202
+ if (url.includes("/graph/validate")) {
203
+ return {
204
+ body: { valid: true, warnings: [], nodeCount: 2, edgeCount: 1 },
205
+ };
206
+ }
207
+ if (url.includes("/health")) {
208
+ return {
209
+ body: { plugin_version: "2.0.7", api_version: "v1", status: "ok" },
210
+ };
211
+ }
212
+ if (url.includes("/license")) {
213
+ return { body: { tier: "pro", status: "active" } };
214
+ }
215
+ // Benign default for any onboarding sub-call without a dedicated fixture.
216
+ return { body: {} };
217
+ }
218
+ /**
219
+ * Matches the toolkit's embedded structured-meta marker — a trailing
220
+ * `\n\n<!-- structured-meta:<base64> -->` block appended by the
221
+ * `tableResult` / `detailResult` / … builders so `_meta.ui` survives
222
+ * `@ai-sdk/mcp`'s conversion (see @getimo/mcp-toolkit `embedStructuredMeta`).
223
+ * The `[A-Za-z0-9+/=]*` body is base64; `g` strips every occurrence.
224
+ */
225
+ const STRUCTURED_META_MARKER = /\n\n<!-- structured-meta:[A-Za-z0-9+/=]*? -->/g;
226
+ /**
227
+ * Strip every embedded structured-meta marker from a text block. What remains
228
+ * is the human/LLM-readable text a marker-aware host (the WootsUp Chat UI)
229
+ * presents after extracting the marker into a Rich Card.
230
+ */
231
+ export function stripStructuredMeta(text) {
232
+ return text.replace(STRUCTURED_META_MARKER, "");
233
+ }
234
+ /**
235
+ * Sum the UTF-8 byte length of every text block in a tool result — both the
236
+ * raw bytes (`bytes`) and the marker-stripped, LLM-visible bytes
237
+ * (`visibleBytes`). The raw figure is the token-baseline metric; the visible
238
+ * figure is what a marker-stripping host actually feeds the model.
239
+ */
240
+ function resultBytes(result) {
241
+ const blocks = Array.isArray(result.content) ? result.content : [];
242
+ let bytes = 0;
243
+ let visibleBytes = 0;
244
+ for (const block of blocks) {
245
+ if (typeof block.text === "string") {
246
+ bytes += Buffer.byteLength(block.text, "utf8");
247
+ visibleBytes += Buffer.byteLength(stripStructuredMeta(block.text), "utf8");
248
+ }
249
+ }
250
+ return { bytes, visibleBytes };
251
+ }
252
+ /**
253
+ * Replay the canonical sequence and measure total token output.
254
+ *
255
+ * @param tools the registered apimapper tools map (name → tool)
256
+ * @param fetchResponder maps each upstream URL to a canned REST response
257
+ * @returns per-tool byte tally + `totalBytes` across the whole sequence
258
+ */
259
+ export async function runTokenBaseline(tools, fetchResponder) {
260
+ const originalFetch = globalThis.fetch;
261
+ globalThis.fetch = (async (input, init) => {
262
+ const url = String(input);
263
+ const canned = fetchResponder(url, init);
264
+ const body = typeof canned.body === "string"
265
+ ? canned.body
266
+ : JSON.stringify(canned.body);
267
+ return new Response(body, {
268
+ status: canned.status ?? 200,
269
+ headers: { "Content-Type": "application/json" },
270
+ });
271
+ });
272
+ try {
273
+ const sequence = [];
274
+ for (const step of CANONICAL_SEQUENCE) {
275
+ const tool = tools[step.tool];
276
+ if (!tool) {
277
+ throw new Error(`token-baseline: tool "${step.tool}" is not registered`);
278
+ }
279
+ const result = await tool.handler(step.args);
280
+ const { bytes, visibleBytes } = resultBytes(result);
281
+ sequence.push({ tool: step.tool, bytes, visibleBytes });
282
+ }
283
+ const totalBytes = sequence.reduce((sum, e) => sum + e.bytes, 0);
284
+ const totalVisibleBytes = sequence.reduce((sum, e) => sum + e.visibleBytes, 0);
285
+ return { sequence, totalBytes, totalVisibleBytes };
286
+ }
287
+ finally {
288
+ globalThis.fetch = originalFetch;
289
+ }
290
+ }
291
+ //# sourceMappingURL=token-baseline.harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-baseline.harness.js","sourceRoot":"","sources":["../../../src/modules/apimapper/token-baseline.harness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { StructuredCallToolResult } from "@getimo/mcp-toolkit";
2
+ import { type ApiErrorCode } from "./client.js";
3
+ /**
4
+ * The minimal slice of a response this helper reads. `ExtApiResponse` (the
5
+ * shared client return type) is a structural superset, and the graph
6
+ * hydration object `{ error, status?, errorCode? }` also satisfies it, so
7
+ * both can flow through `restErrorResult` without a cast.
8
+ */
9
+ export interface RestErrorLike {
10
+ /** Human-readable error from the upstream response, if any. */
11
+ error?: string;
12
+ /** Coarse error classification used for the recovery hint + code fallback. */
13
+ errorCode?: ApiErrorCode | string;
14
+ /** HTTP status, used as the `code` fallback when `errorCode` is absent. */
15
+ status?: number;
16
+ }
17
+ /** Per-site overrides for the canonical REST-error mapping. */
18
+ export interface RestErrorOpts {
19
+ /**
20
+ * Fallback message when `response.error` is absent. Mirrors the per-tool
21
+ * `r.error ?? "<fallback>"` string each site used inline.
22
+ */
23
+ message?: string;
24
+ /**
25
+ * Bespoke suggestion that overrides the default `hintFor(response.errorCode)`.
26
+ * Use only where a site intentionally pinned a tool-specific recovery hint.
27
+ */
28
+ suggestion?: string;
29
+ /**
30
+ * Bespoke `code` fallback that overrides the default `String(status)` when
31
+ * `response.errorCode` is absent. Use only where a site pinned a domain code.
32
+ */
33
+ code?: string;
34
+ }
35
+ /**
36
+ * Build the canonical structured error result for a failed REST request.
37
+ *
38
+ * Behaviour-preserving replacement for the 67× inline
39
+ * `errorResult({ message: r.error ?? …, code: …, suggestion: hintFor(…), details })`
40
+ * block. See the file header for the exact mapping and the opts contract.
41
+ *
42
+ * @param response the failed response (`!response.success` already checked by the caller)
43
+ * @param details the structured `details` payload (typically the echoed input params)
44
+ * @param opts per-site overrides — see {@link RestErrorOpts}
45
+ */
46
+ export declare function restErrorResult(response: RestErrorLike, details?: Record<string, unknown>, opts?: RestErrorOpts): StructuredCallToolResult;
@@ -0,0 +1,63 @@
1
+ // src/modules/apimapper/tool-result.ts — shared REST-error result builder.
2
+ //
3
+ // A1 (Wave-B audit, 2026-06-03): ~67 tool handlers across the apimapper
4
+ // modules hand-wrote the IDENTICAL post-request error block:
5
+ //
6
+ // if (!r.success) {
7
+ // return errorResult({
8
+ // message: r.error ?? "<per-tool fallback>",
9
+ // code: r.errorCode ?? (r.status ? String(r.status) : undefined),
10
+ // suggestion: hintFor(r.errorCode),
11
+ // details: { ...inputParams },
12
+ // });
13
+ // }
14
+ //
15
+ // `restErrorResult(r, details?, opts?)` collapses that block to a single
16
+ // call while preserving the output BYTE-FOR-BYTE. The mapping is:
17
+ //
18
+ // message → r.error ?? opts.message ?? "request failed"
19
+ // code → r.errorCode ?? (r.status ? String(r.status) : undefined)
20
+ // suggestion → opts.suggestion ?? hintFor(r.errorCode)
21
+ // details → details (passed through verbatim; computed by the caller)
22
+ //
23
+ // Per-site nuance is preserved through `opts`:
24
+ // - opts.message : the per-tool fallback string when `r.error` is absent.
25
+ // - opts.suggestion : a bespoke suggestion that overrides hintFor() (used by
26
+ // the few sites that want a tool-specific recovery hint
27
+ // regardless of the error code).
28
+ // - opts.code : a bespoke `code` fallback that overrides the
29
+ // `r.status`-derived default when `r.errorCode` is absent
30
+ // (used by sites that pin a domain code like
31
+ // "credential_lookup_failed").
32
+ //
33
+ // Sites whose error is NOT a `!response.success` REST failure (e.g. a
34
+ // post-success "entity not found" semantic check, or a `bad_request`
35
+ // validation guard with a hardcoded message/code/suggestion) deliberately
36
+ // stay on the raw `errorResult({...})` form — they are documented per-site
37
+ // and must NOT be funnelled through this helper, because their message/code
38
+ // do not derive from the response shape.
39
+ import { errorResult } from "@getimo/mcp-toolkit";
40
+ import { hintFor } from "./client.js";
41
+ /**
42
+ * Build the canonical structured error result for a failed REST request.
43
+ *
44
+ * Behaviour-preserving replacement for the 67× inline
45
+ * `errorResult({ message: r.error ?? …, code: …, suggestion: hintFor(…), details })`
46
+ * block. See the file header for the exact mapping and the opts contract.
47
+ *
48
+ * @param response the failed response (`!response.success` already checked by the caller)
49
+ * @param details the structured `details` payload (typically the echoed input params)
50
+ * @param opts per-site overrides — see {@link RestErrorOpts}
51
+ */
52
+ export function restErrorResult(response, details, opts = {}) {
53
+ const errorCode = response.errorCode;
54
+ return errorResult({
55
+ 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 } : {}),
61
+ });
62
+ }
63
+ //# sourceMappingURL=tool-result.js.map
@@ -0,0 +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"}
@@ -0,0 +1,56 @@
1
+ import { type CollectedTool } from "./gateway/test-support.js";
2
+ /**
3
+ * The minimal `tools/list`-relevant slice of a registered tool: the fields the
4
+ * MCP client receives and the LLM reads as part of the static catalog.
5
+ */
6
+ export interface ToolCatalogEntry {
7
+ name: string;
8
+ description?: string;
9
+ inputSchema?: unknown;
10
+ annotations?: Record<string, unknown>;
11
+ }
12
+ /** One side of the measurement: its tool count and total serialized bytes. */
13
+ export interface ToolsListMeasurement {
14
+ /** Number of tools in this `tools/list` surface. */
15
+ toolCount: number;
16
+ /** Sum of `Buffer.byteLength(JSON.stringify(entry))` across all tools. */
17
+ totalBytes: number;
18
+ /** Per-tool byte tally, sorted by name, for the breakdown table. */
19
+ perTool: Array<{
20
+ name: string;
21
+ bytes: number;
22
+ }>;
23
+ }
24
+ /** The full Task-B result: the post-W3 and pre-W3-equivalent surfaces. */
25
+ export interface ToolsListComparison {
26
+ /** Post-W3 `tools/list` — the 19 surface tools the server exposes today. */
27
+ postW3: ToolsListMeasurement;
28
+ /** Pre-W3-equivalent `tools/list` — all 78 tools exposed flat (no gateway). */
29
+ preW3Flat: ToolsListMeasurement;
30
+ /** Absolute byte reduction (preW3Flat.totalBytes − postW3.totalBytes). */
31
+ bytesSaved: number;
32
+ /** Reduction as a fraction of the pre-W3-equivalent total (0..1). */
33
+ fractionSaved: number;
34
+ }
35
+ /**
36
+ * Projects one tool to its `tools/list` JSON-Schema-bearing catalog entry.
37
+ * The `inputSchema` is JSON-Schema-projected the same way the SDK and the
38
+ * gateway's discovery mode do, so the byte count reflects the real wire shape.
39
+ */
40
+ export declare function toCatalogEntry(name: string, tool: Pick<CollectedTool, "description" | "inputSchema" | "annotations">): ToolCatalogEntry;
41
+ /**
42
+ * Builds the full 79-tool catalog from the current build and measures the
43
+ * post-W3 vs pre-W3-equivalent `tools/list` payload sizes.
44
+ *
45
+ * Surface composition (verified against `gateway/essentials.ts` + `src/index.ts`,
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
49
+ * - top-level tools: rest_modules_status + use_profile + list_profiles = 3
50
+ * total = 79
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).
55
+ */
56
+ export declare function measureToolsList(): Promise<ToolsListComparison>;