playwright-mcp
Version:
Playwright integration for ModelContext
125 lines (119 loc) • 3.77 kB
JavaScript
; 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);
});