mcp-server-tester-sse-http-stdio
Version:
MCP Server Tester with SSE support - Test MCP servers using HTTP, SSE, and STDIO transports
104 lines (103 loc) • 3.2 kB
JavaScript
/**
* Utility functions for formatting conversation messages for console output
*/
/**
* Format a conversation array into human-readable console output
*/
export function formatConversation(messages, prompt) {
const output = [];
// Add horizontal line at the start
output.push(formatText('─'.repeat(60)));
// Include initial prompt if provided
if (prompt) {
output.push(formatRole('user'));
output.push(formatText(prompt));
output.push('');
}
messages.forEach(msg => {
// Format role header
const roleDisplay = formatRole(msg.role);
output.push(roleDisplay);
// Format content
const contentLines = formatContent(msg.content);
output.push(...contentLines);
// Handle legacy tool invocations
if (msg.toolInvocations && msg.toolInvocations.length > 0) {
msg.toolInvocations.forEach(tool => {
const toolLine = formatToolCall(tool.toolName, tool.args);
output.push(toolLine);
});
}
// Add space between messages
output.push('');
});
// Add horizontal line at the end
output.push(formatText('─'.repeat(60)));
return output;
}
/**
* Format role with appropriate colors
*/
export function formatRole(role) {
switch (role) {
case 'user':
return '\x1b[32m[USER]\x1b[0m'; // Green
case 'assistant':
return '\x1b[36m[ASSISTANT]\x1b[0m'; // Cyan
case 'system':
return '\x1b[33m[SYSTEM]\x1b[0m'; // Yellow
case 'tool':
return '\x1b[35m[TOOL]\x1b[0m'; // Magenta
default:
return `\x1b[37m[${role.toUpperCase()}]\x1b[0m`; // White
}
}
/**
* Format text content with darker color
*/
export function formatText(text) {
return `\x1b[90m${text}\x1b[0m`; // Dark gray/dim
}
/**
* Format content based on type
*/
export function formatContent(content) {
const lines = [];
if (typeof content === 'string') {
lines.push(formatText(content));
}
else if (Array.isArray(content)) {
// Handle content array (multimodal messages)
content.forEach((part) => {
if (part.type === 'text') {
lines.push(formatText(part.text));
}
else if (part.type === 'tool-call') {
const toolLine = formatToolCall(part.toolName, part.args);
lines.push(toolLine);
}
else if (part.type === 'tool-result') {
const resultLine = formatToolResult(part.result);
lines.push(resultLine);
}
});
}
else {
// Fallback for other content types
lines.push(formatText(JSON.stringify(content)));
}
return lines;
}
/**
* Format tool call
*/
export function formatToolCall(toolName, args) {
const argsStr = JSON.stringify(args, null, 2);
return formatText(`🔧 Tool Call: ${toolName}(${argsStr})`);
}
/**
* Format tool result
*/
export function formatToolResult(result) {
return formatText(`✅ Tool Result: ${JSON.stringify(result.structuredContent ?? result.content, null, 2)}`);
}