File size: 1,419 Bytes
931fb4a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 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}`);
}); |