@invect/mcp 0.0.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/LICENSE +21 -0
- package/dist/backend/audit.d.ts +29 -0
- package/dist/backend/audit.d.ts.map +1 -0
- package/dist/backend/auth.d.ts +32 -0
- package/dist/backend/auth.d.ts.map +1 -0
- package/dist/backend/client/direct-client.d.ts +223 -0
- package/dist/backend/client/direct-client.d.ts.map +1 -0
- package/dist/backend/client/http-client.d.ts +74 -0
- package/dist/backend/client/http-client.d.ts.map +1 -0
- package/dist/backend/client/types.d.ts +83 -0
- package/dist/backend/client/types.d.ts.map +1 -0
- package/dist/backend/index.cjs +357 -0
- package/dist/backend/index.cjs.map +1 -0
- package/dist/backend/index.d.cts +29 -0
- package/dist/backend/index.d.cts.map +1 -0
- package/dist/backend/index.d.mts +29 -0
- package/dist/backend/index.d.mts.map +1 -0
- package/dist/backend/index.d.ts +32 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.mjs +356 -0
- package/dist/backend/index.mjs.map +1 -0
- package/dist/backend/mcp-server.d.ts +8 -0
- package/dist/backend/mcp-server.d.ts.map +1 -0
- package/dist/backend/prompts/index.d.ts +7 -0
- package/dist/backend/prompts/index.d.ts.map +1 -0
- package/dist/backend/resources/index.d.ts +7 -0
- package/dist/backend/resources/index.d.ts.map +1 -0
- package/dist/backend/response-mappers.d.ts +26 -0
- package/dist/backend/response-mappers.d.ts.map +1 -0
- package/dist/backend/session-manager.d.ts +30 -0
- package/dist/backend/session-manager.d.ts.map +1 -0
- package/dist/backend/tools/credential-tools.d.ts +8 -0
- package/dist/backend/tools/credential-tools.d.ts.map +1 -0
- package/dist/backend/tools/debug-tools.d.ts +7 -0
- package/dist/backend/tools/debug-tools.d.ts.map +1 -0
- package/dist/backend/tools/flow-tools.d.ts +7 -0
- package/dist/backend/tools/flow-tools.d.ts.map +1 -0
- package/dist/backend/tools/node-tools.d.ts +7 -0
- package/dist/backend/tools/node-tools.d.ts.map +1 -0
- package/dist/backend/tools/run-tools.d.ts +7 -0
- package/dist/backend/tools/run-tools.d.ts.map +1 -0
- package/dist/backend/tools/trigger-tools.d.ts +7 -0
- package/dist/backend/tools/trigger-tools.d.ts.map +1 -0
- package/dist/backend/tools/version-tools.d.ts +7 -0
- package/dist/backend/tools/version-tools.d.ts.map +1 -0
- package/dist/cli/index.cjs +213 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +151 -0
- package/dist/cli/index.d.cts.map +1 -0
- package/dist/cli/index.d.mts +151 -0
- package/dist/cli/index.d.mts.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.mjs +211 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/mcp-server-Brb4wc6I.mjs +671 -0
- package/dist/mcp-server-Brb4wc6I.mjs.map +1 -0
- package/dist/mcp-server-DzO5MpFJ.cjs +676 -0
- package/dist/mcp-server-DzO5MpFJ.cjs.map +1 -0
- package/dist/shared/types.cjs +39 -0
- package/dist/shared/types.cjs.map +1 -0
- package/dist/shared/types.d.cts +64 -0
- package/dist/shared/types.d.cts.map +1 -0
- package/dist/shared/types.d.mts +64 -0
- package/dist/shared/types.d.mts.map +1 -0
- package/dist/shared/types.d.ts +64 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.mjs +38 -0
- package/dist/shared/types.mjs.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server-Brb4wc6I.mjs","names":[],"sources":["../src/backend/auth.ts","../src/backend/response-mappers.ts","../src/backend/tools/flow-tools.ts","../src/backend/tools/version-tools.ts","../src/backend/tools/run-tools.ts","../src/backend/tools/debug-tools.ts","../src/backend/tools/credential-tools.ts","../src/backend/tools/trigger-tools.ts","../src/backend/tools/node-tools.ts","../src/backend/resources/index.ts","../src/backend/prompts/index.ts","../src/backend/mcp-server.ts"],"sourcesContent":["/**\n * Auth helpers for the MCP plugin.\n *\n * Handles identity extraction from MCP request context and RBAC enforcement.\n */\n\nimport type { InvectIdentity, InvectInstance } from '@invect/core';\n\n/**\n * Maps the MCP SDK's `authInfo` (from `ctx.http.authInfo`) to an InvectIdentity.\n * The authInfo is populated by the framework adapter's middleware which resolves\n * the session/API key before routing to the MCP plugin endpoint.\n */\nexport function mapAuthInfoToIdentity(authInfo: unknown): InvectIdentity | null {\n if (!authInfo || typeof authInfo !== 'object') {\n return null;\n }\n const info = authInfo as Record<string, unknown>;\n\n // The Express adapter attaches the resolved identity directly\n if (info.userId && typeof info.userId === 'string') {\n return authInfo as InvectIdentity;\n }\n\n return null;\n}\n\n/**\n * Requires that the identity is present. Throws McpError if not.\n */\nexport function requireAuth(identity: InvectIdentity | null): InvectIdentity {\n if (!identity) {\n throw new Error('Authentication required. Provide a valid API key or session.');\n }\n return identity;\n}\n\n/**\n * Extracts identity if available, returns null otherwise.\n * Used by tool handlers — the underlying client (HttpClient/DirectClient)\n * handles auth at its own layer, so a null identity is acceptable for\n * transports like stdio where auth is pre-established.\n */\nexport function resolveIdentity(authInfo: unknown): InvectIdentity | null {\n return mapAuthInfoToIdentity(authInfo);\n}\n\n/**\n * Authorize a specific action on a resource.\n * Returns true if authorized, throws if denied.\n */\nexport async function authorizeAction(\n invect: InvectInstance,\n identity: InvectIdentity,\n action: string,\n resource?: { type: string; id?: string },\n): Promise<void> {\n const result = await invect.auth.authorize({\n identity,\n action: action as Parameters<InvectInstance['auth']['authorize']>[0]['action'],\n ...(resource\n ? { resource: resource as Parameters<InvectInstance['auth']['authorize']>[0]['resource'] }\n : {}),\n });\n\n if (!result.allowed) {\n throw new Error(\n `Permission denied: ${action}${resource?.id ? ` on ${resource.type}/${resource.id}` : ''}`,\n );\n }\n}\n","/**\n * Response mappers — transform raw API responses into concise, LLM-friendly text.\n *\n * LLMs work better with:\n * - Flat, readable summaries instead of deeply nested JSON\n * - Relevant fields only (no internal IDs like flowVersion numbers unless useful)\n * - Human-readable dates and durations\n * - Markdown formatting for structure\n * - Truncated large payloads with clear indicators\n */\n\n// ─── Utilities ───────────────────────────────────────────────────────────────\n\nfunction formatDate(d: unknown): string {\n if (!d) {\n return 'N/A';\n }\n const date = typeof d === 'string' ? new Date(d) : d instanceof Date ? d : null;\n if (!date || isNaN(date.getTime())) {\n return String(d);\n }\n return date\n .toISOString()\n .replace('T', ' ')\n .replace(/\\.\\d+Z$/, ' UTC');\n}\n\nfunction durationMs(start: unknown, end: unknown): string {\n if (!start || !end) {\n return 'N/A';\n }\n const s = new Date(start as string).getTime();\n const e = new Date(end as string).getTime();\n const ms = e - s;\n if (isNaN(ms)) {\n return 'N/A';\n }\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60_000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n return `${(ms / 60_000).toFixed(1)}m`;\n}\n\nfunction truncate(s: string, max = 200): string {\n if (s.length <= max) {\n return s;\n }\n return s.slice(0, max) + '…';\n}\n\nfunction jsonCompact(obj: unknown, maxLen = 500): string {\n const s = JSON.stringify(obj);\n if (s.length <= maxLen) {\n return s;\n }\n return s.slice(0, maxLen) + `… (${s.length} chars total)`;\n}\n\n// ─── Flow Mappers ────────────────────────────────────────────────────────────\n\nexport function mapFlowList(raw: unknown): string {\n const items = extractArray(raw);\n if (items.length === 0) {\n return 'No flows found.';\n }\n\n const lines = items.map((f: Record<string, unknown>) => {\n const tags = Array.isArray(f.tags) && f.tags.length > 0 ? ` [${f.tags.join(', ')}]` : '';\n return `- **${f.name || 'Untitled'}** (id: \\`${f.id}\\`)${tags}${f.description ? ` — ${truncate(String(f.description), 100)}` : ''}`;\n });\n\n return `**${items.length} flow(s):**\\n\\n${lines.join('\\n')}`;\n}\n\nexport function mapFlow(raw: unknown): string {\n const f = raw as Record<string, unknown>;\n if (!f || !f.id) {\n return JSON.stringify(raw, null, 2);\n }\n\n const parts = [\n `**${f.name || 'Untitled'}**`,\n `- ID: \\`${f.id}\\``,\n f.description ? `- Description: ${f.description}` : null,\n f.status ? `- Status: ${f.status}` : null,\n f.createdAt ? `- Created: ${formatDate(f.createdAt)}` : null,\n f.updatedAt ? `- Updated: ${formatDate(f.updatedAt)}` : null,\n ];\n return parts.filter(Boolean).join('\\n');\n}\n\nexport function mapFlowDefinition(raw: unknown): string {\n const v = raw as Record<string, unknown>;\n if (!v) {\n return 'No definition found.';\n }\n\n const def = (v.invectDefinition ?? v.definition ?? v) as Record<string, unknown>;\n const nodes = Array.isArray(def.nodes) ? def.nodes : [];\n const edges = Array.isArray(def.edges) ? def.edges : [];\n\n const parts: (string | null)[] = [\n v.version !== null && v.version !== undefined ? `**Version ${v.version}**` : null,\n v.flowId ? `Flow: \\`${v.flowId}\\`` : null,\n `**${nodes.length} node(s), ${edges.length} edge(s)**`,\n ];\n\n // Nodes with full configuration\n if (nodes.length > 0) {\n parts.push('', '## Nodes');\n for (const n of nodes as Array<Record<string, unknown>>) {\n const label = n.label || n.referenceId || n.id;\n parts.push(`\\n### \\`${label}\\``);\n parts.push(`- **type:** ${n.type}`);\n parts.push(`- **id:** \\`${n.id}\\``);\n if (n.referenceId) {\n parts.push(`- **referenceId:** \\`${n.referenceId}\\``);\n }\n\n const params = n.params as Record<string, unknown> | undefined;\n if (params && Object.keys(params).length > 0) {\n parts.push('- **params:**');\n for (const [key, val] of Object.entries(params)) {\n const valStr =\n typeof val === 'string'\n ? val.includes('\\n')\n ? `\\n \\`\\`\\`\\n ${val.replace(/\\n/g, '\\n ')}\\n \\`\\`\\``\n : val\n : JSON.stringify(val);\n parts.push(` - \\`${key}\\`: ${valStr}`);\n }\n }\n }\n }\n\n // Edges\n if (edges.length > 0) {\n parts.push('', '## Edges');\n const nodeMap = new Map(\n nodes.map((n: Record<string, unknown>) => [n.id, n.label || n.referenceId || n.id]),\n );\n for (const e of edges as Array<Record<string, unknown>>) {\n const from = nodeMap.get(e.source) || e.source;\n const to = nodeMap.get(e.target) || e.target;\n parts.push(`- ${from} → ${to}${e.sourceHandle ? ` (${e.sourceHandle})` : ''}`);\n }\n }\n\n return parts.filter((p) => p !== null).join('\\n');\n}\n\nexport function mapValidation(raw: unknown): string {\n const r = raw as Record<string, unknown>;\n if (r.valid || r.isValid) {\n return 'Flow definition is **valid**.';\n }\n const errors = (r.errors ?? []) as Array<unknown>;\n return `Flow definition is **invalid** (${errors.length} error(s)):\\n${errors.map((e) => `- ${typeof e === 'string' ? e : (e as Record<string, unknown>).message || JSON.stringify(e)}`).join('\\n')}`;\n}\n\n// ─── Version Mappers ─────────────────────────────────────────────────────────\n\nexport function mapVersionList(raw: unknown): string {\n const items = extractArray(raw);\n if (items.length === 0) {\n return 'No versions found.';\n }\n\n return `**${items.length} version(s):**\\n\\n${items.map((v: Record<string, unknown>) => `- v${v.version}${v.createdAt ? ` (${formatDate(v.createdAt)})` : ''}${v.description ? ` — ${truncate(String(v.description), 80)}` : ''}`).join('\\n')}`;\n}\n\n// ─── Run Mappers ─────────────────────────────────────────────────────────────\n\nexport function mapRunList(raw: unknown): string {\n const items = extractArray(raw);\n if (items.length === 0) {\n return 'No runs found.';\n }\n\n const lines = items.slice(0, 25).map((r: Record<string, unknown>) => {\n const status = String(r.status || 'UNKNOWN');\n const icon =\n status === 'SUCCESS' ? '✓' : status === 'FAILED' ? '✗' : status === 'RUNNING' ? '⏳' : '○';\n const dur = durationMs(r.startedAt, r.completedAt);\n const err = r.error ? ` — ${truncate(String(r.error), 60)}` : '';\n return `- ${icon} \\`${r.id}\\` ${status} (${dur})${err}`;\n });\n\n const suffix = items.length > 25 ? `\\n\\n…and ${items.length - 25} more` : '';\n return `**${items.length} run(s):**\\n\\n${lines.join('\\n')}${suffix}`;\n}\n\nexport function mapRun(raw: unknown): string {\n const r = raw as Record<string, unknown>;\n if (!r || !r.id) {\n return JSON.stringify(raw, null, 2);\n }\n\n const parts = [\n `**Run \\`${r.id}\\`**`,\n `- Status: **${r.status}**`,\n `- Flow: \\`${r.flowId}\\``,\n r.startedAt ? `- Started: ${formatDate(r.startedAt)}` : null,\n r.completedAt\n ? `- Completed: ${formatDate(r.completedAt)} (${durationMs(r.startedAt, r.completedAt)})`\n : null,\n r.error ? `- Error: ${truncate(String(r.error), 200)}` : null,\n r.outputs ? `- Output: ${jsonCompact(r.outputs)}` : null,\n ];\n return parts.filter(Boolean).join('\\n');\n}\n\nexport function mapRunStarted(raw: unknown): string {\n const r = raw as Record<string, unknown>;\n return `Flow run started: \\`${r.flowRunId || r.id}\\` (status: ${r.status || 'RUNNING'})`;\n}\n\n// ─── Node Execution Mappers ──────────────────────────────────────────────────\n\nexport function mapNodeExecutions(raw: unknown): string {\n const items = Array.isArray(raw) ? raw : [];\n if (items.length === 0) {\n return 'No node executions found.';\n }\n\n const lines = items.map((n: Record<string, unknown>) => {\n const status = String(n.status || 'UNKNOWN');\n const icon = status === 'SUCCESS' ? '✓' : status === 'FAILED' ? '✗' : '○';\n const dur = durationMs(n.startedAt, n.completedAt);\n const parts = [`### ${icon} \\`${n.nodeId}\\` (${n.nodeType}) — ${status} (${dur})`];\n\n if (n.error) {\n parts.push(`**Error:** ${String(n.error)}`);\n }\n if (n.inputs && Object.keys(n.inputs as object).length > 0) {\n parts.push(`**Input:**\\n\\`\\`\\`json\\n${JSON.stringify(n.inputs, null, 2)}\\n\\`\\`\\``);\n }\n if (n.outputs) {\n parts.push(`**Output:**\\n\\`\\`\\`json\\n${JSON.stringify(n.outputs, null, 2)}\\n\\`\\`\\``);\n }\n return parts.join('\\n');\n });\n\n return `**${items.length} node execution(s):**\\n\\n${lines.join('\\n\\n')}`;\n}\n\n// ─── Debug Tool Mappers ──────────────────────────────────────────────────────\n\nexport function mapTestResult(raw: unknown): string {\n const r = raw as Record<string, unknown>;\n if (r.success === false || r.error) {\n return `**Failed:** ${r.error || 'Unknown error'}`;\n }\n const output = r.output ?? r.result ?? r;\n return `**Result:** ${jsonCompact(output, 1000)}`;\n}\n\n// ─── Credential Mappers ──────────────────────────────────────────────────────\n\nexport function mapCredentialList(raw: unknown): string {\n const items = Array.isArray(raw) ? raw : [];\n if (items.length === 0) {\n return 'No credentials found.';\n }\n\n const lines = items.map(\n (c: Record<string, unknown>) =>\n `- **${c.name}** (id: \\`${c.id}\\`, type: ${c.type}${c.provider ? `, provider: ${c.provider}` : ''})`,\n );\n return `**${items.length} credential(s):**\\n\\n${lines.join('\\n')}`;\n}\n\n// ─── Trigger Mappers ─────────────────────────────────────────────────────────\n\nexport function mapTriggerList(raw: unknown): string {\n const items = Array.isArray(raw) ? raw : [];\n if (items.length === 0) {\n return 'No triggers found.';\n }\n\n const lines = items.map((t: Record<string, unknown>) => {\n const type = t.type || t.triggerType || 'unknown';\n const enabled = t.enabled !== false ? '' : ' (disabled)';\n return `- **${t.name || type}** (id: \\`${t.id}\\`, type: ${type})${enabled}`;\n });\n return `**${items.length} trigger(s):**\\n\\n${lines.join('\\n')}`;\n}\n\nexport function mapTrigger(raw: unknown): string {\n const t = raw as Record<string, unknown>;\n if (!t || !t.id) {\n return JSON.stringify(raw, null, 2);\n }\n\n const parts = [\n `**Trigger \\`${t.id}\\`**`,\n `- Type: ${t.type || t.triggerType}`,\n `- Flow: \\`${t.flowId}\\``,\n t.enabled === false ? '- Status: **disabled**' : '- Status: enabled',\n t.config ? `- Config: ${jsonCompact(t.config)}` : null,\n ];\n return parts.filter(Boolean).join('\\n');\n}\n\n// ─── Node Reference Mappers ──────────────────────────────────────────────────\n\nexport function mapNodeList(raw: unknown): string {\n const items = Array.isArray(raw) ? raw : [];\n if (items.length === 0) {\n return 'No nodes available.';\n }\n\n // Group by provider\n const grouped = new Map<string, Array<Record<string, unknown>>>();\n for (const node of items as Array<Record<string, unknown>>) {\n const p = node.provider as Record<string, unknown> | undefined;\n const providerName = p ? String(p.name || p.id || 'core') : 'core';\n if (!grouped.has(providerName)) {\n grouped.set(providerName, []);\n }\n grouped.get(providerName)?.push(node);\n }\n\n const sections: string[] = [\n `**${items.length} node type(s) across ${grouped.size} provider(s):**`,\n ];\n for (const [provider, nodes] of grouped) {\n sections.push(`\\n### ${provider} (${nodes.length})`);\n for (const n of nodes) {\n sections.push(\n `- \\`${n.id}\\` — ${n.name || n.id}${n.description ? `: ${truncate(String(n.description), 80)}` : ''}`,\n );\n }\n }\n return sections.join('\\n');\n}\n\nexport function mapProviderList(raw: unknown): string {\n const items = Array.isArray(raw) ? raw : [];\n if (items.length === 0) {\n return 'No providers found.';\n }\n\n const lines = items.map(\n (p: Record<string, unknown>) =>\n `- **${p.name || p.id}** (\\`${p.id}\\`)${p.description ? ` — ${truncate(String(p.description), 80)}` : ''}`,\n );\n return `**${items.length} provider(s):**\\n\\n${lines.join('\\n')}`;\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction extractArray(raw: unknown): Array<Record<string, unknown>> {\n if (Array.isArray(raw)) {\n return raw;\n }\n if (raw && typeof raw === 'object') {\n const obj = raw as Record<string, unknown>;\n if (Array.isArray(obj.data)) {\n return obj.data;\n }\n if (Array.isArray(obj.items)) {\n return obj.items;\n }\n }\n return [];\n}\n","/**\n * Flow management tools — CRUD operations on flows.\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { InvectClient } from '../client/types';\nimport { resolveIdentity } from '../auth';\nimport { TOOL_IDS } from '../../shared/types';\nimport { mapFlowList, mapFlow, mapFlowDefinition, mapValidation } from '../response-mappers';\n\nexport function registerFlowTools(server: McpServer, client: InvectClient): void {\n server.tool(\n TOOL_IDS.FLOW_LIST,\n 'List all flows with their names, IDs, status, and metadata',\n {},\n async (_params, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const result = await client.listFlows(identity);\n return {\n content: [{ type: 'text', text: mapFlowList(result) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.FLOW_GET,\n 'Get detailed metadata for a specific flow by ID',\n { flowId: z.string().describe('The flow ID') },\n async ({ flowId }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const flow = await client.getFlow(identity, flowId);\n return {\n content: [{ type: 'text', text: mapFlow(flow) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.FLOW_GET_DEFINITION,\n 'Get the current flow definition including all nodes, edges, and configuration parameters',\n { flowId: z.string().describe('The flow ID') },\n async ({ flowId }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const def = await client.getFlowDefinition(identity, flowId);\n return {\n content: [{ type: 'text', text: mapFlowDefinition(def) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.FLOW_CREATE,\n 'Create a new empty flow with a name and optional description',\n {\n name: z.string().describe('Flow name'),\n description: z.string().optional().describe('Flow description'),\n },\n async ({ name, description }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const flow = await client.createFlow(identity, { name, description });\n return {\n content: [{ type: 'text', text: mapFlow(flow) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.FLOW_UPDATE,\n \"Update a flow's name or description\",\n {\n flowId: z.string().describe('The flow ID'),\n name: z.string().optional().describe('New name'),\n description: z.string().optional().describe('New description'),\n },\n async ({ flowId, name, description }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const flow = await client.updateFlow(identity, flowId, { name, description });\n return {\n content: [{ type: 'text', text: mapFlow(flow) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.FLOW_DELETE,\n 'Permanently delete a flow and all its versions and run history',\n { flowId: z.string().describe('The flow ID to delete') },\n async ({ flowId }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n await client.deleteFlow(identity, flowId);\n return {\n content: [{ type: 'text', text: `Flow ${flowId} deleted successfully.` }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.FLOW_VALIDATE,\n 'Validate a flow definition against the schema without saving it',\n {\n flowId: z.string().describe('The flow ID'),\n definition: z.any().describe('The flow definition to validate'),\n },\n async ({ flowId, definition }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const result = await client.validateFlow(identity, flowId, definition);\n return {\n content: [{ type: 'text', text: mapValidation(result) }],\n };\n },\n );\n}\n","/**\n * Flow version management tools.\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { InvectClient } from '../client/types';\nimport { resolveIdentity } from '../auth';\nimport { TOOL_IDS } from '../../shared/types';\nimport { mapVersionList, mapFlowDefinition } from '../response-mappers';\n\nexport function registerVersionTools(server: McpServer, client: InvectClient): void {\n server.tool(\n TOOL_IDS.VERSION_LIST,\n 'List all versions of a flow with version numbers and timestamps',\n { flowId: z.string().describe('The flow ID') },\n async ({ flowId }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const result = await client.listVersions(identity, flowId);\n return {\n content: [{ type: 'text', text: mapVersionList(result) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.VERSION_GET,\n 'Get a specific version\\'s full definition by version number or \"latest\"',\n {\n flowId: z.string().describe('The flow ID'),\n version: z.string().describe('Version number or \"latest\"'),\n },\n async ({ flowId, version }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const v = await client.getVersion(identity, flowId, version);\n return {\n content: [{ type: 'text', text: mapFlowDefinition(v) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.VERSION_PUBLISH,\n 'Publish a new version of a flow with a complete definition (nodes, edges, configuration)',\n {\n flowId: z.string().describe('The flow ID'),\n definition: z.any().describe('The complete flow definition to publish'),\n },\n async ({ flowId, definition }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const v = await client.publishVersion(identity, flowId, definition);\n return {\n content: [{ type: 'text', text: mapFlowDefinition(v) }],\n };\n },\n );\n}\n","/**\n * Flow execution tools — start, monitor, and control flow runs.\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { InvectClient } from '../client/types';\nimport { resolveIdentity } from '../auth';\nimport { TOOL_IDS } from '../../shared/types';\nimport { mapRunStarted, mapRun, mapRunList } from '../response-mappers';\n\nexport function registerRunTools(server: McpServer, client: InvectClient): void {\n server.tool(\n TOOL_IDS.RUN_START,\n 'Execute a flow synchronously with optional input values. Returns the full run result when complete.',\n {\n flowId: z.string().describe('The flow ID to execute'),\n inputs: z\n .record(z.unknown())\n .optional()\n .describe('Optional key-value input data for the flow'),\n },\n async ({ flowId, inputs }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const result = await client.startRun(identity, flowId, inputs);\n return {\n content: [{ type: 'text', text: mapRunStarted(result) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.RUN_TO_NODE,\n 'Execute a flow up to a specific node (for debugging). Returns partial results stopping at the target node.',\n {\n flowId: z.string().describe('The flow ID'),\n nodeId: z.string().describe('Stop execution at this node ID'),\n inputs: z.record(z.unknown()).optional().describe('Optional input data'),\n },\n async ({ flowId, nodeId, inputs }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const result = await client.runToNode(identity, flowId, nodeId, inputs);\n return {\n content: [{ type: 'text', text: mapRun(result) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.RUN_LIST,\n 'List execution history for a flow, including status, timing, and errors',\n {\n flowId: z.string().describe('The flow ID'),\n },\n async ({ flowId }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const result = await client.listRuns(identity, flowId);\n return {\n content: [{ type: 'text', text: mapRunList(result) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.RUN_GET,\n 'Get detailed results of a specific flow run including status, output, timing, and any errors',\n {\n flowRunId: z.string().describe('The flow run ID'),\n },\n async ({ flowRunId }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const run = await client.getRun(identity, flowRunId);\n return {\n content: [{ type: 'text', text: mapRun(run) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.RUN_CANCEL,\n 'Cancel a running flow execution',\n {\n flowRunId: z.string().describe('The flow run ID to cancel'),\n },\n async ({ flowRunId }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const result = await client.cancelRun(identity, flowRunId);\n return {\n content: [{ type: 'text', text: `Run ${flowRunId} cancelled. ${result.message || ''}` }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.RUN_PAUSE,\n 'Pause a running flow execution (can be resumed later)',\n {\n flowRunId: z.string().describe('The flow run ID to pause'),\n },\n async ({ flowRunId }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const result = await client.pauseRun(identity, flowRunId);\n return {\n content: [{ type: 'text', text: `Run ${flowRunId} paused. ${result.message || ''}` }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.RUN_RESUME,\n 'Resume a previously paused flow execution',\n {\n flowRunId: z.string().describe('The flow run ID to resume'),\n },\n async ({ flowRunId }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const result = await client.resumeRun(identity, flowRunId);\n return {\n content: [{ type: 'text', text: `Run ${flowRunId} resumed. ${result.message || ''}` }],\n };\n },\n );\n}\n","/**\n * Debugging & testing tools — node execution traces, expression testing, stats.\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { InvectClient } from '../client/types';\nimport { resolveIdentity } from '../auth';\nimport { TOOL_IDS } from '../../shared/types';\nimport { mapNodeExecutions, mapTestResult } from '../response-mappers';\n\nexport function registerDebugTools(server: McpServer, client: InvectClient): void {\n server.tool(\n TOOL_IDS.DEBUG_NODE_EXECUTIONS,\n \"Get per-node execution traces for a flow run, including each node's input, output, timing, and errors. Essential for debugging failed runs.\",\n {\n flowRunId: z.string().describe('The flow run ID'),\n },\n async ({ flowRunId }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const executions = await client.getNodeExecutions(identity, flowRunId);\n return {\n content: [{ type: 'text', text: mapNodeExecutions(executions) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.DEBUG_TEST_NODE,\n 'Execute a single node type in isolation with given parameters and input data. Useful for testing node configuration before adding to a flow.',\n {\n nodeType: z.string().describe('Action ID of the node type (e.g., \"core.jq\", \"http.request\")'),\n params: z.record(z.unknown()).describe('Node configuration parameters'),\n inputData: z\n .record(z.unknown())\n .optional()\n .describe('Simulated incoming data from upstream nodes'),\n },\n async ({ nodeType, params, inputData }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const result = await client.testNode(identity, nodeType, params, inputData);\n return {\n content: [{ type: 'text', text: mapTestResult(result) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.DEBUG_TEST_EXPRESSION,\n 'Test a JavaScript template expression ({{ ... }}) against a sample data context. Uses the QuickJS WASM sandbox.',\n {\n expression: z\n .string()\n .describe(\n 'JS template expression to test (e.g., \"{{ users.filter(u => u.active).length }}\")',\n ),\n context: z\n .record(z.unknown())\n .describe('Sample data context to evaluate the expression against'),\n },\n async ({ expression, context }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const result = await client.testJsExpression(identity, expression, context);\n return {\n content: [{ type: 'text', text: mapTestResult(result) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.DEBUG_TEST_MAPPER,\n 'Test a data mapper/transformation expression against sample incoming data',\n {\n expression: z.string().describe('Mapper expression to evaluate'),\n incomingData: z.record(z.unknown()).describe('Sample incoming data to map'),\n },\n async ({ expression, incomingData }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const result = await client.testMapper(identity, expression, incomingData);\n return {\n content: [{ type: 'text', text: mapTestResult(result) }],\n };\n },\n );\n}\n","/**\n * Credential tools — reference-only (list metadata, test connectivity).\n * No create/delete/get-values for security.\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { InvectClient } from '../client/types';\nimport { resolveIdentity } from '../auth';\nimport { TOOL_IDS } from '../../shared/types';\nimport { mapCredentialList, mapTestResult } from '../response-mappers';\n\nexport function registerCredentialTools(server: McpServer, client: InvectClient): void {\n server.tool(\n TOOL_IDS.CREDENTIAL_LIST,\n 'List all credentials with their names, types, and providers. Does NOT expose secrets — only metadata for referencing in flow configs.',\n {},\n async (_params, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const creds = await client.listCredentials(identity);\n return {\n content: [{ type: 'text', text: mapCredentialList(creds) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.CREDENTIAL_TEST,\n 'Test connectivity of a credential by ID. Verifies the credential is valid and can reach the external service.',\n {\n credentialId: z.string().describe('The credential ID to test'),\n },\n async ({ credentialId }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const result = await client.testCredential(identity, credentialId);\n return {\n content: [{ type: 'text', text: mapTestResult(result) }],\n };\n },\n );\n}\n","/**\n * Trigger management tools — CRUD for flow triggers (cron, webhook, manual).\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { InvectClient } from '../client/types';\nimport { resolveIdentity } from '../auth';\nimport { TOOL_IDS } from '../../shared/types';\nimport { mapTriggerList, mapTrigger } from '../response-mappers';\n\nexport function registerTriggerTools(server: McpServer, client: InvectClient): void {\n server.tool(\n TOOL_IDS.TRIGGER_LIST,\n 'List all triggers configured for a flow (cron schedules, webhooks, manual)',\n {\n flowId: z.string().describe('The flow ID'),\n },\n async ({ flowId }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const triggers = await client.listTriggers(identity, flowId);\n return {\n content: [{ type: 'text', text: mapTriggerList(triggers) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.TRIGGER_GET,\n 'Get details of a specific trigger',\n {\n triggerId: z.string().describe('The trigger ID'),\n },\n async ({ triggerId }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const trigger = await client.getTrigger(identity, triggerId);\n return {\n content: [{ type: 'text', text: mapTrigger(trigger) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.TRIGGER_CREATE,\n 'Create a new trigger for a flow (e.g., cron schedule, webhook)',\n {\n input: z.any().describe('Trigger creation input including flowId, type, and configuration'),\n },\n async ({ input }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const trigger = await client.createTrigger(identity, input);\n return {\n content: [{ type: 'text', text: mapTrigger(trigger) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.TRIGGER_UPDATE,\n \"Update an existing trigger's configuration\",\n {\n triggerId: z.string().describe('The trigger ID to update'),\n input: z.any().describe('Updated trigger configuration'),\n },\n async ({ triggerId, input }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const trigger = await client.updateTrigger(identity, triggerId, input);\n return {\n content: [{ type: 'text', text: mapTrigger(trigger) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.TRIGGER_DELETE,\n 'Delete a trigger',\n {\n triggerId: z.string().describe('The trigger ID to delete'),\n },\n async ({ triggerId }, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n await client.deleteTrigger(identity, triggerId);\n return {\n content: [{ type: 'text', text: `Trigger ${triggerId} deleted.` }],\n };\n },\n );\n}\n","/**\n * Node reference tools — list available providers and node types.\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { InvectClient } from '../client/types';\nimport { resolveIdentity } from '../auth';\nimport { TOOL_IDS } from '../../shared/types';\nimport { mapProviderList, mapNodeList } from '../response-mappers';\n\nexport function registerNodeTools(server: McpServer, client: InvectClient): void {\n server.tool(\n TOOL_IDS.NODE_LIST_PROVIDERS,\n 'List all available node providers (core, http, gmail, slack, github, etc.) with their metadata',\n {},\n async (_params, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const providers = await client.listProviders(identity);\n return {\n content: [{ type: 'text', text: mapProviderList(providers) }],\n };\n },\n );\n\n server.tool(\n TOOL_IDS.NODE_LIST_AVAILABLE,\n 'List all available node types with their IDs, names, parameter schemas, and field definitions. Use this to understand what nodes can be added to flows.',\n {},\n async (_params, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const nodes = await client.listAvailableNodes(identity);\n return {\n content: [{ type: 'text', text: mapNodeList(nodes) }],\n };\n },\n );\n}\n","/**\n * MCP Resources — expose flow data as readable resources.\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { InvectClient } from '../client/types';\nimport { resolveIdentity } from '../auth';\n\nexport function registerResources(server: McpServer, client: InvectClient): void {\n // Resource template: individual flow definition\n server.resource(\n 'flow-definition',\n 'invect://flows/{flowId}/definition',\n { description: 'The current definition of a specific flow (nodes, edges, params)' },\n async (uri, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n // Extract flowId from URI: invect://flows/{flowId}/definition\n const match = uri.href.match(/^invect:\\/\\/flows\\/([^/]+)\\/definition$/);\n if (!match?.[1]) {\n return { contents: [{ uri: uri.href, text: 'Invalid flow URI', mimeType: 'text/plain' }] };\n }\n const flowId = decodeURIComponent(match[1]);\n const def = await client.getFlowDefinition(identity, flowId);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(def, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n },\n );\n\n // Resource template: flow run result\n server.resource(\n 'flow-run',\n 'invect://runs/{flowRunId}',\n { description: 'The result details of a specific flow run' },\n async (uri, extra) => {\n const identity = resolveIdentity(extra.authInfo);\n const match = uri.href.match(/^invect:\\/\\/runs\\/([^/]+)$/);\n if (!match?.[1]) {\n return { contents: [{ uri: uri.href, text: 'Invalid run URI', mimeType: 'text/plain' }] };\n }\n const flowRunId = decodeURIComponent(match[1]);\n const run = await client.getRun(identity, flowRunId);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(run, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n },\n );\n}\n","/**\n * MCP Prompts — reusable prompt templates for common Invect tasks.\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { InvectClient } from '../client/types';\n\nexport function registerPrompts(server: McpServer, _client: InvectClient): void {\n server.prompt(\n 'debug-flow-run',\n 'Analyze a failed or problematic flow run to identify the root cause',\n { flowRunId: z.string().describe('The flow run ID to debug') },\n async ({ flowRunId }) => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: [\n `Debug the flow run \"${flowRunId}\". Follow these steps:`,\n '',\n '1. Use run_get to fetch the run details (status, error, timing).',\n '2. Use debug_node_executions to get per-node traces.',\n '3. Identify which node(s) failed or produced unexpected output.',\n \"4. If a node has an expression error, use debug_test_expression with the failed expression and the node's input data.\",\n '5. Summarize: root cause, which node failed, and suggest a fix.',\n ].join('\\n'),\n },\n },\n ],\n };\n },\n );\n\n server.prompt(\n 'create-flow',\n 'Step-by-step guide to create a new flow with nodes and connections',\n {\n name: z.string().describe('Name for the new flow'),\n description: z.string().optional().describe('What the flow should do'),\n },\n async ({ name, description }) => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: [\n `Create a new Invect flow called \"${name}\"${description ? `: ${description}` : ''}.`,\n '',\n 'Follow these steps:',\n '1. Use node_list_available to see all available node types.',\n '2. Use flow_create to create the flow.',\n '3. Plan the node graph: decide which nodes are needed, their parameters, and how they connect.',\n '4. Use version_publish to publish the flow definition with nodes and edges.',\n '5. Use flow_validate to verify the definition is correct.',\n '6. Optionally use run_start to test the flow.',\n ].join('\\n'),\n },\n },\n ],\n };\n },\n );\n\n server.prompt(\n 'explain-flow',\n 'Get a detailed explanation of what a flow does, its nodes, and data flow',\n { flowId: z.string().describe('The flow ID to explain') },\n async ({ flowId }) => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: [\n `Explain the flow \"${flowId}\" in detail.`,\n '',\n '1. Use flow_get to get the flow metadata.',\n '2. Use flow_get_definition to get the full definition.',\n '3. Analyze the nodes, their types, parameters, and connections (edges).',\n '4. Describe the data flow from inputs through each node to outputs.',\n '5. Flag any potential issues or improvements.',\n ].join('\\n'),\n },\n },\n ],\n };\n },\n );\n}\n","/**\n * MCP Server factory — creates and configures the McpServer with all tools,\n * resources, and prompts.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { InvectClient } from './client/types';\nimport { registerFlowTools } from './tools/flow-tools';\nimport { registerVersionTools } from './tools/version-tools';\nimport { registerRunTools } from './tools/run-tools';\nimport { registerDebugTools } from './tools/debug-tools';\nimport { registerCredentialTools } from './tools/credential-tools';\nimport { registerTriggerTools } from './tools/trigger-tools';\nimport { registerNodeTools } from './tools/node-tools';\nimport { registerResources } from './resources/index';\nimport { registerPrompts } from './prompts/index';\n\nexport function createMcpServer(client: InvectClient): McpServer {\n const server = new McpServer(\n {\n name: 'invect-mcp',\n version: '0.0.1',\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n prompts: {},\n },\n },\n );\n\n // Register all tools\n registerFlowTools(server, client);\n registerVersionTools(server, client);\n registerRunTools(server, client);\n registerDebugTools(server, client);\n registerCredentialTools(server, client);\n registerTriggerTools(server, client);\n registerNodeTools(server, client);\n\n // Register resources and prompts\n registerResources(server, client);\n registerPrompts(server, client);\n\n return server;\n}\n"],"mappings":"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"}
|