Fix MCP tool naming for OpenRouter API compatibility

- Change tool name separator from dot to double underscore (server__tool)
- Update tool discovery to use server__tool_name format
- Update tool execution routing to parse double underscore separator
- Fix OpenRouter API error: tool names must match pattern '^[a-zA-Z0-9_-]{1,64}'

This resolves the silent failure when MCP tools were present in conversations.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Jerome 2025-06-12 12:06:06 +01:00
commit 0a06544bda
No known key found for this signature in database
2 changed files with 9 additions and 8 deletions

View file

@ -225,10 +225,10 @@ export function useAgentLoop(config: Partial<AgentLoopConfig> = {}): UseAgentLoo
return { result }; return { result };
} }
// Check if it's an MCP tool (prefixed with server name) // Check if it's an MCP tool (prefixed with server name using double underscore)
if (toolCall.function.name.includes('.')) { if (toolCall.function.name.includes('__')) {
// Extract server name from tool name (format: "server.tool_name") // Extract server name from tool name (format: "server__tool_name")
const [serverName] = toolCall.function.name.split('.'); const [serverName] = toolCall.function.name.split('__');
// Find the connection ID for this server name // Find the connection ID for this server name
const connection = connections.find(conn => conn.name === serverName); const connection = connections.find(conn => conn.name === serverName);

View file

@ -581,10 +581,11 @@ export class MCPConnectionManager implements MCPConnectionManager {
const result = await this.client.listTools(); const result = await this.client.listTools();
// Transform MCP tools to our Tool interface with name prefixing // Transform MCP tools to our Tool interface with name prefixing
// Use double underscore instead of dot to comply with OpenRouter API requirements
return result.tools.map(tool => ({ return result.tools.map(tool => ({
type: 'function' as const, type: 'function' as const,
function: { function: {
name: `${this.connection.name}.${tool.name}`, name: `${this.connection.name}__${tool.name}`,
description: `[${this.connection.name}] ${tool.description || ''}`, description: `[${this.connection.name}] ${tool.description || ''}`,
parameters: tool.inputSchema || {}, parameters: tool.inputSchema || {},
}, },
@ -636,9 +637,9 @@ export class MCPConnectionManager implements MCPConnectionManager {
throw new Error('Client not connected'); throw new Error('Client not connected');
} }
// Remove the server prefix from the tool name // Remove the server prefix from the tool name (using double underscore separator)
const unprefixedName = toolName.startsWith(`${this.connection.name}.`) const unprefixedName = toolName.startsWith(`${this.connection.name}__`)
? toolName.slice(this.connection.name.length + 1) ? toolName.slice(this.connection.name.length + 2)
: toolName; : toolName;
try { try {