# Task ID: 52 **Title:** Implement tool call intercept with briefing injection **Status:** done **Dependencies:** 50 ✓, 51 ✓ **Priority:** high **Description:** When a gated session calls a tool without first calling begin_session, intercept the call, extract keywords, match prompts, and inject the briefing alongside the real tool result. **Details:** 1. Implement handleInterceptedCall in `/src/mcplocal/src/router.ts`: ```typescript async handleInterceptedCall( sessionId: string, toolName: string, args: any ): Promise { // 1. Extract keywords from tool call const keywords = this.keywordExtractor.extractKeywords(toolName, args); // 2. Match prompts using keywords const { fullContent, indexOnly, remaining } = await this.promptSelector.selectPrompts(keywords, this.promptIndex); // 3. Execute the actual tool call const actualResult = await this.routeToolCall(toolName, args); // 4. Build briefing with intercept preamble const briefing = this.buildBriefing(fullContent, indexOnly, remaining, 'intercept'); // 5. Ungate session this.ungateSession(sessionId); // 6. Send notifications/tools/list_changed await this.sendToolsListChanged(); // 7. Return combined result return { content: [{ type: 'text', text: `${briefing}\n\n---\n\n${actualResult.content[0].text}` }] }; } ``` 2. Use gate-intercept-preamble system prompt for the briefing prefix **Test Strategy:** - Unit test: Tool call while gated triggers intercept - Unit test: Keywords extracted from tool name and args - Unit test: Prompts matched using extracted keywords - Unit test: Actual tool still executes and returns result - Unit test: Briefing prepended to tool result - Unit test: Session ungated after intercept - Unit test: notifications/tools/list_changed sent - Unit test: Intercept preamble included in briefing - Integration test: End-to-end intercept flow