@wootsup/mcp 0.1.0-rc.1 → 0.1.0-rc.10
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 +10 -39
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/modules/apimapper/cache.js +63 -33
- package/dist/modules/apimapper/cache.js.map +1 -1
- package/dist/modules/apimapper/client.d.ts +10 -1
- package/dist/modules/apimapper/client.js +51 -11
- package/dist/modules/apimapper/client.js.map +1 -1
- package/dist/modules/apimapper/connections.js +70 -30
- package/dist/modules/apimapper/connections.js.map +1 -1
- package/dist/modules/apimapper/credentials.js +61 -10
- package/dist/modules/apimapper/credentials.js.map +1 -1
- package/dist/modules/apimapper/diagnose.js +7 -2
- package/dist/modules/apimapper/diagnose.js.map +1 -1
- package/dist/modules/apimapper/envelope.d.ts +12 -0
- package/dist/modules/apimapper/envelope.js +28 -0
- package/dist/modules/apimapper/envelope.js.map +1 -0
- package/dist/modules/apimapper/flows.js +82 -42
- package/dist/modules/apimapper/flows.js.map +1 -1
- package/dist/modules/apimapper/graph.js +23 -23
- package/dist/modules/apimapper/graph.js.map +1 -1
- package/dist/modules/apimapper/index.js +13 -1
- package/dist/modules/apimapper/index.js.map +1 -1
- package/dist/modules/apimapper/library.js +154 -17
- package/dist/modules/apimapper/library.js.map +1 -1
- package/dist/modules/apimapper/license.d.ts +23 -0
- package/dist/modules/apimapper/license.js +38 -10
- package/dist/modules/apimapper/license.js.map +1 -1
- package/dist/modules/apimapper/local-sources.js +24 -7
- package/dist/modules/apimapper/local-sources.js.map +1 -1
- package/dist/modules/apimapper/misc.js +55 -37
- package/dist/modules/apimapper/misc.js.map +1 -1
- package/dist/modules/apimapper/onboarding.d.ts +21 -0
- package/dist/modules/apimapper/onboarding.js +81 -6
- package/dist/modules/apimapper/onboarding.js.map +1 -1
- package/dist/modules/apimapper/read-cache.d.ts +44 -0
- package/dist/modules/apimapper/read-cache.js +165 -0
- package/dist/modules/apimapper/read-cache.js.map +1 -0
- package/dist/modules/apimapper/schema.js +68 -30
- package/dist/modules/apimapper/schema.js.map +1 -1
- package/dist/modules/apimapper/settings.js +64 -22
- package/dist/modules/apimapper/settings.js.map +1 -1
- package/dist/modules/apimapper/skill-resources.js +24 -5
- package/dist/modules/apimapper/skill-resources.js.map +1 -1
- package/dist/modules/apimapper/use-profile.js +5 -1
- package/dist/modules/apimapper/use-profile.js.map +1 -1
- package/dist/modules/apimapper/workflows.js +23 -7
- package/dist/modules/apimapper/workflows.js.map +1 -1
- package/dist/setup/write-config.d.ts +12 -2
- package/dist/setup/write-config.js +31 -4
- package/dist/setup/write-config.js.map +1 -1
- package/dist/setup-cli.d.ts +3 -3
- package/dist/setup-cli.js +26 -6
- package/dist/setup-cli.js.map +1 -1
- package/dist/skill-instructions.d.ts +10 -0
- package/dist/skill-instructions.js +29 -4
- package/dist/skill-instructions.js.map +1 -1
- package/manifest.json +1 -1
- package/package.json +4 -3
|
@@ -3,52 +3,77 @@ import { formatResult, autoFormatTable, readOnly } from "@getimo/mcp-toolkit";
|
|
|
3
3
|
import { request, hintFor } from "./client.js";
|
|
4
4
|
export function registerSchemaTools(server) {
|
|
5
5
|
// ── apimapper_schema_profile ───────────────────────────────────────
|
|
6
|
+
// F-A5-03: Real PHP contract is `{nodes, edges, target_node_id, flow_id?}`.
|
|
7
|
+
// The handler executes the flow graph up to the target node, then profiles
|
|
8
|
+
// the resulting payload field-by-field. Response is `{_schema_version,
|
|
9
|
+
// merged: {item_count, fields, preview_items}, sources}`.
|
|
6
10
|
server.registerTool("apimapper_schema_profile", {
|
|
7
|
-
title: "Profile Schema
|
|
8
|
-
description: "
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
+
title: "Profile Schema for a Flow Node",
|
|
12
|
+
description: "Profile the data schema of a target node in a flow graph. Backend executes the graph " +
|
|
13
|
+
"up to `target_node_id` and returns per-field types, sample values, and preview rows. " +
|
|
14
|
+
"Used by the Expression Builder + Visual Field Picker UIs." +
|
|
15
|
+
"\n\nExample:\n apimapper_schema_profile({ nodes: [...], edges: [...], target_node_id: 'merge-1' })",
|
|
11
16
|
inputSchema: {
|
|
12
|
-
|
|
13
|
-
|
|
17
|
+
nodes: z
|
|
18
|
+
.array(z.record(z.string(), z.unknown()))
|
|
19
|
+
.describe("Flow nodes (ReactFlow shape). Use apimapper_flow_get to fetch the existing graph."),
|
|
20
|
+
edges: z
|
|
21
|
+
.array(z.record(z.string(), z.unknown()))
|
|
22
|
+
.describe("Flow edges (ReactFlow shape)."),
|
|
23
|
+
target_node_id: z
|
|
24
|
+
.string()
|
|
25
|
+
.describe('ID of the node to profile (e.g., "merge-1", "transform-1")'),
|
|
26
|
+
flow_id: z
|
|
14
27
|
.string()
|
|
15
28
|
.optional()
|
|
16
|
-
.describe(
|
|
29
|
+
.describe("Optional flow id — enables NodeSnapshotRepository writes for hydrate path."),
|
|
17
30
|
},
|
|
18
31
|
annotations: readOnly(),
|
|
19
|
-
}, async ({
|
|
20
|
-
const
|
|
32
|
+
}, async ({ nodes, edges, target_node_id, flow_id }) => {
|
|
33
|
+
const body = { nodes, edges, target_node_id };
|
|
34
|
+
if (flow_id)
|
|
35
|
+
body.flow_id = flow_id;
|
|
36
|
+
const r = await request("/schema-profile", {
|
|
37
|
+
method: "POST",
|
|
38
|
+
body: JSON.stringify(body),
|
|
39
|
+
});
|
|
21
40
|
if (!r.success) {
|
|
22
41
|
return formatResult({
|
|
23
42
|
error: r.error,
|
|
24
43
|
status: r.status,
|
|
25
44
|
errorCode: r.errorCode,
|
|
26
|
-
context: {
|
|
45
|
+
context: { target_node_id, flow_id, node_count: Array.isArray(nodes) ? nodes.length : 0 },
|
|
27
46
|
hint: hintFor(r.errorCode),
|
|
28
47
|
}, true);
|
|
29
48
|
}
|
|
30
|
-
const
|
|
49
|
+
const merged = r.data?.merged ?? {};
|
|
50
|
+
const fields = Array.isArray(merged.fields) ? merged.fields : [];
|
|
51
|
+
const previewItems = Array.isArray(merged.preview_items) ? merged.preview_items : [];
|
|
31
52
|
return formatResult({
|
|
32
|
-
|
|
53
|
+
schema_version: r.data?._schema_version,
|
|
54
|
+
item_count: merged.item_count,
|
|
33
55
|
field_count: fields.length,
|
|
34
56
|
fields: fields.slice(0, 100),
|
|
35
|
-
|
|
57
|
+
preview_items: previewItems.slice(0, 10),
|
|
58
|
+
source_count: Array.isArray(r.data?.sources) ? r.data.sources.length : 0,
|
|
36
59
|
}, false, { maxChars: 6000 });
|
|
37
60
|
});
|
|
38
61
|
// ── apimapper_node_snapshot_list ───────────────────────────────────
|
|
62
|
+
// F-A5-04: NodeSnapshotController requires `flow_id`. DTO shape is
|
|
63
|
+
// `{flow_id, node_id, fetched_at, ttl_seconds, payload, is_stale}`.
|
|
39
64
|
server.registerTool("apimapper_node_snapshot_list", {
|
|
40
65
|
title: "List Node Snapshots",
|
|
41
|
-
description: "List node-level data snapshots (per-
|
|
66
|
+
description: "List node-level data snapshots for a flow (per-node cached payloads used by preview hydrate path). " +
|
|
67
|
+
"`flow_id` is required." +
|
|
42
68
|
"\n\nExample:\n apimapper_node_snapshot_list({ flow_id: 'flow_Z2fLg70M84' })",
|
|
43
69
|
inputSchema: {
|
|
44
|
-
flow_id: z.string().
|
|
70
|
+
flow_id: z.string().describe("Flow ID (required). Use apimapper_flow_list to find."),
|
|
45
71
|
limit: z.number().min(1).max(500).default(50).describe("Max items (1-500)"),
|
|
46
72
|
},
|
|
47
73
|
annotations: readOnly(),
|
|
48
74
|
}, async ({ flow_id, limit }) => {
|
|
49
75
|
const params = new URLSearchParams();
|
|
50
|
-
|
|
51
|
-
params.set("flow_id", flow_id);
|
|
76
|
+
params.set("flow_id", flow_id);
|
|
52
77
|
params.set("limit", String(limit));
|
|
53
78
|
const r = await request(`/node-snapshots?${params.toString()}`);
|
|
54
79
|
if (!r.success) {
|
|
@@ -61,23 +86,36 @@ export function registerSchemaTools(server) {
|
|
|
61
86
|
}, true);
|
|
62
87
|
}
|
|
63
88
|
const items = Array.isArray(r.data?.snapshots) ? r.data.snapshots : [];
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
89
|
+
const truncated = Boolean(r.data?.truncated);
|
|
90
|
+
return autoFormatTable(items.map((s) => {
|
|
91
|
+
let payloadBytes = 0;
|
|
92
|
+
try {
|
|
93
|
+
payloadBytes = JSON.stringify(s.payload ?? {}).length;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
payloadBytes = 0;
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
flow_id: s.flow_id || "—",
|
|
100
|
+
node_id: s.node_id || "—",
|
|
101
|
+
fetched_at: s.fetched_at || "—",
|
|
102
|
+
ttl_seconds: s.ttl_seconds ?? "—",
|
|
103
|
+
is_stale: s.is_stale ? "✓" : "✗",
|
|
104
|
+
payload_bytes: payloadBytes,
|
|
105
|
+
};
|
|
106
|
+
}), {
|
|
72
107
|
columns: [
|
|
73
|
-
{ key: "
|
|
74
|
-
{ key: "flow_id", label: "FLOW", width: 28 },
|
|
108
|
+
{ key: "flow_id", label: "FLOW", width: 24 },
|
|
75
109
|
{ key: "node_id", label: "NODE", width: 24 },
|
|
76
|
-
{ key: "
|
|
77
|
-
{ key: "
|
|
78
|
-
{ key: "
|
|
110
|
+
{ key: "fetched_at", label: "FETCHED", width: 22 },
|
|
111
|
+
{ key: "ttl_seconds", label: "TTL", width: 6 },
|
|
112
|
+
{ key: "is_stale", label: "STALE", width: 5 },
|
|
113
|
+
{ key: "payload_bytes", label: "BYTES", width: 8 },
|
|
79
114
|
],
|
|
80
115
|
header: (n) => `${n} snapshots`,
|
|
116
|
+
footer: truncated
|
|
117
|
+
? `Result truncated at the server cap (limit=${limit}). More snapshots may exist.`
|
|
118
|
+
: undefined,
|
|
81
119
|
});
|
|
82
120
|
});
|
|
83
121
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/modules/apimapper/schema.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/modules/apimapper/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,26 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { formatResult, autoFormatTable, readOnly, mutating, destructive, } from "@getimo/mcp-toolkit";
|
|
3
3
|
import { request, hintFor } from "./client.js";
|
|
4
|
+
// SettingsHandler::sanitizeSettingsData (core/src/Admin/Handler/SettingsHandler.php)
|
|
5
|
+
// pins the canonical allow-list. Keep this in sync with that PHP constant.
|
|
6
|
+
const SETTABLE_KEYS = [
|
|
7
|
+
"cache_ttl",
|
|
8
|
+
"debug_mode",
|
|
9
|
+
"log_level",
|
|
10
|
+
"api_timeout",
|
|
11
|
+
"server_debug_mode",
|
|
12
|
+
"delete_data_on_uninstall",
|
|
13
|
+
"error_reporting",
|
|
14
|
+
];
|
|
4
15
|
export function registerSettingsTools(server) {
|
|
5
16
|
// ── apimapper_settings_get ─────────────────────────────────────────
|
|
17
|
+
// F-A6-09: PHP returns `{success, settings, tier}`. Surface tier + settings
|
|
18
|
+
// dict explicitly so callers can target either without parsing the whole
|
|
19
|
+
// envelope.
|
|
6
20
|
server.registerTool("apimapper_settings_get", {
|
|
7
21
|
title: "Get Settings",
|
|
8
|
-
description: "Fetch all API Mapper plugin settings (
|
|
22
|
+
description: "Fetch all API Mapper plugin settings (cache_ttl, debug_mode, log_level, api_timeout, " +
|
|
23
|
+
"server_debug_mode, delete_data_on_uninstall, error_reporting) plus the active license tier." +
|
|
9
24
|
"\n\nExample:\n apimapper_settings_get({})",
|
|
10
25
|
inputSchema: {},
|
|
11
26
|
annotations: readOnly(),
|
|
@@ -14,17 +29,27 @@ export function registerSettingsTools(server) {
|
|
|
14
29
|
if (!r.success) {
|
|
15
30
|
return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: {}, hint: hintFor(r.errorCode) }, true);
|
|
16
31
|
}
|
|
17
|
-
|
|
32
|
+
const settings = (r.data?.settings && typeof r.data.settings === "object")
|
|
33
|
+
? r.data.settings
|
|
34
|
+
: {};
|
|
35
|
+
return formatResult({
|
|
36
|
+
tier: r.data?.tier,
|
|
37
|
+
settings,
|
|
38
|
+
settable_keys: SETTABLE_KEYS,
|
|
39
|
+
}, false, { maxChars: 4000 });
|
|
18
40
|
});
|
|
19
41
|
// ── apimapper_settings_update ──────────────────────────────────────
|
|
42
|
+
// F-A6-10: Real allow-list is SETTABLE_KEYS above; telemetry_enabled +
|
|
43
|
+
// beta_channel are NOT real keys (legacy descriptions referenced them).
|
|
20
44
|
server.registerTool("apimapper_settings_update", {
|
|
21
45
|
title: "Update Settings",
|
|
22
|
-
description: "Update plugin settings. Only provided keys are changed
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
"
|
|
46
|
+
description: "Update plugin settings. Only provided keys are changed and only the canonical allow-list " +
|
|
47
|
+
"(cache_ttl, debug_mode, log_level, api_timeout, server_debug_mode, " +
|
|
48
|
+
"delete_data_on_uninstall, error_reporting) is honored — unknown keys are dropped server-side. " +
|
|
49
|
+
"Use apimapper_settings_get to inspect the current full set." +
|
|
50
|
+
"\n\nExample:\n apimapper_settings_update({ patch: { cache_ttl: 600, debug_mode: true } })",
|
|
26
51
|
inputSchema: {
|
|
27
|
-
patch: z.record(z.string(), z.unknown()).describe(
|
|
52
|
+
patch: z.record(z.string(), z.unknown()).describe("Settings keys to update (any subset of the allow-list)."),
|
|
28
53
|
},
|
|
29
54
|
annotations: mutating(),
|
|
30
55
|
}, async ({ patch }) => {
|
|
@@ -41,9 +66,21 @@ export function registerSettingsTools(server) {
|
|
|
41
66
|
hint: hintFor(r.errorCode),
|
|
42
67
|
}, true);
|
|
43
68
|
}
|
|
44
|
-
|
|
69
|
+
// PHP returns the post-update sanitised settings dict; surface what was
|
|
70
|
+
// actually applied (not what was requested), so the caller can spot
|
|
71
|
+
// dropped/coerced keys.
|
|
72
|
+
const appliedSettings = (r.data?.settings && typeof r.data.settings === "object")
|
|
73
|
+
? r.data.settings
|
|
74
|
+
: undefined;
|
|
75
|
+
return formatResult({
|
|
76
|
+
updated: true,
|
|
77
|
+
requested_keys: Object.keys(patch),
|
|
78
|
+
applied_settings: appliedSettings,
|
|
79
|
+
}, false, { maxChars: 2000 });
|
|
45
80
|
});
|
|
46
81
|
// ── apimapper_settings_reset_demo ──────────────────────────────────
|
|
82
|
+
// F-A6-12: PHP returns `{success, result: {...}}` — surface `.result` not
|
|
83
|
+
// `.counts` (the previous read pulled a field that doesn't exist).
|
|
47
84
|
server.registerTool("apimapper_settings_reset_demo", {
|
|
48
85
|
title: "Reset Demo Data",
|
|
49
86
|
description: "Reset demo connections + demo flows back to factory state. Removes user-modifications " +
|
|
@@ -69,12 +106,14 @@ export function registerSettingsTools(server) {
|
|
|
69
106
|
if (!r.success) {
|
|
70
107
|
return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: {}, hint: hintFor(r.errorCode) }, true);
|
|
71
108
|
}
|
|
72
|
-
return formatResult({ reset: true,
|
|
109
|
+
return formatResult({ reset: true, result: r.data?.result }, false, { maxChars: 2000 });
|
|
73
110
|
});
|
|
74
111
|
// ── apimapper_features_get ─────────────────────────────────────────
|
|
75
112
|
server.registerTool("apimapper_features_get", {
|
|
76
113
|
title: "Get License-Gated Features",
|
|
77
|
-
description: "Fetch the
|
|
114
|
+
description: "Fetch the license-gated feature dict for the current tier (Free/Pro/Developer). " +
|
|
115
|
+
"The features map mixes booleans (e.g., 'jmespath: true') and numeric limits " +
|
|
116
|
+
"(e.g., 'max_connections: 1'); read each key by its expected type." +
|
|
78
117
|
"\n\nExample:\n apimapper_features_get({})",
|
|
79
118
|
inputSchema: {},
|
|
80
119
|
annotations: readOnly(),
|
|
@@ -88,6 +127,8 @@ export function registerSettingsTools(server) {
|
|
|
88
127
|
return formatResult({ tier: r.data?.tier, feature_count: featureCount, features }, false, { maxChars: 4000 });
|
|
89
128
|
});
|
|
90
129
|
// ── apimapper_platform_parity ──────────────────────────────────────
|
|
130
|
+
// F-A6-02: PHP PlatformParityHandler returns `{matrix, summary, gaps}` —
|
|
131
|
+
// `wordpress`/`joomla` are nested inside `matrix`, not top-level.
|
|
91
132
|
server.registerTool("apimapper_platform_parity", {
|
|
92
133
|
title: "Get Platform Parity Status",
|
|
93
134
|
description: "Compare feature parity between WordPress and Joomla versions of API Mapper." +
|
|
@@ -102,12 +143,14 @@ export function registerSettingsTools(server) {
|
|
|
102
143
|
const gaps = Array.isArray(r.data?.gaps) ? r.data.gaps : [];
|
|
103
144
|
return formatResult({
|
|
104
145
|
gap_count: gaps.length,
|
|
105
|
-
|
|
106
|
-
|
|
146
|
+
matrix: r.data?.matrix,
|
|
147
|
+
summary: r.data?.summary,
|
|
107
148
|
gaps,
|
|
108
149
|
}, false, { maxChars: 4000 });
|
|
109
150
|
});
|
|
110
151
|
// ── apimapper_health_warnings_list ─────────────────────────────────
|
|
152
|
+
// F-A6-01: PHP HealthWarningsHandler returns `{visible, items, signature}`.
|
|
153
|
+
// Items shape: `{credentialId, type}` (NOT `{id, severity, message}`).
|
|
111
154
|
server.registerTool("apimapper_health_warnings_list", {
|
|
112
155
|
title: "List Health Warnings",
|
|
113
156
|
description: "List active admin health-warnings (banners shown in the Admin UI)." +
|
|
@@ -119,19 +162,18 @@ export function registerSettingsTools(server) {
|
|
|
119
162
|
if (!r.success) {
|
|
120
163
|
return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: {}, hint: hintFor(r.errorCode) }, true);
|
|
121
164
|
}
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
165
|
+
const items = Array.isArray(r.data?.items) ? r.data.items : [];
|
|
166
|
+
const visible = Boolean(r.data?.visible);
|
|
167
|
+
return autoFormatTable(items.map((w) => ({
|
|
168
|
+
credentialId: w.credentialId || "—",
|
|
169
|
+
type: w.type || "—",
|
|
127
170
|
})), {
|
|
128
171
|
columns: [
|
|
129
|
-
{ key: "
|
|
130
|
-
{ key: "
|
|
131
|
-
{ key: "message", label: "MESSAGE", width: 60 },
|
|
172
|
+
{ key: "credentialId", label: "CREDENTIAL_ID", width: 32 },
|
|
173
|
+
{ key: "type", label: "TYPE", width: 28 },
|
|
132
174
|
],
|
|
133
|
-
header: (n) => `${n} active warnings`,
|
|
134
|
-
footer: "Use apimapper_health_warnings_dismiss
|
|
175
|
+
header: (n) => `${n} active warnings${visible ? "" : " (banner dismissed)"}`,
|
|
176
|
+
footer: "Use apimapper_health_warnings_dismiss to dismiss the current set.",
|
|
135
177
|
});
|
|
136
178
|
});
|
|
137
179
|
// ── apimapper_health_warnings_dismiss ──────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/modules/apimapper/settings.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,sEAAsE;IACtE,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/modules/apimapper/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,17 @@
|
|
|
7
7
|
// MCP clients that support resource discovery (Claude Code, ChatGPT, Cursor)
|
|
8
8
|
// can list + read these without invoking a tool, so the skill docs are
|
|
9
9
|
// accessible both via tool (apimapper_get_skill, Phase 7.4) and resource.
|
|
10
|
+
//
|
|
11
|
+
// Audience targeting (MCP-spec 2025-06-18):
|
|
12
|
+
// Each resource is annotated with `audience: ["assistant"]` so spec-compliant
|
|
13
|
+
// clients hide them from the user-facing resource picker. The bundled markdown
|
|
14
|
+
// is AI-agent oriented (tool-call syntax, debug notes) and confuses customers
|
|
15
|
+
// when surfaced as a document. Defense-in-depth: the `description` strings
|
|
16
|
+
// below are still customer-friendly so that clients which ignore the audience
|
|
17
|
+
// flag (Claude Desktop, rc-period 2026-05-19, see modelcontextprotocol.io/docs/
|
|
18
|
+
// concepts/resources Section "Annotations") show non-embarrassing summaries.
|
|
19
|
+
// Tracking: walkthrough findings M4 in
|
|
20
|
+
// ~/Projekte/getimo/40-Plans/active/2026-05-18-apimapper-mcp-walkthrough-findings.md
|
|
10
21
|
import { readFileSync } from "node:fs";
|
|
11
22
|
import { fileURLToPath } from "node:url";
|
|
12
23
|
import { dirname, join, resolve } from "node:path";
|
|
@@ -22,35 +33,35 @@ const RESOURCES = [
|
|
|
22
33
|
uri: "skill://apimapper/getting-started",
|
|
23
34
|
name: "apimapper-getting-started",
|
|
24
35
|
title: "API Mapper — Getting Started",
|
|
25
|
-
description: "
|
|
36
|
+
description: "Overview of API Mapper concepts: connections, flows, sources, and how they appear in YOOtheme.",
|
|
26
37
|
fileName: "SKILL.md",
|
|
27
38
|
},
|
|
28
39
|
{
|
|
29
40
|
uri: "skill://apimapper/oauth",
|
|
30
41
|
name: "apimapper-oauth",
|
|
31
42
|
title: "API Mapper — OAuth Sources",
|
|
32
|
-
description: "
|
|
43
|
+
description: "Guidance on connecting OAuth-protected APIs (Google, Pexels, Instagram, Notion, and similar).",
|
|
33
44
|
fileName: "reference/oauth.md",
|
|
34
45
|
},
|
|
35
46
|
{
|
|
36
47
|
uri: "skill://apimapper/yootheme",
|
|
37
48
|
name: "apimapper-yootheme",
|
|
38
49
|
title: "API Mapper — YOOtheme Dynamic Content",
|
|
39
|
-
description: "
|
|
50
|
+
description: "How API Mapper flows appear as YOOtheme sources, including the Save-versus-Publish distinction.",
|
|
40
51
|
fileName: "reference/yootheme.md",
|
|
41
52
|
},
|
|
42
53
|
{
|
|
43
54
|
uri: "skill://apimapper/joomla",
|
|
44
55
|
name: "apimapper-joomla",
|
|
45
56
|
title: "API Mapper — Joomla Notes",
|
|
46
|
-
description: "Joomla
|
|
57
|
+
description: "Joomla-specific notes for installing and authenticating against the API Mapper component.",
|
|
47
58
|
fileName: "reference/joomla.md",
|
|
48
59
|
},
|
|
49
60
|
{
|
|
50
61
|
uri: "skill://apimapper/troubleshooting",
|
|
51
62
|
name: "apimapper-troubleshooting",
|
|
52
63
|
title: "API Mapper — Troubleshooting",
|
|
53
|
-
description: "HTTP status
|
|
64
|
+
description: "Common error states and how to resolve them: HTTP status codes, flow issues, credential problems.",
|
|
54
65
|
fileName: "reference/troubleshooting.md",
|
|
55
66
|
},
|
|
56
67
|
];
|
|
@@ -68,6 +79,14 @@ export function registerSkillResources(server, rootDir) {
|
|
|
68
79
|
title: meta.title,
|
|
69
80
|
description: meta.description,
|
|
70
81
|
mimeType: "text/markdown",
|
|
82
|
+
// MCP-spec audience targeting: hide from user-facing resource pickers
|
|
83
|
+
// in spec-compliant clients (Cursor, Zed, future Claude Desktop).
|
|
84
|
+
// Priority signals relative importance among assistant-audience
|
|
85
|
+
// resources; 0.8 = high but below first-class tool surfaces.
|
|
86
|
+
annotations: {
|
|
87
|
+
audience: ["assistant"],
|
|
88
|
+
priority: 0.8,
|
|
89
|
+
},
|
|
71
90
|
}, async (uri) => {
|
|
72
91
|
const text = readFileSync(filePath, "utf8");
|
|
73
92
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-resources.js","sourceRoot":"","sources":["../../../src/modules/apimapper/skill-resources.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,sEAAsE;AACtE,4EAA4E;AAC5E,6DAA6D;AAC7D,EAAE;AACF,6EAA6E;AAC7E,uEAAuE;AACvE,0EAA0E;
|
|
1
|
+
{"version":3,"file":"skill-resources.js","sourceRoot":"","sources":["../../../src/modules/apimapper/skill-resources.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,sEAAsE;AACtE,4EAA4E;AAC5E,6DAA6D;AAC7D,EAAE;AACF,6EAA6E;AAC7E,uEAAuE;AACvE,0EAA0E;AAC1E,EAAE;AACF,4CAA4C;AAC5C,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAC9E,gFAAgF;AAChF,6EAA6E;AAC7E,uCAAuC;AACvC,qFAAqF;AAGrF,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnD,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,mCAAmC;IACnC,yBAAyB;IACzB,4BAA4B;IAC5B,0BAA0B;IAC1B,mCAAmC;CAC3B,CAAC;AAYX,MAAM,SAAS,GAAwB;IACrC;QACE,GAAG,EAAE,mCAAmC;QACxC,IAAI,EAAE,2BAA2B;QACjC,KAAK,EAAE,8BAA8B;QACrC,WAAW,EACT,gGAAgG;QAClG,QAAQ,EAAE,UAAU;KACrB;IACD;QACE,GAAG,EAAE,yBAAyB;QAC9B,IAAI,EAAE,iBAAiB;QACvB,KAAK,EAAE,4BAA4B;QACnC,WAAW,EACT,+FAA+F;QACjG,QAAQ,EAAE,oBAAoB;KAC/B;IACD;QACE,GAAG,EAAE,4BAA4B;QACjC,IAAI,EAAE,oBAAoB;QAC1B,KAAK,EAAE,uCAAuC;QAC9C,WAAW,EACT,iGAAiG;QACnG,QAAQ,EAAE,uBAAuB;KAClC;IACD;QACE,GAAG,EAAE,0BAA0B;QAC/B,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,2BAA2B;QAClC,WAAW,EAAE,2FAA2F;QACxG,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,GAAG,EAAE,mCAAmC;QACxC,IAAI,EAAE,2BAA2B;QACjC,KAAK,EAAE,8BAA8B;QACrC,WAAW,EACT,mGAAmG;QACrG,QAAQ,EAAE,8BAA8B;KACzC;CACF,CAAC;AAEF,SAAS,iBAAiB;IACxB,2EAA2E;IAC3E,sEAAsE;IACtE,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,OAAgB;IACxE,MAAM,OAAO,GAAG,OAAO,IAAI,iBAAiB,EAAE,CAAC;IAE/C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrE,MAAM,CAAC,gBAAgB,CACrB,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,GAAG,EACR;YACE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ,EAAE,eAAe;YACzB,sEAAsE;YACtE,kEAAkE;YAClE,gEAAgE;YAChE,6DAA6D;YAC7D,WAAW,EAAE;gBACX,QAAQ,EAAE,CAAC,WAAW,CAAC;gBACvB,QAAQ,EAAE,GAAG;aACd;SACF,EACD,KAAK,EAAE,GAAQ,EAAE,EAAE;YACjB,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC5C,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;wBACnB,QAAQ,EAAE,eAAe;wBACzB,IAAI;qBACL;iBACF;aACF,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -44,7 +44,11 @@ function normaliseIdentity(data) {
|
|
|
44
44
|
const o = data;
|
|
45
45
|
const plugin_version = typeof o.plugin_version === "string" ? o.plugin_version : "";
|
|
46
46
|
const plugin_hash = typeof o.plugin_hash === "string" ? o.plugin_hash : "";
|
|
47
|
-
|
|
47
|
+
// F-A6-06: PHP Wave 1B emits BOTH `site_url` (canonical) and `siteurl`
|
|
48
|
+
// (legacy WP option key) — accept either.
|
|
49
|
+
const site_url = (typeof o.site_url === "string" && o.site_url) ||
|
|
50
|
+
(typeof o.siteurl === "string" && o.siteurl) ||
|
|
51
|
+
"";
|
|
48
52
|
const caps = Array.isArray(o.capabilities)
|
|
49
53
|
? o.capabilities.filter((c) => typeof c === "string")
|
|
50
54
|
: [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-profile.js","sourceRoot":"","sources":["../../../src/modules/apimapper/use-profile.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,EAAE;AACF,8EAA8E;AAC9E,0EAA0E;AAC1E,iEAAiE;AACjE,EAAE;AACF,8EAA8E;AAC9E,6EAA6E;AAC7E,wEAAwE;AACxE,6EAA6E;AAC7E,EAAE;AACF,yEAAyE;AACzE,6EAA6E;AAG7E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG7D,OAAO,EACL,cAAc,GAGf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AA+BnD,4EAA4E;AAE5E;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAgB,EAChB,KAAa;IAEb,MAAM,QAAQ,GAAa,cAAc,CAAC;QACxC,IAAI,EAAE,OAAO,CAAC,QAAwB;QACtC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK;KACN,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,OAAO,CAAU,UAAU,CAAC,CAAC;IACpD,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,uBAAuB,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAa;IACtC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,CAAC,GAAG,IAA+B,CAAC;IAC1C,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IACpF,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"use-profile.js","sourceRoot":"","sources":["../../../src/modules/apimapper/use-profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { formatResult, creating, mutating } from "@getimo/mcp-toolkit";
|
|
3
3
|
import { request, hintFor } from "./client.js";
|
|
4
|
+
import { unwrapEntity } from "./envelope.js";
|
|
4
5
|
import { buildFlowGraph } from "./graph-builder.js";
|
|
5
6
|
import { normalizeMergeStrategy } from "./normalizers.js";
|
|
6
7
|
const SourceSpec = z.object({
|
|
@@ -66,6 +67,9 @@ export function registerWorkflowTools(server) {
|
|
|
66
67
|
}, true);
|
|
67
68
|
}
|
|
68
69
|
// Step 1: create
|
|
70
|
+
// F-A5-05a: PHP returns `{success, flow: {id, name, ...}}`. Unwrap the
|
|
71
|
+
// nested `flow` object via the shared envelope helper (tolerates flat
|
|
72
|
+
// shape for future contract bumps).
|
|
69
73
|
const createR = await request("/flows", {
|
|
70
74
|
method: "POST",
|
|
71
75
|
body: JSON.stringify({
|
|
@@ -76,7 +80,8 @@ export function registerWorkflowTools(server) {
|
|
|
76
80
|
viewport: graph.viewport,
|
|
77
81
|
}),
|
|
78
82
|
});
|
|
79
|
-
|
|
83
|
+
const createdFlow = unwrapEntity(createR.data, "flow");
|
|
84
|
+
if (!createR.success || !createdFlow?.id) {
|
|
80
85
|
return formatResult({
|
|
81
86
|
error: createR.error || "create returned no flow id",
|
|
82
87
|
status: createR.status,
|
|
@@ -85,9 +90,13 @@ export function registerWorkflowTools(server) {
|
|
|
85
90
|
hint: hintFor(createR.errorCode),
|
|
86
91
|
}, true);
|
|
87
92
|
}
|
|
88
|
-
const flowId =
|
|
93
|
+
const flowId = createdFlow.id;
|
|
89
94
|
const steps = [`1. Flow created: ${flowId}`];
|
|
90
95
|
// Step 2: compile (optional)
|
|
96
|
+
// F-A5-05b: PHP `/flows/{id}/compile` returns `{success, compiled, flowId?, errors?}`
|
|
97
|
+
// on success. Errors collection is the only reliable validation signal — we
|
|
98
|
+
// do not rely on `flow.is_compiled` here because the response generally
|
|
99
|
+
// does not include the full flow object.
|
|
91
100
|
let compiled = false;
|
|
92
101
|
let compileError;
|
|
93
102
|
if (compile) {
|
|
@@ -99,8 +108,7 @@ export function registerWorkflowTools(server) {
|
|
|
99
108
|
else {
|
|
100
109
|
const dataObj = compileR.data && typeof compileR.data === "object" ? compileR.data : {};
|
|
101
110
|
const errors = Array.isArray(dataObj.errors) ? dataObj.errors : [];
|
|
102
|
-
|
|
103
|
-
if (errors.length > 0 || flow.is_compiled === false) {
|
|
111
|
+
if (errors.length > 0) {
|
|
104
112
|
compileError = `compile errors: ${JSON.stringify(errors)}`;
|
|
105
113
|
steps.push("2. Compile FAILED with validation errors");
|
|
106
114
|
}
|
|
@@ -125,7 +133,7 @@ export function registerWorkflowTools(server) {
|
|
|
125
133
|
return formatResult({
|
|
126
134
|
created: true,
|
|
127
135
|
flow_id: flowId,
|
|
128
|
-
name:
|
|
136
|
+
name: createdFlow.name,
|
|
129
137
|
compiled,
|
|
130
138
|
source_count: sources.length,
|
|
131
139
|
merge_strategy: merge ? normalizeMergeStrategy(merge.strategy) : null,
|
|
@@ -162,7 +170,9 @@ export function registerWorkflowTools(server) {
|
|
|
162
170
|
hint: hintFor(getR.errorCode),
|
|
163
171
|
}, true);
|
|
164
172
|
}
|
|
165
|
-
|
|
173
|
+
// F-A5-06a: PHP returns `{success, flow: {...}}`. Unwrap the nested flow
|
|
174
|
+
// via the shared envelope helper.
|
|
175
|
+
const flow = (unwrapEntity(getR.data, "flow") ?? {});
|
|
166
176
|
if (!Array.isArray(flow.nodes)) {
|
|
167
177
|
return formatResult({
|
|
168
178
|
error: "flow.nodes is not an array",
|
|
@@ -199,6 +209,9 @@ export function registerWorkflowTools(server) {
|
|
|
199
209
|
}
|
|
200
210
|
}
|
|
201
211
|
mergeNode.data = newData;
|
|
212
|
+
// F-A5-06b: PHP wraps PUT response as `{success, flow: {...}}`. We don't
|
|
213
|
+
// read any fields off it here, but downstream callers should unwrap
|
|
214
|
+
// `(putR.data as any)?.flow` before reading fields.
|
|
202
215
|
const putR = await request(`/flows/${encodeURIComponent(flow_id)}`, {
|
|
203
216
|
method: "PUT",
|
|
204
217
|
body: JSON.stringify({ nodes: flow.nodes }),
|
|
@@ -274,9 +287,12 @@ export function registerWorkflowTools(server) {
|
|
|
274
287
|
}
|
|
275
288
|
steps.push("1. Flow compiled");
|
|
276
289
|
// Stage 2: cache invalidate (admin cache — admin-ui + render cache)
|
|
290
|
+
// F-A5-07b: PHP CacheInvalidateController expects `{scope: 'flow.published',
|
|
291
|
+
// payload: {flow_id}}` — `scope: 'flow'` is a legacy alias kept by Wave 1B
|
|
292
|
+
// but the canonical scope is the dotted event id matching the PHP event class.
|
|
277
293
|
const cacheR = await request("/cache/admin/invalidate", {
|
|
278
294
|
method: "POST",
|
|
279
|
-
body: JSON.stringify({ scope: "flow",
|
|
295
|
+
body: JSON.stringify({ scope: "flow.published", payload: { flow_id } }),
|
|
280
296
|
});
|
|
281
297
|
if (cacheR.success) {
|
|
282
298
|
steps.push("2. Admin cache invalidated");
|