Minesweeper MCP Server
by tonypan2
Verified
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from "@modelcontextprotocol/sdk/types.js";
const server = new Server({
name: "minesweeper-mcp-server",
version: "1.0.0",
}, {
capabilities: {
tools: {},
},
});
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
{
name: "start_game",
description: "Start a new game of Minesweeper",
inputSchema: {
type: "object",
properties: {},
required: [],
},
},
{
name: "click",
description: "Click at a cell on the Minesweeper board",
inputSchema: {
type: "object",
properties: {
row: { type: "number" },
col: { type: "number" },
},
required: ["row", "col"],
},
},
{
name: "flag",
description: "Place a flag at a cell on the Minesweeper board",
inputSchema: {
type: "object",
properties: {
row: { type: "number" },
col: { type: "number" },
},
required: ["row", "col"],
},
},
{
name: "unflag",
description: "Remove the flag at a cell on the Minesweeper board",
inputSchema: {
type: "object",
properties: {
row: { type: "number" },
col: { type: "number" },
},
required: ["row", "col"],
},
},
],
};
});
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const args = request.params.arguments;
const row = args?.row;
const col = args?.col;
let url = new URL("http://localhost:5000/api/play");
if (request.params.name === "start_game") {
url.searchParams.set("new", "1");
}
else if (request.params.name === "click") {
url.searchParams.set("reveal", "1");
url.searchParams.set("pos", `${row},${col}`);
}
else if (request.params.name === "flag") {
url.searchParams.set("flag", "1");
url.searchParams.set("pos", `${row},${col}`);
}
else if (request.params.name === "unflag") {
url.searchParams.set("unflag", "1");
url.searchParams.set("pos", `${row},${col}`);
}
else {
throw new McpError(ErrorCode.InternalError, "Tool not found");
}
const response = await fetch(url, {
headers: {
Accept: "image/png",
},
});
if (!response.ok) {
throw new McpError(ErrorCode.InternalError, "Game server failed.");
}
const blob = await response.blob();
const buffer = Buffer.from(await blob.arrayBuffer());
return {
content: [
{
type: "image",
data: buffer.toString("base64"),
mimeType: "image/png",
},
],
isError: false,
};
});
const transport = new StdioServerTransport();
await server.connect(transport);