@episoda/mcp 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -856,6 +856,62 @@ Both semantic and text search returned no results.` }] };
856
856
  Query: "${args.query}"
857
857
  Found: ${ranked.length} documents (${bothCount} matched both semantic + text)
858
858
 
859
+ ${list}`
860
+ }]
861
+ };
862
+ }
863
+ );
864
+ server.registerTool(
865
+ "search_conversations",
866
+ {
867
+ description: `Search past agent conversations in this project.
868
+
869
+ This searches agent conversation history (agent_messages) across sessions you can access.
870
+
871
+ USE THIS WHEN:
872
+ - The user references a prior discussion
873
+ - You need to recover context after compaction
874
+ - You want to find when/where something was decided`,
875
+ inputSchema: {
876
+ query: z.string().describe("Semantic search query"),
877
+ limit: z.number().optional().describe("Max results (default: 10)"),
878
+ threshold: z.number().optional().describe("Min similarity 0-1 (default: 0.5)"),
879
+ days_back: z.number().optional().describe("Limit to recent N days (optional)"),
880
+ session_id: z.string().optional().describe("Limit to a specific session UUID (optional)")
881
+ }
882
+ },
883
+ async (args) => {
884
+ const result = await apiRequest(
885
+ "POST",
886
+ "/api/search/conversations",
887
+ {
888
+ query: args.query,
889
+ limit: args.limit || 10,
890
+ threshold: args.threshold || 0.5,
891
+ ...args.days_back !== void 0 ? { days_back: args.days_back } : {},
892
+ ...args.session_id ? { session_id: args.session_id } : {}
893
+ }
894
+ );
895
+ if (!result.success || !result.results) {
896
+ return { content: [{ type: "text", text: `Error: ${result.error || "Conversation search failed"}` }], isError: true };
897
+ }
898
+ if (result.results.length === 0) {
899
+ return { content: [{ type: "text", text: `No conversation messages found matching: "${args.query}"` }] };
900
+ }
901
+ const list = result.results.map((r) => {
902
+ const score = Math.round((r.similarity || 0) * 100);
903
+ const moduleInfo = r.module_uid ? ` | ${r.module_uid}${r.module_title ? `: ${r.module_title}` : ""}` : "";
904
+ const when = r.created_at ? ` | ${r.created_at}` : "";
905
+ return `- [${r.role}, ${score}%] ${r.content_snippet}${moduleInfo}${when}`;
906
+ }).join("\n");
907
+ return {
908
+ content: [{
909
+ type: "text",
910
+ text: `# Conversation Search Results
911
+
912
+ Query: "${args.query}"
913
+ Found: ${result.results.length}
914
+
859
915
  ${list}`
860
916
  }]
861
917
  };
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runtime-config.ts","../src/workflow-server.ts","../src/git-server.ts","../src/dev-server.ts","../src/cli.ts"],"sourcesContent":["import * as fs from 'node:fs'\nimport * as os from 'node:os'\nimport * as path from 'node:path'\n\nconst DEFAULT_API_URL = 'https://episoda.dev'\nconst DEFAULT_CONFIG_FILE = 'config.json'\n\ninterface EpisodaLocalConfig {\n access_token?: string\n project_id?: string\n workspace_id?: string\n api_url?: string\n}\n\nexport interface RuntimeConfig {\n apiUrl: string\n sessionToken: string\n projectId: string\n workspaceId: string\n}\n\nconst normalizeEnv = (value?: string): string | undefined => {\n if (!value) return undefined\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : undefined\n}\n\nconst readEnvConfig = () => ({\n apiUrl: normalizeEnv(process.env.EPISODA_API_URL),\n sessionToken: normalizeEnv(process.env.EPISODA_SESSION_TOKEN),\n projectId: normalizeEnv(process.env.EPISODA_PROJECT_ID),\n workspaceId: normalizeEnv(process.env.EPISODA_WORKSPACE_ID)\n})\n\nconst buildMissingMessage = (missing: string[], apiUrl: string): string => {\n return [\n `[episoda-mcp] Missing auth context: ${missing.join(', ')}`,\n '[episoda-mcp] Set EPISODA_* env vars or run:',\n `[episoda-mcp] episoda auth --api-url ${apiUrl}`\n ].join('\\n')\n}\n\nconst getConfigPath = (): string => {\n // MCP supports a full-path override in addition to the core-style config dir.\n if (process.env.EPISODA_CONFIG_PATH) {\n return process.env.EPISODA_CONFIG_PATH\n }\n const configDir = process.env.EPISODA_CONFIG_DIR || path.join(os.homedir(), '.episoda')\n return path.join(configDir, DEFAULT_CONFIG_FILE)\n}\n\nconst loadLocalConfig = (): EpisodaLocalConfig | null => {\n const configPath = getConfigPath()\n if (!fs.existsSync(configPath)) {\n return null\n }\n try {\n const content = fs.readFileSync(configPath, 'utf8')\n return JSON.parse(content) as EpisodaLocalConfig\n } catch (error) {\n console.error('[episoda-mcp] Failed to load config:', error)\n return null\n }\n}\n\nexport async function resolveRuntimeConfig(): Promise<RuntimeConfig> {\n const envConfig = readEnvConfig()\n\n let fileConfig: EpisodaLocalConfig | null = null\n if (!envConfig.sessionToken || !envConfig.projectId || !envConfig.workspaceId || !envConfig.apiUrl) {\n fileConfig = loadLocalConfig()\n }\n\n const resolved: RuntimeConfig = {\n apiUrl: envConfig.apiUrl || fileConfig?.api_url || DEFAULT_API_URL,\n sessionToken: envConfig.sessionToken || fileConfig?.access_token || '',\n projectId: envConfig.projectId || fileConfig?.project_id || '',\n workspaceId: envConfig.workspaceId || fileConfig?.workspace_id || ''\n }\n\n const missing: string[] = []\n if (!resolved.sessionToken) missing.push('EPISODA_SESSION_TOKEN')\n if (!resolved.projectId) missing.push('EPISODA_PROJECT_ID')\n if (!resolved.workspaceId) missing.push('EPISODA_WORKSPACE_ID')\n\n if (missing.length > 0) {\n throw new Error(buildMissingMessage(missing, resolved.apiUrl))\n }\n\n return resolved\n}\n\nexport async function hydrateRuntimeConfig(): Promise<RuntimeConfig> {\n const resolved = await resolveRuntimeConfig()\n\n if (!normalizeEnv(process.env.EPISODA_API_URL)) {\n process.env.EPISODA_API_URL = resolved.apiUrl\n }\n if (!normalizeEnv(process.env.EPISODA_SESSION_TOKEN)) {\n process.env.EPISODA_SESSION_TOKEN = resolved.sessionToken\n }\n if (!normalizeEnv(process.env.EPISODA_PROJECT_ID)) {\n process.env.EPISODA_PROJECT_ID = resolved.projectId\n }\n if (!normalizeEnv(process.env.EPISODA_WORKSPACE_ID)) {\n process.env.EPISODA_WORKSPACE_ID = resolved.workspaceId\n }\n\n return resolved\n}\n","/**\n * EP895-10: Episoda Workflow MCP Server\n *\n * MCP server for Claude Code agents to interact with the Episoda workflow system.\n * Provides tools for:\n * - Task management (create, update, state transitions)\n * - Module management (create, update, state transitions)\n * - Knowledge access (search, get, link)\n *\n * Usage:\n * npx -y @episoda/mcp workflow\n *\n * Required environment variables:\n * EPISODA_API_URL - Base URL for Episoda API (e.g., https://episoda.dev)\n * EPISODA_SESSION_TOKEN - Bearer token for API authentication\n * MODULE_UID - Current module UID (for context)\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { z } from 'zod'\nimport { hydrateRuntimeConfig } from './runtime-config.js'\n\n// Environment configuration\nlet EPISODA_API_URL = process.env.EPISODA_API_URL || 'https://episoda.dev'\nlet EPISODA_SESSION_TOKEN = process.env.EPISODA_SESSION_TOKEN || ''\nlet EPISODA_PROJECT_ID = process.env.EPISODA_PROJECT_ID || ''\nlet EPISODA_WORKSPACE_ID = process.env.EPISODA_WORKSPACE_ID || ''\n\n/**\n * Make an authenticated API request\n */\nasync function apiRequest<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE',\n path: string,\n body?: Record<string, unknown>\n): Promise<T> {\n const url = `${EPISODA_API_URL}${path}`\n const options: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${EPISODA_SESSION_TOKEN}`\n }\n }\n\n if (body && method !== 'GET') {\n options.body = JSON.stringify(body)\n }\n\n if (EPISODA_PROJECT_ID) {\n (options.headers as Record<string, string>)['x-project-id'] = EPISODA_PROJECT_ID\n }\n if (EPISODA_WORKSPACE_ID) {\n (options.headers as Record<string, string>)['x-workspace-id'] = EPISODA_WORKSPACE_ID\n }\n\n const response = await fetch(url, options)\n\n if (!response.ok) {\n const text = await response.text()\n throw new Error(`API error ${response.status}: ${text}`)\n }\n\n return response.json() as Promise<T>\n}\n\n// Create MCP server\nconst server = new McpServer({\n name: 'episoda-workflow',\n version: '1.0.0'\n}, {\n capabilities: {\n tools: {}\n },\n instructions: `\n Episoda Workflow MCP Server\n\n This server provides tools to manage the Episoda development workflow:\n - Tasks: Create, update, and transition task states\n - Modules: Create, update, and transition module states\n - Knowledge: Search, retrieve, and link knowledge documents\n\n Task and module states flow: backlog → doing → review → done\n `\n})\n\n// ============================================\n// Task Management Tools\n// ============================================\n\nserver.registerTool(\n 'create_task',\n {\n description: 'Create a new task within a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the parent module (e.g., EP584)'),\n title: z.string().describe('Title of the task'),\n description: z.string().optional().describe('Markdown description of the task'),\n type: z.enum(['task', 'bug', 'spike']).optional().describe('Type of task')\n }\n },\n async (args) => {\n interface CreateTaskResponse {\n success: boolean\n task?: { id: string; uid: string; title: string }\n error?: string\n }\n\n const result = await apiRequest<CreateTaskResponse>('POST', '/api/tasks', {\n module_id: args.module_uid, // API expects module_id (accepts both UUID and UID)\n title: args.title,\n description_md: args.description,\n type: args.type || 'task'\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Created task ${result.task?.uid}: ${result.task?.title}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'update_task_state',\n {\n description: 'Move a task to a new state (backlog, doing, review, done)',\n inputSchema: {\n task_uid: z.string().describe('The UID of the task (e.g., EP584-1)'),\n state: z.enum(['backlog', 'doing', 'review', 'done']).describe('New state for the task')\n }\n },\n async (args) => {\n interface UpdateTaskResponse {\n success: boolean\n task?: { uid: string; state: string }\n error?: string\n }\n\n const result = await apiRequest<UpdateTaskResponse>('PATCH', `/api/tasks/${args.task_uid}`, {\n state: args.state\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Task ${args.task_uid} moved to ${args.state}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'update_task',\n {\n description: 'Update task details (title, description)',\n inputSchema: {\n task_uid: z.string().describe('The UID of the task (e.g., EP584-1)'),\n title: z.string().optional().describe('New title for the task'),\n description: z.string().optional().describe('New markdown description')\n }\n },\n async (args) => {\n interface UpdateTaskResponse {\n success: boolean\n task?: { uid: string; title: string }\n error?: string\n }\n\n const updates: Record<string, string> = {}\n if (args.title) updates.title = args.title\n if (args.description) updates.description_md = args.description\n\n const result = await apiRequest<UpdateTaskResponse>('PATCH', `/api/tasks/${args.task_uid}`, updates)\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Task ${args.task_uid} updated`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'get_task_details',\n {\n description: 'Get detailed information about a task',\n inputSchema: {\n task_uid: z.string().describe('The UID of the task (e.g., EP584-1)')\n }\n },\n async (args) => {\n interface TaskResponse {\n success: boolean\n task?: {\n uid: string\n title: string\n state: string\n type: string\n description_md: string | null\n module_uid: string\n }\n error?: string\n }\n\n const result = await apiRequest<TaskResponse>('GET', `/api/tasks/${args.task_uid}`)\n\n if (!result.success || !result.task) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Task not found'}` }], isError: true }\n }\n\n const task = result.task\n return {\n content: [{\n type: 'text',\n text: `# ${task.uid}: ${task.title}\n\n**State:** ${task.state}\n**Type:** ${task.type}\n**Module:** ${task.module_uid}\n\n${task.description_md || '_No description_'}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'list_module_tasks',\n {\n description: 'List all tasks for a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface TasksResponse {\n success: boolean\n tasks?: Array<{\n uid: string\n title: string\n state: string\n type: string\n }>\n error?: string\n }\n\n const result = await apiRequest<TasksResponse>('GET', `/api/modules/${args.module_uid}/tasks`)\n\n if (!result.success || !result.tasks) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Failed to fetch tasks'}` }], isError: true }\n }\n\n if (result.tasks.length === 0) {\n return { content: [{ type: 'text', text: 'No tasks found for this module.' }] }\n }\n\n const taskList = result.tasks.map(t => {\n const checkbox = t.state === 'done' ? '[x]' : '[ ]'\n const stateLabel = t.state !== 'backlog' ? ` (${t.state})` : ''\n return `- ${checkbox} **${t.uid}**: ${t.title}${stateLabel}`\n }).join('\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# Tasks for ${args.module_uid}\\n\\n${taskList}`\n }]\n }\n }\n)\n\n// ============================================\n// EP1252: Batch Task Tools\n// ============================================\n\nserver.registerTool(\n 'batch_update_task_state',\n {\n description: `Update the state of multiple tasks at once.\n\nUSE THIS WHEN:\n- Marking multiple tasks as done after completing work\n- Moving several tasks to \"doing\" state\n- Bulk state transitions\n\nEFFICIENCY: Single call instead of multiple update_task_state calls.\nReduces latency from ~1.5s (6 calls) to ~300ms (1 call).`,\n inputSchema: {\n task_uids: z.array(z.string()).describe('Array of task UIDs (e.g., [\"EP1252-1\", \"EP1252-2\"])'),\n state: z.enum(['backlog', 'doing', 'done']).describe('New state for all tasks')\n }\n },\n async (args) => {\n interface TaskLookupResponse {\n success: boolean\n tasks?: Array<{ id: string; uid: string }>\n error?: string\n }\n\n interface BatchUpdateResponse {\n success: boolean\n tasks?: Array<{ id: string; uid: string; state: string }>\n summary?: { updated: number; requested: number }\n error?: { message?: string; details?: string }\n }\n\n try {\n // Step 1: Look up task UUIDs from UIDs\n // We need to query each task to get its UUID since the batch endpoint requires UUIDs\n const lookupPromises = args.task_uids.map(uid =>\n apiRequest<{ success: boolean; task?: { id: string; uid: string } }>('GET', `/api/tasks/${uid}`)\n .then(r => r.success && r.task ? { uid, id: r.task.id } : null)\n .catch(() => null)\n )\n\n const lookupResults = await Promise.all(lookupPromises)\n const validTasks = lookupResults.filter((t): t is { uid: string; id: string } => t !== null)\n const notFoundUids = args.task_uids.filter(uid => !validTasks.find(t => t.uid === uid))\n\n if (validTasks.length === 0) {\n return {\n content: [{\n type: 'text',\n text: `Error: None of the specified tasks were found.\\nNot found: ${args.task_uids.join(', ')}`\n }],\n isError: true\n }\n }\n\n // Step 2: Call batch update endpoint with UUIDs\n const updates = validTasks.map(t => ({\n id: t.id,\n state: args.state\n }))\n\n const result = await apiRequest<BatchUpdateResponse>('PATCH', '/api/tasks/batch', {\n updates\n })\n\n if (!result.success) {\n const errorMsg = result.error?.message || result.error?.details || 'Batch update failed'\n return {\n content: [{\n type: 'text',\n text: `Error: ${errorMsg}`\n }],\n isError: true\n }\n }\n\n // Build response\n const updatedUids = validTasks.map(t => t.uid)\n const failedItems = notFoundUids.map(uid => ({ uid, error: 'Task not found' }))\n\n return {\n content: [{\n type: 'text',\n text: `# Batch Update Results\n\n**Updated:** ${updatedUids.length} tasks → ${args.state}\n${updatedUids.map(uid => `- ✓ ${uid}`).join('\\n')}\n\n${failedItems.length > 0 ? `**Failed:** ${failedItems.length} tasks\\n${failedItems.map(f => `- ✗ ${f.uid}: ${f.error}`).join('\\n')}` : ''}`\n }]\n }\n } catch (error) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n }],\n isError: true\n }\n }\n }\n)\n\nserver.registerTool(\n 'batch_create_tasks',\n {\n description: `Create multiple tasks for a module at once.\n\nUSE THIS WHEN:\n- Setting up tasks for a new module\n- Creating multiple related tasks together\n- Bulk task creation from a plan\n\nEFFICIENCY: Single call instead of multiple create_task calls.`,\n inputSchema: {\n module_uid: z.string().describe('The UID of the parent module (e.g., EP1252)'),\n tasks: z.array(z.object({\n title: z.string().describe('Title of the task'),\n description: z.string().optional().describe('Markdown description'),\n state: z.enum(['backlog', 'doing', 'done']).optional().describe('Initial state (default: backlog)')\n })).describe('Array of tasks to create')\n }\n },\n async (args) => {\n interface BulkCreateResponse {\n success: boolean\n created?: number\n tasks?: Array<{ uid: string; title: string }>\n error?: string\n }\n\n try {\n // Call the bulk create endpoint (accepts module UID directly)\n const result = await apiRequest<BulkCreateResponse>('POST', '/api/tasks/bulk', {\n module_id: args.module_uid,\n tasks: args.tasks.map(t => ({\n title: t.title,\n description_md: t.description,\n state: t.state || 'backlog'\n }))\n })\n\n if (!result.success) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${result.error || 'Bulk create failed'}`\n }],\n isError: true\n }\n }\n\n const createdTasks = result.tasks || []\n\n return {\n content: [{\n type: 'text',\n text: `# Batch Create Results\n\n**Created:** ${result.created || createdTasks.length} tasks for ${args.module_uid}\n\n${createdTasks.map(t => `- ✓ **${t.uid}**: ${t.title}`).join('\\n')}`\n }]\n }\n } catch (error) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n }],\n isError: true\n }\n }\n }\n)\n\nserver.registerTool(\n 'batch_get_tasks',\n {\n description: `Fetch multiple tasks by UID in a single call.\n\nUSE THIS WHEN:\n- Need details for several specific tasks\n- Checking status of multiple tasks at once\n- Gathering context for a set of tasks\n\nEFFICIENCY: Single MCP call instead of multiple get_task_details calls.`,\n inputSchema: {\n task_uids: z.array(z.string()).describe('Array of task UIDs (e.g., [\"EP1252-1\", \"EP1252-2\"])')\n }\n },\n async (args) => {\n interface TaskResponse {\n success: boolean\n task?: {\n uid: string\n title: string\n state: string\n type: string\n description_md: string | null\n }\n }\n\n try {\n type TaskInfo = NonNullable<TaskResponse['task']>\n\n // Fetch all tasks in parallel\n const fetchPromises = args.task_uids.map(uid =>\n apiRequest<TaskResponse>('GET', `/api/tasks/${uid}`)\n .then(r => r.success && r.task ? { found: true as const, task: r.task } : { found: false as const, uid })\n .catch(() => ({ found: false as const, uid }))\n )\n\n const results = await Promise.all(fetchPromises)\n const foundTasks: TaskInfo[] = []\n const notFoundUids: string[] = []\n\n for (const result of results) {\n if (result.found && result.task) {\n foundTasks.push(result.task as TaskInfo)\n } else if (!result.found) {\n notFoundUids.push(result.uid)\n }\n }\n\n if (foundTasks.length === 0) {\n return {\n content: [{\n type: 'text',\n text: `Error: None of the specified tasks were found.\\nNot found: ${args.task_uids.join(', ')}`\n }],\n isError: true\n }\n }\n\n const taskList = foundTasks.map((task) => {\n const checkbox = task.state === 'done' ? '[x]' : '[ ]'\n const stateLabel = task.state !== 'backlog' ? ` (${task.state})` : ''\n return `- ${checkbox} **${task.uid}**: ${task.title}${stateLabel}`\n }).join('\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# Batch Get Results\n\n**Found:** ${foundTasks.length} tasks\n${taskList}\n\n${notFoundUids.length > 0 ? `**Not found:** ${notFoundUids.join(', ')}` : ''}`\n }]\n }\n } catch (error) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n }],\n isError: true\n }\n }\n }\n)\n\n// ============================================\n// Module Management Tools\n// ============================================\n\nserver.registerTool(\n 'create_module',\n {\n description: 'Create a new module in the project',\n inputSchema: {\n title: z.string().describe('Title of the module'),\n description: z.string().optional().describe('Markdown description of the module')\n }\n },\n async (args) => {\n interface CreateModuleResponse {\n success: boolean\n module?: { id: string; uid: string; title: string }\n error?: string\n }\n\n const result = await apiRequest<CreateModuleResponse>('POST', '/api/modules', {\n title: args.title,\n description_md: args.description\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Created module ${result.module?.uid}: ${result.module?.title}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'update_module',\n {\n description: 'Update module details (title, description)',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)'),\n title: z.string().optional().describe('New title for the module'),\n description: z.string().optional().describe('New markdown description')\n }\n },\n async (args) => {\n interface UpdateModuleResponse {\n success: boolean\n module?: { uid: string; title: string }\n error?: string\n }\n\n const updates: Record<string, string> = {}\n if (args.title) updates.title = args.title\n if (args.description) updates.description_md = args.description\n\n const result = await apiRequest<UpdateModuleResponse>('PATCH', `/api/modules/${args.module_uid}`, updates)\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Module ${args.module_uid} updated`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'request_review',\n {\n description: 'Move a module to review state',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface UpdateModuleResponse {\n success: boolean\n module?: { uid: string; state: string }\n error?: string\n }\n\n const result = await apiRequest<UpdateModuleResponse>('PATCH', `/api/modules/${args.module_uid}`, {\n state: 'review'\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Module ${args.module_uid} moved to review`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'mark_done',\n {\n description: 'Move a module to done state',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface UpdateModuleResponse {\n success: boolean\n module?: { uid: string; state: string }\n error?: string\n }\n\n const result = await apiRequest<UpdateModuleResponse>('PATCH', `/api/modules/${args.module_uid}`, {\n state: 'done'\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Module ${args.module_uid} marked as done`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'get_module_details',\n {\n description: 'Get detailed information about a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface ModuleResponse {\n success: boolean\n module?: {\n uid: string\n title: string\n state: string\n description_md: string | null\n branch_name: string | null\n }\n error?: string\n }\n\n const result = await apiRequest<ModuleResponse>('GET', `/api/modules/${args.module_uid}`)\n\n if (!result.success || !result.module) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Module not found'}` }], isError: true }\n }\n\n const mod = result.module\n return {\n content: [{\n type: 'text',\n text: `# ${mod.uid}: ${mod.title}\n\n**State:** ${mod.state}\n**Branch:** ${mod.branch_name || '_Not set_'}\n\n${mod.description_md || '_No description_'}`\n }]\n }\n }\n)\n\n// ============================================\n// Knowledge Tools\n// ============================================\n\nserver.registerTool(\n 'get_knowledge',\n {\n description: 'Fetch a knowledge document by ID',\n inputSchema: {\n knowledge_id: z.string().describe('The ID of the knowledge document')\n }\n },\n async (args) => {\n interface KnowledgeResponse {\n success: boolean\n knowledge?: {\n id: string\n title: string\n doc_type: string\n domain: string\n sections: Array<{ heading?: string; content?: string }>\n }\n error?: string\n }\n\n const result = await apiRequest<KnowledgeResponse>('GET', `/api/knowledge/${args.knowledge_id}`)\n\n if (!result.success || !result.knowledge) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Knowledge not found'}` }], isError: true }\n }\n\n const doc = result.knowledge\n const sections = doc.sections.map(s => {\n const heading = s.heading ? `## ${s.heading}\\n\\n` : ''\n return `${heading}${s.content || ''}`\n }).join('\\n\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# ${doc.title}\n\n**Type:** ${doc.doc_type} | **Domain:** ${doc.domain}\n\n${sections}`\n }]\n }\n }\n)\n\n// EP1242: Three search tools with clear use cases for AI agents\n\nserver.registerTool(\n 'search_knowledge_semantic',\n {\n description: `Search knowledge using vector similarity (semantic/conceptual matching).\n\nUSE THIS WHEN:\n- Looking for documents about a concept: \"authentication patterns\", \"error handling\"\n- Finding related content even if exact words don't match\n- Discovering documentation about a topic\n\nDO NOT USE WHEN:\n- Looking for a specific document by ID/UID (use get_knowledge)\n- Searching for exact title match (use search_knowledge_text)`,\n inputSchema: {\n query: z.string().describe('Natural language query describing what you\\'re looking for'),\n limit: z.number().optional().describe('Maximum results (default: 10)'),\n threshold: z.number().optional().describe('Minimum similarity 0-1 (default: 0.5, lower = more results)')\n }\n },\n async (args) => {\n interface SemanticSearchResponse {\n success: boolean\n results?: Array<{\n id: string\n uid?: string\n title: string\n doc_type: string\n similarity: number\n markdown?: string\n }>\n query_info?: { took_ms: number }\n error?: string\n }\n\n const result = await apiRequest<SemanticSearchResponse>(\n 'POST',\n '/api/search/semantic',\n {\n query: args.query,\n types: ['knowledge'],\n limit: args.limit || 10,\n threshold: args.threshold || 0.5\n }\n )\n\n if (!result.success || !result.results) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Semantic search failed'}` }], isError: true }\n }\n\n if (result.results.length === 0) {\n return { content: [{ type: 'text', text: `No knowledge documents found semantically matching: \"${args.query}\"\\n\\nTry:\\n- Broader search terms\\n- Lower threshold (e.g., 0.3)\\n- Text search for exact matches` }] }\n }\n\n const list = result.results.map(r => {\n const score = Math.round(r.similarity * 100)\n const uid = r.uid ? ` (${r.uid})` : ''\n const snippet = r.markdown ? `\\n ${r.markdown.substring(0, 150)}...` : ''\n return `- **${r.title}**${uid} [${r.doc_type}, ${score}% match]${snippet}`\n }).join('\\n\\n')\n\n const timing = result.query_info ? ` (${result.query_info.took_ms}ms)` : ''\n\n return {\n content: [{\n type: 'text',\n text: `# Semantic Search Results${timing}\\n\\nQuery: \"${args.query}\"\\nFound: ${result.results.length} documents\\n\\n${list}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'search_knowledge_text',\n {\n description: `Search knowledge using text/keyword matching (fast, exact).\n\nUSE THIS WHEN:\n- Looking for documents by UID: \"K123\", \"K45\"\n- Searching for exact title: \"API Authentication Guide\"\n- Finding documents containing specific terms\n\nDO NOT USE WHEN:\n- Looking for conceptually related content (use search_knowledge_semantic)\n- Want to find documents about a topic without knowing exact words`,\n inputSchema: {\n query: z.string().describe('Text to search for (searches title, UID, domain, content)'),\n limit: z.number().optional().describe('Maximum results (default: 20)')\n }\n },\n async (args) => {\n interface TextSearchResponse {\n success: boolean\n results?: Array<{\n id: string\n uid?: string\n title: string\n doc_type?: string\n type: string\n markdown?: string\n }>\n total?: number\n error?: string\n }\n\n const result = await apiRequest<TextSearchResponse>(\n 'POST',\n '/api/search/text',\n {\n query: args.query,\n types: ['knowledge'],\n limit: args.limit || 20\n }\n )\n\n if (!result.success || !result.results) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Text search failed'}` }], isError: true }\n }\n\n if (result.results.length === 0) {\n return { content: [{ type: 'text', text: `No knowledge documents found matching: \"${args.query}\"\\n\\nTry:\\n- Different keywords\\n- Semantic search for conceptual matches` }] }\n }\n\n const list = result.results.map(r => {\n const uid = r.uid ? ` (${r.uid})` : ''\n const docType = r.doc_type ? ` [${r.doc_type}]` : ''\n const snippet = r.markdown ? `\\n ${r.markdown.substring(0, 150)}...` : ''\n return `- **${r.title}**${uid}${docType}${snippet}`\n }).join('\\n\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# Text Search Results\\n\\nQuery: \"${args.query}\"\\nFound: ${result.results.length} of ${result.total || result.results.length} documents\\n\\n${list}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'search_knowledge_hybrid',\n {\n description: `Search knowledge using both semantic AND text matching (best for general queries).\n\nCombines results using Reciprocal Rank Fusion (RRF) algorithm.\nDocuments that match BOTH semantically and textually rank highest.\n\nUSE THIS WHEN:\n- General search where you want comprehensive results\n- Not sure if semantic or text search is better\n- Want the best of both approaches\n\nThis is the recommended default search for most queries.`,\n inputSchema: {\n query: z.string().describe('Search query (will be used for both semantic and text matching)'),\n limit: z.number().optional().describe('Maximum results (default: 10)')\n }\n },\n async (args) => {\n interface SearchResult {\n id: string\n uid?: string\n title: string\n doc_type?: string\n similarity?: number\n markdown?: string\n }\n\n interface SemanticResponse {\n success: boolean\n results?: SearchResult[]\n error?: string\n }\n\n interface TextResponse {\n success: boolean\n results?: SearchResult[]\n error?: string\n }\n\n // Run both searches in parallel\n const [semanticResult, textResult] = await Promise.all([\n apiRequest<SemanticResponse>('POST', '/api/search/semantic', {\n query: args.query,\n types: ['knowledge'],\n limit: 50,\n threshold: 0.4\n }),\n apiRequest<TextResponse>('POST', '/api/search/text', {\n query: args.query,\n types: ['knowledge'],\n limit: 50\n })\n ])\n\n const semanticResults = semanticResult.success ? (semanticResult.results || []) : []\n const textResults = textResult.success ? (textResult.results || []) : []\n\n // Apply Reciprocal Rank Fusion (RRF) with k=60\n const K = 60\n const scores = new Map<string, { score: number; doc: SearchResult; sources: string[] }>()\n\n // Score semantic results\n semanticResults.forEach((doc, index) => {\n const rrfScore = 1 / (K + index + 1)\n scores.set(doc.id, { score: rrfScore, doc, sources: ['semantic'] })\n })\n\n // Score text results and merge\n textResults.forEach((doc, index) => {\n const rrfScore = 1 / (K + index + 1)\n const existing = scores.get(doc.id)\n if (existing) {\n existing.score += rrfScore\n existing.sources.push('text')\n } else {\n scores.set(doc.id, { score: rrfScore, doc, sources: ['text'] })\n }\n })\n\n // Sort by RRF score and limit\n const limit = args.limit || 10\n const ranked = Array.from(scores.values())\n .sort((a, b) => b.score - a.score)\n .slice(0, limit)\n\n if (ranked.length === 0) {\n return { content: [{ type: 'text', text: `No knowledge documents found for: \"${args.query}\"\\n\\nBoth semantic and text search returned no results.` }] }\n }\n\n const list = ranked.map(({ doc, score, sources }) => {\n const uid = doc.uid ? ` (${doc.uid})` : ''\n const docType = doc.doc_type ? ` [${doc.doc_type}]` : ''\n const matchType = sources.length === 2 ? '⭐ both' : sources[0]\n const snippet = doc.markdown ? `\\n ${doc.markdown.substring(0, 150)}...` : ''\n return `- **${doc.title}**${uid}${docType} (${matchType})${snippet}`\n }).join('\\n\\n')\n\n const bothCount = ranked.filter(r => r.sources.length === 2).length\n\n return {\n content: [{\n type: 'text',\n text: `# Hybrid Search Results (RRF)\\n\\nQuery: \"${args.query}\"\\nFound: ${ranked.length} documents (${bothCount} matched both semantic + text)\\n\\n${list}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'list_linked_knowledge',\n {\n description: 'List knowledge documents linked to a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface LinkedKnowledgeResponse {\n success: boolean\n knowledge?: Array<{\n id: string\n title: string\n doc_type: string\n }>\n error?: string\n }\n\n const result = await apiRequest<LinkedKnowledgeResponse>(\n 'GET',\n `/api/modules/${args.module_uid}/knowledge`\n )\n\n if (!result.success || !result.knowledge) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Failed to fetch knowledge'}` }], isError: true }\n }\n\n if (result.knowledge.length === 0) {\n return { content: [{ type: 'text', text: 'No knowledge documents linked to this module.' }] }\n }\n\n const list = result.knowledge.map(k => `- **${k.title}** (${k.doc_type})`).join('\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# Linked Knowledge for ${args.module_uid}\\n\\n${list}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'link_knowledge',\n {\n description: 'Link a knowledge document to a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)'),\n knowledge_id: z.string().describe('The ID of the knowledge document to link')\n }\n },\n async (args) => {\n interface LinkResponse {\n success: boolean\n error?: string\n }\n\n const result = await apiRequest<LinkResponse>(\n 'POST',\n `/api/modules/${args.module_uid}/knowledge/link`,\n { knowledge_id: args.knowledge_id }\n )\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Knowledge document linked to module ${args.module_uid}`\n }]\n }\n }\n)\n\n// ============================================\n// Context Tools\n// ============================================\n\nserver.registerTool(\n 'get_module_context',\n {\n description: 'Get the full context for a module (title, tasks, linked knowledge)',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface ContextResponse {\n success: boolean\n context?: string\n error?: string\n }\n\n // Use the agent-accessible module context API\n const result = await apiRequest<ContextResponse>(\n 'GET',\n `/api/agent/context/module/${args.module_uid}`\n )\n\n if (!result.success || !result.context) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Failed to fetch context'}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: result.context\n }]\n }\n }\n)\n\nserver.registerTool(\n 'get_project_context',\n {\n description: 'Get the project-wide context (C2 bundle with active work, priorities)',\n inputSchema: {}\n },\n async () => {\n interface ContextResponse {\n success: boolean\n prompt?: string\n error?: string\n }\n\n // Use the agent-accessible system prompt API\n const result = await apiRequest<ContextResponse>(\n 'GET',\n '/api/agent/context/system'\n )\n\n if (!result.success || !result.prompt) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Failed to fetch context'}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: result.prompt\n }]\n }\n }\n)\n\n// ============================================\n// Start Server\n// ============================================\n\nasync function main() {\n const runtimeConfig = await hydrateRuntimeConfig()\n EPISODA_API_URL = runtimeConfig.apiUrl\n EPISODA_SESSION_TOKEN = runtimeConfig.sessionToken\n EPISODA_PROJECT_ID = runtimeConfig.projectId\n EPISODA_WORKSPACE_ID = runtimeConfig.workspaceId\n\n const transport = new StdioServerTransport()\n await server.connect(transport)\n\n // Log to stderr so it doesn't interfere with MCP protocol\n console.error('[episoda-workflow] MCP server started')\n console.error(`[episoda-workflow] API URL: ${EPISODA_API_URL}`)\n console.error(`[episoda-workflow] Token: ${EPISODA_SESSION_TOKEN ? '****' : 'NOT SET'}`)\n}\n\nmain().catch((error) => {\n console.error('[episoda-workflow] Fatal error:', error)\n process.exit(1)\n})\n","/**\n * EP908: Episoda Git MCP Server\n *\n * MCP server for Claude Code agents to perform git operations on dev environments.\n * Provides tools for:\n * - Repository status and info (status, log, diff, branch)\n * - Staging and commits (add, commit, reset)\n * - Remote operations (push, pull, fetch)\n * - Branch management (checkout, create, delete, merge)\n *\n * Usage:\n * npx -y @episoda/mcp git\n *\n * Required environment variables:\n * EPISODA_API_URL - Base URL for Episoda API (e.g., https://episoda.dev)\n * EPISODA_SESSION_TOKEN - Bearer token for API authentication\n *\n * Optional environment variables:\n * MODULE_UID - Module UID (preferred, e.g., EP123) or provide moduleUid per tool call\n * DEV_ENVIRONMENT_ID - UUID of the dev environment (legacy fallback)\n * EPISODA_PROJECT_ID - Project ID (for scoped requests)\n * EPISODA_WORKSPACE_ID - Workspace ID (for scoped requests)\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { z } from 'zod'\nimport { hydrateRuntimeConfig } from './runtime-config.js'\n\n// Environment configuration\nlet EPISODA_API_URL = process.env.EPISODA_API_URL || 'https://episoda.dev'\nlet EPISODA_SESSION_TOKEN = process.env.EPISODA_SESSION_TOKEN || ''\nconst DEV_ENVIRONMENT_ID = process.env.DEV_ENVIRONMENT_ID || ''\nconst MODULE_UID = process.env.MODULE_UID || ''\nlet EPISODA_PROJECT_ID = process.env.EPISODA_PROJECT_ID || ''\nlet EPISODA_WORKSPACE_ID = process.env.EPISODA_WORKSPACE_ID || ''\n\nconst targetSchema = {\n moduleUid: z.string().optional().describe('Module UID to target (overrides server default)')\n}\n\ninterface ExecResponse {\n success: boolean\n data?: {\n stdout: string\n stderr: string\n exitCode: number\n timedOut?: boolean\n }\n error?: string\n}\n\n/**\n * Execute a command on the dev environment via unified API\n */\nasync function execCommand(\n command: string,\n options: { cwd?: string; timeout?: number; moduleUid?: string } = {}\n): Promise<ExecResponse> {\n const { cwd, timeout = 30000, moduleUid } = options\n\n const target = moduleUid || MODULE_UID || DEV_ENVIRONMENT_ID\n if (!target) {\n return {\n success: false,\n error: 'Module target missing. Provide moduleUid in the tool call or set MODULE_UID/DEV_ENVIRONMENT_ID.'\n }\n }\n const url = `${EPISODA_API_URL}/api/dev/${target}/exec`\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${EPISODA_SESSION_TOKEN}`\n }\n if (EPISODA_PROJECT_ID) {\n headers['x-project-id'] = EPISODA_PROJECT_ID\n }\n if (EPISODA_WORKSPACE_ID) {\n headers['x-workspace-id'] = EPISODA_WORKSPACE_ID\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ command, cwd, timeout })\n })\n\n if (!response.ok) {\n const text = await response.text()\n return { success: false, error: `API error ${response.status}: ${text}` }\n }\n\n const result = await response.json()\n return result\n}\n\n/**\n * Helper to format git command output for MCP response\n */\nfunction formatGitOutput(result: ExecResponse, errorPrefix: string = 'Git error'): {\n content: Array<{ type: 'text'; text: string }>\n isError?: boolean\n} {\n if (!result.success || !result.data) {\n return {\n content: [{ type: 'text', text: `${errorPrefix}: ${result.error || 'Unknown error'}` }],\n isError: true\n }\n }\n\n const { stdout, stderr, exitCode } = result.data\n\n if (exitCode !== 0) {\n const errorOutput = stderr || stdout || 'Command failed'\n return {\n content: [{ type: 'text', text: `${errorPrefix} (exit ${exitCode}):\\n${errorOutput}` }],\n isError: true\n }\n }\n\n return {\n content: [{ type: 'text', text: stdout || '(no output)' }]\n }\n}\n\n// Create MCP server\nconst server = new McpServer({\n name: 'episoda-git',\n version: '1.0.0'\n}, {\n capabilities: {\n tools: {}\n },\n instructions: `\n Episoda Git MCP Server\n\n This server provides git operations for dev environments (cloud VMs or local machines).\n All commands are executed in the context of the configured dev environment.\n You may pass moduleUid per call to target a specific module.\n\n Categories:\n - Status & Info: git_status, git_log, git_diff, git_show, git_branch_list\n - Staging: git_add, git_reset\n - Commits: git_commit\n - Remote: git_push, git_pull, git_fetch\n - Branches: git_checkout, git_branch_create, git_branch_delete, git_merge\n - Stash: git_stash, git_stash_pop, git_stash_list\n - Worktrees (EP944): git_worktree_list, git_worktree_add, git_worktree_remove, git_worktree_prune\n\n Worktrees allow multiple working directories to share a single repository,\n enabling parallel development on multiple branches/modules simultaneously.\n `\n})\n\n// ============================================\n// Status & Info Tools\n// ============================================\n\nserver.registerTool(\n 'git_status',\n {\n description: 'Show the working tree status (staged, unstaged, untracked files)',\n inputSchema: {\n ...targetSchema,\n cwd: z.string().optional().describe('Working directory path (defaults to repo root)')\n }\n },\n async (args) => {\n const result = await execCommand('git status', { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to get git status')\n }\n)\n\nserver.registerTool(\n 'git_log',\n {\n description: 'Show commit logs',\n inputSchema: {\n ...targetSchema,\n count: z.number().optional().describe('Number of commits to show (default: 10)'),\n oneline: z.boolean().optional().describe('Use one-line format (default: true)'),\n branch: z.string().optional().describe('Branch name (default: current branch)'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n const count = args.count || 10\n const format = args.oneline !== false ? '--oneline' : '--format=medium'\n const branch = args.branch || ''\n\n const result = await execCommand(\n `git log ${format} -n ${count} ${branch}`.trim(),\n { cwd: args.cwd, moduleUid: args.moduleUid }\n )\n return formatGitOutput(result, 'Failed to get git log')\n }\n)\n\nserver.registerTool(\n 'git_diff',\n {\n description: 'Show changes between commits, commit and working tree, etc.',\n inputSchema: {\n ...targetSchema,\n staged: z.boolean().optional().describe('Show staged changes (--cached)'),\n file: z.string().optional().describe('Specific file to diff'),\n commit: z.string().optional().describe('Compare against specific commit'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = 'git diff'\n if (args.staged) cmd += ' --cached'\n if (args.commit) cmd += ` ${args.commit}`\n if (args.file) cmd += ` -- ${args.file}`\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to get diff')\n }\n)\n\nserver.registerTool(\n 'git_show',\n {\n description: 'Show details of a specific commit',\n inputSchema: {\n ...targetSchema,\n commit: z.string().describe('Commit hash or reference (e.g., HEAD, abc123)'),\n stat: z.boolean().optional().describe('Show diffstat only'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = `git show ${args.commit}`\n if (args.stat) cmd += ' --stat'\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to show commit')\n }\n)\n\nserver.registerTool(\n 'git_branch_list',\n {\n description: 'List branches',\n inputSchema: {\n ...targetSchema,\n all: z.boolean().optional().describe('Show all branches including remotes'),\n remote: z.boolean().optional().describe('Show only remote branches'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = 'git branch'\n if (args.all) cmd += ' -a'\n else if (args.remote) cmd += ' -r'\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to list branches')\n }\n)\n\n// ============================================\n// Staging Tools\n// ============================================\n\nserver.registerTool(\n 'git_add',\n {\n description: 'Add file contents to the staging area',\n inputSchema: {\n ...targetSchema,\n files: z.array(z.string()).describe('Files to add (use [\".\"] for all)'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n const files = args.files.map(f => `\"${f}\"`).join(' ')\n const result = await execCommand(`git add ${files}`, { cwd: args.cwd, moduleUid: args.moduleUid })\n\n if (!result.success || (result.data && result.data.exitCode !== 0)) {\n return formatGitOutput(result, 'Failed to add files')\n }\n\n return {\n content: [{ type: 'text', text: `Added ${args.files.length} file(s) to staging area` }]\n }\n }\n)\n\nserver.registerTool(\n 'git_reset',\n {\n description: 'Unstage files or reset to a commit',\n inputSchema: {\n ...targetSchema,\n files: z.array(z.string()).optional().describe('Files to unstage'),\n hard: z.boolean().optional().describe('Hard reset (WARNING: discards changes)'),\n commit: z.string().optional().describe('Commit to reset to'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = 'git reset'\n if (args.hard) cmd += ' --hard'\n if (args.commit) cmd += ` ${args.commit}`\n if (args.files && args.files.length > 0) {\n cmd += ' -- ' + args.files.map(f => `\"${f}\"`).join(' ')\n }\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to reset')\n }\n)\n\n// ============================================\n// Commit Tools\n// ============================================\n\nserver.registerTool(\n 'git_commit',\n {\n description: 'Record changes to the repository',\n inputSchema: {\n ...targetSchema,\n message: z.string().describe('Commit message'),\n all: z.boolean().optional().describe('Stage all modified files before commit (-a)'),\n amend: z.boolean().optional().describe('Amend the previous commit'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n // Escape message for shell\n const escapedMessage = args.message.replace(/'/g, \"'\\\\''\")\n\n let cmd = `git commit -m '${escapedMessage}'`\n if (args.all) cmd = cmd.replace('git commit', 'git commit -a')\n if (args.amend) cmd += ' --amend'\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to commit')\n }\n)\n\n// ============================================\n// Remote Tools\n// ============================================\n\nserver.registerTool(\n 'git_push',\n {\n description: 'Push commits to remote repository',\n inputSchema: {\n ...targetSchema,\n remote: z.string().optional().describe('Remote name (default: origin)'),\n branch: z.string().optional().describe('Branch name'),\n force: z.boolean().optional().describe('Force push (use with caution!)'),\n setUpstream: z.boolean().optional().describe('Set upstream tracking (-u)'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = 'git push'\n if (args.setUpstream) cmd += ' -u'\n if (args.force) cmd += ' --force-with-lease' // Safer than --force\n if (args.remote) cmd += ` ${args.remote}`\n if (args.branch) cmd += ` ${args.branch}`\n\n const result = await execCommand(cmd, { cwd: args.cwd, timeout: 60000, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to push')\n }\n)\n\nserver.registerTool(\n 'git_pull',\n {\n description: 'Fetch and integrate changes from remote',\n inputSchema: {\n ...targetSchema,\n remote: z.string().optional().describe('Remote name (default: origin)'),\n branch: z.string().optional().describe('Branch name'),\n rebase: z.boolean().optional().describe('Rebase instead of merge'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = 'git pull'\n if (args.rebase) cmd += ' --rebase'\n if (args.remote) cmd += ` ${args.remote}`\n if (args.branch) cmd += ` ${args.branch}`\n\n const result = await execCommand(cmd, { cwd: args.cwd, timeout: 60000, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to pull')\n }\n)\n\nserver.registerTool(\n 'git_fetch',\n {\n description: 'Download objects and refs from remote',\n inputSchema: {\n ...targetSchema,\n remote: z.string().optional().describe('Remote name (default: all remotes)'),\n prune: z.boolean().optional().describe('Remove deleted remote branches'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = 'git fetch'\n if (args.prune) cmd += ' --prune'\n if (args.remote) cmd += ` ${args.remote}`\n else cmd += ' --all'\n\n const result = await execCommand(cmd, { cwd: args.cwd, timeout: 60000, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to fetch')\n }\n)\n\n// ============================================\n// Branch Management Tools\n// ============================================\n\nserver.registerTool(\n 'git_checkout',\n {\n description: 'Switch branches or restore working tree files',\n inputSchema: {\n ...targetSchema,\n target: z.string().describe('Branch name, commit, or file path'),\n create: z.boolean().optional().describe('Create new branch (-b)'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = 'git checkout'\n if (args.create) cmd += ' -b'\n cmd += ` ${args.target}`\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to checkout')\n }\n)\n\nserver.registerTool(\n 'git_branch_create',\n {\n description: 'Create a new branch',\n inputSchema: {\n ...targetSchema,\n name: z.string().describe('Name for the new branch'),\n startPoint: z.string().optional().describe('Starting commit/branch'),\n checkout: z.boolean().optional().describe('Switch to new branch after creation'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd: string\n if (args.checkout) {\n cmd = `git checkout -b ${args.name}`\n } else {\n cmd = `git branch ${args.name}`\n }\n if (args.startPoint) cmd += ` ${args.startPoint}`\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n\n if (!result.success || (result.data && result.data.exitCode !== 0)) {\n return formatGitOutput(result, 'Failed to create branch')\n }\n\n return {\n content: [{\n type: 'text',\n text: `Created branch '${args.name}'${args.checkout ? ' and switched to it' : ''}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'git_branch_delete',\n {\n description: 'Delete a branch',\n inputSchema: {\n ...targetSchema,\n name: z.string().describe('Branch name to delete'),\n force: z.boolean().optional().describe('Force delete unmerged branch (-D)'),\n remote: z.boolean().optional().describe('Delete remote branch'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd: string\n if (args.remote) {\n cmd = `git push origin --delete ${args.name}`\n } else {\n cmd = `git branch ${args.force ? '-D' : '-d'} ${args.name}`\n }\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to delete branch')\n }\n)\n\nserver.registerTool(\n 'git_merge',\n {\n description: 'Join two or more development histories together',\n inputSchema: {\n ...targetSchema,\n branch: z.string().describe('Branch to merge into current branch'),\n noFf: z.boolean().optional().describe('Create merge commit even for fast-forward'),\n squash: z.boolean().optional().describe('Squash commits into single commit'),\n message: z.string().optional().describe('Merge commit message'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = `git merge ${args.branch}`\n if (args.noFf) cmd += ' --no-ff'\n if (args.squash) cmd += ' --squash'\n if (args.message) {\n const escapedMessage = args.message.replace(/'/g, \"'\\\\''\")\n cmd += ` -m '${escapedMessage}'`\n }\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to merge')\n }\n)\n\n// ============================================\n// Stash Tools\n// ============================================\n\nserver.registerTool(\n 'git_stash',\n {\n description: 'Stash changes in working directory',\n inputSchema: {\n ...targetSchema,\n message: z.string().optional().describe('Description for the stash'),\n includeUntracked: z.boolean().optional().describe('Include untracked files'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = 'git stash push'\n if (args.includeUntracked) cmd += ' --include-untracked'\n if (args.message) {\n const escapedMessage = args.message.replace(/'/g, \"'\\\\''\")\n cmd += ` -m '${escapedMessage}'`\n }\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to stash')\n }\n)\n\nserver.registerTool(\n 'git_stash_pop',\n {\n description: 'Apply and remove a stash',\n inputSchema: {\n ...targetSchema,\n index: z.number().optional().describe('Stash index (default: 0, most recent)'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n const stashRef = args.index !== undefined ? `stash@{${args.index}}` : ''\n const result = await execCommand(`git stash pop ${stashRef}`.trim(), { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to pop stash')\n }\n)\n\nserver.registerTool(\n 'git_stash_list',\n {\n description: 'List stashed changes',\n inputSchema: {\n ...targetSchema,\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n const result = await execCommand('git stash list', { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to list stashes')\n }\n)\n\n// ============================================\n// EP944: Worktree Tools\n// ============================================\n\nserver.registerTool(\n 'git_worktree_list',\n {\n description: 'List all worktrees in the repository. Worktrees allow multiple working directories to share a single repository.',\n inputSchema: {\n ...targetSchema,\n cwd: z.string().optional().describe('Working directory path (must be inside a git repo)')\n }\n },\n async (args) => {\n const result = await execCommand('git worktree list', { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to list worktrees')\n }\n)\n\nserver.registerTool(\n 'git_worktree_add',\n {\n description: 'Create a new worktree at the specified path for the given branch. This allows working on multiple branches simultaneously.',\n inputSchema: {\n ...targetSchema,\n path: z.string().describe('Path where the new worktree will be created'),\n branch: z.string().describe('Branch to checkout in the new worktree'),\n create: z.boolean().optional().describe('Create a new branch if it does not exist (-b)'),\n cwd: z.string().optional().describe('Working directory path (must be inside a git repo)')\n }\n },\n async (args) => {\n let cmd = 'git worktree add'\n if (args.create) {\n cmd += ` -b ${args.branch} \"${args.path}\"`\n } else {\n cmd += ` \"${args.path}\" ${args.branch}`\n }\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n\n if (!result.success || (result.data && result.data.exitCode !== 0)) {\n return formatGitOutput(result, 'Failed to create worktree')\n }\n\n return {\n content: [{\n type: 'text',\n text: `Created worktree at '${args.path}' for branch '${args.branch}'`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'git_worktree_remove',\n {\n description: 'Remove a worktree. The branch is preserved in the repository - only the working directory is removed.',\n inputSchema: {\n ...targetSchema,\n path: z.string().describe('Path of the worktree to remove'),\n force: z.boolean().optional().describe('Force removal even with uncommitted changes'),\n cwd: z.string().optional().describe('Working directory path (must be inside a git repo)')\n }\n },\n async (args) => {\n let cmd = `git worktree remove \"${args.path}\"`\n if (args.force) cmd += ' --force'\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n\n if (!result.success || (result.data && result.data.exitCode !== 0)) {\n return formatGitOutput(result, 'Failed to remove worktree')\n }\n\n return {\n content: [{\n type: 'text',\n text: `Removed worktree at '${args.path}'`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'git_worktree_prune',\n {\n description: 'Clean up stale worktree administrative files. Run this if worktrees were manually deleted.',\n inputSchema: {\n ...targetSchema,\n cwd: z.string().optional().describe('Working directory path (must be inside a git repo)')\n }\n },\n async (args) => {\n const result = await execCommand('git worktree prune', { cwd: args.cwd, moduleUid: args.moduleUid })\n\n if (!result.success || (result.data && result.data.exitCode !== 0)) {\n return formatGitOutput(result, 'Failed to prune worktrees')\n }\n\n return {\n content: [{\n type: 'text',\n text: 'Pruned stale worktree entries'\n }]\n }\n }\n)\n\n// ============================================\n// Start Server\n// ============================================\n\nasync function main() {\n const runtimeConfig = await hydrateRuntimeConfig()\n EPISODA_API_URL = runtimeConfig.apiUrl\n EPISODA_SESSION_TOKEN = runtimeConfig.sessionToken\n EPISODA_PROJECT_ID = runtimeConfig.projectId\n EPISODA_WORKSPACE_ID = runtimeConfig.workspaceId\n\n if (!MODULE_UID && !DEV_ENVIRONMENT_ID) {\n console.warn('[episoda-git] Warning: MODULE_UID/DEV_ENVIRONMENT_ID not set. Provide moduleUid per tool call.')\n }\n\n const transport = new StdioServerTransport()\n await server.connect(transport)\n\n const devTarget = MODULE_UID || DEV_ENVIRONMENT_ID || 'NOT SET'\n console.error('[episoda-git] MCP server started')\n console.error(`[episoda-git] API URL: ${EPISODA_API_URL}`)\n console.error(`[episoda-git] Dev Target: ${devTarget}`)\n console.error(`[episoda-git] Token: ${EPISODA_SESSION_TOKEN ? '****' : 'NOT SET'}`)\n}\n\nmain().catch((error) => {\n console.error('[episoda-git] Fatal error:', error)\n process.exit(1)\n})\n","/**\n * EP908: Episoda Dev MCP Server\n *\n * MCP server for Claude Code agents to perform file and environment operations\n * on dev environments (cloud VMs or local machines).\n *\n * Provides tools for:\n * - File operations (read, write, edit, delete, mkdir)\n * - Directory operations (list, search)\n * - Code search (grep)\n * - Command execution\n * - Batch operations\n *\n * Usage:\n * npx -y @episoda/mcp dev\n *\n * Required environment variables:\n * EPISODA_API_URL - Base URL for Episoda API (e.g., https://episoda.dev)\n * EPISODA_SESSION_TOKEN - Bearer token for API authentication\n *\n * Optional environment variables:\n * MODULE_UID - Module UID (preferred, e.g., EP123) or provide moduleUid per tool call\n * DEV_ENVIRONMENT_ID - UUID of the dev environment (legacy fallback)\n * EPISODA_PROJECT_ID - Project ID (for scoped requests)\n * EPISODA_WORKSPACE_ID - Workspace ID (for scoped requests)\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { z } from 'zod'\nimport { hydrateRuntimeConfig } from './runtime-config.js'\n\n// Environment configuration\nlet EPISODA_API_URL = process.env.EPISODA_API_URL || 'https://episoda.dev'\nlet EPISODA_SESSION_TOKEN = process.env.EPISODA_SESSION_TOKEN || ''\nconst DEV_ENVIRONMENT_ID = process.env.DEV_ENVIRONMENT_ID || ''\nconst MODULE_UID = process.env.MODULE_UID || ''\nlet EPISODA_PROJECT_ID = process.env.EPISODA_PROJECT_ID || ''\nlet EPISODA_WORKSPACE_ID = process.env.EPISODA_WORKSPACE_ID || ''\n\nconst targetSchema = {\n moduleUid: z.string().optional().describe('Module UID to target (overrides server default)')\n}\n\n/**\n * Make an authenticated API request\n */\nasync function apiRequest<T>(\n method: 'GET' | 'POST' | 'DELETE',\n path: string,\n body?: Record<string, unknown>\n): Promise<T> {\n const url = `${EPISODA_API_URL}${path}`\n const options: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${EPISODA_SESSION_TOKEN}`\n }\n }\n\n if (EPISODA_PROJECT_ID) {\n (options.headers as Record<string, string>)['x-project-id'] = EPISODA_PROJECT_ID\n }\n if (EPISODA_WORKSPACE_ID) {\n (options.headers as Record<string, string>)['x-workspace-id'] = EPISODA_WORKSPACE_ID\n }\n\n if (body && method !== 'GET') {\n options.body = JSON.stringify(body)\n }\n\n const response = await fetch(url, options)\n\n if (!response.ok) {\n const text = await response.text()\n throw new Error(`API error ${response.status}: ${text}`)\n }\n\n return response.json() as Promise<T>\n}\n\n/**\n * Helper to build API path with dev environment ID\n */\nfunction devPath(endpoint: string, overrideTarget?: string): string {\n const target = overrideTarget || MODULE_UID || DEV_ENVIRONMENT_ID\n if (!target) {\n throw new Error('Module target missing. Provide moduleUid in the tool call or set MODULE_UID/DEV_ENVIRONMENT_ID.')\n }\n return `/api/dev/${target}${endpoint}`\n}\n\n// Create MCP server\nconst server = new McpServer({\n name: 'episoda-dev',\n version: '1.0.0'\n}, {\n capabilities: {\n tools: {}\n },\n instructions: `\n Episoda Dev MCP Server\n\n This server provides file and environment operations for dev environments\n (cloud VMs or local machines). All operations execute in the context of\n the configured dev environment.\n You may pass moduleUid per call to target a specific module.\n\n Categories:\n - File Operations: read_file, write_file, edit_file, delete_file\n - Directory Operations: list_directory, mkdir, search_files\n - Code Search: grep\n - Execution: exec_command\n - Batch: batch_operations\n\n All paths should be absolute paths within the dev environment.\n `\n})\n\n// ============================================\n// File Operations\n// ============================================\n\nserver.registerTool(\n 'read_file',\n {\n description: 'Read contents of a file',\n inputSchema: {\n ...targetSchema,\n path: z.string().describe('Absolute path to the file'),\n encoding: z.enum(['utf8', 'base64']).optional().describe('File encoding (default: utf8)')\n }\n },\n async (args) => {\n interface ReadResponse {\n success: boolean\n data?: { content: string }\n error?: string\n }\n\n try {\n const result = await apiRequest<ReadResponse>(\n 'POST',\n devPath('/read-file', args.moduleUid),\n {\n path: args.path,\n encoding: args.encoding || 'utf8'\n }\n )\n\n if (!result.success || !result.data) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Failed to read file'}` }],\n isError: true\n }\n }\n\n return {\n content: [{ type: 'text', text: result.data.content }]\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error reading file: ${error}` }],\n isError: true\n }\n }\n }\n)\n\nserver.registerTool(\n 'write_file',\n {\n description: 'Write content to a file (creates or overwrites)',\n inputSchema: {\n ...targetSchema,\n path: z.string().describe('Absolute path to the file'),\n content: z.string().describe('Content to write'),\n encoding: z.enum(['utf8', 'base64']).optional().describe('Content encoding (default: utf8)'),\n createDirs: z.boolean().optional().describe('Create parent directories if missing (default: true)')\n }\n },\n async (args) => {\n interface WriteResponse {\n success: boolean\n data?: { size: number }\n error?: string\n }\n\n try {\n const result = await apiRequest<WriteResponse>(\n 'POST',\n devPath('/write-file', args.moduleUid),\n {\n path: args.path,\n content: args.content,\n encoding: args.encoding || 'utf8',\n createDirs: args.createDirs !== false\n }\n )\n\n if (!result.success) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Failed to write file'}` }],\n isError: true\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Wrote ${result.data?.size || 0} bytes to ${args.path}`\n }]\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error writing file: ${error}` }],\n isError: true\n }\n }\n }\n)\n\nserver.registerTool(\n 'edit_file',\n {\n description: 'Edit a file by replacing a specific string with another',\n inputSchema: {\n ...targetSchema,\n path: z.string().describe('Absolute path to the file'),\n old_string: z.string().describe('The exact string to find and replace'),\n new_string: z.string().describe('The replacement string'),\n replace_all: z.boolean().optional().describe('Replace all occurrences (default: false, replaces first only)')\n }\n },\n async (args) => {\n interface EditResponse {\n success: boolean\n data?: { replacements: number; newSize: number }\n error?: string\n }\n\n try {\n const result = await apiRequest<EditResponse>(\n 'POST',\n devPath('/edit-file', args.moduleUid),\n {\n path: args.path,\n old_string: args.old_string,\n new_string: args.new_string,\n replace_all: args.replace_all || false\n }\n )\n\n if (!result.success) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Failed to edit file'}` }],\n isError: true\n }\n }\n\n const replacements = result.data?.replacements || 0\n if (replacements === 0) {\n return {\n content: [{ type: 'text', text: 'Warning: No replacements made (string not found)' }]\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Made ${replacements} replacement(s) in ${args.path}`\n }]\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error editing file: ${error}` }],\n isError: true\n }\n }\n }\n)\n\nserver.registerTool(\n 'delete_file',\n {\n description: 'Delete a file or directory',\n inputSchema: {\n ...targetSchema,\n path: z.string().describe('Absolute path to delete'),\n recursive: z.boolean().optional().describe('Delete directories recursively (default: false)')\n }\n },\n async (args) => {\n interface DeleteResponse {\n success: boolean\n error?: string\n }\n\n try {\n const result = await apiRequest<DeleteResponse>(\n 'DELETE',\n `${devPath('/delete-file', args.moduleUid)}?path=${encodeURIComponent(args.path)}&recursive=${args.recursive || false}`\n )\n\n if (!result.success) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Failed to delete'}` }],\n isError: true\n }\n }\n\n return {\n content: [{ type: 'text', text: `Deleted ${args.path}` }]\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error deleting: ${error}` }],\n isError: true\n }\n }\n }\n)\n\n// ============================================\n// Directory Operations\n// ============================================\n\nserver.registerTool(\n 'list_directory',\n {\n description: 'List contents of a directory',\n inputSchema: {\n ...targetSchema,\n path: z.string().describe('Absolute path to directory'),\n recursive: z.boolean().optional().describe('List recursively (default: false)'),\n includeHidden: z.boolean().optional().describe('Include hidden files (default: false)')\n }\n },\n async (args) => {\n interface ListResponse {\n success: boolean\n data?: {\n entries: Array<{\n name: string\n type: 'file' | 'directory'\n size: number\n }>\n }\n error?: string\n }\n\n try {\n const result = await apiRequest<ListResponse>(\n 'POST',\n devPath('/list-dir', args.moduleUid),\n {\n path: args.path,\n recursive: args.recursive || false,\n includeHidden: args.includeHidden || false\n }\n )\n\n if (!result.success || !result.data) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Failed to list directory'}` }],\n isError: true\n }\n }\n\n if (result.data.entries.length === 0) {\n return {\n content: [{ type: 'text', text: `Directory ${args.path} is empty` }]\n }\n }\n\n const listing = result.data.entries.map(e => {\n const icon = e.type === 'directory' ? '/' : ''\n const size = e.type === 'file' ? ` (${formatSize(e.size)})` : ''\n return `${e.name}${icon}${size}`\n }).join('\\n')\n\n return {\n content: [{ type: 'text', text: listing }]\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error listing directory: ${error}` }],\n isError: true\n }\n }\n }\n)\n\nserver.registerTool(\n 'mkdir',\n {\n description: 'Create a directory (including parent directories)',\n inputSchema: {\n ...targetSchema,\n path: z.string().describe('Absolute path of directory to create')\n }\n },\n async (args) => {\n interface MkdirResponse {\n success: boolean\n error?: string\n }\n\n try {\n const result = await apiRequest<MkdirResponse>(\n 'POST',\n devPath('/mkdir', args.moduleUid),\n { path: args.path }\n )\n\n if (!result.success) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Failed to create directory'}` }],\n isError: true\n }\n }\n\n return {\n content: [{ type: 'text', text: `Created directory ${args.path}` }]\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error creating directory: ${error}` }],\n isError: true\n }\n }\n }\n)\n\nserver.registerTool(\n 'search_files',\n {\n description: 'Search for files by glob pattern',\n inputSchema: {\n ...targetSchema,\n pattern: z.string().describe('Glob pattern (e.g., \"*.ts\", \"**/*.tsx\")'),\n basePath: z.string().describe('Base directory to search from'),\n maxResults: z.number().optional().describe('Maximum results (default: 100)')\n }\n },\n async (args) => {\n interface SearchResponse {\n success: boolean\n data?: { files: string[] }\n error?: string\n }\n\n try {\n const result = await apiRequest<SearchResponse>(\n 'POST',\n devPath('/search-files', args.moduleUid),\n {\n pattern: args.pattern,\n basePath: args.basePath,\n maxResults: args.maxResults || 100\n }\n )\n\n if (!result.success || !result.data) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Failed to search'}` }],\n isError: true\n }\n }\n\n if (result.data.files.length === 0) {\n return {\n content: [{ type: 'text', text: `No files matching \"${args.pattern}\" found` }]\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Found ${result.data.files.length} file(s):\\n${result.data.files.join('\\n')}`\n }]\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error searching: ${error}` }],\n isError: true\n }\n }\n }\n)\n\n// ============================================\n// Code Search\n// ============================================\n\nserver.registerTool(\n 'grep',\n {\n description: 'Search for pattern in file contents',\n inputSchema: {\n ...targetSchema,\n pattern: z.string().describe('Search pattern (regex supported)'),\n path: z.string().describe('File or directory to search'),\n filePattern: z.string().optional().describe('Filter by file pattern (e.g., \"*.ts\")'),\n caseSensitive: z.boolean().optional().describe('Case sensitive search (default: true)'),\n maxResults: z.number().optional().describe('Maximum results (default: 100)')\n }\n },\n async (args) => {\n interface GrepResponse {\n success: boolean\n data?: {\n matches: Array<{\n file: string\n line: number\n content: string\n }>\n }\n error?: string\n }\n\n try {\n const flags = args.caseSensitive === false ? '-rni' : '-rn'\n const result = await apiRequest<GrepResponse>(\n 'POST',\n devPath('/grep', args.moduleUid),\n {\n pattern: args.pattern,\n path: args.path,\n flags\n }\n )\n\n if (!result.success || !result.data) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Failed to search'}` }],\n isError: true\n }\n }\n\n if (result.data.matches.length === 0) {\n return {\n content: [{ type: 'text', text: `No matches found for \"${args.pattern}\"` }]\n }\n }\n\n const matches = result.data.matches.map(m =>\n `${m.file}:${m.line}: ${m.content}`\n ).join('\\n')\n\n return {\n content: [{\n type: 'text',\n text: `Found ${result.data.matches.length} match(es):\\n${matches}`\n }]\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error searching: ${error}` }],\n isError: true\n }\n }\n }\n)\n\n// ============================================\n// Command Execution\n// ============================================\n\nserver.registerTool(\n 'exec_command',\n {\n description: 'Execute a shell command',\n inputSchema: {\n ...targetSchema,\n command: z.string().describe('Command to execute'),\n cwd: z.string().optional().describe('Working directory'),\n timeout: z.number().optional().describe('Timeout in milliseconds (default: 30000)')\n }\n },\n async (args) => {\n interface ExecResponse {\n success: boolean\n data?: {\n stdout: string\n stderr: string\n exitCode: number\n timedOut?: boolean\n }\n error?: string\n }\n\n try {\n const result = await apiRequest<ExecResponse>(\n 'POST',\n devPath('/exec', args.moduleUid),\n {\n command: args.command,\n cwd: args.cwd,\n timeout: args.timeout || 30000\n }\n )\n\n if (!result.success || !result.data) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Command failed'}` }],\n isError: true\n }\n }\n\n const { stdout, stderr, exitCode, timedOut } = result.data\n\n if (timedOut) {\n return {\n content: [{ type: 'text', text: `Command timed out\\n\\nOutput so far:\\n${stdout}` }],\n isError: true\n }\n }\n\n let output = ''\n if (stdout) output += stdout\n if (stderr) output += `\\n\\nSTDERR:\\n${stderr}`\n if (exitCode !== 0) output += `\\n\\nExit code: ${exitCode}`\n\n return {\n content: [{ type: 'text', text: output || '(no output)' }],\n isError: exitCode !== 0\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error executing command: ${error}` }],\n isError: true\n }\n }\n }\n)\n\n// ============================================\n// Batch Operations\n// ============================================\n\nserver.registerTool(\n 'batch_operations',\n {\n description: 'Execute multiple file operations in a single request',\n inputSchema: {\n ...targetSchema,\n operations: z.array(z.object({\n type: z.enum(['read', 'write', 'mkdir', 'delete', 'exec']).describe('Operation type'),\n path: z.string().optional().describe('File/directory path'),\n content: z.string().optional().describe('Content for write operations'),\n command: z.string().optional().describe('Command for exec operations'),\n recursive: z.boolean().optional().describe('Recursive flag for delete')\n })).describe('Array of operations to execute'),\n stopOnError: z.boolean().optional().describe('Stop on first error (default: false)')\n }\n },\n async (args) => {\n interface BatchResponse {\n success: boolean\n data?: {\n results: Array<{\n success: boolean\n data?: unknown\n error?: string\n }>\n completedCount: number\n failedCount: number\n }\n error?: string\n }\n\n try {\n const result = await apiRequest<BatchResponse>(\n 'POST',\n devPath('/batch', args.moduleUid),\n {\n operations: args.operations,\n stopOnError: args.stopOnError || false\n }\n )\n\n if (!result.success || !result.data) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Batch failed'}` }],\n isError: true\n }\n }\n\n const { completedCount, failedCount, results } = result.data\n\n let summary = `Batch complete: ${completedCount} succeeded, ${failedCount} failed\\n\\n`\n\n results.forEach((r, i) => {\n const op = args.operations[i]\n const status = r.success ? 'OK' : 'FAILED'\n summary += `[${i + 1}] ${op.type} ${op.path || op.command || ''}: ${status}`\n if (!r.success && r.error) summary += ` - ${r.error}`\n summary += '\\n'\n })\n\n return {\n content: [{ type: 'text', text: summary }],\n isError: failedCount > 0\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error executing batch: ${error}` }],\n isError: true\n }\n }\n }\n)\n\n// ============================================\n// Utility Functions\n// ============================================\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)}MB`\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)}GB`\n}\n\n// ============================================\n// Start Server\n// ============================================\n\nasync function main() {\n const runtimeConfig = await hydrateRuntimeConfig()\n EPISODA_API_URL = runtimeConfig.apiUrl\n EPISODA_SESSION_TOKEN = runtimeConfig.sessionToken\n EPISODA_PROJECT_ID = runtimeConfig.projectId\n EPISODA_WORKSPACE_ID = runtimeConfig.workspaceId\n\n if (!MODULE_UID && !DEV_ENVIRONMENT_ID) {\n console.warn('[episoda-dev] Warning: MODULE_UID/DEV_ENVIRONMENT_ID not set. Provide moduleUid per tool call.')\n }\n\n const transport = new StdioServerTransport()\n await server.connect(transport)\n\n const devTarget = MODULE_UID || DEV_ENVIRONMENT_ID || 'NOT SET'\n console.error('[episoda-dev] MCP server started')\n console.error(`[episoda-dev] API URL: ${EPISODA_API_URL}`)\n console.error(`[episoda-dev] Dev Target: ${devTarget}`)\n console.error(`[episoda-dev] Token: ${EPISODA_SESSION_TOKEN ? '****' : 'NOT SET'}`)\n}\n\nmain().catch((error) => {\n console.error('[episoda-dev] Fatal error:', error)\n process.exit(1)\n})\n","const usage = () => {\n console.error('Usage: @episoda/mcp <workflow|git|dev>')\n console.error('Aliases: episoda-workflow, episoda-git, episoda-dev')\n}\n\nasync function main() {\n const [server] = process.argv.slice(2)\n if (!server || server === '-h' || server === '--help' || server === 'help') {\n usage()\n process.exit(server ? 0 : 2)\n }\n\n const normalized = server.toLowerCase()\n\n switch (normalized) {\n case 'workflow':\n case 'episoda-workflow':\n await import('./workflow-server.js')\n break\n case 'git':\n case 'episoda-git':\n await import('./git-server.js')\n break\n case 'dev':\n case 'episoda-dev':\n await import('./dev-server.js')\n break\n default:\n usage()\n process.exit(2)\n }\n}\n\nmain().catch((error) => {\n console.error('[episoda-mcp] Fatal error:', error)\n process.exit(1)\n})\n"],"mappings":"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","names":["path","McpServer","StdioServerTransport","z","EPISODA_API_URL","EPISODA_SESSION_TOKEN","EPISODA_PROJECT_ID","EPISODA_WORKSPACE_ID","main","server","McpServer","StdioServerTransport","z","apiRequest","path","EPISODA_API_URL","EPISODA_SESSION_TOKEN","EPISODA_PROJECT_ID","EPISODA_WORKSPACE_ID","MODULE_UID","DEV_ENVIRONMENT_ID","main","server","targetSchema","main","server"]}
1
+ {"version":3,"sources":["../src/runtime-config.ts","../src/workflow-server.ts","../src/git-server.ts","../src/dev-server.ts","../src/cli.ts"],"sourcesContent":["import * as fs from 'node:fs'\nimport * as os from 'node:os'\nimport * as path from 'node:path'\n\nconst DEFAULT_API_URL = 'https://episoda.dev'\nconst DEFAULT_CONFIG_FILE = 'config.json'\n\ninterface EpisodaLocalConfig {\n access_token?: string\n project_id?: string\n workspace_id?: string\n api_url?: string\n}\n\nexport interface RuntimeConfig {\n apiUrl: string\n sessionToken: string\n projectId: string\n workspaceId: string\n}\n\nconst normalizeEnv = (value?: string): string | undefined => {\n if (!value) return undefined\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : undefined\n}\n\nconst readEnvConfig = () => ({\n apiUrl: normalizeEnv(process.env.EPISODA_API_URL),\n sessionToken: normalizeEnv(process.env.EPISODA_SESSION_TOKEN),\n projectId: normalizeEnv(process.env.EPISODA_PROJECT_ID),\n workspaceId: normalizeEnv(process.env.EPISODA_WORKSPACE_ID)\n})\n\nconst buildMissingMessage = (missing: string[], apiUrl: string): string => {\n return [\n `[episoda-mcp] Missing auth context: ${missing.join(', ')}`,\n '[episoda-mcp] Set EPISODA_* env vars or run:',\n `[episoda-mcp] episoda auth --api-url ${apiUrl}`\n ].join('\\n')\n}\n\nconst getConfigPath = (): string => {\n // MCP supports a full-path override in addition to the core-style config dir.\n if (process.env.EPISODA_CONFIG_PATH) {\n return process.env.EPISODA_CONFIG_PATH\n }\n const configDir = process.env.EPISODA_CONFIG_DIR || path.join(os.homedir(), '.episoda')\n return path.join(configDir, DEFAULT_CONFIG_FILE)\n}\n\nconst loadLocalConfig = (): EpisodaLocalConfig | null => {\n const configPath = getConfigPath()\n if (!fs.existsSync(configPath)) {\n return null\n }\n try {\n const content = fs.readFileSync(configPath, 'utf8')\n return JSON.parse(content) as EpisodaLocalConfig\n } catch (error) {\n console.error('[episoda-mcp] Failed to load config:', error)\n return null\n }\n}\n\nexport async function resolveRuntimeConfig(): Promise<RuntimeConfig> {\n const envConfig = readEnvConfig()\n\n let fileConfig: EpisodaLocalConfig | null = null\n if (!envConfig.sessionToken || !envConfig.projectId || !envConfig.workspaceId || !envConfig.apiUrl) {\n fileConfig = loadLocalConfig()\n }\n\n const resolved: RuntimeConfig = {\n apiUrl: envConfig.apiUrl || fileConfig?.api_url || DEFAULT_API_URL,\n sessionToken: envConfig.sessionToken || fileConfig?.access_token || '',\n projectId: envConfig.projectId || fileConfig?.project_id || '',\n workspaceId: envConfig.workspaceId || fileConfig?.workspace_id || ''\n }\n\n const missing: string[] = []\n if (!resolved.sessionToken) missing.push('EPISODA_SESSION_TOKEN')\n if (!resolved.projectId) missing.push('EPISODA_PROJECT_ID')\n if (!resolved.workspaceId) missing.push('EPISODA_WORKSPACE_ID')\n\n if (missing.length > 0) {\n throw new Error(buildMissingMessage(missing, resolved.apiUrl))\n }\n\n return resolved\n}\n\nexport async function hydrateRuntimeConfig(): Promise<RuntimeConfig> {\n const resolved = await resolveRuntimeConfig()\n\n if (!normalizeEnv(process.env.EPISODA_API_URL)) {\n process.env.EPISODA_API_URL = resolved.apiUrl\n }\n if (!normalizeEnv(process.env.EPISODA_SESSION_TOKEN)) {\n process.env.EPISODA_SESSION_TOKEN = resolved.sessionToken\n }\n if (!normalizeEnv(process.env.EPISODA_PROJECT_ID)) {\n process.env.EPISODA_PROJECT_ID = resolved.projectId\n }\n if (!normalizeEnv(process.env.EPISODA_WORKSPACE_ID)) {\n process.env.EPISODA_WORKSPACE_ID = resolved.workspaceId\n }\n\n return resolved\n}\n","/**\n * EP895-10: Episoda Workflow MCP Server\n *\n * MCP server for Claude Code agents to interact with the Episoda workflow system.\n * Provides tools for:\n * - Task management (create, update, state transitions)\n * - Module management (create, update, state transitions)\n * - Knowledge access (search, get, link)\n *\n * Usage:\n * npx -y @episoda/mcp workflow\n *\n * Required environment variables:\n * EPISODA_API_URL - Base URL for Episoda API (e.g., https://episoda.dev)\n * EPISODA_SESSION_TOKEN - Bearer token for API authentication\n * MODULE_UID - Current module UID (for context)\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { z } from 'zod'\nimport { hydrateRuntimeConfig } from './runtime-config.js'\n\n// Environment configuration\nlet EPISODA_API_URL = process.env.EPISODA_API_URL || 'https://episoda.dev'\nlet EPISODA_SESSION_TOKEN = process.env.EPISODA_SESSION_TOKEN || ''\nlet EPISODA_PROJECT_ID = process.env.EPISODA_PROJECT_ID || ''\nlet EPISODA_WORKSPACE_ID = process.env.EPISODA_WORKSPACE_ID || ''\n\n/**\n * Make an authenticated API request\n */\nasync function apiRequest<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE',\n path: string,\n body?: Record<string, unknown>\n): Promise<T> {\n const url = `${EPISODA_API_URL}${path}`\n const options: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${EPISODA_SESSION_TOKEN}`\n }\n }\n\n if (body && method !== 'GET') {\n options.body = JSON.stringify(body)\n }\n\n if (EPISODA_PROJECT_ID) {\n (options.headers as Record<string, string>)['x-project-id'] = EPISODA_PROJECT_ID\n }\n if (EPISODA_WORKSPACE_ID) {\n (options.headers as Record<string, string>)['x-workspace-id'] = EPISODA_WORKSPACE_ID\n }\n\n const response = await fetch(url, options)\n\n if (!response.ok) {\n const text = await response.text()\n throw new Error(`API error ${response.status}: ${text}`)\n }\n\n return response.json() as Promise<T>\n}\n\n// Create MCP server\nconst server = new McpServer({\n name: 'episoda-workflow',\n version: '1.0.0'\n}, {\n capabilities: {\n tools: {}\n },\n instructions: `\n Episoda Workflow MCP Server\n\n This server provides tools to manage the Episoda development workflow:\n - Tasks: Create, update, and transition task states\n - Modules: Create, update, and transition module states\n - Knowledge: Search, retrieve, and link knowledge documents\n\n Task and module states flow: backlog → doing → review → done\n `\n})\n\n// ============================================\n// Task Management Tools\n// ============================================\n\nserver.registerTool(\n 'create_task',\n {\n description: 'Create a new task within a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the parent module (e.g., EP584)'),\n title: z.string().describe('Title of the task'),\n description: z.string().optional().describe('Markdown description of the task'),\n type: z.enum(['task', 'bug', 'spike']).optional().describe('Type of task')\n }\n },\n async (args) => {\n interface CreateTaskResponse {\n success: boolean\n task?: { id: string; uid: string; title: string }\n error?: string\n }\n\n const result = await apiRequest<CreateTaskResponse>('POST', '/api/tasks', {\n module_id: args.module_uid, // API expects module_id (accepts both UUID and UID)\n title: args.title,\n description_md: args.description,\n type: args.type || 'task'\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Created task ${result.task?.uid}: ${result.task?.title}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'update_task_state',\n {\n description: 'Move a task to a new state (backlog, doing, review, done)',\n inputSchema: {\n task_uid: z.string().describe('The UID of the task (e.g., EP584-1)'),\n state: z.enum(['backlog', 'doing', 'review', 'done']).describe('New state for the task')\n }\n },\n async (args) => {\n interface UpdateTaskResponse {\n success: boolean\n task?: { uid: string; state: string }\n error?: string\n }\n\n const result = await apiRequest<UpdateTaskResponse>('PATCH', `/api/tasks/${args.task_uid}`, {\n state: args.state\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Task ${args.task_uid} moved to ${args.state}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'update_task',\n {\n description: 'Update task details (title, description)',\n inputSchema: {\n task_uid: z.string().describe('The UID of the task (e.g., EP584-1)'),\n title: z.string().optional().describe('New title for the task'),\n description: z.string().optional().describe('New markdown description')\n }\n },\n async (args) => {\n interface UpdateTaskResponse {\n success: boolean\n task?: { uid: string; title: string }\n error?: string\n }\n\n const updates: Record<string, string> = {}\n if (args.title) updates.title = args.title\n if (args.description) updates.description_md = args.description\n\n const result = await apiRequest<UpdateTaskResponse>('PATCH', `/api/tasks/${args.task_uid}`, updates)\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Task ${args.task_uid} updated`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'get_task_details',\n {\n description: 'Get detailed information about a task',\n inputSchema: {\n task_uid: z.string().describe('The UID of the task (e.g., EP584-1)')\n }\n },\n async (args) => {\n interface TaskResponse {\n success: boolean\n task?: {\n uid: string\n title: string\n state: string\n type: string\n description_md: string | null\n module_uid: string\n }\n error?: string\n }\n\n const result = await apiRequest<TaskResponse>('GET', `/api/tasks/${args.task_uid}`)\n\n if (!result.success || !result.task) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Task not found'}` }], isError: true }\n }\n\n const task = result.task\n return {\n content: [{\n type: 'text',\n text: `# ${task.uid}: ${task.title}\n\n**State:** ${task.state}\n**Type:** ${task.type}\n**Module:** ${task.module_uid}\n\n${task.description_md || '_No description_'}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'list_module_tasks',\n {\n description: 'List all tasks for a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface TasksResponse {\n success: boolean\n tasks?: Array<{\n uid: string\n title: string\n state: string\n type: string\n }>\n error?: string\n }\n\n const result = await apiRequest<TasksResponse>('GET', `/api/modules/${args.module_uid}/tasks`)\n\n if (!result.success || !result.tasks) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Failed to fetch tasks'}` }], isError: true }\n }\n\n if (result.tasks.length === 0) {\n return { content: [{ type: 'text', text: 'No tasks found for this module.' }] }\n }\n\n const taskList = result.tasks.map(t => {\n const checkbox = t.state === 'done' ? '[x]' : '[ ]'\n const stateLabel = t.state !== 'backlog' ? ` (${t.state})` : ''\n return `- ${checkbox} **${t.uid}**: ${t.title}${stateLabel}`\n }).join('\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# Tasks for ${args.module_uid}\\n\\n${taskList}`\n }]\n }\n }\n)\n\n// ============================================\n// EP1252: Batch Task Tools\n// ============================================\n\nserver.registerTool(\n 'batch_update_task_state',\n {\n description: `Update the state of multiple tasks at once.\n\nUSE THIS WHEN:\n- Marking multiple tasks as done after completing work\n- Moving several tasks to \"doing\" state\n- Bulk state transitions\n\nEFFICIENCY: Single call instead of multiple update_task_state calls.\nReduces latency from ~1.5s (6 calls) to ~300ms (1 call).`,\n inputSchema: {\n task_uids: z.array(z.string()).describe('Array of task UIDs (e.g., [\"EP1252-1\", \"EP1252-2\"])'),\n state: z.enum(['backlog', 'doing', 'done']).describe('New state for all tasks')\n }\n },\n async (args) => {\n interface TaskLookupResponse {\n success: boolean\n tasks?: Array<{ id: string; uid: string }>\n error?: string\n }\n\n interface BatchUpdateResponse {\n success: boolean\n tasks?: Array<{ id: string; uid: string; state: string }>\n summary?: { updated: number; requested: number }\n error?: { message?: string; details?: string }\n }\n\n try {\n // Step 1: Look up task UUIDs from UIDs\n // We need to query each task to get its UUID since the batch endpoint requires UUIDs\n const lookupPromises = args.task_uids.map(uid =>\n apiRequest<{ success: boolean; task?: { id: string; uid: string } }>('GET', `/api/tasks/${uid}`)\n .then(r => r.success && r.task ? { uid, id: r.task.id } : null)\n .catch(() => null)\n )\n\n const lookupResults = await Promise.all(lookupPromises)\n const validTasks = lookupResults.filter((t): t is { uid: string; id: string } => t !== null)\n const notFoundUids = args.task_uids.filter(uid => !validTasks.find(t => t.uid === uid))\n\n if (validTasks.length === 0) {\n return {\n content: [{\n type: 'text',\n text: `Error: None of the specified tasks were found.\\nNot found: ${args.task_uids.join(', ')}`\n }],\n isError: true\n }\n }\n\n // Step 2: Call batch update endpoint with UUIDs\n const updates = validTasks.map(t => ({\n id: t.id,\n state: args.state\n }))\n\n const result = await apiRequest<BatchUpdateResponse>('PATCH', '/api/tasks/batch', {\n updates\n })\n\n if (!result.success) {\n const errorMsg = result.error?.message || result.error?.details || 'Batch update failed'\n return {\n content: [{\n type: 'text',\n text: `Error: ${errorMsg}`\n }],\n isError: true\n }\n }\n\n // Build response\n const updatedUids = validTasks.map(t => t.uid)\n const failedItems = notFoundUids.map(uid => ({ uid, error: 'Task not found' }))\n\n return {\n content: [{\n type: 'text',\n text: `# Batch Update Results\n\n**Updated:** ${updatedUids.length} tasks → ${args.state}\n${updatedUids.map(uid => `- ✓ ${uid}`).join('\\n')}\n\n${failedItems.length > 0 ? `**Failed:** ${failedItems.length} tasks\\n${failedItems.map(f => `- ✗ ${f.uid}: ${f.error}`).join('\\n')}` : ''}`\n }]\n }\n } catch (error) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n }],\n isError: true\n }\n }\n }\n)\n\nserver.registerTool(\n 'batch_create_tasks',\n {\n description: `Create multiple tasks for a module at once.\n\nUSE THIS WHEN:\n- Setting up tasks for a new module\n- Creating multiple related tasks together\n- Bulk task creation from a plan\n\nEFFICIENCY: Single call instead of multiple create_task calls.`,\n inputSchema: {\n module_uid: z.string().describe('The UID of the parent module (e.g., EP1252)'),\n tasks: z.array(z.object({\n title: z.string().describe('Title of the task'),\n description: z.string().optional().describe('Markdown description'),\n state: z.enum(['backlog', 'doing', 'done']).optional().describe('Initial state (default: backlog)')\n })).describe('Array of tasks to create')\n }\n },\n async (args) => {\n interface BulkCreateResponse {\n success: boolean\n created?: number\n tasks?: Array<{ uid: string; title: string }>\n error?: string\n }\n\n try {\n // Call the bulk create endpoint (accepts module UID directly)\n const result = await apiRequest<BulkCreateResponse>('POST', '/api/tasks/bulk', {\n module_id: args.module_uid,\n tasks: args.tasks.map(t => ({\n title: t.title,\n description_md: t.description,\n state: t.state || 'backlog'\n }))\n })\n\n if (!result.success) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${result.error || 'Bulk create failed'}`\n }],\n isError: true\n }\n }\n\n const createdTasks = result.tasks || []\n\n return {\n content: [{\n type: 'text',\n text: `# Batch Create Results\n\n**Created:** ${result.created || createdTasks.length} tasks for ${args.module_uid}\n\n${createdTasks.map(t => `- ✓ **${t.uid}**: ${t.title}`).join('\\n')}`\n }]\n }\n } catch (error) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n }],\n isError: true\n }\n }\n }\n)\n\nserver.registerTool(\n 'batch_get_tasks',\n {\n description: `Fetch multiple tasks by UID in a single call.\n\nUSE THIS WHEN:\n- Need details for several specific tasks\n- Checking status of multiple tasks at once\n- Gathering context for a set of tasks\n\nEFFICIENCY: Single MCP call instead of multiple get_task_details calls.`,\n inputSchema: {\n task_uids: z.array(z.string()).describe('Array of task UIDs (e.g., [\"EP1252-1\", \"EP1252-2\"])')\n }\n },\n async (args) => {\n interface TaskResponse {\n success: boolean\n task?: {\n uid: string\n title: string\n state: string\n type: string\n description_md: string | null\n }\n }\n\n try {\n type TaskInfo = NonNullable<TaskResponse['task']>\n\n // Fetch all tasks in parallel\n const fetchPromises = args.task_uids.map(uid =>\n apiRequest<TaskResponse>('GET', `/api/tasks/${uid}`)\n .then(r => r.success && r.task ? { found: true as const, task: r.task } : { found: false as const, uid })\n .catch(() => ({ found: false as const, uid }))\n )\n\n const results = await Promise.all(fetchPromises)\n const foundTasks: TaskInfo[] = []\n const notFoundUids: string[] = []\n\n for (const result of results) {\n if (result.found && result.task) {\n foundTasks.push(result.task as TaskInfo)\n } else if (!result.found) {\n notFoundUids.push(result.uid)\n }\n }\n\n if (foundTasks.length === 0) {\n return {\n content: [{\n type: 'text',\n text: `Error: None of the specified tasks were found.\\nNot found: ${args.task_uids.join(', ')}`\n }],\n isError: true\n }\n }\n\n const taskList = foundTasks.map((task) => {\n const checkbox = task.state === 'done' ? '[x]' : '[ ]'\n const stateLabel = task.state !== 'backlog' ? ` (${task.state})` : ''\n return `- ${checkbox} **${task.uid}**: ${task.title}${stateLabel}`\n }).join('\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# Batch Get Results\n\n**Found:** ${foundTasks.length} tasks\n${taskList}\n\n${notFoundUids.length > 0 ? `**Not found:** ${notFoundUids.join(', ')}` : ''}`\n }]\n }\n } catch (error) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n }],\n isError: true\n }\n }\n }\n)\n\n// ============================================\n// Module Management Tools\n// ============================================\n\nserver.registerTool(\n 'create_module',\n {\n description: 'Create a new module in the project',\n inputSchema: {\n title: z.string().describe('Title of the module'),\n description: z.string().optional().describe('Markdown description of the module')\n }\n },\n async (args) => {\n interface CreateModuleResponse {\n success: boolean\n module?: { id: string; uid: string; title: string }\n error?: string\n }\n\n const result = await apiRequest<CreateModuleResponse>('POST', '/api/modules', {\n title: args.title,\n description_md: args.description\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Created module ${result.module?.uid}: ${result.module?.title}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'update_module',\n {\n description: 'Update module details (title, description)',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)'),\n title: z.string().optional().describe('New title for the module'),\n description: z.string().optional().describe('New markdown description')\n }\n },\n async (args) => {\n interface UpdateModuleResponse {\n success: boolean\n module?: { uid: string; title: string }\n error?: string\n }\n\n const updates: Record<string, string> = {}\n if (args.title) updates.title = args.title\n if (args.description) updates.description_md = args.description\n\n const result = await apiRequest<UpdateModuleResponse>('PATCH', `/api/modules/${args.module_uid}`, updates)\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Module ${args.module_uid} updated`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'request_review',\n {\n description: 'Move a module to review state',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface UpdateModuleResponse {\n success: boolean\n module?: { uid: string; state: string }\n error?: string\n }\n\n const result = await apiRequest<UpdateModuleResponse>('PATCH', `/api/modules/${args.module_uid}`, {\n state: 'review'\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Module ${args.module_uid} moved to review`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'mark_done',\n {\n description: 'Move a module to done state',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface UpdateModuleResponse {\n success: boolean\n module?: { uid: string; state: string }\n error?: string\n }\n\n const result = await apiRequest<UpdateModuleResponse>('PATCH', `/api/modules/${args.module_uid}`, {\n state: 'done'\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Module ${args.module_uid} marked as done`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'get_module_details',\n {\n description: 'Get detailed information about a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface ModuleResponse {\n success: boolean\n module?: {\n uid: string\n title: string\n state: string\n description_md: string | null\n branch_name: string | null\n }\n error?: string\n }\n\n const result = await apiRequest<ModuleResponse>('GET', `/api/modules/${args.module_uid}`)\n\n if (!result.success || !result.module) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Module not found'}` }], isError: true }\n }\n\n const mod = result.module\n return {\n content: [{\n type: 'text',\n text: `# ${mod.uid}: ${mod.title}\n\n**State:** ${mod.state}\n**Branch:** ${mod.branch_name || '_Not set_'}\n\n${mod.description_md || '_No description_'}`\n }]\n }\n }\n)\n\n// ============================================\n// Knowledge Tools\n// ============================================\n\nserver.registerTool(\n 'get_knowledge',\n {\n description: 'Fetch a knowledge document by ID',\n inputSchema: {\n knowledge_id: z.string().describe('The ID of the knowledge document')\n }\n },\n async (args) => {\n interface KnowledgeResponse {\n success: boolean\n knowledge?: {\n id: string\n title: string\n doc_type: string\n domain: string\n sections: Array<{ heading?: string; content?: string }>\n }\n error?: string\n }\n\n const result = await apiRequest<KnowledgeResponse>('GET', `/api/knowledge/${args.knowledge_id}`)\n\n if (!result.success || !result.knowledge) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Knowledge not found'}` }], isError: true }\n }\n\n const doc = result.knowledge\n const sections = doc.sections.map(s => {\n const heading = s.heading ? `## ${s.heading}\\n\\n` : ''\n return `${heading}${s.content || ''}`\n }).join('\\n\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# ${doc.title}\n\n**Type:** ${doc.doc_type} | **Domain:** ${doc.domain}\n\n${sections}`\n }]\n }\n }\n)\n\n// EP1242: Three search tools with clear use cases for AI agents\n\nserver.registerTool(\n 'search_knowledge_semantic',\n {\n description: `Search knowledge using vector similarity (semantic/conceptual matching).\n\nUSE THIS WHEN:\n- Looking for documents about a concept: \"authentication patterns\", \"error handling\"\n- Finding related content even if exact words don't match\n- Discovering documentation about a topic\n\nDO NOT USE WHEN:\n- Looking for a specific document by ID/UID (use get_knowledge)\n- Searching for exact title match (use search_knowledge_text)`,\n inputSchema: {\n query: z.string().describe('Natural language query describing what you\\'re looking for'),\n limit: z.number().optional().describe('Maximum results (default: 10)'),\n threshold: z.number().optional().describe('Minimum similarity 0-1 (default: 0.5, lower = more results)')\n }\n },\n async (args) => {\n interface SemanticSearchResponse {\n success: boolean\n results?: Array<{\n id: string\n uid?: string\n title: string\n doc_type: string\n similarity: number\n markdown?: string\n }>\n query_info?: { took_ms: number }\n error?: string\n }\n\n const result = await apiRequest<SemanticSearchResponse>(\n 'POST',\n '/api/search/semantic',\n {\n query: args.query,\n types: ['knowledge'],\n limit: args.limit || 10,\n threshold: args.threshold || 0.5\n }\n )\n\n if (!result.success || !result.results) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Semantic search failed'}` }], isError: true }\n }\n\n if (result.results.length === 0) {\n return { content: [{ type: 'text', text: `No knowledge documents found semantically matching: \"${args.query}\"\\n\\nTry:\\n- Broader search terms\\n- Lower threshold (e.g., 0.3)\\n- Text search for exact matches` }] }\n }\n\n const list = result.results.map(r => {\n const score = Math.round(r.similarity * 100)\n const uid = r.uid ? ` (${r.uid})` : ''\n const snippet = r.markdown ? `\\n ${r.markdown.substring(0, 150)}...` : ''\n return `- **${r.title}**${uid} [${r.doc_type}, ${score}% match]${snippet}`\n }).join('\\n\\n')\n\n const timing = result.query_info ? ` (${result.query_info.took_ms}ms)` : ''\n\n return {\n content: [{\n type: 'text',\n text: `# Semantic Search Results${timing}\\n\\nQuery: \"${args.query}\"\\nFound: ${result.results.length} documents\\n\\n${list}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'search_knowledge_text',\n {\n description: `Search knowledge using text/keyword matching (fast, exact).\n\nUSE THIS WHEN:\n- Looking for documents by UID: \"K123\", \"K45\"\n- Searching for exact title: \"API Authentication Guide\"\n- Finding documents containing specific terms\n\nDO NOT USE WHEN:\n- Looking for conceptually related content (use search_knowledge_semantic)\n- Want to find documents about a topic without knowing exact words`,\n inputSchema: {\n query: z.string().describe('Text to search for (searches title, UID, domain, content)'),\n limit: z.number().optional().describe('Maximum results (default: 20)')\n }\n },\n async (args) => {\n interface TextSearchResponse {\n success: boolean\n results?: Array<{\n id: string\n uid?: string\n title: string\n doc_type?: string\n type: string\n markdown?: string\n }>\n total?: number\n error?: string\n }\n\n const result = await apiRequest<TextSearchResponse>(\n 'POST',\n '/api/search/text',\n {\n query: args.query,\n types: ['knowledge'],\n limit: args.limit || 20\n }\n )\n\n if (!result.success || !result.results) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Text search failed'}` }], isError: true }\n }\n\n if (result.results.length === 0) {\n return { content: [{ type: 'text', text: `No knowledge documents found matching: \"${args.query}\"\\n\\nTry:\\n- Different keywords\\n- Semantic search for conceptual matches` }] }\n }\n\n const list = result.results.map(r => {\n const uid = r.uid ? ` (${r.uid})` : ''\n const docType = r.doc_type ? ` [${r.doc_type}]` : ''\n const snippet = r.markdown ? `\\n ${r.markdown.substring(0, 150)}...` : ''\n return `- **${r.title}**${uid}${docType}${snippet}`\n }).join('\\n\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# Text Search Results\\n\\nQuery: \"${args.query}\"\\nFound: ${result.results.length} of ${result.total || result.results.length} documents\\n\\n${list}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'search_knowledge_hybrid',\n {\n description: `Search knowledge using both semantic AND text matching (best for general queries).\n\nCombines results using Reciprocal Rank Fusion (RRF) algorithm.\nDocuments that match BOTH semantically and textually rank highest.\n\nUSE THIS WHEN:\n- General search where you want comprehensive results\n- Not sure if semantic or text search is better\n- Want the best of both approaches\n\nThis is the recommended default search for most queries.`,\n inputSchema: {\n query: z.string().describe('Search query (will be used for both semantic and text matching)'),\n limit: z.number().optional().describe('Maximum results (default: 10)')\n }\n },\n async (args) => {\n interface SearchResult {\n id: string\n uid?: string\n title: string\n doc_type?: string\n similarity?: number\n markdown?: string\n }\n\n interface SemanticResponse {\n success: boolean\n results?: SearchResult[]\n error?: string\n }\n\n interface TextResponse {\n success: boolean\n results?: SearchResult[]\n error?: string\n }\n\n // Run both searches in parallel\n const [semanticResult, textResult] = await Promise.all([\n apiRequest<SemanticResponse>('POST', '/api/search/semantic', {\n query: args.query,\n types: ['knowledge'],\n limit: 50,\n threshold: 0.4\n }),\n apiRequest<TextResponse>('POST', '/api/search/text', {\n query: args.query,\n types: ['knowledge'],\n limit: 50\n })\n ])\n\n const semanticResults = semanticResult.success ? (semanticResult.results || []) : []\n const textResults = textResult.success ? (textResult.results || []) : []\n\n // Apply Reciprocal Rank Fusion (RRF) with k=60\n const K = 60\n const scores = new Map<string, { score: number; doc: SearchResult; sources: string[] }>()\n\n // Score semantic results\n semanticResults.forEach((doc, index) => {\n const rrfScore = 1 / (K + index + 1)\n scores.set(doc.id, { score: rrfScore, doc, sources: ['semantic'] })\n })\n\n // Score text results and merge\n textResults.forEach((doc, index) => {\n const rrfScore = 1 / (K + index + 1)\n const existing = scores.get(doc.id)\n if (existing) {\n existing.score += rrfScore\n existing.sources.push('text')\n } else {\n scores.set(doc.id, { score: rrfScore, doc, sources: ['text'] })\n }\n })\n\n // Sort by RRF score and limit\n const limit = args.limit || 10\n const ranked = Array.from(scores.values())\n .sort((a, b) => b.score - a.score)\n .slice(0, limit)\n\n if (ranked.length === 0) {\n return { content: [{ type: 'text', text: `No knowledge documents found for: \"${args.query}\"\\n\\nBoth semantic and text search returned no results.` }] }\n }\n\n const list = ranked.map(({ doc, score, sources }) => {\n const uid = doc.uid ? ` (${doc.uid})` : ''\n const docType = doc.doc_type ? ` [${doc.doc_type}]` : ''\n const matchType = sources.length === 2 ? '⭐ both' : sources[0]\n const snippet = doc.markdown ? `\\n ${doc.markdown.substring(0, 150)}...` : ''\n return `- **${doc.title}**${uid}${docType} (${matchType})${snippet}`\n }).join('\\n\\n')\n\n const bothCount = ranked.filter(r => r.sources.length === 2).length\n\n return {\n content: [{\n type: 'text',\n text: `# Hybrid Search Results (RRF)\\n\\nQuery: \"${args.query}\"\\nFound: ${ranked.length} documents (${bothCount} matched both semantic + text)\\n\\n${list}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'search_conversations',\n {\n description: `Search past agent conversations in this project.\n\nThis searches agent conversation history (agent_messages) across sessions you can access.\n\nUSE THIS WHEN:\n- The user references a prior discussion\n- You need to recover context after compaction\n- You want to find when/where something was decided`,\n inputSchema: {\n query: z.string().describe('Semantic search query'),\n limit: z.number().optional().describe('Max results (default: 10)'),\n threshold: z.number().optional().describe('Min similarity 0-1 (default: 0.5)'),\n days_back: z.number().optional().describe('Limit to recent N days (optional)'),\n session_id: z.string().optional().describe('Limit to a specific session UUID (optional)')\n }\n },\n async (args) => {\n interface ConversationSearchResponse {\n success: boolean\n results?: Array<{\n message_id: string\n session_id: string\n role: string\n content_snippet: string\n similarity: number\n created_at: string\n module_uid?: string | null\n module_title?: string | null\n agent_provider?: string\n }>\n total?: number\n error?: string\n }\n\n const result = await apiRequest<ConversationSearchResponse>(\n 'POST',\n '/api/search/conversations',\n {\n query: args.query,\n limit: args.limit || 10,\n threshold: args.threshold || 0.5,\n ...(args.days_back !== undefined ? { days_back: args.days_back } : {}),\n ...(args.session_id ? { session_id: args.session_id } : {})\n }\n )\n\n if (!result.success || !result.results) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Conversation search failed'}` }], isError: true }\n }\n\n if (result.results.length === 0) {\n return { content: [{ type: 'text', text: `No conversation messages found matching: \"${args.query}\"` }] }\n }\n\n const list = result.results.map(r => {\n const score = Math.round((r.similarity || 0) * 100)\n const moduleInfo = r.module_uid ? ` | ${r.module_uid}${r.module_title ? `: ${r.module_title}` : ''}` : ''\n const when = r.created_at ? ` | ${r.created_at}` : ''\n return `- [${r.role}, ${score}%] ${r.content_snippet}${moduleInfo}${when}`\n }).join('\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# Conversation Search Results\\n\\nQuery: \"${args.query}\"\\nFound: ${result.results.length}\\n\\n${list}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'list_linked_knowledge',\n {\n description: 'List knowledge documents linked to a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface LinkedKnowledgeResponse {\n success: boolean\n knowledge?: Array<{\n id: string\n title: string\n doc_type: string\n }>\n error?: string\n }\n\n const result = await apiRequest<LinkedKnowledgeResponse>(\n 'GET',\n `/api/modules/${args.module_uid}/knowledge`\n )\n\n if (!result.success || !result.knowledge) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Failed to fetch knowledge'}` }], isError: true }\n }\n\n if (result.knowledge.length === 0) {\n return { content: [{ type: 'text', text: 'No knowledge documents linked to this module.' }] }\n }\n\n const list = result.knowledge.map(k => `- **${k.title}** (${k.doc_type})`).join('\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# Linked Knowledge for ${args.module_uid}\\n\\n${list}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'link_knowledge',\n {\n description: 'Link a knowledge document to a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)'),\n knowledge_id: z.string().describe('The ID of the knowledge document to link')\n }\n },\n async (args) => {\n interface LinkResponse {\n success: boolean\n error?: string\n }\n\n const result = await apiRequest<LinkResponse>(\n 'POST',\n `/api/modules/${args.module_uid}/knowledge/link`,\n { knowledge_id: args.knowledge_id }\n )\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Knowledge document linked to module ${args.module_uid}`\n }]\n }\n }\n)\n\n// ============================================\n// Context Tools\n// ============================================\n\nserver.registerTool(\n 'get_module_context',\n {\n description: 'Get the full context for a module (title, tasks, linked knowledge)',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface ContextResponse {\n success: boolean\n context?: string\n error?: string\n }\n\n // Use the agent-accessible module context API\n const result = await apiRequest<ContextResponse>(\n 'GET',\n `/api/agent/context/module/${args.module_uid}`\n )\n\n if (!result.success || !result.context) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Failed to fetch context'}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: result.context\n }]\n }\n }\n)\n\nserver.registerTool(\n 'get_project_context',\n {\n description: 'Get the project-wide context (C2 bundle with active work, priorities)',\n inputSchema: {}\n },\n async () => {\n interface ContextResponse {\n success: boolean\n prompt?: string\n error?: string\n }\n\n // Use the agent-accessible system prompt API\n const result = await apiRequest<ContextResponse>(\n 'GET',\n '/api/agent/context/system'\n )\n\n if (!result.success || !result.prompt) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Failed to fetch context'}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: result.prompt\n }]\n }\n }\n)\n\n// ============================================\n// Start Server\n// ============================================\n\nasync function main() {\n const runtimeConfig = await hydrateRuntimeConfig()\n EPISODA_API_URL = runtimeConfig.apiUrl\n EPISODA_SESSION_TOKEN = runtimeConfig.sessionToken\n EPISODA_PROJECT_ID = runtimeConfig.projectId\n EPISODA_WORKSPACE_ID = runtimeConfig.workspaceId\n\n const transport = new StdioServerTransport()\n await server.connect(transport)\n\n // Log to stderr so it doesn't interfere with MCP protocol\n console.error('[episoda-workflow] MCP server started')\n console.error(`[episoda-workflow] API URL: ${EPISODA_API_URL}`)\n console.error(`[episoda-workflow] Token: ${EPISODA_SESSION_TOKEN ? '****' : 'NOT SET'}`)\n}\n\nmain().catch((error) => {\n console.error('[episoda-workflow] Fatal error:', error)\n process.exit(1)\n})\n","/**\n * EP908: Episoda Git MCP Server\n *\n * MCP server for Claude Code agents to perform git operations on dev environments.\n * Provides tools for:\n * - Repository status and info (status, log, diff, branch)\n * - Staging and commits (add, commit, reset)\n * - Remote operations (push, pull, fetch)\n * - Branch management (checkout, create, delete, merge)\n *\n * Usage:\n * npx -y @episoda/mcp git\n *\n * Required environment variables:\n * EPISODA_API_URL - Base URL for Episoda API (e.g., https://episoda.dev)\n * EPISODA_SESSION_TOKEN - Bearer token for API authentication\n *\n * Optional environment variables:\n * MODULE_UID - Module UID (preferred, e.g., EP123) or provide moduleUid per tool call\n * DEV_ENVIRONMENT_ID - UUID of the dev environment (legacy fallback)\n * EPISODA_PROJECT_ID - Project ID (for scoped requests)\n * EPISODA_WORKSPACE_ID - Workspace ID (for scoped requests)\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { z } from 'zod'\nimport { hydrateRuntimeConfig } from './runtime-config.js'\n\n// Environment configuration\nlet EPISODA_API_URL = process.env.EPISODA_API_URL || 'https://episoda.dev'\nlet EPISODA_SESSION_TOKEN = process.env.EPISODA_SESSION_TOKEN || ''\nconst DEV_ENVIRONMENT_ID = process.env.DEV_ENVIRONMENT_ID || ''\nconst MODULE_UID = process.env.MODULE_UID || ''\nlet EPISODA_PROJECT_ID = process.env.EPISODA_PROJECT_ID || ''\nlet EPISODA_WORKSPACE_ID = process.env.EPISODA_WORKSPACE_ID || ''\n\nconst targetSchema = {\n moduleUid: z.string().optional().describe('Module UID to target (overrides server default)')\n}\n\ninterface ExecResponse {\n success: boolean\n data?: {\n stdout: string\n stderr: string\n exitCode: number\n timedOut?: boolean\n }\n error?: string\n}\n\n/**\n * Execute a command on the dev environment via unified API\n */\nasync function execCommand(\n command: string,\n options: { cwd?: string; timeout?: number; moduleUid?: string } = {}\n): Promise<ExecResponse> {\n const { cwd, timeout = 30000, moduleUid } = options\n\n const target = moduleUid || MODULE_UID || DEV_ENVIRONMENT_ID\n if (!target) {\n return {\n success: false,\n error: 'Module target missing. Provide moduleUid in the tool call or set MODULE_UID/DEV_ENVIRONMENT_ID.'\n }\n }\n const url = `${EPISODA_API_URL}/api/dev/${target}/exec`\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${EPISODA_SESSION_TOKEN}`\n }\n if (EPISODA_PROJECT_ID) {\n headers['x-project-id'] = EPISODA_PROJECT_ID\n }\n if (EPISODA_WORKSPACE_ID) {\n headers['x-workspace-id'] = EPISODA_WORKSPACE_ID\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ command, cwd, timeout })\n })\n\n if (!response.ok) {\n const text = await response.text()\n return { success: false, error: `API error ${response.status}: ${text}` }\n }\n\n const result = await response.json()\n return result\n}\n\n/**\n * Helper to format git command output for MCP response\n */\nfunction formatGitOutput(result: ExecResponse, errorPrefix: string = 'Git error'): {\n content: Array<{ type: 'text'; text: string }>\n isError?: boolean\n} {\n if (!result.success || !result.data) {\n return {\n content: [{ type: 'text', text: `${errorPrefix}: ${result.error || 'Unknown error'}` }],\n isError: true\n }\n }\n\n const { stdout, stderr, exitCode } = result.data\n\n if (exitCode !== 0) {\n const errorOutput = stderr || stdout || 'Command failed'\n return {\n content: [{ type: 'text', text: `${errorPrefix} (exit ${exitCode}):\\n${errorOutput}` }],\n isError: true\n }\n }\n\n return {\n content: [{ type: 'text', text: stdout || '(no output)' }]\n }\n}\n\n// Create MCP server\nconst server = new McpServer({\n name: 'episoda-git',\n version: '1.0.0'\n}, {\n capabilities: {\n tools: {}\n },\n instructions: `\n Episoda Git MCP Server\n\n This server provides git operations for dev environments (cloud VMs or local machines).\n All commands are executed in the context of the configured dev environment.\n You may pass moduleUid per call to target a specific module.\n\n Categories:\n - Status & Info: git_status, git_log, git_diff, git_show, git_branch_list\n - Staging: git_add, git_reset\n - Commits: git_commit\n - Remote: git_push, git_pull, git_fetch\n - Branches: git_checkout, git_branch_create, git_branch_delete, git_merge\n - Stash: git_stash, git_stash_pop, git_stash_list\n - Worktrees (EP944): git_worktree_list, git_worktree_add, git_worktree_remove, git_worktree_prune\n\n Worktrees allow multiple working directories to share a single repository,\n enabling parallel development on multiple branches/modules simultaneously.\n `\n})\n\n// ============================================\n// Status & Info Tools\n// ============================================\n\nserver.registerTool(\n 'git_status',\n {\n description: 'Show the working tree status (staged, unstaged, untracked files)',\n inputSchema: {\n ...targetSchema,\n cwd: z.string().optional().describe('Working directory path (defaults to repo root)')\n }\n },\n async (args) => {\n const result = await execCommand('git status', { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to get git status')\n }\n)\n\nserver.registerTool(\n 'git_log',\n {\n description: 'Show commit logs',\n inputSchema: {\n ...targetSchema,\n count: z.number().optional().describe('Number of commits to show (default: 10)'),\n oneline: z.boolean().optional().describe('Use one-line format (default: true)'),\n branch: z.string().optional().describe('Branch name (default: current branch)'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n const count = args.count || 10\n const format = args.oneline !== false ? '--oneline' : '--format=medium'\n const branch = args.branch || ''\n\n const result = await execCommand(\n `git log ${format} -n ${count} ${branch}`.trim(),\n { cwd: args.cwd, moduleUid: args.moduleUid }\n )\n return formatGitOutput(result, 'Failed to get git log')\n }\n)\n\nserver.registerTool(\n 'git_diff',\n {\n description: 'Show changes between commits, commit and working tree, etc.',\n inputSchema: {\n ...targetSchema,\n staged: z.boolean().optional().describe('Show staged changes (--cached)'),\n file: z.string().optional().describe('Specific file to diff'),\n commit: z.string().optional().describe('Compare against specific commit'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = 'git diff'\n if (args.staged) cmd += ' --cached'\n if (args.commit) cmd += ` ${args.commit}`\n if (args.file) cmd += ` -- ${args.file}`\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to get diff')\n }\n)\n\nserver.registerTool(\n 'git_show',\n {\n description: 'Show details of a specific commit',\n inputSchema: {\n ...targetSchema,\n commit: z.string().describe('Commit hash or reference (e.g., HEAD, abc123)'),\n stat: z.boolean().optional().describe('Show diffstat only'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = `git show ${args.commit}`\n if (args.stat) cmd += ' --stat'\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to show commit')\n }\n)\n\nserver.registerTool(\n 'git_branch_list',\n {\n description: 'List branches',\n inputSchema: {\n ...targetSchema,\n all: z.boolean().optional().describe('Show all branches including remotes'),\n remote: z.boolean().optional().describe('Show only remote branches'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = 'git branch'\n if (args.all) cmd += ' -a'\n else if (args.remote) cmd += ' -r'\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to list branches')\n }\n)\n\n// ============================================\n// Staging Tools\n// ============================================\n\nserver.registerTool(\n 'git_add',\n {\n description: 'Add file contents to the staging area',\n inputSchema: {\n ...targetSchema,\n files: z.array(z.string()).describe('Files to add (use [\".\"] for all)'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n const files = args.files.map(f => `\"${f}\"`).join(' ')\n const result = await execCommand(`git add ${files}`, { cwd: args.cwd, moduleUid: args.moduleUid })\n\n if (!result.success || (result.data && result.data.exitCode !== 0)) {\n return formatGitOutput(result, 'Failed to add files')\n }\n\n return {\n content: [{ type: 'text', text: `Added ${args.files.length} file(s) to staging area` }]\n }\n }\n)\n\nserver.registerTool(\n 'git_reset',\n {\n description: 'Unstage files or reset to a commit',\n inputSchema: {\n ...targetSchema,\n files: z.array(z.string()).optional().describe('Files to unstage'),\n hard: z.boolean().optional().describe('Hard reset (WARNING: discards changes)'),\n commit: z.string().optional().describe('Commit to reset to'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = 'git reset'\n if (args.hard) cmd += ' --hard'\n if (args.commit) cmd += ` ${args.commit}`\n if (args.files && args.files.length > 0) {\n cmd += ' -- ' + args.files.map(f => `\"${f}\"`).join(' ')\n }\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to reset')\n }\n)\n\n// ============================================\n// Commit Tools\n// ============================================\n\nserver.registerTool(\n 'git_commit',\n {\n description: 'Record changes to the repository',\n inputSchema: {\n ...targetSchema,\n message: z.string().describe('Commit message'),\n all: z.boolean().optional().describe('Stage all modified files before commit (-a)'),\n amend: z.boolean().optional().describe('Amend the previous commit'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n // Escape message for shell\n const escapedMessage = args.message.replace(/'/g, \"'\\\\''\")\n\n let cmd = `git commit -m '${escapedMessage}'`\n if (args.all) cmd = cmd.replace('git commit', 'git commit -a')\n if (args.amend) cmd += ' --amend'\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to commit')\n }\n)\n\n// ============================================\n// Remote Tools\n// ============================================\n\nserver.registerTool(\n 'git_push',\n {\n description: 'Push commits to remote repository',\n inputSchema: {\n ...targetSchema,\n remote: z.string().optional().describe('Remote name (default: origin)'),\n branch: z.string().optional().describe('Branch name'),\n force: z.boolean().optional().describe('Force push (use with caution!)'),\n setUpstream: z.boolean().optional().describe('Set upstream tracking (-u)'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = 'git push'\n if (args.setUpstream) cmd += ' -u'\n if (args.force) cmd += ' --force-with-lease' // Safer than --force\n if (args.remote) cmd += ` ${args.remote}`\n if (args.branch) cmd += ` ${args.branch}`\n\n const result = await execCommand(cmd, { cwd: args.cwd, timeout: 60000, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to push')\n }\n)\n\nserver.registerTool(\n 'git_pull',\n {\n description: 'Fetch and integrate changes from remote',\n inputSchema: {\n ...targetSchema,\n remote: z.string().optional().describe('Remote name (default: origin)'),\n branch: z.string().optional().describe('Branch name'),\n rebase: z.boolean().optional().describe('Rebase instead of merge'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = 'git pull'\n if (args.rebase) cmd += ' --rebase'\n if (args.remote) cmd += ` ${args.remote}`\n if (args.branch) cmd += ` ${args.branch}`\n\n const result = await execCommand(cmd, { cwd: args.cwd, timeout: 60000, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to pull')\n }\n)\n\nserver.registerTool(\n 'git_fetch',\n {\n description: 'Download objects and refs from remote',\n inputSchema: {\n ...targetSchema,\n remote: z.string().optional().describe('Remote name (default: all remotes)'),\n prune: z.boolean().optional().describe('Remove deleted remote branches'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = 'git fetch'\n if (args.prune) cmd += ' --prune'\n if (args.remote) cmd += ` ${args.remote}`\n else cmd += ' --all'\n\n const result = await execCommand(cmd, { cwd: args.cwd, timeout: 60000, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to fetch')\n }\n)\n\n// ============================================\n// Branch Management Tools\n// ============================================\n\nserver.registerTool(\n 'git_checkout',\n {\n description: 'Switch branches or restore working tree files',\n inputSchema: {\n ...targetSchema,\n target: z.string().describe('Branch name, commit, or file path'),\n create: z.boolean().optional().describe('Create new branch (-b)'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = 'git checkout'\n if (args.create) cmd += ' -b'\n cmd += ` ${args.target}`\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to checkout')\n }\n)\n\nserver.registerTool(\n 'git_branch_create',\n {\n description: 'Create a new branch',\n inputSchema: {\n ...targetSchema,\n name: z.string().describe('Name for the new branch'),\n startPoint: z.string().optional().describe('Starting commit/branch'),\n checkout: z.boolean().optional().describe('Switch to new branch after creation'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd: string\n if (args.checkout) {\n cmd = `git checkout -b ${args.name}`\n } else {\n cmd = `git branch ${args.name}`\n }\n if (args.startPoint) cmd += ` ${args.startPoint}`\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n\n if (!result.success || (result.data && result.data.exitCode !== 0)) {\n return formatGitOutput(result, 'Failed to create branch')\n }\n\n return {\n content: [{\n type: 'text',\n text: `Created branch '${args.name}'${args.checkout ? ' and switched to it' : ''}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'git_branch_delete',\n {\n description: 'Delete a branch',\n inputSchema: {\n ...targetSchema,\n name: z.string().describe('Branch name to delete'),\n force: z.boolean().optional().describe('Force delete unmerged branch (-D)'),\n remote: z.boolean().optional().describe('Delete remote branch'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd: string\n if (args.remote) {\n cmd = `git push origin --delete ${args.name}`\n } else {\n cmd = `git branch ${args.force ? '-D' : '-d'} ${args.name}`\n }\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to delete branch')\n }\n)\n\nserver.registerTool(\n 'git_merge',\n {\n description: 'Join two or more development histories together',\n inputSchema: {\n ...targetSchema,\n branch: z.string().describe('Branch to merge into current branch'),\n noFf: z.boolean().optional().describe('Create merge commit even for fast-forward'),\n squash: z.boolean().optional().describe('Squash commits into single commit'),\n message: z.string().optional().describe('Merge commit message'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = `git merge ${args.branch}`\n if (args.noFf) cmd += ' --no-ff'\n if (args.squash) cmd += ' --squash'\n if (args.message) {\n const escapedMessage = args.message.replace(/'/g, \"'\\\\''\")\n cmd += ` -m '${escapedMessage}'`\n }\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to merge')\n }\n)\n\n// ============================================\n// Stash Tools\n// ============================================\n\nserver.registerTool(\n 'git_stash',\n {\n description: 'Stash changes in working directory',\n inputSchema: {\n ...targetSchema,\n message: z.string().optional().describe('Description for the stash'),\n includeUntracked: z.boolean().optional().describe('Include untracked files'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n let cmd = 'git stash push'\n if (args.includeUntracked) cmd += ' --include-untracked'\n if (args.message) {\n const escapedMessage = args.message.replace(/'/g, \"'\\\\''\")\n cmd += ` -m '${escapedMessage}'`\n }\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to stash')\n }\n)\n\nserver.registerTool(\n 'git_stash_pop',\n {\n description: 'Apply and remove a stash',\n inputSchema: {\n ...targetSchema,\n index: z.number().optional().describe('Stash index (default: 0, most recent)'),\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n const stashRef = args.index !== undefined ? `stash@{${args.index}}` : ''\n const result = await execCommand(`git stash pop ${stashRef}`.trim(), { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to pop stash')\n }\n)\n\nserver.registerTool(\n 'git_stash_list',\n {\n description: 'List stashed changes',\n inputSchema: {\n ...targetSchema,\n cwd: z.string().optional().describe('Working directory path')\n }\n },\n async (args) => {\n const result = await execCommand('git stash list', { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to list stashes')\n }\n)\n\n// ============================================\n// EP944: Worktree Tools\n// ============================================\n\nserver.registerTool(\n 'git_worktree_list',\n {\n description: 'List all worktrees in the repository. Worktrees allow multiple working directories to share a single repository.',\n inputSchema: {\n ...targetSchema,\n cwd: z.string().optional().describe('Working directory path (must be inside a git repo)')\n }\n },\n async (args) => {\n const result = await execCommand('git worktree list', { cwd: args.cwd, moduleUid: args.moduleUid })\n return formatGitOutput(result, 'Failed to list worktrees')\n }\n)\n\nserver.registerTool(\n 'git_worktree_add',\n {\n description: 'Create a new worktree at the specified path for the given branch. This allows working on multiple branches simultaneously.',\n inputSchema: {\n ...targetSchema,\n path: z.string().describe('Path where the new worktree will be created'),\n branch: z.string().describe('Branch to checkout in the new worktree'),\n create: z.boolean().optional().describe('Create a new branch if it does not exist (-b)'),\n cwd: z.string().optional().describe('Working directory path (must be inside a git repo)')\n }\n },\n async (args) => {\n let cmd = 'git worktree add'\n if (args.create) {\n cmd += ` -b ${args.branch} \"${args.path}\"`\n } else {\n cmd += ` \"${args.path}\" ${args.branch}`\n }\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n\n if (!result.success || (result.data && result.data.exitCode !== 0)) {\n return formatGitOutput(result, 'Failed to create worktree')\n }\n\n return {\n content: [{\n type: 'text',\n text: `Created worktree at '${args.path}' for branch '${args.branch}'`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'git_worktree_remove',\n {\n description: 'Remove a worktree. The branch is preserved in the repository - only the working directory is removed.',\n inputSchema: {\n ...targetSchema,\n path: z.string().describe('Path of the worktree to remove'),\n force: z.boolean().optional().describe('Force removal even with uncommitted changes'),\n cwd: z.string().optional().describe('Working directory path (must be inside a git repo)')\n }\n },\n async (args) => {\n let cmd = `git worktree remove \"${args.path}\"`\n if (args.force) cmd += ' --force'\n\n const result = await execCommand(cmd, { cwd: args.cwd, moduleUid: args.moduleUid })\n\n if (!result.success || (result.data && result.data.exitCode !== 0)) {\n return formatGitOutput(result, 'Failed to remove worktree')\n }\n\n return {\n content: [{\n type: 'text',\n text: `Removed worktree at '${args.path}'`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'git_worktree_prune',\n {\n description: 'Clean up stale worktree administrative files. Run this if worktrees were manually deleted.',\n inputSchema: {\n ...targetSchema,\n cwd: z.string().optional().describe('Working directory path (must be inside a git repo)')\n }\n },\n async (args) => {\n const result = await execCommand('git worktree prune', { cwd: args.cwd, moduleUid: args.moduleUid })\n\n if (!result.success || (result.data && result.data.exitCode !== 0)) {\n return formatGitOutput(result, 'Failed to prune worktrees')\n }\n\n return {\n content: [{\n type: 'text',\n text: 'Pruned stale worktree entries'\n }]\n }\n }\n)\n\n// ============================================\n// Start Server\n// ============================================\n\nasync function main() {\n const runtimeConfig = await hydrateRuntimeConfig()\n EPISODA_API_URL = runtimeConfig.apiUrl\n EPISODA_SESSION_TOKEN = runtimeConfig.sessionToken\n EPISODA_PROJECT_ID = runtimeConfig.projectId\n EPISODA_WORKSPACE_ID = runtimeConfig.workspaceId\n\n if (!MODULE_UID && !DEV_ENVIRONMENT_ID) {\n console.warn('[episoda-git] Warning: MODULE_UID/DEV_ENVIRONMENT_ID not set. Provide moduleUid per tool call.')\n }\n\n const transport = new StdioServerTransport()\n await server.connect(transport)\n\n const devTarget = MODULE_UID || DEV_ENVIRONMENT_ID || 'NOT SET'\n console.error('[episoda-git] MCP server started')\n console.error(`[episoda-git] API URL: ${EPISODA_API_URL}`)\n console.error(`[episoda-git] Dev Target: ${devTarget}`)\n console.error(`[episoda-git] Token: ${EPISODA_SESSION_TOKEN ? '****' : 'NOT SET'}`)\n}\n\nmain().catch((error) => {\n console.error('[episoda-git] Fatal error:', error)\n process.exit(1)\n})\n","/**\n * EP908: Episoda Dev MCP Server\n *\n * MCP server for Claude Code agents to perform file and environment operations\n * on dev environments (cloud VMs or local machines).\n *\n * Provides tools for:\n * - File operations (read, write, edit, delete, mkdir)\n * - Directory operations (list, search)\n * - Code search (grep)\n * - Command execution\n * - Batch operations\n *\n * Usage:\n * npx -y @episoda/mcp dev\n *\n * Required environment variables:\n * EPISODA_API_URL - Base URL for Episoda API (e.g., https://episoda.dev)\n * EPISODA_SESSION_TOKEN - Bearer token for API authentication\n *\n * Optional environment variables:\n * MODULE_UID - Module UID (preferred, e.g., EP123) or provide moduleUid per tool call\n * DEV_ENVIRONMENT_ID - UUID of the dev environment (legacy fallback)\n * EPISODA_PROJECT_ID - Project ID (for scoped requests)\n * EPISODA_WORKSPACE_ID - Workspace ID (for scoped requests)\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { z } from 'zod'\nimport { hydrateRuntimeConfig } from './runtime-config.js'\n\n// Environment configuration\nlet EPISODA_API_URL = process.env.EPISODA_API_URL || 'https://episoda.dev'\nlet EPISODA_SESSION_TOKEN = process.env.EPISODA_SESSION_TOKEN || ''\nconst DEV_ENVIRONMENT_ID = process.env.DEV_ENVIRONMENT_ID || ''\nconst MODULE_UID = process.env.MODULE_UID || ''\nlet EPISODA_PROJECT_ID = process.env.EPISODA_PROJECT_ID || ''\nlet EPISODA_WORKSPACE_ID = process.env.EPISODA_WORKSPACE_ID || ''\n\nconst targetSchema = {\n moduleUid: z.string().optional().describe('Module UID to target (overrides server default)')\n}\n\n/**\n * Make an authenticated API request\n */\nasync function apiRequest<T>(\n method: 'GET' | 'POST' | 'DELETE',\n path: string,\n body?: Record<string, unknown>\n): Promise<T> {\n const url = `${EPISODA_API_URL}${path}`\n const options: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${EPISODA_SESSION_TOKEN}`\n }\n }\n\n if (EPISODA_PROJECT_ID) {\n (options.headers as Record<string, string>)['x-project-id'] = EPISODA_PROJECT_ID\n }\n if (EPISODA_WORKSPACE_ID) {\n (options.headers as Record<string, string>)['x-workspace-id'] = EPISODA_WORKSPACE_ID\n }\n\n if (body && method !== 'GET') {\n options.body = JSON.stringify(body)\n }\n\n const response = await fetch(url, options)\n\n if (!response.ok) {\n const text = await response.text()\n throw new Error(`API error ${response.status}: ${text}`)\n }\n\n return response.json() as Promise<T>\n}\n\n/**\n * Helper to build API path with dev environment ID\n */\nfunction devPath(endpoint: string, overrideTarget?: string): string {\n const target = overrideTarget || MODULE_UID || DEV_ENVIRONMENT_ID\n if (!target) {\n throw new Error('Module target missing. Provide moduleUid in the tool call or set MODULE_UID/DEV_ENVIRONMENT_ID.')\n }\n return `/api/dev/${target}${endpoint}`\n}\n\n// Create MCP server\nconst server = new McpServer({\n name: 'episoda-dev',\n version: '1.0.0'\n}, {\n capabilities: {\n tools: {}\n },\n instructions: `\n Episoda Dev MCP Server\n\n This server provides file and environment operations for dev environments\n (cloud VMs or local machines). All operations execute in the context of\n the configured dev environment.\n You may pass moduleUid per call to target a specific module.\n\n Categories:\n - File Operations: read_file, write_file, edit_file, delete_file\n - Directory Operations: list_directory, mkdir, search_files\n - Code Search: grep\n - Execution: exec_command\n - Batch: batch_operations\n\n All paths should be absolute paths within the dev environment.\n `\n})\n\n// ============================================\n// File Operations\n// ============================================\n\nserver.registerTool(\n 'read_file',\n {\n description: 'Read contents of a file',\n inputSchema: {\n ...targetSchema,\n path: z.string().describe('Absolute path to the file'),\n encoding: z.enum(['utf8', 'base64']).optional().describe('File encoding (default: utf8)')\n }\n },\n async (args) => {\n interface ReadResponse {\n success: boolean\n data?: { content: string }\n error?: string\n }\n\n try {\n const result = await apiRequest<ReadResponse>(\n 'POST',\n devPath('/read-file', args.moduleUid),\n {\n path: args.path,\n encoding: args.encoding || 'utf8'\n }\n )\n\n if (!result.success || !result.data) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Failed to read file'}` }],\n isError: true\n }\n }\n\n return {\n content: [{ type: 'text', text: result.data.content }]\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error reading file: ${error}` }],\n isError: true\n }\n }\n }\n)\n\nserver.registerTool(\n 'write_file',\n {\n description: 'Write content to a file (creates or overwrites)',\n inputSchema: {\n ...targetSchema,\n path: z.string().describe('Absolute path to the file'),\n content: z.string().describe('Content to write'),\n encoding: z.enum(['utf8', 'base64']).optional().describe('Content encoding (default: utf8)'),\n createDirs: z.boolean().optional().describe('Create parent directories if missing (default: true)')\n }\n },\n async (args) => {\n interface WriteResponse {\n success: boolean\n data?: { size: number }\n error?: string\n }\n\n try {\n const result = await apiRequest<WriteResponse>(\n 'POST',\n devPath('/write-file', args.moduleUid),\n {\n path: args.path,\n content: args.content,\n encoding: args.encoding || 'utf8',\n createDirs: args.createDirs !== false\n }\n )\n\n if (!result.success) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Failed to write file'}` }],\n isError: true\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Wrote ${result.data?.size || 0} bytes to ${args.path}`\n }]\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error writing file: ${error}` }],\n isError: true\n }\n }\n }\n)\n\nserver.registerTool(\n 'edit_file',\n {\n description: 'Edit a file by replacing a specific string with another',\n inputSchema: {\n ...targetSchema,\n path: z.string().describe('Absolute path to the file'),\n old_string: z.string().describe('The exact string to find and replace'),\n new_string: z.string().describe('The replacement string'),\n replace_all: z.boolean().optional().describe('Replace all occurrences (default: false, replaces first only)')\n }\n },\n async (args) => {\n interface EditResponse {\n success: boolean\n data?: { replacements: number; newSize: number }\n error?: string\n }\n\n try {\n const result = await apiRequest<EditResponse>(\n 'POST',\n devPath('/edit-file', args.moduleUid),\n {\n path: args.path,\n old_string: args.old_string,\n new_string: args.new_string,\n replace_all: args.replace_all || false\n }\n )\n\n if (!result.success) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Failed to edit file'}` }],\n isError: true\n }\n }\n\n const replacements = result.data?.replacements || 0\n if (replacements === 0) {\n return {\n content: [{ type: 'text', text: 'Warning: No replacements made (string not found)' }]\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Made ${replacements} replacement(s) in ${args.path}`\n }]\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error editing file: ${error}` }],\n isError: true\n }\n }\n }\n)\n\nserver.registerTool(\n 'delete_file',\n {\n description: 'Delete a file or directory',\n inputSchema: {\n ...targetSchema,\n path: z.string().describe('Absolute path to delete'),\n recursive: z.boolean().optional().describe('Delete directories recursively (default: false)')\n }\n },\n async (args) => {\n interface DeleteResponse {\n success: boolean\n error?: string\n }\n\n try {\n const result = await apiRequest<DeleteResponse>(\n 'DELETE',\n `${devPath('/delete-file', args.moduleUid)}?path=${encodeURIComponent(args.path)}&recursive=${args.recursive || false}`\n )\n\n if (!result.success) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Failed to delete'}` }],\n isError: true\n }\n }\n\n return {\n content: [{ type: 'text', text: `Deleted ${args.path}` }]\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error deleting: ${error}` }],\n isError: true\n }\n }\n }\n)\n\n// ============================================\n// Directory Operations\n// ============================================\n\nserver.registerTool(\n 'list_directory',\n {\n description: 'List contents of a directory',\n inputSchema: {\n ...targetSchema,\n path: z.string().describe('Absolute path to directory'),\n recursive: z.boolean().optional().describe('List recursively (default: false)'),\n includeHidden: z.boolean().optional().describe('Include hidden files (default: false)')\n }\n },\n async (args) => {\n interface ListResponse {\n success: boolean\n data?: {\n entries: Array<{\n name: string\n type: 'file' | 'directory'\n size: number\n }>\n }\n error?: string\n }\n\n try {\n const result = await apiRequest<ListResponse>(\n 'POST',\n devPath('/list-dir', args.moduleUid),\n {\n path: args.path,\n recursive: args.recursive || false,\n includeHidden: args.includeHidden || false\n }\n )\n\n if (!result.success || !result.data) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Failed to list directory'}` }],\n isError: true\n }\n }\n\n if (result.data.entries.length === 0) {\n return {\n content: [{ type: 'text', text: `Directory ${args.path} is empty` }]\n }\n }\n\n const listing = result.data.entries.map(e => {\n const icon = e.type === 'directory' ? '/' : ''\n const size = e.type === 'file' ? ` (${formatSize(e.size)})` : ''\n return `${e.name}${icon}${size}`\n }).join('\\n')\n\n return {\n content: [{ type: 'text', text: listing }]\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error listing directory: ${error}` }],\n isError: true\n }\n }\n }\n)\n\nserver.registerTool(\n 'mkdir',\n {\n description: 'Create a directory (including parent directories)',\n inputSchema: {\n ...targetSchema,\n path: z.string().describe('Absolute path of directory to create')\n }\n },\n async (args) => {\n interface MkdirResponse {\n success: boolean\n error?: string\n }\n\n try {\n const result = await apiRequest<MkdirResponse>(\n 'POST',\n devPath('/mkdir', args.moduleUid),\n { path: args.path }\n )\n\n if (!result.success) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Failed to create directory'}` }],\n isError: true\n }\n }\n\n return {\n content: [{ type: 'text', text: `Created directory ${args.path}` }]\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error creating directory: ${error}` }],\n isError: true\n }\n }\n }\n)\n\nserver.registerTool(\n 'search_files',\n {\n description: 'Search for files by glob pattern',\n inputSchema: {\n ...targetSchema,\n pattern: z.string().describe('Glob pattern (e.g., \"*.ts\", \"**/*.tsx\")'),\n basePath: z.string().describe('Base directory to search from'),\n maxResults: z.number().optional().describe('Maximum results (default: 100)')\n }\n },\n async (args) => {\n interface SearchResponse {\n success: boolean\n data?: { files: string[] }\n error?: string\n }\n\n try {\n const result = await apiRequest<SearchResponse>(\n 'POST',\n devPath('/search-files', args.moduleUid),\n {\n pattern: args.pattern,\n basePath: args.basePath,\n maxResults: args.maxResults || 100\n }\n )\n\n if (!result.success || !result.data) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Failed to search'}` }],\n isError: true\n }\n }\n\n if (result.data.files.length === 0) {\n return {\n content: [{ type: 'text', text: `No files matching \"${args.pattern}\" found` }]\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Found ${result.data.files.length} file(s):\\n${result.data.files.join('\\n')}`\n }]\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error searching: ${error}` }],\n isError: true\n }\n }\n }\n)\n\n// ============================================\n// Code Search\n// ============================================\n\nserver.registerTool(\n 'grep',\n {\n description: 'Search for pattern in file contents',\n inputSchema: {\n ...targetSchema,\n pattern: z.string().describe('Search pattern (regex supported)'),\n path: z.string().describe('File or directory to search'),\n filePattern: z.string().optional().describe('Filter by file pattern (e.g., \"*.ts\")'),\n caseSensitive: z.boolean().optional().describe('Case sensitive search (default: true)'),\n maxResults: z.number().optional().describe('Maximum results (default: 100)')\n }\n },\n async (args) => {\n interface GrepResponse {\n success: boolean\n data?: {\n matches: Array<{\n file: string\n line: number\n content: string\n }>\n }\n error?: string\n }\n\n try {\n const flags = args.caseSensitive === false ? '-rni' : '-rn'\n const result = await apiRequest<GrepResponse>(\n 'POST',\n devPath('/grep', args.moduleUid),\n {\n pattern: args.pattern,\n path: args.path,\n flags\n }\n )\n\n if (!result.success || !result.data) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Failed to search'}` }],\n isError: true\n }\n }\n\n if (result.data.matches.length === 0) {\n return {\n content: [{ type: 'text', text: `No matches found for \"${args.pattern}\"` }]\n }\n }\n\n const matches = result.data.matches.map(m =>\n `${m.file}:${m.line}: ${m.content}`\n ).join('\\n')\n\n return {\n content: [{\n type: 'text',\n text: `Found ${result.data.matches.length} match(es):\\n${matches}`\n }]\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error searching: ${error}` }],\n isError: true\n }\n }\n }\n)\n\n// ============================================\n// Command Execution\n// ============================================\n\nserver.registerTool(\n 'exec_command',\n {\n description: 'Execute a shell command',\n inputSchema: {\n ...targetSchema,\n command: z.string().describe('Command to execute'),\n cwd: z.string().optional().describe('Working directory'),\n timeout: z.number().optional().describe('Timeout in milliseconds (default: 30000)')\n }\n },\n async (args) => {\n interface ExecResponse {\n success: boolean\n data?: {\n stdout: string\n stderr: string\n exitCode: number\n timedOut?: boolean\n }\n error?: string\n }\n\n try {\n const result = await apiRequest<ExecResponse>(\n 'POST',\n devPath('/exec', args.moduleUid),\n {\n command: args.command,\n cwd: args.cwd,\n timeout: args.timeout || 30000\n }\n )\n\n if (!result.success || !result.data) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Command failed'}` }],\n isError: true\n }\n }\n\n const { stdout, stderr, exitCode, timedOut } = result.data\n\n if (timedOut) {\n return {\n content: [{ type: 'text', text: `Command timed out\\n\\nOutput so far:\\n${stdout}` }],\n isError: true\n }\n }\n\n let output = ''\n if (stdout) output += stdout\n if (stderr) output += `\\n\\nSTDERR:\\n${stderr}`\n if (exitCode !== 0) output += `\\n\\nExit code: ${exitCode}`\n\n return {\n content: [{ type: 'text', text: output || '(no output)' }],\n isError: exitCode !== 0\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error executing command: ${error}` }],\n isError: true\n }\n }\n }\n)\n\n// ============================================\n// Batch Operations\n// ============================================\n\nserver.registerTool(\n 'batch_operations',\n {\n description: 'Execute multiple file operations in a single request',\n inputSchema: {\n ...targetSchema,\n operations: z.array(z.object({\n type: z.enum(['read', 'write', 'mkdir', 'delete', 'exec']).describe('Operation type'),\n path: z.string().optional().describe('File/directory path'),\n content: z.string().optional().describe('Content for write operations'),\n command: z.string().optional().describe('Command for exec operations'),\n recursive: z.boolean().optional().describe('Recursive flag for delete')\n })).describe('Array of operations to execute'),\n stopOnError: z.boolean().optional().describe('Stop on first error (default: false)')\n }\n },\n async (args) => {\n interface BatchResponse {\n success: boolean\n data?: {\n results: Array<{\n success: boolean\n data?: unknown\n error?: string\n }>\n completedCount: number\n failedCount: number\n }\n error?: string\n }\n\n try {\n const result = await apiRequest<BatchResponse>(\n 'POST',\n devPath('/batch', args.moduleUid),\n {\n operations: args.operations,\n stopOnError: args.stopOnError || false\n }\n )\n\n if (!result.success || !result.data) {\n return {\n content: [{ type: 'text', text: `Error: ${result.error || 'Batch failed'}` }],\n isError: true\n }\n }\n\n const { completedCount, failedCount, results } = result.data\n\n let summary = `Batch complete: ${completedCount} succeeded, ${failedCount} failed\\n\\n`\n\n results.forEach((r, i) => {\n const op = args.operations[i]\n const status = r.success ? 'OK' : 'FAILED'\n summary += `[${i + 1}] ${op.type} ${op.path || op.command || ''}: ${status}`\n if (!r.success && r.error) summary += ` - ${r.error}`\n summary += '\\n'\n })\n\n return {\n content: [{ type: 'text', text: summary }],\n isError: failedCount > 0\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: `Error executing batch: ${error}` }],\n isError: true\n }\n }\n }\n)\n\n// ============================================\n// Utility Functions\n// ============================================\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)}MB`\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)}GB`\n}\n\n// ============================================\n// Start Server\n// ============================================\n\nasync function main() {\n const runtimeConfig = await hydrateRuntimeConfig()\n EPISODA_API_URL = runtimeConfig.apiUrl\n EPISODA_SESSION_TOKEN = runtimeConfig.sessionToken\n EPISODA_PROJECT_ID = runtimeConfig.projectId\n EPISODA_WORKSPACE_ID = runtimeConfig.workspaceId\n\n if (!MODULE_UID && !DEV_ENVIRONMENT_ID) {\n console.warn('[episoda-dev] Warning: MODULE_UID/DEV_ENVIRONMENT_ID not set. Provide moduleUid per tool call.')\n }\n\n const transport = new StdioServerTransport()\n await server.connect(transport)\n\n const devTarget = MODULE_UID || DEV_ENVIRONMENT_ID || 'NOT SET'\n console.error('[episoda-dev] MCP server started')\n console.error(`[episoda-dev] API URL: ${EPISODA_API_URL}`)\n console.error(`[episoda-dev] Dev Target: ${devTarget}`)\n console.error(`[episoda-dev] Token: ${EPISODA_SESSION_TOKEN ? '****' : 'NOT SET'}`)\n}\n\nmain().catch((error) => {\n console.error('[episoda-dev] Fatal error:', error)\n process.exit(1)\n})\n","const usage = () => {\n console.error('Usage: @episoda/mcp <workflow|git|dev>')\n console.error('Aliases: episoda-workflow, episoda-git, episoda-dev')\n}\n\nasync function main() {\n const [server] = process.argv.slice(2)\n if (!server || server === '-h' || server === '--help' || server === 'help') {\n usage()\n process.exit(server ? 0 : 2)\n }\n\n const normalized = server.toLowerCase()\n\n switch (normalized) {\n case 'workflow':\n case 'episoda-workflow':\n await import('./workflow-server.js')\n break\n case 'git':\n case 'episoda-git':\n await import('./git-server.js')\n break\n case 'dev':\n case 'episoda-dev':\n await import('./dev-server.js')\n break\n default:\n usage()\n process.exit(2)\n }\n}\n\nmain().catch((error) => {\n console.error('[episoda-mcp] Fatal error:', error)\n process.exit(1)\n})\n"],"mappings":"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","names":["path","McpServer","StdioServerTransport","z","EPISODA_API_URL","EPISODA_SESSION_TOKEN","EPISODA_PROJECT_ID","EPISODA_WORKSPACE_ID","main","server","McpServer","StdioServerTransport","z","apiRequest","path","EPISODA_API_URL","EPISODA_SESSION_TOKEN","EPISODA_PROJECT_ID","EPISODA_WORKSPACE_ID","MODULE_UID","DEV_ENVIRONMENT_ID","main","server","targetSchema","main","server"]}
@@ -830,6 +830,62 @@ Both semantic and text search returned no results.` }] };
830
830
  Query: "${args.query}"
831
831
  Found: ${ranked.length} documents (${bothCount} matched both semantic + text)
832
832
 
833
+ ${list}`
834
+ }]
835
+ };
836
+ }
837
+ );
838
+ server.registerTool(
839
+ "search_conversations",
840
+ {
841
+ description: `Search past agent conversations in this project.
842
+
843
+ This searches agent conversation history (agent_messages) across sessions you can access.
844
+
845
+ USE THIS WHEN:
846
+ - The user references a prior discussion
847
+ - You need to recover context after compaction
848
+ - You want to find when/where something was decided`,
849
+ inputSchema: {
850
+ query: z.string().describe("Semantic search query"),
851
+ limit: z.number().optional().describe("Max results (default: 10)"),
852
+ threshold: z.number().optional().describe("Min similarity 0-1 (default: 0.5)"),
853
+ days_back: z.number().optional().describe("Limit to recent N days (optional)"),
854
+ session_id: z.string().optional().describe("Limit to a specific session UUID (optional)")
855
+ }
856
+ },
857
+ async (args) => {
858
+ const result = await apiRequest(
859
+ "POST",
860
+ "/api/search/conversations",
861
+ {
862
+ query: args.query,
863
+ limit: args.limit || 10,
864
+ threshold: args.threshold || 0.5,
865
+ ...args.days_back !== void 0 ? { days_back: args.days_back } : {},
866
+ ...args.session_id ? { session_id: args.session_id } : {}
867
+ }
868
+ );
869
+ if (!result.success || !result.results) {
870
+ return { content: [{ type: "text", text: `Error: ${result.error || "Conversation search failed"}` }], isError: true };
871
+ }
872
+ if (result.results.length === 0) {
873
+ return { content: [{ type: "text", text: `No conversation messages found matching: "${args.query}"` }] };
874
+ }
875
+ const list = result.results.map((r) => {
876
+ const score = Math.round((r.similarity || 0) * 100);
877
+ const moduleInfo = r.module_uid ? ` | ${r.module_uid}${r.module_title ? `: ${r.module_title}` : ""}` : "";
878
+ const when = r.created_at ? ` | ${r.created_at}` : "";
879
+ return `- [${r.role}, ${score}%] ${r.content_snippet}${moduleInfo}${when}`;
880
+ }).join("\n");
881
+ return {
882
+ content: [{
883
+ type: "text",
884
+ text: `# Conversation Search Results
885
+
886
+ Query: "${args.query}"
887
+ Found: ${result.results.length}
888
+
833
889
  ${list}`
834
890
  }]
835
891
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/workflow-server.ts","../src/runtime-config.ts"],"sourcesContent":["/**\n * EP895-10: Episoda Workflow MCP Server\n *\n * MCP server for Claude Code agents to interact with the Episoda workflow system.\n * Provides tools for:\n * - Task management (create, update, state transitions)\n * - Module management (create, update, state transitions)\n * - Knowledge access (search, get, link)\n *\n * Usage:\n * npx -y @episoda/mcp workflow\n *\n * Required environment variables:\n * EPISODA_API_URL - Base URL for Episoda API (e.g., https://episoda.dev)\n * EPISODA_SESSION_TOKEN - Bearer token for API authentication\n * MODULE_UID - Current module UID (for context)\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { z } from 'zod'\nimport { hydrateRuntimeConfig } from './runtime-config.js'\n\n// Environment configuration\nlet EPISODA_API_URL = process.env.EPISODA_API_URL || 'https://episoda.dev'\nlet EPISODA_SESSION_TOKEN = process.env.EPISODA_SESSION_TOKEN || ''\nlet EPISODA_PROJECT_ID = process.env.EPISODA_PROJECT_ID || ''\nlet EPISODA_WORKSPACE_ID = process.env.EPISODA_WORKSPACE_ID || ''\n\n/**\n * Make an authenticated API request\n */\nasync function apiRequest<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE',\n path: string,\n body?: Record<string, unknown>\n): Promise<T> {\n const url = `${EPISODA_API_URL}${path}`\n const options: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${EPISODA_SESSION_TOKEN}`\n }\n }\n\n if (body && method !== 'GET') {\n options.body = JSON.stringify(body)\n }\n\n if (EPISODA_PROJECT_ID) {\n (options.headers as Record<string, string>)['x-project-id'] = EPISODA_PROJECT_ID\n }\n if (EPISODA_WORKSPACE_ID) {\n (options.headers as Record<string, string>)['x-workspace-id'] = EPISODA_WORKSPACE_ID\n }\n\n const response = await fetch(url, options)\n\n if (!response.ok) {\n const text = await response.text()\n throw new Error(`API error ${response.status}: ${text}`)\n }\n\n return response.json() as Promise<T>\n}\n\n// Create MCP server\nconst server = new McpServer({\n name: 'episoda-workflow',\n version: '1.0.0'\n}, {\n capabilities: {\n tools: {}\n },\n instructions: `\n Episoda Workflow MCP Server\n\n This server provides tools to manage the Episoda development workflow:\n - Tasks: Create, update, and transition task states\n - Modules: Create, update, and transition module states\n - Knowledge: Search, retrieve, and link knowledge documents\n\n Task and module states flow: backlog → doing → review → done\n `\n})\n\n// ============================================\n// Task Management Tools\n// ============================================\n\nserver.registerTool(\n 'create_task',\n {\n description: 'Create a new task within a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the parent module (e.g., EP584)'),\n title: z.string().describe('Title of the task'),\n description: z.string().optional().describe('Markdown description of the task'),\n type: z.enum(['task', 'bug', 'spike']).optional().describe('Type of task')\n }\n },\n async (args) => {\n interface CreateTaskResponse {\n success: boolean\n task?: { id: string; uid: string; title: string }\n error?: string\n }\n\n const result = await apiRequest<CreateTaskResponse>('POST', '/api/tasks', {\n module_id: args.module_uid, // API expects module_id (accepts both UUID and UID)\n title: args.title,\n description_md: args.description,\n type: args.type || 'task'\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Created task ${result.task?.uid}: ${result.task?.title}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'update_task_state',\n {\n description: 'Move a task to a new state (backlog, doing, review, done)',\n inputSchema: {\n task_uid: z.string().describe('The UID of the task (e.g., EP584-1)'),\n state: z.enum(['backlog', 'doing', 'review', 'done']).describe('New state for the task')\n }\n },\n async (args) => {\n interface UpdateTaskResponse {\n success: boolean\n task?: { uid: string; state: string }\n error?: string\n }\n\n const result = await apiRequest<UpdateTaskResponse>('PATCH', `/api/tasks/${args.task_uid}`, {\n state: args.state\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Task ${args.task_uid} moved to ${args.state}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'update_task',\n {\n description: 'Update task details (title, description)',\n inputSchema: {\n task_uid: z.string().describe('The UID of the task (e.g., EP584-1)'),\n title: z.string().optional().describe('New title for the task'),\n description: z.string().optional().describe('New markdown description')\n }\n },\n async (args) => {\n interface UpdateTaskResponse {\n success: boolean\n task?: { uid: string; title: string }\n error?: string\n }\n\n const updates: Record<string, string> = {}\n if (args.title) updates.title = args.title\n if (args.description) updates.description_md = args.description\n\n const result = await apiRequest<UpdateTaskResponse>('PATCH', `/api/tasks/${args.task_uid}`, updates)\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Task ${args.task_uid} updated`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'get_task_details',\n {\n description: 'Get detailed information about a task',\n inputSchema: {\n task_uid: z.string().describe('The UID of the task (e.g., EP584-1)')\n }\n },\n async (args) => {\n interface TaskResponse {\n success: boolean\n task?: {\n uid: string\n title: string\n state: string\n type: string\n description_md: string | null\n module_uid: string\n }\n error?: string\n }\n\n const result = await apiRequest<TaskResponse>('GET', `/api/tasks/${args.task_uid}`)\n\n if (!result.success || !result.task) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Task not found'}` }], isError: true }\n }\n\n const task = result.task\n return {\n content: [{\n type: 'text',\n text: `# ${task.uid}: ${task.title}\n\n**State:** ${task.state}\n**Type:** ${task.type}\n**Module:** ${task.module_uid}\n\n${task.description_md || '_No description_'}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'list_module_tasks',\n {\n description: 'List all tasks for a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface TasksResponse {\n success: boolean\n tasks?: Array<{\n uid: string\n title: string\n state: string\n type: string\n }>\n error?: string\n }\n\n const result = await apiRequest<TasksResponse>('GET', `/api/modules/${args.module_uid}/tasks`)\n\n if (!result.success || !result.tasks) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Failed to fetch tasks'}` }], isError: true }\n }\n\n if (result.tasks.length === 0) {\n return { content: [{ type: 'text', text: 'No tasks found for this module.' }] }\n }\n\n const taskList = result.tasks.map(t => {\n const checkbox = t.state === 'done' ? '[x]' : '[ ]'\n const stateLabel = t.state !== 'backlog' ? ` (${t.state})` : ''\n return `- ${checkbox} **${t.uid}**: ${t.title}${stateLabel}`\n }).join('\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# Tasks for ${args.module_uid}\\n\\n${taskList}`\n }]\n }\n }\n)\n\n// ============================================\n// EP1252: Batch Task Tools\n// ============================================\n\nserver.registerTool(\n 'batch_update_task_state',\n {\n description: `Update the state of multiple tasks at once.\n\nUSE THIS WHEN:\n- Marking multiple tasks as done after completing work\n- Moving several tasks to \"doing\" state\n- Bulk state transitions\n\nEFFICIENCY: Single call instead of multiple update_task_state calls.\nReduces latency from ~1.5s (6 calls) to ~300ms (1 call).`,\n inputSchema: {\n task_uids: z.array(z.string()).describe('Array of task UIDs (e.g., [\"EP1252-1\", \"EP1252-2\"])'),\n state: z.enum(['backlog', 'doing', 'done']).describe('New state for all tasks')\n }\n },\n async (args) => {\n interface TaskLookupResponse {\n success: boolean\n tasks?: Array<{ id: string; uid: string }>\n error?: string\n }\n\n interface BatchUpdateResponse {\n success: boolean\n tasks?: Array<{ id: string; uid: string; state: string }>\n summary?: { updated: number; requested: number }\n error?: { message?: string; details?: string }\n }\n\n try {\n // Step 1: Look up task UUIDs from UIDs\n // We need to query each task to get its UUID since the batch endpoint requires UUIDs\n const lookupPromises = args.task_uids.map(uid =>\n apiRequest<{ success: boolean; task?: { id: string; uid: string } }>('GET', `/api/tasks/${uid}`)\n .then(r => r.success && r.task ? { uid, id: r.task.id } : null)\n .catch(() => null)\n )\n\n const lookupResults = await Promise.all(lookupPromises)\n const validTasks = lookupResults.filter((t): t is { uid: string; id: string } => t !== null)\n const notFoundUids = args.task_uids.filter(uid => !validTasks.find(t => t.uid === uid))\n\n if (validTasks.length === 0) {\n return {\n content: [{\n type: 'text',\n text: `Error: None of the specified tasks were found.\\nNot found: ${args.task_uids.join(', ')}`\n }],\n isError: true\n }\n }\n\n // Step 2: Call batch update endpoint with UUIDs\n const updates = validTasks.map(t => ({\n id: t.id,\n state: args.state\n }))\n\n const result = await apiRequest<BatchUpdateResponse>('PATCH', '/api/tasks/batch', {\n updates\n })\n\n if (!result.success) {\n const errorMsg = result.error?.message || result.error?.details || 'Batch update failed'\n return {\n content: [{\n type: 'text',\n text: `Error: ${errorMsg}`\n }],\n isError: true\n }\n }\n\n // Build response\n const updatedUids = validTasks.map(t => t.uid)\n const failedItems = notFoundUids.map(uid => ({ uid, error: 'Task not found' }))\n\n return {\n content: [{\n type: 'text',\n text: `# Batch Update Results\n\n**Updated:** ${updatedUids.length} tasks → ${args.state}\n${updatedUids.map(uid => `- ✓ ${uid}`).join('\\n')}\n\n${failedItems.length > 0 ? `**Failed:** ${failedItems.length} tasks\\n${failedItems.map(f => `- ✗ ${f.uid}: ${f.error}`).join('\\n')}` : ''}`\n }]\n }\n } catch (error) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n }],\n isError: true\n }\n }\n }\n)\n\nserver.registerTool(\n 'batch_create_tasks',\n {\n description: `Create multiple tasks for a module at once.\n\nUSE THIS WHEN:\n- Setting up tasks for a new module\n- Creating multiple related tasks together\n- Bulk task creation from a plan\n\nEFFICIENCY: Single call instead of multiple create_task calls.`,\n inputSchema: {\n module_uid: z.string().describe('The UID of the parent module (e.g., EP1252)'),\n tasks: z.array(z.object({\n title: z.string().describe('Title of the task'),\n description: z.string().optional().describe('Markdown description'),\n state: z.enum(['backlog', 'doing', 'done']).optional().describe('Initial state (default: backlog)')\n })).describe('Array of tasks to create')\n }\n },\n async (args) => {\n interface BulkCreateResponse {\n success: boolean\n created?: number\n tasks?: Array<{ uid: string; title: string }>\n error?: string\n }\n\n try {\n // Call the bulk create endpoint (accepts module UID directly)\n const result = await apiRequest<BulkCreateResponse>('POST', '/api/tasks/bulk', {\n module_id: args.module_uid,\n tasks: args.tasks.map(t => ({\n title: t.title,\n description_md: t.description,\n state: t.state || 'backlog'\n }))\n })\n\n if (!result.success) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${result.error || 'Bulk create failed'}`\n }],\n isError: true\n }\n }\n\n const createdTasks = result.tasks || []\n\n return {\n content: [{\n type: 'text',\n text: `# Batch Create Results\n\n**Created:** ${result.created || createdTasks.length} tasks for ${args.module_uid}\n\n${createdTasks.map(t => `- ✓ **${t.uid}**: ${t.title}`).join('\\n')}`\n }]\n }\n } catch (error) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n }],\n isError: true\n }\n }\n }\n)\n\nserver.registerTool(\n 'batch_get_tasks',\n {\n description: `Fetch multiple tasks by UID in a single call.\n\nUSE THIS WHEN:\n- Need details for several specific tasks\n- Checking status of multiple tasks at once\n- Gathering context for a set of tasks\n\nEFFICIENCY: Single MCP call instead of multiple get_task_details calls.`,\n inputSchema: {\n task_uids: z.array(z.string()).describe('Array of task UIDs (e.g., [\"EP1252-1\", \"EP1252-2\"])')\n }\n },\n async (args) => {\n interface TaskResponse {\n success: boolean\n task?: {\n uid: string\n title: string\n state: string\n type: string\n description_md: string | null\n }\n }\n\n try {\n type TaskInfo = NonNullable<TaskResponse['task']>\n\n // Fetch all tasks in parallel\n const fetchPromises = args.task_uids.map(uid =>\n apiRequest<TaskResponse>('GET', `/api/tasks/${uid}`)\n .then(r => r.success && r.task ? { found: true as const, task: r.task } : { found: false as const, uid })\n .catch(() => ({ found: false as const, uid }))\n )\n\n const results = await Promise.all(fetchPromises)\n const foundTasks: TaskInfo[] = []\n const notFoundUids: string[] = []\n\n for (const result of results) {\n if (result.found && result.task) {\n foundTasks.push(result.task as TaskInfo)\n } else if (!result.found) {\n notFoundUids.push(result.uid)\n }\n }\n\n if (foundTasks.length === 0) {\n return {\n content: [{\n type: 'text',\n text: `Error: None of the specified tasks were found.\\nNot found: ${args.task_uids.join(', ')}`\n }],\n isError: true\n }\n }\n\n const taskList = foundTasks.map((task) => {\n const checkbox = task.state === 'done' ? '[x]' : '[ ]'\n const stateLabel = task.state !== 'backlog' ? ` (${task.state})` : ''\n return `- ${checkbox} **${task.uid}**: ${task.title}${stateLabel}`\n }).join('\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# Batch Get Results\n\n**Found:** ${foundTasks.length} tasks\n${taskList}\n\n${notFoundUids.length > 0 ? `**Not found:** ${notFoundUids.join(', ')}` : ''}`\n }]\n }\n } catch (error) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n }],\n isError: true\n }\n }\n }\n)\n\n// ============================================\n// Module Management Tools\n// ============================================\n\nserver.registerTool(\n 'create_module',\n {\n description: 'Create a new module in the project',\n inputSchema: {\n title: z.string().describe('Title of the module'),\n description: z.string().optional().describe('Markdown description of the module')\n }\n },\n async (args) => {\n interface CreateModuleResponse {\n success: boolean\n module?: { id: string; uid: string; title: string }\n error?: string\n }\n\n const result = await apiRequest<CreateModuleResponse>('POST', '/api/modules', {\n title: args.title,\n description_md: args.description\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Created module ${result.module?.uid}: ${result.module?.title}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'update_module',\n {\n description: 'Update module details (title, description)',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)'),\n title: z.string().optional().describe('New title for the module'),\n description: z.string().optional().describe('New markdown description')\n }\n },\n async (args) => {\n interface UpdateModuleResponse {\n success: boolean\n module?: { uid: string; title: string }\n error?: string\n }\n\n const updates: Record<string, string> = {}\n if (args.title) updates.title = args.title\n if (args.description) updates.description_md = args.description\n\n const result = await apiRequest<UpdateModuleResponse>('PATCH', `/api/modules/${args.module_uid}`, updates)\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Module ${args.module_uid} updated`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'request_review',\n {\n description: 'Move a module to review state',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface UpdateModuleResponse {\n success: boolean\n module?: { uid: string; state: string }\n error?: string\n }\n\n const result = await apiRequest<UpdateModuleResponse>('PATCH', `/api/modules/${args.module_uid}`, {\n state: 'review'\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Module ${args.module_uid} moved to review`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'mark_done',\n {\n description: 'Move a module to done state',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface UpdateModuleResponse {\n success: boolean\n module?: { uid: string; state: string }\n error?: string\n }\n\n const result = await apiRequest<UpdateModuleResponse>('PATCH', `/api/modules/${args.module_uid}`, {\n state: 'done'\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Module ${args.module_uid} marked as done`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'get_module_details',\n {\n description: 'Get detailed information about a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface ModuleResponse {\n success: boolean\n module?: {\n uid: string\n title: string\n state: string\n description_md: string | null\n branch_name: string | null\n }\n error?: string\n }\n\n const result = await apiRequest<ModuleResponse>('GET', `/api/modules/${args.module_uid}`)\n\n if (!result.success || !result.module) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Module not found'}` }], isError: true }\n }\n\n const mod = result.module\n return {\n content: [{\n type: 'text',\n text: `# ${mod.uid}: ${mod.title}\n\n**State:** ${mod.state}\n**Branch:** ${mod.branch_name || '_Not set_'}\n\n${mod.description_md || '_No description_'}`\n }]\n }\n }\n)\n\n// ============================================\n// Knowledge Tools\n// ============================================\n\nserver.registerTool(\n 'get_knowledge',\n {\n description: 'Fetch a knowledge document by ID',\n inputSchema: {\n knowledge_id: z.string().describe('The ID of the knowledge document')\n }\n },\n async (args) => {\n interface KnowledgeResponse {\n success: boolean\n knowledge?: {\n id: string\n title: string\n doc_type: string\n domain: string\n sections: Array<{ heading?: string; content?: string }>\n }\n error?: string\n }\n\n const result = await apiRequest<KnowledgeResponse>('GET', `/api/knowledge/${args.knowledge_id}`)\n\n if (!result.success || !result.knowledge) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Knowledge not found'}` }], isError: true }\n }\n\n const doc = result.knowledge\n const sections = doc.sections.map(s => {\n const heading = s.heading ? `## ${s.heading}\\n\\n` : ''\n return `${heading}${s.content || ''}`\n }).join('\\n\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# ${doc.title}\n\n**Type:** ${doc.doc_type} | **Domain:** ${doc.domain}\n\n${sections}`\n }]\n }\n }\n)\n\n// EP1242: Three search tools with clear use cases for AI agents\n\nserver.registerTool(\n 'search_knowledge_semantic',\n {\n description: `Search knowledge using vector similarity (semantic/conceptual matching).\n\nUSE THIS WHEN:\n- Looking for documents about a concept: \"authentication patterns\", \"error handling\"\n- Finding related content even if exact words don't match\n- Discovering documentation about a topic\n\nDO NOT USE WHEN:\n- Looking for a specific document by ID/UID (use get_knowledge)\n- Searching for exact title match (use search_knowledge_text)`,\n inputSchema: {\n query: z.string().describe('Natural language query describing what you\\'re looking for'),\n limit: z.number().optional().describe('Maximum results (default: 10)'),\n threshold: z.number().optional().describe('Minimum similarity 0-1 (default: 0.5, lower = more results)')\n }\n },\n async (args) => {\n interface SemanticSearchResponse {\n success: boolean\n results?: Array<{\n id: string\n uid?: string\n title: string\n doc_type: string\n similarity: number\n markdown?: string\n }>\n query_info?: { took_ms: number }\n error?: string\n }\n\n const result = await apiRequest<SemanticSearchResponse>(\n 'POST',\n '/api/search/semantic',\n {\n query: args.query,\n types: ['knowledge'],\n limit: args.limit || 10,\n threshold: args.threshold || 0.5\n }\n )\n\n if (!result.success || !result.results) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Semantic search failed'}` }], isError: true }\n }\n\n if (result.results.length === 0) {\n return { content: [{ type: 'text', text: `No knowledge documents found semantically matching: \"${args.query}\"\\n\\nTry:\\n- Broader search terms\\n- Lower threshold (e.g., 0.3)\\n- Text search for exact matches` }] }\n }\n\n const list = result.results.map(r => {\n const score = Math.round(r.similarity * 100)\n const uid = r.uid ? ` (${r.uid})` : ''\n const snippet = r.markdown ? `\\n ${r.markdown.substring(0, 150)}...` : ''\n return `- **${r.title}**${uid} [${r.doc_type}, ${score}% match]${snippet}`\n }).join('\\n\\n')\n\n const timing = result.query_info ? ` (${result.query_info.took_ms}ms)` : ''\n\n return {\n content: [{\n type: 'text',\n text: `# Semantic Search Results${timing}\\n\\nQuery: \"${args.query}\"\\nFound: ${result.results.length} documents\\n\\n${list}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'search_knowledge_text',\n {\n description: `Search knowledge using text/keyword matching (fast, exact).\n\nUSE THIS WHEN:\n- Looking for documents by UID: \"K123\", \"K45\"\n- Searching for exact title: \"API Authentication Guide\"\n- Finding documents containing specific terms\n\nDO NOT USE WHEN:\n- Looking for conceptually related content (use search_knowledge_semantic)\n- Want to find documents about a topic without knowing exact words`,\n inputSchema: {\n query: z.string().describe('Text to search for (searches title, UID, domain, content)'),\n limit: z.number().optional().describe('Maximum results (default: 20)')\n }\n },\n async (args) => {\n interface TextSearchResponse {\n success: boolean\n results?: Array<{\n id: string\n uid?: string\n title: string\n doc_type?: string\n type: string\n markdown?: string\n }>\n total?: number\n error?: string\n }\n\n const result = await apiRequest<TextSearchResponse>(\n 'POST',\n '/api/search/text',\n {\n query: args.query,\n types: ['knowledge'],\n limit: args.limit || 20\n }\n )\n\n if (!result.success || !result.results) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Text search failed'}` }], isError: true }\n }\n\n if (result.results.length === 0) {\n return { content: [{ type: 'text', text: `No knowledge documents found matching: \"${args.query}\"\\n\\nTry:\\n- Different keywords\\n- Semantic search for conceptual matches` }] }\n }\n\n const list = result.results.map(r => {\n const uid = r.uid ? ` (${r.uid})` : ''\n const docType = r.doc_type ? ` [${r.doc_type}]` : ''\n const snippet = r.markdown ? `\\n ${r.markdown.substring(0, 150)}...` : ''\n return `- **${r.title}**${uid}${docType}${snippet}`\n }).join('\\n\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# Text Search Results\\n\\nQuery: \"${args.query}\"\\nFound: ${result.results.length} of ${result.total || result.results.length} documents\\n\\n${list}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'search_knowledge_hybrid',\n {\n description: `Search knowledge using both semantic AND text matching (best for general queries).\n\nCombines results using Reciprocal Rank Fusion (RRF) algorithm.\nDocuments that match BOTH semantically and textually rank highest.\n\nUSE THIS WHEN:\n- General search where you want comprehensive results\n- Not sure if semantic or text search is better\n- Want the best of both approaches\n\nThis is the recommended default search for most queries.`,\n inputSchema: {\n query: z.string().describe('Search query (will be used for both semantic and text matching)'),\n limit: z.number().optional().describe('Maximum results (default: 10)')\n }\n },\n async (args) => {\n interface SearchResult {\n id: string\n uid?: string\n title: string\n doc_type?: string\n similarity?: number\n markdown?: string\n }\n\n interface SemanticResponse {\n success: boolean\n results?: SearchResult[]\n error?: string\n }\n\n interface TextResponse {\n success: boolean\n results?: SearchResult[]\n error?: string\n }\n\n // Run both searches in parallel\n const [semanticResult, textResult] = await Promise.all([\n apiRequest<SemanticResponse>('POST', '/api/search/semantic', {\n query: args.query,\n types: ['knowledge'],\n limit: 50,\n threshold: 0.4\n }),\n apiRequest<TextResponse>('POST', '/api/search/text', {\n query: args.query,\n types: ['knowledge'],\n limit: 50\n })\n ])\n\n const semanticResults = semanticResult.success ? (semanticResult.results || []) : []\n const textResults = textResult.success ? (textResult.results || []) : []\n\n // Apply Reciprocal Rank Fusion (RRF) with k=60\n const K = 60\n const scores = new Map<string, { score: number; doc: SearchResult; sources: string[] }>()\n\n // Score semantic results\n semanticResults.forEach((doc, index) => {\n const rrfScore = 1 / (K + index + 1)\n scores.set(doc.id, { score: rrfScore, doc, sources: ['semantic'] })\n })\n\n // Score text results and merge\n textResults.forEach((doc, index) => {\n const rrfScore = 1 / (K + index + 1)\n const existing = scores.get(doc.id)\n if (existing) {\n existing.score += rrfScore\n existing.sources.push('text')\n } else {\n scores.set(doc.id, { score: rrfScore, doc, sources: ['text'] })\n }\n })\n\n // Sort by RRF score and limit\n const limit = args.limit || 10\n const ranked = Array.from(scores.values())\n .sort((a, b) => b.score - a.score)\n .slice(0, limit)\n\n if (ranked.length === 0) {\n return { content: [{ type: 'text', text: `No knowledge documents found for: \"${args.query}\"\\n\\nBoth semantic and text search returned no results.` }] }\n }\n\n const list = ranked.map(({ doc, score, sources }) => {\n const uid = doc.uid ? ` (${doc.uid})` : ''\n const docType = doc.doc_type ? ` [${doc.doc_type}]` : ''\n const matchType = sources.length === 2 ? '⭐ both' : sources[0]\n const snippet = doc.markdown ? `\\n ${doc.markdown.substring(0, 150)}...` : ''\n return `- **${doc.title}**${uid}${docType} (${matchType})${snippet}`\n }).join('\\n\\n')\n\n const bothCount = ranked.filter(r => r.sources.length === 2).length\n\n return {\n content: [{\n type: 'text',\n text: `# Hybrid Search Results (RRF)\\n\\nQuery: \"${args.query}\"\\nFound: ${ranked.length} documents (${bothCount} matched both semantic + text)\\n\\n${list}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'list_linked_knowledge',\n {\n description: 'List knowledge documents linked to a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface LinkedKnowledgeResponse {\n success: boolean\n knowledge?: Array<{\n id: string\n title: string\n doc_type: string\n }>\n error?: string\n }\n\n const result = await apiRequest<LinkedKnowledgeResponse>(\n 'GET',\n `/api/modules/${args.module_uid}/knowledge`\n )\n\n if (!result.success || !result.knowledge) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Failed to fetch knowledge'}` }], isError: true }\n }\n\n if (result.knowledge.length === 0) {\n return { content: [{ type: 'text', text: 'No knowledge documents linked to this module.' }] }\n }\n\n const list = result.knowledge.map(k => `- **${k.title}** (${k.doc_type})`).join('\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# Linked Knowledge for ${args.module_uid}\\n\\n${list}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'link_knowledge',\n {\n description: 'Link a knowledge document to a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)'),\n knowledge_id: z.string().describe('The ID of the knowledge document to link')\n }\n },\n async (args) => {\n interface LinkResponse {\n success: boolean\n error?: string\n }\n\n const result = await apiRequest<LinkResponse>(\n 'POST',\n `/api/modules/${args.module_uid}/knowledge/link`,\n { knowledge_id: args.knowledge_id }\n )\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Knowledge document linked to module ${args.module_uid}`\n }]\n }\n }\n)\n\n// ============================================\n// Context Tools\n// ============================================\n\nserver.registerTool(\n 'get_module_context',\n {\n description: 'Get the full context for a module (title, tasks, linked knowledge)',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface ContextResponse {\n success: boolean\n context?: string\n error?: string\n }\n\n // Use the agent-accessible module context API\n const result = await apiRequest<ContextResponse>(\n 'GET',\n `/api/agent/context/module/${args.module_uid}`\n )\n\n if (!result.success || !result.context) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Failed to fetch context'}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: result.context\n }]\n }\n }\n)\n\nserver.registerTool(\n 'get_project_context',\n {\n description: 'Get the project-wide context (C2 bundle with active work, priorities)',\n inputSchema: {}\n },\n async () => {\n interface ContextResponse {\n success: boolean\n prompt?: string\n error?: string\n }\n\n // Use the agent-accessible system prompt API\n const result = await apiRequest<ContextResponse>(\n 'GET',\n '/api/agent/context/system'\n )\n\n if (!result.success || !result.prompt) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Failed to fetch context'}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: result.prompt\n }]\n }\n }\n)\n\n// ============================================\n// Start Server\n// ============================================\n\nasync function main() {\n const runtimeConfig = await hydrateRuntimeConfig()\n EPISODA_API_URL = runtimeConfig.apiUrl\n EPISODA_SESSION_TOKEN = runtimeConfig.sessionToken\n EPISODA_PROJECT_ID = runtimeConfig.projectId\n EPISODA_WORKSPACE_ID = runtimeConfig.workspaceId\n\n const transport = new StdioServerTransport()\n await server.connect(transport)\n\n // Log to stderr so it doesn't interfere with MCP protocol\n console.error('[episoda-workflow] MCP server started')\n console.error(`[episoda-workflow] API URL: ${EPISODA_API_URL}`)\n console.error(`[episoda-workflow] Token: ${EPISODA_SESSION_TOKEN ? '****' : 'NOT SET'}`)\n}\n\nmain().catch((error) => {\n console.error('[episoda-workflow] Fatal error:', error)\n process.exit(1)\n})\n","import * as fs from 'node:fs'\nimport * as os from 'node:os'\nimport * as path from 'node:path'\n\nconst DEFAULT_API_URL = 'https://episoda.dev'\nconst DEFAULT_CONFIG_FILE = 'config.json'\n\ninterface EpisodaLocalConfig {\n access_token?: string\n project_id?: string\n workspace_id?: string\n api_url?: string\n}\n\nexport interface RuntimeConfig {\n apiUrl: string\n sessionToken: string\n projectId: string\n workspaceId: string\n}\n\nconst normalizeEnv = (value?: string): string | undefined => {\n if (!value) return undefined\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : undefined\n}\n\nconst readEnvConfig = () => ({\n apiUrl: normalizeEnv(process.env.EPISODA_API_URL),\n sessionToken: normalizeEnv(process.env.EPISODA_SESSION_TOKEN),\n projectId: normalizeEnv(process.env.EPISODA_PROJECT_ID),\n workspaceId: normalizeEnv(process.env.EPISODA_WORKSPACE_ID)\n})\n\nconst buildMissingMessage = (missing: string[], apiUrl: string): string => {\n return [\n `[episoda-mcp] Missing auth context: ${missing.join(', ')}`,\n '[episoda-mcp] Set EPISODA_* env vars or run:',\n `[episoda-mcp] episoda auth --api-url ${apiUrl}`\n ].join('\\n')\n}\n\nconst getConfigPath = (): string => {\n // MCP supports a full-path override in addition to the core-style config dir.\n if (process.env.EPISODA_CONFIG_PATH) {\n return process.env.EPISODA_CONFIG_PATH\n }\n const configDir = process.env.EPISODA_CONFIG_DIR || path.join(os.homedir(), '.episoda')\n return path.join(configDir, DEFAULT_CONFIG_FILE)\n}\n\nconst loadLocalConfig = (): EpisodaLocalConfig | null => {\n const configPath = getConfigPath()\n if (!fs.existsSync(configPath)) {\n return null\n }\n try {\n const content = fs.readFileSync(configPath, 'utf8')\n return JSON.parse(content) as EpisodaLocalConfig\n } catch (error) {\n console.error('[episoda-mcp] Failed to load config:', error)\n return null\n }\n}\n\nexport async function resolveRuntimeConfig(): Promise<RuntimeConfig> {\n const envConfig = readEnvConfig()\n\n let fileConfig: EpisodaLocalConfig | null = null\n if (!envConfig.sessionToken || !envConfig.projectId || !envConfig.workspaceId || !envConfig.apiUrl) {\n fileConfig = loadLocalConfig()\n }\n\n const resolved: RuntimeConfig = {\n apiUrl: envConfig.apiUrl || fileConfig?.api_url || DEFAULT_API_URL,\n sessionToken: envConfig.sessionToken || fileConfig?.access_token || '',\n projectId: envConfig.projectId || fileConfig?.project_id || '',\n workspaceId: envConfig.workspaceId || fileConfig?.workspace_id || ''\n }\n\n const missing: string[] = []\n if (!resolved.sessionToken) missing.push('EPISODA_SESSION_TOKEN')\n if (!resolved.projectId) missing.push('EPISODA_PROJECT_ID')\n if (!resolved.workspaceId) missing.push('EPISODA_WORKSPACE_ID')\n\n if (missing.length > 0) {\n throw new Error(buildMissingMessage(missing, resolved.apiUrl))\n }\n\n return resolved\n}\n\nexport async function hydrateRuntimeConfig(): Promise<RuntimeConfig> {\n const resolved = await resolveRuntimeConfig()\n\n if (!normalizeEnv(process.env.EPISODA_API_URL)) {\n process.env.EPISODA_API_URL = resolved.apiUrl\n }\n if (!normalizeEnv(process.env.EPISODA_SESSION_TOKEN)) {\n process.env.EPISODA_SESSION_TOKEN = resolved.sessionToken\n }\n if (!normalizeEnv(process.env.EPISODA_PROJECT_ID)) {\n process.env.EPISODA_PROJECT_ID = resolved.projectId\n }\n if (!normalizeEnv(process.env.EPISODA_WORKSPACE_ID)) {\n process.env.EPISODA_WORKSPACE_ID = resolved.workspaceId\n }\n\n return resolved\n}\n"],"mappings":"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","names":["path"]}
1
+ {"version":3,"sources":["../src/workflow-server.ts","../src/runtime-config.ts"],"sourcesContent":["/**\n * EP895-10: Episoda Workflow MCP Server\n *\n * MCP server for Claude Code agents to interact with the Episoda workflow system.\n * Provides tools for:\n * - Task management (create, update, state transitions)\n * - Module management (create, update, state transitions)\n * - Knowledge access (search, get, link)\n *\n * Usage:\n * npx -y @episoda/mcp workflow\n *\n * Required environment variables:\n * EPISODA_API_URL - Base URL for Episoda API (e.g., https://episoda.dev)\n * EPISODA_SESSION_TOKEN - Bearer token for API authentication\n * MODULE_UID - Current module UID (for context)\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { z } from 'zod'\nimport { hydrateRuntimeConfig } from './runtime-config.js'\n\n// Environment configuration\nlet EPISODA_API_URL = process.env.EPISODA_API_URL || 'https://episoda.dev'\nlet EPISODA_SESSION_TOKEN = process.env.EPISODA_SESSION_TOKEN || ''\nlet EPISODA_PROJECT_ID = process.env.EPISODA_PROJECT_ID || ''\nlet EPISODA_WORKSPACE_ID = process.env.EPISODA_WORKSPACE_ID || ''\n\n/**\n * Make an authenticated API request\n */\nasync function apiRequest<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE',\n path: string,\n body?: Record<string, unknown>\n): Promise<T> {\n const url = `${EPISODA_API_URL}${path}`\n const options: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${EPISODA_SESSION_TOKEN}`\n }\n }\n\n if (body && method !== 'GET') {\n options.body = JSON.stringify(body)\n }\n\n if (EPISODA_PROJECT_ID) {\n (options.headers as Record<string, string>)['x-project-id'] = EPISODA_PROJECT_ID\n }\n if (EPISODA_WORKSPACE_ID) {\n (options.headers as Record<string, string>)['x-workspace-id'] = EPISODA_WORKSPACE_ID\n }\n\n const response = await fetch(url, options)\n\n if (!response.ok) {\n const text = await response.text()\n throw new Error(`API error ${response.status}: ${text}`)\n }\n\n return response.json() as Promise<T>\n}\n\n// Create MCP server\nconst server = new McpServer({\n name: 'episoda-workflow',\n version: '1.0.0'\n}, {\n capabilities: {\n tools: {}\n },\n instructions: `\n Episoda Workflow MCP Server\n\n This server provides tools to manage the Episoda development workflow:\n - Tasks: Create, update, and transition task states\n - Modules: Create, update, and transition module states\n - Knowledge: Search, retrieve, and link knowledge documents\n\n Task and module states flow: backlog → doing → review → done\n `\n})\n\n// ============================================\n// Task Management Tools\n// ============================================\n\nserver.registerTool(\n 'create_task',\n {\n description: 'Create a new task within a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the parent module (e.g., EP584)'),\n title: z.string().describe('Title of the task'),\n description: z.string().optional().describe('Markdown description of the task'),\n type: z.enum(['task', 'bug', 'spike']).optional().describe('Type of task')\n }\n },\n async (args) => {\n interface CreateTaskResponse {\n success: boolean\n task?: { id: string; uid: string; title: string }\n error?: string\n }\n\n const result = await apiRequest<CreateTaskResponse>('POST', '/api/tasks', {\n module_id: args.module_uid, // API expects module_id (accepts both UUID and UID)\n title: args.title,\n description_md: args.description,\n type: args.type || 'task'\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Created task ${result.task?.uid}: ${result.task?.title}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'update_task_state',\n {\n description: 'Move a task to a new state (backlog, doing, review, done)',\n inputSchema: {\n task_uid: z.string().describe('The UID of the task (e.g., EP584-1)'),\n state: z.enum(['backlog', 'doing', 'review', 'done']).describe('New state for the task')\n }\n },\n async (args) => {\n interface UpdateTaskResponse {\n success: boolean\n task?: { uid: string; state: string }\n error?: string\n }\n\n const result = await apiRequest<UpdateTaskResponse>('PATCH', `/api/tasks/${args.task_uid}`, {\n state: args.state\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Task ${args.task_uid} moved to ${args.state}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'update_task',\n {\n description: 'Update task details (title, description)',\n inputSchema: {\n task_uid: z.string().describe('The UID of the task (e.g., EP584-1)'),\n title: z.string().optional().describe('New title for the task'),\n description: z.string().optional().describe('New markdown description')\n }\n },\n async (args) => {\n interface UpdateTaskResponse {\n success: boolean\n task?: { uid: string; title: string }\n error?: string\n }\n\n const updates: Record<string, string> = {}\n if (args.title) updates.title = args.title\n if (args.description) updates.description_md = args.description\n\n const result = await apiRequest<UpdateTaskResponse>('PATCH', `/api/tasks/${args.task_uid}`, updates)\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Task ${args.task_uid} updated`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'get_task_details',\n {\n description: 'Get detailed information about a task',\n inputSchema: {\n task_uid: z.string().describe('The UID of the task (e.g., EP584-1)')\n }\n },\n async (args) => {\n interface TaskResponse {\n success: boolean\n task?: {\n uid: string\n title: string\n state: string\n type: string\n description_md: string | null\n module_uid: string\n }\n error?: string\n }\n\n const result = await apiRequest<TaskResponse>('GET', `/api/tasks/${args.task_uid}`)\n\n if (!result.success || !result.task) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Task not found'}` }], isError: true }\n }\n\n const task = result.task\n return {\n content: [{\n type: 'text',\n text: `# ${task.uid}: ${task.title}\n\n**State:** ${task.state}\n**Type:** ${task.type}\n**Module:** ${task.module_uid}\n\n${task.description_md || '_No description_'}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'list_module_tasks',\n {\n description: 'List all tasks for a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface TasksResponse {\n success: boolean\n tasks?: Array<{\n uid: string\n title: string\n state: string\n type: string\n }>\n error?: string\n }\n\n const result = await apiRequest<TasksResponse>('GET', `/api/modules/${args.module_uid}/tasks`)\n\n if (!result.success || !result.tasks) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Failed to fetch tasks'}` }], isError: true }\n }\n\n if (result.tasks.length === 0) {\n return { content: [{ type: 'text', text: 'No tasks found for this module.' }] }\n }\n\n const taskList = result.tasks.map(t => {\n const checkbox = t.state === 'done' ? '[x]' : '[ ]'\n const stateLabel = t.state !== 'backlog' ? ` (${t.state})` : ''\n return `- ${checkbox} **${t.uid}**: ${t.title}${stateLabel}`\n }).join('\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# Tasks for ${args.module_uid}\\n\\n${taskList}`\n }]\n }\n }\n)\n\n// ============================================\n// EP1252: Batch Task Tools\n// ============================================\n\nserver.registerTool(\n 'batch_update_task_state',\n {\n description: `Update the state of multiple tasks at once.\n\nUSE THIS WHEN:\n- Marking multiple tasks as done after completing work\n- Moving several tasks to \"doing\" state\n- Bulk state transitions\n\nEFFICIENCY: Single call instead of multiple update_task_state calls.\nReduces latency from ~1.5s (6 calls) to ~300ms (1 call).`,\n inputSchema: {\n task_uids: z.array(z.string()).describe('Array of task UIDs (e.g., [\"EP1252-1\", \"EP1252-2\"])'),\n state: z.enum(['backlog', 'doing', 'done']).describe('New state for all tasks')\n }\n },\n async (args) => {\n interface TaskLookupResponse {\n success: boolean\n tasks?: Array<{ id: string; uid: string }>\n error?: string\n }\n\n interface BatchUpdateResponse {\n success: boolean\n tasks?: Array<{ id: string; uid: string; state: string }>\n summary?: { updated: number; requested: number }\n error?: { message?: string; details?: string }\n }\n\n try {\n // Step 1: Look up task UUIDs from UIDs\n // We need to query each task to get its UUID since the batch endpoint requires UUIDs\n const lookupPromises = args.task_uids.map(uid =>\n apiRequest<{ success: boolean; task?: { id: string; uid: string } }>('GET', `/api/tasks/${uid}`)\n .then(r => r.success && r.task ? { uid, id: r.task.id } : null)\n .catch(() => null)\n )\n\n const lookupResults = await Promise.all(lookupPromises)\n const validTasks = lookupResults.filter((t): t is { uid: string; id: string } => t !== null)\n const notFoundUids = args.task_uids.filter(uid => !validTasks.find(t => t.uid === uid))\n\n if (validTasks.length === 0) {\n return {\n content: [{\n type: 'text',\n text: `Error: None of the specified tasks were found.\\nNot found: ${args.task_uids.join(', ')}`\n }],\n isError: true\n }\n }\n\n // Step 2: Call batch update endpoint with UUIDs\n const updates = validTasks.map(t => ({\n id: t.id,\n state: args.state\n }))\n\n const result = await apiRequest<BatchUpdateResponse>('PATCH', '/api/tasks/batch', {\n updates\n })\n\n if (!result.success) {\n const errorMsg = result.error?.message || result.error?.details || 'Batch update failed'\n return {\n content: [{\n type: 'text',\n text: `Error: ${errorMsg}`\n }],\n isError: true\n }\n }\n\n // Build response\n const updatedUids = validTasks.map(t => t.uid)\n const failedItems = notFoundUids.map(uid => ({ uid, error: 'Task not found' }))\n\n return {\n content: [{\n type: 'text',\n text: `# Batch Update Results\n\n**Updated:** ${updatedUids.length} tasks → ${args.state}\n${updatedUids.map(uid => `- ✓ ${uid}`).join('\\n')}\n\n${failedItems.length > 0 ? `**Failed:** ${failedItems.length} tasks\\n${failedItems.map(f => `- ✗ ${f.uid}: ${f.error}`).join('\\n')}` : ''}`\n }]\n }\n } catch (error) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n }],\n isError: true\n }\n }\n }\n)\n\nserver.registerTool(\n 'batch_create_tasks',\n {\n description: `Create multiple tasks for a module at once.\n\nUSE THIS WHEN:\n- Setting up tasks for a new module\n- Creating multiple related tasks together\n- Bulk task creation from a plan\n\nEFFICIENCY: Single call instead of multiple create_task calls.`,\n inputSchema: {\n module_uid: z.string().describe('The UID of the parent module (e.g., EP1252)'),\n tasks: z.array(z.object({\n title: z.string().describe('Title of the task'),\n description: z.string().optional().describe('Markdown description'),\n state: z.enum(['backlog', 'doing', 'done']).optional().describe('Initial state (default: backlog)')\n })).describe('Array of tasks to create')\n }\n },\n async (args) => {\n interface BulkCreateResponse {\n success: boolean\n created?: number\n tasks?: Array<{ uid: string; title: string }>\n error?: string\n }\n\n try {\n // Call the bulk create endpoint (accepts module UID directly)\n const result = await apiRequest<BulkCreateResponse>('POST', '/api/tasks/bulk', {\n module_id: args.module_uid,\n tasks: args.tasks.map(t => ({\n title: t.title,\n description_md: t.description,\n state: t.state || 'backlog'\n }))\n })\n\n if (!result.success) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${result.error || 'Bulk create failed'}`\n }],\n isError: true\n }\n }\n\n const createdTasks = result.tasks || []\n\n return {\n content: [{\n type: 'text',\n text: `# Batch Create Results\n\n**Created:** ${result.created || createdTasks.length} tasks for ${args.module_uid}\n\n${createdTasks.map(t => `- ✓ **${t.uid}**: ${t.title}`).join('\\n')}`\n }]\n }\n } catch (error) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n }],\n isError: true\n }\n }\n }\n)\n\nserver.registerTool(\n 'batch_get_tasks',\n {\n description: `Fetch multiple tasks by UID in a single call.\n\nUSE THIS WHEN:\n- Need details for several specific tasks\n- Checking status of multiple tasks at once\n- Gathering context for a set of tasks\n\nEFFICIENCY: Single MCP call instead of multiple get_task_details calls.`,\n inputSchema: {\n task_uids: z.array(z.string()).describe('Array of task UIDs (e.g., [\"EP1252-1\", \"EP1252-2\"])')\n }\n },\n async (args) => {\n interface TaskResponse {\n success: boolean\n task?: {\n uid: string\n title: string\n state: string\n type: string\n description_md: string | null\n }\n }\n\n try {\n type TaskInfo = NonNullable<TaskResponse['task']>\n\n // Fetch all tasks in parallel\n const fetchPromises = args.task_uids.map(uid =>\n apiRequest<TaskResponse>('GET', `/api/tasks/${uid}`)\n .then(r => r.success && r.task ? { found: true as const, task: r.task } : { found: false as const, uid })\n .catch(() => ({ found: false as const, uid }))\n )\n\n const results = await Promise.all(fetchPromises)\n const foundTasks: TaskInfo[] = []\n const notFoundUids: string[] = []\n\n for (const result of results) {\n if (result.found && result.task) {\n foundTasks.push(result.task as TaskInfo)\n } else if (!result.found) {\n notFoundUids.push(result.uid)\n }\n }\n\n if (foundTasks.length === 0) {\n return {\n content: [{\n type: 'text',\n text: `Error: None of the specified tasks were found.\\nNot found: ${args.task_uids.join(', ')}`\n }],\n isError: true\n }\n }\n\n const taskList = foundTasks.map((task) => {\n const checkbox = task.state === 'done' ? '[x]' : '[ ]'\n const stateLabel = task.state !== 'backlog' ? ` (${task.state})` : ''\n return `- ${checkbox} **${task.uid}**: ${task.title}${stateLabel}`\n }).join('\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# Batch Get Results\n\n**Found:** ${foundTasks.length} tasks\n${taskList}\n\n${notFoundUids.length > 0 ? `**Not found:** ${notFoundUids.join(', ')}` : ''}`\n }]\n }\n } catch (error) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n }],\n isError: true\n }\n }\n }\n)\n\n// ============================================\n// Module Management Tools\n// ============================================\n\nserver.registerTool(\n 'create_module',\n {\n description: 'Create a new module in the project',\n inputSchema: {\n title: z.string().describe('Title of the module'),\n description: z.string().optional().describe('Markdown description of the module')\n }\n },\n async (args) => {\n interface CreateModuleResponse {\n success: boolean\n module?: { id: string; uid: string; title: string }\n error?: string\n }\n\n const result = await apiRequest<CreateModuleResponse>('POST', '/api/modules', {\n title: args.title,\n description_md: args.description\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Created module ${result.module?.uid}: ${result.module?.title}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'update_module',\n {\n description: 'Update module details (title, description)',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)'),\n title: z.string().optional().describe('New title for the module'),\n description: z.string().optional().describe('New markdown description')\n }\n },\n async (args) => {\n interface UpdateModuleResponse {\n success: boolean\n module?: { uid: string; title: string }\n error?: string\n }\n\n const updates: Record<string, string> = {}\n if (args.title) updates.title = args.title\n if (args.description) updates.description_md = args.description\n\n const result = await apiRequest<UpdateModuleResponse>('PATCH', `/api/modules/${args.module_uid}`, updates)\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Module ${args.module_uid} updated`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'request_review',\n {\n description: 'Move a module to review state',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface UpdateModuleResponse {\n success: boolean\n module?: { uid: string; state: string }\n error?: string\n }\n\n const result = await apiRequest<UpdateModuleResponse>('PATCH', `/api/modules/${args.module_uid}`, {\n state: 'review'\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Module ${args.module_uid} moved to review`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'mark_done',\n {\n description: 'Move a module to done state',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface UpdateModuleResponse {\n success: boolean\n module?: { uid: string; state: string }\n error?: string\n }\n\n const result = await apiRequest<UpdateModuleResponse>('PATCH', `/api/modules/${args.module_uid}`, {\n state: 'done'\n })\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Module ${args.module_uid} marked as done`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'get_module_details',\n {\n description: 'Get detailed information about a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface ModuleResponse {\n success: boolean\n module?: {\n uid: string\n title: string\n state: string\n description_md: string | null\n branch_name: string | null\n }\n error?: string\n }\n\n const result = await apiRequest<ModuleResponse>('GET', `/api/modules/${args.module_uid}`)\n\n if (!result.success || !result.module) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Module not found'}` }], isError: true }\n }\n\n const mod = result.module\n return {\n content: [{\n type: 'text',\n text: `# ${mod.uid}: ${mod.title}\n\n**State:** ${mod.state}\n**Branch:** ${mod.branch_name || '_Not set_'}\n\n${mod.description_md || '_No description_'}`\n }]\n }\n }\n)\n\n// ============================================\n// Knowledge Tools\n// ============================================\n\nserver.registerTool(\n 'get_knowledge',\n {\n description: 'Fetch a knowledge document by ID',\n inputSchema: {\n knowledge_id: z.string().describe('The ID of the knowledge document')\n }\n },\n async (args) => {\n interface KnowledgeResponse {\n success: boolean\n knowledge?: {\n id: string\n title: string\n doc_type: string\n domain: string\n sections: Array<{ heading?: string; content?: string }>\n }\n error?: string\n }\n\n const result = await apiRequest<KnowledgeResponse>('GET', `/api/knowledge/${args.knowledge_id}`)\n\n if (!result.success || !result.knowledge) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Knowledge not found'}` }], isError: true }\n }\n\n const doc = result.knowledge\n const sections = doc.sections.map(s => {\n const heading = s.heading ? `## ${s.heading}\\n\\n` : ''\n return `${heading}${s.content || ''}`\n }).join('\\n\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# ${doc.title}\n\n**Type:** ${doc.doc_type} | **Domain:** ${doc.domain}\n\n${sections}`\n }]\n }\n }\n)\n\n// EP1242: Three search tools with clear use cases for AI agents\n\nserver.registerTool(\n 'search_knowledge_semantic',\n {\n description: `Search knowledge using vector similarity (semantic/conceptual matching).\n\nUSE THIS WHEN:\n- Looking for documents about a concept: \"authentication patterns\", \"error handling\"\n- Finding related content even if exact words don't match\n- Discovering documentation about a topic\n\nDO NOT USE WHEN:\n- Looking for a specific document by ID/UID (use get_knowledge)\n- Searching for exact title match (use search_knowledge_text)`,\n inputSchema: {\n query: z.string().describe('Natural language query describing what you\\'re looking for'),\n limit: z.number().optional().describe('Maximum results (default: 10)'),\n threshold: z.number().optional().describe('Minimum similarity 0-1 (default: 0.5, lower = more results)')\n }\n },\n async (args) => {\n interface SemanticSearchResponse {\n success: boolean\n results?: Array<{\n id: string\n uid?: string\n title: string\n doc_type: string\n similarity: number\n markdown?: string\n }>\n query_info?: { took_ms: number }\n error?: string\n }\n\n const result = await apiRequest<SemanticSearchResponse>(\n 'POST',\n '/api/search/semantic',\n {\n query: args.query,\n types: ['knowledge'],\n limit: args.limit || 10,\n threshold: args.threshold || 0.5\n }\n )\n\n if (!result.success || !result.results) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Semantic search failed'}` }], isError: true }\n }\n\n if (result.results.length === 0) {\n return { content: [{ type: 'text', text: `No knowledge documents found semantically matching: \"${args.query}\"\\n\\nTry:\\n- Broader search terms\\n- Lower threshold (e.g., 0.3)\\n- Text search for exact matches` }] }\n }\n\n const list = result.results.map(r => {\n const score = Math.round(r.similarity * 100)\n const uid = r.uid ? ` (${r.uid})` : ''\n const snippet = r.markdown ? `\\n ${r.markdown.substring(0, 150)}...` : ''\n return `- **${r.title}**${uid} [${r.doc_type}, ${score}% match]${snippet}`\n }).join('\\n\\n')\n\n const timing = result.query_info ? ` (${result.query_info.took_ms}ms)` : ''\n\n return {\n content: [{\n type: 'text',\n text: `# Semantic Search Results${timing}\\n\\nQuery: \"${args.query}\"\\nFound: ${result.results.length} documents\\n\\n${list}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'search_knowledge_text',\n {\n description: `Search knowledge using text/keyword matching (fast, exact).\n\nUSE THIS WHEN:\n- Looking for documents by UID: \"K123\", \"K45\"\n- Searching for exact title: \"API Authentication Guide\"\n- Finding documents containing specific terms\n\nDO NOT USE WHEN:\n- Looking for conceptually related content (use search_knowledge_semantic)\n- Want to find documents about a topic without knowing exact words`,\n inputSchema: {\n query: z.string().describe('Text to search for (searches title, UID, domain, content)'),\n limit: z.number().optional().describe('Maximum results (default: 20)')\n }\n },\n async (args) => {\n interface TextSearchResponse {\n success: boolean\n results?: Array<{\n id: string\n uid?: string\n title: string\n doc_type?: string\n type: string\n markdown?: string\n }>\n total?: number\n error?: string\n }\n\n const result = await apiRequest<TextSearchResponse>(\n 'POST',\n '/api/search/text',\n {\n query: args.query,\n types: ['knowledge'],\n limit: args.limit || 20\n }\n )\n\n if (!result.success || !result.results) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Text search failed'}` }], isError: true }\n }\n\n if (result.results.length === 0) {\n return { content: [{ type: 'text', text: `No knowledge documents found matching: \"${args.query}\"\\n\\nTry:\\n- Different keywords\\n- Semantic search for conceptual matches` }] }\n }\n\n const list = result.results.map(r => {\n const uid = r.uid ? ` (${r.uid})` : ''\n const docType = r.doc_type ? ` [${r.doc_type}]` : ''\n const snippet = r.markdown ? `\\n ${r.markdown.substring(0, 150)}...` : ''\n return `- **${r.title}**${uid}${docType}${snippet}`\n }).join('\\n\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# Text Search Results\\n\\nQuery: \"${args.query}\"\\nFound: ${result.results.length} of ${result.total || result.results.length} documents\\n\\n${list}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'search_knowledge_hybrid',\n {\n description: `Search knowledge using both semantic AND text matching (best for general queries).\n\nCombines results using Reciprocal Rank Fusion (RRF) algorithm.\nDocuments that match BOTH semantically and textually rank highest.\n\nUSE THIS WHEN:\n- General search where you want comprehensive results\n- Not sure if semantic or text search is better\n- Want the best of both approaches\n\nThis is the recommended default search for most queries.`,\n inputSchema: {\n query: z.string().describe('Search query (will be used for both semantic and text matching)'),\n limit: z.number().optional().describe('Maximum results (default: 10)')\n }\n },\n async (args) => {\n interface SearchResult {\n id: string\n uid?: string\n title: string\n doc_type?: string\n similarity?: number\n markdown?: string\n }\n\n interface SemanticResponse {\n success: boolean\n results?: SearchResult[]\n error?: string\n }\n\n interface TextResponse {\n success: boolean\n results?: SearchResult[]\n error?: string\n }\n\n // Run both searches in parallel\n const [semanticResult, textResult] = await Promise.all([\n apiRequest<SemanticResponse>('POST', '/api/search/semantic', {\n query: args.query,\n types: ['knowledge'],\n limit: 50,\n threshold: 0.4\n }),\n apiRequest<TextResponse>('POST', '/api/search/text', {\n query: args.query,\n types: ['knowledge'],\n limit: 50\n })\n ])\n\n const semanticResults = semanticResult.success ? (semanticResult.results || []) : []\n const textResults = textResult.success ? (textResult.results || []) : []\n\n // Apply Reciprocal Rank Fusion (RRF) with k=60\n const K = 60\n const scores = new Map<string, { score: number; doc: SearchResult; sources: string[] }>()\n\n // Score semantic results\n semanticResults.forEach((doc, index) => {\n const rrfScore = 1 / (K + index + 1)\n scores.set(doc.id, { score: rrfScore, doc, sources: ['semantic'] })\n })\n\n // Score text results and merge\n textResults.forEach((doc, index) => {\n const rrfScore = 1 / (K + index + 1)\n const existing = scores.get(doc.id)\n if (existing) {\n existing.score += rrfScore\n existing.sources.push('text')\n } else {\n scores.set(doc.id, { score: rrfScore, doc, sources: ['text'] })\n }\n })\n\n // Sort by RRF score and limit\n const limit = args.limit || 10\n const ranked = Array.from(scores.values())\n .sort((a, b) => b.score - a.score)\n .slice(0, limit)\n\n if (ranked.length === 0) {\n return { content: [{ type: 'text', text: `No knowledge documents found for: \"${args.query}\"\\n\\nBoth semantic and text search returned no results.` }] }\n }\n\n const list = ranked.map(({ doc, score, sources }) => {\n const uid = doc.uid ? ` (${doc.uid})` : ''\n const docType = doc.doc_type ? ` [${doc.doc_type}]` : ''\n const matchType = sources.length === 2 ? '⭐ both' : sources[0]\n const snippet = doc.markdown ? `\\n ${doc.markdown.substring(0, 150)}...` : ''\n return `- **${doc.title}**${uid}${docType} (${matchType})${snippet}`\n }).join('\\n\\n')\n\n const bothCount = ranked.filter(r => r.sources.length === 2).length\n\n return {\n content: [{\n type: 'text',\n text: `# Hybrid Search Results (RRF)\\n\\nQuery: \"${args.query}\"\\nFound: ${ranked.length} documents (${bothCount} matched both semantic + text)\\n\\n${list}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'search_conversations',\n {\n description: `Search past agent conversations in this project.\n\nThis searches agent conversation history (agent_messages) across sessions you can access.\n\nUSE THIS WHEN:\n- The user references a prior discussion\n- You need to recover context after compaction\n- You want to find when/where something was decided`,\n inputSchema: {\n query: z.string().describe('Semantic search query'),\n limit: z.number().optional().describe('Max results (default: 10)'),\n threshold: z.number().optional().describe('Min similarity 0-1 (default: 0.5)'),\n days_back: z.number().optional().describe('Limit to recent N days (optional)'),\n session_id: z.string().optional().describe('Limit to a specific session UUID (optional)')\n }\n },\n async (args) => {\n interface ConversationSearchResponse {\n success: boolean\n results?: Array<{\n message_id: string\n session_id: string\n role: string\n content_snippet: string\n similarity: number\n created_at: string\n module_uid?: string | null\n module_title?: string | null\n agent_provider?: string\n }>\n total?: number\n error?: string\n }\n\n const result = await apiRequest<ConversationSearchResponse>(\n 'POST',\n '/api/search/conversations',\n {\n query: args.query,\n limit: args.limit || 10,\n threshold: args.threshold || 0.5,\n ...(args.days_back !== undefined ? { days_back: args.days_back } : {}),\n ...(args.session_id ? { session_id: args.session_id } : {})\n }\n )\n\n if (!result.success || !result.results) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Conversation search failed'}` }], isError: true }\n }\n\n if (result.results.length === 0) {\n return { content: [{ type: 'text', text: `No conversation messages found matching: \"${args.query}\"` }] }\n }\n\n const list = result.results.map(r => {\n const score = Math.round((r.similarity || 0) * 100)\n const moduleInfo = r.module_uid ? ` | ${r.module_uid}${r.module_title ? `: ${r.module_title}` : ''}` : ''\n const when = r.created_at ? ` | ${r.created_at}` : ''\n return `- [${r.role}, ${score}%] ${r.content_snippet}${moduleInfo}${when}`\n }).join('\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# Conversation Search Results\\n\\nQuery: \"${args.query}\"\\nFound: ${result.results.length}\\n\\n${list}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'list_linked_knowledge',\n {\n description: 'List knowledge documents linked to a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface LinkedKnowledgeResponse {\n success: boolean\n knowledge?: Array<{\n id: string\n title: string\n doc_type: string\n }>\n error?: string\n }\n\n const result = await apiRequest<LinkedKnowledgeResponse>(\n 'GET',\n `/api/modules/${args.module_uid}/knowledge`\n )\n\n if (!result.success || !result.knowledge) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Failed to fetch knowledge'}` }], isError: true }\n }\n\n if (result.knowledge.length === 0) {\n return { content: [{ type: 'text', text: 'No knowledge documents linked to this module.' }] }\n }\n\n const list = result.knowledge.map(k => `- **${k.title}** (${k.doc_type})`).join('\\n')\n\n return {\n content: [{\n type: 'text',\n text: `# Linked Knowledge for ${args.module_uid}\\n\\n${list}`\n }]\n }\n }\n)\n\nserver.registerTool(\n 'link_knowledge',\n {\n description: 'Link a knowledge document to a module',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)'),\n knowledge_id: z.string().describe('The ID of the knowledge document to link')\n }\n },\n async (args) => {\n interface LinkResponse {\n success: boolean\n error?: string\n }\n\n const result = await apiRequest<LinkResponse>(\n 'POST',\n `/api/modules/${args.module_uid}/knowledge/link`,\n { knowledge_id: args.knowledge_id }\n )\n\n if (!result.success) {\n return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Knowledge document linked to module ${args.module_uid}`\n }]\n }\n }\n)\n\n// ============================================\n// Context Tools\n// ============================================\n\nserver.registerTool(\n 'get_module_context',\n {\n description: 'Get the full context for a module (title, tasks, linked knowledge)',\n inputSchema: {\n module_uid: z.string().describe('The UID of the module (e.g., EP584)')\n }\n },\n async (args) => {\n interface ContextResponse {\n success: boolean\n context?: string\n error?: string\n }\n\n // Use the agent-accessible module context API\n const result = await apiRequest<ContextResponse>(\n 'GET',\n `/api/agent/context/module/${args.module_uid}`\n )\n\n if (!result.success || !result.context) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Failed to fetch context'}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: result.context\n }]\n }\n }\n)\n\nserver.registerTool(\n 'get_project_context',\n {\n description: 'Get the project-wide context (C2 bundle with active work, priorities)',\n inputSchema: {}\n },\n async () => {\n interface ContextResponse {\n success: boolean\n prompt?: string\n error?: string\n }\n\n // Use the agent-accessible system prompt API\n const result = await apiRequest<ContextResponse>(\n 'GET',\n '/api/agent/context/system'\n )\n\n if (!result.success || !result.prompt) {\n return { content: [{ type: 'text', text: `Error: ${result.error || 'Failed to fetch context'}` }], isError: true }\n }\n\n return {\n content: [{\n type: 'text',\n text: result.prompt\n }]\n }\n }\n)\n\n// ============================================\n// Start Server\n// ============================================\n\nasync function main() {\n const runtimeConfig = await hydrateRuntimeConfig()\n EPISODA_API_URL = runtimeConfig.apiUrl\n EPISODA_SESSION_TOKEN = runtimeConfig.sessionToken\n EPISODA_PROJECT_ID = runtimeConfig.projectId\n EPISODA_WORKSPACE_ID = runtimeConfig.workspaceId\n\n const transport = new StdioServerTransport()\n await server.connect(transport)\n\n // Log to stderr so it doesn't interfere with MCP protocol\n console.error('[episoda-workflow] MCP server started')\n console.error(`[episoda-workflow] API URL: ${EPISODA_API_URL}`)\n console.error(`[episoda-workflow] Token: ${EPISODA_SESSION_TOKEN ? '****' : 'NOT SET'}`)\n}\n\nmain().catch((error) => {\n console.error('[episoda-workflow] Fatal error:', error)\n process.exit(1)\n})\n","import * as fs from 'node:fs'\nimport * as os from 'node:os'\nimport * as path from 'node:path'\n\nconst DEFAULT_API_URL = 'https://episoda.dev'\nconst DEFAULT_CONFIG_FILE = 'config.json'\n\ninterface EpisodaLocalConfig {\n access_token?: string\n project_id?: string\n workspace_id?: string\n api_url?: string\n}\n\nexport interface RuntimeConfig {\n apiUrl: string\n sessionToken: string\n projectId: string\n workspaceId: string\n}\n\nconst normalizeEnv = (value?: string): string | undefined => {\n if (!value) return undefined\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : undefined\n}\n\nconst readEnvConfig = () => ({\n apiUrl: normalizeEnv(process.env.EPISODA_API_URL),\n sessionToken: normalizeEnv(process.env.EPISODA_SESSION_TOKEN),\n projectId: normalizeEnv(process.env.EPISODA_PROJECT_ID),\n workspaceId: normalizeEnv(process.env.EPISODA_WORKSPACE_ID)\n})\n\nconst buildMissingMessage = (missing: string[], apiUrl: string): string => {\n return [\n `[episoda-mcp] Missing auth context: ${missing.join(', ')}`,\n '[episoda-mcp] Set EPISODA_* env vars or run:',\n `[episoda-mcp] episoda auth --api-url ${apiUrl}`\n ].join('\\n')\n}\n\nconst getConfigPath = (): string => {\n // MCP supports a full-path override in addition to the core-style config dir.\n if (process.env.EPISODA_CONFIG_PATH) {\n return process.env.EPISODA_CONFIG_PATH\n }\n const configDir = process.env.EPISODA_CONFIG_DIR || path.join(os.homedir(), '.episoda')\n return path.join(configDir, DEFAULT_CONFIG_FILE)\n}\n\nconst loadLocalConfig = (): EpisodaLocalConfig | null => {\n const configPath = getConfigPath()\n if (!fs.existsSync(configPath)) {\n return null\n }\n try {\n const content = fs.readFileSync(configPath, 'utf8')\n return JSON.parse(content) as EpisodaLocalConfig\n } catch (error) {\n console.error('[episoda-mcp] Failed to load config:', error)\n return null\n }\n}\n\nexport async function resolveRuntimeConfig(): Promise<RuntimeConfig> {\n const envConfig = readEnvConfig()\n\n let fileConfig: EpisodaLocalConfig | null = null\n if (!envConfig.sessionToken || !envConfig.projectId || !envConfig.workspaceId || !envConfig.apiUrl) {\n fileConfig = loadLocalConfig()\n }\n\n const resolved: RuntimeConfig = {\n apiUrl: envConfig.apiUrl || fileConfig?.api_url || DEFAULT_API_URL,\n sessionToken: envConfig.sessionToken || fileConfig?.access_token || '',\n projectId: envConfig.projectId || fileConfig?.project_id || '',\n workspaceId: envConfig.workspaceId || fileConfig?.workspace_id || ''\n }\n\n const missing: string[] = []\n if (!resolved.sessionToken) missing.push('EPISODA_SESSION_TOKEN')\n if (!resolved.projectId) missing.push('EPISODA_PROJECT_ID')\n if (!resolved.workspaceId) missing.push('EPISODA_WORKSPACE_ID')\n\n if (missing.length > 0) {\n throw new Error(buildMissingMessage(missing, resolved.apiUrl))\n }\n\n return resolved\n}\n\nexport async function hydrateRuntimeConfig(): Promise<RuntimeConfig> {\n const resolved = await resolveRuntimeConfig()\n\n if (!normalizeEnv(process.env.EPISODA_API_URL)) {\n process.env.EPISODA_API_URL = resolved.apiUrl\n }\n if (!normalizeEnv(process.env.EPISODA_SESSION_TOKEN)) {\n process.env.EPISODA_SESSION_TOKEN = resolved.sessionToken\n }\n if (!normalizeEnv(process.env.EPISODA_PROJECT_ID)) {\n process.env.EPISODA_PROJECT_ID = resolved.projectId\n }\n if (!normalizeEnv(process.env.EPISODA_WORKSPACE_ID)) {\n process.env.EPISODA_WORKSPACE_ID = resolved.workspaceId\n }\n\n return resolved\n}\n"],"mappings":"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","names":["path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@episoda/mcp",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "description": "Episoda MCP servers for workflow, git, and dev operations",
5
5
  "type": "module",
6
6
  "bin": "dist/cli.js",