mcp-locale.test.ts•4.41 kB
import { describe, it, expect } from 'vitest';
import { spawn } from 'child_process';
describe('MCP Locale Feature Integration', () => {
it('should provide locale parameter in MCP tools/list response', async () => {
const result = await new Promise<any>((resolve, reject) => {
const server = spawn('node', ['dist/bin/llmresearcher.js', '--mcp'], {
stdio: ['pipe', 'pipe', 'pipe']
});
let responseData = '';
let timeoutId: NodeJS.Timeout;
const cleanup = () => {
clearTimeout(timeoutId);
server.kill();
};
server.stdout.on('data', (data) => {
responseData += data.toString();
try {
const response = JSON.parse(responseData.trim());
cleanup();
resolve(response);
} catch (e) {
// Not complete JSON yet, continue waiting
}
});
server.stderr.on('data', (data) => {
const errorMsg = data.toString();
if (errorMsg.includes('MCP Research Server running')) {
const listToolsRequest = {
jsonrpc: "2.0",
id: 1,
method: "tools/list"
};
server.stdin.write(JSON.stringify(listToolsRequest) + '\n');
}
});
server.on('error', (err) => {
cleanup();
reject(err);
});
timeoutId = setTimeout(() => {
cleanup();
reject(new Error('Timeout waiting for server response'));
}, 10000);
});
// Verify response structure
expect(result.result).toBeDefined();
expect(result.result.tools).toBeDefined();
expect(result.result.tools).toHaveLength(2);
// Find DuckDuckGo tool
const duckduckgoTool = result.result.tools.find((tool: any) => tool.name === 'duckduckgo_web_search');
expect(duckduckgoTool).toBeDefined();
// Check locale parameter
const properties = duckduckgoTool.inputSchema.properties;
expect(properties.locale).toBeDefined();
expect(properties.locale.type).toBe('string');
expect(properties.locale.default).toBe('wt-wt');
expect(properties.locale.enum).toBeDefined();
expect(properties.locale.enum.length).toBe(5);
// Check specific locales
expect(properties.locale.enum).toContain('wt-wt');
expect(properties.locale.enum).toContain('us-en');
expect(properties.locale.enum).toContain('uk-en');
expect(properties.locale.enum).toContain('jp-jp');
expect(properties.locale.enum).toContain('cn-zh');
}, 15000);
it('should have correct parameter structure for duckduckgo_web_search', async () => {
const result = await new Promise<any>((resolve, reject) => {
const server = spawn('node', ['dist/bin/llmresearcher.js', '--mcp'], {
stdio: ['pipe', 'pipe', 'pipe']
});
let responseData = '';
let timeoutId: NodeJS.Timeout;
const cleanup = () => {
clearTimeout(timeoutId);
server.kill();
};
server.stdout.on('data', (data) => {
responseData += data.toString();
try {
const response = JSON.parse(responseData.trim());
cleanup();
resolve(response);
} catch (e) {
// Not complete JSON yet
}
});
server.stderr.on('data', (data) => {
const errorMsg = data.toString();
if (errorMsg.includes('MCP Research Server running')) {
const listToolsRequest = {
jsonrpc: "2.0",
id: 1,
method: "tools/list"
};
server.stdin.write(JSON.stringify(listToolsRequest) + '\n');
}
});
server.on('error', (err) => {
cleanup();
reject(err);
});
timeoutId = setTimeout(() => {
cleanup();
reject(new Error('Timeout'));
}, 10000);
});
const duckduckgoTool = result.result.tools.find((tool: any) => tool.name === 'duckduckgo_web_search');
const properties = duckduckgoTool.inputSchema.properties;
// Check all expected properties exist
expect(Object.keys(properties)).toEqual(['query', 'next', 'locale']);
// Check required parameters
expect(duckduckgoTool.inputSchema.required).toEqual(['query']);
// Verify locale parameter details
expect(properties.locale.description).toContain('DuckDuckGo locale');
expect(properties.locale.description).toContain('region-specific');
}, 15000);
});