@wootsup/mcp 0.1.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 (208) hide show
  1. package/CHANGELOG.md +157 -83
  2. package/README.md +31 -27
  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/catalog/build-catalog.d.ts +31 -0
  8. package/dist/catalog/build-catalog.js +68 -0
  9. package/dist/catalog/build-catalog.js.map +1 -0
  10. package/dist/cli-hint.d.ts +22 -0
  11. package/dist/cli-hint.js +55 -0
  12. package/dist/cli-hint.js.map +1 -0
  13. package/dist/index.js +129 -22
  14. package/dist/index.js.map +1 -1
  15. package/dist/install-skill.js +1 -1
  16. package/dist/modules/apimapper/auto-layout.d.ts +21 -0
  17. package/dist/modules/apimapper/auto-layout.js +54 -0
  18. package/dist/modules/apimapper/auto-layout.js.map +1 -0
  19. package/dist/modules/apimapper/cache.js +25 -17
  20. package/dist/modules/apimapper/cache.js.map +1 -1
  21. package/dist/modules/apimapper/client.d.ts +115 -4
  22. package/dist/modules/apimapper/client.js +699 -304
  23. package/dist/modules/apimapper/client.js.map +1 -1
  24. package/dist/modules/apimapper/connections-format.d.ts +31 -1
  25. package/dist/modules/apimapper/connections-format.js +97 -5
  26. package/dist/modules/apimapper/connections-format.js.map +1 -1
  27. package/dist/modules/apimapper/connections.d.ts +9 -7
  28. package/dist/modules/apimapper/connections.js +449 -127
  29. package/dist/modules/apimapper/connections.js.map +1 -1
  30. package/dist/modules/apimapper/credential-sanitizer.d.ts +5 -0
  31. package/dist/modules/apimapper/credential-sanitizer.js +60 -1
  32. package/dist/modules/apimapper/credential-sanitizer.js.map +1 -1
  33. package/dist/modules/apimapper/credentials.js +105 -61
  34. package/dist/modules/apimapper/credentials.js.map +1 -1
  35. package/dist/modules/apimapper/diagnose.js +21 -2
  36. package/dist/modules/apimapper/diagnose.js.map +1 -1
  37. package/dist/modules/apimapper/elicitation.d.ts +29 -0
  38. package/dist/modules/apimapper/elicitation.js +62 -0
  39. package/dist/modules/apimapper/elicitation.js.map +1 -1
  40. package/dist/modules/apimapper/example-extract.d.ts +13 -0
  41. package/dist/modules/apimapper/example-extract.js +111 -0
  42. package/dist/modules/apimapper/example-extract.js.map +1 -0
  43. package/dist/modules/apimapper/filter-operators.d.ts +24 -0
  44. package/dist/modules/apimapper/filter-operators.js +103 -0
  45. package/dist/modules/apimapper/filter-operators.js.map +1 -0
  46. package/dist/modules/apimapper/flows-format.js +92 -22
  47. package/dist/modules/apimapper/flows-format.js.map +1 -1
  48. package/dist/modules/apimapper/flows.d.ts +8 -7
  49. package/dist/modules/apimapper/flows.js +275 -120
  50. package/dist/modules/apimapper/flows.js.map +1 -1
  51. package/dist/modules/apimapper/gateway/advanced-read-tool.d.ts +9 -0
  52. package/dist/modules/apimapper/gateway/advanced-read-tool.js +172 -0
  53. package/dist/modules/apimapper/gateway/advanced-read-tool.js.map +1 -0
  54. package/dist/modules/apimapper/gateway/advanced-tool.js +66 -106
  55. package/dist/modules/apimapper/gateway/advanced-tool.js.map +1 -1
  56. package/dist/modules/apimapper/gateway/collect-module-tools.d.ts +17 -0
  57. package/dist/modules/apimapper/gateway/collect-module-tools.js +44 -0
  58. package/dist/modules/apimapper/gateway/collect-module-tools.js.map +1 -0
  59. package/dist/modules/apimapper/gateway/essentials.d.ts +1 -1
  60. package/dist/modules/apimapper/gateway/essentials.js +21 -2
  61. package/dist/modules/apimapper/gateway/essentials.js.map +1 -1
  62. package/dist/modules/apimapper/gateway/gateway-shared.d.ts +21 -0
  63. package/dist/modules/apimapper/gateway/gateway-shared.js +124 -0
  64. package/dist/modules/apimapper/gateway/gateway-shared.js.map +1 -0
  65. package/dist/modules/apimapper/gateway/test-support.d.ts +1 -17
  66. package/dist/modules/apimapper/gateway/test-support.js +4 -33
  67. package/dist/modules/apimapper/gateway/test-support.js.map +1 -1
  68. package/dist/modules/apimapper/get-skill-cores.d.ts +4 -0
  69. package/dist/modules/apimapper/get-skill-cores.js +220 -0
  70. package/dist/modules/apimapper/get-skill-cores.js.map +1 -0
  71. package/dist/modules/apimapper/get-skill.d.ts +1 -1
  72. package/dist/modules/apimapper/get-skill.js +74 -9
  73. package/dist/modules/apimapper/get-skill.js.map +1 -1
  74. package/dist/modules/apimapper/graph-builder.d.ts +85 -2
  75. package/dist/modules/apimapper/graph-builder.js +151 -15
  76. package/dist/modules/apimapper/graph-builder.js.map +1 -1
  77. package/dist/modules/apimapper/graph.js +152 -48
  78. package/dist/modules/apimapper/graph.js.map +1 -1
  79. package/dist/modules/apimapper/index.js +27 -13
  80. package/dist/modules/apimapper/index.js.map +1 -1
  81. package/dist/modules/apimapper/jmespath-test.d.ts +4 -0
  82. package/dist/modules/apimapper/jmespath-test.js +152 -0
  83. package/dist/modules/apimapper/jmespath-test.js.map +1 -0
  84. package/dist/modules/apimapper/library.js +553 -88
  85. package/dist/modules/apimapper/library.js.map +1 -1
  86. package/dist/modules/apimapper/license.js +12 -36
  87. package/dist/modules/apimapper/license.js.map +1 -1
  88. package/dist/modules/apimapper/list-footer.d.ts +27 -0
  89. package/dist/modules/apimapper/list-footer.js +57 -0
  90. package/dist/modules/apimapper/list-footer.js.map +1 -0
  91. package/dist/modules/apimapper/local-sources.js +100 -57
  92. package/dist/modules/apimapper/local-sources.js.map +1 -1
  93. package/dist/modules/apimapper/mcp-client-identity.d.ts +32 -0
  94. package/dist/modules/apimapper/mcp-client-identity.js +70 -0
  95. package/dist/modules/apimapper/mcp-client-identity.js.map +1 -0
  96. package/dist/modules/apimapper/merge-constants.d.ts +6 -0
  97. package/dist/modules/apimapper/merge-constants.js +26 -0
  98. package/dist/modules/apimapper/merge-constants.js.map +1 -0
  99. package/dist/modules/apimapper/misc.js +13 -27
  100. package/dist/modules/apimapper/misc.js.map +1 -1
  101. package/dist/modules/apimapper/node-schema.d.ts +52 -2
  102. package/dist/modules/apimapper/node-schema.js +95 -4
  103. package/dist/modules/apimapper/node-schema.js.map +1 -1
  104. package/dist/modules/apimapper/onboarding.d.ts +59 -1
  105. package/dist/modules/apimapper/onboarding.js +231 -28
  106. package/dist/modules/apimapper/onboarding.js.map +1 -1
  107. package/dist/modules/apimapper/read-cache.d.ts +16 -3
  108. package/dist/modules/apimapper/read-cache.js +59 -4
  109. package/dist/modules/apimapper/read-cache.js.map +1 -1
  110. package/dist/modules/apimapper/render/index.js +26 -5
  111. package/dist/modules/apimapper/render/index.js.map +1 -1
  112. package/dist/modules/apimapper/resource-id.d.ts +13 -0
  113. package/dist/modules/apimapper/resource-id.js +69 -0
  114. package/dist/modules/apimapper/resource-id.js.map +1 -0
  115. package/dist/modules/apimapper/schema.js +9 -18
  116. package/dist/modules/apimapper/schema.js.map +1 -1
  117. package/dist/modules/apimapper/settings.js +49 -52
  118. package/dist/modules/apimapper/settings.js.map +1 -1
  119. package/dist/modules/apimapper/sites-tools.d.ts +29 -0
  120. package/dist/modules/apimapper/sites-tools.js +165 -0
  121. package/dist/modules/apimapper/sites-tools.js.map +1 -0
  122. package/dist/modules/apimapper/tool-result.d.ts +66 -0
  123. package/dist/modules/apimapper/tool-result.js +125 -0
  124. package/dist/modules/apimapper/tool-result.js.map +1 -0
  125. package/dist/modules/apimapper/toolslist-size.d.ts +12 -11
  126. package/dist/modules/apimapper/toolslist-size.js +34 -21
  127. package/dist/modules/apimapper/toolslist-size.js.map +1 -1
  128. package/dist/modules/apimapper/types.d.ts +34 -0
  129. package/dist/modules/apimapper/types.js +1 -1
  130. package/dist/modules/apimapper/types.js.map +1 -1
  131. package/dist/modules/apimapper/whitelist-drift.d.ts +85 -0
  132. package/dist/modules/apimapper/whitelist-drift.js +375 -0
  133. package/dist/modules/apimapper/whitelist-drift.js.map +1 -0
  134. package/dist/modules/apimapper/workflows.js +302 -58
  135. package/dist/modules/apimapper/workflows.js.map +1 -1
  136. package/dist/modules/apimapper/yootheme-binding.d.ts +35 -0
  137. package/dist/modules/apimapper/yootheme-binding.js +267 -0
  138. package/dist/modules/apimapper/yootheme-binding.js.map +1 -0
  139. package/dist/platform/index.d.ts +56 -0
  140. package/dist/platform/index.js +158 -2
  141. package/dist/platform/index.js.map +1 -1
  142. package/dist/proxy/bridge.d.ts +35 -0
  143. package/dist/proxy/bridge.js +129 -0
  144. package/dist/proxy/bridge.js.map +1 -0
  145. package/dist/proxy/mode.d.ts +9 -0
  146. package/dist/proxy/mode.js +20 -0
  147. package/dist/proxy/mode.js.map +1 -0
  148. package/dist/setup/detect-clients.d.ts +40 -1
  149. package/dist/setup/detect-clients.js +148 -1
  150. package/dist/setup/detect-clients.js.map +1 -1
  151. package/dist/setup/probe-auth.d.ts +51 -0
  152. package/dist/setup/probe-auth.js +141 -0
  153. package/dist/setup/probe-auth.js.map +1 -0
  154. package/dist/setup/probe-handshake.js +40 -7
  155. package/dist/setup/probe-handshake.js.map +1 -1
  156. package/dist/setup/remove-config.d.ts +8 -0
  157. package/dist/setup/remove-config.js +145 -0
  158. package/dist/setup/remove-config.js.map +1 -0
  159. package/dist/setup/uninstall.d.ts +34 -0
  160. package/dist/setup/uninstall.js +147 -0
  161. package/dist/setup/uninstall.js.map +1 -0
  162. package/dist/setup-cli.d.ts +16 -0
  163. package/dist/setup-cli.js +63 -1
  164. package/dist/setup-cli.js.map +1 -1
  165. package/dist/sites/loader.d.ts +48 -0
  166. package/dist/sites/loader.js +134 -0
  167. package/dist/sites/loader.js.map +1 -0
  168. package/dist/sites/schema.d.ts +69 -0
  169. package/dist/sites/schema.js +71 -0
  170. package/dist/sites/schema.js.map +1 -0
  171. package/dist/sites/secret-resolver.d.ts +47 -0
  172. package/dist/sites/secret-resolver.js +150 -0
  173. package/dist/sites/secret-resolver.js.map +1 -0
  174. package/dist/skill-instructions.d.ts +14 -1
  175. package/dist/skill-instructions.js +35 -6
  176. package/dist/skill-instructions.js.map +1 -1
  177. package/dist/transports/stdio.js +4 -4
  178. package/dist/transports/stdio.js.map +1 -1
  179. package/dist/uninstall-skill.d.ts +27 -0
  180. package/dist/uninstall-skill.js +89 -0
  181. package/dist/uninstall-skill.js.map +1 -0
  182. package/docs/architecture.md +21 -21
  183. package/docs/customgraph-internal-migration.md +4 -4
  184. package/docs/security.md +2 -21
  185. package/docs/tools.md +40 -12
  186. package/manifest.json +77 -79
  187. package/package.json +69 -65
  188. package/skills/apimapper/SKILL.md +128 -7
  189. package/skills/apimapper/reference/conditional-style-multi-items.md +114 -0
  190. package/skills/apimapper/reference/dynamize-existing-layout.md +158 -0
  191. package/skills/apimapper/reference/jmespath-cookbook.md +241 -0
  192. package/skills/apimapper/reference/jmespath-pitfalls.md +189 -0
  193. package/skills/apimapper/reference/joomla.md +1 -1
  194. package/skills/apimapper/reference/library-template-discovery.md +65 -0
  195. package/skills/apimapper/reference/merge-two-sources-on-key.md +204 -0
  196. package/skills/apimapper/reference/oauth.md +143 -52
  197. package/skills/apimapper/reference/troubleshooting.md +22 -2
  198. package/skills/apimapper/reference/yootheme-source-to-builder-handoff.md +348 -0
  199. package/skills/apimapper/reference/yootheme.md +75 -44
  200. package/dist/auth/oauth-provider.d.ts +0 -68
  201. package/dist/auth/oauth-provider.js +0 -232
  202. package/dist/auth/oauth-provider.js.map +0 -1
  203. package/dist/server-http.d.ts +0 -22
  204. package/dist/server-http.js +0 -159
  205. package/dist/server-http.js.map +0 -1
  206. package/dist/transports/http.d.ts +0 -29
  207. package/dist/transports/http.js +0 -267
  208. package/dist/transports/http.js.map +0 -1
@@ -0,0 +1,27 @@
1
+ export interface UninstallSkillOptions {
2
+ /** Skills dir holding the `apimapper/` folder. Default: ~/.claude/skills/ */
3
+ targetSkillsDir?: string;
4
+ /** AGENTS.md file the marker was appended to. Default: ~/AGENTS.md */
5
+ targetAgentsFile?: string;
6
+ }
7
+ export interface UninstallSkillResult {
8
+ skillRemoved: boolean;
9
+ markerRemoved: boolean;
10
+ }
11
+ /**
12
+ * Strip the install-skill marker block from AGENTS.md content.
13
+ *
14
+ * install-skill appends a block of the shape:
15
+ *
16
+ * \n\n## API Mapper MCP\n\n<MARKER_LINE>\n<one descriptive line>\n
17
+ *
18
+ * We remove the `## API Mapper MCP` heading (and any leading blank lines
19
+ * before it) through the descriptive line that follows the marker. The match
20
+ * is anchored on MARKER_LINE so an edited heading still gets cleaned as long
21
+ * as the marker is intact. Returns the cleaned text, or `null` if no marker
22
+ * was present (caller treats that as "nothing removed").
23
+ */
24
+ export declare function stripMarkerBlock(content: string): string | null;
25
+ export declare function uninstallSkill(options?: UninstallSkillOptions): Promise<UninstallSkillResult>;
26
+ /** True iff the skill dir is present (drives the default skill-removal prompt). */
27
+ export declare function isSkillInstalled(targetSkillsDir?: string): boolean;
@@ -0,0 +1,89 @@
1
+ // src/uninstall-skill.ts — reverse of install-skill.ts.
2
+ //
3
+ // uninstallSkill() removes the copied skills/apimapper/ directory and strips
4
+ // the marker block that install-skill appended to AGENTS.md. Idempotent: a
5
+ // missing skill dir or absent marker is a clean no-op. Preserves every other
6
+ // skill + all other AGENTS.md content.
7
+ import { existsSync, readFileSync, rmSync, writeFileSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ import { homedir } from "node:os";
10
+ import { MARKER_LINE } from "./install-skill.js";
11
+ /**
12
+ * Strip the install-skill marker block from AGENTS.md content.
13
+ *
14
+ * install-skill appends a block of the shape:
15
+ *
16
+ * \n\n## API Mapper MCP\n\n<MARKER_LINE>\n<one descriptive line>\n
17
+ *
18
+ * We remove the `## API Mapper MCP` heading (and any leading blank lines
19
+ * before it) through the descriptive line that follows the marker. The match
20
+ * is anchored on MARKER_LINE so an edited heading still gets cleaned as long
21
+ * as the marker is intact. Returns the cleaned text, or `null` if no marker
22
+ * was present (caller treats that as "nothing removed").
23
+ */
24
+ export function stripMarkerBlock(content) {
25
+ if (!content.includes(MARKER_LINE))
26
+ return null;
27
+ const lines = content.split("\n");
28
+ const markerIdx = lines.findIndex((l) => l.trim() === MARKER_LINE.trim());
29
+ if (markerIdx === -1) {
30
+ // Marker present inline but not on its own line — fall back to a plain
31
+ // substring strip of the marker line itself.
32
+ return content.split(MARKER_LINE).join("");
33
+ }
34
+ // Walk backwards to include the `## API Mapper MCP` heading and the blank
35
+ // lines that separated it from the previous content.
36
+ let start = markerIdx;
37
+ // Skip a blank line directly above the marker (between heading and marker).
38
+ if (start > 0 && lines[start - 1].trim() === "")
39
+ start -= 1;
40
+ // Include the heading line if it is the install-skill heading.
41
+ if (start > 0 && lines[start - 1].trim() === "## API Mapper MCP")
42
+ start -= 1;
43
+ // Swallow leading blank separator lines above the heading.
44
+ while (start > 0 && lines[start - 1].trim() === "")
45
+ start -= 1;
46
+ // Walk forward to include the descriptive line(s) after the marker, up to
47
+ // the next blank line or EOF.
48
+ let end = markerIdx + 1;
49
+ while (end < lines.length && lines[end].trim() !== "")
50
+ end += 1;
51
+ const head = lines.slice(0, start);
52
+ const tail = lines.slice(end);
53
+ let next = [...head, ...tail].join("\n");
54
+ // Normalise: collapse a triple+ newline seam left by the excision and keep
55
+ // a single trailing newline if the original had one.
56
+ next = next.replace(/\n{3,}/g, "\n\n");
57
+ if (content.endsWith("\n") && next.length > 0 && !next.endsWith("\n")) {
58
+ next += "\n";
59
+ }
60
+ return next;
61
+ }
62
+ export async function uninstallSkill(options = {}) {
63
+ const targetSkillsDir = options.targetSkillsDir ?? join(homedir(), ".claude", "skills");
64
+ const targetAgentsFile = options.targetAgentsFile ?? join(homedir(), "AGENTS.md");
65
+ // 1. Remove the skill dir.
66
+ let skillRemoved = false;
67
+ const skillDir = join(targetSkillsDir, "apimapper");
68
+ if (existsSync(skillDir)) {
69
+ rmSync(skillDir, { recursive: true, force: true });
70
+ skillRemoved = true;
71
+ }
72
+ // 2. Strip the marker block from AGENTS.md (do NOT create it if absent).
73
+ let markerRemoved = false;
74
+ if (existsSync(targetAgentsFile)) {
75
+ const existing = readFileSync(targetAgentsFile, "utf8");
76
+ const stripped = stripMarkerBlock(existing);
77
+ if (stripped !== null) {
78
+ writeFileSync(targetAgentsFile, stripped, "utf8");
79
+ markerRemoved = true;
80
+ }
81
+ }
82
+ return { skillRemoved, markerRemoved };
83
+ }
84
+ /** True iff the skill dir is present (drives the default skill-removal prompt). */
85
+ export function isSkillInstalled(targetSkillsDir) {
86
+ const dir = targetSkillsDir ?? join(homedir(), ".claude", "skills");
87
+ return existsSync(join(dir, "apimapper"));
88
+ }
89
+ //# sourceMappingURL=uninstall-skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall-skill.js","sourceRoot":"","sources":["../src/uninstall-skill.ts"],"names":[],"mappings":"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"}
@@ -11,17 +11,17 @@ internal plan-doc `~/Projekte/getimo/40-Plans/active/
11
11
  ┌──────────────────────────────────────────────────────────────┐
12
12
  │ AI client │
13
13
  │ (Claude Desktop · Claude Code · Cursor · VS Code · Cline · Codex CLI) │
14
- └─────────────┬─────────────────────────────────┬──────────────┘
15
- │ stdio │ HTTP+OAuth2 PKCE
16
- │ (npx / DXT) │ (server-http.ts)
17
-
14
+ └─────────────────────────────┬────────────────────────────────┘
15
+ │ stdio
16
+ │ (npx / DXT)
17
+
18
18
  ┌──────────────────────────────────────────────────────────────┐
19
19
  │ @wootsup/mcp (this package) │
20
20
  │ │
21
21
  │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
22
22
  │ │ Transport │→ │ Tool │→ │ Platform router │ │
23
- │ │ stdio / │ │ registry │ │ (WP / Joomla) │ │
24
- │ │ HTTP+OAuth │ │ (~76 tools) │ │ │ │
23
+ │ │ stdio │ │ registry │ │ (WP / Joomla) │ │
24
+ │ │ │ │ (79 tools) │ │ │ │
25
25
  │ └──────────────┘ └──────────────┘ └──────────────────┘ │
26
26
  │ │ ▲ │ │
27
27
  │ │ │ │ │
@@ -54,11 +54,9 @@ internal plan-doc `~/Projekte/getimo/40-Plans/active/
54
54
  ## Five components
55
55
 
56
56
  1. **Transport layer** (`src/transports/`)
57
- - `stdio.ts` — default; pipes JSON-RPC over stdin/stdout. Spawned
58
- by the AI client.
59
- - `http.ts` + `server-http.ts` — HTTP+SSE transport behind an
60
- OAuth 2.0 PKCE-required authorization server. Bearer tokens are
61
- site-bound; cross-origin requests are rejected.
57
+ - `stdio.ts` — the only transport. Pipes JSON-RPC over stdin/stdout.
58
+ Spawned by the AI client (npx / DXT). The server opens no network
59
+ listener.
62
60
 
63
61
  2. **Tool registry** (`src/modules/apimapper/`)
64
62
  - 15 register-files (connections, credentials, flows, graph,
@@ -86,7 +84,7 @@ internal plan-doc `~/Projekte/getimo/40-Plans/active/
86
84
  5. **Setup + skills** (`src/setup-cli.ts`, `skills/apimapper/`)
87
85
  - `@clack/prompts` interactive wizard.
88
86
  - Auto-detects AI clients, patches their MCP config idempotently.
89
- - Ships the skill files (`SKILL.md` + 4 references) into
87
+ - Ships the skill files (`SKILL.md` + 9 reference docs) into
90
88
  `~/.claude/skills/apimapper/`.
91
89
 
92
90
  ## Auth flow (token issuance)
@@ -105,17 +103,19 @@ internal plan-doc `~/Projekte/getimo/40-Plans/active/
105
103
  At runtime, the server reads the token from the keychain on every
106
104
  launch — tokens never live in the client config file.
107
105
 
108
- ## Multi-transport rationale
106
+ ## Transport rationale
109
107
 
110
- | | stdio | HTTP+OAuth |
111
- |---|---|---|
112
- | Where it runs | User's machine | User's machine or remote |
113
- | Auth | Bearer from keychain | OAuth 2.0 PKCE bound to site |
114
- | Use case | Local dev, single user | Remote AI agents (future) |
115
- | Discovery | Static (one-tool-set) | Dynamic per session |
108
+ The MCP server ships **stdio-only**:
116
109
 
117
- Both paths feed the same tool registry; the only difference is the
118
- transport adapter wired into `createServer()`.
110
+ | | stdio |
111
+ |---|---|
112
+ | Where it runs | User's machine |
113
+ | Auth | Bearer (`amk_*`) from keychain / profile |
114
+ | Use case | Local dev, single user |
115
+ | Discovery | Static (one tool-set) |
116
+
117
+ The AI client spawns the server as a child process and speaks JSON-RPC
118
+ over stdin/stdout; there is no HTTP, SSE, or remote transport.
119
119
 
120
120
  ## Multi-platform rationale
121
121
 
@@ -99,10 +99,10 @@ then delete.
99
99
 
100
100
  ```bash
101
101
  npm view @wootsup/mcp version
102
- # Expect: 0.1.0-rc.1 (or whatever the published tag was)
102
+ # Expect: 0.2.0 (rc.X-wN.M tail retired plain semver now)
103
103
 
104
104
  npm view @wootsup/mcp dist-tags
105
- # Expect: { latest: ..., rc: '0.1.0-rc.1' } for the rc tag
105
+ # Expect: latest now carries 0.2.0 (rc dist-tag track retired)
106
106
  ```
107
107
 
108
108
  3. **Run the setup wizard with the published package**
@@ -154,8 +154,8 @@ then delete.
154
154
  status: ok
155
155
  platform: wordpress (or joomla)
156
156
  site_url: https://dev.wootsup.com/wordpress
157
- plugin_version: 2.0.7
158
- tool_count: 74
157
+ plugin_version: 2.0.13
158
+ tool_count: 79
159
159
  ```
160
160
 
161
161
  8. **Run the full smoke suite**
package/docs/security.md CHANGED
@@ -16,12 +16,12 @@ reporting process and supported-version policy, see
16
16
  | T6 | Confused-deputy LLM (read-only token gets `*_delete` tools listed) | High | Med | Scope filter excludes destructive tools from tool-list when the token lacks the scope. |
17
17
  | T7 | Local-fs token theft (no keychain) | Med | Med | `0600` file mode; keychain default on macOS/Windows; SECURITY.md warns about multi-user environments. |
18
18
  | T8 | DXT supply-chain (malicious .dxt) | Low | Critical | DXT bundle uploaded as a signed GitHub Release asset; `apimapper-mcp-publish.yml` workflow publishes with `--provenance`. |
19
- | T9 | OAuth callback hijack (HTTP transport) | Med | High | PKCE-required (S256); state param checked; loopback callback only. |
19
+ | T9 | Network exposure of the MCP server | n/a | n/a | Not applicable the server is stdio-only and opens no network listener. |
20
20
  | T10 | TOCTOU on rotate (old token works after rotate UI shows success) | Low | Med | Rotation is atomic on the server; the response shows the new token only after the old one is invalidated. |
21
21
 
22
22
  ## Token rotation
23
23
 
24
- - **From admin UI:** API Mapper → Connections → MCP Access → **Rotate**.
24
+ - **From admin UI:** API Mapper → **⋮** menu Settings → MCP Access → **Rotate**.
25
25
  - **From CLI:** `apimapper_credential_*` tools do **not** rotate MCP keys
26
26
  themselves — by design, key rotation is an admin-UI gesture (not a
27
27
  tool the LLM can call) to prevent confused-deputy rotation. Rotation
@@ -68,25 +68,6 @@ signing key. The user-visible site title (rendered by the wizard from
68
68
  the server's response, not the URL bar) gives one more verification
69
69
  surface for the user.
70
70
 
71
- ## OAuth 2.0 PKCE (HTTP transport)
72
-
73
- When `@wootsup/mcp` runs in HTTP mode:
74
-
75
- - **Grants supported:** `authorization_code` with PKCE-S256 only.
76
- - **Implicit grant:** disabled.
77
- - **`code` grant without PKCE:** rejected with `invalid_request`.
78
- - **Loopback callbacks only:** `redirect_uri` must be
79
- `http://127.0.0.1:<port>/callback` or `http://localhost:<port>/callback`.
80
- - **State param:** required and verified.
81
- - **Origin header:** Bearer tokens are bound to the issuing site URL.
82
- A request from a different `Origin` is rejected (`401`).
83
- - **Token TTL:** 1 hour. Refresh tokens are not issued — the client
84
- re-runs the auth flow.
85
-
86
- See `src/server-http.ts` for the implementation and
87
- `src/server-http.test.ts` (2 tests) + `src/transports/http.test.ts`
88
- (10 tests) for the pinning.
89
-
90
71
  ## Keychain fallback security
91
72
 
92
73
  When `@napi-rs/keyring` cannot reach an OS keychain:
package/docs/tools.md CHANGED
@@ -1,24 +1,29 @@
1
1
  # Tools reference
2
2
 
3
- Auto-extracted from `src/modules/apimapper/*.ts` on **2026-05-18**.
3
+ Auto-extracted from `src/modules/apimapper/*.ts` on **2026-06-03**.
4
4
 
5
5
  To regenerate after adding tools, run:
6
6
 
7
7
  ```bash
8
8
  cd packages/apimapper-mcp
9
- node scripts/extract-tools.mjs
9
+ npm run build # ensure dist/ is fresh
10
+ node scripts/extract-tool-descriptions.mjs # writes .grounding/tools-truth.json + a markdown table on stdout
10
11
  ```
11
12
 
12
- …and paste the `---MD---` output into the sections below. (The
13
- extractor is intentionally simple; a fully auto-generated build-step
14
- is tracked as a future improvement.)
13
+ …and reconcile the sections below against the table. (The extractor
14
+ boots a real `McpServer` and reads each tool's evaluated description —
15
+ no source-text scraping. A fully auto-generated build-step is tracked
16
+ as a future improvement.)
15
17
 
16
18
  ## Summary
17
19
 
18
- - **Total tools:** 77 registered (+ a few system surfaces brought in
20
+ - **Total tools:** 79 registered (+ a few system surfaces brought in
19
21
  via `@getimo/mcp-toolkit`).
20
- - **Annotation breakdown:** 43 `readOnly`, 15 `mutating`, 10 `creating`,
21
- 6 `destructive`.
22
+ - **Surface split:** 19 first-class in `tools/list` (15 module
23
+ essentials + the `apimapper_advanced` gateway + 3 top-level tools
24
+ registered in `index.ts`); the other 60 route through
25
+ `apimapper_advanced` so the listed surface stays under each client's
26
+ tool cap.
22
27
 
23
28
  The annotation tells the AI client what kind of side-effect each tool
24
29
  has. Destructive tools additionally require a `confirm: true`
@@ -30,7 +35,7 @@ vault) for the full convention.
30
35
 
31
36
  | Module | Tools | Notes |
32
37
  |---|---:|---|
33
- | `connections.ts` | 11 | CRUD + probe + sample-data + resources |
38
+ | `connections.ts` | 12 | CRUD + probe + sample-data + resources + recover |
34
39
  | `flows.ts` | 11 | CRUD + compile + import/export + trace |
35
40
  | `library.ts` | 9 | Catalog + activate / deactivate templates |
36
41
  | `credentials.ts` | 7 | CRUD + link + OAuth begin |
@@ -42,11 +47,14 @@ vault) for the full convention.
42
47
  | `graph.ts` | 2 | Preview + validate |
43
48
  | `cache.ts` | 2 | Stats + invalidate |
44
49
  | `schema.ts` | 2 | Profile + snapshot list |
50
+ | `gateway/advanced-tool.ts` | 1 | `apimapper_advanced` gateway to the 60 advanced tools |
51
+ | `render/` | 1 | `apimapper_render` deterministic table/diagram/chart renderer |
52
+ | `yootheme-binding.ts` | 1 | `apimapper_yootheme_binding_for_flow` source-name bridge |
45
53
  | `onboarding.ts` | 1 | Composite startup report |
46
54
  | `diagnose.ts` | 1 | Composite token + identity probe |
47
55
  | `inspect.ts` | 1 | Token decode (network-free) |
48
56
  | `get-skill.ts` | 1 | Read bundled skill doc |
49
- | `use-profile.ts` | 1 | Switch active profile |
57
+ | `use-profile.ts` | 2 | Switch active profile + list profiles |
50
58
  | `index.ts` | 1 | `apimapper_rest_modules_status` |
51
59
 
52
60
  ### Adapter Status (`index.ts`)
@@ -55,6 +63,24 @@ vault) for the full convention.
55
63
  |------|------------|-------------|
56
64
  | `apimapper_rest_modules_status` | `readOnly` | Module-loading status for this MCP adapter (which sub-modules registered cleanly). |
57
65
 
66
+ ### Advanced Tool Gateway (`gateway/advanced-tool.ts`)
67
+
68
+ | Tool | Annotation | Description |
69
+ |------|------------|-------------|
70
+ | `apimapper_advanced` | `creating` | Gateway to the 60 advanced tools. Call `{ tool }` for a target's schema + annotations (discovery), or `{ tool, arguments }` to run it. The target tool's own confirmation guards stay in effect. |
71
+
72
+ ### Render (`render/`)
73
+
74
+ | Tool | Annotation | Description |
75
+ |------|------------|-------------|
76
+ | `apimapper_render` | `readOnly` | Render structured data as deterministic, pre-formatted text (tables, charts, flow-diagrams). Use when the user asks to visualize / show as a diagram / draw / display as a table or chart. |
77
+
78
+ ### YOOtheme Binding Bridge (`yootheme-binding.ts`)
79
+
80
+ | Tool | Annotation | Description |
81
+ |------|------------|-------------|
82
+ | `apimapper_yootheme_binding_for_flow` | `readOnly` | Given a published flow ID, return the exact YOOtheme GraphQL source names (singular + List) and the schema fields available for binding. Replaces a multi-call chain. |
83
+
58
84
  ### Health, Releases, Brandfetch & Feedback (`misc.ts`)
59
85
 
60
86
  | Tool | Annotation | Description |
@@ -92,7 +118,8 @@ vault) for the full convention.
92
118
  | `apimapper_connection_get` | `readOnly` | Fetch full configuration of a single connection by ID. |
93
119
  | `apimapper_connection_health_check` | `readOnly` | Probe a set of connections in one batch and report status. May take 10-30s. |
94
120
  | `apimapper_connection_list` | `readOnly` | List all API Mapper connections. Use `apimapper_connection_get` for full details. |
95
- | `apimapper_connection_pipeline_update` | `mutating` | Update the connection's pipeline (endpoints, default_params, headers, items_path, items_shape). |
121
+ | `apimapper_connection_pipeline_update` | `mutating` | Update the connection's pipeline (endpoints, default_params, default_headers, headers, items_path, items_shape, body, body_type, graphql_variables, response_type). |
122
+ | `apimapper_connection_recover` | `mutating` | Recover a connection that is un-editable because its `params` field is corrupt (stored as a JSON-string with embedded UI metadata instead of an object). Resets `params` to a clean object. Has a `confirm` guard. |
96
123
  | `apimapper_connection_resources` | `readOnly` | List browseable resources on a connection (drive files, sheets, IG media). |
97
124
  | `apimapper_connection_test` | `readOnly` | Probe a connection's upstream endpoint to verify reachability + auth. |
98
125
  | `apimapper_connection_update` | `mutating` | Update fields on an existing connection. Only provided fields are changed; wire-format is snake_case. |
@@ -211,7 +238,8 @@ vault) for the full convention.
211
238
 
212
239
  | Tool | Annotation | Description |
213
240
  |------|------------|-------------|
214
- | `apimapper_use_profile` | `readOnly` | Activate a configured site profile and probe its identity endpoint to confirm the site is reachable and the plugin signature matches. |
241
+ | `apimapper_list_profiles` | `readOnly` | List all configured site profiles (name, siteUrl, platform) with an `is_active` flag. Use to discover profile names before calling `apimapper_use_profile`. |
242
+ | `apimapper_use_profile` | `mutating` | Activate a configured site profile and probe its identity endpoint to confirm the site is reachable and the plugin signature matches. |
215
243
 
216
244
  ## Convention reminders
217
245
 
package/manifest.json CHANGED
@@ -1,85 +1,83 @@
1
1
  {
2
- "dxt_version": "0.1",
3
- "name": "@wootsup/mcp",
4
- "display_name": "API Mapper for WordPress & Joomla",
5
- "version": "0.1.0-rc.13-w3.1",
6
- "description": "Build API integrations, OAuth credentials, and YOOtheme sources via natural conversation. Connects your AI assistant to API Mapper running on WordPress or Joomla.",
7
- "author": {
8
- "name": "WootsUp",
9
- "url": "https://wootsup.com"
10
- },
11
- "homepage": "https://wootsup.com",
12
- "repository": {
13
- "type": "git",
14
- "url": "https://github.com/wootsup/api-mapper"
15
- },
16
- "license": "MIT",
17
- "keywords": [
18
- "api-mapper",
19
- "wordpress",
20
- "joomla",
21
- "yootheme",
22
- "mcp",
23
- "claude"
24
- ],
25
- "server": {
26
- "type": "node",
27
- "entry_point": "dist/index.js",
28
- "mcp_config": {
29
- "command": "node",
30
- "args": [
31
- "${__dirname}/dist/index.js"
32
- ],
33
- "env": {
34
- "APIMAPPER_TOKEN": "${user_config.APIMAPPER_TOKEN}",
35
- "APIMAPPER_SITE_URL": "${user_config.APIMAPPER_SITE_URL}",
36
- "APIMAPPER_PLATFORM": "${user_config.APIMAPPER_PLATFORM}",
37
- "APIMAPPER_PROFILE": "${user_config.APIMAPPER_PROFILE}"
38
- }
39
- }
40
- },
41
- "user_config": [
42
- {
43
- "key": "APIMAPPER_TOKEN",
44
- "type": "string",
45
- "title": "API Mapper MCP key",
46
- "description": "Your amk_live_... key from API Mapper → Settings → MCP Keys",
47
- "required": true,
48
- "secret": true
49
- },
50
- {
51
- "key": "APIMAPPER_SITE_URL",
52
- "type": "string",
53
- "title": "Site URL",
54
- "description": "The base URL of your WordPress or Joomla site (e.g. https://example.com)",
55
- "required": true
2
+ "dxt_version": "0.1",
3
+ "name": "@wootsup/mcp",
4
+ "display_name": "API Mapper for WordPress & Joomla",
5
+ "version": "0.4.0",
6
+ "description": "Build API integrations, OAuth credentials, and YOOtheme sources via natural conversation. Connects your AI assistant to API Mapper running on WordPress or Joomla.",
7
+ "icon": "icon.png",
8
+ "author": {
9
+ "name": "WootsUp",
10
+ "url": "https://wootsup.com"
56
11
  },
57
- {
58
- "key": "APIMAPPER_PLATFORM",
59
- "type": "string",
60
- "title": "Platform",
61
- "description": "Either 'wordpress' or 'joomla'",
62
- "required": true,
63
- "default": "wordpress"
12
+ "homepage": "https://wootsup.com",
13
+ "documentation": "https://wootsup.com/docs/mcp",
14
+ "support": "https://wootsup.com/contact/",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/wootsup/api-mapper"
64
18
  },
65
- {
66
- "key": "APIMAPPER_PROFILE",
67
- "type": "string",
68
- "title": "Profile name",
69
- "description": "Optional label for this site profile, used to switch between multiple sites via apimapper_use_profile. Defaults to 'default'.",
70
- "required": false,
71
- "default": "default"
72
- }
73
- ],
74
- "compatibility": {
75
- "claude_desktop": ">=0.10.0",
76
- "platforms": [
77
- "darwin",
78
- "win32",
79
- "linux"
19
+ "license": "MIT",
20
+ "keywords": [
21
+ "api-mapper",
22
+ "wordpress",
23
+ "joomla",
24
+ "yootheme",
25
+ "mcp",
26
+ "claude"
80
27
  ],
81
- "runtimes": {
82
- "node": ">=22.0.0"
28
+ "server": {
29
+ "type": "node",
30
+ "entry_point": "dist/index.js",
31
+ "mcp_config": {
32
+ "command": "node",
33
+ "args": [
34
+ "${__dirname}/dist/index.js"
35
+ ],
36
+ "env": {
37
+ "APIMAPPER_SITE_URL": "${user_config.APIMAPPER_SITE_URL}",
38
+ "APIMAPPER_TOKEN": "${user_config.APIMAPPER_TOKEN}",
39
+ "APIMAPPER_PROFILE": "${user_config.APIMAPPER_PROFILE}",
40
+ "APIMAPPER_SITES_FILE": "${user_config.APIMAPPER_SITES_FILE}"
41
+ }
42
+ }
43
+ },
44
+ "user_config": {
45
+ "APIMAPPER_SITE_URL": {
46
+ "type": "string",
47
+ "title": "Site URL",
48
+ "description": "Single-site setup: the base URL of your WordPress or Joomla site (e.g. https://example.com). Leave empty if you use the Sites file below.",
49
+ "required": false
50
+ },
51
+ "APIMAPPER_TOKEN": {
52
+ "type": "string",
53
+ "title": "API Mapper MCP key",
54
+ "description": "Single-site setup: your amk_live_... key from API Mapper → ⋮ menu → Settings → MCP Access. Leave empty if you use the Sites file below.",
55
+ "required": false,
56
+ "sensitive": true
57
+ },
58
+ "APIMAPPER_PROFILE": {
59
+ "type": "string",
60
+ "title": "Profile name (Optional for Single Site Configuration)",
61
+ "description": "Optional label for this site profile. Defaults to 'default'. With a Sites file, it selects which configured site is active; switch any time via apimapper_use_profile.",
62
+ "required": false,
63
+ "default": "default"
64
+ },
65
+ "APIMAPPER_SITES_FILE": {
66
+ "type": "string",
67
+ "title": "Sites file (for Multi-Site Configurations)",
68
+ "description": "Advanced / agency setups only: path to a sites.json that manages several sites from one install. Leave empty for a single site (use Site URL + key above). Normally populated by the setup wizard.",
69
+ "required": false
70
+ }
71
+ },
72
+ "compatibility": {
73
+ "claude_desktop": ">=0.10.0",
74
+ "platforms": [
75
+ "darwin",
76
+ "win32",
77
+ "linux"
78
+ ],
79
+ "runtimes": {
80
+ "node": ">=22.0.0"
81
+ }
83
82
  }
84
- }
85
83
  }