@wootsup/mcp 0.1.0-rc.1
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/CHANGELOG.md +91 -0
- package/LICENSE +21 -0
- package/README.md +179 -0
- package/SECURITY.md +163 -0
- package/dist/auth/keychain.d.ts +47 -0
- package/dist/auth/keychain.js +262 -0
- package/dist/auth/keychain.js.map +1 -0
- package/dist/auth/oauth-provider.d.ts +68 -0
- package/dist/auth/oauth-provider.js +232 -0
- package/dist/auth/oauth-provider.js.map +1 -0
- package/dist/auth/profiles.d.ts +52 -0
- package/dist/auth/profiles.js +200 -0
- package/dist/auth/profiles.js.map +1 -0
- package/dist/auth/token.d.ts +27 -0
- package/dist/auth/token.js +88 -0
- package/dist/auth/token.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +137 -0
- package/dist/index.js.map +1 -0
- package/dist/install-skill.d.ts +23 -0
- package/dist/install-skill.js +73 -0
- package/dist/install-skill.js.map +1 -0
- package/dist/modules/apimapper/cache.d.ts +2 -0
- package/dist/modules/apimapper/cache.js +71 -0
- package/dist/modules/apimapper/cache.js.map +1 -0
- package/dist/modules/apimapper/client.d.ts +85 -0
- package/dist/modules/apimapper/client.js +523 -0
- package/dist/modules/apimapper/client.js.map +1 -0
- package/dist/modules/apimapper/connections.d.ts +2 -0
- package/dist/modules/apimapper/connections.js +406 -0
- package/dist/modules/apimapper/connections.js.map +1 -0
- package/dist/modules/apimapper/credential-sanitizer.d.ts +7 -0
- package/dist/modules/apimapper/credential-sanitizer.js +70 -0
- package/dist/modules/apimapper/credential-sanitizer.js.map +1 -0
- package/dist/modules/apimapper/credentials.d.ts +2 -0
- package/dist/modules/apimapper/credentials.js +258 -0
- package/dist/modules/apimapper/credentials.js.map +1 -0
- package/dist/modules/apimapper/diagnose.d.ts +18 -0
- package/dist/modules/apimapper/diagnose.js +305 -0
- package/dist/modules/apimapper/diagnose.js.map +1 -0
- package/dist/modules/apimapper/flows.d.ts +2 -0
- package/dist/modules/apimapper/flows.js +372 -0
- package/dist/modules/apimapper/flows.js.map +1 -0
- package/dist/modules/apimapper/get-skill.d.ts +4 -0
- package/dist/modules/apimapper/get-skill.js +88 -0
- package/dist/modules/apimapper/get-skill.js.map +1 -0
- package/dist/modules/apimapper/graph-builder.d.ts +47 -0
- package/dist/modules/apimapper/graph-builder.js +117 -0
- package/dist/modules/apimapper/graph-builder.js.map +1 -0
- package/dist/modules/apimapper/graph.d.ts +2 -0
- package/dist/modules/apimapper/graph.js +117 -0
- package/dist/modules/apimapper/graph.js.map +1 -0
- package/dist/modules/apimapper/index.d.ts +2 -0
- package/dist/modules/apimapper/index.js +43 -0
- package/dist/modules/apimapper/index.js.map +1 -0
- package/dist/modules/apimapper/inspect.d.ts +20 -0
- package/dist/modules/apimapper/inspect.js +86 -0
- package/dist/modules/apimapper/inspect.js.map +1 -0
- package/dist/modules/apimapper/library.d.ts +2 -0
- package/dist/modules/apimapper/library.js +237 -0
- package/dist/modules/apimapper/library.js.map +1 -0
- package/dist/modules/apimapper/license.d.ts +2 -0
- package/dist/modules/apimapper/license.js +142 -0
- package/dist/modules/apimapper/license.js.map +1 -0
- package/dist/modules/apimapper/local-sources.d.ts +2 -0
- package/dist/modules/apimapper/local-sources.js +123 -0
- package/dist/modules/apimapper/local-sources.js.map +1 -0
- package/dist/modules/apimapper/misc.d.ts +2 -0
- package/dist/modules/apimapper/misc.js +149 -0
- package/dist/modules/apimapper/misc.js.map +1 -0
- package/dist/modules/apimapper/node-schema.d.ts +217 -0
- package/dist/modules/apimapper/node-schema.js +218 -0
- package/dist/modules/apimapper/node-schema.js.map +1 -0
- package/dist/modules/apimapper/normalizers.d.ts +13 -0
- package/dist/modules/apimapper/normalizers.js +37 -0
- package/dist/modules/apimapper/normalizers.js.map +1 -0
- package/dist/modules/apimapper/onboarding.d.ts +51 -0
- package/dist/modules/apimapper/onboarding.js +201 -0
- package/dist/modules/apimapper/onboarding.js.map +1 -0
- package/dist/modules/apimapper/schema.d.ts +2 -0
- package/dist/modules/apimapper/schema.js +84 -0
- package/dist/modules/apimapper/schema.js.map +1 -0
- package/dist/modules/apimapper/settings.d.ts +2 -0
- package/dist/modules/apimapper/settings.js +157 -0
- package/dist/modules/apimapper/settings.js.map +1 -0
- package/dist/modules/apimapper/skill-resources.d.ts +4 -0
- package/dist/modules/apimapper/skill-resources.js +85 -0
- package/dist/modules/apimapper/skill-resources.js.map +1 -0
- package/dist/modules/apimapper/types.d.ts +111 -0
- package/dist/modules/apimapper/types.js +14 -0
- package/dist/modules/apimapper/types.js.map +1 -0
- package/dist/modules/apimapper/use-profile.d.ts +34 -0
- package/dist/modules/apimapper/use-profile.js +176 -0
- package/dist/modules/apimapper/use-profile.js.map +1 -0
- package/dist/modules/apimapper/workflows.d.ts +2 -0
- package/dist/modules/apimapper/workflows.js +301 -0
- package/dist/modules/apimapper/workflows.js.map +1 -0
- package/dist/platform/index.d.ts +71 -0
- package/dist/platform/index.js +377 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/server-http.d.ts +22 -0
- package/dist/server-http.js +159 -0
- package/dist/server-http.js.map +1 -0
- package/dist/setup/detect-clients.d.ts +39 -0
- package/dist/setup/detect-clients.js +152 -0
- package/dist/setup/detect-clients.js.map +1 -0
- package/dist/setup/probe-handshake.d.ts +26 -0
- package/dist/setup/probe-handshake.js +159 -0
- package/dist/setup/probe-handshake.js.map +1 -0
- package/dist/setup/write-config.d.ts +25 -0
- package/dist/setup/write-config.js +247 -0
- package/dist/setup/write-config.js.map +1 -0
- package/dist/setup-cli.d.ts +49 -0
- package/dist/setup-cli.js +292 -0
- package/dist/setup-cli.js.map +1 -0
- package/dist/skill-instructions.d.ts +10 -0
- package/dist/skill-instructions.js +68 -0
- package/dist/skill-instructions.js.map +1 -0
- package/dist/transports/http.d.ts +29 -0
- package/dist/transports/http.js +267 -0
- package/dist/transports/http.js.map +1 -0
- package/dist/transports/stdio.d.ts +9 -0
- package/dist/transports/stdio.js +19 -0
- package/dist/transports/stdio.js.map +1 -0
- package/docs/architecture.md +140 -0
- package/docs/customgraph-internal-migration.md +210 -0
- package/docs/security.md +126 -0
- package/docs/tools.md +230 -0
- package/manifest.json +76 -0
- package/package.json +61 -0
- package/skills/apimapper/SKILL.md +57 -0
- package/skills/apimapper/reference/joomla.md +85 -0
- package/skills/apimapper/reference/oauth.md +94 -0
- package/skills/apimapper/reference/troubleshooting.md +123 -0
- package/skills/apimapper/reference/yootheme.md +96 -0
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { formatResult, autoFormatTable, readOnly, creating, mutating, destructive, } from "@getimo/mcp-toolkit";
|
|
3
|
+
import { request, hintFor } from "./client.js";
|
|
4
|
+
import { nodeSchema } from "./node-schema.js";
|
|
5
|
+
export function registerFlowTools(server) {
|
|
6
|
+
// ── apimapper_flow_list ────────────────────────────────────────────
|
|
7
|
+
server.registerTool("apimapper_flow_list", {
|
|
8
|
+
title: "List Flows",
|
|
9
|
+
description: "List all API Mapper flows. Use apimapper_flow_get for full structure." +
|
|
10
|
+
"\n\nExample:\n apimapper_flow_list({ limit: 25 })",
|
|
11
|
+
inputSchema: {
|
|
12
|
+
source: z
|
|
13
|
+
.enum(["user", "demo", "library", "devtools", "all"])
|
|
14
|
+
.default("all")
|
|
15
|
+
.describe("Filter by origin"),
|
|
16
|
+
compiled: z.enum(["any", "yes", "no"]).default("any").describe("Filter by compile status"),
|
|
17
|
+
limit: z.number().min(1).max(500).default(100).describe("Max items (1-500)"),
|
|
18
|
+
},
|
|
19
|
+
annotations: readOnly(),
|
|
20
|
+
}, async ({ source, compiled, limit }) => {
|
|
21
|
+
const r = await request("/flows");
|
|
22
|
+
if (!r.success) {
|
|
23
|
+
return formatResult({
|
|
24
|
+
error: r.error,
|
|
25
|
+
status: r.status,
|
|
26
|
+
errorCode: r.errorCode,
|
|
27
|
+
context: { source, compiled, limit },
|
|
28
|
+
hint: hintFor(r.errorCode),
|
|
29
|
+
}, true);
|
|
30
|
+
}
|
|
31
|
+
let items = Array.isArray(r.data?.flows) ? r.data.flows : [];
|
|
32
|
+
// Derive `is_compiled` from REST shape: backend returns `compiledAt`
|
|
33
|
+
// (ISO timestamp string or null) and a `compiled` array of artifacts.
|
|
34
|
+
// Either indicates the flow has been compiled. Normalising here keeps
|
|
35
|
+
// downstream filtering + display logic uniform regardless of platform.
|
|
36
|
+
const isCompiledOf = (f) => {
|
|
37
|
+
if (typeof f.is_compiled === "boolean")
|
|
38
|
+
return f.is_compiled;
|
|
39
|
+
const raw = f;
|
|
40
|
+
if (typeof raw.compiledAt === "string" && raw.compiledAt.length > 0)
|
|
41
|
+
return true;
|
|
42
|
+
if (Array.isArray(raw.compiled) && raw.compiled.length > 0)
|
|
43
|
+
return true;
|
|
44
|
+
return false;
|
|
45
|
+
};
|
|
46
|
+
if (source !== "all")
|
|
47
|
+
items = items.filter((f) => f.source === source);
|
|
48
|
+
if (compiled === "yes")
|
|
49
|
+
items = items.filter((f) => isCompiledOf(f));
|
|
50
|
+
if (compiled === "no")
|
|
51
|
+
items = items.filter((f) => !isCompiledOf(f));
|
|
52
|
+
items = items.slice(0, limit);
|
|
53
|
+
return autoFormatTable(items.map((f) => ({
|
|
54
|
+
id: f.id,
|
|
55
|
+
name: f.name,
|
|
56
|
+
source: f.source || "—",
|
|
57
|
+
nodes: f.node_count ?? "?",
|
|
58
|
+
compiled: isCompiledOf(f) ? "✓" : "✗",
|
|
59
|
+
types: (f.node_types || []).join(","),
|
|
60
|
+
})), {
|
|
61
|
+
columns: [
|
|
62
|
+
// Width 36 accommodates 30+ char IDs (e.g. legacy template
|
|
63
|
+
// flows like flow_calendly_jla_229fcbce95b7 = 30 chars).
|
|
64
|
+
// Truncation produces orphan IDs that downstream tools fail
|
|
65
|
+
// to resolve via flow_get. The +6 headroom matches the
|
|
66
|
+
// longest historical IDs without bloating the table.
|
|
67
|
+
{ key: "id", label: "ID", width: 36 },
|
|
68
|
+
{ key: "name", label: "NAME", width: 32 },
|
|
69
|
+
{ key: "source", label: "SRC", width: 10 },
|
|
70
|
+
{ key: "nodes", label: "N", width: 4 },
|
|
71
|
+
{ key: "compiled", label: "C", width: 3 },
|
|
72
|
+
{ key: "types", label: "TYPES", width: 36 },
|
|
73
|
+
],
|
|
74
|
+
header: (n) => `${n} flows`,
|
|
75
|
+
footer: "Use apimapper_flow_get <id> for full structure.",
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
// ── apimapper_flow_get ─────────────────────────────────────────────
|
|
79
|
+
server.registerTool("apimapper_flow_get", {
|
|
80
|
+
title: "Get Flow",
|
|
81
|
+
description: "Fetch full flow definition (nodes, edges, viewport, compiled artifact)." +
|
|
82
|
+
"\n\nExample:\n apimapper_flow_get({ id: 'flow_Z2fLg70M84' })",
|
|
83
|
+
inputSchema: {
|
|
84
|
+
id: z.string().describe('Flow ID (e.g., "flow_aCfOEpwCtVZnPFwPOwO61"). Use apimapper_flow_list.'),
|
|
85
|
+
},
|
|
86
|
+
annotations: readOnly(),
|
|
87
|
+
}, async ({ id }) => {
|
|
88
|
+
const r = await request(`/flows/${encodeURIComponent(id)}`);
|
|
89
|
+
if (!r.success) {
|
|
90
|
+
return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: { id }, hint: hintFor(r.errorCode) }, true);
|
|
91
|
+
}
|
|
92
|
+
if (!r.data || (typeof r.data === "object" && Object.keys(r.data).length === 0)) {
|
|
93
|
+
return formatResult({ error: "flow not found", status: r.status, context: { id }, hint: hintFor("not_found") }, true);
|
|
94
|
+
}
|
|
95
|
+
return formatResult(r.data, false, { maxChars: 8000 });
|
|
96
|
+
});
|
|
97
|
+
// ── apimapper_flow_create ──────────────────────────────────────────
|
|
98
|
+
server.registerTool("apimapper_flow_create", {
|
|
99
|
+
title: "Create Flow",
|
|
100
|
+
description: "Create a new flow with full nodes + edges JSON. " +
|
|
101
|
+
"For declarative multi-source flow creation use apimapper_flow_setup_with_sources instead." +
|
|
102
|
+
"\n\nExample:\n apimapper_flow_create({ name: 'My Pexels Gallery', nodes: [{ id: 'src1', type: 'source' }, { id: 'out1', type: 'output' }], edges: [{ source: 'src1', target: 'out1' }] })",
|
|
103
|
+
inputSchema: {
|
|
104
|
+
name: z.string().min(1).describe('Flow name (appears in YOOtheme dropdown)'),
|
|
105
|
+
description: z.string().optional().describe("Optional description"),
|
|
106
|
+
nodes: z
|
|
107
|
+
.array(nodeSchema)
|
|
108
|
+
.min(1)
|
|
109
|
+
.describe('Node array. Each: {id, type, position:{x,y}, data:{...}}. ' +
|
|
110
|
+
'Discriminator `type` ∈ source | local-source | filter | transform | merge | output | output-yootheme | output-shortcode. ' +
|
|
111
|
+
'Per-type required data fields: ' +
|
|
112
|
+
'source.connectionId, local-source.contentType, filter.conditions, ' +
|
|
113
|
+
'transform.expression, merge.strategy ∈ {concat, join}.'),
|
|
114
|
+
edges: z
|
|
115
|
+
.array(z.record(z.string(), z.unknown()))
|
|
116
|
+
.describe('Edge array. Each: {id, source, target, targetHandle?, sourceHandle?}. ' +
|
|
117
|
+
'For merge: targetHandle="input-A" (first input) or "input-B" (second).'),
|
|
118
|
+
viewport: z
|
|
119
|
+
.object({ x: z.number(), y: z.number(), zoom: z.number() })
|
|
120
|
+
.optional()
|
|
121
|
+
.describe('React-Flow viewport (e.g., {"x":0,"y":0,"zoom":1})'),
|
|
122
|
+
},
|
|
123
|
+
annotations: creating(),
|
|
124
|
+
}, async (input) => {
|
|
125
|
+
const r = await request("/flows", {
|
|
126
|
+
method: "POST",
|
|
127
|
+
body: JSON.stringify(input),
|
|
128
|
+
});
|
|
129
|
+
if (!r.success) {
|
|
130
|
+
return formatResult({
|
|
131
|
+
error: r.error,
|
|
132
|
+
status: r.status,
|
|
133
|
+
errorCode: r.errorCode,
|
|
134
|
+
context: { name: input.name, node_count: input.nodes.length },
|
|
135
|
+
hint: hintFor(r.errorCode),
|
|
136
|
+
}, true);
|
|
137
|
+
}
|
|
138
|
+
return formatResult({
|
|
139
|
+
created: true,
|
|
140
|
+
id: r.data?.id,
|
|
141
|
+
name: r.data?.name,
|
|
142
|
+
node_count: r.data?.node_count,
|
|
143
|
+
is_compiled: r.data?.is_compiled ?? false,
|
|
144
|
+
next: "Call apimapper_flow_compile to publish to YOOtheme.",
|
|
145
|
+
}, false, { maxChars: 2000 });
|
|
146
|
+
});
|
|
147
|
+
// ── apimapper_flow_update ──────────────────────────────────────────
|
|
148
|
+
server.registerTool("apimapper_flow_update", {
|
|
149
|
+
title: "Update Flow",
|
|
150
|
+
description: "Update flow fields. Use to modify nodes/edges (e.g., toggle merge.strategy, change joinKey). " +
|
|
151
|
+
"After update, call apimapper_flow_compile." +
|
|
152
|
+
"\n\nExample:\n apimapper_flow_update({ id: 'flow_Z2fLg70M84', name: 'My Pexels Gallery (v2)' })",
|
|
153
|
+
inputSchema: {
|
|
154
|
+
id: z.string().describe("Flow ID. Use apimapper_flow_list to find."),
|
|
155
|
+
patch: z
|
|
156
|
+
.record(z.string(), z.unknown())
|
|
157
|
+
.describe('Fields to patch (e.g., {"nodes":[...updated nodes...]} or {"name":"Renamed"})'),
|
|
158
|
+
},
|
|
159
|
+
annotations: mutating(),
|
|
160
|
+
}, async ({ id, patch }) => {
|
|
161
|
+
const r = await request(`/flows/${encodeURIComponent(id)}`, {
|
|
162
|
+
method: "PUT",
|
|
163
|
+
body: JSON.stringify(patch),
|
|
164
|
+
});
|
|
165
|
+
if (!r.success) {
|
|
166
|
+
return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: { id }, hint: hintFor(r.errorCode) }, true);
|
|
167
|
+
}
|
|
168
|
+
return formatResult({
|
|
169
|
+
updated: true,
|
|
170
|
+
id: r.data?.id,
|
|
171
|
+
name: r.data?.name,
|
|
172
|
+
version: r.data?.version,
|
|
173
|
+
is_compiled: r.data?.is_compiled,
|
|
174
|
+
next: r.data?.is_compiled ? "Compile likely invalidated — call apimapper_flow_compile." : undefined,
|
|
175
|
+
}, false, { maxChars: 2000 });
|
|
176
|
+
});
|
|
177
|
+
// ── apimapper_flow_delete ──────────────────────────────────────────
|
|
178
|
+
server.registerTool("apimapper_flow_delete", {
|
|
179
|
+
title: "Delete Flow",
|
|
180
|
+
description: "Permanently delete a flow. If published, it disappears from YOOtheme. " +
|
|
181
|
+
"Preview-mode (confirm:false) fetches metadata first." +
|
|
182
|
+
"\n\nExample:\n apimapper_flow_delete({ id: 'flow_Z2fLg70M84', confirm: false })",
|
|
183
|
+
inputSchema: {
|
|
184
|
+
id: z.string().describe("Flow ID. Use apimapper_flow_list to find."),
|
|
185
|
+
confirm: z
|
|
186
|
+
.boolean()
|
|
187
|
+
.default(false)
|
|
188
|
+
.describe("Must be true to execute. On confirm:false, returns a preview."),
|
|
189
|
+
},
|
|
190
|
+
annotations: destructive(),
|
|
191
|
+
}, async ({ id, confirm }) => {
|
|
192
|
+
if (!confirm) {
|
|
193
|
+
const preview = await request(`/flows/${encodeURIComponent(id)}`);
|
|
194
|
+
return formatResult({
|
|
195
|
+
preview: true,
|
|
196
|
+
warning: "DESTRUCTIVE — Flow delete cannot be undone. Sources disappear from YOOtheme.",
|
|
197
|
+
target: preview.success && preview.data
|
|
198
|
+
? {
|
|
199
|
+
id: preview.data.id,
|
|
200
|
+
name: preview.data.name,
|
|
201
|
+
node_count: preview.data.node_count,
|
|
202
|
+
is_compiled: preview.data.is_compiled,
|
|
203
|
+
node_types: preview.data.node_types,
|
|
204
|
+
}
|
|
205
|
+
: { id, note: "could not preview — id may not exist" },
|
|
206
|
+
instruction: "Ask user to confirm, then call again with confirm: true.",
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
const r = await request(`/flows/${encodeURIComponent(id)}`, { method: "DELETE" });
|
|
210
|
+
if (!r.success) {
|
|
211
|
+
return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: { id }, hint: hintFor(r.errorCode) }, true);
|
|
212
|
+
}
|
|
213
|
+
return formatResult({ deleted: true, id }, false, { maxChars: 1500 });
|
|
214
|
+
});
|
|
215
|
+
// ── apimapper_flow_compile ─────────────────────────────────────────
|
|
216
|
+
server.registerTool("apimapper_flow_compile", {
|
|
217
|
+
title: "Compile Flow",
|
|
218
|
+
description: "Compile flow into executable pipeline (validation + topo sort + step generation + schema). " +
|
|
219
|
+
"Required before flow appears in YOOtheme." +
|
|
220
|
+
"\n\nExample:\n apimapper_flow_compile({ id: 'flow_Z2fLg70M84' })",
|
|
221
|
+
inputSchema: {
|
|
222
|
+
id: z.string().describe("Flow ID. Use apimapper_flow_list to find."),
|
|
223
|
+
},
|
|
224
|
+
annotations: mutating(),
|
|
225
|
+
}, async ({ id }) => {
|
|
226
|
+
const r = await request(`/flows/${encodeURIComponent(id)}/compile`, { method: "POST" });
|
|
227
|
+
if (!r.success) {
|
|
228
|
+
return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: { id }, hint: hintFor(r.errorCode) }, true);
|
|
229
|
+
}
|
|
230
|
+
const dataObj = r.data && typeof r.data === "object" ? r.data : {};
|
|
231
|
+
const flow = dataObj.flow ?? dataObj;
|
|
232
|
+
const errors = Array.isArray(dataObj.errors) ? dataObj.errors : [];
|
|
233
|
+
if (errors.length > 0 || (flow && flow.is_compiled === false)) {
|
|
234
|
+
return formatResult({
|
|
235
|
+
error: "compile failed",
|
|
236
|
+
status: r.status,
|
|
237
|
+
context: { id, errors },
|
|
238
|
+
hint: "Review the errors[] — most likely missing connection, missing joinKey, or invalid JMESPath. Use apimapper_flow_get to inspect node data.",
|
|
239
|
+
}, true);
|
|
240
|
+
}
|
|
241
|
+
return formatResult({
|
|
242
|
+
compiled: true,
|
|
243
|
+
id: flow?.id ?? id,
|
|
244
|
+
version: flow?.version,
|
|
245
|
+
node_count: flow?.node_count,
|
|
246
|
+
next: "Source now appears in YOOtheme dropdown. Use apimapper_graph_preview to test items.",
|
|
247
|
+
}, false, { maxChars: 2500 });
|
|
248
|
+
});
|
|
249
|
+
// ── apimapper_flow_detect_schema ───────────────────────────────────
|
|
250
|
+
server.registerTool("apimapper_flow_detect_schema", {
|
|
251
|
+
title: "Detect Flow Schema",
|
|
252
|
+
description: "Re-detect/refresh the output schema by sampling the upstream API. " +
|
|
253
|
+
"Use after upstream endpoint changes to surface new fields in the YOOtheme Builder." +
|
|
254
|
+
"\n\nExample:\n apimapper_flow_detect_schema({ id: 'flow_Z2fLg70M84' })",
|
|
255
|
+
inputSchema: {
|
|
256
|
+
id: z.string().describe("Flow ID. Use apimapper_flow_list to find."),
|
|
257
|
+
},
|
|
258
|
+
annotations: mutating(),
|
|
259
|
+
}, async ({ id }) => {
|
|
260
|
+
const r = await request(`/flows/${encodeURIComponent(id)}/detect-schema`, { method: "POST" });
|
|
261
|
+
if (!r.success) {
|
|
262
|
+
return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: { id }, hint: hintFor(r.errorCode) }, true);
|
|
263
|
+
}
|
|
264
|
+
const fields = Array.isArray(r.data?.fields) ? r.data.fields : [];
|
|
265
|
+
return formatResult({
|
|
266
|
+
detected: true,
|
|
267
|
+
id,
|
|
268
|
+
field_count: fields.length,
|
|
269
|
+
fields: fields.slice(0, 50),
|
|
270
|
+
output_schema: r.data?.output_schema,
|
|
271
|
+
}, false, { maxChars: 6000 });
|
|
272
|
+
});
|
|
273
|
+
// ── apimapper_flow_trace ───────────────────────────────────────────
|
|
274
|
+
server.registerTool("apimapper_flow_trace", {
|
|
275
|
+
title: "Get Flow Execution Trace",
|
|
276
|
+
description: "Fetch the execution trace from the last run (timing per step, item counts, errors). " +
|
|
277
|
+
"Useful for debugging slow flows or incorrect outputs." +
|
|
278
|
+
"\n\nExample:\n apimapper_flow_trace({ id: 'flow_Z2fLg70M84' })",
|
|
279
|
+
inputSchema: {
|
|
280
|
+
id: z.string().describe("Flow ID. Use apimapper_flow_list to find."),
|
|
281
|
+
},
|
|
282
|
+
annotations: readOnly(),
|
|
283
|
+
}, async ({ id }) => {
|
|
284
|
+
const r = await request(`/flows/${encodeURIComponent(id)}/trace`);
|
|
285
|
+
if (!r.success) {
|
|
286
|
+
return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: { id }, hint: hintFor(r.errorCode) }, true);
|
|
287
|
+
}
|
|
288
|
+
const steps = Array.isArray(r.data?.steps) ? r.data.steps : [];
|
|
289
|
+
return formatResult({
|
|
290
|
+
id,
|
|
291
|
+
total_ms: r.data?.total_ms,
|
|
292
|
+
step_count: steps.length,
|
|
293
|
+
steps: steps.slice(0, 50),
|
|
294
|
+
}, false, { maxChars: 6000 });
|
|
295
|
+
});
|
|
296
|
+
// ── apimapper_flow_export ──────────────────────────────────────────
|
|
297
|
+
server.registerTool("apimapper_flow_export", {
|
|
298
|
+
title: "Export Flow",
|
|
299
|
+
description: "Export a flow as a portable JSON bundle (incl. connection refs)." +
|
|
300
|
+
"\n\nExample:\n apimapper_flow_export({ id: 'flow_Z2fLg70M84' })",
|
|
301
|
+
inputSchema: {
|
|
302
|
+
id: z.string().describe("Flow ID. Use apimapper_flow_list to find."),
|
|
303
|
+
},
|
|
304
|
+
annotations: readOnly(),
|
|
305
|
+
}, async ({ id }) => {
|
|
306
|
+
const r = await request(`/flows/${encodeURIComponent(id)}/export`);
|
|
307
|
+
if (!r.success) {
|
|
308
|
+
return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: { id }, hint: hintFor(r.errorCode) }, true);
|
|
309
|
+
}
|
|
310
|
+
return formatResult(r.data ?? {}, false, { maxChars: 12000 });
|
|
311
|
+
});
|
|
312
|
+
// ── apimapper_flow_import_validate ─────────────────────────────────
|
|
313
|
+
server.registerTool("apimapper_flow_import_validate", {
|
|
314
|
+
title: "Validate Flow Import Bundle",
|
|
315
|
+
description: "Validate a flow JSON bundle before importing. Reports missing connections, schema " +
|
|
316
|
+
"incompatibilities, and unresolved references." +
|
|
317
|
+
"\n\nExample:\n apimapper_flow_import_validate({ bundle: { schema_version: 1, data: { flow: { name: 'Imported Flow' } } } })",
|
|
318
|
+
inputSchema: {
|
|
319
|
+
bundle: z
|
|
320
|
+
.record(z.string(), z.unknown())
|
|
321
|
+
.describe("Flow bundle JSON (from apimapper_flow_export or external source)"),
|
|
322
|
+
},
|
|
323
|
+
annotations: readOnly(),
|
|
324
|
+
}, async ({ bundle }) => {
|
|
325
|
+
const r = await request("/flows/import/validate", { method: "POST", body: JSON.stringify(bundle) });
|
|
326
|
+
if (!r.success) {
|
|
327
|
+
return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: {}, hint: hintFor(r.errorCode) }, true);
|
|
328
|
+
}
|
|
329
|
+
return formatResult({
|
|
330
|
+
valid: r.data?.valid ?? true,
|
|
331
|
+
issues: r.data?.issues || [],
|
|
332
|
+
warnings: r.data?.warnings || [],
|
|
333
|
+
}, false, { maxChars: 4000 });
|
|
334
|
+
});
|
|
335
|
+
// ── apimapper_flow_import ──────────────────────────────────────────
|
|
336
|
+
server.registerTool("apimapper_flow_import", {
|
|
337
|
+
title: "Import Flow Bundle",
|
|
338
|
+
description: "Import a flow JSON bundle. Always validate first with apimapper_flow_import_validate. " +
|
|
339
|
+
"Rename works via `bundle.data.flow.name`; pass `rename_to` and the tool inserts it correctly." +
|
|
340
|
+
"\n\nExample:\n apimapper_flow_import({ bundle: { schema_version: 1, data: { flow: { name: 'Imported Flow' } } }, rename_to: 'My Imported Flow' })",
|
|
341
|
+
inputSchema: {
|
|
342
|
+
bundle: z
|
|
343
|
+
.record(z.string(), z.unknown())
|
|
344
|
+
.describe("Flow bundle JSON (from apimapper_flow_export or external source)"),
|
|
345
|
+
rename_to: z.string().optional().describe("Optional override for imported flow name"),
|
|
346
|
+
},
|
|
347
|
+
annotations: creating(),
|
|
348
|
+
}, async ({ bundle, rename_to }) => {
|
|
349
|
+
// Server reads `$exportData = $data['data'] ?? $data` and then
|
|
350
|
+
// `$exportData['flow']['name']`. Mutate bundle accordingly.
|
|
351
|
+
let body = bundle;
|
|
352
|
+
if (rename_to) {
|
|
353
|
+
const cloned = JSON.parse(JSON.stringify(bundle));
|
|
354
|
+
const exportData = (cloned.data && typeof cloned.data === "object" ? cloned.data : cloned);
|
|
355
|
+
const flow = (exportData.flow && typeof exportData.flow === "object" ? exportData.flow : {});
|
|
356
|
+
flow.name = rename_to;
|
|
357
|
+
exportData.flow = flow;
|
|
358
|
+
if (cloned.data)
|
|
359
|
+
cloned.data = exportData;
|
|
360
|
+
body = cloned;
|
|
361
|
+
}
|
|
362
|
+
const r = await request("/flows/import", {
|
|
363
|
+
method: "POST",
|
|
364
|
+
body: JSON.stringify(body),
|
|
365
|
+
});
|
|
366
|
+
if (!r.success) {
|
|
367
|
+
return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: { rename_to }, hint: hintFor(r.errorCode) }, true);
|
|
368
|
+
}
|
|
369
|
+
return formatResult({ imported: true, id: r.data?.id, name: r.data?.name }, false, { maxChars: 2000 });
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
//# sourceMappingURL=flows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flows.js","sourceRoot":"","sources":["../../../src/modules/apimapper/flows.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
export declare const SKILL_TOPICS: readonly ["getting-started", "oauth", "yootheme", "joomla", "troubleshooting"];
|
|
3
|
+
export type SkillTopic = (typeof SKILL_TOPICS)[number];
|
|
4
|
+
export declare function registerGetSkillTool(server: McpServer, rootDir?: string): void;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// src/modules/apimapper/get-skill.ts — Phase 7.4.
|
|
2
|
+
//
|
|
3
|
+
// apimapper_get_skill: returns the markdown content of one of the 5 bundled
|
|
4
|
+
// skill docs. Sibling to skill://apimapper/<topic> resources (Phase 7.3) for
|
|
5
|
+
// clients that prefer tool-call discovery over resource discovery.
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { readFileSync } from "node:fs";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
import { dirname, join, resolve } from "node:path";
|
|
10
|
+
import { readOnly } from "@getimo/mcp-toolkit";
|
|
11
|
+
export const SKILL_TOPICS = [
|
|
12
|
+
"getting-started",
|
|
13
|
+
"oauth",
|
|
14
|
+
"yootheme",
|
|
15
|
+
"joomla",
|
|
16
|
+
"troubleshooting",
|
|
17
|
+
];
|
|
18
|
+
const TOPIC_TO_FILE = {
|
|
19
|
+
"getting-started": "SKILL.md",
|
|
20
|
+
oauth: "reference/oauth.md",
|
|
21
|
+
yootheme: "reference/yootheme.md",
|
|
22
|
+
joomla: "reference/joomla.md",
|
|
23
|
+
troubleshooting: "reference/troubleshooting.md",
|
|
24
|
+
};
|
|
25
|
+
function defaultSkillsRoot() {
|
|
26
|
+
// <pkg-root>/src/modules/apimapper/get-skill.ts → up three.
|
|
27
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
28
|
+
return resolve(here, "..", "..", "..");
|
|
29
|
+
}
|
|
30
|
+
export function registerGetSkillTool(server, rootDir) {
|
|
31
|
+
const baseDir = rootDir ?? defaultSkillsRoot();
|
|
32
|
+
server.registerTool("apimapper_get_skill", {
|
|
33
|
+
title: "Get Skill Doc",
|
|
34
|
+
description: "Returns the markdown content of a bundled API Mapper skill doc. " +
|
|
35
|
+
`Topics: ${SKILL_TOPICS.join(", ")}. Sibling to skill://apimapper/<topic> resources.` +
|
|
36
|
+
"\n\nExample:\n apimapper_get_skill({ topic: 'getting-started' })",
|
|
37
|
+
inputSchema: {
|
|
38
|
+
topic: z
|
|
39
|
+
.enum(SKILL_TOPICS)
|
|
40
|
+
.describe(`Which doc to fetch — one of: ${SKILL_TOPICS.join(", ")}`),
|
|
41
|
+
},
|
|
42
|
+
annotations: readOnly(),
|
|
43
|
+
}, async ({ topic }) => {
|
|
44
|
+
// Defensive runtime check — zod already validates at the MCP layer, but
|
|
45
|
+
// a direct unit-test invocation can bypass validation, and we want to
|
|
46
|
+
// produce a helpful structured error rather than crash on undefined.
|
|
47
|
+
if (!SKILL_TOPICS.includes(topic)) {
|
|
48
|
+
return {
|
|
49
|
+
isError: true,
|
|
50
|
+
content: [
|
|
51
|
+
{
|
|
52
|
+
type: "text",
|
|
53
|
+
text: `Unknown topic "${String(topic)}". ` +
|
|
54
|
+
`Valid topics: ${SKILL_TOPICS.join(", ")}.`,
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const filePath = join(baseDir, "skills", "apimapper", TOPIC_TO_FILE[topic]);
|
|
60
|
+
let text;
|
|
61
|
+
try {
|
|
62
|
+
text = readFileSync(filePath, "utf8");
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
66
|
+
return {
|
|
67
|
+
isError: true,
|
|
68
|
+
content: [
|
|
69
|
+
{
|
|
70
|
+
type: "text",
|
|
71
|
+
text: `Failed to read skill doc for topic "${topic}": ${message}. ` +
|
|
72
|
+
`Hint: ensure skills/ is bundled with the MCP package. ` +
|
|
73
|
+
`Valid topics: ${SKILL_TOPICS.join(", ")}.`,
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
content: [
|
|
80
|
+
{
|
|
81
|
+
type: "text",
|
|
82
|
+
text,
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
};
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=get-skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-skill.js","sourceRoot":"","sources":["../../../src/modules/apimapper/get-skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { FlowNode, FlowEdge } from "./types.js";
|
|
2
|
+
export interface SourceSpec {
|
|
3
|
+
connection: string;
|
|
4
|
+
endpoint?: string;
|
|
5
|
+
template_fields?: Record<string, string>;
|
|
6
|
+
items_path?: string;
|
|
7
|
+
label?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface MergeSpec {
|
|
10
|
+
strategy: "join" | "concat" | "append";
|
|
11
|
+
joinKey?: string;
|
|
12
|
+
joinKeyRight?: string;
|
|
13
|
+
joinType?: "left" | "inner";
|
|
14
|
+
}
|
|
15
|
+
export interface TransformSpec {
|
|
16
|
+
expression?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface OutputSpec {
|
|
19
|
+
type?: "yootheme" | "shortcode";
|
|
20
|
+
name: string;
|
|
21
|
+
slug?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface BuildFlowGraphInput {
|
|
24
|
+
sources: SourceSpec[];
|
|
25
|
+
merge?: MergeSpec;
|
|
26
|
+
transform?: TransformSpec;
|
|
27
|
+
output: OutputSpec;
|
|
28
|
+
}
|
|
29
|
+
export interface BuildFlowGraphResult {
|
|
30
|
+
nodes: FlowNode[];
|
|
31
|
+
edges: FlowEdge[];
|
|
32
|
+
viewport: {
|
|
33
|
+
x: number;
|
|
34
|
+
y: number;
|
|
35
|
+
zoom: number;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Build a complete React-Flow graph from declarative source/merge/transform
|
|
40
|
+
* /output specs. Layout is deterministic (left-to-right columns).
|
|
41
|
+
*
|
|
42
|
+
* Throws `Error` for invalid combinations the FlowCompiler would reject:
|
|
43
|
+
* - sources.length === 0
|
|
44
|
+
* - sources.length >= 2 without `merge`
|
|
45
|
+
* - merge.strategy === "join" without `joinKey`
|
|
46
|
+
*/
|
|
47
|
+
export declare function buildFlowGraph(input: BuildFlowGraphInput): BuildFlowGraphResult;
|