@mcpjam/inspector 0.1.6 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,8 +5,8 @@
5
5
  <link rel="icon" type="image/svg+xml" href="/mcp_jam.svg" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>MCPJam Inspector</title>
8
- <script type="module" crossorigin src="/assets/index-CV_1RAbM.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-CmBOF7JI.css">
8
+ <script type="module" crossorigin src="/assets/index-DJQtmX5A.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-CGJXsF8q.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcpjam/inspector",
3
- "version": "0.1.6",
3
+ "version": "0.2.0",
4
4
  "description": "MCPJam inspector",
5
5
  "license": "Apache-2.0",
6
6
  "author": "MCPJam (https://mcpjam.com)",
@@ -2,6 +2,7 @@
2
2
  import cors from "cors";
3
3
  import { parseArgs } from "node:util";
4
4
  import { parse as shellParseArgs } from "shell-quote";
5
+ import { createServer } from "node:net";
5
6
  import { SSEClientTransport, SseError, } from "@modelcontextprotocol/sdk/client/sse.js";
6
7
  import { StdioClientTransport, getDefaultEnvironment, } from "@modelcontextprotocol/sdk/client/stdio.js";
7
8
  import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
@@ -284,17 +285,47 @@ app.get("/config", (req, res) => {
284
285
  res.status(500).json(error);
285
286
  }
286
287
  });
288
+ // Function to find an available port
289
+ const findAvailablePort = async (startPort) => {
290
+ return new Promise((resolve, reject) => {
291
+ const server = createServer();
292
+ server.listen(startPort, () => {
293
+ const port = server.address()?.port;
294
+ server.close(() => {
295
+ resolve(port);
296
+ });
297
+ });
298
+ server.on('error', (err) => {
299
+ if (err.code === 'EADDRINUSE') {
300
+ // Port is in use, try the next one
301
+ findAvailablePort(startPort + 1).then(resolve).catch(reject);
302
+ }
303
+ else {
304
+ reject(err);
305
+ }
306
+ });
307
+ });
308
+ };
287
309
  const PORT = process.env.PORT || 6277;
288
- const server = app.listen(PORT);
289
- server.on("listening", () => {
290
- console.log(`⚙️ Proxy server listening on port ${PORT}`);
291
- });
292
- server.on("error", (err) => {
293
- if (err.message.includes(`EADDRINUSE`)) {
294
- console.error(`❌ Proxy Server PORT IS IN USE at port ${PORT} ❌ `);
310
+ // Start server with dynamic port finding
311
+ const startServer = async () => {
312
+ try {
313
+ const availablePort = await findAvailablePort(Number(PORT));
314
+ const server = app.listen(availablePort);
315
+ server.on("listening", () => {
316
+ if (availablePort !== Number(PORT)) {
317
+ console.log(`⚠️ Port ${PORT} was in use, using available port ${availablePort} instead`);
318
+ }
319
+ console.log(`⚙️ Proxy server listening on port ${availablePort}`);
320
+ });
321
+ server.on("error", (err) => {
322
+ console.error(`❌ Server error: ${err.message}`);
323
+ process.exit(1);
324
+ });
295
325
  }
296
- else {
297
- console.error(err.message);
326
+ catch (error) {
327
+ console.error(`❌ Failed to start server: ${error}`);
328
+ process.exit(1);
298
329
  }
299
- process.exit(1);
300
- });
330
+ };
331
+ startServer();