import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { chromium } from "playwright"; // Or use SSE transport for HTTP-based MCP on HF Spaces import express from "express"; import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js"; const app = express(); const server = new McpServer({ name: "playwright-mcp", version: "1.0.0" }); // Register a tool example server.tool("navigate", { url: { type: "string" } }, async ({ url }) => { const browser = await chromium.launch({ headless: true, args: [ "--no-sandbox", // Required in containers "--disable-setuid-sandbox", "--disable-dev-shm-usage", // Prevents /dev/shm OOM crashes "--disable-gpu", "--single-process", ], }); const page = await browser.newPage(); await page.goto(url); const title = await page.title(); await browser.close(); return { content: [{ type: "text", text: `Title: ${title}` }] }; }); // SSE endpoint for MCP over HTTP app.get("/sse", async (req, res) => { const transport = new SSEServerTransport("/message", res); await server.connect(transport); }); app.post("/message", express.json(), async (req, res) => { // handle message }); app.listen(process.env.PORT || 7860, () => { console.log(`MCP server running on port ${process.env.PORT}`); });