@apicircle/mcp-server 1.0.6 → 1.0.7

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../package.json","../../src/packageVersion.ts","../../src/host/McpHost.ts","../../src/tools/imports.ts","../../src/tools/codegen.ts","../../src/tools/workspaceList.ts","../../src/tools/crud.ts","../../src/tools/history.ts","../../src/tools/codebase.ts","../../src/tools/prompt.ts","../../src/tools/mocks.ts","../../src/tools/registry.ts","../../src/providers/Workspaces.ts","../../src/providers/InMemoryWorkspaceProvider.ts","../../src/providers/FileBackedWorkspaceProvider.ts","../../src/providers/MultiWorkspaceProvider.ts","../../src/providers/InProcessMockController.ts","../../src/index.ts","../../src/bin/mcp-server.ts","../../src/bin/args.ts"],"sourcesContent":["{\n \"name\": \"@apicircle/mcp-server\",\n \"version\": \"1.0.6\",\n \"private\": false,\n \"type\": \"module\",\n \"description\": \"Model Context Protocol server exposing API Circle Studio's workspace as a tool catalog. Used by Claude Desktop, ChatGPT, Cursor, GitHub Copilot, and any other MCP-compatible AI client.\",\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/apicircle/studio.git\",\n \"directory\": \"packages/mcp-server\"\n },\n \"homepage\": \"https://github.com/apicircle/studio#readme\",\n \"bugs\": \"https://github.com/apicircle/studio/issues\",\n \"engines\": {\n \"node\": \">=20\"\n },\n \"main\": \"./src/index.ts\",\n \"types\": \"./src/index.ts\",\n \"bin\": {\n \"apicircle-mcp\": \"./dist/bin/mcp-server.cjs\"\n },\n \"exports\": {\n \".\": \"./src/index.ts\"\n },\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.cts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n }\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"check\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"clean\": \"rm -rf dist node_modules\"\n },\n \"dependencies\": {\n \"@apicircle/core\": \"workspace:*\",\n \"@apicircle/mock-server-core\": \"workspace:*\",\n \"@apicircle/shared\": \"workspace:*\",\n \"@modelcontextprotocol/sdk\": \"^1.0.0\",\n \"zod\": \"^3.23.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^20.0.0\",\n \"tsup\": \"^8.3.0\",\n \"typescript\": \"^5.4.0\",\n \"vitest\": \"^2.0.0\"\n }\n}\n","import packageJson from '../package.json';\n\nexport function readPackageVersion(): string {\n const version = (packageJson as { version?: unknown }).version;\n if (typeof version !== 'string' || version.length === 0) {\n throw new Error('Unable to read @apicircle/mcp-server package version');\n }\n return version;\n}\n\nexport const MCP_PACKAGE_VERSION = readPackageVersion();\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport { z } from 'zod';\nimport type { AnyToolDef, ToolHandlerContext } from '../tools/types';\nimport { MCP_PACKAGE_VERSION } from '../packageVersion';\n\n// =============================================================================\n// McpHost — wraps `@modelcontextprotocol/sdk`'s `McpServer`. The thin layer\n// here exists so we can swap SDK versions or transports without touching\n// every tool. Each ToolDef is registered with the SDK's high-level\n// `registerTool(name, { description, inputSchema }, cb)` API.\n//\n// `inputSchema` is a Zod object on our side; the SDK wants a raw shape\n// (object of fields → schema), so we extract `.shape` when registering.\n// =============================================================================\n\nconst PACKAGE_NAME = 'apicircle-mcp';\n\nexport interface McpHostOptions {\n serverInfo?: { name: string; version: string };\n context: ToolHandlerContext;\n tools: AnyToolDef[];\n}\n\nexport class McpHost {\n readonly server: McpServer;\n private readonly tools: AnyToolDef[];\n private readonly context: ToolHandlerContext;\n\n constructor(options: McpHostOptions) {\n this.server = new McpServer({\n name: options.serverInfo?.name ?? PACKAGE_NAME,\n version: options.serverInfo?.version ?? MCP_PACKAGE_VERSION,\n });\n this.tools = options.tools;\n this.context = options.context;\n this.registerAll();\n }\n\n private registerAll(): void {\n for (const tool of this.tools) {\n const shape = isZodObject(tool.inputSchema) ? tool.inputSchema.shape : undefined;\n this.server.registerTool(\n tool.name,\n {\n description: tool.description,\n ...(shape ? { inputSchema: shape } : {}),\n },\n async (args: unknown) => {\n try {\n const parsed = tool.inputSchema.parse(args ?? {});\n const result = await tool.handler(parsed, this.context);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (err) {\n return {\n isError: true,\n content: [\n {\n type: 'text' as const,\n text: formatError(err),\n },\n ],\n };\n }\n },\n );\n }\n }\n\n /** Connect the underlying server to a transport (defaults to stdio). */\n async connect(transport?: Transport): Promise<void> {\n await this.server.connect(transport ?? new StdioServerTransport());\n }\n\n async close(): Promise<void> {\n await this.server.close();\n }\n}\n\nfunction isZodObject(schema: unknown): schema is z.ZodObject<z.ZodRawShape> {\n return schema instanceof z.ZodObject;\n}\n\nfunction formatError(err: unknown): string {\n if (err instanceof z.ZodError) {\n return `Validation failed: ${err.issues\n .map((i) => `${i.path.join('.') || '<root>'}: ${i.message}`)\n .join('; ')}`;\n }\n if (err instanceof Error) return err.message;\n return String(err);\n}\n","import { z } from 'zod';\nimport type { Request as ApiRequest } from '@apicircle/shared';\nimport { generateId } from '@apicircle/shared';\nimport { parseCurl } from '@apicircle/core';\nimport {\n parseOpenApiToEndpoints,\n parsePostmanToEndpoints,\n parseInsomniaToEndpoints,\n} from '@apicircle/mock-server-core';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// Import tools — convert external request descriptions into one or more\n// requests in the workspace. Each tool persists to the workspace and returns\n// the created request ids so the AI client can reference them in follow-up\n// turns.\n// =============================================================================\n\nconst FALLBACK_NAME = (idx: number, fallback: string): string =>\n fallback || `Imported request ${idx + 1}`;\n\nfunction blankRequest(): Omit<ApiRequest, 'id' | 'createdAt' | 'updatedAt'> {\n return {\n name: 'Imported request',\n folderId: null,\n method: 'GET',\n url: '',\n headers: [],\n query: [],\n body: { type: 'none', content: '' },\n auth: { type: 'none' },\n contextVars: [],\n extractions: [],\n assertions: [],\n };\n}\n\nexport const importCurlTool: AnyToolDef = {\n name: 'import.curl',\n description: 'Parse a `curl ...` command into a Request and persist it to the workspace.',\n inputSchema: z.object({\n curl: z.string().min(1, 'curl command is required'),\n name: z.string().optional(),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const parsed = parseCurl(input.curl);\n const now = new Date().toISOString();\n const request: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: input.name?.trim() || `cURL ${parsed.method} ${parsed.url}`.slice(0, 80),\n method: parsed.method,\n url: parsed.url,\n headers: parsed.headers,\n query: parsed.query,\n body: parsed.body,\n auth: parsed.auth,\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'request.create', request });\n return {\n id: request.id,\n warnings: parsed.warnings,\n changedIds: out.changedIds,\n };\n },\n};\n\nexport const importOpenApiTool: AnyToolDef = {\n name: 'import.openapi',\n description:\n 'Parse an OpenAPI / Swagger spec (YAML or JSON) and create one Request per operation. Returns the list of created request ids.',\n inputSchema: z.object({\n spec: z.string().min(1),\n format: z.enum(['json', 'yaml']).default('json'),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const parsed = await parseOpenApiToEndpoints(input.spec, input.format);\n const ids: string[] = [];\n for (let i = 0; i < parsed.endpoints.length; i++) {\n const ep = parsed.endpoints[i];\n const now = new Date().toISOString();\n const req: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: FALLBACK_NAME(i, ep.example ?? `${ep.method} ${ep.pathPattern}`),\n method: ep.method,\n url: ep.pathPattern,\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await ctx.workspace.apply({ kind: 'request.create', request: req });\n ids.push(req.id);\n }\n return { createdIds: ids, warnings: parsed.warnings };\n },\n};\n\nexport const importPostmanTool: AnyToolDef = {\n name: 'import.postman',\n description: 'Parse a Postman v2/v2.1 collection JSON and create one Request per item.',\n inputSchema: z.object({\n collection: z.string().min(1),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const parsed = parsePostmanToEndpoints(input.collection);\n const ids: string[] = [];\n for (let i = 0; i < parsed.endpoints.length; i++) {\n const ep = parsed.endpoints[i];\n const now = new Date().toISOString();\n const req: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: FALLBACK_NAME(i, ep.example ?? `${ep.method} ${ep.pathPattern}`),\n method: ep.method,\n url: ep.pathPattern,\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await ctx.workspace.apply({ kind: 'request.create', request: req });\n ids.push(req.id);\n }\n return { createdIds: ids, warnings: parsed.warnings };\n },\n};\n\nexport const importInsomniaTool: AnyToolDef = {\n name: 'import.insomnia',\n description: 'Parse an Insomnia v4 export and create one Request per resource of type \"request\".',\n inputSchema: z.object({\n export: z.string().min(1),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const parsed = parseInsomniaToEndpoints(input.export);\n const ids: string[] = [];\n for (let i = 0; i < parsed.endpoints.length; i++) {\n const ep = parsed.endpoints[i];\n const now = new Date().toISOString();\n const req: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: FALLBACK_NAME(i, ep.example ?? `${ep.method} ${ep.pathPattern}`),\n method: ep.method,\n url: ep.pathPattern,\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await ctx.workspace.apply({ kind: 'request.create', request: req });\n ids.push(req.id);\n }\n return { createdIds: ids, warnings: parsed.warnings };\n },\n};\n\n// HAR — quick adapter. We extract method/url/headers/body from `log.entries[].request`.\nexport const importHarTool: AnyToolDef = {\n name: 'import.har',\n description:\n 'Parse an HTTP Archive (.har) JSON and create one Request per recorded entry. Cookies, response, and timings are dropped.',\n inputSchema: z.object({\n har: z.string().min(1),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n let parsed: {\n log?: { entries?: Array<{ request?: HarRequest }> };\n };\n try {\n parsed = JSON.parse(input.har);\n } catch (err) {\n return { createdIds: [], warnings: [`HAR parse error: ${(err as Error).message}`] };\n }\n const entries = parsed.log?.entries ?? [];\n const ids: string[] = [];\n const warnings: string[] = [];\n for (let i = 0; i < entries.length; i++) {\n const e = entries[i].request;\n if (!e || !e.url || !e.method) {\n warnings.push(`Entry #${i} missing method/url; skipped`);\n continue;\n }\n const url = new URL(e.url);\n const now = new Date().toISOString();\n const req: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: `${e.method} ${url.pathname}`,\n method: e.method as ApiRequest['method'],\n url: e.url,\n headers: (e.headers ?? []).map((h) => ({\n key: h.name,\n value: h.value,\n enabled: true,\n })),\n query: (e.queryString ?? []).map((q) => ({\n key: q.name,\n value: q.value,\n enabled: true,\n })),\n body: e.postData\n ? { type: 'text', content: e.postData.text ?? '' }\n : { type: 'none', content: '' },\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await ctx.workspace.apply({ kind: 'request.create', request: req });\n ids.push(req.id);\n }\n return { createdIds: ids, warnings };\n },\n};\n\ninterface HarRequest {\n method?: string;\n url?: string;\n headers?: Array<{ name: string; value: string }>;\n queryString?: Array<{ name: string; value: string }>;\n postData?: { text?: string; mimeType?: string };\n}\n","import { z } from 'zod';\nimport type { Request as ApiRequest } from '@apicircle/shared';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// generate.code — produce a code snippet that reproduces a workspace request\n// in the user's language of choice. Targets are intentionally hand-rolled\n// rather than delegating to a third-party codegen lib so output stays small,\n// reviewable, and free from heavy transitive deps.\n// =============================================================================\n\nconst TARGET = z.enum(['curl', 'fetch', 'node-axios', 'python-requests', 'go', 'rust']);\n\nexport const generateCodeTool: AnyToolDef = {\n name: 'generate.code',\n description:\n 'Generate runnable code (curl / JavaScript fetch / Node Axios / Python requests / Go net/http / Rust reqwest) that reproduces a workspace request.',\n inputSchema: z.object({\n requestId: z.string(),\n target: TARGET,\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const req = state.synced.collections.requests[input.requestId];\n if (!req) return { ok: false, error: 'request not found' };\n const code = renderCode(req, input.target);\n return { ok: true, target: input.target, code };\n },\n};\n\nfunction renderCode(req: ApiRequest, target: z.infer<typeof TARGET>): string {\n switch (target) {\n case 'curl':\n return renderCurl(req);\n case 'fetch':\n return renderFetch(req);\n case 'node-axios':\n return renderAxios(req);\n case 'python-requests':\n return renderPython(req);\n case 'go':\n return renderGo(req);\n case 'rust':\n return renderRust(req);\n }\n}\n\nfunction fullUrl(req: ApiRequest): string {\n if (!req.query.length) return req.url;\n const enabled = req.query.filter((q) => q.enabled !== false);\n if (!enabled.length) return req.url;\n const sep = req.url.includes('?') ? '&' : '?';\n return (\n req.url +\n sep +\n enabled.map((q) => `${encodeURIComponent(q.key)}=${encodeURIComponent(q.value)}`).join('&')\n );\n}\n\nfunction bodyContent(req: ApiRequest): string | null {\n if (req.body.type === 'none') return null;\n if (req.body.type === 'json' || req.body.type === 'text' || req.body.type === 'xml') {\n return req.body.content;\n }\n if (req.body.type === 'graphql') {\n return JSON.stringify({ query: req.body.content, variables: req.body.variables ?? null });\n }\n if (req.body.type === 'urlencoded') return req.body.content;\n return null;\n}\n\nfunction renderCurl(req: ApiRequest): string {\n const parts: string[] = [`curl -X ${req.method} '${fullUrl(req)}'`];\n for (const h of req.headers.filter((x) => x.enabled !== false)) {\n parts.push(`-H '${h.key}: ${h.value}'`);\n }\n const body = bodyContent(req);\n if (body !== null) {\n parts.push(`--data-raw '${body.replace(/'/g, \"'\\\\''\")}'`);\n }\n return parts.join(' \\\\\\n ');\n}\n\nfunction renderFetch(req: ApiRequest): string {\n const headers = Object.fromEntries(\n req.headers.filter((h) => h.enabled !== false).map((h) => [h.key, h.value]),\n );\n const body = bodyContent(req);\n const init: Record<string, unknown> = { method: req.method };\n if (Object.keys(headers).length) init.headers = headers;\n if (body !== null) init.body = body;\n return `await fetch(${JSON.stringify(fullUrl(req))}, ${JSON.stringify(init, null, 2)})`;\n}\n\nfunction renderAxios(req: ApiRequest): string {\n const config: Record<string, unknown> = {\n method: req.method.toLowerCase(),\n url: fullUrl(req),\n };\n const headers = req.headers.filter((h) => h.enabled !== false);\n if (headers.length) config.headers = Object.fromEntries(headers.map((h) => [h.key, h.value]));\n const body = bodyContent(req);\n if (body !== null) config.data = body;\n return `import axios from 'axios';\\n\\nconst response = await axios(${JSON.stringify(\n config,\n null,\n 2,\n )});`;\n}\n\nfunction renderPython(req: ApiRequest): string {\n const headers = req.headers.filter((h) => h.enabled !== false);\n const body = bodyContent(req);\n const lines: string[] = ['import requests', ''];\n lines.push(`response = requests.request(`);\n lines.push(` method=${JSON.stringify(req.method)},`);\n lines.push(` url=${JSON.stringify(fullUrl(req))},`);\n if (headers.length) {\n lines.push(\n ` headers=${JSON.stringify(Object.fromEntries(headers.map((h) => [h.key, h.value])))},`,\n );\n }\n if (body !== null) lines.push(` data=${JSON.stringify(body)},`);\n lines.push(')');\n return lines.join('\\n');\n}\n\nfunction renderGo(req: ApiRequest): string {\n const headers = req.headers.filter((h) => h.enabled !== false);\n const body = bodyContent(req);\n const lines: string[] = [\n 'package main',\n '',\n 'import (',\n ' \"io\"',\n ' \"net/http\"',\n ' \"strings\"',\n ')',\n '',\n 'func main() {',\n ];\n if (body !== null) {\n lines.push(` body := strings.NewReader(${JSON.stringify(body)})`);\n lines.push(\n ` req, _ := http.NewRequest(${JSON.stringify(req.method)}, ${JSON.stringify(fullUrl(req))}, body)`,\n );\n } else {\n lines.push(\n ` req, _ := http.NewRequest(${JSON.stringify(req.method)}, ${JSON.stringify(fullUrl(req))}, nil)`,\n );\n }\n for (const h of headers) {\n lines.push(` req.Header.Set(${JSON.stringify(h.key)}, ${JSON.stringify(h.value)})`);\n }\n lines.push(' resp, _ := http.DefaultClient.Do(req)');\n lines.push(' defer resp.Body.Close()');\n lines.push(' out, _ := io.ReadAll(resp.Body)');\n lines.push(' _ = out');\n lines.push('}');\n return lines.join('\\n');\n}\n\nfunction renderRust(req: ApiRequest): string {\n const headers = req.headers.filter((h) => h.enabled !== false);\n const body = bodyContent(req);\n const lines: string[] = [\n 'use reqwest::Client;',\n '',\n '#[tokio::main]',\n 'async fn main() -> Result<(), Box<dyn std::error::Error>> {',\n ` let client = Client::new();`,\n ` let mut req = client.request(reqwest::Method::${req.method}, ${JSON.stringify(\n fullUrl(req),\n )});`,\n ];\n for (const h of headers) {\n lines.push(` req = req.header(${JSON.stringify(h.key)}, ${JSON.stringify(h.value)});`);\n }\n if (body !== null) lines.push(` req = req.body(${JSON.stringify(body)});`);\n lines.push(' let _resp = req.send().await?;');\n lines.push(' Ok(())');\n lines.push('}');\n return lines.join('\\n');\n}\n","import { z } from 'zod';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// workspace.list — surfaces every workspace the server can drive, with cheap\n// per-workspace counts so AI clients can disambiguate without follow-up\n// reads. Used by prompts like \"list every workspace I have\" or as a\n// disambiguation step before drilling into a specific one.\n// =============================================================================\n\nexport const workspaceListTool: AnyToolDef = {\n name: 'workspace.list',\n description:\n 'List every workspace registered with this server, including which one is currently active. ' +\n 'Returns id, display name, last-opened timestamp, and a per-workspace summary (request count, ' +\n 'environment count, mock-server count, plan count). Use this BEFORE drilling into a specific ' +\n 'workspace via other tools — pass the resulting `id` as `workspaceId` to `workspace.read` ' +\n 'or related reads when you want to scope to a non-active workspace.',\n inputSchema: z.object({}),\n async handler(_input, ctx) {\n const summaries = await ctx.workspaces.list();\n return {\n activeWorkspaceId: ctx.workspaces.activeId(),\n workspaceCount: summaries.length,\n workspaces: summaries,\n // Plain-text hint the AI surfaces when telling the user. Cheap to\n // generate here and saves round-trips on disambiguation prompts.\n hint:\n summaries.length === 0\n ? 'No workspaces are registered yet. The user should open the desktop app once or run `apicircle workspaces create <name>` from the terminal.'\n : summaries.length === 1\n ? `Only one workspace (\"${summaries[0].name}\") is registered — most tools will default to it without a workspaceId.`\n : `Multiple workspaces are registered. Pass the desired \\`id\\` as \\`workspaceId\\` to other tools to scope reads/writes to that workspace; the active one (\"${\n summaries.find((w) => w.isActive)?.name ?? '(none)'\n }\") is used by default.`,\n };\n },\n};\n","import { z } from 'zod';\nimport type {\n Assertion,\n Environment,\n ExecutionPlan,\n Folder,\n Request as ApiRequest,\n} from '@apicircle/shared';\nimport { generateId } from '@apicircle/shared';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// CRUD tool definitions for every workspace entity. Reads always go through\n// `workspace.read()`; writes always go through `workspace.apply(patch)` so the\n// mutation API in @apicircle/core is the single semantic source of truth.\n// =============================================================================\n\nconst HTTP_METHOD = z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']);\n\n// ---------------------------------------------------------------------------\n// Requests\n// ---------------------------------------------------------------------------\n\nexport const requestCreateTool: AnyToolDef = {\n name: 'request.create',\n description: 'Create a new request from explicit fields and persist it.',\n inputSchema: z.object({\n name: z.string().default('New request'),\n method: HTTP_METHOD.default('GET'),\n url: z.string().default(''),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const now = new Date().toISOString();\n const request: ApiRequest = {\n id: generateId(),\n name: input.name,\n folderId: input.folderId ?? null,\n method: input.method,\n url: input.url,\n headers: [],\n query: [],\n body: { type: 'none', content: '' },\n // Default to `inherit` so requests created via MCP inside a folder\n // pick up folder auth automatically. Mirrors editorActions.createRequest.\n auth: { type: 'inherit' },\n contextVars: [],\n extractions: [],\n assertions: [],\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'request.create', request });\n return { id: request.id, changedIds: out.changedIds };\n },\n};\n\nexport const requestReadTool: AnyToolDef = {\n name: 'request.read',\n description:\n 'Read a request by id, or list summaries (id, name, method, url) when no id is provided.',\n inputSchema: z.object({ id: z.string().optional() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (input.id) {\n const req = state.synced.collections.requests[input.id];\n if (!req) return { found: false };\n return { found: true, request: req };\n }\n const list = Object.values(state.synced.collections.requests).map((r) => ({\n id: r.id,\n name: r.name,\n method: r.method,\n url: r.url,\n folderId: r.folderId,\n }));\n return { count: list.length, requests: list };\n },\n};\n\nexport const requestUpdateTool: AnyToolDef = {\n name: 'request.update',\n description: 'Patch fields on an existing request.',\n inputSchema: z.object({\n id: z.string(),\n patch: z\n .object({\n name: z.string().optional(),\n method: HTTP_METHOD.optional(),\n url: z.string().optional(),\n folderId: z.string().nullable().optional(),\n })\n .strict(),\n }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'request.update',\n id: input.id,\n patch: input.patch as Partial<Omit<ApiRequest, 'id' | 'createdAt'>>,\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const requestDeleteTool: AnyToolDef = {\n name: 'request.delete',\n description: 'Delete a request by id.',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'request.delete', id: input.id });\n return { changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Folders\n// ---------------------------------------------------------------------------\n\nexport const folderCreateTool: AnyToolDef = {\n name: 'folder.create',\n description: 'Create a folder under an optional parent folder.',\n inputSchema: z.object({\n name: z.string().default('New folder'),\n parentId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const folder: Folder = {\n id: generateId(),\n name: input.name,\n parentId: input.parentId ?? null,\n };\n const out = await ctx.workspace.apply({ kind: 'folder.create', folder });\n return { id: folder.id, changedIds: out.changedIds };\n },\n};\n\nexport const folderReadTool: AnyToolDef = {\n name: 'folder.read',\n description: 'Read a folder by id, or list all folders when no id is provided.',\n inputSchema: z.object({ id: z.string().optional() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (input.id) {\n const folder = state.synced.collections.folders[input.id];\n return folder ? { found: true, folder } : { found: false };\n }\n return {\n count: Object.keys(state.synced.collections.folders).length,\n folders: Object.values(state.synced.collections.folders),\n };\n },\n};\n\nexport const folderUpdateTool: AnyToolDef = {\n name: 'folder.update',\n description: 'Move a folder to a new parent (or to root with parentId: null).',\n inputSchema: z.object({\n id: z.string(),\n parentId: z.string().nullable(),\n }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'folder.move',\n id: input.id,\n newParentId: input.parentId,\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const folderDeleteTool: AnyToolDef = {\n name: 'folder.delete',\n description:\n \"Delete a folder. Direct children (sub-folders + requests) are reparented to the deleted folder's parent.\",\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'folder.delete', id: input.id });\n return { changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Environments\n// ---------------------------------------------------------------------------\n\nconst VARIABLE = z.object({\n key: z.string(),\n value: z.string(),\n encrypted: z.boolean().default(false),\n});\n\nexport const environmentCreateTool: AnyToolDef = {\n name: 'environment.create',\n description: 'Create a new environment (or upsert one with the same name).',\n inputSchema: z.object({\n name: z.string(),\n variables: z.array(VARIABLE).default([]),\n }),\n async handler(input, ctx) {\n const env: Environment = { name: input.name, variables: input.variables };\n const out = await ctx.workspace.apply({ kind: 'environment.upsert', environment: env });\n return { name: env.name, changedIds: out.changedIds };\n },\n};\n\nexport const environmentReadTool: AnyToolDef = {\n name: 'environment.read',\n description: 'Read environments — pass `name` for one, or omit for the full list.',\n inputSchema: z.object({ name: z.string().optional() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (input.name) {\n const env = state.synced.environments.items[input.name];\n return env ? { found: true, environment: env } : { found: false };\n }\n return {\n activeName: state.synced.environments.activeName,\n priorityOrder: state.synced.environments.priorityOrder,\n environments: Object.values(state.synced.environments.items),\n };\n },\n};\n\nexport const environmentUpdateTool: AnyToolDef = {\n name: 'environment.update',\n description: 'Replace the variables list of an environment.',\n inputSchema: z.object({\n name: z.string(),\n variables: z.array(VARIABLE),\n }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'environment.upsert',\n environment: { name: input.name, variables: input.variables },\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const environmentDeleteTool: AnyToolDef = {\n name: 'environment.delete',\n description: 'Delete an environment by name.',\n inputSchema: z.object({ name: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'environment.delete', name: input.name });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const environmentSetActiveTool: AnyToolDef = {\n name: 'environment.set_active',\n description:\n 'Set (or clear) the active environment. Pass `name: null` to deactivate the current environment.',\n inputSchema: z.object({ name: z.string().nullable() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'environment.setActive',\n name: input.name,\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const environmentSetPriorityTool: AnyToolDef = {\n name: 'environment.set_priority',\n description:\n 'Replace the global environment priority order (highest priority first). Strings are interpreted as local env names. To target a linked env, pass `{ kind: \"linked\", linkedWorkspaceId, envName }` instead.',\n inputSchema: z.object({\n order: z.array(\n z.union([\n z.string(),\n z.object({\n kind: z.literal('local'),\n name: z.string(),\n }),\n z.object({\n kind: z.literal('linked'),\n linkedWorkspaceId: z.string(),\n envName: z.string(),\n }),\n ]),\n ),\n }),\n async handler(input, ctx) {\n // Normalize the heterogeneous tool-input array to EnvPriorityRef[].\n // Bare strings are convenience syntax for local envs — the dominant\n // case for MCP callers — so we keep accepting them rather than\n // forcing every caller to spell out `{kind:'local', ...}`.\n const order = (\n input.order as Array<\n | string\n | { kind: 'local'; name: string }\n | { kind: 'linked'; linkedWorkspaceId: string; envName: string }\n >\n ).map((entry) => (typeof entry === 'string' ? { kind: 'local' as const, name: entry } : entry));\n const out = await ctx.workspace.apply({\n kind: 'environment.setPriority',\n order,\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const environmentExportTool: AnyToolDef = {\n name: 'environment.export',\n description:\n 'Serialize an environment to a portable JSON string. Encrypted variables drop their value (only `secretKeyId` survives) so the export can be safely pasted elsewhere — re-attach secrets locally on the receiving side.',\n inputSchema: z.object({ name: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const env = state.synced.environments.items[input.name];\n if (!env) return { ok: false as const, error: 'environment not found' as const };\n const payload = {\n apicircleEnvironment: 1 as const,\n name: env.name,\n variables: env.variables.map((v) =>\n v.encrypted && v.secretKeyId\n ? { key: v.key, encrypted: true as const, secretKeyId: v.secretKeyId }\n : { key: v.key, value: v.value, encrypted: false as const },\n ),\n };\n return { ok: true as const, json: JSON.stringify(payload, null, 2) };\n },\n};\n\nexport const environmentImportTool: AnyToolDef = {\n name: 'environment.import',\n description:\n 'Import an environment from the JSON shape produced by `environment.export`. When a target with the same name exists, pass `overwrite: true` to replace it, otherwise the import is rejected.',\n inputSchema: z.object({\n json: z.string().min(1),\n overwrite: z.boolean().default(false),\n }),\n async handler(input, ctx) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(input.json);\n } catch {\n return { ok: false as const, error: 'invalid JSON' as const };\n }\n const obj = parsed as {\n apicircleEnvironment?: number;\n name?: string;\n variables?: Array<\n | { key: string; encrypted: true; secretKeyId: string }\n | { key: string; encrypted: false; value: string }\n >;\n };\n if (\n obj.apicircleEnvironment !== 1 ||\n typeof obj.name !== 'string' ||\n !Array.isArray(obj.variables)\n ) {\n return { ok: false as const, error: 'unsupported export shape' as const };\n }\n const state = await ctx.workspace.read();\n if (state.synced.environments.items[obj.name] && !input.overwrite) {\n return {\n ok: false as const,\n error: 'environment already exists; pass overwrite:true' as const,\n };\n }\n const env: Environment = {\n name: obj.name,\n variables: obj.variables.map((v) =>\n v.encrypted\n ? { key: v.key, value: '', encrypted: true, secretKeyId: v.secretKeyId }\n : { key: v.key, value: v.value, encrypted: false },\n ),\n };\n const out = await ctx.workspace.apply({ kind: 'environment.upsert', environment: env });\n return { ok: true as const, name: env.name, changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Execution plans\n// ---------------------------------------------------------------------------\n\nconst PLAN_STEP = z.object({\n requestId: z.string(),\n linkedWorkspaceId: z.string().optional(),\n});\n\nexport const planCreateTool: AnyToolDef = {\n name: 'plan.create',\n description: 'Create a new execution plan (sequence of request steps).',\n inputSchema: z.object({\n name: z.string().default('New plan'),\n steps: z.array(PLAN_STEP).default([]),\n envPriorityOrder: z.array(z.string()).default([]),\n }),\n async handler(input, ctx) {\n const id = generateId();\n const now = new Date().toISOString();\n const plan: ExecutionPlan = {\n id,\n name: input.name,\n steps: input.steps,\n envPriorityOrder: input.envPriorityOrder,\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'plan.upsert', plan });\n return { id, changedIds: out.changedIds };\n },\n};\n\nexport const planReadTool: AnyToolDef = {\n name: 'plan.read',\n description: 'Read a plan by id, or list all plans when no id is provided.',\n inputSchema: z.object({ id: z.string().optional() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (input.id) {\n const plan = state.local.executionPlans[input.id];\n return plan ? { found: true, plan } : { found: false };\n }\n return {\n count: Object.keys(state.local.executionPlans).length,\n plans: Object.values(state.local.executionPlans),\n };\n },\n};\n\nexport const planUpdateTool: AnyToolDef = {\n name: 'plan.update',\n description: 'Patch fields on an existing plan.',\n inputSchema: z.object({\n id: z.string(),\n patch: z\n .object({\n name: z.string().optional(),\n steps: z.array(PLAN_STEP).optional(),\n envPriorityOrder: z.array(z.string()).optional(),\n })\n .strict(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const existing = state.local.executionPlans[input.id];\n if (!existing) return { changedIds: [] };\n const merged: ExecutionPlan = {\n ...existing,\n ...input.patch,\n id: existing.id,\n createdAt: existing.createdAt,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'plan.upsert', plan: merged });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const planDeleteTool: AnyToolDef = {\n name: 'plan.delete',\n description: 'Delete a plan by id. Drops history rows referencing this plan.',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'plan.delete', id: input.id });\n return { changedIds: out.changedIds };\n },\n};\n\n// Granular plan-step operations. Each fetches the plan, mutates the steps\n// array, and writes the whole plan back via `plan.upsert` — keeping\n// applyMutation patches as the single source of truth.\n\nexport const planAddStepTool: AnyToolDef = {\n name: 'plan.add_step',\n description:\n 'Append a step to an execution plan. Optional `position` (0-based) inserts at that index instead.',\n inputSchema: z.object({\n planId: z.string(),\n requestId: z.string(),\n linkedWorkspaceId: z.string().optional(),\n position: z.number().int().nonnegative().optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n const step = {\n requestId: input.requestId,\n ...(input.linkedWorkspaceId ? { linkedWorkspaceId: input.linkedWorkspaceId } : {}),\n };\n const steps = [...plan.steps];\n if (input.position !== undefined && input.position <= steps.length) {\n steps.splice(input.position, 0, step);\n } else {\n steps.push(step);\n }\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, steps, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const planRemoveStepTool: AnyToolDef = {\n name: 'plan.remove_step',\n description: 'Remove a step from a plan by 0-based index.',\n inputSchema: z.object({\n planId: z.string(),\n index: z.number().int().nonnegative(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n if (input.index >= plan.steps.length) {\n return { ok: false as const, error: 'index out of range' as const };\n }\n const steps = plan.steps.filter((_, i) => i !== input.index);\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, steps, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const planReorderStepsTool: AnyToolDef = {\n name: 'plan.reorder_steps',\n description:\n 'Replace the plan steps with a new permutation. The supplied indices must reference valid current step indices.',\n inputSchema: z.object({\n planId: z.string(),\n order: z.array(z.number().int().nonnegative()),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n if (input.order.length !== plan.steps.length) {\n return { ok: false as const, error: 'order length must equal step count' as const };\n }\n const order: number[] = input.order;\n const seen = new Set(order);\n if (seen.size !== order.length || order.some((i: number) => i >= plan.steps.length)) {\n return { ok: false as const, error: 'order must be a permutation of step indices' as const };\n }\n const steps = order.map((i: number) => plan.steps[i]);\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, steps, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nconst PLAN_VARIABLE = z.object({ key: z.string(), value: z.string() });\n\nexport const planSetVariablesTool: AnyToolDef = {\n name: 'plan.set_variables',\n description:\n 'Replace the plan-scoped variables. These live highest-priority during plan runs (above environment vars, below context vars).',\n inputSchema: z.object({\n planId: z.string(),\n variables: z.array(PLAN_VARIABLE),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, variables: input.variables, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const planRunTool: AnyToolDef = {\n name: 'plan.run',\n description:\n 'Run a plan headlessly (server-side). Currently returns a not-implemented marker — full execution requires the Desktop or browser runtime which the MCP host does not own. The Desktop integration overrides this tool with a real runner.',\n inputSchema: z.object({\n id: z.string(),\n withAssertions: z.boolean().default(true),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.id];\n if (!plan) return { ok: false, error: 'plan not found' };\n return {\n ok: false,\n error:\n 'Plan execution is only available in the Desktop app (or once a hosted runtime is wired). The plan exists and is ready to run from the UI.',\n planId: plan.id,\n stepCount: plan.steps.length,\n };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Assertions\n// ---------------------------------------------------------------------------\n\nconst ASSERTION = z.object({\n id: z.string().optional(),\n kind: z.enum(['status', 'header', 'json-path', 'duration']),\n op: z.enum(['equals', 'not-equals', 'contains', 'lt', 'gt', 'matches']),\n target: z.string().optional(),\n expected: z.union([z.string(), z.number()]),\n});\n\nexport const assertionCreateTool: AnyToolDef = {\n name: 'assertion.create',\n description: 'Add an assertion to a request.',\n inputSchema: z.object({\n requestId: z.string(),\n assertion: ASSERTION,\n }),\n async handler(input, ctx) {\n const assertion: Assertion = {\n ...input.assertion,\n id: input.assertion.id ?? generateId(),\n } as Assertion;\n const out = await ctx.workspace.apply({\n kind: 'assertion.upsert',\n requestId: input.requestId,\n assertion,\n });\n return { id: assertion.id, changedIds: out.changedIds };\n },\n};\n\nexport const assertionReadTool: AnyToolDef = {\n name: 'assertion.read',\n description: 'List assertions for a request, or fetch a single assertion by id.',\n inputSchema: z.object({\n requestId: z.string(),\n assertionId: z.string().optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const req = state.synced.collections.requests[input.requestId];\n if (!req) return { found: false };\n if (input.assertionId) {\n const a = req.assertions.find((x) => x.id === input.assertionId);\n return a ? { found: true, assertion: a } : { found: false };\n }\n return { count: req.assertions.length, assertions: req.assertions };\n },\n};\n\nexport const assertionUpdateTool: AnyToolDef = {\n name: 'assertion.update',\n description: 'Replace an existing assertion (matched by `assertion.id`).',\n inputSchema: z.object({\n requestId: z.string(),\n assertion: ASSERTION.required({ id: true }),\n }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'assertion.upsert',\n requestId: input.requestId,\n assertion: input.assertion as Assertion,\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const assertionDeleteTool: AnyToolDef = {\n name: 'assertion.delete',\n description: 'Remove an assertion from a request.',\n inputSchema: z.object({\n requestId: z.string(),\n assertionId: z.string(),\n }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'assertion.delete',\n requestId: input.requestId,\n assertionId: input.assertionId,\n });\n return { changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Workspace bulk read / write\n// ---------------------------------------------------------------------------\n\nexport const workspaceReadTool: AnyToolDef = {\n name: 'workspace.read',\n description:\n 'Return the full `{ synced, local }` workspace pair. Pass `workspaceId` to scope to a specific ' +\n 'workspace when multiple are registered (call `workspace.list` first to discover ids). When ' +\n 'omitted and multiple workspaces exist, the response is a structured \"multiple workspaces found\" ' +\n 'envelope listing each summary so the AI can clarify before drilling in. Use sparingly — ' +\n 'entity-specific tools are more efficient for small reads.',\n inputSchema: z.object({\n workspaceId: z\n .string()\n .min(1)\n .max(256)\n .optional()\n .describe(\n 'Optional workspace id (from `workspace.list`). Omit to read the active workspace; the ' +\n 'tool will switch to the \"multiple workspaces\" envelope when ambiguous.',\n ),\n }),\n async handler(input, ctx) {\n if (input.workspaceId) {\n const provider = ctx.workspaces.for(input.workspaceId);\n const state = await provider.read();\n return {\n kind: 'single' as const,\n workspaceId: state.synced.workspaceId,\n synced: state.synced,\n local: state.local,\n };\n }\n const summaries = await ctx.workspaces.list();\n if (summaries.length > 1) {\n return {\n kind: 'multiple-workspaces' as const,\n activeWorkspaceId: ctx.workspaces.activeId(),\n workspaceCount: summaries.length,\n workspaces: summaries,\n hint:\n `Found ${summaries.length} workspaces. Re-call \\`workspace.read\\` with \\`workspaceId\\` set ` +\n 'to the desired entry, or call entity-specific tools (which default to the active workspace) ' +\n 'when scoping to one workspace is acceptable.',\n };\n }\n const state = await ctx.workspace.read();\n return {\n kind: 'single' as const,\n workspaceId: state.synced.workspaceId,\n synced: state.synced,\n local: state.local,\n };\n },\n};\n\nexport const workspaceWriteTool: AnyToolDef = {\n name: 'workspace.write',\n description:\n 'Bulk-replace the workspace. Pass `synced` and/or `local` to overwrite either side. Use ' +\n '`workspaceId` to target a non-active workspace (omit to write the active one). Mutating tools ' +\n 'are preferred — this is for full-doc imports/exports.',\n inputSchema: z.object({\n workspaceId: z\n .string()\n .min(1)\n .max(256)\n .optional()\n .describe('Optional workspace id; omit to write the active workspace.'),\n synced: z.unknown().optional(),\n local: z.unknown().optional(),\n }),\n async handler(input, ctx) {\n const provider = input.workspaceId ? ctx.workspaces.for(input.workspaceId) : ctx.workspace;\n const next = await provider.write({\n synced: input.synced as Parameters<typeof provider.write>[0]['synced'],\n local: input.local as Parameters<typeof provider.write>[0]['local'],\n });\n return { workspaceId: next.synced.workspaceId, ok: true };\n },\n};\n","import { z } from 'zod';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// History tools — list / get / delete / purge over the local request-run +\n// plan-run buffers. History lives in `WorkspaceLocal`, never pushed to git,\n// so these are local-only mutations.\n// =============================================================================\n\nexport const historyListRunsTool: AnyToolDef = {\n name: 'history.list_runs',\n description:\n 'List request-run history rows in reverse-chronological order. Filter by `requestId`, `ok` (success/failure), or `since`/`until` ISO timestamps. `limit` caps the result set; default 100.',\n inputSchema: z.object({\n requestId: z.string().optional(),\n ok: z.boolean().optional(),\n since: z.string().optional(),\n until: z.string().optional(),\n limit: z.number().int().positive().max(500).default(100),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const sinceMs = input.since ? Date.parse(input.since) : -Infinity;\n const untilMs = input.until ? Date.parse(input.until) : Infinity;\n const filtered = state.local.history.requestRuns.filter((r) => {\n if (input.requestId && r.requestId !== input.requestId) return false;\n if (input.ok !== undefined && r.ok !== input.ok) return false;\n const t = Date.parse(r.startedAt);\n if (!Number.isFinite(t)) return true;\n return t >= sinceMs && t <= untilMs;\n });\n // Already stored newest-last in the circular buffer; reverse for display.\n const sorted = [...filtered].sort((a, b) => b.startedAt.localeCompare(a.startedAt));\n const limited = sorted.slice(0, input.limit);\n return {\n total: filtered.length,\n returned: limited.length,\n runs: limited.map((r) => ({\n id: r.id,\n requestId: r.requestId,\n method: r.method,\n url: r.url,\n status: r.status,\n ok: r.ok,\n startedAt: r.startedAt,\n durationMs: r.durationMs,\n })),\n };\n },\n};\n\nexport const historyGetRunTool: AnyToolDef = {\n name: 'history.get_run',\n description: 'Fetch a single history row in full (headers, body preview, assertion results).',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const run = state.local.history.requestRuns.find((r) => r.id === input.id);\n if (!run) return { found: false as const };\n return { found: true as const, run };\n },\n};\n\nexport const historyDeleteRunTool: AnyToolDef = {\n name: 'history.delete_run',\n description: 'Delete a single request-run row by id.',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'history.delete_run', runId: input.id });\n return { deleted: out.changedIds.length, changedIds: out.changedIds };\n },\n};\n\nexport const historyPurgeTool: AnyToolDef = {\n name: 'history.purge_by_age',\n description:\n 'Drop every request-run + plan-run older than `olderThanDays` days. Pass 0 to clear all history.',\n inputSchema: z.object({\n olderThanDays: z.number().nonnegative(),\n }),\n async handler(input, ctx) {\n const olderThanMs = input.olderThanDays * 24 * 60 * 60 * 1000;\n const out = await ctx.workspace.apply({ kind: 'history.purge', olderThanMs });\n return { purgedCount: out.changedIds.length, changedIds: out.changedIds };\n },\n};\n","import { z } from 'zod';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// codebase.extract_collection — heuristic detector that walks a chunk of\n// source code (passed in by the AI client) and returns candidate request\n// shapes. The MCP host doesn't have filesystem access by itself; this tool\n// lets the AI orchestrate a `read files → extract → confirm with user →\n// import` pipeline.\n//\n// Currently detects:\n// • Express — `app.METHOD(`, `router.METHOD(`\n// • FastAPI — `@app.METHOD(`, `@router.METHOD(`\n// • Spring — `@GetMapping`, `@PostMapping`, `@PutMapping`, `@DeleteMapping`,\n// `@PatchMapping`, `@RequestMapping(method=...)`\n// • NestJS — `@Get(`, `@Post(`, `@Put(`, `@Patch(`, `@Delete(`\n//\n// All matches are surfaced as `{ method, path, framework, line }`. The AI\n// then asks the user to confirm and follows up with `request.create` calls.\n// =============================================================================\n\nconst HTTP_METHODS = ['get', 'post', 'put', 'patch', 'delete', 'options', 'head'];\n\ninterface Candidate {\n method: string;\n path: string;\n framework: 'express' | 'fastapi' | 'nest' | 'spring';\n line: number;\n}\n\nexport const codebaseExtractCollectionTool: AnyToolDef = {\n name: 'codebase.extract_collection',\n description:\n 'Scan source code for HTTP route definitions (Express, FastAPI, NestJS, Spring) and return candidate requests for the user to confirm before import.',\n inputSchema: z.object({\n source: z.string().min(1),\n /** Hint to limit which framework patterns to apply. Empty = try all. */\n frameworks: z.array(z.enum(['express', 'fastapi', 'nest', 'spring'])).default([]),\n }),\n async handler(input) {\n const enabled = new Set(\n input.frameworks.length ? input.frameworks : ['express', 'fastapi', 'nest', 'spring'],\n );\n const candidates: Candidate[] = [];\n const lines = input.source.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (enabled.has('express')) {\n const m =\n /(?:^|[\\s\\b])(?:app|router)\\.(get|post|put|patch|delete|options|head)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/i.exec(\n line,\n );\n if (m) {\n candidates.push({\n method: m[1].toUpperCase(),\n path: m[2],\n framework: 'express',\n line: i + 1,\n });\n continue;\n }\n }\n if (enabled.has('fastapi')) {\n const m =\n /@(?:app|router)\\.(get|post|put|patch|delete|options|head)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/i.exec(\n line,\n );\n if (m) {\n candidates.push({\n method: m[1].toUpperCase(),\n path: m[2],\n framework: 'fastapi',\n line: i + 1,\n });\n continue;\n }\n }\n if (enabled.has('nest')) {\n const m = /@(Get|Post|Put|Patch|Delete|Options|Head)\\s*\\(\\s*['\"`]([^'\"`]*)['\"`]\\s*\\)/i.exec(\n line,\n );\n if (m) {\n candidates.push({\n method: m[1].toUpperCase(),\n path: m[2] || '/',\n framework: 'nest',\n line: i + 1,\n });\n continue;\n }\n }\n if (enabled.has('spring')) {\n const verb = /@(Get|Post|Put|Patch|Delete)Mapping\\s*\\(?\\s*['\"`]?([^'\"`)\\s]*)/i.exec(line);\n if (verb && HTTP_METHODS.includes(verb[1].toLowerCase())) {\n candidates.push({\n method: verb[1].toUpperCase(),\n path: verb[2] || '/',\n framework: 'spring',\n line: i + 1,\n });\n continue;\n }\n const generic =\n /@RequestMapping\\s*\\(\\s*[^)]*method\\s*=\\s*RequestMethod\\.(GET|POST|PUT|PATCH|DELETE)[^)]*?(?:value|path)?\\s*=?\\s*['\"`]?([^'\"`)\\s,]*)/i.exec(\n line,\n );\n if (generic) {\n candidates.push({\n method: generic[1].toUpperCase(),\n path: generic[2] || '/',\n framework: 'spring',\n line: i + 1,\n });\n }\n }\n }\n return { count: candidates.length, candidates };\n },\n};\n","import { z } from 'zod';\nimport type {\n Assertion,\n Environment,\n ExecutionPlan,\n Folder,\n MockEndpoint,\n MockResponseConfig,\n MockServer,\n Request as ApiRequest,\n RequestAuth,\n RequestBody,\n} from '@apicircle/shared';\nimport { generateId, makeDefaultMockResponse, makeDefaultRequestSchema } from '@apicircle/shared';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// Prompt-driven authoring tools. The AI client converts the user's natural-\n// language request into JSON matching the schemas below; the server validates\n// + persists. The actual NL → JSON conversion happens client-side in the AI's\n// own model, not here.\n// =============================================================================\n\nexport const promptCreateEnvironmentTool: AnyToolDef = {\n name: 'prompt.create_environment',\n description:\n 'Create a new environment from an LLM-shaped JSON envelope. The model produces { name, variables: [{ key, value, encrypted }] }; this tool validates and persists it.',\n inputSchema: z.object({\n name: z.string(),\n variables: z.array(\n z.object({\n key: z.string(),\n value: z.string(),\n encrypted: z.boolean().default(false),\n }),\n ),\n }),\n async handler(input, ctx) {\n const env: Environment = { name: input.name, variables: input.variables };\n const out = await ctx.workspace.apply({ kind: 'environment.upsert', environment: env });\n return { name: env.name, changedIds: out.changedIds };\n },\n};\n\nexport const promptCreateAssertionTool: AnyToolDef = {\n name: 'prompt.create_assertion',\n description:\n 'Add an assertion to a request from an LLM-shaped JSON envelope. Useful when the user asks \"assert that the response status is 200 and body.id matches\".',\n inputSchema: z.object({\n requestId: z.string(),\n assertion: z.object({\n kind: z.enum(['status', 'header', 'json-path', 'duration']),\n op: z.enum(['equals', 'not-equals', 'contains', 'lt', 'gt', 'matches']),\n target: z.string().optional(),\n expected: z.union([z.string(), z.number()]),\n }),\n }),\n async handler(input, ctx) {\n const assertion: Assertion = {\n ...input.assertion,\n id: generateId(),\n } as Assertion;\n const out = await ctx.workspace.apply({\n kind: 'assertion.upsert',\n requestId: input.requestId,\n assertion,\n });\n return { id: assertion.id, changedIds: out.changedIds };\n },\n};\n\nexport const promptCreatePlanTool: AnyToolDef = {\n name: 'prompt.create_plan',\n description:\n 'Create an execution plan from an LLM-shaped JSON envelope. The model produces { name, stepRequestIds: [...] } and the tool validates that each id exists in the workspace before persisting.',\n inputSchema: z.object({\n name: z.string(),\n stepRequestIds: z.array(z.string()).default([]),\n envPriorityOrder: z.array(z.string()).default([]),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const missing: string[] = [];\n for (const rid of input.stepRequestIds) {\n if (!state.synced.collections.requests[rid]) missing.push(rid);\n }\n if (missing.length) {\n return {\n ok: false,\n error: `Unknown request ids: ${missing.join(', ')}`,\n missing,\n };\n }\n const id = generateId();\n const now = new Date().toISOString();\n const plan: ExecutionPlan = {\n id,\n name: input.name,\n steps: input.stepRequestIds.map((requestId: string) => ({ requestId })),\n envPriorityOrder: input.envPriorityOrder,\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'plan.upsert', plan });\n return { ok: true, id, changedIds: out.changedIds };\n },\n};\n\n// =============================================================================\n// Shared schema fragments for the request- and mock-shaped prompt.* tools\n// below. Kept inline (vs imported from crud.ts / mocks.ts) so each prompt.*\n// tool stays a self-contained NL contract — the canonical CRUD schemas can\n// evolve without dragging the prompt surface with them.\n// =============================================================================\n\nconst HTTP_METHOD = z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']);\n\nconst HEADER_OR_QUERY = z.object({\n key: z.string(),\n value: z.string(),\n enabled: z.boolean().default(true),\n});\n\nconst REQUEST_BODY = z.object({\n type: z.enum(['none', 'json', 'text', 'xml', 'graphql', 'urlencoded']).default('none'),\n content: z.string().default(''),\n variables: z.string().optional(),\n});\n\n// LLM-friendly auth surface — covers the authoring flows a model can plausibly\n// produce from natural language. OAuth2 / AWS / Hawk / NTLM / JWT are token-\n// state heavy and best authored via the dedicated UI, then patched via\n// `request.update`. Callers needing them should use that path.\nconst PROMPT_AUTH = z.discriminatedUnion('type', [\n z.object({ type: z.literal('none') }),\n z.object({ type: z.literal('inherit') }),\n z.object({ type: z.literal('bearer'), token: z.string().default('') }),\n z.object({\n type: z.literal('basic'),\n username: z.string().default(''),\n password: z.string().default(''),\n }),\n z.object({\n type: z.literal('api-key'),\n key: z.string().default(''),\n value: z.string().default(''),\n addTo: z.enum(['header', 'query', 'cookie']).default('header'),\n }),\n z.object({\n type: z.literal('custom-header'),\n key: z.string().default(''),\n value: z.string().default(''),\n }),\n]);\n\nconst PROMPT_ASSERTION = z.object({\n kind: z.enum(['status', 'header', 'json-path', 'duration']),\n op: z.enum(['equals', 'not-equals', 'contains', 'lt', 'gt', 'matches']),\n target: z.string().optional(),\n expected: z.union([z.string(), z.number()]),\n});\n\nconst ENDPOINT_RESPONSE = z.object({\n status: z.number().int().min(100).max(599).default(200),\n jsonBody: z.string().default('{}'),\n contentType: z.string().default('application/json'),\n});\n\nconst VALIDATION_RULE_NL = z.object({\n kind: z.enum([\n 'header-required',\n 'header-equals',\n 'header-matches',\n 'query-required',\n 'query-equals',\n 'query-matches',\n 'cookie-required',\n 'body-required',\n 'content-type-equals',\n ]),\n target: z.string().default(''),\n expected: z.string().optional(),\n message: z.string().optional(),\n enabled: z.boolean().default(true),\n failResponse: z\n .object({\n status: z.number().int().min(100).max(599).default(400),\n jsonBody: z.string().default('{\"error\":\"validation failed\"}'),\n })\n .default({}),\n});\n\nconst CONDITION_CLAUSE_NL = z.object({\n scope: z.enum(['query', 'pathParam', 'header', 'cookie', 'body-json-path']),\n target: z.string(),\n op: z.enum(['equals', 'not-equals', 'matches', 'gt', 'lt', 'gte', 'lte', 'present', 'absent']),\n value: z.string().optional(),\n});\n\nconst RESPONSE_RULE_NL = z.object({\n name: z.string(),\n enabled: z.boolean().default(true),\n when: z.array(CONDITION_CLAUSE_NL).default([]),\n response: z\n .object({\n status: z.number().int().min(100).max(599).default(200),\n jsonBody: z.string().default('{}'),\n })\n .default({}),\n});\n\nconst MULTIPLIER_NL = z.object({\n name: z.string().optional(),\n source: z.object({\n kind: z.enum(['query', 'pathParam', 'header', 'body-json-path']),\n key: z.string(),\n }),\n targetJsonPath: z.string(),\n defaultCount: z.number().int().nonnegative().default(0),\n min: z.number().int().nonnegative().optional(),\n max: z.number().int().nonnegative().optional(),\n});\n\nconst ENDPOINT_INPUT = z.object({\n method: HTTP_METHOD,\n pathPattern: z.string().min(1),\n name: z.string().optional(),\n description: z.string().optional(),\n response: ENDPOINT_RESPONSE.optional(),\n validationRules: z.array(VALIDATION_RULE_NL).default([]),\n responseRules: z.array(RESPONSE_RULE_NL).default([]),\n multipliers: z.array(MULTIPLIER_NL).default([]),\n});\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildRequestBody(input?: z.infer<typeof REQUEST_BODY>): RequestBody {\n if (!input) return { type: 'none', content: '' };\n const body: RequestBody = { type: input.type, content: input.content };\n if (input.variables !== undefined && input.type === 'graphql') {\n body.variables = input.variables;\n }\n return body;\n}\n\nfunction buildEndpoint(input: z.infer<typeof ENDPOINT_INPUT>): MockEndpoint {\n const response = input.response ?? {\n status: 200,\n jsonBody: '{}',\n contentType: 'application/json',\n };\n const headers = [{ key: 'Content-Type', value: response.contentType, enabled: true as const }];\n const defaultResponse: MockResponseConfig = {\n ...makeDefaultMockResponse(),\n status: response.status,\n headers,\n body: { type: 'json', content: response.jsonBody },\n };\n // Inputs from raw JSON (callers bypassing zod parse) may have these arrays\n // omitted. Treat undefined as empty so the build path never NPEs.\n const validationRules = input.validationRules ?? [];\n const responseRules = input.responseRules ?? [];\n const multipliers = input.multipliers ?? [];\n if (multipliers.length > 0) {\n defaultResponse.multipliers = multipliers.map((m) => ({\n id: generateId(),\n name: m.name,\n source: { kind: m.source.kind, key: m.source.key },\n targetJsonPath: m.targetJsonPath,\n defaultCount: m.defaultCount,\n min: m.min,\n max: m.max,\n }));\n }\n return {\n id: generateId(),\n name: input.name ?? `${input.method} ${input.pathPattern}`,\n method: input.method,\n pathPattern: input.pathPattern,\n description: input.description,\n requestSchema: makeDefaultRequestSchema(),\n requestValidation: validationRules.map((r) => ({\n id: generateId(),\n kind: r.kind,\n target: r.target,\n expected: r.expected,\n message: r.message,\n enabled: r.enabled,\n failResponse: {\n status: r.failResponse.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: r.failResponse.jsonBody },\n },\n })),\n responseRules: responseRules.map((r) => ({\n id: generateId(),\n name: r.name,\n enabled: r.enabled,\n when: (r.when ?? []).map((c) => ({\n id: generateId(),\n scope: c.scope,\n target: c.target,\n op: c.op,\n value: c.value,\n })),\n response: {\n status: r.response.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: r.response.jsonBody },\n },\n })),\n defaultResponse,\n };\n}\n\nfunction patchEndpoint(\n mock: MockServer,\n endpointId: string,\n patcher: (e: MockEndpoint) => MockEndpoint,\n): MockServer | null {\n const idx = mock.endpoints.findIndex((e) => e.id === endpointId);\n if (idx === -1) return null;\n const nextEndpoints = [...mock.endpoints];\n nextEndpoints[idx] = patcher(mock.endpoints[idx]);\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n return {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Requests\n// ---------------------------------------------------------------------------\n\nexport const promptCreateRequestTool: AnyToolDef = {\n name: 'prompt.create_request',\n description:\n 'Create a fully-shaped request from an LLM-shaped JSON envelope: method, url, headers, query params, body, auth, and inline assertions. The model produces a flat object; this tool generates the request id, normalizes auth (defaults to `inherit` so folder auth wins), and persists.',\n inputSchema: z.object({\n name: z.string().default('New request'),\n method: HTTP_METHOD.default('GET'),\n url: z.string().default(''),\n folderId: z.string().nullable().optional(),\n headers: z.array(HEADER_OR_QUERY).default([]),\n queryParams: z.array(HEADER_OR_QUERY).default([]),\n pathParams: z.record(z.string(), z.string()).optional(),\n body: REQUEST_BODY.optional(),\n auth: PROMPT_AUTH.optional(),\n assertions: z.array(PROMPT_ASSERTION).default([]),\n }),\n async handler(input, ctx) {\n const now = new Date().toISOString();\n const auth: RequestAuth = (input.auth ?? { type: 'inherit' }) as RequestAuth;\n const assertions: Array<z.infer<typeof PROMPT_ASSERTION>> = input.assertions ?? [];\n const request: ApiRequest = {\n id: generateId(),\n name: input.name ?? 'New request',\n folderId: input.folderId ?? null,\n method: input.method ?? 'GET',\n url: input.url ?? '',\n headers: input.headers ?? [],\n query: input.queryParams ?? [],\n pathParams: input.pathParams,\n body: buildRequestBody(input.body),\n auth,\n contextVars: [],\n extractions: [],\n assertions: assertions.map((a) => ({ ...a, id: generateId() })),\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'request.create', request });\n return { id: request.id, changedIds: out.changedIds };\n },\n};\n\nexport const promptUpdateRequestTool: AnyToolDef = {\n name: 'prompt.update_request',\n description:\n 'Patch an existing request from an LLM-shaped JSON envelope. Provided fields replace the existing values; omitted fields are left untouched. Arrays (headers, queryParams, assertions) are full replacements when supplied. Returns `{ ok: false, error }` when the id does not resolve.',\n inputSchema: z.object({\n id: z.string(),\n patch: z\n .object({\n name: z.string().optional(),\n method: HTTP_METHOD.optional(),\n url: z.string().optional(),\n folderId: z.string().nullable().optional(),\n headers: z.array(HEADER_OR_QUERY).optional(),\n queryParams: z.array(HEADER_OR_QUERY).optional(),\n pathParams: z.record(z.string(), z.string()).optional(),\n body: REQUEST_BODY.optional(),\n auth: PROMPT_AUTH.optional(),\n assertions: z.array(PROMPT_ASSERTION).optional(),\n })\n .strict(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (!state.synced.collections.requests[input.id]) {\n return { ok: false as const, error: 'request not found' as const };\n }\n const patch: Partial<Omit<ApiRequest, 'id' | 'createdAt'>> = {};\n if (input.patch.name !== undefined) patch.name = input.patch.name;\n if (input.patch.method !== undefined) patch.method = input.patch.method;\n if (input.patch.url !== undefined) patch.url = input.patch.url;\n if (input.patch.folderId !== undefined) patch.folderId = input.patch.folderId ?? null;\n if (input.patch.headers !== undefined) patch.headers = input.patch.headers;\n if (input.patch.queryParams !== undefined) patch.query = input.patch.queryParams;\n if (input.patch.pathParams !== undefined) patch.pathParams = input.patch.pathParams;\n if (input.patch.body !== undefined) patch.body = buildRequestBody(input.patch.body);\n if (input.patch.auth !== undefined) patch.auth = input.patch.auth as RequestAuth;\n if (input.patch.assertions !== undefined) {\n patch.assertions = input.patch.assertions.map((a: z.infer<typeof PROMPT_ASSERTION>) => ({\n ...a,\n id: generateId(),\n }));\n }\n const out = await ctx.workspace.apply({ kind: 'request.update', id: input.id, patch });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Folders\n// ---------------------------------------------------------------------------\n\ninterface FolderTreeNode {\n name: string;\n children?: FolderTreeNode[];\n}\n\nconst FOLDER_TREE_NODE: z.ZodType<FolderTreeNode> = z.lazy(() =>\n z.object({\n name: z.string(),\n children: z.array(FOLDER_TREE_NODE).optional(),\n }),\n);\n\nexport const promptCreateFolderTreeTool: AnyToolDef = {\n name: 'prompt.create_folder_tree',\n description:\n 'Create a recursive folder hierarchy from an LLM-shaped JSON envelope. The model produces `{ parentId?, tree: { name, children?: [...] } }` and this tool walks the tree, generating ids and persisting one folder per node. Returns the list of created ids in pre-order.',\n inputSchema: z.object({\n parentId: z.string().nullable().optional(),\n tree: FOLDER_TREE_NODE,\n }),\n async handler(input, ctx) {\n const createdIds: string[] = [];\n const allChangedIds: string[] = [];\n const walk = async (node: FolderTreeNode, parentId: string | null): Promise<void> => {\n const folder: Folder = {\n id: generateId(),\n name: node.name,\n parentId,\n };\n const out = await ctx.workspace.apply({ kind: 'folder.create', folder });\n createdIds.push(folder.id);\n allChangedIds.push(...out.changedIds);\n for (const child of node.children ?? []) {\n await walk(child, folder.id);\n }\n };\n await walk(input.tree, input.parentId ?? null);\n return { createdIds, changedIds: allChangedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Plans\n// ---------------------------------------------------------------------------\n\nexport const promptAddPlanStepsTool: AnyToolDef = {\n name: 'prompt.add_plan_steps',\n description:\n 'Append one or more steps to an existing execution plan from an LLM-shaped JSON envelope. The model produces `{ planId, requestIds: [...] }`; each id is validated against the workspace before any step is appended. Order in the input list is preserved.',\n inputSchema: z.object({\n planId: z.string(),\n requestIds: z.array(z.string()).min(1),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n const requestIds: string[] = input.requestIds;\n const missing = requestIds.filter((rid) => !state.synced.collections.requests[rid]);\n if (missing.length) {\n return {\n ok: false as const,\n error: `Unknown request ids: ${missing.join(', ')}`,\n missing,\n };\n }\n const newSteps = requestIds.map((requestId) => ({ requestId }));\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: {\n ...plan,\n steps: [...plan.steps, ...newSteps],\n updatedAt: new Date().toISOString(),\n },\n });\n return { ok: true as const, addedCount: newSteps.length, changedIds: out.changedIds };\n },\n};\n\nexport const promptSetPlanVariablesTool: AnyToolDef = {\n name: 'prompt.set_plan_variables',\n description:\n 'Replace the plan-scoped variables on an execution plan from an LLM-shaped JSON envelope. The model produces `{ planId, variables: [{ key, value }] }`. Empty array clears all plan variables.',\n inputSchema: z.object({\n planId: z.string(),\n variables: z.array(z.object({ key: z.string(), value: z.string() })),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, variables: input.variables, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Mocks\n// ---------------------------------------------------------------------------\n\nexport const promptCreateMockServerTool: AnyToolDef = {\n name: 'prompt.create_mock_server',\n description:\n 'Create a manual-mode mock server with optional inline endpoints from an LLM-shaped JSON envelope. The model produces `{ name, defaultPort?, endpoints: [{ method, pathPattern, name?, response?, validationRules?, responseRules?, multipliers? }] }`; this tool generates ids for the server and every endpoint / rule, then persists in one shot.',\n inputSchema: z.object({\n name: z.string().min(1),\n defaultPort: z.number().int().positive().nullable().optional(),\n endpoints: z.array(ENDPOINT_INPUT).default([]),\n }),\n async handler(input, ctx) {\n const now = new Date().toISOString();\n const endpointInputs: Array<z.infer<typeof ENDPOINT_INPUT>> = input.endpoints ?? [];\n const endpoints = endpointInputs.map((e) => buildEndpoint(e));\n const mock: MockServer = {\n id: generateId(),\n name: input.name,\n source: { kind: 'manual', endpoints },\n endpoints,\n defaultPort: input.defaultPort ?? null,\n cors: { enabled: true, origins: ['*'] },\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointIds: endpoints.map((e: MockEndpoint) => e.id),\n changedIds: out.changedIds,\n };\n },\n};\n\nexport const promptAddMockEndpointTool: AnyToolDef = {\n name: 'prompt.add_mock_endpoint',\n description:\n 'Append a new endpoint (with optional inline validation rules, response rules, and multipliers) to an existing mock server from an LLM-shaped JSON envelope. All ids are auto-generated; the existing endpoints stay in place.',\n inputSchema: z.object({\n mockId: z.string(),\n method: HTTP_METHOD,\n pathPattern: z.string().min(1),\n name: z.string().optional(),\n description: z.string().optional(),\n response: ENDPOINT_RESPONSE.optional(),\n validationRules: z.array(VALIDATION_RULE_NL).default([]),\n responseRules: z.array(RESPONSE_RULE_NL).default([]),\n multipliers: z.array(MULTIPLIER_NL).default([]),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const endpoint = buildEndpoint(input);\n const nextEndpoints = [...mock.endpoints, endpoint];\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n const next: MockServer = {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, endpointId: endpoint.id, changedIds: out.changedIds };\n },\n};\n\nexport const promptSetEndpointValidationRulesTool: AnyToolDef = {\n name: 'prompt.set_endpoint_validation_rules',\n description:\n \"Replace an endpoint's validation rules with an LLM-shaped list. Every rule gets a fresh id; the existing rules are dropped. Empty array clears all validation rules.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n rules: z.array(VALIDATION_RULE_NL),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const rules: Array<z.infer<typeof VALIDATION_RULE_NL>> = input.rules;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n requestValidation: rules.map((r) => ({\n id: generateId(),\n kind: r.kind,\n target: r.target,\n expected: r.expected,\n message: r.message,\n enabled: r.enabled,\n failResponse: {\n status: r.failResponse.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: r.failResponse.jsonBody },\n },\n })),\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const promptSetEndpointResponseRulesTool: AnyToolDef = {\n name: 'prompt.set_endpoint_response_rules',\n description:\n \"Replace an endpoint's conditional response rules with an LLM-shaped list. Rules fire in order, first match wins. Every rule + clause gets a fresh id. Empty array falls back to defaultResponse.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n rules: z.array(RESPONSE_RULE_NL),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const rules: Array<z.infer<typeof RESPONSE_RULE_NL>> = input.rules;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n responseRules: rules.map((r) => ({\n id: generateId(),\n name: r.name,\n enabled: r.enabled,\n when: r.when.map((c: z.infer<typeof CONDITION_CLAUSE_NL>) => ({\n id: generateId(),\n scope: c.scope,\n target: c.target,\n op: c.op,\n value: c.value,\n })),\n response: {\n status: r.response.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: r.response.jsonBody },\n },\n })),\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const promptSetEndpointMultipliersTool: AnyToolDef = {\n name: 'prompt.set_endpoint_multipliers',\n description:\n \"Replace the response multipliers on an endpoint's defaultResponse with an LLM-shaped list. Multipliers expand an array at `targetJsonPath` to a count derived from a request value. Every multiplier gets a fresh id. Empty array clears all multipliers.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n multipliers: z.array(MULTIPLIER_NL),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const multipliers: Array<z.infer<typeof MULTIPLIER_NL>> = input.multipliers;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n defaultResponse: {\n ...e.defaultResponse,\n multipliers:\n multipliers.length === 0\n ? undefined\n : multipliers.map((m) => ({\n id: generateId(),\n name: m.name,\n source: { kind: m.source.kind, key: m.source.key },\n targetJsonPath: m.targetJsonPath,\n defaultCount: m.defaultCount,\n min: m.min,\n max: m.max,\n })),\n },\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n","import { z } from 'zod';\nimport type {\n MockEndpoint,\n MockResponseConfig,\n MockServer,\n MockServerSource,\n} from '@apicircle/shared';\nimport { generateId, makeDefaultMockResponse, makeDefaultRequestSchema } from '@apicircle/shared';\nimport { parseSourceToEndpoints } from '@apicircle/mock-server-core';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// Mock-server tools. Definitions live in `synced.mockServers` (push to git);\n// `mock.start` / `mock.stop` go through the MockController so the MCP host's\n// environment (Electron main, CLI, hosted) controls the actual lifecycle.\n// =============================================================================\n\nasync function ingestSource(\n source: MockServerSource,\n name: string,\n): Promise<{ mock: MockServer; warnings: string[] }> {\n const { endpoints, warnings } = await parseSourceToEndpoints(source);\n const now = new Date().toISOString();\n const mock: MockServer = {\n id: generateId(),\n name,\n source,\n endpoints,\n defaultPort: null,\n // Off by default — match UI-created mocks. User opts in via cors.enabled=true\n // after explicitly listing origins (see CorsSection in MockServersPanel).\n cors: { enabled: false, origins: [] },\n createdAt: now,\n updatedAt: now,\n };\n return { mock, warnings };\n}\n\nexport const mockCreateFromOpenApiTool: AnyToolDef = {\n name: 'mock.create_from_openapi',\n description: 'Create a mock server from an OpenAPI / Swagger spec (YAML or JSON).',\n inputSchema: z.object({\n name: z.string(),\n spec: z.string().min(1),\n format: z.enum(['json', 'yaml']).default('json'),\n }),\n async handler(input, ctx) {\n const { mock, warnings } = await ingestSource(\n { kind: 'openapi', spec: input.spec, format: input.format },\n input.name,\n );\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointCount: mock.endpoints.length,\n changedIds: out.changedIds,\n warnings,\n };\n },\n};\n\nexport const mockCreateFromPostmanTool: AnyToolDef = {\n name: 'mock.create_from_postman',\n description: 'Create a mock server from a Postman v2/v2.1 collection.',\n inputSchema: z.object({ name: z.string(), collection: z.string().min(1) }),\n async handler(input, ctx) {\n const { mock, warnings } = await ingestSource(\n { kind: 'postman', collection: input.collection },\n input.name,\n );\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointCount: mock.endpoints.length,\n changedIds: out.changedIds,\n warnings,\n };\n },\n};\n\nexport const mockCreateFromInsomniaTool: AnyToolDef = {\n name: 'mock.create_from_insomnia',\n description: 'Create a mock server from an Insomnia v4 export.',\n inputSchema: z.object({ name: z.string(), export: z.string().min(1) }),\n async handler(input, ctx) {\n const { mock, warnings } = await ingestSource(\n { kind: 'insomnia', export: input.export },\n input.name,\n );\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointCount: mock.endpoints.length,\n changedIds: out.changedIds,\n warnings,\n };\n },\n};\n\n// Postman has its own \"mock collection\" concept — same parser, but we tag\n// the source so the UI can label it differently in the mock list.\nexport const mockImportPostmanMockCollectionTool: AnyToolDef = {\n name: 'mock.import_postman_mock_collection',\n description:\n \"Import a Postman Mock Collection (collections previously hosted on Postman's mock service). Same parser as a regular Postman collection but marked as a mock import.\",\n inputSchema: z.object({ name: z.string(), collection: z.string().min(1) }),\n async handler(input, ctx) {\n const { mock, warnings } = await ingestSource(\n { kind: 'postman', collection: input.collection },\n input.name,\n );\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointCount: mock.endpoints.length,\n changedIds: out.changedIds,\n warnings,\n };\n },\n};\n\nexport const mockListTool: AnyToolDef = {\n name: 'mock.list',\n description:\n 'List all mock servers in the workspace plus their runtime status (running / stopped, port).',\n inputSchema: z.object({}),\n async handler(_input, ctx) {\n const state = await ctx.workspace.read();\n const running = await ctx.mock.list();\n const runningById = new Map(running.map((r) => [r.serverId, r.runtime]));\n const items = Object.values(state.synced.mockServers).map((m) => {\n const runtime = runningById.get(m.id);\n return {\n id: m.id,\n name: m.name,\n endpointCount: m.endpoints.length,\n defaultPort: m.defaultPort,\n running: !!runtime,\n port: runtime?.port ?? null,\n };\n });\n return { count: items.length, mocks: items };\n },\n};\n\nexport const mockStartTool: AnyToolDef = {\n name: 'mock.start',\n description:\n 'Start a mock server by id. Returns the bound port. Errors if the mock is already running or the requested port is in use.',\n inputSchema: z.object({\n id: z.string(),\n port: z.number().int().positive().optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.id];\n if (!mock) return { ok: false, error: 'mock not found' };\n try {\n const result = await ctx.mock.start(mock, { port: input.port });\n return { ok: true, port: result.port, pid: result.pid, startedAt: result.startedAt };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : 'mock.start failed' };\n }\n },\n};\n\nexport const mockStopTool: AnyToolDef = {\n name: 'mock.stop',\n description: 'Stop a running mock server by id (no-op if not running).',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n try {\n await ctx.mock.stop(input.id);\n return { ok: true };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : 'mock.stop failed' };\n }\n },\n};\n\nexport const mockDeleteTool: AnyToolDef = {\n name: 'mock.delete',\n description: \"Delete a mock server definition. Stops it first if it's running.\",\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n try {\n await ctx.mock.stop(input.id);\n } catch {\n // best-effort stop; deletion proceeds either way\n }\n const out = await ctx.workspace.apply({ kind: 'mock.delete', id: input.id });\n return { ok: true, changedIds: out.changedIds };\n },\n};\n\n// =============================================================================\n// Manual mock construction & endpoint-level CRUD\n// -----------------------------------------------------------------------------\n// `mock.create_manual` mirrors the web UI's \"New mock server\" → manual mode.\n// The endpoint tools below let an MCP client author endpoints + their default\n// responses without needing to round-trip through `workspace.write` with a\n// hand-built blob.\n// =============================================================================\n\nconst HTTP_METHOD = z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']);\n\nexport const mockCreateManualTool: AnyToolDef = {\n name: 'mock.create_manual',\n description:\n 'Create an empty manual-mode mock server. Use `mock.add_endpoint` afterward to populate it. CORS defaults to off (same-origin only); enable + list explicit origins via `mock.update_cors` if cross-origin access is needed.',\n inputSchema: z.object({\n name: z.string().min(1),\n defaultPort: z.number().int().positive().nullable().optional(),\n }),\n async handler(input, ctx) {\n const now = new Date().toISOString();\n const mock: MockServer = {\n id: generateId(),\n name: input.name,\n source: { kind: 'manual', endpoints: [] },\n endpoints: [],\n defaultPort: input.defaultPort ?? null,\n // Off by default — match UI-created mocks. Caller opts in via\n // explicit origins; we never silently wildcard.\n cors: { enabled: false, origins: [] },\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return { id: mock.id, changedIds: out.changedIds };\n },\n};\n\nexport const mockListEndpointsTool: AnyToolDef = {\n name: 'mock.list_endpoints',\n description: 'List endpoints for a mock server (id, method, path, name).',\n inputSchema: z.object({ mockId: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false, error: 'mock not found' as const };\n return {\n ok: true as const,\n count: mock.endpoints.length,\n endpoints: mock.endpoints.map((e) => ({\n id: e.id,\n method: e.method,\n pathPattern: e.pathPattern,\n name: e.name,\n validationCount: e.requestValidation.length,\n responseRuleCount: e.responseRules.length,\n })),\n };\n },\n};\n\nconst ENDPOINT_RESPONSE = z.object({\n status: z.number().int().min(100).max(599).default(200),\n jsonBody: z.string().default('{}'),\n contentType: z.string().default('application/json'),\n});\n\nfunction buildDefaultEndpoint(args: {\n method: z.infer<typeof HTTP_METHOD>;\n pathPattern: string;\n name?: string;\n description?: string;\n response?: z.infer<typeof ENDPOINT_RESPONSE>;\n}): MockEndpoint {\n const response = args.response ?? {\n status: 200,\n jsonBody: '{}',\n contentType: 'application/json',\n };\n const headers = [{ key: 'Content-Type', value: response.contentType, enabled: true as const }];\n return {\n id: generateId(),\n name: args.name ?? `${args.method} ${args.pathPattern}`,\n method: args.method,\n pathPattern: args.pathPattern,\n description: args.description,\n requestSchema: makeDefaultRequestSchema(),\n requestValidation: [],\n responseRules: [],\n defaultResponse: {\n ...makeDefaultMockResponse(),\n status: response.status,\n headers,\n body: { type: 'json', content: response.jsonBody },\n },\n };\n}\n\nexport const mockAddEndpointTool: AnyToolDef = {\n name: 'mock.add_endpoint',\n description:\n 'Append a new endpoint to a mock server. Defaults to a 200 JSON response of `{}`. Returns the new endpoint id.',\n inputSchema: z.object({\n mockId: z.string(),\n method: HTTP_METHOD,\n pathPattern: z.string().min(1),\n name: z.string().optional(),\n description: z.string().optional(),\n response: ENDPOINT_RESPONSE.optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false, error: 'mock not found' as const };\n const endpoint = buildDefaultEndpoint(input);\n const nextEndpoints = [...mock.endpoints, endpoint];\n // Manual-mode mocks mirror endpoints back into source so the runtime\n // sees the same array regardless of which field it reads.\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n const next: MockServer = {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, endpointId: endpoint.id, changedIds: out.changedIds };\n },\n};\n\nexport const mockUpdateEndpointTool: AnyToolDef = {\n name: 'mock.update_endpoint',\n description:\n 'Patch fields on a single mock endpoint (method, pathPattern, name, description, defaultResponse status / contentType / json body). Pass only the fields you want to change.',\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n method: HTTP_METHOD.optional(),\n pathPattern: z.string().optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n response: ENDPOINT_RESPONSE.partial().optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false, error: 'mock not found' as const };\n const idx = mock.endpoints.findIndex((e) => e.id === input.endpointId);\n if (idx === -1) return { ok: false, error: 'endpoint not found' as const };\n const existing = mock.endpoints[idx];\n const nextEndpoint: MockEndpoint = {\n ...existing,\n method: input.method ?? existing.method,\n pathPattern: input.pathPattern ?? existing.pathPattern,\n name: input.name ?? existing.name,\n description: input.description ?? existing.description,\n defaultResponse: input.response\n ? {\n ...existing.defaultResponse,\n status: input.response.status ?? existing.defaultResponse.status,\n headers: input.response.contentType\n ? existing.defaultResponse.headers.map((h) =>\n h.key.toLowerCase() === 'content-type'\n ? { ...h, value: input.response!.contentType! }\n : h,\n )\n : existing.defaultResponse.headers,\n body:\n input.response.jsonBody !== undefined\n ? { type: 'json', content: input.response.jsonBody }\n : existing.defaultResponse.body,\n }\n : existing.defaultResponse,\n };\n const nextEndpoints = [...mock.endpoints];\n nextEndpoints[idx] = nextEndpoint;\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n const next: MockServer = {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const mockDeleteEndpointTool: AnyToolDef = {\n name: 'mock.delete_endpoint',\n description: 'Remove an endpoint from a mock server.',\n inputSchema: z.object({ mockId: z.string(), endpointId: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false, error: 'mock not found' as const };\n const nextEndpoints = mock.endpoints.filter((e) => e.id !== input.endpointId);\n if (nextEndpoints.length === mock.endpoints.length) {\n return { ok: false, error: 'endpoint not found' as const };\n }\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n const next: MockServer = {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\n// =============================================================================\n// Endpoint rule + multiplier editing\n// -----------------------------------------------------------------------------\n// Validation rules, response rules, and multipliers are all replace-only —\n// MCP clients send the full ordered list, the tool writes it. Granular per-\n// rule mutations would multiply the surface area without adding capability;\n// the MCP client can read, mutate, write back.\n// =============================================================================\n\nconst VALIDATION_RULE = z.object({\n id: z.string().optional(),\n kind: z.enum([\n 'header-required',\n 'header-equals',\n 'header-matches',\n 'query-required',\n 'query-equals',\n 'query-matches',\n 'cookie-required',\n 'body-required',\n 'content-type-equals',\n ]),\n target: z.string().default(''),\n expected: z.string().optional(),\n message: z.string().optional(),\n enabled: z.boolean().default(true),\n failResponse: z\n .object({\n status: z.number().int().min(100).max(599).default(400),\n jsonBody: z.string().default('{\"error\":\"validation failed\"}'),\n })\n .default({}),\n});\n\nconst CONDITION_CLAUSE = z.object({\n id: z.string().optional(),\n scope: z.enum(['query', 'pathParam', 'header', 'cookie', 'body-json-path']),\n target: z.string(),\n op: z.enum(['equals', 'not-equals', 'matches', 'gt', 'lt', 'gte', 'lte', 'present', 'absent']),\n value: z.string().optional(),\n});\n\nconst RESPONSE_RULE = z.object({\n id: z.string().optional(),\n name: z.string(),\n enabled: z.boolean().default(true),\n when: z.array(CONDITION_CLAUSE).default([]),\n response: z\n .object({\n status: z.number().int().min(100).max(599).default(200),\n jsonBody: z.string().default('{}'),\n })\n .default({}),\n});\n\nconst MULTIPLIER = z.object({\n id: z.string().optional(),\n name: z.string().optional(),\n source: z.object({\n kind: z.enum(['query', 'pathParam', 'header', 'body-json-path']),\n key: z.string(),\n }),\n targetJsonPath: z.string(),\n defaultCount: z.number().int().nonnegative().default(0),\n min: z.number().int().nonnegative().optional(),\n max: z.number().int().nonnegative().optional(),\n});\n\nfunction defaultJsonResponseConfig(args: { status: number; jsonBody: string }): MockResponseConfig {\n return {\n status: args.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: args.jsonBody },\n };\n}\n\nfunction patchEndpoint(\n mock: MockServer,\n endpointId: string,\n patcher: (e: MockEndpoint) => MockEndpoint,\n): MockServer | null {\n const idx = mock.endpoints.findIndex((e) => e.id === endpointId);\n if (idx === -1) return null;\n const nextEndpoints = [...mock.endpoints];\n nextEndpoints[idx] = patcher(mock.endpoints[idx]);\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n return {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n}\n\nexport const mockSetValidationRulesTool: AnyToolDef = {\n name: 'mock.set_validation_rules',\n description:\n \"Replace an endpoint's validation rules. Rules without an `id` get a fresh one; existing rules can keep theirs to preserve client-side selection state. Empty array clears all rules.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n rules: z.array(VALIDATION_RULE),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const rules: Array<z.infer<typeof VALIDATION_RULE>> = input.rules;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n requestValidation: rules.map((r) => ({\n id: r.id ?? generateId(),\n kind: r.kind,\n target: r.target,\n expected: r.expected,\n message: r.message,\n enabled: r.enabled,\n failResponse: defaultJsonResponseConfig(r.failResponse),\n })),\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const mockSetResponseRulesTool: AnyToolDef = {\n name: 'mock.set_response_rules',\n description:\n \"Replace an endpoint's conditional response rules. Rules fire in order; the first whose every clause matches wins. Disabled rules are skipped. Empty array falls back to defaultResponse.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n rules: z.array(RESPONSE_RULE),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const rules: Array<z.infer<typeof RESPONSE_RULE>> = input.rules;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n responseRules: rules.map((r) => ({\n id: r.id ?? generateId(),\n name: r.name,\n enabled: r.enabled,\n when: r.when.map((c: z.infer<typeof CONDITION_CLAUSE>) => ({\n id: c.id ?? generateId(),\n scope: c.scope,\n target: c.target,\n op: c.op,\n value: c.value,\n })),\n response: defaultJsonResponseConfig(r.response),\n })),\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const mockSetMultipliersTool: AnyToolDef = {\n name: 'mock.set_multipliers',\n description:\n \"Replace the response multipliers on an endpoint's defaultResponse. Multipliers expand an array at `targetJsonPath` to a count derived from a request value. Empty array clears all multipliers.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n multipliers: z.array(MULTIPLIER),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const multipliers: Array<z.infer<typeof MULTIPLIER>> = input.multipliers;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n defaultResponse: {\n ...e.defaultResponse,\n multipliers:\n multipliers.length === 0\n ? undefined\n : multipliers.map((m) => ({\n id: m.id ?? generateId(),\n name: m.name,\n source: { kind: m.source.kind, key: m.source.key },\n targetJsonPath: m.targetJsonPath,\n defaultCount: m.defaultCount,\n min: m.min,\n max: m.max,\n })),\n },\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n","import type { McpToolName } from '@apicircle/shared';\nimport type { AnyToolDef } from './types';\nimport {\n importCurlTool,\n importOpenApiTool,\n importPostmanTool,\n importInsomniaTool,\n importHarTool,\n} from './imports';\nimport { generateCodeTool } from './codegen';\nimport { workspaceListTool } from './workspaceList';\nimport {\n workspaceReadTool,\n workspaceWriteTool,\n requestCreateTool,\n requestReadTool,\n requestUpdateTool,\n requestDeleteTool,\n folderCreateTool,\n folderReadTool,\n folderUpdateTool,\n folderDeleteTool,\n environmentCreateTool,\n environmentReadTool,\n environmentUpdateTool,\n environmentDeleteTool,\n environmentSetActiveTool,\n environmentSetPriorityTool,\n environmentExportTool,\n environmentImportTool,\n planCreateTool,\n planReadTool,\n planUpdateTool,\n planDeleteTool,\n planRunTool,\n planAddStepTool,\n planRemoveStepTool,\n planReorderStepsTool,\n planSetVariablesTool,\n assertionCreateTool,\n assertionReadTool,\n assertionUpdateTool,\n assertionDeleteTool,\n} from './crud';\nimport {\n historyListRunsTool,\n historyGetRunTool,\n historyDeleteRunTool,\n historyPurgeTool,\n} from './history';\nimport { codebaseExtractCollectionTool } from './codebase';\nimport {\n promptCreateEnvironmentTool,\n promptCreateAssertionTool,\n promptCreatePlanTool,\n promptCreateRequestTool,\n promptUpdateRequestTool,\n promptCreateFolderTreeTool,\n promptAddPlanStepsTool,\n promptSetPlanVariablesTool,\n promptCreateMockServerTool,\n promptAddMockEndpointTool,\n promptSetEndpointValidationRulesTool,\n promptSetEndpointResponseRulesTool,\n promptSetEndpointMultipliersTool,\n} from './prompt';\nimport {\n mockCreateFromOpenApiTool,\n mockCreateFromPostmanTool,\n mockCreateFromInsomniaTool,\n mockCreateManualTool,\n mockListTool,\n mockListEndpointsTool,\n mockStartTool,\n mockStopTool,\n mockDeleteTool,\n mockAddEndpointTool,\n mockUpdateEndpointTool,\n mockDeleteEndpointTool,\n mockSetValidationRulesTool,\n mockSetResponseRulesTool,\n mockSetMultipliersTool,\n mockImportPostmanMockCollectionTool,\n} from './mocks';\n\n// Order matches MCP_TOOL_NAMES in `@apicircle/shared/src/mcp.ts`. CI guards\n// drift via the registry test which asserts every catalog entry resolves.\nexport const TOOL_REGISTRY: AnyToolDef[] = [\n importCurlTool,\n importOpenApiTool,\n importPostmanTool,\n importInsomniaTool,\n importHarTool,\n generateCodeTool,\n workspaceListTool,\n workspaceReadTool,\n workspaceWriteTool,\n requestCreateTool,\n requestReadTool,\n requestUpdateTool,\n requestDeleteTool,\n folderCreateTool,\n folderReadTool,\n folderUpdateTool,\n folderDeleteTool,\n environmentCreateTool,\n environmentReadTool,\n environmentUpdateTool,\n environmentDeleteTool,\n environmentSetActiveTool,\n environmentSetPriorityTool,\n environmentExportTool,\n environmentImportTool,\n planCreateTool,\n planRunTool,\n planReadTool,\n planUpdateTool,\n planDeleteTool,\n planAddStepTool,\n planRemoveStepTool,\n planReorderStepsTool,\n planSetVariablesTool,\n assertionCreateTool,\n assertionReadTool,\n assertionUpdateTool,\n assertionDeleteTool,\n historyListRunsTool,\n historyGetRunTool,\n historyDeleteRunTool,\n historyPurgeTool,\n codebaseExtractCollectionTool,\n promptCreateEnvironmentTool,\n promptCreateAssertionTool,\n promptCreatePlanTool,\n promptCreateRequestTool,\n promptUpdateRequestTool,\n promptCreateFolderTreeTool,\n promptAddPlanStepsTool,\n promptSetPlanVariablesTool,\n promptCreateMockServerTool,\n promptAddMockEndpointTool,\n promptSetEndpointValidationRulesTool,\n promptSetEndpointResponseRulesTool,\n promptSetEndpointMultipliersTool,\n mockCreateFromOpenApiTool,\n mockCreateFromPostmanTool,\n mockCreateFromInsomniaTool,\n mockCreateManualTool,\n mockListTool,\n mockListEndpointsTool,\n mockStartTool,\n mockStopTool,\n mockDeleteTool,\n mockAddEndpointTool,\n mockUpdateEndpointTool,\n mockDeleteEndpointTool,\n mockSetValidationRulesTool,\n mockSetResponseRulesTool,\n mockSetMultipliersTool,\n mockImportPostmanMockCollectionTool,\n];\n\nexport function getTool(name: McpToolName): AnyToolDef | undefined {\n return TOOL_REGISTRY.find((t) => t.name === name);\n}\n","import type { WorkspaceProvider } from './WorkspaceProvider';\n\n// =============================================================================\n// Workspaces — multi-workspace surface exposed to tool handlers.\n//\n// Every existing tool consumes `ctx.workspace` (a `WorkspaceProvider` scoped\n// to ONE workspace) and continues to work unchanged. New tools that need to\n// list workspaces or pick a specific one consume `ctx.workspaces` instead.\n//\n// `ctx.workspace` is the *active* workspace's provider — set by the host\n// at construction time and refreshed when `setActive` is called.\n// =============================================================================\n\nexport interface WorkspaceSummary {\n id: string;\n name: string;\n isActive: boolean;\n /** ISO timestamps surfaced from the on-disk registry entry. */\n createdAt: string;\n lastOpenedAt: string;\n /** Cheap counts populated when the summary is built so AI clients can\n * decide which workspace to drill into without a second tool call.\n * May be `null` if the per-workspace doc couldn't be read. */\n counts: {\n requests: number;\n folders: number;\n environments: number;\n mockServers: number;\n plans: number;\n } | null;\n}\n\nexport interface Workspaces {\n /** Enumerate every workspace + which is currently active. */\n list(): Promise<WorkspaceSummary[]>;\n\n /** Return a `WorkspaceProvider` scoped to a specific workspace id. */\n for(workspaceId: string): WorkspaceProvider;\n\n /** id of the workspace that `ctx.workspace` currently points at. */\n activeId(): string | null;\n\n /** Switch which workspace `ctx.workspace` resolves to. */\n setActive(workspaceId: string): Promise<void>;\n}\n\n/**\n * Trivial single-workspace adapter — wraps an existing `WorkspaceProvider`\n * so legacy single-dir hosts can still answer `list()` and `for()` calls.\n * `list()` returns one entry (the active workspace itself); `for(id)` is a\n * passthrough that asserts the id matches.\n */\nexport class SingleWorkspaceAdapter implements Workspaces {\n constructor(\n private readonly provider: WorkspaceProvider,\n private workspaceId: string | null,\n private readonly displayName: string = 'Workspace',\n ) {}\n\n async list(): Promise<WorkspaceSummary[]> {\n const state = await this.provider.read();\n const id = state.synced.workspaceId;\n this.workspaceId = id;\n return [\n {\n id,\n name: this.displayName,\n isActive: true,\n createdAt: state.synced.meta.createdAt,\n lastOpenedAt: state.synced.meta.updatedAt,\n counts: {\n requests: Object.keys(state.synced.collections.requests).length,\n folders: Object.keys(state.synced.collections.folders).length,\n environments: Object.keys(state.synced.environments.items).length,\n mockServers: Object.keys(state.synced.mockServers ?? {}).length,\n plans: Object.keys(state.synced.executionPlans ?? {}).length,\n },\n },\n ];\n }\n\n for(workspaceId: string): WorkspaceProvider {\n if (this.workspaceId && workspaceId !== this.workspaceId) {\n throw new WorkspaceNotFoundError(workspaceId);\n }\n return this.provider;\n }\n\n activeId(): string | null {\n return this.workspaceId;\n }\n\n setActive(workspaceId: string): Promise<void> {\n if (this.workspaceId && workspaceId !== this.workspaceId) {\n throw new WorkspaceNotFoundError(workspaceId);\n }\n return Promise.resolve();\n }\n}\n\nexport class WorkspaceNotFoundError extends Error {\n readonly code = 'workspace-not-found' as const;\n readonly workspaceId: string;\n constructor(workspaceId: string) {\n super(`No workspace with id \"${workspaceId}\" is available on this server.`);\n this.name = 'WorkspaceNotFoundError';\n this.workspaceId = workspaceId;\n }\n}\n","import type { WorkspaceLocal, WorkspaceSynced } from '@apicircle/shared';\nimport type { WorkspacePatch, WorkspaceState } from '@apicircle/core';\nimport { applyMutation } from '@apicircle/core';\nimport type { WorkspaceProvider } from './WorkspaceProvider';\n\n/**\n * Pure in-memory provider. Used for unit tests and any programmatic\n * embedding where the consumer already owns workspace state and just\n * wants to drive the MCP tool catalog without disk or IPC.\n */\nexport class InMemoryWorkspaceProvider implements WorkspaceProvider {\n private state: WorkspaceState;\n\n constructor(initial: WorkspaceState) {\n this.state = initial;\n }\n\n async read(): Promise<WorkspaceState> {\n return this.state;\n }\n\n async apply(patch: WorkspacePatch): Promise<{ state: WorkspaceState; changedIds: string[] }> {\n const out = applyMutation(this.state, patch);\n this.state = out.next;\n return { state: this.state, changedIds: out.changedIds };\n }\n\n async write(next: { synced?: WorkspaceSynced; local?: WorkspaceLocal }): Promise<WorkspaceState> {\n this.state = {\n synced: next.synced ?? this.state.synced,\n local: next.local ?? this.state.local,\n };\n return this.state;\n }\n}\n","import type { WorkspaceLocal, WorkspaceSynced } from '@apicircle/shared';\nimport type { WorkspacePatch, WorkspaceState } from '@apicircle/core';\nimport { applyMutation } from '@apicircle/core';\nimport { loadFromFile, saveToFile, withWorkspace } from '@apicircle/core/workspace/file-backed';\nimport type { WorkspaceProvider } from './WorkspaceProvider';\n\n/**\n * Disk-backed provider used by the standalone CLI and the headless MCP\n * server when launched outside Electron. Each `apply` runs a full\n * load → mutate → save cycle under a `proper-lockfile` advisory lock so\n * concurrent writers (a second CLI invocation, the desktop app on the\n * same workspace) can't clobber each other.\n */\nexport class FileBackedWorkspaceProvider implements WorkspaceProvider {\n constructor(private readonly dir: string) {}\n\n async read(): Promise<WorkspaceState> {\n const out = await loadFromFile(this.dir);\n if (!out) {\n throw new Error(`No workspace found at ${this.dir}`);\n }\n return out;\n }\n\n async apply(patch: WorkspacePatch): Promise<{ state: WorkspaceState; changedIds: string[] }> {\n let captured: { state: WorkspaceState; changedIds: string[] } | null = null;\n await withWorkspace(this.dir, async (state) => {\n const result = applyMutation(state, patch);\n captured = { state: result.next, changedIds: result.changedIds };\n return { next: result.next };\n });\n if (!captured) throw new Error('apply did not run');\n return captured;\n }\n\n async write(next: { synced?: WorkspaceSynced; local?: WorkspaceLocal }): Promise<WorkspaceState> {\n const current = await this.read();\n const merged: WorkspaceState = {\n synced: next.synced ?? current.synced,\n local: next.local ?? current.local,\n };\n await saveToFile(this.dir, merged);\n return merged;\n }\n}\n","import {\n loadRegistry,\n loadWorkspaceById,\n saveRegistry,\n setActiveWorkspace as setActiveWorkspaceOnDisk,\n workspaceDirFor,\n type WorkspaceRegistry,\n} from '@apicircle/core/workspace/registry';\nimport { FileBackedWorkspaceProvider } from './FileBackedWorkspaceProvider';\nimport type { WorkspaceProvider } from './WorkspaceProvider';\nimport { WorkspaceNotFoundError, type WorkspaceSummary, type Workspaces } from './Workspaces';\n\n// =============================================================================\n// MultiWorkspaceProvider — `Workspaces` impl backed by a registry root on\n// disk (`<root>/registry.json` + per-id subdirectories). Wraps a\n// `FileBackedWorkspaceProvider` per active id and rebuilds it whenever the\n// active workspace changes.\n//\n// Used by the MCP server when launched against a registry root (the\n// desktop's `userData/workspaces/`). Tools that consume `ctx.workspace`\n// keep working — they always see the current active workspace; tools that\n// consume `ctx.workspaces` can drill into any registered workspace.\n// =============================================================================\n\nexport class MultiWorkspaceProvider implements Workspaces {\n private active: WorkspaceProvider | null = null;\n private activeWorkspaceId: string | null = null;\n\n constructor(private readonly registryRoot: string) {}\n\n /**\n * Hydrate the active provider from disk. Must be called once before the\n * MCP host boots so `ctx.workspace.read()` doesn't race the first\n * registry-load. Returns the registry the boot can log.\n */\n async init(): Promise<WorkspaceRegistry> {\n const registry = (await loadRegistry(this.registryRoot)) ?? {\n schemaVersion: 1 as const,\n activeWorkspaceId: null,\n workspaces: [],\n };\n if (registry.activeWorkspaceId) {\n this.activeWorkspaceId = registry.activeWorkspaceId;\n this.active = new FileBackedWorkspaceProvider(\n workspaceDirFor(this.registryRoot, registry.activeWorkspaceId),\n );\n }\n return registry;\n }\n\n /** The provider tool handlers see as `ctx.workspace`. */\n activeProvider(): WorkspaceProvider {\n if (!this.active) {\n throw new Error(\n 'No active workspace. Open the desktop app at least once, or run `apicircle workspaces create <name>`.',\n );\n }\n return this.active;\n }\n\n // ─── Workspaces interface ──────────────────────────────────────────────────\n\n async list(): Promise<WorkspaceSummary[]> {\n const registry = (await loadRegistry(this.registryRoot)) ?? {\n schemaVersion: 1 as const,\n activeWorkspaceId: null,\n workspaces: [],\n };\n const out: WorkspaceSummary[] = [];\n for (const entry of registry.workspaces) {\n let counts: WorkspaceSummary['counts'] = null;\n try {\n const state = await loadWorkspaceById(this.registryRoot, entry.id);\n if (state) {\n counts = {\n requests: Object.keys(state.synced.collections.requests).length,\n folders: Object.keys(state.synced.collections.folders).length,\n environments: Object.keys(state.synced.environments.items).length,\n mockServers: Object.keys(state.synced.mockServers ?? {}).length,\n plans: Object.keys(state.synced.executionPlans ?? {}).length,\n };\n }\n } catch {\n // Treat a missing / unreadable per-workspace file as null counts.\n counts = null;\n }\n out.push({\n id: entry.id,\n name: entry.name,\n isActive: entry.id === registry.activeWorkspaceId,\n createdAt: entry.createdAt,\n lastOpenedAt: entry.lastOpenedAt,\n counts,\n });\n }\n return out;\n }\n\n for(workspaceId: string): WorkspaceProvider {\n return new FileBackedWorkspaceProvider(workspaceDirFor(this.registryRoot, workspaceId));\n }\n\n activeId(): string | null {\n return this.activeWorkspaceId;\n }\n\n async setActive(workspaceId: string): Promise<void> {\n const registry = await loadRegistry(this.registryRoot);\n if (!registry || !registry.workspaces.some((w) => w.id === workspaceId)) {\n throw new WorkspaceNotFoundError(workspaceId);\n }\n const next = await setActiveWorkspaceOnDisk(this.registryRoot, workspaceId);\n void next;\n this.activeWorkspaceId = workspaceId;\n this.active = new FileBackedWorkspaceProvider(workspaceDirFor(this.registryRoot, workspaceId));\n }\n\n /**\n * Idempotent registry write — used by tests / tools that need to\n * persist registry updates that didn't go through `setActive`.\n */\n async writeRegistry(registry: WorkspaceRegistry): Promise<void> {\n await saveRegistry(this.registryRoot, registry);\n this.activeWorkspaceId = registry.activeWorkspaceId;\n if (registry.activeWorkspaceId) {\n this.active = new FileBackedWorkspaceProvider(\n workspaceDirFor(this.registryRoot, registry.activeWorkspaceId),\n );\n }\n }\n}\n","import type { MockServer, MockRuntimeEntry } from '@apicircle/shared';\nimport {\n startMockServer,\n stopMockServer,\n type MockServerHandle,\n} from '@apicircle/mock-server-core';\nimport type { MockController, StartMockResult } from './MockController';\n\n/**\n * MockController implementation that owns its mock processes directly via\n * `@apicircle/mock-server-core`. Used by the CLI and any embedder that\n * wants the simplest possible setup. The desktop app supplies a\n * different controller (process-bridge to its main process) so renderer-\n * side state stays consistent.\n */\nexport class InProcessMockController implements MockController {\n private readonly handles = new Map<string, MockServerHandle>();\n private readonly meta = new Map<string, MockRuntimeEntry>();\n\n async start(server: MockServer, opts: { port?: number } = {}): Promise<StartMockResult> {\n if (this.handles.has(server.id)) {\n throw new Error(`Mock '${server.id}' is already running`);\n }\n const handle = await startMockServer(server, {\n port: opts.port ?? server.defaultPort ?? undefined,\n });\n const runtime: MockRuntimeEntry = {\n port: handle.port,\n pid: process.pid,\n startedAt: new Date().toISOString(),\n lastError: null,\n requestCount: 0,\n };\n this.handles.set(server.id, handle);\n this.meta.set(server.id, runtime);\n return { port: handle.port, pid: runtime.pid, startedAt: runtime.startedAt };\n }\n\n async stop(serverId: string): Promise<void> {\n const handle = this.handles.get(serverId);\n if (!handle) return;\n await stopMockServer(handle);\n this.handles.delete(serverId);\n this.meta.delete(serverId);\n }\n\n async list(): Promise<Array<{ serverId: string; runtime: MockRuntimeEntry }>> {\n return Array.from(this.meta.entries()).map(([serverId, runtime]) => ({\n serverId,\n runtime,\n }));\n }\n}\n","import { McpHost } from './host/McpHost';\nimport { TOOL_REGISTRY } from './tools/registry';\nimport type { WorkspaceProvider } from './providers/WorkspaceProvider';\nimport type { MockController } from './providers/MockController';\nimport type { AnyToolDef } from './tools/types';\nimport { SingleWorkspaceAdapter, type Workspaces } from './providers/Workspaces';\n\n// Public API for `@apicircle/mcp-server`.\n//\n// The host is intentionally non-opinionated about *where* the workspace and\n// mock runtime live — pass in the right provider for your environment:\n//\n// • CLI / headless (single workspace) → FileBackedWorkspaceProvider\n// • CLI / headless (multi-workspace) → MultiWorkspaceProvider\n// • Electron desktop → IpcWorkspaceProvider\n// • Embedded test / demo → InMemoryWorkspaceProvider\n\nexport { McpHost } from './host/McpHost';\nexport { TOOL_REGISTRY, getTool } from './tools/registry';\nexport type { AnyToolDef, ToolDef, ToolHandlerContext } from './tools/types';\nexport type { WorkspaceProvider } from './providers/WorkspaceProvider';\nexport type { MockController, StartMockResult } from './providers/MockController';\nexport {\n SingleWorkspaceAdapter,\n WorkspaceNotFoundError,\n type WorkspaceSummary,\n type Workspaces,\n} from './providers/Workspaces';\nexport { InMemoryWorkspaceProvider } from './providers/InMemoryWorkspaceProvider';\nexport { FileBackedWorkspaceProvider } from './providers/FileBackedWorkspaceProvider';\nexport { MultiWorkspaceProvider } from './providers/MultiWorkspaceProvider';\nexport { InProcessMockController } from './providers/InProcessMockController';\n\nexport interface CreateMcpServerOptions {\n /**\n * Provider for the ACTIVE workspace. Tools that consume `ctx.workspace`\n * see this directly. When you pass a `MultiWorkspaceProvider`, use its\n * `activeProvider()` here.\n */\n workspace: WorkspaceProvider;\n /**\n * Optional multi-workspace surface. When omitted, the host wraps\n * `workspace` in a `SingleWorkspaceAdapter` so `workspace.list` and the\n * multi-workspace envelope still work (with one entry).\n */\n workspaces?: Workspaces;\n mock: MockController;\n /** Override the registered tool list. Defaults to `TOOL_REGISTRY`. */\n tools?: AnyToolDef[];\n serverInfo?: { name: string; version: string };\n}\n\n/**\n * Build a fully-wired McpHost ready to `await host.connect()` over stdio.\n * Tool implementations come from `TOOL_REGISTRY` by default; pass `tools`\n * to inject a curated subset (useful for tests or for hosting only the\n * import surface).\n */\nexport function createMcpServer(options: CreateMcpServerOptions): McpHost {\n const workspaces =\n options.workspaces ??\n new SingleWorkspaceAdapter(options.workspace, null /* discovered on first list() */);\n return new McpHost({\n serverInfo: options.serverInfo,\n tools: options.tools ?? TOOL_REGISTRY,\n context: {\n workspace: options.workspace,\n workspaces,\n mock: options.mock,\n },\n });\n}\n","import * as path from 'node:path';\nimport { promises as fs } from 'node:fs';\nimport { formatHelp, hasHelpFlag, hasVersionFlag } from './args';\nimport { MCP_PACKAGE_VERSION } from '../packageVersion';\n\n// =============================================================================\n// stdio entry point — published as the `apicircle-mcp` bin. Reads the\n// workspace path from `--workspace <dir>` (or the `APICIRCLE_WORKSPACE` env\n// var) and connects to stdio so the parent AI client (Claude Desktop, ChatGPT,\n// Cursor, etc) can drive the tool catalog.\n//\n// The `<dir>` can be either:\n//\n// • a **registry root** (contains `registry.json`) — multi-workspace mode;\n// the server exposes every workspace via `workspace.list` and defaults\n// reads/writes to the active workspace.\n// • a **single-workspace dir** (contains `workspace.synced.json`) —\n// legacy mode kept for one-off / CI flows.\n//\n// Errors during boot are written to stderr and exit with a non-zero code;\n// errors during tool calls are returned in-protocol as `isError: true` so\n// the AI client can surface them without losing the connection.\n// =============================================================================\n\nfunction getWorkspaceDir(): string {\n const argIdx = process.argv.indexOf('--workspace');\n if (argIdx !== -1 && process.argv[argIdx + 1]) {\n return path.resolve(process.argv[argIdx + 1]);\n }\n const env = process.env.APICIRCLE_WORKSPACE;\n if (env) return path.resolve(env);\n return path.resolve(process.cwd());\n}\n\nasync function fileExists(p: string): Promise<boolean> {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n if (hasVersionFlag(args)) {\n process.stdout.write(`${MCP_PACKAGE_VERSION}\\n`);\n return;\n }\n if (hasHelpFlag(args)) {\n process.stdout.write(formatHelp());\n return;\n }\n\n const [\n { createMcpServer },\n { FileBackedWorkspaceProvider },\n { MultiWorkspaceProvider },\n { InProcessMockController },\n { SingleWorkspaceAdapter },\n ] = await Promise.all([\n import('../index'),\n import('../providers/FileBackedWorkspaceProvider'),\n import('../providers/MultiWorkspaceProvider'),\n import('../providers/InProcessMockController'),\n import('../providers/Workspaces'),\n ]);\n\n const dir = getWorkspaceDir();\n const registryPath = path.join(dir, 'registry.json');\n const isRegistryRoot = await fileExists(registryPath);\n\n const mock = new InProcessMockController();\n\n if (isRegistryRoot) {\n const workspaces = new MultiWorkspaceProvider(dir);\n const registry = await workspaces.init();\n if (!registry.activeWorkspaceId) {\n process.stderr.write(\n `apicircle-mcp: registry at ${dir} has no active workspace. ` +\n 'Open the desktop app once, or run `apicircle workspaces create <name>`.\\n',\n );\n process.exit(1);\n }\n const workspace = workspaces.activeProvider();\n const host = createMcpServer({ workspace, workspaces, mock });\n process.stderr.write(\n `apicircle-mcp: multi-workspace mode · ${registry.workspaces.length} workspace(s) · active=${registry.activeWorkspaceId}\\n`,\n );\n await host.connect();\n return;\n }\n\n // Legacy single-workspace boot.\n const workspace = new FileBackedWorkspaceProvider(dir);\n const workspaces = new SingleWorkspaceAdapter(workspace, null);\n const host = createMcpServer({ workspace, workspaces, mock });\n process.stderr.write(`apicircle-mcp: single-workspace mode · ${dir}\\n`);\n await host.connect();\n // Stdio transport keeps the process alive until the client disconnects.\n}\n\nmain().catch((err) => {\n process.stderr.write(\n `apicircle-mcp boot error: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n process.exit(1);\n});\n","export function hasVersionFlag(args: readonly string[]): boolean {\n return args.some((arg) => arg === '--version' || arg === '-v' || arg === '-V');\n}\n\nexport function hasHelpFlag(args: readonly string[]): boolean {\n return args.some((arg) => arg === '--help' || arg === '-h' || arg === 'help');\n}\n\nexport function formatHelp(): string {\n return `Usage: apicircle-mcp [options]\n\nStarts the API Circle MCP stdio server for AI clients.\n\nOptions:\n --workspace <dir> Registry root or single-workspace directory.\n Defaults to APICIRCLE_WORKSPACE, then the current directory.\n -v, -V, --version Print the version number.\n -h, --help Show help.\n\nExamples:\n apicircle-mcp\n apicircle-mcp --workspace ./api-circle-workspaces\n`;\n}\n"],"mappings":"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","names":["import_zod","import_zod","import_zod","import_zod","import_shared","state","import_zod","import_zod","import_zod","import_shared","HTTP_METHOD","patchEndpoint","import_zod","import_shared","import_mock_server_core","HTTP_METHOD","ENDPOINT_RESPONSE","import_core","import_core","setActiveWorkspaceOnDisk","import_mock_server_core","fs","createMcpServer","FileBackedWorkspaceProvider","MultiWorkspaceProvider","InProcessMockController","SingleWorkspaceAdapter","workspaces","workspace","host"]}
1
+ {"version":3,"sources":["../../package.json","../../src/packageVersion.ts","../../src/host/McpHost.ts","../../src/tools/imports.ts","../../src/tools/codegen.ts","../../src/tools/workspaceList.ts","../../src/tools/crud.ts","../../src/tools/folderExchange.ts","../../src/tools/history.ts","../../src/tools/codebase.ts","../../src/tools/prompt.ts","../../src/tools/mocks.ts","../../src/tools/registry.ts","../../src/providers/Workspaces.ts","../../src/providers/InMemoryWorkspaceProvider.ts","../../src/providers/FileBackedWorkspaceProvider.ts","../../src/providers/MultiWorkspaceProvider.ts","../../src/providers/InProcessMockController.ts","../../src/index.ts","../../src/bin/mcp-server.ts","../../src/bin/args.ts"],"sourcesContent":["{\n \"name\": \"@apicircle/mcp-server\",\n \"version\": \"1.0.7\",\n \"private\": false,\n \"type\": \"module\",\n \"description\": \"Model Context Protocol server exposing API Circle Studio's workspace as a tool catalog. Used by Claude Desktop, ChatGPT, Cursor, GitHub Copilot, and any other MCP-compatible AI client.\",\n \"keywords\": [\n \"apicircle\",\n \"api\",\n \"api-circle\",\n \"mcp\",\n \"mcp-server\",\n \"model-context-protocol\",\n \"ai\",\n \"llm\",\n \"agent\",\n \"tool-catalog\",\n \"claude\",\n \"claude-desktop\",\n \"chatgpt\",\n \"cursor\",\n \"copilot\",\n \"continue\",\n \"cline\",\n \"zed\",\n \"windsurf\",\n \"openapi\",\n \"postman\",\n \"api-tools\"\n ],\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/apicircle/studio.git\",\n \"directory\": \"packages/mcp-server\"\n },\n \"homepage\": \"https://github.com/apicircle/studio#readme\",\n \"bugs\": \"https://github.com/apicircle/studio/issues\",\n \"engines\": {\n \"node\": \">=20\"\n },\n \"main\": \"./src/index.ts\",\n \"types\": \"./src/index.ts\",\n \"bin\": {\n \"apicircle-mcp\": \"./dist/bin/mcp-server.cjs\"\n },\n \"exports\": {\n \".\": \"./src/index.ts\"\n },\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.cts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n }\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"check\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"clean\": \"rm -rf dist node_modules\"\n },\n \"dependencies\": {\n \"@apicircle/core\": \"workspace:*\",\n \"@apicircle/mock-server-core\": \"workspace:*\",\n \"@apicircle/shared\": \"workspace:*\",\n \"@modelcontextprotocol/sdk\": \"^1.0.0\",\n \"zod\": \"^3.23.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^20.0.0\",\n \"tsup\": \"^8.3.0\",\n \"typescript\": \"^5.4.0\",\n \"vitest\": \"^2.0.0\"\n }\n}\n","import packageJson from '../package.json';\n\nexport function readPackageVersion(): string {\n const version = (packageJson as { version?: unknown }).version;\n if (typeof version !== 'string' || version.length === 0) {\n throw new Error('Unable to read @apicircle/mcp-server package version');\n }\n return version;\n}\n\nexport const MCP_PACKAGE_VERSION = readPackageVersion();\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport { z } from 'zod';\nimport type { AnyToolDef, ToolHandlerContext } from '../tools/types';\nimport { MCP_PACKAGE_VERSION } from '../packageVersion';\n\n// =============================================================================\n// McpHost — wraps `@modelcontextprotocol/sdk`'s `McpServer`. The thin layer\n// here exists so we can swap SDK versions or transports without touching\n// every tool. Each ToolDef is registered with the SDK's high-level\n// `registerTool(name, { description, inputSchema }, cb)` API.\n//\n// `inputSchema` is a Zod object on our side; the SDK wants a raw shape\n// (object of fields → schema), so we extract `.shape` when registering.\n// =============================================================================\n\nconst PACKAGE_NAME = 'apicircle-mcp';\n\nexport interface McpHostOptions {\n serverInfo?: { name: string; version: string };\n context: ToolHandlerContext;\n tools: AnyToolDef[];\n}\n\nexport class McpHost {\n readonly server: McpServer;\n private readonly tools: AnyToolDef[];\n private readonly context: ToolHandlerContext;\n\n constructor(options: McpHostOptions) {\n this.server = new McpServer({\n name: options.serverInfo?.name ?? PACKAGE_NAME,\n version: options.serverInfo?.version ?? MCP_PACKAGE_VERSION,\n });\n this.tools = options.tools;\n this.context = options.context;\n this.registerAll();\n }\n\n private registerAll(): void {\n for (const tool of this.tools) {\n const shape = isZodObject(tool.inputSchema) ? tool.inputSchema.shape : undefined;\n this.server.registerTool(\n tool.name,\n {\n description: tool.description,\n ...(shape ? { inputSchema: shape } : {}),\n },\n async (args: unknown) => {\n try {\n const parsed = tool.inputSchema.parse(args ?? {});\n const result = await tool.handler(parsed, this.context);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (err) {\n return {\n isError: true,\n content: [\n {\n type: 'text' as const,\n text: formatError(err),\n },\n ],\n };\n }\n },\n );\n }\n }\n\n /** Connect the underlying server to a transport (defaults to stdio). */\n async connect(transport?: Transport): Promise<void> {\n await this.server.connect(transport ?? new StdioServerTransport());\n }\n\n async close(): Promise<void> {\n await this.server.close();\n }\n}\n\nfunction isZodObject(schema: unknown): schema is z.ZodObject<z.ZodRawShape> {\n return schema instanceof z.ZodObject;\n}\n\nfunction formatError(err: unknown): string {\n if (err instanceof z.ZodError) {\n return `Validation failed: ${err.issues\n .map((i) => `${i.path.join('.') || '<root>'}: ${i.message}`)\n .join('; ')}`;\n }\n if (err instanceof Error) return err.message;\n return String(err);\n}\n","import { z } from 'zod';\nimport type { Request as ApiRequest } from '@apicircle/shared';\nimport { generateId } from '@apicircle/shared';\nimport { parseCurl } from '@apicircle/core';\nimport {\n parseOpenApiToEndpoints,\n parsePostmanToEndpoints,\n parseInsomniaToEndpoints,\n} from '@apicircle/mock-server-core';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// Import tools — convert external request descriptions into one or more\n// requests in the workspace. Each tool persists to the workspace and returns\n// the created request ids so the AI client can reference them in follow-up\n// turns.\n// =============================================================================\n\nconst FALLBACK_NAME = (idx: number, fallback: string): string =>\n fallback || `Imported request ${idx + 1}`;\n\nfunction blankRequest(): Omit<ApiRequest, 'id' | 'createdAt' | 'updatedAt'> {\n return {\n name: 'Imported request',\n folderId: null,\n method: 'GET',\n url: '',\n headers: [],\n query: [],\n body: { type: 'none', content: '' },\n auth: { type: 'none' },\n contextVars: [],\n extractions: [],\n assertions: [],\n };\n}\n\nexport const importCurlTool: AnyToolDef = {\n name: 'import.curl',\n description: 'Parse a `curl ...` command into a Request and persist it to the workspace.',\n inputSchema: z.object({\n curl: z.string().min(1, 'curl command is required'),\n name: z.string().optional(),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const parsed = parseCurl(input.curl);\n const now = new Date().toISOString();\n const request: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: input.name?.trim() || `cURL ${parsed.method} ${parsed.url}`.slice(0, 80),\n method: parsed.method,\n url: parsed.url,\n headers: parsed.headers,\n query: parsed.query,\n body: parsed.body,\n auth: parsed.auth,\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'request.create', request });\n return {\n id: request.id,\n warnings: parsed.warnings,\n changedIds: out.changedIds,\n };\n },\n};\n\nexport const importOpenApiTool: AnyToolDef = {\n name: 'import.openapi',\n description:\n 'Parse an OpenAPI / Swagger spec (YAML or JSON) and create one Request per operation. Returns the list of created request ids.',\n inputSchema: z.object({\n spec: z.string().min(1),\n format: z.enum(['json', 'yaml']).default('json'),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const parsed = await parseOpenApiToEndpoints(input.spec, input.format);\n const ids: string[] = [];\n for (let i = 0; i < parsed.endpoints.length; i++) {\n const ep = parsed.endpoints[i];\n const now = new Date().toISOString();\n const req: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: FALLBACK_NAME(i, ep.example ?? `${ep.method} ${ep.pathPattern}`),\n method: ep.method,\n url: ep.pathPattern,\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await ctx.workspace.apply({ kind: 'request.create', request: req });\n ids.push(req.id);\n }\n return { createdIds: ids, warnings: parsed.warnings };\n },\n};\n\nexport const importPostmanTool: AnyToolDef = {\n name: 'import.postman',\n description: 'Parse a Postman v2/v2.1 collection JSON and create one Request per item.',\n inputSchema: z.object({\n collection: z.string().min(1),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const parsed = parsePostmanToEndpoints(input.collection);\n const ids: string[] = [];\n for (let i = 0; i < parsed.endpoints.length; i++) {\n const ep = parsed.endpoints[i];\n const now = new Date().toISOString();\n const req: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: FALLBACK_NAME(i, ep.example ?? `${ep.method} ${ep.pathPattern}`),\n method: ep.method,\n url: ep.pathPattern,\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await ctx.workspace.apply({ kind: 'request.create', request: req });\n ids.push(req.id);\n }\n return { createdIds: ids, warnings: parsed.warnings };\n },\n};\n\nexport const importInsomniaTool: AnyToolDef = {\n name: 'import.insomnia',\n description: 'Parse an Insomnia v4 export and create one Request per resource of type \"request\".',\n inputSchema: z.object({\n export: z.string().min(1),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const parsed = parseInsomniaToEndpoints(input.export);\n const ids: string[] = [];\n for (let i = 0; i < parsed.endpoints.length; i++) {\n const ep = parsed.endpoints[i];\n const now = new Date().toISOString();\n const req: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: FALLBACK_NAME(i, ep.example ?? `${ep.method} ${ep.pathPattern}`),\n method: ep.method,\n url: ep.pathPattern,\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await ctx.workspace.apply({ kind: 'request.create', request: req });\n ids.push(req.id);\n }\n return { createdIds: ids, warnings: parsed.warnings };\n },\n};\n\n// HAR — quick adapter. We extract method/url/headers/body from `log.entries[].request`.\nexport const importHarTool: AnyToolDef = {\n name: 'import.har',\n description:\n 'Parse an HTTP Archive (.har) JSON and create one Request per recorded entry. Cookies, response, and timings are dropped.',\n inputSchema: z.object({\n har: z.string().min(1),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n let parsed: {\n log?: { entries?: Array<{ request?: HarRequest }> };\n };\n try {\n parsed = JSON.parse(input.har);\n } catch (err) {\n return { createdIds: [], warnings: [`HAR parse error: ${(err as Error).message}`] };\n }\n const entries = parsed.log?.entries ?? [];\n const ids: string[] = [];\n const warnings: string[] = [];\n for (let i = 0; i < entries.length; i++) {\n const e = entries[i].request;\n if (!e || !e.url || !e.method) {\n warnings.push(`Entry #${i} missing method/url; skipped`);\n continue;\n }\n const url = new URL(e.url);\n const now = new Date().toISOString();\n const req: ApiRequest = {\n ...blankRequest(),\n id: generateId(),\n name: `${e.method} ${url.pathname}`,\n method: e.method as ApiRequest['method'],\n url: e.url,\n headers: (e.headers ?? []).map((h) => ({\n key: h.name,\n value: h.value,\n enabled: true,\n })),\n query: (e.queryString ?? []).map((q) => ({\n key: q.name,\n value: q.value,\n enabled: true,\n })),\n body: e.postData\n ? { type: 'text', content: e.postData.text ?? '' }\n : { type: 'none', content: '' },\n folderId: input.folderId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await ctx.workspace.apply({ kind: 'request.create', request: req });\n ids.push(req.id);\n }\n return { createdIds: ids, warnings };\n },\n};\n\ninterface HarRequest {\n method?: string;\n url?: string;\n headers?: Array<{ name: string; value: string }>;\n queryString?: Array<{ name: string; value: string }>;\n postData?: { text?: string; mimeType?: string };\n}\n","import { z } from 'zod';\nimport type { Request as ApiRequest } from '@apicircle/shared';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// generate.code — produce a code snippet that reproduces a workspace request\n// in the user's language of choice. Targets are intentionally hand-rolled\n// rather than delegating to a third-party codegen lib so output stays small,\n// reviewable, and free from heavy transitive deps.\n// =============================================================================\n\nconst TARGET = z.enum(['curl', 'fetch', 'node-axios', 'python-requests', 'go', 'rust']);\n\nexport const generateCodeTool: AnyToolDef = {\n name: 'generate.code',\n description:\n 'Generate runnable code (curl / JavaScript fetch / Node Axios / Python requests / Go net/http / Rust reqwest) that reproduces a workspace request.',\n inputSchema: z.object({\n requestId: z.string(),\n target: TARGET,\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const req = state.synced.collections.requests[input.requestId];\n if (!req) return { ok: false, error: 'request not found' };\n const code = renderCode(req, input.target);\n return { ok: true, target: input.target, code };\n },\n};\n\nfunction renderCode(req: ApiRequest, target: z.infer<typeof TARGET>): string {\n switch (target) {\n case 'curl':\n return renderCurl(req);\n case 'fetch':\n return renderFetch(req);\n case 'node-axios':\n return renderAxios(req);\n case 'python-requests':\n return renderPython(req);\n case 'go':\n return renderGo(req);\n case 'rust':\n return renderRust(req);\n }\n}\n\nfunction fullUrl(req: ApiRequest): string {\n if (!req.query.length) return req.url;\n const enabled = req.query.filter((q) => q.enabled !== false);\n if (!enabled.length) return req.url;\n const sep = req.url.includes('?') ? '&' : '?';\n return (\n req.url +\n sep +\n enabled.map((q) => `${encodeURIComponent(q.key)}=${encodeURIComponent(q.value)}`).join('&')\n );\n}\n\nfunction bodyContent(req: ApiRequest): string | null {\n if (req.body.type === 'none') return null;\n if (req.body.type === 'json' || req.body.type === 'text' || req.body.type === 'xml') {\n return req.body.content;\n }\n if (req.body.type === 'graphql') {\n return JSON.stringify({ query: req.body.content, variables: req.body.variables ?? null });\n }\n if (req.body.type === 'urlencoded') return req.body.content;\n return null;\n}\n\nfunction renderCurl(req: ApiRequest): string {\n const parts: string[] = [`curl -X ${req.method} '${fullUrl(req)}'`];\n for (const h of req.headers.filter((x) => x.enabled !== false)) {\n parts.push(`-H '${h.key}: ${h.value}'`);\n }\n const body = bodyContent(req);\n if (body !== null) {\n parts.push(`--data-raw '${body.replace(/'/g, \"'\\\\''\")}'`);\n }\n return parts.join(' \\\\\\n ');\n}\n\nfunction renderFetch(req: ApiRequest): string {\n const headers = Object.fromEntries(\n req.headers.filter((h) => h.enabled !== false).map((h) => [h.key, h.value]),\n );\n const body = bodyContent(req);\n const init: Record<string, unknown> = { method: req.method };\n if (Object.keys(headers).length) init.headers = headers;\n if (body !== null) init.body = body;\n return `await fetch(${JSON.stringify(fullUrl(req))}, ${JSON.stringify(init, null, 2)})`;\n}\n\nfunction renderAxios(req: ApiRequest): string {\n const config: Record<string, unknown> = {\n method: req.method.toLowerCase(),\n url: fullUrl(req),\n };\n const headers = req.headers.filter((h) => h.enabled !== false);\n if (headers.length) config.headers = Object.fromEntries(headers.map((h) => [h.key, h.value]));\n const body = bodyContent(req);\n if (body !== null) config.data = body;\n return `import axios from 'axios';\\n\\nconst response = await axios(${JSON.stringify(\n config,\n null,\n 2,\n )});`;\n}\n\nfunction renderPython(req: ApiRequest): string {\n const headers = req.headers.filter((h) => h.enabled !== false);\n const body = bodyContent(req);\n const lines: string[] = ['import requests', ''];\n lines.push(`response = requests.request(`);\n lines.push(` method=${JSON.stringify(req.method)},`);\n lines.push(` url=${JSON.stringify(fullUrl(req))},`);\n if (headers.length) {\n lines.push(\n ` headers=${JSON.stringify(Object.fromEntries(headers.map((h) => [h.key, h.value])))},`,\n );\n }\n if (body !== null) lines.push(` data=${JSON.stringify(body)},`);\n lines.push(')');\n return lines.join('\\n');\n}\n\nfunction renderGo(req: ApiRequest): string {\n const headers = req.headers.filter((h) => h.enabled !== false);\n const body = bodyContent(req);\n const lines: string[] = [\n 'package main',\n '',\n 'import (',\n ' \"io\"',\n ' \"net/http\"',\n ' \"strings\"',\n ')',\n '',\n 'func main() {',\n ];\n if (body !== null) {\n lines.push(` body := strings.NewReader(${JSON.stringify(body)})`);\n lines.push(\n ` req, _ := http.NewRequest(${JSON.stringify(req.method)}, ${JSON.stringify(fullUrl(req))}, body)`,\n );\n } else {\n lines.push(\n ` req, _ := http.NewRequest(${JSON.stringify(req.method)}, ${JSON.stringify(fullUrl(req))}, nil)`,\n );\n }\n for (const h of headers) {\n lines.push(` req.Header.Set(${JSON.stringify(h.key)}, ${JSON.stringify(h.value)})`);\n }\n lines.push(' resp, _ := http.DefaultClient.Do(req)');\n lines.push(' defer resp.Body.Close()');\n lines.push(' out, _ := io.ReadAll(resp.Body)');\n lines.push(' _ = out');\n lines.push('}');\n return lines.join('\\n');\n}\n\nfunction renderRust(req: ApiRequest): string {\n const headers = req.headers.filter((h) => h.enabled !== false);\n const body = bodyContent(req);\n const lines: string[] = [\n 'use reqwest::Client;',\n '',\n '#[tokio::main]',\n 'async fn main() -> Result<(), Box<dyn std::error::Error>> {',\n ` let client = Client::new();`,\n ` let mut req = client.request(reqwest::Method::${req.method}, ${JSON.stringify(\n fullUrl(req),\n )});`,\n ];\n for (const h of headers) {\n lines.push(` req = req.header(${JSON.stringify(h.key)}, ${JSON.stringify(h.value)});`);\n }\n if (body !== null) lines.push(` req = req.body(${JSON.stringify(body)});`);\n lines.push(' let _resp = req.send().await?;');\n lines.push(' Ok(())');\n lines.push('}');\n return lines.join('\\n');\n}\n","import { z } from 'zod';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// workspace.list — surfaces every workspace the server can drive, with cheap\n// per-workspace counts so AI clients can disambiguate without follow-up\n// reads. Used by prompts like \"list every workspace I have\" or as a\n// disambiguation step before drilling into a specific one.\n// =============================================================================\n\nexport const workspaceListTool: AnyToolDef = {\n name: 'workspace.list',\n description:\n 'List every workspace registered with this server, including which one is currently active. ' +\n 'Returns id, display name, last-opened timestamp, and a per-workspace summary (request count, ' +\n 'environment count, mock-server count, plan count). Use this BEFORE drilling into a specific ' +\n 'workspace via other tools — pass the resulting `id` as `workspaceId` to `workspace.read` ' +\n 'or related reads when you want to scope to a non-active workspace.',\n inputSchema: z.object({}),\n async handler(_input, ctx) {\n const summaries = await ctx.workspaces.list();\n return {\n activeWorkspaceId: ctx.workspaces.activeId(),\n workspaceCount: summaries.length,\n workspaces: summaries,\n // Plain-text hint the AI surfaces when telling the user. Cheap to\n // generate here and saves round-trips on disambiguation prompts.\n hint:\n summaries.length === 0\n ? 'No workspaces are registered yet. The user should open the desktop app once or run `apicircle workspaces create <name>` from the terminal.'\n : summaries.length === 1\n ? `Only one workspace (\"${summaries[0].name}\") is registered — most tools will default to it without a workspaceId.`\n : `Multiple workspaces are registered. Pass the desired \\`id\\` as \\`workspaceId\\` to other tools to scope reads/writes to that workspace; the active one (\"${\n summaries.find((w) => w.isActive)?.name ?? '(none)'\n }\") is used by default.`,\n };\n },\n};\n","import { z } from 'zod';\nimport type {\n Assertion,\n Environment,\n ExecutionPlan,\n Folder,\n Request as ApiRequest,\n} from '@apicircle/shared';\nimport { generateId } from '@apicircle/shared';\nimport { parseApicircleEnvironmentDoc } from '@apicircle/core';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// CRUD tool definitions for every workspace entity. Reads always go through\n// `workspace.read()`; writes always go through `workspace.apply(patch)` so the\n// mutation API in @apicircle/core is the single semantic source of truth.\n// =============================================================================\n\nconst HTTP_METHOD = z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']);\n\n// ---------------------------------------------------------------------------\n// Requests\n// ---------------------------------------------------------------------------\n\nexport const requestCreateTool: AnyToolDef = {\n name: 'request.create',\n description: 'Create a new request from explicit fields and persist it.',\n inputSchema: z.object({\n name: z.string().default('New request'),\n method: HTTP_METHOD.default('GET'),\n url: z.string().default(''),\n folderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const now = new Date().toISOString();\n const request: ApiRequest = {\n id: generateId(),\n name: input.name,\n folderId: input.folderId ?? null,\n method: input.method,\n url: input.url,\n headers: [],\n query: [],\n body: { type: 'none', content: '' },\n // Default to `inherit` so requests created via MCP inside a folder\n // pick up folder auth automatically. Mirrors editorActions.createRequest.\n auth: { type: 'inherit' },\n contextVars: [],\n extractions: [],\n assertions: [],\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'request.create', request });\n return { id: request.id, changedIds: out.changedIds };\n },\n};\n\nexport const requestReadTool: AnyToolDef = {\n name: 'request.read',\n description:\n 'Read a request by id, or list summaries (id, name, method, url) when no id is provided.',\n inputSchema: z.object({ id: z.string().optional() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (input.id) {\n const req = state.synced.collections.requests[input.id];\n if (!req) return { found: false };\n return { found: true, request: req };\n }\n const list = Object.values(state.synced.collections.requests).map((r) => ({\n id: r.id,\n name: r.name,\n method: r.method,\n url: r.url,\n folderId: r.folderId,\n }));\n return { count: list.length, requests: list };\n },\n};\n\nexport const requestUpdateTool: AnyToolDef = {\n name: 'request.update',\n description: 'Patch fields on an existing request.',\n inputSchema: z.object({\n id: z.string(),\n patch: z\n .object({\n name: z.string().optional(),\n method: HTTP_METHOD.optional(),\n url: z.string().optional(),\n folderId: z.string().nullable().optional(),\n })\n .strict(),\n }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'request.update',\n id: input.id,\n patch: input.patch as Partial<Omit<ApiRequest, 'id' | 'createdAt'>>,\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const requestDeleteTool: AnyToolDef = {\n name: 'request.delete',\n description: 'Delete a request by id.',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'request.delete', id: input.id });\n return { changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Folders\n// ---------------------------------------------------------------------------\n\nexport const folderCreateTool: AnyToolDef = {\n name: 'folder.create',\n description: 'Create a folder under an optional parent folder.',\n inputSchema: z.object({\n name: z.string().default('New folder'),\n parentId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n const folder: Folder = {\n id: generateId(),\n name: input.name,\n parentId: input.parentId ?? null,\n };\n const out = await ctx.workspace.apply({ kind: 'folder.create', folder });\n return { id: folder.id, changedIds: out.changedIds };\n },\n};\n\nexport const folderReadTool: AnyToolDef = {\n name: 'folder.read',\n description: 'Read a folder by id, or list all folders when no id is provided.',\n inputSchema: z.object({ id: z.string().optional() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (input.id) {\n const folder = state.synced.collections.folders[input.id];\n return folder ? { found: true, folder } : { found: false };\n }\n return {\n count: Object.keys(state.synced.collections.folders).length,\n folders: Object.values(state.synced.collections.folders),\n };\n },\n};\n\nexport const folderUpdateTool: AnyToolDef = {\n name: 'folder.update',\n description: 'Move a folder to a new parent (or to root with parentId: null).',\n inputSchema: z.object({\n id: z.string(),\n parentId: z.string().nullable(),\n }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'folder.move',\n id: input.id,\n newParentId: input.parentId,\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const folderDeleteTool: AnyToolDef = {\n name: 'folder.delete',\n description:\n \"Delete a folder. Direct children (sub-folders + requests) are reparented to the deleted folder's parent.\",\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'folder.delete', id: input.id });\n return { changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Environments\n// ---------------------------------------------------------------------------\n\nconst VARIABLE = z.object({\n key: z.string(),\n value: z.string(),\n encrypted: z.boolean().default(false),\n});\n\nexport const environmentCreateTool: AnyToolDef = {\n name: 'environment.create',\n description: 'Create a new environment (or upsert one with the same name).',\n inputSchema: z.object({\n name: z.string(),\n variables: z.array(VARIABLE).default([]),\n }),\n async handler(input, ctx) {\n const env: Environment = { name: input.name, variables: input.variables };\n const out = await ctx.workspace.apply({ kind: 'environment.upsert', environment: env });\n return { name: env.name, changedIds: out.changedIds };\n },\n};\n\nexport const environmentReadTool: AnyToolDef = {\n name: 'environment.read',\n description: 'Read environments — pass `name` for one, or omit for the full list.',\n inputSchema: z.object({ name: z.string().optional() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (input.name) {\n const env = state.synced.environments.items[input.name];\n return env ? { found: true, environment: env } : { found: false };\n }\n return {\n activeName: state.synced.environments.activeName,\n priorityOrder: state.synced.environments.priorityOrder,\n environments: Object.values(state.synced.environments.items),\n };\n },\n};\n\nexport const environmentUpdateTool: AnyToolDef = {\n name: 'environment.update',\n description: 'Replace the variables list of an environment.',\n inputSchema: z.object({\n name: z.string(),\n variables: z.array(VARIABLE),\n }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'environment.upsert',\n environment: { name: input.name, variables: input.variables },\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const environmentDeleteTool: AnyToolDef = {\n name: 'environment.delete',\n description: 'Delete an environment by name.',\n inputSchema: z.object({ name: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'environment.delete', name: input.name });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const environmentSetActiveTool: AnyToolDef = {\n name: 'environment.set_active',\n description:\n 'Set (or clear) the active environment. Pass `name: null` to deactivate the current environment.',\n inputSchema: z.object({ name: z.string().nullable() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'environment.setActive',\n name: input.name,\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const environmentSetPriorityTool: AnyToolDef = {\n name: 'environment.set_priority',\n description:\n 'Replace the global environment priority order (highest priority first). Strings are interpreted as local env names. To target a linked env, pass `{ kind: \"linked\", linkedWorkspaceId, envName }` instead.',\n inputSchema: z.object({\n order: z.array(\n z.union([\n z.string(),\n z.object({\n kind: z.literal('local'),\n name: z.string(),\n }),\n z.object({\n kind: z.literal('linked'),\n linkedWorkspaceId: z.string(),\n envName: z.string(),\n }),\n ]),\n ),\n }),\n async handler(input, ctx) {\n // Normalize the heterogeneous tool-input array to EnvPriorityRef[].\n // Bare strings are convenience syntax for local envs — the dominant\n // case for MCP callers — so we keep accepting them rather than\n // forcing every caller to spell out `{kind:'local', ...}`.\n const order = (\n input.order as Array<\n | string\n | { kind: 'local'; name: string }\n | { kind: 'linked'; linkedWorkspaceId: string; envName: string }\n >\n ).map((entry) => (typeof entry === 'string' ? { kind: 'local' as const, name: entry } : entry));\n const out = await ctx.workspace.apply({\n kind: 'environment.setPriority',\n order,\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const environmentExportTool: AnyToolDef = {\n name: 'environment.export',\n description:\n 'Serialize an environment to a portable JSON string (envelope v2). Encrypted variables now carry their ciphertext, slot label, and per-slot salt — the destination decrypts with its local slot value at request-execute time, matching the Git push/pull contract. The plaintext slot value never leaves the device, but the ciphertext does. v1 envelopes (no ciphertext) still parse on import for back-compat.',\n inputSchema: z.object({ name: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const env = state.synced.environments.items[input.name];\n if (!env) return { ok: false as const, error: 'environment not found' as const };\n const payload = {\n apicircleEnvironment: 2 as const,\n name: env.name,\n variables: env.variables.map((v) => {\n if (v.encrypted && v.secretKeyId) {\n const slot = state.synced.secretKeys?.[v.secretKeyId];\n const label = slot?.label ?? v.key;\n const value = typeof v.value === 'string' && v.value.startsWith('enc:') ? v.value : '';\n return {\n key: v.key,\n encrypted: true as const,\n value,\n secretKeyId: v.secretKeyId,\n secret: { label, salt: slot?.salt ?? null },\n };\n }\n return { key: v.key, value: v.value, encrypted: false as const };\n }),\n };\n return { ok: true as const, json: JSON.stringify(payload, null, 2) };\n },\n};\n\nexport const environmentImportTool: AnyToolDef = {\n name: 'environment.import',\n description:\n \"Import an environment from the JSON shape produced by `environment.export`. v2 envelopes carry the row ciphertext + per-slot salt, so the destination decrypts at request-execute time with its local slot value (same model as Git push/pull); when no destination slot matches the source's salt, a new slot is minted via `secretKey.upsert` and surfaced in `mintedSlots` so the caller can provide values via `secret.addLocal`. v1 envelopes carry only metadata, so unmatched rows come back as `pendingBindings` for the caller to prompt-and-bind via `secret.addLocal` + `environment.bindSecret`. Pass `overwrite: true` to replace a same-name destination env.\",\n inputSchema: z.object({\n json: z.string().min(1),\n overwrite: z.boolean().default(false),\n }),\n async handler(input, ctx) {\n let raw: unknown;\n try {\n raw = JSON.parse(input.json);\n } catch {\n return { ok: false as const, error: 'invalid JSON' as const };\n }\n let parsed;\n try {\n parsed = parseApicircleEnvironmentDoc(raw);\n } catch (err) {\n return {\n ok: false as const,\n error: err instanceof Error ? err.message : 'unsupported export shape',\n };\n }\n const state = await ctx.workspace.read();\n if (state.synced.environments.items[parsed.name] && !input.overwrite) {\n return {\n ok: false as const,\n error: 'environment already exists; pass overwrite:true' as const,\n };\n }\n\n // Resolve encrypted hints against the destination vault — same logic\n // as the UI store action so MCP + UI imports stay in lockstep. v2\n // hints with ciphertext + salt may mint slot metadata via a paired\n // `secretKey.upsert` so the receiver's missing-slots gate can fire\n // for the plaintext value. v1 hints fall back to pendingBindings.\n const destSlots = state.synced.secretKeys ?? {};\n const labelToSlotId = new Map<string, string>();\n for (const slot of Object.values(destSlots)) {\n if (!labelToSlotId.has(slot.label)) labelToSlotId.set(slot.label, slot.id);\n }\n\n const resolvedVariables: Environment['variables'] = [];\n const pendingBindings: Array<{ varKey: string; label: string; labelFromFallback: boolean }> =\n [];\n const mintedSlots: Array<{ id: string; label: string; salt: string; createdAt: string }> = [];\n const knownDestIds = new Set(Object.keys(destSlots));\n let hintCursor = 0;\n for (const v of parsed.variables) {\n if (!v.encrypted) {\n resolvedVariables.push(v);\n continue;\n }\n const hint = parsed.encryptedBindingHints[hintCursor];\n hintCursor += 1;\n\n // v2 path — ciphertext + salt are present.\n if (hint && hint.ciphertext && hint.salt) {\n if (hint.originSecretKeyId && destSlots[hint.originSecretKeyId]?.salt === hint.salt) {\n resolvedVariables.push({ ...v, secretKeyId: hint.originSecretKeyId });\n continue;\n }\n const labelMatch = labelToSlotId.get(hint.label);\n if (labelMatch && destSlots[labelMatch]?.salt === hint.salt) {\n resolvedVariables.push({ ...v, secretKeyId: labelMatch });\n continue;\n }\n const mintedId =\n hint.originSecretKeyId && !knownDestIds.has(hint.originSecretKeyId)\n ? hint.originSecretKeyId\n : generateId();\n knownDestIds.add(mintedId);\n if (!labelToSlotId.has(hint.label)) labelToSlotId.set(hint.label, mintedId);\n mintedSlots.push({\n id: mintedId,\n label: hint.label,\n salt: hint.salt,\n createdAt: new Date().toISOString(),\n });\n resolvedVariables.push({ ...v, secretKeyId: mintedId });\n continue;\n }\n\n // v1 path — metadata only.\n if (hint?.originSecretKeyId && destSlots[hint.originSecretKeyId]) {\n resolvedVariables.push({ ...v, secretKeyId: hint.originSecretKeyId });\n continue;\n }\n if (hint?.label) {\n const matchId = labelToSlotId.get(hint.label);\n if (matchId) {\n resolvedVariables.push({ ...v, secretKeyId: matchId });\n continue;\n }\n }\n resolvedVariables.push(v);\n if (hint) {\n pendingBindings.push({\n varKey: hint.varKey,\n label: hint.label,\n labelFromFallback: hint.labelFromFallback,\n });\n }\n }\n\n // Mint slot metadata BEFORE the environment so the row's\n // secretKeyIds always point at a real slot the resolver knows about.\n for (const meta of mintedSlots) {\n await ctx.workspace.apply({ kind: 'secretKey.upsert', meta });\n }\n\n const env: Environment = { name: parsed.name, variables: resolvedVariables };\n const out = await ctx.workspace.apply({ kind: 'environment.upsert', environment: env });\n return {\n ok: true as const,\n name: env.name,\n changedIds: out.changedIds,\n pendingBindings,\n mintedSlots: mintedSlots.map((s) => ({ id: s.id, label: s.label })),\n warnings: parsed.warnings,\n };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Execution plans\n// ---------------------------------------------------------------------------\n\nconst PLAN_STEP = z.object({\n requestId: z.string(),\n linkedWorkspaceId: z.string().optional(),\n});\n\nexport const planCreateTool: AnyToolDef = {\n name: 'plan.create',\n description: 'Create a new execution plan (sequence of request steps).',\n inputSchema: z.object({\n name: z.string().default('New plan'),\n steps: z.array(PLAN_STEP).default([]),\n envPriorityOrder: z.array(z.string()).default([]),\n }),\n async handler(input, ctx) {\n const id = generateId();\n const now = new Date().toISOString();\n const plan: ExecutionPlan = {\n id,\n name: input.name,\n steps: input.steps,\n envPriorityOrder: input.envPriorityOrder,\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'plan.upsert', plan });\n return { id, changedIds: out.changedIds };\n },\n};\n\nexport const planReadTool: AnyToolDef = {\n name: 'plan.read',\n description: 'Read a plan by id, or list all plans when no id is provided.',\n inputSchema: z.object({ id: z.string().optional() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (input.id) {\n const plan = state.local.executionPlans[input.id];\n return plan ? { found: true, plan } : { found: false };\n }\n return {\n count: Object.keys(state.local.executionPlans).length,\n plans: Object.values(state.local.executionPlans),\n };\n },\n};\n\nexport const planUpdateTool: AnyToolDef = {\n name: 'plan.update',\n description: 'Patch fields on an existing plan.',\n inputSchema: z.object({\n id: z.string(),\n patch: z\n .object({\n name: z.string().optional(),\n steps: z.array(PLAN_STEP).optional(),\n envPriorityOrder: z.array(z.string()).optional(),\n })\n .strict(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const existing = state.local.executionPlans[input.id];\n if (!existing) return { changedIds: [] };\n const merged: ExecutionPlan = {\n ...existing,\n ...input.patch,\n id: existing.id,\n createdAt: existing.createdAt,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'plan.upsert', plan: merged });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const planDeleteTool: AnyToolDef = {\n name: 'plan.delete',\n description: 'Delete a plan by id. Drops history rows referencing this plan.',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'plan.delete', id: input.id });\n return { changedIds: out.changedIds };\n },\n};\n\n// Granular plan-step operations. Each fetches the plan, mutates the steps\n// array, and writes the whole plan back via `plan.upsert` — keeping\n// applyMutation patches as the single source of truth.\n\nexport const planAddStepTool: AnyToolDef = {\n name: 'plan.add_step',\n description:\n 'Append a step to an execution plan. Optional `position` (0-based) inserts at that index instead.',\n inputSchema: z.object({\n planId: z.string(),\n requestId: z.string(),\n linkedWorkspaceId: z.string().optional(),\n position: z.number().int().nonnegative().optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n const step = {\n requestId: input.requestId,\n ...(input.linkedWorkspaceId ? { linkedWorkspaceId: input.linkedWorkspaceId } : {}),\n };\n const steps = [...plan.steps];\n if (input.position !== undefined && input.position <= steps.length) {\n steps.splice(input.position, 0, step);\n } else {\n steps.push(step);\n }\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, steps, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const planRemoveStepTool: AnyToolDef = {\n name: 'plan.remove_step',\n description: 'Remove a step from a plan by 0-based index.',\n inputSchema: z.object({\n planId: z.string(),\n index: z.number().int().nonnegative(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n if (input.index >= plan.steps.length) {\n return { ok: false as const, error: 'index out of range' as const };\n }\n const steps = plan.steps.filter((_, i) => i !== input.index);\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, steps, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const planReorderStepsTool: AnyToolDef = {\n name: 'plan.reorder_steps',\n description:\n 'Replace the plan steps with a new permutation. The supplied indices must reference valid current step indices.',\n inputSchema: z.object({\n planId: z.string(),\n order: z.array(z.number().int().nonnegative()),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n if (input.order.length !== plan.steps.length) {\n return { ok: false as const, error: 'order length must equal step count' as const };\n }\n const order: number[] = input.order;\n const seen = new Set(order);\n if (seen.size !== order.length || order.some((i: number) => i >= plan.steps.length)) {\n return { ok: false as const, error: 'order must be a permutation of step indices' as const };\n }\n const steps = order.map((i: number) => plan.steps[i]);\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, steps, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nconst PLAN_VARIABLE = z.object({ key: z.string(), value: z.string() });\n\nexport const planSetVariablesTool: AnyToolDef = {\n name: 'plan.set_variables',\n description:\n 'Replace the plan-scoped variables. These live highest-priority during plan runs (above environment vars, below context vars).',\n inputSchema: z.object({\n planId: z.string(),\n variables: z.array(PLAN_VARIABLE),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, variables: input.variables, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const planRunTool: AnyToolDef = {\n name: 'plan.run',\n description:\n 'Run a plan headlessly (server-side). Currently returns a not-implemented marker — full execution requires the Desktop or browser runtime which the MCP host does not own. The Desktop integration overrides this tool with a real runner.',\n inputSchema: z.object({\n id: z.string(),\n withAssertions: z.boolean().default(true),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.id];\n if (!plan) return { ok: false, error: 'plan not found' };\n return {\n ok: false,\n error:\n 'Plan execution is only available in the Desktop app (or once a hosted runtime is wired). The plan exists and is ready to run from the UI.',\n planId: plan.id,\n stepCount: plan.steps.length,\n };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Assertions\n// ---------------------------------------------------------------------------\n\nconst ASSERTION = z.object({\n id: z.string().optional(),\n kind: z.enum(['status', 'header', 'json-path', 'duration']),\n op: z.enum(['equals', 'not-equals', 'contains', 'lt', 'gt', 'matches']),\n target: z.string().optional(),\n expected: z.union([z.string(), z.number()]),\n});\n\nexport const assertionCreateTool: AnyToolDef = {\n name: 'assertion.create',\n description: 'Add an assertion to a request.',\n inputSchema: z.object({\n requestId: z.string(),\n assertion: ASSERTION,\n }),\n async handler(input, ctx) {\n const assertion: Assertion = {\n ...input.assertion,\n id: input.assertion.id ?? generateId(),\n } as Assertion;\n const out = await ctx.workspace.apply({\n kind: 'assertion.upsert',\n requestId: input.requestId,\n assertion,\n });\n return { id: assertion.id, changedIds: out.changedIds };\n },\n};\n\nexport const assertionReadTool: AnyToolDef = {\n name: 'assertion.read',\n description: 'List assertions for a request, or fetch a single assertion by id.',\n inputSchema: z.object({\n requestId: z.string(),\n assertionId: z.string().optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const req = state.synced.collections.requests[input.requestId];\n if (!req) return { found: false };\n if (input.assertionId) {\n const a = req.assertions.find((x) => x.id === input.assertionId);\n return a ? { found: true, assertion: a } : { found: false };\n }\n return { count: req.assertions.length, assertions: req.assertions };\n },\n};\n\nexport const assertionUpdateTool: AnyToolDef = {\n name: 'assertion.update',\n description: 'Replace an existing assertion (matched by `assertion.id`).',\n inputSchema: z.object({\n requestId: z.string(),\n assertion: ASSERTION.required({ id: true }),\n }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'assertion.upsert',\n requestId: input.requestId,\n assertion: input.assertion as Assertion,\n });\n return { changedIds: out.changedIds };\n },\n};\n\nexport const assertionDeleteTool: AnyToolDef = {\n name: 'assertion.delete',\n description: 'Remove an assertion from a request.',\n inputSchema: z.object({\n requestId: z.string(),\n assertionId: z.string(),\n }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({\n kind: 'assertion.delete',\n requestId: input.requestId,\n assertionId: input.assertionId,\n });\n return { changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Workspace bulk read / write\n// ---------------------------------------------------------------------------\n\nexport const workspaceReadTool: AnyToolDef = {\n name: 'workspace.read',\n description:\n 'Return the full `{ synced, local }` workspace pair. Pass `workspaceId` to scope to a specific ' +\n 'workspace when multiple are registered (call `workspace.list` first to discover ids). When ' +\n 'omitted and multiple workspaces exist, the response is a structured \"multiple workspaces found\" ' +\n 'envelope listing each summary so the AI can clarify before drilling in. Use sparingly — ' +\n 'entity-specific tools are more efficient for small reads.',\n inputSchema: z.object({\n workspaceId: z\n .string()\n .min(1)\n .max(256)\n .optional()\n .describe(\n 'Optional workspace id (from `workspace.list`). Omit to read the active workspace; the ' +\n 'tool will switch to the \"multiple workspaces\" envelope when ambiguous.',\n ),\n }),\n async handler(input, ctx) {\n if (input.workspaceId) {\n const provider = ctx.workspaces.for(input.workspaceId);\n const state = await provider.read();\n return {\n kind: 'single' as const,\n workspaceId: state.synced.workspaceId,\n synced: state.synced,\n local: state.local,\n };\n }\n const summaries = await ctx.workspaces.list();\n if (summaries.length > 1) {\n return {\n kind: 'multiple-workspaces' as const,\n activeWorkspaceId: ctx.workspaces.activeId(),\n workspaceCount: summaries.length,\n workspaces: summaries,\n hint:\n `Found ${summaries.length} workspaces. Re-call \\`workspace.read\\` with \\`workspaceId\\` set ` +\n 'to the desired entry, or call entity-specific tools (which default to the active workspace) ' +\n 'when scoping to one workspace is acceptable.',\n };\n }\n const state = await ctx.workspace.read();\n return {\n kind: 'single' as const,\n workspaceId: state.synced.workspaceId,\n synced: state.synced,\n local: state.local,\n };\n },\n};\n\nexport const workspaceWriteTool: AnyToolDef = {\n name: 'workspace.write',\n description:\n 'Bulk-replace the workspace. Pass `synced` and/or `local` to overwrite either side. Use ' +\n '`workspaceId` to target a non-active workspace (omit to write the active one). Mutating tools ' +\n 'are preferred — this is for full-doc imports/exports.',\n inputSchema: z.object({\n workspaceId: z\n .string()\n .min(1)\n .max(256)\n .optional()\n .describe('Optional workspace id; omit to write the active workspace.'),\n synced: z.unknown().optional(),\n local: z.unknown().optional(),\n }),\n async handler(input, ctx) {\n const provider = input.workspaceId ? ctx.workspaces.for(input.workspaceId) : ctx.workspace;\n const next = await provider.write({\n synced: input.synced as Parameters<typeof provider.write>[0]['synced'],\n local: input.local as Parameters<typeof provider.write>[0]['local'],\n });\n return { workspaceId: next.synced.workspaceId, ok: true };\n },\n};\n","// MCP tools for the `apicircle.folder/v1` exchange format.\n//\n// • `folder.export_json` — collect a self-contained JSON envelope for\n// a folder + its subtree. Embeds Global Asset dependencies (JSON\n// Schemas + GraphQL definitions) and captures file-asset metadata.\n// Auth credentials are REDACTED by default — callers opt in per\n// credential id via `includeCredentialIds`.\n//\n// • `folder.import_json` — parse an envelope produced by\n// `folder.export_json` (or the in-app Export Folder modal) and graft\n// it into the active workspace under the requested parent folder.\n// Routes through the `folder.import_apicircle` patch on\n// `WorkspaceProvider.apply`, so the same name-uniquify + dependency\n// dedupe semantics apply to every writer (UI / CLI / MCP).\n\nimport { z } from 'zod';\nimport {\n collectFolderExport,\n parseApicircleFolderExport,\n redactFolderExportCredentials,\n serializeFolderExport,\n suggestFolderExportFilename,\n} from '@apicircle/core';\nimport type { AnyToolDef } from './types';\n\nexport const folderExportJsonTool: AnyToolDef = {\n name: 'folder.export_json',\n description:\n 'Export an existing folder (and its subtree) to the API Circle exchange JSON format. ' +\n 'Embeds JSON Schema + GraphQL dependencies inline. Auth credentials are redacted by ' +\n 'default — pass `includeCredentialIds` to keep specific fields verbatim (the report from ' +\n '`collectFolderExport` enumerates the available ids).',\n inputSchema: z.object({\n folderId: z.string().min(1, 'folderId is required'),\n /**\n * Subset of credential ids to KEEP in the output. Anything not in\n * this list (and every detected credential when this is empty)\n * gets blanked. Use the report-side ids surfaced by the export\n * report (`<scope>:<ownerId>.<authType>.<field>`).\n */\n includeCredentialIds: z.array(z.string()).optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const collected = collectFolderExport({\n synced: state.synced,\n folderId: input.folderId,\n });\n if (!collected) {\n return {\n error: 'folder_not_found',\n message: `No folder with id \"${input.folderId}\" exists in the active workspace.`,\n };\n }\n const includeIds = new Set<string>(input.includeCredentialIds ?? []);\n const redacted = redactFolderExportCredentials(collected.envelope, includeIds);\n return {\n envelope: redacted,\n json: serializeFolderExport(redacted),\n filename: suggestFolderExportFilename(redacted),\n report: collected.report,\n };\n },\n};\n\nexport const folderImportJsonTool: AnyToolDef = {\n name: 'folder.import_json',\n description:\n 'Import an `apicircle.folder/v1` envelope into the active workspace. Folder + request ' +\n 'ids are reminted, dependency references are remapped, and JSON Schema / GraphQL ' +\n 'definitions that match an existing global asset (by name + content) are reused.',\n inputSchema: z.object({\n /** Either a JSON string or the already-parsed envelope object. */\n json: z.string().min(1).optional(),\n envelope: z.record(z.unknown()).optional(),\n parentFolderId: z.string().nullable().optional(),\n }),\n async handler(input, ctx) {\n if (!input.json && !input.envelope) {\n return {\n error: 'invalid_input',\n message: 'Pass either `json` (string) or `envelope` (object).',\n };\n }\n const text = input.json !== undefined ? input.json : JSON.stringify(input.envelope);\n let parsed: ReturnType<typeof parseApicircleFolderExport>;\n try {\n parsed = parseApicircleFolderExport(text);\n } catch (err) {\n return {\n error: 'invalid_envelope',\n message: err instanceof Error ? err.message : String(err),\n };\n }\n const out = await ctx.workspace.apply({\n kind: 'folder.import_apicircle',\n parsed,\n parentFolderId: input.parentFolderId ?? null,\n });\n return {\n rootFolderId: parsed.rootFolder.id,\n rootFolderName: parsed.rootFolder.name,\n counts: {\n folders: parsed.subfolders.length + 1,\n requests: parsed.requests.length,\n },\n filesRequiringReattachment: parsed.dependencies.files.map((f) => f.id),\n warnings: parsed.warnings,\n changedIds: out.changedIds,\n };\n },\n};\n","import { z } from 'zod';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// History tools — list / get / delete / purge over the local request-run +\n// plan-run buffers. History lives in `WorkspaceLocal`, never pushed to git,\n// so these are local-only mutations.\n// =============================================================================\n\nexport const historyListRunsTool: AnyToolDef = {\n name: 'history.list_runs',\n description:\n 'List request-run history rows in reverse-chronological order. Filter by `requestId`, `ok` (success/failure), or `since`/`until` ISO timestamps. `limit` caps the result set; default 100.',\n inputSchema: z.object({\n requestId: z.string().optional(),\n ok: z.boolean().optional(),\n since: z.string().optional(),\n until: z.string().optional(),\n limit: z.number().int().positive().max(500).default(100),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const sinceMs = input.since ? Date.parse(input.since) : -Infinity;\n const untilMs = input.until ? Date.parse(input.until) : Infinity;\n const filtered = state.local.history.requestRuns.filter((r) => {\n if (input.requestId && r.requestId !== input.requestId) return false;\n if (input.ok !== undefined && r.ok !== input.ok) return false;\n const t = Date.parse(r.startedAt);\n if (!Number.isFinite(t)) return true;\n return t >= sinceMs && t <= untilMs;\n });\n // Already stored newest-last in the circular buffer; reverse for display.\n const sorted = [...filtered].sort((a, b) => b.startedAt.localeCompare(a.startedAt));\n const limited = sorted.slice(0, input.limit);\n return {\n total: filtered.length,\n returned: limited.length,\n runs: limited.map((r) => ({\n id: r.id,\n requestId: r.requestId,\n method: r.method,\n url: r.url,\n status: r.status,\n ok: r.ok,\n startedAt: r.startedAt,\n durationMs: r.durationMs,\n })),\n };\n },\n};\n\nexport const historyGetRunTool: AnyToolDef = {\n name: 'history.get_run',\n description: 'Fetch a single history row in full (headers, body preview, assertion results).',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const run = state.local.history.requestRuns.find((r) => r.id === input.id);\n if (!run) return { found: false as const };\n return { found: true as const, run };\n },\n};\n\nexport const historyDeleteRunTool: AnyToolDef = {\n name: 'history.delete_run',\n description: 'Delete a single request-run row by id.',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n const out = await ctx.workspace.apply({ kind: 'history.delete_run', runId: input.id });\n return { deleted: out.changedIds.length, changedIds: out.changedIds };\n },\n};\n\nexport const historyPurgeTool: AnyToolDef = {\n name: 'history.purge_by_age',\n description:\n 'Drop every request-run + plan-run older than `olderThanDays` days. Pass 0 to clear all history.',\n inputSchema: z.object({\n olderThanDays: z.number().nonnegative(),\n }),\n async handler(input, ctx) {\n const olderThanMs = input.olderThanDays * 24 * 60 * 60 * 1000;\n const out = await ctx.workspace.apply({ kind: 'history.purge', olderThanMs });\n return { purgedCount: out.changedIds.length, changedIds: out.changedIds };\n },\n};\n","import { z } from 'zod';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// codebase.extract_collection — heuristic detector that walks a chunk of\n// source code (passed in by the AI client) and returns candidate request\n// shapes. The MCP host doesn't have filesystem access by itself; this tool\n// lets the AI orchestrate a `read files → extract → confirm with user →\n// import` pipeline.\n//\n// Currently detects:\n// • Express — `app.METHOD(`, `router.METHOD(`\n// • FastAPI — `@app.METHOD(`, `@router.METHOD(`\n// • Spring — `@GetMapping`, `@PostMapping`, `@PutMapping`, `@DeleteMapping`,\n// `@PatchMapping`, `@RequestMapping(method=...)`\n// • NestJS — `@Get(`, `@Post(`, `@Put(`, `@Patch(`, `@Delete(`\n//\n// All matches are surfaced as `{ method, path, framework, line }`. The AI\n// then asks the user to confirm and follows up with `request.create` calls.\n// =============================================================================\n\nconst HTTP_METHODS = ['get', 'post', 'put', 'patch', 'delete', 'options', 'head'];\n\ninterface Candidate {\n method: string;\n path: string;\n framework: 'express' | 'fastapi' | 'nest' | 'spring';\n line: number;\n}\n\nexport const codebaseExtractCollectionTool: AnyToolDef = {\n name: 'codebase.extract_collection',\n description:\n 'Scan source code for HTTP route definitions (Express, FastAPI, NestJS, Spring) and return candidate requests for the user to confirm before import.',\n inputSchema: z.object({\n source: z.string().min(1),\n /** Hint to limit which framework patterns to apply. Empty = try all. */\n frameworks: z.array(z.enum(['express', 'fastapi', 'nest', 'spring'])).default([]),\n }),\n async handler(input) {\n const enabled = new Set(\n input.frameworks.length ? input.frameworks : ['express', 'fastapi', 'nest', 'spring'],\n );\n const candidates: Candidate[] = [];\n const lines = input.source.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (enabled.has('express')) {\n const m =\n /(?:^|[\\s\\b])(?:app|router)\\.(get|post|put|patch|delete|options|head)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/i.exec(\n line,\n );\n if (m) {\n candidates.push({\n method: m[1].toUpperCase(),\n path: m[2],\n framework: 'express',\n line: i + 1,\n });\n continue;\n }\n }\n if (enabled.has('fastapi')) {\n const m =\n /@(?:app|router)\\.(get|post|put|patch|delete|options|head)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/i.exec(\n line,\n );\n if (m) {\n candidates.push({\n method: m[1].toUpperCase(),\n path: m[2],\n framework: 'fastapi',\n line: i + 1,\n });\n continue;\n }\n }\n if (enabled.has('nest')) {\n const m = /@(Get|Post|Put|Patch|Delete|Options|Head)\\s*\\(\\s*['\"`]([^'\"`]*)['\"`]\\s*\\)/i.exec(\n line,\n );\n if (m) {\n candidates.push({\n method: m[1].toUpperCase(),\n path: m[2] || '/',\n framework: 'nest',\n line: i + 1,\n });\n continue;\n }\n }\n if (enabled.has('spring')) {\n const verb = /@(Get|Post|Put|Patch|Delete)Mapping\\s*\\(?\\s*['\"`]?([^'\"`)\\s]*)/i.exec(line);\n if (verb && HTTP_METHODS.includes(verb[1].toLowerCase())) {\n candidates.push({\n method: verb[1].toUpperCase(),\n path: verb[2] || '/',\n framework: 'spring',\n line: i + 1,\n });\n continue;\n }\n const generic =\n /@RequestMapping\\s*\\(\\s*[^)]*method\\s*=\\s*RequestMethod\\.(GET|POST|PUT|PATCH|DELETE)[^)]*?(?:value|path)?\\s*=?\\s*['\"`]?([^'\"`)\\s,]*)/i.exec(\n line,\n );\n if (generic) {\n candidates.push({\n method: generic[1].toUpperCase(),\n path: generic[2] || '/',\n framework: 'spring',\n line: i + 1,\n });\n }\n }\n }\n return { count: candidates.length, candidates };\n },\n};\n","import { z } from 'zod';\nimport type {\n Assertion,\n Environment,\n ExecutionPlan,\n Folder,\n MockEndpoint,\n MockResponseConfig,\n MockServer,\n Request as ApiRequest,\n RequestAuth,\n RequestBody,\n} from '@apicircle/shared';\nimport { generateId, makeDefaultMockResponse, makeDefaultRequestSchema } from '@apicircle/shared';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// Prompt-driven authoring tools. The AI client converts the user's natural-\n// language request into JSON matching the schemas below; the server validates\n// + persists. The actual NL → JSON conversion happens client-side in the AI's\n// own model, not here.\n// =============================================================================\n\nexport const promptCreateEnvironmentTool: AnyToolDef = {\n name: 'prompt.create_environment',\n description:\n 'Create a new environment from an LLM-shaped JSON envelope. The model produces { name, variables: [{ key, value, encrypted }] }; this tool validates and persists it.',\n inputSchema: z.object({\n name: z.string(),\n variables: z.array(\n z.object({\n key: z.string(),\n value: z.string(),\n encrypted: z.boolean().default(false),\n }),\n ),\n }),\n async handler(input, ctx) {\n const env: Environment = { name: input.name, variables: input.variables };\n const out = await ctx.workspace.apply({ kind: 'environment.upsert', environment: env });\n return { name: env.name, changedIds: out.changedIds };\n },\n};\n\nexport const promptCreateAssertionTool: AnyToolDef = {\n name: 'prompt.create_assertion',\n description:\n 'Add an assertion to a request from an LLM-shaped JSON envelope. Useful when the user asks \"assert that the response status is 200 and body.id matches\".',\n inputSchema: z.object({\n requestId: z.string(),\n assertion: z.object({\n kind: z.enum(['status', 'header', 'json-path', 'duration']),\n op: z.enum(['equals', 'not-equals', 'contains', 'lt', 'gt', 'matches']),\n target: z.string().optional(),\n expected: z.union([z.string(), z.number()]),\n }),\n }),\n async handler(input, ctx) {\n const assertion: Assertion = {\n ...input.assertion,\n id: generateId(),\n } as Assertion;\n const out = await ctx.workspace.apply({\n kind: 'assertion.upsert',\n requestId: input.requestId,\n assertion,\n });\n return { id: assertion.id, changedIds: out.changedIds };\n },\n};\n\nexport const promptCreatePlanTool: AnyToolDef = {\n name: 'prompt.create_plan',\n description:\n 'Create an execution plan from an LLM-shaped JSON envelope. The model produces { name, stepRequestIds: [...] } and the tool validates that each id exists in the workspace before persisting.',\n inputSchema: z.object({\n name: z.string(),\n stepRequestIds: z.array(z.string()).default([]),\n envPriorityOrder: z.array(z.string()).default([]),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const missing: string[] = [];\n for (const rid of input.stepRequestIds) {\n if (!state.synced.collections.requests[rid]) missing.push(rid);\n }\n if (missing.length) {\n return {\n ok: false,\n error: `Unknown request ids: ${missing.join(', ')}`,\n missing,\n };\n }\n const id = generateId();\n const now = new Date().toISOString();\n const plan: ExecutionPlan = {\n id,\n name: input.name,\n steps: input.stepRequestIds.map((requestId: string) => ({ requestId })),\n envPriorityOrder: input.envPriorityOrder,\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'plan.upsert', plan });\n return { ok: true, id, changedIds: out.changedIds };\n },\n};\n\n// =============================================================================\n// Shared schema fragments for the request- and mock-shaped prompt.* tools\n// below. Kept inline (vs imported from crud.ts / mocks.ts) so each prompt.*\n// tool stays a self-contained NL contract — the canonical CRUD schemas can\n// evolve without dragging the prompt surface with them.\n// =============================================================================\n\nconst HTTP_METHOD = z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']);\n\nconst HEADER_OR_QUERY = z.object({\n key: z.string(),\n value: z.string(),\n enabled: z.boolean().default(true),\n});\n\nconst REQUEST_BODY = z.object({\n type: z.enum(['none', 'json', 'text', 'xml', 'graphql', 'urlencoded']).default('none'),\n content: z.string().default(''),\n variables: z.string().optional(),\n});\n\n// LLM-friendly auth surface — covers the authoring flows a model can plausibly\n// produce from natural language. OAuth2 / AWS / Hawk / NTLM / JWT are token-\n// state heavy and best authored via the dedicated UI, then patched via\n// `request.update`. Callers needing them should use that path.\nconst PROMPT_AUTH = z.discriminatedUnion('type', [\n z.object({ type: z.literal('none') }),\n z.object({ type: z.literal('inherit') }),\n z.object({ type: z.literal('bearer'), token: z.string().default('') }),\n z.object({\n type: z.literal('basic'),\n username: z.string().default(''),\n password: z.string().default(''),\n }),\n z.object({\n type: z.literal('api-key'),\n key: z.string().default(''),\n value: z.string().default(''),\n addTo: z.enum(['header', 'query', 'cookie']).default('header'),\n }),\n z.object({\n type: z.literal('custom-header'),\n key: z.string().default(''),\n value: z.string().default(''),\n }),\n]);\n\nconst PROMPT_ASSERTION = z.object({\n kind: z.enum(['status', 'header', 'json-path', 'duration']),\n op: z.enum(['equals', 'not-equals', 'contains', 'lt', 'gt', 'matches']),\n target: z.string().optional(),\n expected: z.union([z.string(), z.number()]),\n});\n\nconst ENDPOINT_RESPONSE = z.object({\n status: z.number().int().min(100).max(599).default(200),\n jsonBody: z.string().default('{}'),\n contentType: z.string().default('application/json'),\n});\n\nconst VALIDATION_RULE_NL = z.object({\n kind: z.enum([\n 'header-required',\n 'header-equals',\n 'header-matches',\n 'query-required',\n 'query-equals',\n 'query-matches',\n 'cookie-required',\n 'body-required',\n 'content-type-equals',\n ]),\n target: z.string().default(''),\n expected: z.string().optional(),\n message: z.string().optional(),\n enabled: z.boolean().default(true),\n failResponse: z\n .object({\n status: z.number().int().min(100).max(599).default(400),\n jsonBody: z.string().default('{\"error\":\"validation failed\"}'),\n })\n .default({}),\n});\n\nconst CONDITION_CLAUSE_NL = z.object({\n scope: z.enum(['query', 'pathParam', 'header', 'cookie', 'body-json-path']),\n target: z.string(),\n op: z.enum(['equals', 'not-equals', 'matches', 'gt', 'lt', 'gte', 'lte', 'present', 'absent']),\n value: z.string().optional(),\n});\n\nconst RESPONSE_RULE_NL = z.object({\n name: z.string(),\n enabled: z.boolean().default(true),\n when: z.array(CONDITION_CLAUSE_NL).default([]),\n response: z\n .object({\n status: z.number().int().min(100).max(599).default(200),\n jsonBody: z.string().default('{}'),\n })\n .default({}),\n});\n\nconst MULTIPLIER_NL = z.object({\n name: z.string().optional(),\n source: z.object({\n kind: z.enum(['query', 'pathParam', 'header', 'body-json-path']),\n key: z.string(),\n }),\n targetJsonPath: z.string(),\n defaultCount: z.number().int().nonnegative().default(0),\n min: z.number().int().nonnegative().optional(),\n max: z.number().int().nonnegative().optional(),\n});\n\nconst ENDPOINT_INPUT = z.object({\n method: HTTP_METHOD,\n pathPattern: z.string().min(1),\n name: z.string().optional(),\n description: z.string().optional(),\n response: ENDPOINT_RESPONSE.optional(),\n validationRules: z.array(VALIDATION_RULE_NL).default([]),\n responseRules: z.array(RESPONSE_RULE_NL).default([]),\n multipliers: z.array(MULTIPLIER_NL).default([]),\n});\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildRequestBody(input?: z.infer<typeof REQUEST_BODY>): RequestBody {\n if (!input) return { type: 'none', content: '' };\n const body: RequestBody = { type: input.type, content: input.content };\n if (input.variables !== undefined && input.type === 'graphql') {\n body.variables = input.variables;\n }\n return body;\n}\n\nfunction buildEndpoint(input: z.infer<typeof ENDPOINT_INPUT>): MockEndpoint {\n const response = input.response ?? {\n status: 200,\n jsonBody: '{}',\n contentType: 'application/json',\n };\n const headers = [{ key: 'Content-Type', value: response.contentType, enabled: true as const }];\n const defaultResponse: MockResponseConfig = {\n ...makeDefaultMockResponse(),\n status: response.status,\n headers,\n body: { type: 'json', content: response.jsonBody },\n };\n // Inputs from raw JSON (callers bypassing zod parse) may have these arrays\n // omitted. Treat undefined as empty so the build path never NPEs.\n const validationRules = input.validationRules ?? [];\n const responseRules = input.responseRules ?? [];\n const multipliers = input.multipliers ?? [];\n if (multipliers.length > 0) {\n defaultResponse.multipliers = multipliers.map((m) => ({\n id: generateId(),\n name: m.name,\n source: { kind: m.source.kind, key: m.source.key },\n targetJsonPath: m.targetJsonPath,\n defaultCount: m.defaultCount,\n min: m.min,\n max: m.max,\n }));\n }\n return {\n id: generateId(),\n name: input.name ?? `${input.method} ${input.pathPattern}`,\n method: input.method,\n pathPattern: input.pathPattern,\n description: input.description,\n requestSchema: makeDefaultRequestSchema(),\n requestValidation: validationRules.map((r) => ({\n id: generateId(),\n kind: r.kind,\n target: r.target,\n expected: r.expected,\n message: r.message,\n enabled: r.enabled,\n failResponse: {\n status: r.failResponse.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: r.failResponse.jsonBody },\n },\n })),\n responseRules: responseRules.map((r) => ({\n id: generateId(),\n name: r.name,\n enabled: r.enabled,\n when: (r.when ?? []).map((c) => ({\n id: generateId(),\n scope: c.scope,\n target: c.target,\n op: c.op,\n value: c.value,\n })),\n response: {\n status: r.response.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: r.response.jsonBody },\n },\n })),\n defaultResponse,\n };\n}\n\nfunction patchEndpoint(\n mock: MockServer,\n endpointId: string,\n patcher: (e: MockEndpoint) => MockEndpoint,\n): MockServer | null {\n const idx = mock.endpoints.findIndex((e) => e.id === endpointId);\n if (idx === -1) return null;\n const nextEndpoints = [...mock.endpoints];\n nextEndpoints[idx] = patcher(mock.endpoints[idx]);\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n return {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Requests\n// ---------------------------------------------------------------------------\n\nexport const promptCreateRequestTool: AnyToolDef = {\n name: 'prompt.create_request',\n description:\n 'Create a fully-shaped request from an LLM-shaped JSON envelope: method, url, headers, query params, body, auth, and inline assertions. The model produces a flat object; this tool generates the request id, normalizes auth (defaults to `inherit` so folder auth wins), and persists.',\n inputSchema: z.object({\n name: z.string().default('New request'),\n method: HTTP_METHOD.default('GET'),\n url: z.string().default(''),\n folderId: z.string().nullable().optional(),\n headers: z.array(HEADER_OR_QUERY).default([]),\n queryParams: z.array(HEADER_OR_QUERY).default([]),\n pathParams: z.record(z.string(), z.string()).optional(),\n body: REQUEST_BODY.optional(),\n auth: PROMPT_AUTH.optional(),\n assertions: z.array(PROMPT_ASSERTION).default([]),\n }),\n async handler(input, ctx) {\n const now = new Date().toISOString();\n const auth: RequestAuth = (input.auth ?? { type: 'inherit' }) as RequestAuth;\n const assertions: Array<z.infer<typeof PROMPT_ASSERTION>> = input.assertions ?? [];\n const request: ApiRequest = {\n id: generateId(),\n name: input.name ?? 'New request',\n folderId: input.folderId ?? null,\n method: input.method ?? 'GET',\n url: input.url ?? '',\n headers: input.headers ?? [],\n query: input.queryParams ?? [],\n pathParams: input.pathParams,\n body: buildRequestBody(input.body),\n auth,\n contextVars: [],\n extractions: [],\n assertions: assertions.map((a) => ({ ...a, id: generateId() })),\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'request.create', request });\n return { id: request.id, changedIds: out.changedIds };\n },\n};\n\nexport const promptUpdateRequestTool: AnyToolDef = {\n name: 'prompt.update_request',\n description:\n 'Patch an existing request from an LLM-shaped JSON envelope. Provided fields replace the existing values; omitted fields are left untouched. Arrays (headers, queryParams, assertions) are full replacements when supplied. Returns `{ ok: false, error }` when the id does not resolve.',\n inputSchema: z.object({\n id: z.string(),\n patch: z\n .object({\n name: z.string().optional(),\n method: HTTP_METHOD.optional(),\n url: z.string().optional(),\n folderId: z.string().nullable().optional(),\n headers: z.array(HEADER_OR_QUERY).optional(),\n queryParams: z.array(HEADER_OR_QUERY).optional(),\n pathParams: z.record(z.string(), z.string()).optional(),\n body: REQUEST_BODY.optional(),\n auth: PROMPT_AUTH.optional(),\n assertions: z.array(PROMPT_ASSERTION).optional(),\n })\n .strict(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n if (!state.synced.collections.requests[input.id]) {\n return { ok: false as const, error: 'request not found' as const };\n }\n const patch: Partial<Omit<ApiRequest, 'id' | 'createdAt'>> = {};\n if (input.patch.name !== undefined) patch.name = input.patch.name;\n if (input.patch.method !== undefined) patch.method = input.patch.method;\n if (input.patch.url !== undefined) patch.url = input.patch.url;\n if (input.patch.folderId !== undefined) patch.folderId = input.patch.folderId ?? null;\n if (input.patch.headers !== undefined) patch.headers = input.patch.headers;\n if (input.patch.queryParams !== undefined) patch.query = input.patch.queryParams;\n if (input.patch.pathParams !== undefined) patch.pathParams = input.patch.pathParams;\n if (input.patch.body !== undefined) patch.body = buildRequestBody(input.patch.body);\n if (input.patch.auth !== undefined) patch.auth = input.patch.auth as RequestAuth;\n if (input.patch.assertions !== undefined) {\n patch.assertions = input.patch.assertions.map((a: z.infer<typeof PROMPT_ASSERTION>) => ({\n ...a,\n id: generateId(),\n }));\n }\n const out = await ctx.workspace.apply({ kind: 'request.update', id: input.id, patch });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Folders\n// ---------------------------------------------------------------------------\n\ninterface FolderTreeNode {\n name: string;\n children?: FolderTreeNode[];\n}\n\nconst FOLDER_TREE_NODE: z.ZodType<FolderTreeNode> = z.lazy(() =>\n z.object({\n name: z.string(),\n children: z.array(FOLDER_TREE_NODE).optional(),\n }),\n);\n\nexport const promptCreateFolderTreeTool: AnyToolDef = {\n name: 'prompt.create_folder_tree',\n description:\n 'Create a recursive folder hierarchy from an LLM-shaped JSON envelope. The model produces `{ parentId?, tree: { name, children?: [...] } }` and this tool walks the tree, generating ids and persisting one folder per node. Returns the list of created ids in pre-order.',\n inputSchema: z.object({\n parentId: z.string().nullable().optional(),\n tree: FOLDER_TREE_NODE,\n }),\n async handler(input, ctx) {\n const createdIds: string[] = [];\n const allChangedIds: string[] = [];\n const walk = async (node: FolderTreeNode, parentId: string | null): Promise<void> => {\n const folder: Folder = {\n id: generateId(),\n name: node.name,\n parentId,\n };\n const out = await ctx.workspace.apply({ kind: 'folder.create', folder });\n createdIds.push(folder.id);\n allChangedIds.push(...out.changedIds);\n for (const child of node.children ?? []) {\n await walk(child, folder.id);\n }\n };\n await walk(input.tree, input.parentId ?? null);\n return { createdIds, changedIds: allChangedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Plans\n// ---------------------------------------------------------------------------\n\nexport const promptAddPlanStepsTool: AnyToolDef = {\n name: 'prompt.add_plan_steps',\n description:\n 'Append one or more steps to an existing execution plan from an LLM-shaped JSON envelope. The model produces `{ planId, requestIds: [...] }`; each id is validated against the workspace before any step is appended. Order in the input list is preserved.',\n inputSchema: z.object({\n planId: z.string(),\n requestIds: z.array(z.string()).min(1),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n const requestIds: string[] = input.requestIds;\n const missing = requestIds.filter((rid) => !state.synced.collections.requests[rid]);\n if (missing.length) {\n return {\n ok: false as const,\n error: `Unknown request ids: ${missing.join(', ')}`,\n missing,\n };\n }\n const newSteps = requestIds.map((requestId) => ({ requestId }));\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: {\n ...plan,\n steps: [...plan.steps, ...newSteps],\n updatedAt: new Date().toISOString(),\n },\n });\n return { ok: true as const, addedCount: newSteps.length, changedIds: out.changedIds };\n },\n};\n\nexport const promptSetPlanVariablesTool: AnyToolDef = {\n name: 'prompt.set_plan_variables',\n description:\n 'Replace the plan-scoped variables on an execution plan from an LLM-shaped JSON envelope. The model produces `{ planId, variables: [{ key, value }] }`. Empty array clears all plan variables.',\n inputSchema: z.object({\n planId: z.string(),\n variables: z.array(z.object({ key: z.string(), value: z.string() })),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const plan = state.local.executionPlans[input.planId];\n if (!plan) return { ok: false as const, error: 'plan not found' as const };\n const out = await ctx.workspace.apply({\n kind: 'plan.upsert',\n plan: { ...plan, variables: input.variables, updatedAt: new Date().toISOString() },\n });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\n// ---------------------------------------------------------------------------\n// Mocks\n// ---------------------------------------------------------------------------\n\nexport const promptCreateMockServerTool: AnyToolDef = {\n name: 'prompt.create_mock_server',\n description:\n 'Create a manual-mode mock server with optional inline endpoints from an LLM-shaped JSON envelope. The model produces `{ name, defaultPort?, endpoints: [{ method, pathPattern, name?, response?, validationRules?, responseRules?, multipliers? }] }`; this tool generates ids for the server and every endpoint / rule, then persists in one shot.',\n inputSchema: z.object({\n name: z.string().min(1),\n defaultPort: z.number().int().positive().nullable().optional(),\n endpoints: z.array(ENDPOINT_INPUT).default([]),\n }),\n async handler(input, ctx) {\n const now = new Date().toISOString();\n const endpointInputs: Array<z.infer<typeof ENDPOINT_INPUT>> = input.endpoints ?? [];\n const endpoints = endpointInputs.map((e) => buildEndpoint(e));\n const mock: MockServer = {\n id: generateId(),\n name: input.name,\n source: { kind: 'manual', endpoints },\n endpoints,\n defaultPort: input.defaultPort ?? null,\n cors: { enabled: true, origins: ['*'] },\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointIds: endpoints.map((e: MockEndpoint) => e.id),\n changedIds: out.changedIds,\n };\n },\n};\n\nexport const promptAddMockEndpointTool: AnyToolDef = {\n name: 'prompt.add_mock_endpoint',\n description:\n 'Append a new endpoint (with optional inline validation rules, response rules, and multipliers) to an existing mock server from an LLM-shaped JSON envelope. All ids are auto-generated; the existing endpoints stay in place.',\n inputSchema: z.object({\n mockId: z.string(),\n method: HTTP_METHOD,\n pathPattern: z.string().min(1),\n name: z.string().optional(),\n description: z.string().optional(),\n response: ENDPOINT_RESPONSE.optional(),\n validationRules: z.array(VALIDATION_RULE_NL).default([]),\n responseRules: z.array(RESPONSE_RULE_NL).default([]),\n multipliers: z.array(MULTIPLIER_NL).default([]),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const endpoint = buildEndpoint(input);\n const nextEndpoints = [...mock.endpoints, endpoint];\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n const next: MockServer = {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, endpointId: endpoint.id, changedIds: out.changedIds };\n },\n};\n\nexport const promptSetEndpointValidationRulesTool: AnyToolDef = {\n name: 'prompt.set_endpoint_validation_rules',\n description:\n \"Replace an endpoint's validation rules with an LLM-shaped list. Every rule gets a fresh id; the existing rules are dropped. Empty array clears all validation rules.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n rules: z.array(VALIDATION_RULE_NL),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const rules: Array<z.infer<typeof VALIDATION_RULE_NL>> = input.rules;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n requestValidation: rules.map((r) => ({\n id: generateId(),\n kind: r.kind,\n target: r.target,\n expected: r.expected,\n message: r.message,\n enabled: r.enabled,\n failResponse: {\n status: r.failResponse.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: r.failResponse.jsonBody },\n },\n })),\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const promptSetEndpointResponseRulesTool: AnyToolDef = {\n name: 'prompt.set_endpoint_response_rules',\n description:\n \"Replace an endpoint's conditional response rules with an LLM-shaped list. Rules fire in order, first match wins. Every rule + clause gets a fresh id. Empty array falls back to defaultResponse.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n rules: z.array(RESPONSE_RULE_NL),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const rules: Array<z.infer<typeof RESPONSE_RULE_NL>> = input.rules;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n responseRules: rules.map((r) => ({\n id: generateId(),\n name: r.name,\n enabled: r.enabled,\n when: r.when.map((c: z.infer<typeof CONDITION_CLAUSE_NL>) => ({\n id: generateId(),\n scope: c.scope,\n target: c.target,\n op: c.op,\n value: c.value,\n })),\n response: {\n status: r.response.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: r.response.jsonBody },\n },\n })),\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const promptSetEndpointMultipliersTool: AnyToolDef = {\n name: 'prompt.set_endpoint_multipliers',\n description:\n \"Replace the response multipliers on an endpoint's defaultResponse with an LLM-shaped list. Multipliers expand an array at `targetJsonPath` to a count derived from a request value. Every multiplier gets a fresh id. Empty array clears all multipliers.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n multipliers: z.array(MULTIPLIER_NL),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const multipliers: Array<z.infer<typeof MULTIPLIER_NL>> = input.multipliers;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n defaultResponse: {\n ...e.defaultResponse,\n multipliers:\n multipliers.length === 0\n ? undefined\n : multipliers.map((m) => ({\n id: generateId(),\n name: m.name,\n source: { kind: m.source.kind, key: m.source.key },\n targetJsonPath: m.targetJsonPath,\n defaultCount: m.defaultCount,\n min: m.min,\n max: m.max,\n })),\n },\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n","import { z } from 'zod';\nimport type {\n MockEndpoint,\n MockResponseConfig,\n MockServer,\n MockServerSource,\n} from '@apicircle/shared';\nimport { generateId, makeDefaultMockResponse, makeDefaultRequestSchema } from '@apicircle/shared';\nimport { parseSourceToEndpoints } from '@apicircle/mock-server-core';\nimport type { AnyToolDef } from './types';\n\n// =============================================================================\n// Mock-server tools. Definitions live in `synced.mockServers` (push to git);\n// `mock.start` / `mock.stop` go through the MockController so the MCP host's\n// environment (Electron main, CLI, hosted) controls the actual lifecycle.\n// =============================================================================\n\nasync function ingestSource(\n source: MockServerSource,\n name: string,\n): Promise<{ mock: MockServer; warnings: string[] }> {\n const { endpoints, warnings } = await parseSourceToEndpoints(source);\n const now = new Date().toISOString();\n const mock: MockServer = {\n id: generateId(),\n name,\n source,\n endpoints,\n defaultPort: null,\n // Off by default — match UI-created mocks. User opts in via cors.enabled=true\n // after explicitly listing origins (see CorsSection in MockServersPanel).\n cors: { enabled: false, origins: [] },\n createdAt: now,\n updatedAt: now,\n };\n return { mock, warnings };\n}\n\nexport const mockCreateFromOpenApiTool: AnyToolDef = {\n name: 'mock.create_from_openapi',\n description: 'Create a mock server from an OpenAPI / Swagger spec (YAML or JSON).',\n inputSchema: z.object({\n name: z.string(),\n spec: z.string().min(1),\n format: z.enum(['json', 'yaml']).default('json'),\n }),\n async handler(input, ctx) {\n const { mock, warnings } = await ingestSource(\n { kind: 'openapi', spec: input.spec, format: input.format },\n input.name,\n );\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointCount: mock.endpoints.length,\n changedIds: out.changedIds,\n warnings,\n };\n },\n};\n\nexport const mockCreateFromPostmanTool: AnyToolDef = {\n name: 'mock.create_from_postman',\n description: 'Create a mock server from a Postman v2/v2.1 collection.',\n inputSchema: z.object({ name: z.string(), collection: z.string().min(1) }),\n async handler(input, ctx) {\n const { mock, warnings } = await ingestSource(\n { kind: 'postman', collection: input.collection },\n input.name,\n );\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointCount: mock.endpoints.length,\n changedIds: out.changedIds,\n warnings,\n };\n },\n};\n\nexport const mockCreateFromInsomniaTool: AnyToolDef = {\n name: 'mock.create_from_insomnia',\n description: 'Create a mock server from an Insomnia v4 export.',\n inputSchema: z.object({ name: z.string(), export: z.string().min(1) }),\n async handler(input, ctx) {\n const { mock, warnings } = await ingestSource(\n { kind: 'insomnia', export: input.export },\n input.name,\n );\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointCount: mock.endpoints.length,\n changedIds: out.changedIds,\n warnings,\n };\n },\n};\n\n// Postman has its own \"mock collection\" concept — same parser, but we tag\n// the source so the UI can label it differently in the mock list.\nexport const mockImportPostmanMockCollectionTool: AnyToolDef = {\n name: 'mock.import_postman_mock_collection',\n description:\n \"Import a Postman Mock Collection (collections previously hosted on Postman's mock service). Same parser as a regular Postman collection but marked as a mock import.\",\n inputSchema: z.object({ name: z.string(), collection: z.string().min(1) }),\n async handler(input, ctx) {\n const { mock, warnings } = await ingestSource(\n { kind: 'postman', collection: input.collection },\n input.name,\n );\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return {\n id: mock.id,\n endpointCount: mock.endpoints.length,\n changedIds: out.changedIds,\n warnings,\n };\n },\n};\n\nexport const mockListTool: AnyToolDef = {\n name: 'mock.list',\n description:\n 'List all mock servers in the workspace plus their runtime status (running / stopped, port).',\n inputSchema: z.object({}),\n async handler(_input, ctx) {\n const state = await ctx.workspace.read();\n const running = await ctx.mock.list();\n const runningById = new Map(running.map((r) => [r.serverId, r.runtime]));\n const items = Object.values(state.synced.mockServers).map((m) => {\n const runtime = runningById.get(m.id);\n return {\n id: m.id,\n name: m.name,\n endpointCount: m.endpoints.length,\n defaultPort: m.defaultPort,\n running: !!runtime,\n port: runtime?.port ?? null,\n };\n });\n return { count: items.length, mocks: items };\n },\n};\n\nexport const mockStartTool: AnyToolDef = {\n name: 'mock.start',\n description:\n 'Start a mock server by id. Returns the bound port. Errors if the mock is already running or the requested port is in use.',\n inputSchema: z.object({\n id: z.string(),\n port: z.number().int().positive().optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.id];\n if (!mock) return { ok: false, error: 'mock not found' };\n try {\n const result = await ctx.mock.start(mock, { port: input.port });\n return { ok: true, port: result.port, pid: result.pid, startedAt: result.startedAt };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : 'mock.start failed' };\n }\n },\n};\n\nexport const mockStopTool: AnyToolDef = {\n name: 'mock.stop',\n description: 'Stop a running mock server by id (no-op if not running).',\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n try {\n await ctx.mock.stop(input.id);\n return { ok: true };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : 'mock.stop failed' };\n }\n },\n};\n\nexport const mockDeleteTool: AnyToolDef = {\n name: 'mock.delete',\n description: \"Delete a mock server definition. Stops it first if it's running.\",\n inputSchema: z.object({ id: z.string() }),\n async handler(input, ctx) {\n try {\n await ctx.mock.stop(input.id);\n } catch {\n // best-effort stop; deletion proceeds either way\n }\n const out = await ctx.workspace.apply({ kind: 'mock.delete', id: input.id });\n return { ok: true, changedIds: out.changedIds };\n },\n};\n\n// =============================================================================\n// Manual mock construction & endpoint-level CRUD\n// -----------------------------------------------------------------------------\n// `mock.create_manual` mirrors the web UI's \"New mock server\" → manual mode.\n// The endpoint tools below let an MCP client author endpoints + their default\n// responses without needing to round-trip through `workspace.write` with a\n// hand-built blob.\n// =============================================================================\n\nconst HTTP_METHOD = z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']);\n\nexport const mockCreateManualTool: AnyToolDef = {\n name: 'mock.create_manual',\n description:\n 'Create an empty manual-mode mock server. Use `mock.add_endpoint` afterward to populate it. CORS defaults to off (same-origin only); enable + list explicit origins via `mock.update_cors` if cross-origin access is needed.',\n inputSchema: z.object({\n name: z.string().min(1),\n defaultPort: z.number().int().positive().nullable().optional(),\n }),\n async handler(input, ctx) {\n const now = new Date().toISOString();\n const mock: MockServer = {\n id: generateId(),\n name: input.name,\n source: { kind: 'manual', endpoints: [] },\n endpoints: [],\n defaultPort: input.defaultPort ?? null,\n // Off by default — match UI-created mocks. Caller opts in via\n // explicit origins; we never silently wildcard.\n cors: { enabled: false, origins: [] },\n createdAt: now,\n updatedAt: now,\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock });\n return { id: mock.id, changedIds: out.changedIds };\n },\n};\n\nexport const mockListEndpointsTool: AnyToolDef = {\n name: 'mock.list_endpoints',\n description: 'List endpoints for a mock server (id, method, path, name).',\n inputSchema: z.object({ mockId: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false, error: 'mock not found' as const };\n return {\n ok: true as const,\n count: mock.endpoints.length,\n endpoints: mock.endpoints.map((e) => ({\n id: e.id,\n method: e.method,\n pathPattern: e.pathPattern,\n name: e.name,\n validationCount: e.requestValidation.length,\n responseRuleCount: e.responseRules.length,\n })),\n };\n },\n};\n\nconst ENDPOINT_RESPONSE = z.object({\n status: z.number().int().min(100).max(599).default(200),\n jsonBody: z.string().default('{}'),\n contentType: z.string().default('application/json'),\n});\n\nfunction buildDefaultEndpoint(args: {\n method: z.infer<typeof HTTP_METHOD>;\n pathPattern: string;\n name?: string;\n description?: string;\n response?: z.infer<typeof ENDPOINT_RESPONSE>;\n}): MockEndpoint {\n const response = args.response ?? {\n status: 200,\n jsonBody: '{}',\n contentType: 'application/json',\n };\n const headers = [{ key: 'Content-Type', value: response.contentType, enabled: true as const }];\n return {\n id: generateId(),\n name: args.name ?? `${args.method} ${args.pathPattern}`,\n method: args.method,\n pathPattern: args.pathPattern,\n description: args.description,\n requestSchema: makeDefaultRequestSchema(),\n requestValidation: [],\n responseRules: [],\n defaultResponse: {\n ...makeDefaultMockResponse(),\n status: response.status,\n headers,\n body: { type: 'json', content: response.jsonBody },\n },\n };\n}\n\nexport const mockAddEndpointTool: AnyToolDef = {\n name: 'mock.add_endpoint',\n description:\n 'Append a new endpoint to a mock server. Defaults to a 200 JSON response of `{}`. Returns the new endpoint id.',\n inputSchema: z.object({\n mockId: z.string(),\n method: HTTP_METHOD,\n pathPattern: z.string().min(1),\n name: z.string().optional(),\n description: z.string().optional(),\n response: ENDPOINT_RESPONSE.optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false, error: 'mock not found' as const };\n const endpoint = buildDefaultEndpoint(input);\n const nextEndpoints = [...mock.endpoints, endpoint];\n // Manual-mode mocks mirror endpoints back into source so the runtime\n // sees the same array regardless of which field it reads.\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n const next: MockServer = {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, endpointId: endpoint.id, changedIds: out.changedIds };\n },\n};\n\nexport const mockUpdateEndpointTool: AnyToolDef = {\n name: 'mock.update_endpoint',\n description:\n 'Patch fields on a single mock endpoint (method, pathPattern, name, description, defaultResponse status / contentType / json body). Pass only the fields you want to change.',\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n method: HTTP_METHOD.optional(),\n pathPattern: z.string().optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n response: ENDPOINT_RESPONSE.partial().optional(),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false, error: 'mock not found' as const };\n const idx = mock.endpoints.findIndex((e) => e.id === input.endpointId);\n if (idx === -1) return { ok: false, error: 'endpoint not found' as const };\n const existing = mock.endpoints[idx];\n const nextEndpoint: MockEndpoint = {\n ...existing,\n method: input.method ?? existing.method,\n pathPattern: input.pathPattern ?? existing.pathPattern,\n name: input.name ?? existing.name,\n description: input.description ?? existing.description,\n defaultResponse: input.response\n ? {\n ...existing.defaultResponse,\n status: input.response.status ?? existing.defaultResponse.status,\n headers: input.response.contentType\n ? existing.defaultResponse.headers.map((h) =>\n h.key.toLowerCase() === 'content-type'\n ? { ...h, value: input.response!.contentType! }\n : h,\n )\n : existing.defaultResponse.headers,\n body:\n input.response.jsonBody !== undefined\n ? { type: 'json', content: input.response.jsonBody }\n : existing.defaultResponse.body,\n }\n : existing.defaultResponse,\n };\n const nextEndpoints = [...mock.endpoints];\n nextEndpoints[idx] = nextEndpoint;\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n const next: MockServer = {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const mockDeleteEndpointTool: AnyToolDef = {\n name: 'mock.delete_endpoint',\n description: 'Remove an endpoint from a mock server.',\n inputSchema: z.object({ mockId: z.string(), endpointId: z.string() }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false, error: 'mock not found' as const };\n const nextEndpoints = mock.endpoints.filter((e) => e.id !== input.endpointId);\n if (nextEndpoints.length === mock.endpoints.length) {\n return { ok: false, error: 'endpoint not found' as const };\n }\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n const next: MockServer = {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\n// =============================================================================\n// Endpoint rule + multiplier editing\n// -----------------------------------------------------------------------------\n// Validation rules, response rules, and multipliers are all replace-only —\n// MCP clients send the full ordered list, the tool writes it. Granular per-\n// rule mutations would multiply the surface area without adding capability;\n// the MCP client can read, mutate, write back.\n// =============================================================================\n\nconst VALIDATION_RULE = z.object({\n id: z.string().optional(),\n kind: z.enum([\n 'header-required',\n 'header-equals',\n 'header-matches',\n 'query-required',\n 'query-equals',\n 'query-matches',\n 'cookie-required',\n 'body-required',\n 'content-type-equals',\n ]),\n target: z.string().default(''),\n expected: z.string().optional(),\n message: z.string().optional(),\n enabled: z.boolean().default(true),\n failResponse: z\n .object({\n status: z.number().int().min(100).max(599).default(400),\n jsonBody: z.string().default('{\"error\":\"validation failed\"}'),\n })\n .default({}),\n});\n\nconst CONDITION_CLAUSE = z.object({\n id: z.string().optional(),\n scope: z.enum(['query', 'pathParam', 'header', 'cookie', 'body-json-path']),\n target: z.string(),\n op: z.enum(['equals', 'not-equals', 'matches', 'gt', 'lt', 'gte', 'lte', 'present', 'absent']),\n value: z.string().optional(),\n});\n\nconst RESPONSE_RULE = z.object({\n id: z.string().optional(),\n name: z.string(),\n enabled: z.boolean().default(true),\n when: z.array(CONDITION_CLAUSE).default([]),\n response: z\n .object({\n status: z.number().int().min(100).max(599).default(200),\n jsonBody: z.string().default('{}'),\n })\n .default({}),\n});\n\nconst MULTIPLIER = z.object({\n id: z.string().optional(),\n name: z.string().optional(),\n source: z.object({\n kind: z.enum(['query', 'pathParam', 'header', 'body-json-path']),\n key: z.string(),\n }),\n targetJsonPath: z.string(),\n defaultCount: z.number().int().nonnegative().default(0),\n min: z.number().int().nonnegative().optional(),\n max: z.number().int().nonnegative().optional(),\n});\n\nfunction defaultJsonResponseConfig(args: { status: number; jsonBody: string }): MockResponseConfig {\n return {\n status: args.status,\n headers: [{ key: 'Content-Type', value: 'application/json', enabled: true }],\n body: { type: 'json', content: args.jsonBody },\n };\n}\n\nfunction patchEndpoint(\n mock: MockServer,\n endpointId: string,\n patcher: (e: MockEndpoint) => MockEndpoint,\n): MockServer | null {\n const idx = mock.endpoints.findIndex((e) => e.id === endpointId);\n if (idx === -1) return null;\n const nextEndpoints = [...mock.endpoints];\n nextEndpoints[idx] = patcher(mock.endpoints[idx]);\n const source =\n mock.source.kind === 'manual'\n ? { kind: 'manual' as const, endpoints: nextEndpoints }\n : mock.source;\n return {\n ...mock,\n source,\n endpoints: nextEndpoints,\n updatedAt: new Date().toISOString(),\n };\n}\n\nexport const mockSetValidationRulesTool: AnyToolDef = {\n name: 'mock.set_validation_rules',\n description:\n \"Replace an endpoint's validation rules. Rules without an `id` get a fresh one; existing rules can keep theirs to preserve client-side selection state. Empty array clears all rules.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n rules: z.array(VALIDATION_RULE),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const rules: Array<z.infer<typeof VALIDATION_RULE>> = input.rules;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n requestValidation: rules.map((r) => ({\n id: r.id ?? generateId(),\n kind: r.kind,\n target: r.target,\n expected: r.expected,\n message: r.message,\n enabled: r.enabled,\n failResponse: defaultJsonResponseConfig(r.failResponse),\n })),\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const mockSetResponseRulesTool: AnyToolDef = {\n name: 'mock.set_response_rules',\n description:\n \"Replace an endpoint's conditional response rules. Rules fire in order; the first whose every clause matches wins. Disabled rules are skipped. Empty array falls back to defaultResponse.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n rules: z.array(RESPONSE_RULE),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const rules: Array<z.infer<typeof RESPONSE_RULE>> = input.rules;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n responseRules: rules.map((r) => ({\n id: r.id ?? generateId(),\n name: r.name,\n enabled: r.enabled,\n when: r.when.map((c: z.infer<typeof CONDITION_CLAUSE>) => ({\n id: c.id ?? generateId(),\n scope: c.scope,\n target: c.target,\n op: c.op,\n value: c.value,\n })),\n response: defaultJsonResponseConfig(r.response),\n })),\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n\nexport const mockSetMultipliersTool: AnyToolDef = {\n name: 'mock.set_multipliers',\n description:\n \"Replace the response multipliers on an endpoint's defaultResponse. Multipliers expand an array at `targetJsonPath` to a count derived from a request value. Empty array clears all multipliers.\",\n inputSchema: z.object({\n mockId: z.string(),\n endpointId: z.string(),\n multipliers: z.array(MULTIPLIER),\n }),\n async handler(input, ctx) {\n const state = await ctx.workspace.read();\n const mock = state.synced.mockServers[input.mockId];\n if (!mock) return { ok: false as const, error: 'mock not found' as const };\n const multipliers: Array<z.infer<typeof MULTIPLIER>> = input.multipliers;\n const next = patchEndpoint(mock, input.endpointId, (e) => ({\n ...e,\n defaultResponse: {\n ...e.defaultResponse,\n multipliers:\n multipliers.length === 0\n ? undefined\n : multipliers.map((m) => ({\n id: m.id ?? generateId(),\n name: m.name,\n source: { kind: m.source.kind, key: m.source.key },\n targetJsonPath: m.targetJsonPath,\n defaultCount: m.defaultCount,\n min: m.min,\n max: m.max,\n })),\n },\n }));\n if (!next) return { ok: false as const, error: 'endpoint not found' as const };\n const out = await ctx.workspace.apply({ kind: 'mock.upsert', mock: next });\n return { ok: true as const, changedIds: out.changedIds };\n },\n};\n","import type { McpToolName } from '@apicircle/shared';\nimport type { AnyToolDef } from './types';\nimport {\n importCurlTool,\n importOpenApiTool,\n importPostmanTool,\n importInsomniaTool,\n importHarTool,\n} from './imports';\nimport { generateCodeTool } from './codegen';\nimport { workspaceListTool } from './workspaceList';\nimport {\n workspaceReadTool,\n workspaceWriteTool,\n requestCreateTool,\n requestReadTool,\n requestUpdateTool,\n requestDeleteTool,\n folderCreateTool,\n folderReadTool,\n folderUpdateTool,\n folderDeleteTool,\n environmentCreateTool,\n environmentReadTool,\n environmentUpdateTool,\n environmentDeleteTool,\n environmentSetActiveTool,\n environmentSetPriorityTool,\n environmentExportTool,\n environmentImportTool,\n planCreateTool,\n planReadTool,\n planUpdateTool,\n planDeleteTool,\n planRunTool,\n planAddStepTool,\n planRemoveStepTool,\n planReorderStepsTool,\n planSetVariablesTool,\n assertionCreateTool,\n assertionReadTool,\n assertionUpdateTool,\n assertionDeleteTool,\n} from './crud';\nimport { folderExportJsonTool, folderImportJsonTool } from './folderExchange';\nimport {\n historyListRunsTool,\n historyGetRunTool,\n historyDeleteRunTool,\n historyPurgeTool,\n} from './history';\nimport { codebaseExtractCollectionTool } from './codebase';\nimport {\n promptCreateEnvironmentTool,\n promptCreateAssertionTool,\n promptCreatePlanTool,\n promptCreateRequestTool,\n promptUpdateRequestTool,\n promptCreateFolderTreeTool,\n promptAddPlanStepsTool,\n promptSetPlanVariablesTool,\n promptCreateMockServerTool,\n promptAddMockEndpointTool,\n promptSetEndpointValidationRulesTool,\n promptSetEndpointResponseRulesTool,\n promptSetEndpointMultipliersTool,\n} from './prompt';\nimport {\n mockCreateFromOpenApiTool,\n mockCreateFromPostmanTool,\n mockCreateFromInsomniaTool,\n mockCreateManualTool,\n mockListTool,\n mockListEndpointsTool,\n mockStartTool,\n mockStopTool,\n mockDeleteTool,\n mockAddEndpointTool,\n mockUpdateEndpointTool,\n mockDeleteEndpointTool,\n mockSetValidationRulesTool,\n mockSetResponseRulesTool,\n mockSetMultipliersTool,\n mockImportPostmanMockCollectionTool,\n} from './mocks';\n\n// Order matches MCP_TOOL_NAMES in `@apicircle/shared/src/mcp.ts`. CI guards\n// drift via the registry test which asserts every catalog entry resolves.\nexport const TOOL_REGISTRY: AnyToolDef[] = [\n importCurlTool,\n importOpenApiTool,\n importPostmanTool,\n importInsomniaTool,\n importHarTool,\n generateCodeTool,\n workspaceListTool,\n workspaceReadTool,\n workspaceWriteTool,\n requestCreateTool,\n requestReadTool,\n requestUpdateTool,\n requestDeleteTool,\n folderCreateTool,\n folderReadTool,\n folderUpdateTool,\n folderDeleteTool,\n folderExportJsonTool,\n folderImportJsonTool,\n environmentCreateTool,\n environmentReadTool,\n environmentUpdateTool,\n environmentDeleteTool,\n environmentSetActiveTool,\n environmentSetPriorityTool,\n environmentExportTool,\n environmentImportTool,\n planCreateTool,\n planRunTool,\n planReadTool,\n planUpdateTool,\n planDeleteTool,\n planAddStepTool,\n planRemoveStepTool,\n planReorderStepsTool,\n planSetVariablesTool,\n assertionCreateTool,\n assertionReadTool,\n assertionUpdateTool,\n assertionDeleteTool,\n historyListRunsTool,\n historyGetRunTool,\n historyDeleteRunTool,\n historyPurgeTool,\n codebaseExtractCollectionTool,\n promptCreateEnvironmentTool,\n promptCreateAssertionTool,\n promptCreatePlanTool,\n promptCreateRequestTool,\n promptUpdateRequestTool,\n promptCreateFolderTreeTool,\n promptAddPlanStepsTool,\n promptSetPlanVariablesTool,\n promptCreateMockServerTool,\n promptAddMockEndpointTool,\n promptSetEndpointValidationRulesTool,\n promptSetEndpointResponseRulesTool,\n promptSetEndpointMultipliersTool,\n mockCreateFromOpenApiTool,\n mockCreateFromPostmanTool,\n mockCreateFromInsomniaTool,\n mockCreateManualTool,\n mockListTool,\n mockListEndpointsTool,\n mockStartTool,\n mockStopTool,\n mockDeleteTool,\n mockAddEndpointTool,\n mockUpdateEndpointTool,\n mockDeleteEndpointTool,\n mockSetValidationRulesTool,\n mockSetResponseRulesTool,\n mockSetMultipliersTool,\n mockImportPostmanMockCollectionTool,\n];\n\nexport function getTool(name: McpToolName): AnyToolDef | undefined {\n return TOOL_REGISTRY.find((t) => t.name === name);\n}\n","import type { WorkspaceProvider } from './WorkspaceProvider';\n\n// =============================================================================\n// Workspaces — multi-workspace surface exposed to tool handlers.\n//\n// Every existing tool consumes `ctx.workspace` (a `WorkspaceProvider` scoped\n// to ONE workspace) and continues to work unchanged. New tools that need to\n// list workspaces or pick a specific one consume `ctx.workspaces` instead.\n//\n// `ctx.workspace` is the *active* workspace's provider — set by the host\n// at construction time and refreshed when `setActive` is called.\n// =============================================================================\n\nexport interface WorkspaceSummary {\n id: string;\n name: string;\n isActive: boolean;\n /** ISO timestamps surfaced from the on-disk registry entry. */\n createdAt: string;\n lastOpenedAt: string;\n /** Cheap counts populated when the summary is built so AI clients can\n * decide which workspace to drill into without a second tool call.\n * May be `null` if the per-workspace doc couldn't be read. */\n counts: {\n requests: number;\n folders: number;\n environments: number;\n mockServers: number;\n plans: number;\n } | null;\n}\n\nexport interface Workspaces {\n /** Enumerate every workspace + which is currently active. */\n list(): Promise<WorkspaceSummary[]>;\n\n /** Return a `WorkspaceProvider` scoped to a specific workspace id. */\n for(workspaceId: string): WorkspaceProvider;\n\n /** id of the workspace that `ctx.workspace` currently points at. */\n activeId(): string | null;\n\n /** Switch which workspace `ctx.workspace` resolves to. */\n setActive(workspaceId: string): Promise<void>;\n}\n\n/**\n * Trivial single-workspace adapter — wraps an existing `WorkspaceProvider`\n * so legacy single-dir hosts can still answer `list()` and `for()` calls.\n * `list()` returns one entry (the active workspace itself); `for(id)` is a\n * passthrough that asserts the id matches.\n */\nexport class SingleWorkspaceAdapter implements Workspaces {\n constructor(\n private readonly provider: WorkspaceProvider,\n private workspaceId: string | null,\n private readonly displayName: string = 'Workspace',\n ) {}\n\n async list(): Promise<WorkspaceSummary[]> {\n const state = await this.provider.read();\n const id = state.synced.workspaceId;\n this.workspaceId = id;\n return [\n {\n id,\n name: this.displayName,\n isActive: true,\n createdAt: state.synced.meta.createdAt,\n lastOpenedAt: state.synced.meta.updatedAt,\n counts: {\n requests: Object.keys(state.synced.collections.requests).length,\n folders: Object.keys(state.synced.collections.folders).length,\n environments: Object.keys(state.synced.environments.items).length,\n mockServers: Object.keys(state.synced.mockServers ?? {}).length,\n plans: Object.keys(state.synced.executionPlans ?? {}).length,\n },\n },\n ];\n }\n\n for(workspaceId: string): WorkspaceProvider {\n if (this.workspaceId && workspaceId !== this.workspaceId) {\n throw new WorkspaceNotFoundError(workspaceId);\n }\n return this.provider;\n }\n\n activeId(): string | null {\n return this.workspaceId;\n }\n\n setActive(workspaceId: string): Promise<void> {\n if (this.workspaceId && workspaceId !== this.workspaceId) {\n throw new WorkspaceNotFoundError(workspaceId);\n }\n return Promise.resolve();\n }\n}\n\nexport class WorkspaceNotFoundError extends Error {\n readonly code = 'workspace-not-found' as const;\n readonly workspaceId: string;\n constructor(workspaceId: string) {\n super(`No workspace with id \"${workspaceId}\" is available on this server.`);\n this.name = 'WorkspaceNotFoundError';\n this.workspaceId = workspaceId;\n }\n}\n","import type { WorkspaceLocal, WorkspaceSynced } from '@apicircle/shared';\nimport type { WorkspacePatch, WorkspaceState } from '@apicircle/core';\nimport { applyMutation } from '@apicircle/core';\nimport type { WorkspaceProvider } from './WorkspaceProvider';\n\n/**\n * Pure in-memory provider. Used for unit tests and any programmatic\n * embedding where the consumer already owns workspace state and just\n * wants to drive the MCP tool catalog without disk or IPC.\n */\nexport class InMemoryWorkspaceProvider implements WorkspaceProvider {\n private state: WorkspaceState;\n\n constructor(initial: WorkspaceState) {\n this.state = initial;\n }\n\n async read(): Promise<WorkspaceState> {\n return this.state;\n }\n\n async apply(patch: WorkspacePatch): Promise<{ state: WorkspaceState; changedIds: string[] }> {\n const out = applyMutation(this.state, patch);\n this.state = out.next;\n return { state: this.state, changedIds: out.changedIds };\n }\n\n async write(next: { synced?: WorkspaceSynced; local?: WorkspaceLocal }): Promise<WorkspaceState> {\n this.state = {\n synced: next.synced ?? this.state.synced,\n local: next.local ?? this.state.local,\n };\n return this.state;\n }\n}\n","import type { WorkspaceLocal, WorkspaceSynced } from '@apicircle/shared';\nimport type { WorkspacePatch, WorkspaceState } from '@apicircle/core';\nimport { applyMutation } from '@apicircle/core';\nimport { loadFromFile, saveToFile, withWorkspace } from '@apicircle/core/workspace/file-backed';\nimport type { WorkspaceProvider } from './WorkspaceProvider';\n\n/**\n * Disk-backed provider used by the standalone CLI and the headless MCP\n * server when launched outside Electron. Each `apply` runs a full\n * load → mutate → save cycle under a `proper-lockfile` advisory lock so\n * concurrent writers (a second CLI invocation, the desktop app on the\n * same workspace) can't clobber each other.\n */\nexport class FileBackedWorkspaceProvider implements WorkspaceProvider {\n constructor(private readonly dir: string) {}\n\n async read(): Promise<WorkspaceState> {\n const out = await loadFromFile(this.dir);\n if (!out) {\n throw new Error(`No workspace found at ${this.dir}`);\n }\n return out;\n }\n\n async apply(patch: WorkspacePatch): Promise<{ state: WorkspaceState; changedIds: string[] }> {\n let captured: { state: WorkspaceState; changedIds: string[] } | null = null;\n await withWorkspace(this.dir, async (state) => {\n const result = applyMutation(state, patch);\n captured = { state: result.next, changedIds: result.changedIds };\n return { next: result.next };\n });\n if (!captured) throw new Error('apply did not run');\n return captured;\n }\n\n async write(next: { synced?: WorkspaceSynced; local?: WorkspaceLocal }): Promise<WorkspaceState> {\n const current = await this.read();\n const merged: WorkspaceState = {\n synced: next.synced ?? current.synced,\n local: next.local ?? current.local,\n };\n await saveToFile(this.dir, merged);\n return merged;\n }\n}\n","import {\n loadRegistry,\n loadWorkspaceById,\n saveRegistry,\n setActiveWorkspace as setActiveWorkspaceOnDisk,\n workspaceDirFor,\n type WorkspaceRegistry,\n} from '@apicircle/core/workspace/registry';\nimport { FileBackedWorkspaceProvider } from './FileBackedWorkspaceProvider';\nimport type { WorkspaceProvider } from './WorkspaceProvider';\nimport { WorkspaceNotFoundError, type WorkspaceSummary, type Workspaces } from './Workspaces';\n\n// =============================================================================\n// MultiWorkspaceProvider — `Workspaces` impl backed by a registry root on\n// disk (`<root>/registry.json` + per-id subdirectories). Wraps a\n// `FileBackedWorkspaceProvider` per active id and rebuilds it whenever the\n// active workspace changes.\n//\n// Used by the MCP server when launched against a registry root (the\n// desktop's `userData/workspaces/`). Tools that consume `ctx.workspace`\n// keep working — they always see the current active workspace; tools that\n// consume `ctx.workspaces` can drill into any registered workspace.\n// =============================================================================\n\nexport class MultiWorkspaceProvider implements Workspaces {\n private active: WorkspaceProvider | null = null;\n private activeWorkspaceId: string | null = null;\n\n constructor(private readonly registryRoot: string) {}\n\n /**\n * Hydrate the active provider from disk. Must be called once before the\n * MCP host boots so `ctx.workspace.read()` doesn't race the first\n * registry-load. Returns the registry the boot can log.\n */\n async init(): Promise<WorkspaceRegistry> {\n const registry = (await loadRegistry(this.registryRoot)) ?? {\n schemaVersion: 1 as const,\n activeWorkspaceId: null,\n workspaces: [],\n };\n if (registry.activeWorkspaceId) {\n this.activeWorkspaceId = registry.activeWorkspaceId;\n this.active = new FileBackedWorkspaceProvider(\n workspaceDirFor(this.registryRoot, registry.activeWorkspaceId),\n );\n }\n return registry;\n }\n\n /** The provider tool handlers see as `ctx.workspace`. */\n activeProvider(): WorkspaceProvider {\n if (!this.active) {\n throw new Error(\n 'No active workspace. Open the desktop app at least once, or run `apicircle workspaces create <name>`.',\n );\n }\n return this.active;\n }\n\n // ─── Workspaces interface ──────────────────────────────────────────────────\n\n async list(): Promise<WorkspaceSummary[]> {\n const registry = (await loadRegistry(this.registryRoot)) ?? {\n schemaVersion: 1 as const,\n activeWorkspaceId: null,\n workspaces: [],\n };\n const out: WorkspaceSummary[] = [];\n for (const entry of registry.workspaces) {\n let counts: WorkspaceSummary['counts'] = null;\n try {\n const state = await loadWorkspaceById(this.registryRoot, entry.id);\n if (state) {\n counts = {\n requests: Object.keys(state.synced.collections.requests).length,\n folders: Object.keys(state.synced.collections.folders).length,\n environments: Object.keys(state.synced.environments.items).length,\n mockServers: Object.keys(state.synced.mockServers ?? {}).length,\n plans: Object.keys(state.synced.executionPlans ?? {}).length,\n };\n }\n } catch {\n // Treat a missing / unreadable per-workspace file as null counts.\n counts = null;\n }\n out.push({\n id: entry.id,\n name: entry.name,\n isActive: entry.id === registry.activeWorkspaceId,\n createdAt: entry.createdAt,\n lastOpenedAt: entry.lastOpenedAt,\n counts,\n });\n }\n return out;\n }\n\n for(workspaceId: string): WorkspaceProvider {\n return new FileBackedWorkspaceProvider(workspaceDirFor(this.registryRoot, workspaceId));\n }\n\n activeId(): string | null {\n return this.activeWorkspaceId;\n }\n\n async setActive(workspaceId: string): Promise<void> {\n const registry = await loadRegistry(this.registryRoot);\n if (!registry || !registry.workspaces.some((w) => w.id === workspaceId)) {\n throw new WorkspaceNotFoundError(workspaceId);\n }\n const next = await setActiveWorkspaceOnDisk(this.registryRoot, workspaceId);\n void next;\n this.activeWorkspaceId = workspaceId;\n this.active = new FileBackedWorkspaceProvider(workspaceDirFor(this.registryRoot, workspaceId));\n }\n\n /**\n * Idempotent registry write — used by tests / tools that need to\n * persist registry updates that didn't go through `setActive`.\n */\n async writeRegistry(registry: WorkspaceRegistry): Promise<void> {\n await saveRegistry(this.registryRoot, registry);\n this.activeWorkspaceId = registry.activeWorkspaceId;\n if (registry.activeWorkspaceId) {\n this.active = new FileBackedWorkspaceProvider(\n workspaceDirFor(this.registryRoot, registry.activeWorkspaceId),\n );\n }\n }\n}\n","import type { MockServer, MockRuntimeEntry } from '@apicircle/shared';\nimport {\n startMockServer,\n stopMockServer,\n type MockServerHandle,\n} from '@apicircle/mock-server-core';\nimport type { MockController, StartMockResult } from './MockController';\n\n/**\n * MockController implementation that owns its mock processes directly via\n * `@apicircle/mock-server-core`. Used by the CLI and any embedder that\n * wants the simplest possible setup. The desktop app supplies a\n * different controller (process-bridge to its main process) so renderer-\n * side state stays consistent.\n */\nexport class InProcessMockController implements MockController {\n private readonly handles = new Map<string, MockServerHandle>();\n private readonly meta = new Map<string, MockRuntimeEntry>();\n\n async start(server: MockServer, opts: { port?: number } = {}): Promise<StartMockResult> {\n if (this.handles.has(server.id)) {\n throw new Error(`Mock '${server.id}' is already running`);\n }\n const handle = await startMockServer(server, {\n port: opts.port ?? server.defaultPort ?? undefined,\n });\n const runtime: MockRuntimeEntry = {\n port: handle.port,\n pid: process.pid,\n startedAt: new Date().toISOString(),\n lastError: null,\n requestCount: 0,\n };\n this.handles.set(server.id, handle);\n this.meta.set(server.id, runtime);\n return { port: handle.port, pid: runtime.pid, startedAt: runtime.startedAt };\n }\n\n async stop(serverId: string): Promise<void> {\n const handle = this.handles.get(serverId);\n if (!handle) return;\n await stopMockServer(handle);\n this.handles.delete(serverId);\n this.meta.delete(serverId);\n }\n\n async list(): Promise<Array<{ serverId: string; runtime: MockRuntimeEntry }>> {\n return Array.from(this.meta.entries()).map(([serverId, runtime]) => ({\n serverId,\n runtime,\n }));\n }\n}\n","import { McpHost } from './host/McpHost';\nimport { TOOL_REGISTRY } from './tools/registry';\nimport type { WorkspaceProvider } from './providers/WorkspaceProvider';\nimport type { MockController } from './providers/MockController';\nimport type { AnyToolDef } from './tools/types';\nimport { SingleWorkspaceAdapter, type Workspaces } from './providers/Workspaces';\n\n// Public API for `@apicircle/mcp-server`.\n//\n// The host is intentionally non-opinionated about *where* the workspace and\n// mock runtime live — pass in the right provider for your environment:\n//\n// • CLI / headless (single workspace) → FileBackedWorkspaceProvider\n// • CLI / headless (multi-workspace) → MultiWorkspaceProvider\n// • Electron desktop → IpcWorkspaceProvider\n// • Embedded test / demo → InMemoryWorkspaceProvider\n\nexport { McpHost } from './host/McpHost';\nexport { TOOL_REGISTRY, getTool } from './tools/registry';\nexport type { AnyToolDef, ToolDef, ToolHandlerContext } from './tools/types';\nexport type { WorkspaceProvider } from './providers/WorkspaceProvider';\nexport type { MockController, StartMockResult } from './providers/MockController';\nexport {\n SingleWorkspaceAdapter,\n WorkspaceNotFoundError,\n type WorkspaceSummary,\n type Workspaces,\n} from './providers/Workspaces';\nexport { InMemoryWorkspaceProvider } from './providers/InMemoryWorkspaceProvider';\nexport { FileBackedWorkspaceProvider } from './providers/FileBackedWorkspaceProvider';\nexport { MultiWorkspaceProvider } from './providers/MultiWorkspaceProvider';\nexport { InProcessMockController } from './providers/InProcessMockController';\n\nexport interface CreateMcpServerOptions {\n /**\n * Provider for the ACTIVE workspace. Tools that consume `ctx.workspace`\n * see this directly. When you pass a `MultiWorkspaceProvider`, use its\n * `activeProvider()` here.\n */\n workspace: WorkspaceProvider;\n /**\n * Optional multi-workspace surface. When omitted, the host wraps\n * `workspace` in a `SingleWorkspaceAdapter` so `workspace.list` and the\n * multi-workspace envelope still work (with one entry).\n */\n workspaces?: Workspaces;\n mock: MockController;\n /** Override the registered tool list. Defaults to `TOOL_REGISTRY`. */\n tools?: AnyToolDef[];\n serverInfo?: { name: string; version: string };\n}\n\n/**\n * Build a fully-wired McpHost ready to `await host.connect()` over stdio.\n * Tool implementations come from `TOOL_REGISTRY` by default; pass `tools`\n * to inject a curated subset (useful for tests or for hosting only the\n * import surface).\n */\nexport function createMcpServer(options: CreateMcpServerOptions): McpHost {\n const workspaces =\n options.workspaces ??\n new SingleWorkspaceAdapter(options.workspace, null /* discovered on first list() */);\n return new McpHost({\n serverInfo: options.serverInfo,\n tools: options.tools ?? TOOL_REGISTRY,\n context: {\n workspace: options.workspace,\n workspaces,\n mock: options.mock,\n },\n });\n}\n","import * as path from 'node:path';\nimport { promises as fs } from 'node:fs';\nimport { formatHelp, hasHelpFlag, hasVersionFlag } from './args';\nimport { MCP_PACKAGE_VERSION } from '../packageVersion';\n\n// =============================================================================\n// stdio entry point — published as the `apicircle-mcp` bin. Reads the\n// workspace path from `--workspace <dir>` (or the `APICIRCLE_WORKSPACE` env\n// var) and connects to stdio so the parent AI client (Claude Desktop, ChatGPT,\n// Cursor, etc) can drive the tool catalog.\n//\n// The `<dir>` can be either:\n//\n// • a **registry root** (contains `registry.json`) — multi-workspace mode;\n// the server exposes every workspace via `workspace.list` and defaults\n// reads/writes to the active workspace.\n// • a **single-workspace dir** (contains `workspace.synced.json`) —\n// legacy mode kept for one-off / CI flows.\n//\n// Errors during boot are written to stderr and exit with a non-zero code;\n// errors during tool calls are returned in-protocol as `isError: true` so\n// the AI client can surface them without losing the connection.\n// =============================================================================\n\nfunction getWorkspaceDir(): string {\n const argIdx = process.argv.indexOf('--workspace');\n if (argIdx !== -1 && process.argv[argIdx + 1]) {\n return path.resolve(process.argv[argIdx + 1]);\n }\n const env = process.env.APICIRCLE_WORKSPACE;\n if (env) return path.resolve(env);\n return path.resolve(process.cwd());\n}\n\nasync function fileExists(p: string): Promise<boolean> {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n if (hasVersionFlag(args)) {\n process.stdout.write(`${MCP_PACKAGE_VERSION}\\n`);\n return;\n }\n if (hasHelpFlag(args)) {\n process.stdout.write(formatHelp());\n return;\n }\n\n const [\n { createMcpServer },\n { FileBackedWorkspaceProvider },\n { MultiWorkspaceProvider },\n { InProcessMockController },\n { SingleWorkspaceAdapter },\n ] = await Promise.all([\n import('../index'),\n import('../providers/FileBackedWorkspaceProvider'),\n import('../providers/MultiWorkspaceProvider'),\n import('../providers/InProcessMockController'),\n import('../providers/Workspaces'),\n ]);\n\n const dir = getWorkspaceDir();\n const registryPath = path.join(dir, 'registry.json');\n const isRegistryRoot = await fileExists(registryPath);\n\n const mock = new InProcessMockController();\n\n if (isRegistryRoot) {\n const workspaces = new MultiWorkspaceProvider(dir);\n const registry = await workspaces.init();\n if (!registry.activeWorkspaceId) {\n process.stderr.write(\n `apicircle-mcp: registry at ${dir} has no active workspace. ` +\n 'Open the desktop app once, or run `apicircle workspaces create <name>`.\\n',\n );\n process.exit(1);\n }\n const workspace = workspaces.activeProvider();\n const host = createMcpServer({ workspace, workspaces, mock });\n process.stderr.write(\n `apicircle-mcp: multi-workspace mode · ${registry.workspaces.length} workspace(s) · active=${registry.activeWorkspaceId}\\n`,\n );\n await host.connect();\n return;\n }\n\n // Legacy single-workspace boot.\n const workspace = new FileBackedWorkspaceProvider(dir);\n const workspaces = new SingleWorkspaceAdapter(workspace, null);\n const host = createMcpServer({ workspace, workspaces, mock });\n process.stderr.write(`apicircle-mcp: single-workspace mode · ${dir}\\n`);\n await host.connect();\n // Stdio transport keeps the process alive until the client disconnects.\n}\n\nmain().catch((err) => {\n process.stderr.write(\n `apicircle-mcp boot error: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n process.exit(1);\n});\n","export function hasVersionFlag(args: readonly string[]): boolean {\n return args.some((arg) => arg === '--version' || arg === '-v' || arg === '-V');\n}\n\nexport function hasHelpFlag(args: readonly string[]): boolean {\n return args.some((arg) => arg === '--help' || arg === '-h' || arg === 'help');\n}\n\nexport function formatHelp(): string {\n return `Usage: apicircle-mcp [options]\n\nStarts the API Circle MCP stdio server for AI clients.\n\nOptions:\n --workspace <dir> Registry root or single-workspace directory.\n Defaults to APICIRCLE_WORKSPACE, then the current directory.\n -v, -V, --version Print the version number.\n -h, --help Show help.\n\nExamples:\n apicircle-mcp\n apicircle-mcp --workspace ./api-circle-workspaces\n`;\n}\n"],"mappings":"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","names":["import_zod","import_zod","import_zod","import_zod","import_shared","import_core","state","import_zod","import_core","import_zod","import_zod","import_zod","import_shared","HTTP_METHOD","patchEndpoint","import_zod","import_shared","import_mock_server_core","HTTP_METHOD","ENDPOINT_RESPONSE","import_core","import_core","setActiveWorkspaceOnDisk","import_mock_server_core","fs","createMcpServer","FileBackedWorkspaceProvider","MultiWorkspaceProvider","InProcessMockController","SingleWorkspaceAdapter","workspaces","workspace","host"]}