@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,258 @@
|
|
|
1
|
+
// src/modules/apimapper/credentials.ts — Credential CRUD + OAuth begin
|
|
2
|
+
//
|
|
3
|
+
// CRITICAL: Credential wire format is **snake_case** (auth_type, auth_data,
|
|
4
|
+
// oauth_provider). This matches Connections (also snake_case after Round-2
|
|
5
|
+
// audit correction) but differs from Graph (camelCase) and LocalSource
|
|
6
|
+
// (camelCase). See types.ts for the canonical wire-shape map.
|
|
7
|
+
//
|
|
8
|
+
// SECURITY: All credential responses are routed through `sanitizeSecrets()`
|
|
9
|
+
// in client.ts → request({sanitize:true}). Even if the PHP backend
|
|
10
|
+
// regresses and returns auth_data, the MCP layer never leaks it. See
|
|
11
|
+
// credential-sanitizer.ts.
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
import { formatResult, autoFormatTable, readOnly, creating, mutating, destructive, } from "@getimo/mcp-toolkit";
|
|
14
|
+
import { request, hintFor } from "./client.js";
|
|
15
|
+
export function registerCredentialTools(server) {
|
|
16
|
+
// ── apimapper_credential_list ──────────────────────────────────────
|
|
17
|
+
server.registerTool("apimapper_credential_list", {
|
|
18
|
+
title: "List Credentials",
|
|
19
|
+
description: "List all stored credentials (sanitised — secrets omitted). " +
|
|
20
|
+
"Use apimapper_credential_get for one credential's metadata." +
|
|
21
|
+
"\n\nExample:\n apimapper_credential_list({})",
|
|
22
|
+
inputSchema: {
|
|
23
|
+
auth_type: z
|
|
24
|
+
.enum(["api_key", "bearer", "basic_auth", "oauth2_code", "oauth2_cc", "all"])
|
|
25
|
+
.default("all")
|
|
26
|
+
.describe("Filter by auth_type (server wire-format field)"),
|
|
27
|
+
},
|
|
28
|
+
annotations: readOnly(),
|
|
29
|
+
}, async ({ auth_type }) => {
|
|
30
|
+
const r = await request("/credentials", {}, { sanitize: true });
|
|
31
|
+
if (!r.success) {
|
|
32
|
+
return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: { auth_type }, hint: hintFor(r.errorCode) }, true);
|
|
33
|
+
}
|
|
34
|
+
const raw = Array.isArray(r.data?.credentials) ? r.data.credentials : [];
|
|
35
|
+
const items = auth_type === "all" ? raw : raw.filter((c) => c.auth_type === auth_type);
|
|
36
|
+
return autoFormatTable(items.map((c) => ({
|
|
37
|
+
id: c.id,
|
|
38
|
+
name: c.name,
|
|
39
|
+
auth_type: c.auth_type,
|
|
40
|
+
provider: c.oauth_provider || c.provider || "—",
|
|
41
|
+
updated_at: c.updated_at || "—",
|
|
42
|
+
})), {
|
|
43
|
+
columns: [
|
|
44
|
+
{ key: "id", label: "ID", width: 28 },
|
|
45
|
+
{ key: "name", label: "NAME", width: 28 },
|
|
46
|
+
{ key: "auth_type", label: "AUTH_TYPE", width: 14 },
|
|
47
|
+
{ key: "provider", label: "PROVIDER", width: 16 },
|
|
48
|
+
{ key: "updated_at", label: "UPDATED", width: 22 },
|
|
49
|
+
],
|
|
50
|
+
header: (n) => `${n} credentials`,
|
|
51
|
+
footer: "Use apimapper_credential_get <id> for metadata. Secrets are NEVER returned.",
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
// ── apimapper_credential_get ───────────────────────────────────────
|
|
55
|
+
server.registerTool("apimapper_credential_get", {
|
|
56
|
+
title: "Get Credential (sanitised)",
|
|
57
|
+
description: "Fetch credential metadata. **Secret values are stripped at the MCP boundary** " +
|
|
58
|
+
"(auth_data, refresh_token, access_token, api_key, etc. → '[REDACTED]'). " +
|
|
59
|
+
"Use only for metadata inspection." +
|
|
60
|
+
"\n\nExample:\n apimapper_credential_get({ id: 'cred_pexels_key' })",
|
|
61
|
+
inputSchema: {
|
|
62
|
+
id: z.string().describe('Credential ID (e.g., "cred_abc123"). Use apimapper_credential_list to find.'),
|
|
63
|
+
},
|
|
64
|
+
annotations: readOnly(),
|
|
65
|
+
}, async ({ id }) => {
|
|
66
|
+
const r = await request(`/credentials/${encodeURIComponent(id)}`, {}, { sanitize: true });
|
|
67
|
+
if (!r.success) {
|
|
68
|
+
return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: { id }, hint: hintFor(r.errorCode) }, true);
|
|
69
|
+
}
|
|
70
|
+
// Server may return either `credential: {...}` envelope or bare object.
|
|
71
|
+
const cred = r.data && typeof r.data === "object" && "credential" in r.data
|
|
72
|
+
? r.data.credential
|
|
73
|
+
: r.data;
|
|
74
|
+
if (!cred || Object.keys(cred).length === 0) {
|
|
75
|
+
return formatResult({ error: "credential not found", status: r.status, context: { id }, hint: hintFor("not_found") }, true);
|
|
76
|
+
}
|
|
77
|
+
const mapped = {
|
|
78
|
+
id: cred.id,
|
|
79
|
+
name: cred.name,
|
|
80
|
+
auth_type: cred.auth_type,
|
|
81
|
+
oauth_provider: cred.oauth_provider || null,
|
|
82
|
+
oauth_token_expires_at: cred.oauth_token_expires_at || null,
|
|
83
|
+
provider: cred.provider || null,
|
|
84
|
+
created_at: cred.created_at,
|
|
85
|
+
updated_at: cred.updated_at,
|
|
86
|
+
note: "Secret fields stripped at MCP boundary. To inspect a secret, use the UI Admin or 1Password.",
|
|
87
|
+
};
|
|
88
|
+
return formatResult(mapped, false, { maxChars: 3000 });
|
|
89
|
+
});
|
|
90
|
+
// ── apimapper_credential_create ────────────────────────────────────
|
|
91
|
+
server.registerTool("apimapper_credential_create", {
|
|
92
|
+
title: "Create Credential",
|
|
93
|
+
description: "Create a new credential. Secrets are encrypted server-side. " +
|
|
94
|
+
"REST contract uses snake_case keys: auth_type, auth_data, oauth_provider." +
|
|
95
|
+
"\n\nExample:\n apimapper_credential_create({ name: 'Pexels API Key', auth_type: 'api_key', auth_data: { api_key: 'a1b2c3d4...' } })",
|
|
96
|
+
inputSchema: {
|
|
97
|
+
name: z.string().min(1).describe('Credential name (e.g., "Calendly Live API Key")'),
|
|
98
|
+
auth_type: z
|
|
99
|
+
.enum(["api_key", "bearer", "basic_auth", "oauth2_code", "oauth2_cc"])
|
|
100
|
+
.describe("Auth type (server wire-format key — snake_case)"),
|
|
101
|
+
auth_data: z
|
|
102
|
+
.record(z.string(), z.unknown())
|
|
103
|
+
.describe('Secret payload (shape depends on auth_type). ' +
|
|
104
|
+
'api_key: {"api_key":"..."}, ' +
|
|
105
|
+
'bearer: {"token":"..."}, ' +
|
|
106
|
+
'basic_auth: {"username":"...","password":"..."}, ' +
|
|
107
|
+
'oauth2_*: {"client_id":"...","client_secret":"...","auth_url":"...","token_url":"...","scopes":[...]}'),
|
|
108
|
+
oauth_provider: z.string().optional().describe('OAuth provider slug (e.g., "google", "meta") for oauth2_* types'),
|
|
109
|
+
provider: z.string().optional().describe('Generic provider slug for credential-by-provider filtering'),
|
|
110
|
+
oauth_token_expires_at: z.string().optional().describe('ISO timestamp when access token expires (oauth2_* only)'),
|
|
111
|
+
},
|
|
112
|
+
annotations: creating(),
|
|
113
|
+
}, async (input) => {
|
|
114
|
+
const r = await request("/credentials", { method: "POST", body: JSON.stringify(input) }, { sanitize: true });
|
|
115
|
+
if (!r.success) {
|
|
116
|
+
return formatResult({
|
|
117
|
+
error: r.error,
|
|
118
|
+
status: r.status,
|
|
119
|
+
errorCode: r.errorCode,
|
|
120
|
+
context: { name: input.name, auth_type: input.auth_type },
|
|
121
|
+
hint: hintFor(r.errorCode),
|
|
122
|
+
}, true);
|
|
123
|
+
}
|
|
124
|
+
const cred = r.data?.credential;
|
|
125
|
+
return formatResult({
|
|
126
|
+
created: true,
|
|
127
|
+
id: cred?.id,
|
|
128
|
+
name: cred?.name,
|
|
129
|
+
auth_type: cred?.auth_type,
|
|
130
|
+
note: "auth_data accepted and encrypted; not echoed.",
|
|
131
|
+
}, false, { maxChars: 2000 });
|
|
132
|
+
});
|
|
133
|
+
// ── apimapper_credential_update ────────────────────────────────────
|
|
134
|
+
server.registerTool("apimapper_credential_update", {
|
|
135
|
+
title: "Update Credential",
|
|
136
|
+
description: "Update credential metadata or rotate secret. REST contract uses snake_case. " +
|
|
137
|
+
"Only provided fields are changed." +
|
|
138
|
+
"\n\nExample:\n apimapper_credential_update({ id: 'cred_pexels_key', name: 'Pexels API Key (rotated)' })",
|
|
139
|
+
inputSchema: {
|
|
140
|
+
id: z.string().describe("Credential ID. Use apimapper_credential_list to find."),
|
|
141
|
+
patch: z
|
|
142
|
+
.record(z.string(), z.unknown())
|
|
143
|
+
.describe('Fields to update — snake_case keys. ' +
|
|
144
|
+
'Examples: {"name":"Renamed"}, {"auth_data":{"api_key":"newkey"}}, ' +
|
|
145
|
+
'{"oauth_token_expires_at":"2026-12-31T00:00:00Z"}'),
|
|
146
|
+
},
|
|
147
|
+
annotations: mutating(),
|
|
148
|
+
}, async ({ id, patch }) => {
|
|
149
|
+
const r = await request(`/credentials/${encodeURIComponent(id)}`, { method: "PUT", body: JSON.stringify(patch) }, { sanitize: true });
|
|
150
|
+
if (!r.success) {
|
|
151
|
+
return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: { id }, hint: hintFor(r.errorCode) }, true);
|
|
152
|
+
}
|
|
153
|
+
const cred = r.data?.credential;
|
|
154
|
+
return formatResult({
|
|
155
|
+
updated: true,
|
|
156
|
+
id: cred?.id,
|
|
157
|
+
name: cred?.name,
|
|
158
|
+
auth_type: cred?.auth_type,
|
|
159
|
+
note: "Patch applied; secret values (if any) stripped from response.",
|
|
160
|
+
}, false, { maxChars: 2000 });
|
|
161
|
+
});
|
|
162
|
+
// ── apimapper_credential_delete ────────────────────────────────────
|
|
163
|
+
server.registerTool("apimapper_credential_delete", {
|
|
164
|
+
title: "Delete Credential",
|
|
165
|
+
description: "Permanently delete a credential. Any connection using it will lose auth. " +
|
|
166
|
+
"Preview-mode (confirm:false) fetches the credential metadata so you can verify before deletion." +
|
|
167
|
+
"\n\nExample:\n apimapper_credential_delete({ id: 'cred_pexels_key', confirm: false })",
|
|
168
|
+
inputSchema: {
|
|
169
|
+
id: z.string().describe("Credential ID. Use apimapper_credential_list to find."),
|
|
170
|
+
confirm: z
|
|
171
|
+
.boolean()
|
|
172
|
+
.default(false)
|
|
173
|
+
.describe("Must be true to execute. On confirm:false, returns a preview."),
|
|
174
|
+
},
|
|
175
|
+
annotations: destructive(),
|
|
176
|
+
}, async ({ id, confirm }) => {
|
|
177
|
+
if (!confirm) {
|
|
178
|
+
// Preview: fetch metadata for informed confirmation.
|
|
179
|
+
const preview = await request(`/credentials/${encodeURIComponent(id)}`, {}, { sanitize: true });
|
|
180
|
+
const cred = preview.success && preview.data && typeof preview.data === "object" && "credential" in preview.data
|
|
181
|
+
? preview.data.credential
|
|
182
|
+
: preview.data;
|
|
183
|
+
return formatResult({
|
|
184
|
+
preview: true,
|
|
185
|
+
warning: "DESTRUCTIVE — Credential delete cannot be undone. Dependent connections will fail auth.",
|
|
186
|
+
target: cred
|
|
187
|
+
? { id: cred.id, name: cred.name, auth_type: cred.auth_type, provider: cred.oauth_provider || cred.provider }
|
|
188
|
+
: { id, note: "could not preview — id may not exist" },
|
|
189
|
+
instruction: "Ask user to confirm, then call again with confirm: true.",
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
const r = await request(`/credentials/${encodeURIComponent(id)}`, { method: "DELETE" });
|
|
193
|
+
if (!r.success) {
|
|
194
|
+
return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: { id }, hint: hintFor(r.errorCode) }, true);
|
|
195
|
+
}
|
|
196
|
+
return formatResult({ deleted: true, id }, false, { maxChars: 1500 });
|
|
197
|
+
});
|
|
198
|
+
// ── apimapper_credential_link ──────────────────────────────────────
|
|
199
|
+
server.registerTool("apimapper_credential_link", {
|
|
200
|
+
title: "Link Credential to Connection",
|
|
201
|
+
description: "Attach a credential to a connection. PUT /connections/{id} with " +
|
|
202
|
+
"wire-format key `credential_id` (snake_case — Connection wire is snake_case)." +
|
|
203
|
+
"\n\nExample:\n apimapper_credential_link({ connection_id: 'con_abc123', credential_id: 'cred_pexels_key' })",
|
|
204
|
+
inputSchema: {
|
|
205
|
+
connection_id: z.string().describe("Connection ID. Use apimapper_connection_list."),
|
|
206
|
+
credential_id: z.string().describe("Credential ID. Use apimapper_credential_list."),
|
|
207
|
+
},
|
|
208
|
+
annotations: mutating(),
|
|
209
|
+
}, async ({ connection_id, credential_id }) => {
|
|
210
|
+
// Connection wire = snake_case (verified vs ConnectionProbeCore.php:89).
|
|
211
|
+
const r = await request(`/connections/${encodeURIComponent(connection_id)}`, {
|
|
212
|
+
method: "PUT",
|
|
213
|
+
body: JSON.stringify({ credential_id }),
|
|
214
|
+
});
|
|
215
|
+
if (!r.success) {
|
|
216
|
+
return formatResult({
|
|
217
|
+
error: r.error,
|
|
218
|
+
status: r.status,
|
|
219
|
+
errorCode: r.errorCode,
|
|
220
|
+
context: { connection_id, credential_id },
|
|
221
|
+
hint: hintFor(r.errorCode),
|
|
222
|
+
}, true);
|
|
223
|
+
}
|
|
224
|
+
return formatResult({ linked: true, connection_id, credential_id }, false, { maxChars: 1500 });
|
|
225
|
+
});
|
|
226
|
+
// ── apimapper_oauth_authorize_begin ────────────────────────────────
|
|
227
|
+
server.registerTool("apimapper_oauth_authorize_begin", {
|
|
228
|
+
title: "Begin OAuth2 Authorize Flow",
|
|
229
|
+
description: "Initiate the OAuth2 authorization-code flow for a credential. Returns the upstream " +
|
|
230
|
+
"authorize URL the user must visit in a browser to grant consent. " +
|
|
231
|
+
"After consent: call apimapper_credential_get to verify the credential was populated." +
|
|
232
|
+
"\n\nExample:\n apimapper_oauth_authorize_begin({ credential_id: 'cred_google_drive' })",
|
|
233
|
+
inputSchema: {
|
|
234
|
+
credential_id: z
|
|
235
|
+
.string()
|
|
236
|
+
.describe("Credential ID (must be type oauth2_code). Use apimapper_credential_list."),
|
|
237
|
+
scopes: z
|
|
238
|
+
.array(z.string())
|
|
239
|
+
.optional()
|
|
240
|
+
.describe('Override scopes (e.g., ["https://www.googleapis.com/auth/spreadsheets.readonly"])'),
|
|
241
|
+
},
|
|
242
|
+
annotations: creating(),
|
|
243
|
+
}, async ({ credential_id, scopes }) => {
|
|
244
|
+
const r = await request("/oauth/authorize", {
|
|
245
|
+
method: "POST",
|
|
246
|
+
body: JSON.stringify({ credential_id, scopes }),
|
|
247
|
+
});
|
|
248
|
+
if (!r.success) {
|
|
249
|
+
return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: { credential_id }, hint: hintFor(r.errorCode) }, true);
|
|
250
|
+
}
|
|
251
|
+
return formatResult({
|
|
252
|
+
authorize_url: r.data?.authorize_url,
|
|
253
|
+
state: r.data?.state,
|
|
254
|
+
instruction: "Open authorize_url in a browser, complete consent. Then call apimapper_credential_get to verify population.",
|
|
255
|
+
}, false, { maxChars: 2000 });
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/modules/apimapper/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
export type DiagnoseBlocker = "malformed-token" | "expired" | "phishing-risk" | "plugin-missing" | "identity-error" | "scope-too-narrow" | "capability-missing";
|
|
3
|
+
export interface DiagnoseCheck {
|
|
4
|
+
name: string;
|
|
5
|
+
passed: boolean;
|
|
6
|
+
detail: string;
|
|
7
|
+
}
|
|
8
|
+
export interface DiagnoseResult {
|
|
9
|
+
ready: boolean;
|
|
10
|
+
checks: DiagnoseCheck[];
|
|
11
|
+
recommendation: string;
|
|
12
|
+
blockers: DiagnoseBlocker[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Run the full diagnosis chain. Never throws; always returns DiagnoseResult.
|
|
16
|
+
*/
|
|
17
|
+
export declare function diagnoseSite(token: string, siteUrl: string): Promise<DiagnoseResult>;
|
|
18
|
+
export declare function registerDiagnoseTool(server: McpServer): void;
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
// src/modules/apimapper/diagnose.ts — Phase 8.3 pre-flight composite.
|
|
2
|
+
//
|
|
3
|
+
// `apimapper_diagnose(token, siteUrl)` runs BEFORE profile creation:
|
|
4
|
+
//
|
|
5
|
+
// Step 1 — decode the token (network-free, via inspectToken).
|
|
6
|
+
// Step 2 — probe siteUrl for the API Mapper identity endpoint. Tries
|
|
7
|
+
// WordPress first (/wp-json/api-mapper/v1/identity), then
|
|
8
|
+
// Joomla (/index.php?option=com_ajax&plugin=apimapper&task=getIdentity).
|
|
9
|
+
// Step 3 — verify token.iss matches the probed site_url (anti-phishing).
|
|
10
|
+
// Step 4 — verify identity.capabilities includes the minimum we need
|
|
11
|
+
// (currently: 'flows' + 'library').
|
|
12
|
+
// Step 5 — verify token.scope includes at least 'read'.
|
|
13
|
+
//
|
|
14
|
+
// Output structure: { ready, checks[], recommendation, blockers[] }.
|
|
15
|
+
//
|
|
16
|
+
// `blockers[]` is a STABLE enum the caller can branch on:
|
|
17
|
+
// "malformed-token" | "expired" | "phishing-risk" | "plugin-missing" |
|
|
18
|
+
// "identity-error" | "scope-too-narrow" | "capability-missing"
|
|
19
|
+
//
|
|
20
|
+
// Network-tolerant: any unexpected fetch error is captured into a check
|
|
21
|
+
// but the function never throws.
|
|
22
|
+
import { z } from "zod";
|
|
23
|
+
import { formatResult, readOnly } from "@getimo/mcp-toolkit";
|
|
24
|
+
import { inspectToken } from "./inspect.js";
|
|
25
|
+
const REQUIRED_CAPABILITIES = ["flows", "library"];
|
|
26
|
+
const MIN_SCOPE = "read";
|
|
27
|
+
/** Strip trailing slashes for clean URL construction. */
|
|
28
|
+
function stripSlash(s) {
|
|
29
|
+
return s.replace(/\/+$/, "");
|
|
30
|
+
}
|
|
31
|
+
/** Probe the WordPress REST identity endpoint. */
|
|
32
|
+
async function probeWordPress(siteUrl) {
|
|
33
|
+
const url = `${stripSlash(siteUrl)}/wp-json/api-mapper/v1/identity`;
|
|
34
|
+
try {
|
|
35
|
+
const res = await fetch(url, {
|
|
36
|
+
method: "GET",
|
|
37
|
+
headers: { Accept: "application/json" },
|
|
38
|
+
});
|
|
39
|
+
if (res.status === 404) {
|
|
40
|
+
return { ok: false, status: 404, probedUrl: url, error: "not found" };
|
|
41
|
+
}
|
|
42
|
+
if (!res.ok) {
|
|
43
|
+
return {
|
|
44
|
+
ok: false,
|
|
45
|
+
status: res.status,
|
|
46
|
+
probedUrl: url,
|
|
47
|
+
error: `HTTP ${res.status}`,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const data = (await res.json());
|
|
51
|
+
return { ok: true, status: res.status, data, probedUrl: url };
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
return {
|
|
55
|
+
ok: false,
|
|
56
|
+
probedUrl: url,
|
|
57
|
+
error: e instanceof Error ? e.message : String(e),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** Probe the Joomla com_ajax identity endpoint. */
|
|
62
|
+
async function probeJoomla(siteUrl) {
|
|
63
|
+
const url = `${stripSlash(siteUrl)}/index.php?option=com_ajax&plugin=apimapper&task=getIdentity&format=json`;
|
|
64
|
+
try {
|
|
65
|
+
const res = await fetch(url, {
|
|
66
|
+
method: "GET",
|
|
67
|
+
headers: { Accept: "application/json" },
|
|
68
|
+
});
|
|
69
|
+
if (!res.ok) {
|
|
70
|
+
return {
|
|
71
|
+
ok: false,
|
|
72
|
+
status: res.status,
|
|
73
|
+
probedUrl: url,
|
|
74
|
+
error: `HTTP ${res.status}`,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const env = (await res.json());
|
|
78
|
+
if (env.success !== true) {
|
|
79
|
+
return {
|
|
80
|
+
ok: false,
|
|
81
|
+
status: res.status,
|
|
82
|
+
probedUrl: url,
|
|
83
|
+
error: typeof env.error === "string" ? env.error : "joomla success:false",
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return { ok: true, status: res.status, data: env.data, probedUrl: url };
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
return {
|
|
90
|
+
ok: false,
|
|
91
|
+
probedUrl: url,
|
|
92
|
+
error: e instanceof Error ? e.message : String(e),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/** Probe siteUrl: try WP, then fall back to Joomla. */
|
|
97
|
+
async function probeIdentity(siteUrl) {
|
|
98
|
+
const wp = await probeWordPress(siteUrl);
|
|
99
|
+
if (wp.ok)
|
|
100
|
+
return wp;
|
|
101
|
+
const joomla = await probeJoomla(siteUrl);
|
|
102
|
+
if (joomla.ok)
|
|
103
|
+
return joomla;
|
|
104
|
+
// Neither succeeded — return whichever has a more informative status.
|
|
105
|
+
if (wp.status && wp.status !== 404)
|
|
106
|
+
return wp;
|
|
107
|
+
return joomla;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Compare two URLs for issuer-match purposes. Strips trailing slashes and
|
|
111
|
+
* compares case-insensitively. We deliberately keep this simple — the
|
|
112
|
+
* server records `iss` as the exact site URL the plugin was installed at.
|
|
113
|
+
*/
|
|
114
|
+
function urlsMatch(a, b) {
|
|
115
|
+
return stripSlash(a).toLowerCase() === stripSlash(b).toLowerCase();
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Run the full diagnosis chain. Never throws; always returns DiagnoseResult.
|
|
119
|
+
*/
|
|
120
|
+
export async function diagnoseSite(token, siteUrl) {
|
|
121
|
+
const checks = [];
|
|
122
|
+
const blockers = [];
|
|
123
|
+
// ── Step 1: decode token ────────────────────────────────────────────
|
|
124
|
+
const tokenInfo = inspectToken(token);
|
|
125
|
+
if (!tokenInfo.valid || !tokenInfo.payload) {
|
|
126
|
+
checks.push({
|
|
127
|
+
name: "token-decode",
|
|
128
|
+
passed: false,
|
|
129
|
+
detail: tokenInfo.error || "decode failed",
|
|
130
|
+
});
|
|
131
|
+
blockers.push("malformed-token");
|
|
132
|
+
return {
|
|
133
|
+
ready: false,
|
|
134
|
+
checks,
|
|
135
|
+
blockers,
|
|
136
|
+
recommendation: "Token failed structural decode. Verify it starts with 'amk_live_' or 'amk_test_' and was copied complete.",
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
checks.push({
|
|
140
|
+
name: "token-decode",
|
|
141
|
+
passed: true,
|
|
142
|
+
detail: `kid=${tokenInfo.payload.kid} env=${tokenInfo.derived?.env}`,
|
|
143
|
+
});
|
|
144
|
+
// Check expiry up-front — short-circuit-able blocker.
|
|
145
|
+
if (tokenInfo.derived?.expired) {
|
|
146
|
+
checks.push({
|
|
147
|
+
name: "token-expiry",
|
|
148
|
+
passed: false,
|
|
149
|
+
detail: `expired ${Math.abs(tokenInfo.derived.expires_in_seconds ?? 0)}s ago`,
|
|
150
|
+
});
|
|
151
|
+
blockers.push("expired");
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
checks.push({
|
|
155
|
+
name: "token-expiry",
|
|
156
|
+
passed: true,
|
|
157
|
+
detail: tokenInfo.derived?.expires_in_seconds !== undefined
|
|
158
|
+
? `expires in ${tokenInfo.derived.expires_in_seconds}s`
|
|
159
|
+
: "no exp (non-expiring)",
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
// ── Step 2: probe identity endpoint ─────────────────────────────────
|
|
163
|
+
const probe = await probeIdentity(siteUrl);
|
|
164
|
+
if (!probe.ok) {
|
|
165
|
+
if (probe.status === 404) {
|
|
166
|
+
checks.push({
|
|
167
|
+
name: "identity-probe",
|
|
168
|
+
passed: false,
|
|
169
|
+
detail: "404 on both WP and Joomla identity endpoints",
|
|
170
|
+
});
|
|
171
|
+
blockers.push("plugin-missing");
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
checks.push({
|
|
175
|
+
name: "identity-probe",
|
|
176
|
+
passed: false,
|
|
177
|
+
detail: probe.error || `HTTP ${probe.status ?? "??"}`,
|
|
178
|
+
});
|
|
179
|
+
blockers.push("identity-error");
|
|
180
|
+
}
|
|
181
|
+
// No point continuing iss-match / capability checks without identity.
|
|
182
|
+
return {
|
|
183
|
+
ready: false,
|
|
184
|
+
checks,
|
|
185
|
+
blockers,
|
|
186
|
+
recommendation: "Cannot reach the API Mapper plugin. Verify the site URL is correct and the plugin is installed + activated.",
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
checks.push({
|
|
190
|
+
name: "identity-probe",
|
|
191
|
+
passed: true,
|
|
192
|
+
detail: `platform=${probe.data?.platform ?? "?"} site_url=${probe.data?.site_url ?? "?"}`,
|
|
193
|
+
});
|
|
194
|
+
// ── Step 3: iss match ───────────────────────────────────────────────
|
|
195
|
+
const probedSiteUrl = probe.data?.site_url;
|
|
196
|
+
if (!probedSiteUrl) {
|
|
197
|
+
checks.push({
|
|
198
|
+
name: "iss-match",
|
|
199
|
+
passed: false,
|
|
200
|
+
detail: "identity payload missing site_url field",
|
|
201
|
+
});
|
|
202
|
+
blockers.push("identity-error");
|
|
203
|
+
}
|
|
204
|
+
else if (!urlsMatch(probedSiteUrl, tokenInfo.payload.iss)) {
|
|
205
|
+
checks.push({
|
|
206
|
+
name: "iss-match",
|
|
207
|
+
passed: false,
|
|
208
|
+
detail: `token.iss=${tokenInfo.payload.iss} but site reports ${probedSiteUrl}`,
|
|
209
|
+
});
|
|
210
|
+
blockers.push("phishing-risk");
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
checks.push({
|
|
214
|
+
name: "iss-match",
|
|
215
|
+
passed: true,
|
|
216
|
+
detail: `${probedSiteUrl} matches token.iss`,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
// ── Step 4: capability coverage ─────────────────────────────────────
|
|
220
|
+
const caps = Array.isArray(probe.data?.capabilities)
|
|
221
|
+
? probe.data.capabilities
|
|
222
|
+
: [];
|
|
223
|
+
const missingCaps = REQUIRED_CAPABILITIES.filter((c) => !caps.includes(c));
|
|
224
|
+
if (missingCaps.length > 0) {
|
|
225
|
+
checks.push({
|
|
226
|
+
name: "capabilities",
|
|
227
|
+
passed: false,
|
|
228
|
+
detail: `missing: ${missingCaps.join(", ")}`,
|
|
229
|
+
});
|
|
230
|
+
blockers.push("capability-missing");
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
checks.push({
|
|
234
|
+
name: "capabilities",
|
|
235
|
+
passed: true,
|
|
236
|
+
detail: `has ${REQUIRED_CAPABILITIES.join(", ")}`,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
// ── Step 5: scope check ─────────────────────────────────────────────
|
|
240
|
+
const scopes = tokenInfo.payload.scope ?? [];
|
|
241
|
+
if (!scopes.includes(MIN_SCOPE)) {
|
|
242
|
+
checks.push({
|
|
243
|
+
name: "scope-sufficient",
|
|
244
|
+
passed: false,
|
|
245
|
+
detail: `token.scope=[${scopes.join(",")}] missing '${MIN_SCOPE}'`,
|
|
246
|
+
});
|
|
247
|
+
blockers.push("scope-too-narrow");
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
checks.push({
|
|
251
|
+
name: "scope-sufficient",
|
|
252
|
+
passed: true,
|
|
253
|
+
detail: `has '${MIN_SCOPE}' (full scope: ${scopes.join(",")})`,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
// ── Aggregate ───────────────────────────────────────────────────────
|
|
257
|
+
const ready = blockers.length === 0;
|
|
258
|
+
let recommendation;
|
|
259
|
+
if (ready) {
|
|
260
|
+
recommendation = `Ready to create a profile for ${probedSiteUrl}.`;
|
|
261
|
+
}
|
|
262
|
+
else if (blockers.includes("phishing-risk")) {
|
|
263
|
+
recommendation =
|
|
264
|
+
"Token issuer does NOT match the site URL. This may indicate phishing — do NOT proceed. Generate a fresh token on the actual target site.";
|
|
265
|
+
}
|
|
266
|
+
else if (blockers.includes("expired")) {
|
|
267
|
+
recommendation = "Token expired. Generate a fresh token via the API Mapper admin UI.";
|
|
268
|
+
}
|
|
269
|
+
else if (blockers.includes("scope-too-narrow")) {
|
|
270
|
+
recommendation = `Token scope is too narrow — needs at least '${MIN_SCOPE}'. Re-issue with the correct scope.`;
|
|
271
|
+
}
|
|
272
|
+
else if (blockers.includes("capability-missing")) {
|
|
273
|
+
recommendation =
|
|
274
|
+
"Plugin reports missing capabilities — update plugin to a newer version (apimapper_release_list).";
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
recommendation = "Diagnosis reported blockers. See checks[] for details.";
|
|
278
|
+
}
|
|
279
|
+
return { ready, checks, blockers, recommendation };
|
|
280
|
+
}
|
|
281
|
+
// ── MCP tool registration ──────────────────────────────────────────────
|
|
282
|
+
export function registerDiagnoseTool(server) {
|
|
283
|
+
server.registerTool("apimapper_diagnose", {
|
|
284
|
+
title: "Pre-Flight Diagnosis (Composite)",
|
|
285
|
+
description: "Validate a token + siteUrl pair before profile creation. Runs token decode, identity probe " +
|
|
286
|
+
"(WordPress then Joomla fallback), iss/site-URL match (anti-phishing), capability check, and " +
|
|
287
|
+
"scope check. Returns ready=true/false plus structured blockers[] and a recommendation." +
|
|
288
|
+
"\n\nExample:\n apimapper_diagnose({ token: 'amk_live_eyJ2IjoxLC...XYZ.abc123', siteUrl: 'https://example.com/wp' })",
|
|
289
|
+
inputSchema: {
|
|
290
|
+
token: z
|
|
291
|
+
.string()
|
|
292
|
+
.min(1)
|
|
293
|
+
.describe('API Mapper token (e.g., "amk_live_eyJ2IjoxLC...XYZ.abc123")'),
|
|
294
|
+
siteUrl: z
|
|
295
|
+
.string()
|
|
296
|
+
.url()
|
|
297
|
+
.describe('Site URL the token is meant for (e.g., "https://example.com/wp")'),
|
|
298
|
+
},
|
|
299
|
+
annotations: readOnly(),
|
|
300
|
+
}, async ({ token, siteUrl }) => {
|
|
301
|
+
const result = await diagnoseSite(token, siteUrl);
|
|
302
|
+
return formatResult(result, false, { maxChars: 4000 });
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=diagnose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../../../src/modules/apimapper/diagnose.ts"],"names":[],"mappings":"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"}
|