Files
broswer-automation/app/remote-server/test-streamable-http-client.js

133 lines
3.3 KiB
JavaScript

/**
* Test client for Streamable HTTP connection
*/
import fetch from 'node-fetch';
import { EventSource } from 'eventsource';
const SERVER_URL = 'http://localhost:3001';
const MCP_URL = `${SERVER_URL}/mcp`;
console.log('🔌 Testing Streamable HTTP connection...');
let sessionId = null;
async function testStreamableHttp() {
try {
// Step 1: Send initialization request
console.log('🚀 Sending initialization request...');
const initMessage = {
jsonrpc: '2.0',
id: 1,
method: 'initialize',
params: {
protocolVersion: '2024-11-05',
capabilities: {
tools: {},
},
clientInfo: {
name: 'test-streamable-http-client',
version: '1.0.0',
},
},
};
const initResponse = await fetch(MCP_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Accept: 'application/json, text/event-stream',
},
body: JSON.stringify(initMessage),
});
if (!initResponse.ok) {
throw new Error(`Initialization failed: ${initResponse.status} ${initResponse.statusText}`);
}
// Extract session ID from response headers
sessionId = initResponse.headers.get('mcp-session-id');
console.log(`✅ Initialization successful! Session ID: ${sessionId}`);
const initResult = await initResponse.text();
console.log('📨 Initialization response (SSE):', initResult);
// Step 2: Establish SSE stream for this session
console.log('🔌 Establishing SSE stream...');
const eventSource = new EventSource(MCP_URL, {
headers: {
'MCP-Session-ID': sessionId,
},
});
eventSource.onopen = () => {
console.log('✅ SSE stream established!');
// Test listing tools after stream is ready
setTimeout(() => testListTools(), 1000);
};
eventSource.onmessage = (event) => {
try {
const data = JSON.parse(event.data);
console.log('📨 Received streaming message:', JSON.stringify(data, null, 2));
} catch (error) {
console.log('📨 Received streaming data:', event.data);
}
};
eventSource.onerror = (error) => {
console.error('❌ SSE stream error:', error);
};
// Close after 10 seconds
setTimeout(() => {
console.log('⏰ Closing connections...');
eventSource.close();
process.exit(0);
}, 10000);
} catch (error) {
console.error('❌ Error in streamable HTTP test:', error);
process.exit(1);
}
}
async function testListTools() {
if (!sessionId) {
console.error('❌ No session ID available');
return;
}
console.log('📋 Testing tools/list via Streamable HTTP...');
const message = {
jsonrpc: '2.0',
id: 2,
method: 'tools/list',
params: {},
};
try {
const response = await fetch(MCP_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'MCP-Session-ID': sessionId,
},
body: JSON.stringify(message),
});
if (!response.ok) {
console.error('❌ Failed to send tools/list:', response.status, response.statusText);
} else {
console.log('✅ tools/list message sent successfully');
}
} catch (error) {
console.error('❌ Error sending tools/list:', error);
}
}
// Start the test
testStreamableHttp();