PHPocalypse-MCP
by plapinski
Verified
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { config } from "./config.js";
import { executeCommand } from './command.js';
import InMemoryResultsStorage from "./cache.js";
import {
ListToolsRequestSchema,
CallToolRequestSchema,
ReadResourceRequestSchema,
ListResourcesRequestSchema
} from "@modelcontextprotocol/sdk/types.js";
import { describe } from "node:test";
const resultsStorage = new InMemoryResultsStorage();
const server = new Server(
{
name: "PHPocalypse MCP",
version: "0.0.2"
},
{
capabilities: {
tools: {},
resources: {}
}
}
);
interface ServerTool {
name: string;
description: string;
inputSchema: object;
};
interface ServerResource {
uri: string;
name: string;
description: string;
mimeType: "application/octet-stream" | "text/plain" | "application/json";
}
let tools: ServerTool[] = [];
let resources: ServerResource[] = [];
for (const tool of config.parsed.tools) {
tools.push({
name: tool.name,
description: "Todo description",
inputSchema: {type: "object", properties: {}}
});
resources.push({
uri: `output://tool/${tool.name}`,
name: `Recent output of ${tool.name}`,
description: `Recent output of ${tool.name}`,
mimeType: "application/octet-stream"
});
}
server.setRequestHandler(ListToolsRequestSchema, async () => { return {tools: tools} });
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const toolName = request.params.name;
const command = config.parsed.tools.find(tool => tool.name === toolName)?.command;
if (!command) {
throw new Error(`Tool ${toolName} not found`);
}
const commandResult = await executeCommand(command);
resultsStorage.set(toolName, commandResult);
return {
content: [
{
type: "text",
text: JSON.stringify(commandResult)
}
]
};
});
server.setRequestHandler(ListResourcesRequestSchema, async (request) => { return { resources: resources } });
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
const uri = request.params.uri;
const toolName = uri.split("/")[3];
return {
contents: [{
uri: uri,
text: JSON.stringify(await resultsStorage.get(toolName)),
}]
};
});
const transport = new StdioServerTransport();
await server.connect(transport);