UNPKG

playwright-mcp

Version:
125 lines (119 loc) 3.77 kB
#!/usr/bin/env node "use strict"; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _chunkMFGVNJVLcjs = require('./chunk-MFGVNJVL.cjs'); require('./chunk-V6YYWYKP.cjs'); // src/server.ts var _stdiojs = require('@modelcontextprotocol/sdk/server/stdio.js'); // src/web-server.ts var _http = require('http'); var _http2 = _interopRequireDefault(_http); var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _url = require('url'); var _url2 = _interopRequireDefault(_url); var _net = require('net'); var _net2 = _interopRequireDefault(_net); var __filename = _url.fileURLToPath.call(void 0, import.meta.url); var __dirname = _path.dirname.call(void 0, __filename); var SERVE_DIR = _path2.default.join(__dirname, "ui"); async function isPortInUse(port) { return new Promise((resolve) => { const tester = _net2.default.createServer().once("error", () => resolve(true)).once("listening", () => { tester.once("close", () => resolve(false)); tester.close(); }).listen(port); }); } var server2 = _http2.default.createServer((req, res) => { const parsedUrl = _url2.default.parse(req.url || ""); const pathname = parsedUrl.pathname || "/"; let filePath = _path2.default.join(SERVE_DIR, pathname); if (!filePath.startsWith(SERVE_DIR)) { res.writeHead(403, { "Content-Type": "text/plain" }); res.end("403 Forbidden: Access denied"); return; } if (pathname.endsWith("/")) { filePath = _path2.default.join(filePath, "index.html"); } _fs2.default.stat(filePath, (err, stats) => { if (err) { res.writeHead(404, { "Content-Type": "text/plain" }); res.end("404 Not Found"); return; } if (stats.isDirectory()) { filePath = _path2.default.join(filePath, "index.html"); _fs2.default.stat(filePath, (err2, stats2) => { if (err2) { res.writeHead(404, { "Content-Type": "text/plain" }); res.end("404 Not Found"); return; } serveFile(filePath, res); }); } else { serveFile(filePath, res); } }); }); function serveFile(filePath, res) { const ext = _path2.default.extname(filePath); let contentType = "text/plain"; switch (ext) { case ".html": contentType = "text/html"; break; case ".css": contentType = "text/css"; break; case ".js": contentType = "application/javascript"; break; case ".json": contentType = "application/json"; break; case ".png": contentType = "image/png"; break; case ".jpg": case ".jpeg": contentType = "image/jpeg"; break; case ".gif": contentType = "image/gif"; break; case ".svg": contentType = "image/svg+xml"; break; case ".pdf": contentType = "application/pdf"; break; } _fs2.default.readFile(filePath, (err, data) => { if (err) { res.writeHead(500, { "Content-Type": "text/plain" }); res.end("Internal Server Error"); return; } res.writeHead(200, { "Content-Type": contentType }); res.end(data); }); } // src/server.ts async function main() { const transport = new (0, _stdiojs.StdioServerTransport)(); await _chunkMFGVNJVLcjs.server.connect(transport); console.error("MCP Server started"); if (true) { const portInUse = await isPortInUse(5174); if (!portInUse) { server2.listen(5174, () => { console.error("Web server started"); }); } else { console.error("Port 5174 is in use, skipping web server"); } } } main().catch((error) => { console.error("Fatal error in main", error); process.exit(1); });