@wootsup/mcp 0.1.0-rc.9 → 0.1.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.
- package/README.md +7 -7
- package/dist/index.d.ts +19 -0
- package/dist/index.js +71 -5
- package/dist/index.js.map +1 -1
- package/dist/modules/apimapper/cache.d.ts +2 -2
- package/dist/modules/apimapper/cache.js +107 -25
- package/dist/modules/apimapper/cache.js.map +1 -1
- package/dist/modules/apimapper/client.d.ts +40 -0
- package/dist/modules/apimapper/client.js +82 -12
- package/dist/modules/apimapper/client.js.map +1 -1
- package/dist/modules/apimapper/connections-format.d.ts +51 -0
- package/dist/modules/apimapper/connections-format.js +261 -0
- package/dist/modules/apimapper/connections-format.js.map +1 -0
- package/dist/modules/apimapper/connections-trim.d.ts +82 -0
- package/dist/modules/apimapper/connections-trim.js +224 -0
- package/dist/modules/apimapper/connections-trim.js.map +1 -0
- package/dist/modules/apimapper/connections.d.ts +14 -2
- package/dist/modules/apimapper/connections.js +447 -143
- package/dist/modules/apimapper/connections.js.map +1 -1
- package/dist/modules/apimapper/credentials-format.d.ts +21 -0
- package/dist/modules/apimapper/credentials-format.js +145 -0
- package/dist/modules/apimapper/credentials-format.js.map +1 -0
- package/dist/modules/apimapper/credentials.d.ts +12 -2
- package/dist/modules/apimapper/credentials.js +253 -72
- package/dist/modules/apimapper/credentials.js.map +1 -1
- package/dist/modules/apimapper/diagnose.d.ts +54 -2
- package/dist/modules/apimapper/diagnose.js +193 -11
- package/dist/modules/apimapper/diagnose.js.map +1 -1
- package/dist/modules/apimapper/elicitation.d.ts +54 -0
- package/dist/modules/apimapper/elicitation.js +90 -0
- package/dist/modules/apimapper/elicitation.js.map +1 -0
- package/dist/modules/apimapper/flows-format.d.ts +50 -0
- package/dist/modules/apimapper/flows-format.js +318 -0
- package/dist/modules/apimapper/flows-format.js.map +1 -0
- package/dist/modules/apimapper/flows.d.ts +13 -2
- package/dist/modules/apimapper/flows.js +325 -118
- package/dist/modules/apimapper/flows.js.map +1 -1
- package/dist/modules/apimapper/gateway/advanced-tool.d.ts +9 -0
- package/dist/modules/apimapper/gateway/advanced-tool.js +214 -0
- package/dist/modules/apimapper/gateway/advanced-tool.js.map +1 -0
- package/dist/modules/apimapper/gateway/capturing-server.d.ts +81 -0
- package/dist/modules/apimapper/gateway/capturing-server.js +87 -0
- package/dist/modules/apimapper/gateway/capturing-server.js.map +1 -0
- package/dist/modules/apimapper/gateway/essentials.d.ts +4 -0
- package/dist/modules/apimapper/gateway/essentials.js +28 -0
- package/dist/modules/apimapper/gateway/essentials.js.map +1 -0
- package/dist/modules/apimapper/gateway/test-support.d.ts +17 -0
- package/dist/modules/apimapper/gateway/test-support.js +43 -0
- package/dist/modules/apimapper/gateway/test-support.js.map +1 -0
- package/dist/modules/apimapper/get-skill.d.ts +3 -3
- package/dist/modules/apimapper/get-skill.js +4 -2
- package/dist/modules/apimapper/get-skill.js.map +1 -1
- package/dist/modules/apimapper/graph-builder.js +1 -1
- package/dist/modules/apimapper/graph-builder.js.map +1 -1
- package/dist/modules/apimapper/graph.d.ts +2 -2
- package/dist/modules/apimapper/graph.js +165 -34
- package/dist/modules/apimapper/graph.js.map +1 -1
- package/dist/modules/apimapper/index.d.ts +17 -1
- package/dist/modules/apimapper/index.js +66 -17
- package/dist/modules/apimapper/index.js.map +1 -1
- package/dist/modules/apimapper/inspect.d.ts +3 -2
- package/dist/modules/apimapper/inspect.js +97 -13
- package/dist/modules/apimapper/inspect.js.map +1 -1
- package/dist/modules/apimapper/library.d.ts +2 -2
- package/dist/modules/apimapper/library.js +303 -60
- package/dist/modules/apimapper/library.js.map +1 -1
- package/dist/modules/apimapper/license-format.d.ts +22 -0
- package/dist/modules/apimapper/license-format.js +149 -0
- package/dist/modules/apimapper/license-format.js.map +1 -0
- package/dist/modules/apimapper/license.d.ts +16 -2
- package/dist/modules/apimapper/license.js +85 -37
- package/dist/modules/apimapper/license.js.map +1 -1
- package/dist/modules/apimapper/local-sources.d.ts +2 -2
- package/dist/modules/apimapper/local-sources.js +58 -30
- package/dist/modules/apimapper/local-sources.js.map +1 -1
- package/dist/modules/apimapper/misc.d.ts +30 -2
- package/dist/modules/apimapper/misc.js +129 -50
- package/dist/modules/apimapper/misc.js.map +1 -1
- package/dist/modules/apimapper/node-schema.d.ts +52 -0
- package/dist/modules/apimapper/node-schema.js +70 -2
- package/dist/modules/apimapper/node-schema.js.map +1 -1
- package/dist/modules/apimapper/normalizers.d.ts +1 -0
- package/dist/modules/apimapper/normalizers.js +51 -0
- package/dist/modules/apimapper/normalizers.js.map +1 -1
- package/dist/modules/apimapper/onboarding.d.ts +48 -2
- package/dist/modules/apimapper/onboarding.js +324 -17
- package/dist/modules/apimapper/onboarding.js.map +1 -1
- package/dist/modules/apimapper/read-cache.d.ts +31 -2
- package/dist/modules/apimapper/read-cache.js +20 -6
- package/dist/modules/apimapper/read-cache.js.map +1 -1
- package/dist/modules/apimapper/render/_shared.d.ts +24 -0
- package/dist/modules/apimapper/render/_shared.js +84 -0
- package/dist/modules/apimapper/render/_shared.js.map +1 -0
- package/dist/modules/apimapper/render/dag.d.ts +18 -0
- package/dist/modules/apimapper/render/dag.js +70 -0
- package/dist/modules/apimapper/render/dag.js.map +1 -0
- package/dist/modules/apimapper/render/index.d.ts +2 -0
- package/dist/modules/apimapper/render/index.js +112 -0
- package/dist/modules/apimapper/render/index.js.map +1 -0
- package/dist/modules/apimapper/render/renderers/chart-bar.d.ts +2 -0
- package/dist/modules/apimapper/render/renderers/chart-bar.js +70 -0
- package/dist/modules/apimapper/render/renderers/chart-bar.js.map +1 -0
- package/dist/modules/apimapper/render/renderers/chart-line.d.ts +2 -0
- package/dist/modules/apimapper/render/renderers/chart-line.js +71 -0
- package/dist/modules/apimapper/render/renderers/chart-line.js.map +1 -0
- package/dist/modules/apimapper/render/renderers/diff.d.ts +2 -0
- package/dist/modules/apimapper/render/renderers/diff.js +154 -0
- package/dist/modules/apimapper/render/renderers/diff.js.map +1 -0
- package/dist/modules/apimapper/render/renderers/flow-diagram.d.ts +1 -0
- package/dist/modules/apimapper/render/renderers/flow-diagram.js +180 -0
- package/dist/modules/apimapper/render/renderers/flow-diagram.js.map +1 -0
- package/dist/modules/apimapper/render/renderers/json-tree.d.ts +2 -0
- package/dist/modules/apimapper/render/renderers/json-tree.js +87 -0
- package/dist/modules/apimapper/render/renderers/json-tree.js.map +1 -0
- package/dist/modules/apimapper/render/renderers/schema-diagram.d.ts +2 -0
- package/dist/modules/apimapper/render/renderers/schema-diagram.js +83 -0
- package/dist/modules/apimapper/render/renderers/schema-diagram.js.map +1 -0
- package/dist/modules/apimapper/render/renderers/table.d.ts +2 -0
- package/dist/modules/apimapper/render/renderers/table.js +75 -0
- package/dist/modules/apimapper/render/renderers/table.js.map +1 -0
- package/dist/modules/apimapper/render/schemas.d.ts +23 -0
- package/dist/modules/apimapper/render/schemas.js +56 -0
- package/dist/modules/apimapper/render/schemas.js.map +1 -0
- package/dist/modules/apimapper/render/secret-masking.d.ts +5 -0
- package/dist/modules/apimapper/render/secret-masking.js +51 -0
- package/dist/modules/apimapper/render/secret-masking.js.map +1 -0
- package/dist/modules/apimapper/render/sidecar.d.ts +21 -0
- package/dist/modules/apimapper/render/sidecar.js +66 -0
- package/dist/modules/apimapper/render/sidecar.js.map +1 -0
- package/dist/modules/apimapper/render/token-cap.d.ts +21 -0
- package/dist/modules/apimapper/render/token-cap.js +57 -0
- package/dist/modules/apimapper/render/token-cap.js.map +1 -0
- package/dist/modules/apimapper/schema.d.ts +2 -2
- package/dist/modules/apimapper/schema.js +100 -32
- package/dist/modules/apimapper/schema.js.map +1 -1
- package/dist/modules/apimapper/settings-format.d.ts +23 -0
- package/dist/modules/apimapper/settings-format.js +135 -0
- package/dist/modules/apimapper/settings-format.js.map +1 -0
- package/dist/modules/apimapper/settings.d.ts +2 -2
- package/dist/modules/apimapper/settings.js +101 -40
- package/dist/modules/apimapper/settings.js.map +1 -1
- package/dist/modules/apimapper/skill-resources.d.ts +2 -2
- package/dist/modules/apimapper/skill-resources.js.map +1 -1
- package/dist/modules/apimapper/token-baseline.harness.d.ts +91 -0
- package/dist/modules/apimapper/token-baseline.harness.js +291 -0
- package/dist/modules/apimapper/token-baseline.harness.js.map +1 -0
- package/dist/modules/apimapper/toolslist-size.d.ts +55 -0
- package/dist/modules/apimapper/toolslist-size.js +190 -0
- package/dist/modules/apimapper/toolslist-size.js.map +1 -0
- package/dist/modules/apimapper/types.d.ts +23 -8
- package/dist/modules/apimapper/types.js +26 -1
- package/dist/modules/apimapper/types.js.map +1 -1
- package/dist/modules/apimapper/use-profile.d.ts +21 -0
- package/dist/modules/apimapper/use-profile.js +56 -2
- package/dist/modules/apimapper/use-profile.js.map +1 -1
- package/dist/modules/apimapper/workflows.d.ts +2 -2
- package/dist/modules/apimapper/workflows.js +143 -16
- package/dist/modules/apimapper/workflows.js.map +1 -1
- package/dist/platform/index.js +44 -5
- package/dist/platform/index.js.map +1 -1
- package/dist/setup-cli.d.ts +53 -0
- package/dist/setup-cli.js +126 -4
- package/dist/setup-cli.js.map +1 -1
- package/docs/architecture.md +1 -1
- package/docs/tools.md +1 -1
- package/manifest.json +12 -3
- package/package.json +9 -4
- package/skills/apimapper/SKILL.md +1 -1
- package/skills/apimapper/reference/render.md +132 -0
- package/skills/apimapper/reference/troubleshooting.md +1 -1
- package/skills/apimapper/reference/yootheme.md +1 -1
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# @wootsup/mcp
|
|
2
2
|
|
|
3
3
|
**Build YOOtheme dynamic content via natural conversation.** The official MCP
|
|
4
|
-
server for [API Mapper](https://wootsup.com
|
|
4
|
+
server for [API Mapper](https://wootsup.com) — connect
|
|
5
5
|
your AI assistant to API Mapper running on WordPress or Joomla, then create
|
|
6
6
|
flows, manage OAuth credentials, and publish sources without leaving the
|
|
7
7
|
chat.
|
|
@@ -16,7 +16,7 @@ chat.
|
|
|
16
16
|
|
|
17
17
|
Two paths, pick one.
|
|
18
18
|
|
|
19
|
-
### Option A — `npx` (Claude Code, Cursor, VS Code, Cline, Codex
|
|
19
|
+
### Option A — `npx` (Claude Code, Cursor, VS Code, Cline, Codex CLI)
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
22
|
npx -y @wootsup/mcp setup
|
|
@@ -46,9 +46,9 @@ subcommands.
|
|
|
46
46
|
|
|
47
47
|
1. **Install the API Mapper plugin** on your site:
|
|
48
48
|
- **WordPress:** plugin from
|
|
49
|
-
[wootsup.com](https://wootsup.com
|
|
49
|
+
[wootsup.com](https://wootsup.com)
|
|
50
50
|
- **Joomla:** extension from
|
|
51
|
-
[wootsup.com](https://wootsup.com
|
|
51
|
+
[wootsup.com](https://wootsup.com)
|
|
52
52
|
2. **Generate an MCP key** in the admin:
|
|
53
53
|
- WordPress: click **API Mapper** in the WP admin menu — the flow
|
|
54
54
|
editor opens. In the editor header (top-right), click the **⋮**
|
|
@@ -140,9 +140,9 @@ For the security disclosure process, see [`SECURITY.md`](./SECURITY.md).
|
|
|
140
140
|
|
|
141
141
|
## Links
|
|
142
142
|
|
|
143
|
-
- **Homepage:** <https://wootsup.com
|
|
144
|
-
- **Plugin (WordPress + Joomla):** <https://wootsup.com
|
|
145
|
-
- **Docs:** <https://wootsup.com/docs/mcp
|
|
143
|
+
- **Homepage:** <https://wootsup.com>
|
|
144
|
+
- **Plugin (WordPress + Joomla):** <https://wootsup.com> · download from `/downloads`
|
|
145
|
+
- **Docs:** <https://wootsup.com/docs/mcp/>
|
|
146
146
|
- **Issues:** <https://github.com/wootsup/api-mapper/issues>
|
|
147
147
|
- **Architecture:** [`docs/architecture.md`](https://github.com/wootsup/api-mapper/blob/main/packages/apimapper-mcp/docs/architecture.md)
|
|
148
148
|
- **Security model:** [`docs/security.md`](https://github.com/wootsup/api-mapper/blob/main/packages/apimapper-mcp/docs/security.md)
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { ProfileStore } from "./auth/profiles.js";
|
|
3
4
|
/**
|
|
4
5
|
* Constructs the McpServer with bundled skill instructions wired into the
|
|
5
6
|
* `instructions` field. Extracted as a factory for testability.
|
|
@@ -10,4 +11,22 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
10
11
|
*/
|
|
11
12
|
export declare function createServer(): McpServer;
|
|
12
13
|
declare const server: McpServer;
|
|
14
|
+
/**
|
|
15
|
+
* Bootstrap the active-profile pointer from `APIMAPPER_PROFILE` env var.
|
|
16
|
+
*
|
|
17
|
+
* F-49 (W1.27) added APIMAPPER_PROFILE to the DXT manifest + setup-cli, but
|
|
18
|
+
* no runtime consumer existed. A customer with multiple MCP-client entries
|
|
19
|
+
* declaring different profiles always landed on whichever was setActive
|
|
20
|
+
* last on disk — defeating the multi-site selection feature.
|
|
21
|
+
*
|
|
22
|
+
* Behaviour (A6-P3-INTEG-02 — pinned by index.bootstrap-profile.test.ts):
|
|
23
|
+
* - unset / whitespace-only → no-op (active pointer unchanged)
|
|
24
|
+
* - "default" → no-op (manifest default is the implicit state)
|
|
25
|
+
* - "<known profile name>" → store.setActive(name) is called
|
|
26
|
+
* - "<unknown profile name>" → no-op, no throw (avoid phantom profiles)
|
|
27
|
+
*
|
|
28
|
+
* Best-effort: any error reading the store is logged + swallowed so the
|
|
29
|
+
* rest of the MCP surface still boots on a disk-locked or torn-write host.
|
|
30
|
+
*/
|
|
31
|
+
export declare function bootstrapActiveProfile(store: ProfileStore): Promise<void>;
|
|
13
32
|
export { server };
|
package/dist/index.js
CHANGED
|
@@ -21,11 +21,31 @@ if (process.env.APIMAPPER_TOKEN && !process.env.APIMAPPER_WP_APP_PASS) {
|
|
|
21
21
|
if (process.env.APIMAPPER_SITE_URL && !process.env.APIMAPPER_WP_BASE) {
|
|
22
22
|
process.env.APIMAPPER_WP_BASE = process.env.APIMAPPER_SITE_URL;
|
|
23
23
|
}
|
|
24
|
+
// M-9 (2026-05-28) — accept the documented `APIMAPPER_BASE_URL` alias.
|
|
25
|
+
// The original API Mapper docs referred to this variable name; the DXT
|
|
26
|
+
// bundle later standardised on `APIMAPPER_SITE_URL`. Customers who set
|
|
27
|
+
// `APIMAPPER_BASE_URL` (manual setups, custom container images) had
|
|
28
|
+
// their value silently ignored. Bridge it through here so all three
|
|
29
|
+
// names (`APIMAPPER_BASE_URL`, `APIMAPPER_SITE_URL`, `APIMAPPER_WP_BASE`)
|
|
30
|
+
// resolve to the same underlying value. Precedence order:
|
|
31
|
+
// `APIMAPPER_WP_BASE` (legacy canonical) > `APIMAPPER_SITE_URL` (DXT) >
|
|
32
|
+
// `APIMAPPER_BASE_URL` (documentation alias). First-set wins.
|
|
33
|
+
if (process.env.APIMAPPER_BASE_URL && !process.env.APIMAPPER_WP_BASE) {
|
|
34
|
+
process.env.APIMAPPER_WP_BASE = process.env.APIMAPPER_BASE_URL;
|
|
35
|
+
}
|
|
24
36
|
// APIMAPPER_PLATFORM is consumed by the platform factory once wired
|
|
25
37
|
// (Phase 4 abstraction lands per-tool). Surfaced as a no-op read here so
|
|
26
38
|
// the build-dxt grep gate verifies every user_config key has a runtime
|
|
27
39
|
// consumer — see scripts/build-dxt.js.
|
|
28
40
|
void process.env.APIMAPPER_PLATFORM;
|
|
41
|
+
// APIMAPPER_PROFILE (F-49 / W1.27) — optional profile label for multi-site
|
|
42
|
+
// setups. The setup-cli writes it into the MCP client entry env; the
|
|
43
|
+
// profile-aware tools (apimapper_use_profile / apimapper_list_profiles)
|
|
44
|
+
// consume the underlying ProfileStore. The actual env-var → setActive
|
|
45
|
+
// bridge runs inside main() once the ProfileStore is constructed; see
|
|
46
|
+
// `bootstrapActiveProfile` below for the A6-P3-INTEG-02 wiring + tests.
|
|
47
|
+
void process.env.APIMAPPER_PROFILE;
|
|
48
|
+
import { createRequire } from "node:module";
|
|
29
49
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
30
50
|
import { loadModules, formatResult, readOnly } from "@getimo/mcp-toolkit";
|
|
31
51
|
import { apimapperRestModule } from "./modules/apimapper/index.js";
|
|
@@ -33,7 +53,13 @@ import { loadSkillInstructions } from "./skill-instructions.js";
|
|
|
33
53
|
import { connectStdio } from "./transports/stdio.js";
|
|
34
54
|
import { createKeychain } from "./auth/keychain.js";
|
|
35
55
|
import { ProfileStore, resolveConfigDir } from "./auth/profiles.js";
|
|
36
|
-
import { registerUseProfileTool } from "./modules/apimapper/use-profile.js";
|
|
56
|
+
import { registerUseProfileTool, registerListProfilesTool, } from "./modules/apimapper/use-profile.js";
|
|
57
|
+
// Single source of truth for the package version (F-41 / W1.23).
|
|
58
|
+
// Reads ../package.json at runtime so we never drift between the manifest
|
|
59
|
+
// version (used by npm + DXT) and what we advertise to MCP clients.
|
|
60
|
+
const require = createRequire(import.meta.url);
|
|
61
|
+
const pkg = require("../package.json");
|
|
62
|
+
const PKG_VERSION = pkg.version;
|
|
37
63
|
/**
|
|
38
64
|
* Constructs the McpServer with bundled skill instructions wired into the
|
|
39
65
|
* `instructions` field. Extracted as a factory for testability.
|
|
@@ -45,13 +71,48 @@ import { registerUseProfileTool } from "./modules/apimapper/use-profile.js";
|
|
|
45
71
|
export function createServer() {
|
|
46
72
|
return new McpServer({
|
|
47
73
|
name: "API Mapper MCP",
|
|
48
|
-
version:
|
|
74
|
+
version: PKG_VERSION,
|
|
49
75
|
}, {
|
|
50
76
|
instructions: loadSkillInstructions(),
|
|
51
77
|
});
|
|
52
78
|
}
|
|
53
79
|
const server = createServer();
|
|
54
80
|
let moduleStatuses = [];
|
|
81
|
+
/**
|
|
82
|
+
* Bootstrap the active-profile pointer from `APIMAPPER_PROFILE` env var.
|
|
83
|
+
*
|
|
84
|
+
* F-49 (W1.27) added APIMAPPER_PROFILE to the DXT manifest + setup-cli, but
|
|
85
|
+
* no runtime consumer existed. A customer with multiple MCP-client entries
|
|
86
|
+
* declaring different profiles always landed on whichever was setActive
|
|
87
|
+
* last on disk — defeating the multi-site selection feature.
|
|
88
|
+
*
|
|
89
|
+
* Behaviour (A6-P3-INTEG-02 — pinned by index.bootstrap-profile.test.ts):
|
|
90
|
+
* - unset / whitespace-only → no-op (active pointer unchanged)
|
|
91
|
+
* - "default" → no-op (manifest default is the implicit state)
|
|
92
|
+
* - "<known profile name>" → store.setActive(name) is called
|
|
93
|
+
* - "<unknown profile name>" → no-op, no throw (avoid phantom profiles)
|
|
94
|
+
*
|
|
95
|
+
* Best-effort: any error reading the store is logged + swallowed so the
|
|
96
|
+
* rest of the MCP surface still boots on a disk-locked or torn-write host.
|
|
97
|
+
*/
|
|
98
|
+
export async function bootstrapActiveProfile(store) {
|
|
99
|
+
const desired = process.env.APIMAPPER_PROFILE?.trim();
|
|
100
|
+
if (!desired || desired === "default")
|
|
101
|
+
return;
|
|
102
|
+
try {
|
|
103
|
+
const all = await store.list();
|
|
104
|
+
const known = all.some((p) => p.name === desired);
|
|
105
|
+
if (known) {
|
|
106
|
+
await store.setActive(desired);
|
|
107
|
+
}
|
|
108
|
+
// unknown profile: swallow silently to avoid creating phantom profiles
|
|
109
|
+
// or surfacing confusing errors on a fresh install where the profile
|
|
110
|
+
// env var was inherited from a different host.
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
console.error("[apimapper-rest] APIMAPPER_PROFILE bootstrap skipped — profile store unreadable:", err instanceof Error ? err.message : err);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
55
116
|
// Root tool: module-loading status. Distinct from `apimapper_health` (which
|
|
56
117
|
// probes connectivity + auth against the live REST surface). Names diverge
|
|
57
118
|
// to avoid agent confusion.
|
|
@@ -60,12 +121,12 @@ server.registerTool("apimapper_rest_modules_status", {
|
|
|
60
121
|
description: "Module-loading status for this MCP adapter (which sub-modules registered cleanly). " +
|
|
61
122
|
"For runtime connectivity + auth checks against the API Mapper REST surface, use apimapper_health.",
|
|
62
123
|
inputSchema: {},
|
|
63
|
-
annotations: readOnly(),
|
|
124
|
+
annotations: readOnly({ title: "MCP Modules Status", openWorld: false }),
|
|
64
125
|
}, async () => {
|
|
65
126
|
const ok = moduleStatuses.filter((m) => m.status === "ok").length;
|
|
66
127
|
const failed = moduleStatuses.filter((m) => m.status === "error").length;
|
|
67
128
|
return formatResult({
|
|
68
|
-
version:
|
|
129
|
+
version: PKG_VERSION,
|
|
69
130
|
modules_loaded: ok,
|
|
70
131
|
modules_total: moduleStatuses.length,
|
|
71
132
|
modules_failed: failed,
|
|
@@ -90,7 +151,12 @@ async function main() {
|
|
|
90
151
|
const configDir = resolveConfigDir();
|
|
91
152
|
const keychain = await createKeychain({ configDir });
|
|
92
153
|
const profileStore = new ProfileStore(configDir);
|
|
154
|
+
// A6-P3-INTEG-02: honour APIMAPPER_PROFILE env var. Must run AFTER the
|
|
155
|
+
// ProfileStore is constructed but BEFORE the tools register so any
|
|
156
|
+
// subsequent tool call sees the corrected active pointer.
|
|
157
|
+
await bootstrapActiveProfile(profileStore);
|
|
93
158
|
registerUseProfileTool(server, { store: profileStore, keychain });
|
|
159
|
+
registerListProfilesTool(server, { store: profileStore, keychain });
|
|
94
160
|
}
|
|
95
161
|
catch (err) {
|
|
96
162
|
console.error("[apimapper-rest] use-profile tool disabled — keychain/profile init failed:", err instanceof Error ? err.message : err);
|
|
@@ -102,7 +168,7 @@ async function main() {
|
|
|
102
168
|
});
|
|
103
169
|
await connectStdio(server);
|
|
104
170
|
const ok = moduleStatuses.filter((m) => m.status === "ok").length;
|
|
105
|
-
console.error(`[apimapper-rest] MCP Server
|
|
171
|
+
console.error(`[apimapper-rest] MCP Server v${PKG_VERSION} running — ${ok}/${moduleStatuses.length} modules loaded`);
|
|
106
172
|
}
|
|
107
173
|
// ── Subcommand dispatch (Phase 6 setup CLI integration) ──────────────
|
|
108
174
|
// AI clients invoke `apimapper-mcp` with stdio piped and no subcommand;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,uEAAuE;AACvE,0EAA0E;AAC1E,EAAE;AACF,uEAAuE;AACvE,qEAAqE;AACrE,iEAAiE;AACjE,wCAAwC;AAExC,yEAAyE;AACzE,sEAAsE;AACtE,2CAA2C;AAC3C,+CAA+C;AAC/C,8DAA8D;AAC9D,iDAAiD;AACjD,sEAAsE;AACtE,mEAAmE;AACnE,oEAAoE;AACpE,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AAClE,CAAC;AACD,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AACjE,CAAC;AACD,oEAAoE;AACpE,yEAAyE;AACzE,uEAAuE;AACvE,uCAAuC;AACvC,KAAK,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare function registerCacheTools(server:
|
|
1
|
+
import type { ToolRegistrar } from "./gateway/capturing-server.js";
|
|
2
|
+
export declare function registerCacheTools(server: ToolRegistrar): void;
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { formatResult, readOnly,
|
|
2
|
+
import { formatResult, statsResult, errorResult, readOnly, destructive, } from "@getimo/mcp-toolkit";
|
|
3
3
|
import { request, hintFor } from "./client.js";
|
|
4
|
+
// rc.13 Welle 3 (2026-05-20) — cache_stats migrated to the toolkit's
|
|
5
|
+
// statsResult builder; both tools' error branches upgraded to errorResult.
|
|
6
|
+
// The migration is purely additive (text `content` block preserved, `_meta.ui`
|
|
7
|
+
// added). cache_stats' headline metrics (hits / misses / hit_rate / storage /
|
|
8
|
+
// window / rt_avoidance) become the statsResult `stats[]`; the per-tier
|
|
9
|
+
// breakdown + the (W1.15-capped) top_keys list move into the statsResult
|
|
10
|
+
// `description` text so the LLM still reads them. cache_invalidate keeps its
|
|
11
|
+
// formatResult success payload — a small confirmation.
|
|
4
12
|
// F-A6-07: canonical PHP enum from CacheInvalidateController::scopeToEvent.
|
|
5
13
|
// Legacy aliases (`flow`, `connection`, `credential`, `user`) are accepted
|
|
6
14
|
// by Wave 1B PHP but the dotted form is the documented contract.
|
|
@@ -12,6 +20,9 @@ const CACHE_INVALIDATE_SCOPES = [
|
|
|
12
20
|
"user.refresh",
|
|
13
21
|
"user.fetch_data",
|
|
14
22
|
];
|
|
23
|
+
// W1.15 (F-27): cap top_keys envelope size — PHP can return arbitrary
|
|
24
|
+
// counts but the MCP response stays bounded for AI-client legibility.
|
|
25
|
+
const CACHE_STATS_TOP_KEYS_CAP = 20;
|
|
15
26
|
export function registerCacheTools(server) {
|
|
16
27
|
// ── apimapper_cache_invalidate ─────────────────────────────────────
|
|
17
28
|
server.registerTool("apimapper_cache_invalidate", {
|
|
@@ -33,20 +44,22 @@ export function registerCacheTools(server) {
|
|
|
33
44
|
.optional()
|
|
34
45
|
.describe("Event-specific payload (see scope description for required keys)."),
|
|
35
46
|
},
|
|
36
|
-
|
|
47
|
+
// W1.26 (IA-1): cache_invalidate evicts state (destructive), not idempotent
|
|
48
|
+
// re-write of same payload. Aligns with the rest of the destructive() family
|
|
49
|
+
// (connection_delete, flow_delete, library_deactivate, ...).
|
|
50
|
+
annotations: destructive({ title: "Invalidate Admin Cache", openWorld: false }),
|
|
37
51
|
}, async ({ scope, payload }) => {
|
|
38
52
|
const body = { scope };
|
|
39
53
|
if (payload)
|
|
40
54
|
body.payload = payload;
|
|
41
55
|
const r = await request("/cache/admin/invalidate", { method: "POST", body: JSON.stringify(body) });
|
|
42
56
|
if (!r.success) {
|
|
43
|
-
return
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}, true);
|
|
57
|
+
return errorResult({
|
|
58
|
+
message: r.error ?? "cache invalidation failed",
|
|
59
|
+
code: r.errorCode ?? (r.status ? String(r.status) : undefined),
|
|
60
|
+
suggestion: hintFor(r.errorCode),
|
|
61
|
+
details: { scope, payload_keys: payload ? Object.keys(payload) : [] },
|
|
62
|
+
});
|
|
50
63
|
}
|
|
51
64
|
const ok = r.data?.ok === true;
|
|
52
65
|
return formatResult({
|
|
@@ -62,14 +75,20 @@ export function registerCacheTools(server) {
|
|
|
62
75
|
// events.
|
|
63
76
|
server.registerTool("apimapper_cache_stats", {
|
|
64
77
|
title: "Get Cache Stats",
|
|
65
|
-
description: "Fetch cache observability stats (per-tier hits/misses, storage size, invalidation events
|
|
78
|
+
description: "Fetch cache observability stats (per-tier hits/misses, storage size, invalidation events, " +
|
|
79
|
+
`top_keys capped at ${CACHE_STATS_TOP_KEYS_CAP}).` +
|
|
66
80
|
"\n\nExample:\n apimapper_cache_stats({})",
|
|
67
81
|
inputSchema: {},
|
|
68
|
-
annotations: readOnly(),
|
|
82
|
+
annotations: readOnly({ title: "Get Cache Stats", openWorld: false }),
|
|
69
83
|
}, async () => {
|
|
70
84
|
const r = await request("/cache-stats");
|
|
71
85
|
if (!r.success) {
|
|
72
|
-
return
|
|
86
|
+
return errorResult({
|
|
87
|
+
message: r.error ?? "cache stats failed",
|
|
88
|
+
code: r.errorCode ?? (r.status ? String(r.status) : undefined),
|
|
89
|
+
suggestion: hintFor(r.errorCode),
|
|
90
|
+
details: {},
|
|
91
|
+
});
|
|
73
92
|
}
|
|
74
93
|
const tiers = r.data?.tiers ?? {};
|
|
75
94
|
const admin = tiers.admin ?? {};
|
|
@@ -82,20 +101,83 @@ export function registerCacheTools(server) {
|
|
|
82
101
|
const totalMisses = adminMisses + renderMisses;
|
|
83
102
|
const denom = totalHits + totalMisses;
|
|
84
103
|
const hitRate = denom > 0 ? `${((totalHits / denom) * 100).toFixed(1)}%` : "n/a";
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
104
|
+
// W3.1 — statsResult: every metric becomes a flat `stats[]` entry so it
|
|
105
|
+
// is BOTH LLM-visible (rendered as text by statsResult) and structured
|
|
106
|
+
// for the StatsDisplay card. The headline metrics, the per-tier
|
|
107
|
+
// breakdown, storage and the (W1.15-capped) top_keys all render as stat
|
|
108
|
+
// entries — statsResult.stats[] holds flat scalars, and the top_keys
|
|
109
|
+
// list is joined into a single string-valued stat.
|
|
110
|
+
const storage = r.data?.storage;
|
|
111
|
+
const topKeys = Array.isArray(r.data?.top_keys)
|
|
112
|
+
? r.data.top_keys.slice(0, CACHE_STATS_TOP_KEYS_CAP)
|
|
113
|
+
: [];
|
|
114
|
+
const stats = [
|
|
115
|
+
{ key: "hits", label: "Hits", value: totalHits, format: "number" },
|
|
116
|
+
{ key: "misses", label: "Misses", value: totalMisses, format: "number" },
|
|
117
|
+
{ key: "hit_rate", label: "Hit rate", value: hitRate },
|
|
118
|
+
{
|
|
119
|
+
key: "admin_tier",
|
|
120
|
+
label: "Tier admin",
|
|
121
|
+
value: `${adminHits} hits / ${adminMisses} misses / ${admin.sets ?? 0} sets`,
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
key: "render_tier",
|
|
125
|
+
label: "Tier render",
|
|
126
|
+
value: `${renderHits} hits / ${renderMisses} misses / ${render.sets ?? 0} sets`,
|
|
93
127
|
},
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
128
|
+
];
|
|
129
|
+
if (storage && typeof storage.entries === "number") {
|
|
130
|
+
stats.push({
|
|
131
|
+
key: "storage_entries",
|
|
132
|
+
label: "Storage entries",
|
|
133
|
+
value: storage.entries,
|
|
134
|
+
format: "number",
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
if (storage && typeof storage.bytes === "number") {
|
|
138
|
+
stats.push({
|
|
139
|
+
key: "storage_bytes",
|
|
140
|
+
label: "Storage bytes",
|
|
141
|
+
value: storage.bytes,
|
|
142
|
+
format: "number",
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
if (typeof r.data?.window_seconds === "number") {
|
|
146
|
+
stats.push({
|
|
147
|
+
key: "window_seconds",
|
|
148
|
+
label: "Window (s)",
|
|
149
|
+
value: r.data.window_seconds,
|
|
150
|
+
format: "number",
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
if (typeof r.data?.rt_avoidance_ms_p50 === "number") {
|
|
154
|
+
stats.push({
|
|
155
|
+
key: "rt_avoidance_ms_p50",
|
|
156
|
+
label: "RT avoidance p50 (ms)",
|
|
157
|
+
value: r.data.rt_avoidance_ms_p50,
|
|
158
|
+
format: "number",
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
if (r.data?.invalidation && typeof r.data.invalidation === "object") {
|
|
162
|
+
stats.push({
|
|
163
|
+
key: "invalidation",
|
|
164
|
+
label: "Invalidation",
|
|
165
|
+
value: JSON.stringify(r.data.invalidation),
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
if (topKeys.length > 0) {
|
|
169
|
+
stats.push({
|
|
170
|
+
key: "top_keys",
|
|
171
|
+
label: `Top keys (capped ${CACHE_STATS_TOP_KEYS_CAP})`,
|
|
172
|
+
value: topKeys.map((k) => String(k)).join(", "),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
return statsResult({
|
|
176
|
+
title: "Cache Stats",
|
|
177
|
+
description: "Per-tier cache observability — hit/miss counters, storage size, " +
|
|
178
|
+
"invalidation throughput and the hottest keys.",
|
|
179
|
+
stats,
|
|
180
|
+
});
|
|
99
181
|
});
|
|
100
182
|
}
|
|
101
183
|
//# sourceMappingURL=cache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/modules/apimapper/cache.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/modules/apimapper/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,36 @@
|
|
|
1
1
|
import { type ApiResponse } from "@getimo/mcp-toolkit";
|
|
2
2
|
import { type Platform } from "../../platform/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* WordPress / Joomla site base URL.
|
|
5
|
+
*
|
|
6
|
+
* Env-var precedence: `APIMAPPER_WP_BASE` → `APIMAPPER_SITE_URL` (alias
|
|
7
|
+
* written by the DXT setup wizard) → empty string.
|
|
8
|
+
*
|
|
9
|
+
* The SITE_URL → WP_BASE bridge is handled exactly once, above, via
|
|
10
|
+
* `process.env.APIMAPPER_WP_BASE = process.env.APIMAPPER_SITE_URL`. This
|
|
11
|
+
* keeps a single source of truth in `process.env` so any consumer
|
|
12
|
+
* (including child processes spawned later, R7 verify scripts, and
|
|
13
|
+
* legacy CustomGraph internal code) sees the same value — not just
|
|
14
|
+
* this module's exported `WP_BASE` constant.
|
|
15
|
+
*
|
|
16
|
+
* Empty default is intentional (F-43, 2026-05-19): a freshly-installed
|
|
17
|
+
* customer who has not run the setup wizard must NOT silently inherit
|
|
18
|
+
* the WootsUp dev URL — that leaked the vendor's setup hostname into
|
|
19
|
+
* customer error logs and confused triage. In production (NODE_ENV
|
|
20
|
+
* === "production") an empty value causes a fail-fast exit below.
|
|
21
|
+
*
|
|
22
|
+
* Trailing slash is normalised away so downstream `${WP_BASE}/...` joins
|
|
23
|
+
* never produce double-slashes.
|
|
24
|
+
*/
|
|
3
25
|
export declare const WP_BASE: string;
|
|
26
|
+
/**
|
|
27
|
+
* WordPress username for legacy Application-Password Basic auth.
|
|
28
|
+
*
|
|
29
|
+
* Empty default is intentional (F-44, 2026-05-19): the previous "getimo"
|
|
30
|
+
* default leaked a personal username into customer 401 logs. Customers
|
|
31
|
+
* using the modern Bearer-token flow (`amk_live_...`) don't need this
|
|
32
|
+
* value at all; legacy users must set `APIMAPPER_WP_USER` explicitly.
|
|
33
|
+
*/
|
|
4
34
|
export declare const WP_USER: string;
|
|
5
35
|
export declare const WP_APP_PASS: string;
|
|
6
36
|
/**
|
|
@@ -21,6 +51,15 @@ export interface ExtApiResponse<T = unknown> extends ApiResponse<T> {
|
|
|
21
51
|
errorCode?: ApiErrorCode;
|
|
22
52
|
/** When true, response was 2xx but payload had `success: false` — semantically failed. */
|
|
23
53
|
payloadFailed?: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* W2-3 (H-3, 2026-05-28): the parsed JSON body when the server returned a
|
|
56
|
+
* non-2xx response. Carries domain-specific fields like
|
|
57
|
+
* `compiler_error_code` (FlowHandler::compile) that the caller-side autofix
|
|
58
|
+
* branches on. `undefined` when the error response wasn't JSON, or when the
|
|
59
|
+
* call succeeded. Do NOT use as a "did the request succeed" check;
|
|
60
|
+
* `success` is the source of truth for that.
|
|
61
|
+
*/
|
|
62
|
+
errorBody?: Record<string, unknown>;
|
|
24
63
|
}
|
|
25
64
|
interface RequestOpts {
|
|
26
65
|
/**
|
|
@@ -65,6 +104,7 @@ export interface PlatformClient {
|
|
|
65
104
|
* All errors are sanitised via `sanitizeErrorString()` before being returned.
|
|
66
105
|
*/
|
|
67
106
|
export declare function createPlatformClient(platform: Platform): PlatformClient;
|
|
107
|
+
export declare const PLATFORM_KIND: "wordpress" | "joomla";
|
|
68
108
|
/**
|
|
69
109
|
* Issue a request through the toolkit HTTP client + capture HTTP status.
|
|
70
110
|
*
|