import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import type { McpDependencies } from '../server/mcp-server.js';
import { proxyCallInput } from './schemas.js';
import { chat } from '../services/ollama-client.js';
import { estimateTokens } from '../utils/tokens.js';
import { auditToolCall } from '../middleware/audit.js';
import { logger } from '../utils/logger.js';
export function registerProxyCall(server: McpServer, deps: McpDependencies): void {
server.registerTool('proxy_call', {
description:
'Call a tool on a configured sub-MCP server. Optionally post-process the result to reduce tokens.',
inputSchema: proxyCallInput,
}, async (args, extra) => {
const start = Date.now();
const { server: serverName, tool, arguments: toolArgs = {}, post_process = 'auto' } = args;
try {
// Call the sub-MCP tool
const result = await deps.proxyManager.callTool(serverName, tool, toolArgs);
const resultText = JSON.stringify(result);
// Determine post-processing
let finalText = resultText;
const tokens = estimateTokens(resultText);
const shouldCompress =
post_process === 'compress' ||
post_process === 'summarize' ||
(post_process === 'auto' && tokens > 2000);
if (shouldCompress && tokens > 500) {
const prompt =
post_process === 'summarize' || post_process === 'auto'
? 'Summarize the following tool output concisely, preserving all key information:'
: 'Compress the following tool output into bullet points:';
finalText = await chat([
{ role: 'system', content: `${prompt}\nKeep output under 500 tokens.` },
{ role: 'user', content: resultText },
]);
}
auditToolCall(
deps.db,
'proxy_call',
extra.sessionId,
`${serverName}.${tool}`,
`${estimateTokens(finalText)} tokens`,
Date.now() - start
);
return { content: [{ type: 'text' as const, text: finalText }] };
} catch (err) {
const msg = err instanceof Error ? err.message : String(err);
logger.error({ err, serverName, tool }, 'proxy.call failed');
auditToolCall(deps.db, 'proxy_call', extra.sessionId, `${serverName}.${tool}`, `error: ${msg}`, Date.now() - start);
return { content: [{ type: 'text' as const, text: `Error: ${msg}` }], isError: true };
}
});
}