Merge pull request #224 from cliffhall/fix-214

Gracefully handle proxy server and inspector client startup errors
This commit is contained in:
Cliff Hall
2025-03-31 12:29:15 -04:00
committed by GitHub
4 changed files with 61 additions and 49 deletions

View File

@@ -7,7 +7,7 @@ import { fileURLToPath } from "url";
const __dirname = dirname(fileURLToPath(import.meta.url));
function delay(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
return new Promise((resolve) => setTimeout(resolve, ms, true));
}
async function main() {
@@ -73,8 +73,9 @@ async function main() {
cancelled = true;
abort.abort();
});
const server = spawnPromise(
let server, serverOk;
try {
server = spawnPromise(
"node",
[
inspectorServerPath,
@@ -92,24 +93,21 @@ async function main() {
},
);
const client = spawnPromise("node", [inspectorClientPath], {
// Make sure server started before starting client
serverOk = await Promise.race([server, delay(2 * 1000)]);
} catch (error) {}
if (serverOk) {
try {
await spawnPromise("node", [inspectorClientPath], {
env: { ...process.env, PORT: CLIENT_PORT },
signal: abort.signal,
echoOutput: true,
});
// Make sure our server/client didn't immediately fail
await Promise.any([server, client, delay(2 * 1000)]);
const portParam = SERVER_PORT === "3000" ? "" : `?proxyPort=${SERVER_PORT}`;
console.log(
`\n🔍 MCP Inspector is up and running at http://127.0.0.1:${CLIENT_PORT}${portParam} 🚀`,
);
try {
await Promise.any([server, client]);
} catch (e) {
if (!cancelled || process.env.DEBUG) throw e;
}
}
return 0;
}

View File

@@ -16,4 +16,18 @@ const server = http.createServer((request, response) => {
});
const port = process.env.PORT || 5173;
server.listen(port, () => {});
server.on("listening", () => {
console.log(
`🔍 MCP Inspector is up and running at http://127.0.0.1:${port} 🚀`,
);
});
server.on("error", (err) => {
if (err.message.includes(`EADDRINUSE`)) {
console.error(
`❌ MCP Inspector PORT IS IN USE at http://127.0.0.1:${port}`,
);
} else {
throw err;
}
});
server.listen(port);

View File

@@ -18,7 +18,7 @@
"dev": "vite",
"build": "tsc -b && vite build",
"lint": "eslint .",
"preview": "vite preview",
"preview": "vite preview --port 5173",
"test": "jest --config jest.config.cjs",
"test:watch": "jest --config jest.config.cjs --watch"
},

View File

@@ -184,15 +184,15 @@ app.get("/config", (req, res) => {
const PORT = process.env.PORT || 3000;
try {
const server = app.listen(PORT);
server.on("listening", () => {
const addr = server.address();
const port = typeof addr === "string" ? addr : addr?.port;
console.log(`Proxy server listening on port ${port}`);
console.log(`⚙️ Proxy server listening on port ${PORT}`);
});
} catch (error) {
console.error("Failed to start server:", error);
process.exit(1);
server.on("error", (err) => {
if (err.message.includes(`EADDRINUSE`)) {
console.error(`❌ Proxy Server PORT IS IN USE at port ${PORT}`);
} else {
console.error(err.message);
}
process.exit(1);
});