@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.
Files changed (135) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/LICENSE +21 -0
  3. package/README.md +179 -0
  4. package/SECURITY.md +163 -0
  5. package/dist/auth/keychain.d.ts +47 -0
  6. package/dist/auth/keychain.js +262 -0
  7. package/dist/auth/keychain.js.map +1 -0
  8. package/dist/auth/oauth-provider.d.ts +68 -0
  9. package/dist/auth/oauth-provider.js +232 -0
  10. package/dist/auth/oauth-provider.js.map +1 -0
  11. package/dist/auth/profiles.d.ts +52 -0
  12. package/dist/auth/profiles.js +200 -0
  13. package/dist/auth/profiles.js.map +1 -0
  14. package/dist/auth/token.d.ts +27 -0
  15. package/dist/auth/token.js +88 -0
  16. package/dist/auth/token.js.map +1 -0
  17. package/dist/index.d.ts +13 -0
  18. package/dist/index.js +137 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/install-skill.d.ts +23 -0
  21. package/dist/install-skill.js +73 -0
  22. package/dist/install-skill.js.map +1 -0
  23. package/dist/modules/apimapper/cache.d.ts +2 -0
  24. package/dist/modules/apimapper/cache.js +71 -0
  25. package/dist/modules/apimapper/cache.js.map +1 -0
  26. package/dist/modules/apimapper/client.d.ts +85 -0
  27. package/dist/modules/apimapper/client.js +523 -0
  28. package/dist/modules/apimapper/client.js.map +1 -0
  29. package/dist/modules/apimapper/connections.d.ts +2 -0
  30. package/dist/modules/apimapper/connections.js +406 -0
  31. package/dist/modules/apimapper/connections.js.map +1 -0
  32. package/dist/modules/apimapper/credential-sanitizer.d.ts +7 -0
  33. package/dist/modules/apimapper/credential-sanitizer.js +70 -0
  34. package/dist/modules/apimapper/credential-sanitizer.js.map +1 -0
  35. package/dist/modules/apimapper/credentials.d.ts +2 -0
  36. package/dist/modules/apimapper/credentials.js +258 -0
  37. package/dist/modules/apimapper/credentials.js.map +1 -0
  38. package/dist/modules/apimapper/diagnose.d.ts +18 -0
  39. package/dist/modules/apimapper/diagnose.js +305 -0
  40. package/dist/modules/apimapper/diagnose.js.map +1 -0
  41. package/dist/modules/apimapper/flows.d.ts +2 -0
  42. package/dist/modules/apimapper/flows.js +372 -0
  43. package/dist/modules/apimapper/flows.js.map +1 -0
  44. package/dist/modules/apimapper/get-skill.d.ts +4 -0
  45. package/dist/modules/apimapper/get-skill.js +88 -0
  46. package/dist/modules/apimapper/get-skill.js.map +1 -0
  47. package/dist/modules/apimapper/graph-builder.d.ts +47 -0
  48. package/dist/modules/apimapper/graph-builder.js +117 -0
  49. package/dist/modules/apimapper/graph-builder.js.map +1 -0
  50. package/dist/modules/apimapper/graph.d.ts +2 -0
  51. package/dist/modules/apimapper/graph.js +117 -0
  52. package/dist/modules/apimapper/graph.js.map +1 -0
  53. package/dist/modules/apimapper/index.d.ts +2 -0
  54. package/dist/modules/apimapper/index.js +43 -0
  55. package/dist/modules/apimapper/index.js.map +1 -0
  56. package/dist/modules/apimapper/inspect.d.ts +20 -0
  57. package/dist/modules/apimapper/inspect.js +86 -0
  58. package/dist/modules/apimapper/inspect.js.map +1 -0
  59. package/dist/modules/apimapper/library.d.ts +2 -0
  60. package/dist/modules/apimapper/library.js +237 -0
  61. package/dist/modules/apimapper/library.js.map +1 -0
  62. package/dist/modules/apimapper/license.d.ts +2 -0
  63. package/dist/modules/apimapper/license.js +142 -0
  64. package/dist/modules/apimapper/license.js.map +1 -0
  65. package/dist/modules/apimapper/local-sources.d.ts +2 -0
  66. package/dist/modules/apimapper/local-sources.js +123 -0
  67. package/dist/modules/apimapper/local-sources.js.map +1 -0
  68. package/dist/modules/apimapper/misc.d.ts +2 -0
  69. package/dist/modules/apimapper/misc.js +149 -0
  70. package/dist/modules/apimapper/misc.js.map +1 -0
  71. package/dist/modules/apimapper/node-schema.d.ts +217 -0
  72. package/dist/modules/apimapper/node-schema.js +218 -0
  73. package/dist/modules/apimapper/node-schema.js.map +1 -0
  74. package/dist/modules/apimapper/normalizers.d.ts +13 -0
  75. package/dist/modules/apimapper/normalizers.js +37 -0
  76. package/dist/modules/apimapper/normalizers.js.map +1 -0
  77. package/dist/modules/apimapper/onboarding.d.ts +51 -0
  78. package/dist/modules/apimapper/onboarding.js +201 -0
  79. package/dist/modules/apimapper/onboarding.js.map +1 -0
  80. package/dist/modules/apimapper/schema.d.ts +2 -0
  81. package/dist/modules/apimapper/schema.js +84 -0
  82. package/dist/modules/apimapper/schema.js.map +1 -0
  83. package/dist/modules/apimapper/settings.d.ts +2 -0
  84. package/dist/modules/apimapper/settings.js +157 -0
  85. package/dist/modules/apimapper/settings.js.map +1 -0
  86. package/dist/modules/apimapper/skill-resources.d.ts +4 -0
  87. package/dist/modules/apimapper/skill-resources.js +85 -0
  88. package/dist/modules/apimapper/skill-resources.js.map +1 -0
  89. package/dist/modules/apimapper/types.d.ts +111 -0
  90. package/dist/modules/apimapper/types.js +14 -0
  91. package/dist/modules/apimapper/types.js.map +1 -0
  92. package/dist/modules/apimapper/use-profile.d.ts +34 -0
  93. package/dist/modules/apimapper/use-profile.js +176 -0
  94. package/dist/modules/apimapper/use-profile.js.map +1 -0
  95. package/dist/modules/apimapper/workflows.d.ts +2 -0
  96. package/dist/modules/apimapper/workflows.js +301 -0
  97. package/dist/modules/apimapper/workflows.js.map +1 -0
  98. package/dist/platform/index.d.ts +71 -0
  99. package/dist/platform/index.js +377 -0
  100. package/dist/platform/index.js.map +1 -0
  101. package/dist/server-http.d.ts +22 -0
  102. package/dist/server-http.js +159 -0
  103. package/dist/server-http.js.map +1 -0
  104. package/dist/setup/detect-clients.d.ts +39 -0
  105. package/dist/setup/detect-clients.js +152 -0
  106. package/dist/setup/detect-clients.js.map +1 -0
  107. package/dist/setup/probe-handshake.d.ts +26 -0
  108. package/dist/setup/probe-handshake.js +159 -0
  109. package/dist/setup/probe-handshake.js.map +1 -0
  110. package/dist/setup/write-config.d.ts +25 -0
  111. package/dist/setup/write-config.js +247 -0
  112. package/dist/setup/write-config.js.map +1 -0
  113. package/dist/setup-cli.d.ts +49 -0
  114. package/dist/setup-cli.js +292 -0
  115. package/dist/setup-cli.js.map +1 -0
  116. package/dist/skill-instructions.d.ts +10 -0
  117. package/dist/skill-instructions.js +68 -0
  118. package/dist/skill-instructions.js.map +1 -0
  119. package/dist/transports/http.d.ts +29 -0
  120. package/dist/transports/http.js +267 -0
  121. package/dist/transports/http.js.map +1 -0
  122. package/dist/transports/stdio.d.ts +9 -0
  123. package/dist/transports/stdio.js +19 -0
  124. package/dist/transports/stdio.js.map +1 -0
  125. package/docs/architecture.md +140 -0
  126. package/docs/customgraph-internal-migration.md +210 -0
  127. package/docs/security.md +126 -0
  128. package/docs/tools.md +230 -0
  129. package/manifest.json +76 -0
  130. package/package.json +61 -0
  131. package/skills/apimapper/SKILL.md +57 -0
  132. package/skills/apimapper/reference/joomla.md +85 -0
  133. package/skills/apimapper/reference/oauth.md +94 -0
  134. package/skills/apimapper/reference/troubleshooting.md +123 -0
  135. package/skills/apimapper/reference/yootheme.md +96 -0
@@ -0,0 +1,71 @@
1
+ import { z } from "zod";
2
+ import { formatResult, readOnly, mutating } from "@getimo/mcp-toolkit";
3
+ import { request, hintFor } from "./client.js";
4
+ export function registerCacheTools(server) {
5
+ // ── apimapper_cache_invalidate ─────────────────────────────────────
6
+ server.registerTool("apimapper_cache_invalidate", {
7
+ title: "Invalidate Admin Cache",
8
+ description: "Trigger admin-cache invalidation via the event bus. Pushes events to all subscribers " +
9
+ "(Admin-UI BroadcastChannel + render cache). " +
10
+ 'scope="all" clears everything; scope="connection"|"flow"|"library"|"credential" need id.' +
11
+ "\n\nExample:\n apimapper_cache_invalidate({ scope: 'connection', id: 'con_abc123' })",
12
+ inputSchema: {
13
+ scope: z
14
+ .enum(["all", "connection", "flow", "library", "credential"])
15
+ .describe("Invalidation scope"),
16
+ id: z.string().optional().describe('Resource ID — required for non-"all" scopes'),
17
+ },
18
+ annotations: mutating(),
19
+ }, async ({ scope, id }) => {
20
+ if (scope !== "all" && !id) {
21
+ return formatResult({
22
+ error: `scope="${scope}" requires id`,
23
+ context: { scope },
24
+ hint: 'Pass id when scope is not "all", or use scope="all" to clear everything.',
25
+ }, true);
26
+ }
27
+ const r = await request("/cache/admin/invalidate", {
28
+ method: "POST",
29
+ body: JSON.stringify({ scope, id }),
30
+ });
31
+ if (!r.success) {
32
+ return formatResult({
33
+ error: r.error,
34
+ status: r.status,
35
+ errorCode: r.errorCode,
36
+ context: { scope, id },
37
+ hint: hintFor(r.errorCode),
38
+ }, true);
39
+ }
40
+ return formatResult({
41
+ invalidated: true,
42
+ scope,
43
+ id,
44
+ events_fired: r.data?.events?.length ?? 0,
45
+ }, false, { maxChars: 1500 });
46
+ });
47
+ // ── apimapper_cache_stats ──────────────────────────────────────────
48
+ server.registerTool("apimapper_cache_stats", {
49
+ title: "Get Cache Stats",
50
+ description: "Fetch cache observability stats (hits, misses, ttl distribution, sizes)." +
51
+ "\n\nExample:\n apimapper_cache_stats({})",
52
+ inputSchema: {},
53
+ annotations: readOnly(),
54
+ }, async () => {
55
+ const r = await request("/cache-stats");
56
+ if (!r.success) {
57
+ return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: {}, hint: hintFor(r.errorCode) }, true);
58
+ }
59
+ const dataObj = (r.data && typeof r.data === "object") ? r.data : {};
60
+ return formatResult({
61
+ hits: dataObj.hits ?? 0,
62
+ misses: dataObj.misses ?? 0,
63
+ hit_rate: typeof dataObj.hits === "number" && typeof dataObj.misses === "number" && dataObj.hits + dataObj.misses > 0
64
+ ? `${((dataObj.hits / (dataObj.hits + dataObj.misses)) * 100).toFixed(1)}%`
65
+ : "n/a",
66
+ sizes: dataObj.sizes,
67
+ ttl: dataObj.ttl,
68
+ }, false, { maxChars: 3000 });
69
+ });
70
+ }
71
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/modules/apimapper/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ import { type ApiResponse } from "@getimo/mcp-toolkit";
2
+ import { type Platform } from "../../platform/index.js";
3
+ export declare const WP_BASE: string;
4
+ export declare const WP_USER: string;
5
+ export declare const WP_APP_PASS: string;
6
+ /**
7
+ * Sanitise an error string so it cannot leak the Basic-auth token, base64
8
+ * sequences, or upstream Authorization headers into MCP responses.
9
+ */
10
+ export declare function sanitizeErrorString(s: string): string;
11
+ /**
12
+ * Extended response with HTTP status (and a coarse error classification) so
13
+ * tools can branch on auth-vs-not-found-vs-server without re-parsing strings.
14
+ *
15
+ * The underlying toolkit `ApiResponse` only carries `{success, data?, error?}`.
16
+ * We wrap each call so we capture the HTTP code via `fetch` and merge.
17
+ */
18
+ export type ApiErrorCode = "auth" | "not_found" | "rate_limit" | "server" | "network" | "unknown";
19
+ export interface ExtApiResponse<T = unknown> extends ApiResponse<T> {
20
+ status?: number;
21
+ errorCode?: ApiErrorCode;
22
+ /** When true, response was 2xx but payload had `success: false` — semantically failed. */
23
+ payloadFailed?: boolean;
24
+ }
25
+ interface RequestOpts {
26
+ /**
27
+ * When true, response is sanitised through `sanitizeSecrets()` before being
28
+ * returned. Apply to ALL credential endpoints + any endpoint that may
29
+ * surface auth_data.
30
+ */
31
+ sanitize?: boolean;
32
+ /**
33
+ * When true and the response is `{success:true, data:{success:false,...}}`,
34
+ * convert to a structured error (status `200 semantic-fail`). Apply to
35
+ * endpoints that return business-level success/failure inside a 200 envelope:
36
+ * connection_test, license_activate, feedback_submit, etc.
37
+ */
38
+ unwrapInnerSuccess?: boolean;
39
+ /**
40
+ * Per-call timeout override in milliseconds. Default is 45_000.
41
+ * Use longer values for endpoints known to be slow (large-flow compile,
42
+ * detect-schema across many endpoints, library catalog sync).
43
+ * Clamped to [1_000, 300_000] (1s..5min).
44
+ */
45
+ timeoutMs?: number;
46
+ }
47
+ export interface PlatformClient {
48
+ readonly platform: Platform;
49
+ request<T = unknown>(action: string, init?: RequestInit, opts?: RequestOpts): Promise<ExtApiResponse<T>>;
50
+ }
51
+ /**
52
+ * Create a Platform-aware HTTP client. The Platform handles URL construction,
53
+ * auth header injection, and response envelope unwrap (e.g. Joomla's
54
+ * `{success, data, error}` shape).
55
+ *
56
+ * All errors are sanitised via `sanitizeErrorString()` before being returned.
57
+ */
58
+ export declare function createPlatformClient(platform: Platform): PlatformClient;
59
+ /**
60
+ * Issue a request through the toolkit HTTP client + capture HTTP status.
61
+ *
62
+ * Legacy signature: callers pass a path starting with "/" (e.g. "/connections")
63
+ * — we strip the leading slash and route through the Platform layer.
64
+ *
65
+ * Joomla routing: when APIMAPPER_PLATFORM=joomla, the WP-shape REST path is
66
+ * pre-translated to `{ action, params }` via JoomlaPlatform.translateRestPath
67
+ * BEFORE buildUrl runs. The translation table is pinned against the
68
+ * AjaxDispatcher match-arms.
69
+ *
70
+ * For new code, prefer `createPlatformClient(platform).request(action)`.
71
+ */
72
+ export declare function request<T = unknown>(path: string, init?: RequestInit, opts?: RequestOpts): Promise<ExtApiResponse<T>>;
73
+ /**
74
+ * Map an `errorCode` to a focused hint string for the caller.
75
+ * Falls back to the generic health-tool hint.
76
+ */
77
+ export declare function hintFor(code?: ApiErrorCode): string;
78
+ export declare const HEALTH_HINT = "Use apimapper_health to check connectivity and auth.";
79
+ export declare function authConfigured(): boolean;
80
+ export declare const api: {
81
+ request: <T>(path: string, init?: RequestInit, _retryCount?: number) => Promise<ApiResponse<T>>;
82
+ requestAll: <T>(path: string, params?: Record<string, string>) => Promise<ApiResponse<T[]>>;
83
+ acquireRateLimit: () => Promise<void>;
84
+ };
85
+ export {};