mcp-framework
Version:
Framework for building Model Context Protocol (MCP) servers in Typescript
70 lines (69 loc) • 1.97 kB
JavaScript
import { StdioServerTransport as SDKStdioTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { DEFAULT_IMAGE_OPTIONS, hasImageContent, prepareImageForTransport } from "../utils/image-handler.js";
import { logger } from "../../core/Logger.js";
/**
* StdioServerTransport
*/
export class StdioServerTransport {
type = "stdio";
transport;
running = false;
imageOptions;
constructor(imageOptions = {}) {
this.transport = new SDKStdioTransport();
this.imageOptions = {
...DEFAULT_IMAGE_OPTIONS,
...imageOptions
};
}
async start() {
await this.transport.start();
this.running = true;
}
async send(message) {
try {
if (hasImageContent(message)) {
message = this.prepareMessageWithImage(message);
}
await this.transport.send(message);
}
catch (error) {
logger.error(`Error sending message through stdio transport: ${error}`);
throw error;
}
}
prepareMessageWithImage(message) {
if (!message.result?.content) {
return message;
}
const processedContent = message.result.content.map((item) => {
if (item.type === 'image') {
return prepareImageForTransport(item, this.imageOptions);
}
return item;
});
return {
...message,
result: {
...message.result,
content: processedContent
}
};
}
async close() {
await this.transport.close();
this.running = false;
}
isRunning() {
return this.running;
}
set onclose(handler) {
this.transport.onclose = handler;
}
set onerror(handler) {
this.transport.onerror = handler;
}
set onmessage(handler) {
this.transport.onmessage = handler;
}
}