debug-client.js•4.43 kB
// Debug client for MCP server communication
import axios from 'axios';
import https from 'https';
class MCPDebugClient {
constructor(baseUrl = 'http://localhost:5002') {
this.baseUrl = baseUrl;
this.axios = axios.create({
baseURL: baseUrl,
headers: {
'Content-Type': 'application/json',
},
// Disable SSL verification for local testing
httpsAgent: new https.Agent({
rejectUnauthorized: false
})
});
}
async sendRequest(method, params = {}, sessionId = null) {
const requestId = Date.now();
const requestData = {
jsonrpc: '2.0',
method,
params,
id: requestId
};
const headers = {};
if (sessionId) {
headers['mcp-session-id'] = sessionId;
}
console.log('\n=== Sending Request ===');
console.log('URL:', `${this.baseUrl}/mcp`);
console.log('Headers:', JSON.stringify(headers, null, 2));
console.log('Body:', JSON.stringify(requestData, null, 2));
try {
const response = await this.axios.post('/mcp', requestData, {
headers,
// Get raw response to access headers
transformResponse: (res) => res,
// Increase timeout
timeout: 10000
});
console.log('\n=== Response ===');
console.log('Status:', response.status, response.statusText);
console.log('Headers:', JSON.stringify(response.headers, null, 2));
let responseData;
try {
responseData = typeof response.data === 'string'
? JSON.parse(response.data)
: response.data;
console.log('Data:', JSON.stringify(responseData, null, 2));
} catch (e) {
console.log('Raw Data:', response.data);
throw new Error('Failed to parse response as JSON');
}
// Check for JSON-RPC error
if (responseData && responseData.error) {
console.error('JSON-RPC Error:', responseData.error);
throw new Error(`JSON-RPC Error (${responseData.error.code}): ${responseData.error.message}`);
}
return {
headers: response.headers,
data: responseData,
status: response.status,
statusText: response.statusText
};
} catch (error) {
console.error('\n=== Request Failed ===');
if (error.response) {
// The request was made and the server responded with a status code
// that falls out of the range of 2xx
console.error('Response Status:', error.response.status);
console.error('Response Headers:', error.response.headers);
console.error('Response Data:', error.response.data);
} else if (error.request) {
// The request was made but no response was received
console.error('No response received:', error.request);
} else {
// Something happened in setting up the request that triggered an Error
console.error('Request setup error:', error.message);
}
console.error('Error details:', error.config);
throw error;
}
}
}
// Example usage
async function main() {
const client = new MCPDebugClient();
try {
// 1. Try to initialize a session
console.log('\n=== Testing MCP Server ===');
console.log('1. Attempting to initialize session...');
const initResponse = await client.sendRequest('mcp.initialize', {});
const sessionId = initResponse.headers['mcp-session-id'];
if (!sessionId) {
throw new Error('No session ID received in response');
}
console.log('\nSession established. Session ID:', sessionId);
// 2. List available tools
console.log('\n2. Listing available tools...');
const toolsResponse = await client.sendRequest('mcp.list_tools', {}, sessionId);
console.log('Available tools:', JSON.stringify(toolsResponse.data, null, 2));
// 3. Try to call spiderfoot_ping
console.log('\n3. Calling spiderfoot_ping...');
const pingResponse = await client.sendRequest('mcp.call_tool', {
name: 'spiderfoot_ping',
parameters: {}
}, sessionId);
console.log('Ping response:', JSON.stringify(pingResponse.data, null, 2));
} catch (error) {
console.error('\n=== Test Failed ===');
console.error(error.message);
process.exit(1);
}
}
// Run the example if this file is executed directly
if (import.meta.url === `file://${process.argv[1]}`) {
main();
}
export default MCPDebugClient;