@mcpjam/inspector 0.2.2 → 0.2.4

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.
@@ -1282,12 +1282,18 @@ video {
1282
1282
  .max-h-\[300px\] {
1283
1283
  max-height: 300px;
1284
1284
  }
1285
+ .max-h-\[90vh\] {
1286
+ max-height: 90vh;
1287
+ }
1285
1288
  .max-h-screen {
1286
1289
  max-height: 100vh;
1287
1290
  }
1288
1291
  .min-h-0 {
1289
1292
  min-height: 0px;
1290
1293
  }
1294
+ .min-h-\[200px\] {
1295
+ min-height: 200px;
1296
+ }
1291
1297
  .min-h-\[48px\] {
1292
1298
  min-height: 48px;
1293
1299
  }
@@ -1379,6 +1385,9 @@ video {
1379
1385
  .max-w-4xl {
1380
1386
  max-width: 56rem;
1381
1387
  }
1388
+ .max-w-6xl {
1389
+ max-width: 72rem;
1390
+ }
1382
1391
  .max-w-\[75\%\] {
1383
1392
  max-width: 75%;
1384
1393
  }
@@ -1627,6 +1636,9 @@ video {
1627
1636
  .rounded {
1628
1637
  border-radius: 0.25rem;
1629
1638
  }
1639
+ .rounded-2xl {
1640
+ border-radius: 1rem;
1641
+ }
1630
1642
  .rounded-full {
1631
1643
  border-radius: 9999px;
1632
1644
  }
@@ -1686,6 +1698,9 @@ video {
1686
1698
  .border-border\/50 {
1687
1699
  border-color: hsl(var(--border) / 0.5);
1688
1700
  }
1701
+ .border-current {
1702
+ border-color: currentColor;
1703
+ }
1689
1704
  .border-destructive {
1690
1705
  border-color: hsl(var(--destructive));
1691
1706
  }
@@ -1717,6 +1732,9 @@ video {
1717
1732
  .border-primary {
1718
1733
  border-color: hsl(var(--primary));
1719
1734
  }
1735
+ .border-primary\/20 {
1736
+ border-color: hsl(var(--primary) / 0.2);
1737
+ }
1720
1738
  .border-red-200 {
1721
1739
  --tw-border-opacity: 1;
1722
1740
  border-color: rgb(254 202 202 / var(--tw-border-opacity, 1));
@@ -1806,6 +1824,10 @@ video {
1806
1824
  .bg-green-50\/80 {
1807
1825
  background-color: rgb(240 253 244 / 0.8);
1808
1826
  }
1827
+ .bg-green-500 {
1828
+ --tw-bg-opacity: 1;
1829
+ background-color: rgb(34 197 94 / var(--tw-bg-opacity, 1));
1830
+ }
1809
1831
  .bg-muted {
1810
1832
  background-color: hsl(var(--muted));
1811
1833
  }
@@ -1897,11 +1919,26 @@ video {
1897
1919
  --tw-gradient-to: hsl(var(--background) / 0) var(--tw-gradient-to-position);
1898
1920
  --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
1899
1921
  }
1922
+ .from-blue-600 {
1923
+ --tw-gradient-from: #2563eb var(--tw-gradient-from-position);
1924
+ --tw-gradient-to: rgb(37 99 235 / 0) var(--tw-gradient-to-position);
1925
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
1926
+ }
1927
+ .from-card\/80 {
1928
+ --tw-gradient-from: hsl(var(--card) / 0.8) var(--tw-gradient-from-position);
1929
+ --tw-gradient-to: hsl(var(--card) / 0) var(--tw-gradient-to-position);
1930
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
1931
+ }
1900
1932
  .from-card\/95 {
1901
1933
  --tw-gradient-from: hsl(var(--card) / 0.95) var(--tw-gradient-from-position);
1902
1934
  --tw-gradient-to: hsl(var(--card) / 0) var(--tw-gradient-to-position);
1903
1935
  --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
1904
1936
  }
1937
+ .from-gray-700 {
1938
+ --tw-gradient-from: #374151 var(--tw-gradient-from-position);
1939
+ --tw-gradient-to: rgb(55 65 81 / 0) var(--tw-gradient-to-position);
1940
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
1941
+ }
1905
1942
  .from-muted\/20 {
1906
1943
  --tw-gradient-from: hsl(var(--muted) / 0.2) var(--tw-gradient-from-position);
1907
1944
  --tw-gradient-to: hsl(var(--muted) / 0) var(--tw-gradient-to-position);
@@ -1970,12 +2007,21 @@ video {
1970
2007
  .to-background\/60 {
1971
2008
  --tw-gradient-to: hsl(var(--background) / 0.6) var(--tw-gradient-to-position);
1972
2009
  }
2010
+ .to-blue-700 {
2011
+ --tw-gradient-to: #1d4ed8 var(--tw-gradient-to-position);
2012
+ }
2013
+ .to-card\/60 {
2014
+ --tw-gradient-to: hsl(var(--card) / 0.6) var(--tw-gradient-to-position);
2015
+ }
1973
2016
  .to-card\/95 {
1974
2017
  --tw-gradient-to: hsl(var(--card) / 0.95) var(--tw-gradient-to-position);
1975
2018
  }
1976
2019
  .to-gray-100 {
1977
2020
  --tw-gradient-to: #f3f4f6 var(--tw-gradient-to-position);
1978
2021
  }
2022
+ .to-gray-900 {
2023
+ --tw-gradient-to: #111827 var(--tw-gradient-to-position);
2024
+ }
1979
2025
  .to-muted\/20 {
1980
2026
  --tw-gradient-to: hsl(var(--muted) / 0.2) var(--tw-gradient-to-position);
1981
2027
  }
@@ -2106,6 +2152,9 @@ video {
2106
2152
  .pb-1\.5 {
2107
2153
  padding-bottom: 0.375rem;
2108
2154
  }
2155
+ .pb-4 {
2156
+ padding-bottom: 1rem;
2157
+ }
2109
2158
  .pl-2 {
2110
2159
  padding-left: 0.5rem;
2111
2160
  }
@@ -2620,6 +2669,11 @@ h1 {
2620
2669
  color: rgb(148 163 184 / var(--tw-text-opacity, 1));
2621
2670
  }
2622
2671
 
2672
+ .hover\:-translate-y-0\.5:hover {
2673
+ --tw-translate-y: -0.125rem;
2674
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
2675
+ }
2676
+
2623
2677
  .hover\:border-\[\#646cff\]:hover {
2624
2678
  --tw-border-opacity: 1;
2625
2679
  border-color: rgb(100 108 255 / var(--tw-border-opacity, 1));
@@ -2682,6 +2736,10 @@ h1 {
2682
2736
  background-color: hsl(var(--muted));
2683
2737
  }
2684
2738
 
2739
+ .hover\:bg-muted-foreground\/10:hover {
2740
+ background-color: hsl(var(--muted-foreground) / 0.1);
2741
+ }
2742
+
2685
2743
  .hover\:bg-muted\/30:hover {
2686
2744
  background-color: hsl(var(--muted) / 0.3);
2687
2745
  }
@@ -2724,6 +2782,11 @@ h1 {
2724
2782
  background-color: rgb(241 245 249 / 0.5);
2725
2783
  }
2726
2784
 
2785
+ .hover\:bg-slate-200:hover {
2786
+ --tw-bg-opacity: 1;
2787
+ background-color: rgb(226 232 240 / var(--tw-bg-opacity, 1));
2788
+ }
2789
+
2727
2790
  .hover\:bg-slate-50:hover {
2728
2791
  --tw-bg-opacity: 1;
2729
2792
  background-color: rgb(248 250 252 / var(--tw-bg-opacity, 1));
@@ -2738,6 +2801,12 @@ h1 {
2738
2801
  background-image: linear-gradient(to right, var(--tw-gradient-stops));
2739
2802
  }
2740
2803
 
2804
+ .hover\:from-blue-700:hover {
2805
+ --tw-gradient-from: #1d4ed8 var(--tw-gradient-from-position);
2806
+ --tw-gradient-to: rgb(29 78 216 / 0) var(--tw-gradient-to-position);
2807
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
2808
+ }
2809
+
2741
2810
  .hover\:from-muted\/30:hover {
2742
2811
  --tw-gradient-from: hsl(var(--muted) / 0.3) var(--tw-gradient-from-position);
2743
2812
  --tw-gradient-to: hsl(var(--muted) / 0) var(--tw-gradient-to-position);
@@ -2755,6 +2824,10 @@ h1 {
2755
2824
  --tw-gradient-stops: var(--tw-gradient-from), hsl(var(--muted) / 0.4) var(--tw-gradient-via-position), var(--tw-gradient-to);
2756
2825
  }
2757
2826
 
2827
+ .hover\:to-blue-800:hover {
2828
+ --tw-gradient-to: #1e40af var(--tw-gradient-to-position);
2829
+ }
2830
+
2758
2831
  .hover\:to-muted\/30:hover {
2759
2832
  --tw-gradient-to: hsl(var(--muted) / 0.3) var(--tw-gradient-to-position);
2760
2833
  }
@@ -3533,6 +3606,16 @@ h1 {
3533
3606
  background-color: rgb(226 232 240 / var(--tw-bg-opacity, 1));
3534
3607
  }
3535
3608
 
3609
+ .dark\:hover\:bg-slate-600:hover:is(.dark *) {
3610
+ --tw-bg-opacity: 1;
3611
+ background-color: rgb(71 85 105 / var(--tw-bg-opacity, 1));
3612
+ }
3613
+
3614
+ .dark\:hover\:bg-slate-700:hover:is(.dark *) {
3615
+ --tw-bg-opacity: 1;
3616
+ background-color: rgb(51 65 85 / var(--tw-bg-opacity, 1));
3617
+ }
3618
+
3536
3619
  .dark\:hover\:bg-slate-700\/30:hover:is(.dark *) {
3537
3620
  background-color: rgb(51 65 85 / 0.3);
3538
3621
  }
@@ -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-BwJsKGKK.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-C9Kqkwaq.css">
8
+ <script type="module" crossorigin src="/assets/index-CLxTHffA.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-ebsMqCvj.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.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "MCPJam inspector",
5
5
  "license": "Apache-2.0",
6
6
  "author": "MCPJam (https://mcpjam.com)",
@@ -38,7 +38,6 @@ app.use((req, res, next) => {
38
38
  const webAppTransports = new Map(); // Transports by sessionId
39
39
  const createTransport = async (req) => {
40
40
  const query = req.query;
41
- console.log("Query parameters:", query);
42
41
  const transportType = query.transportType;
43
42
  if (transportType === "stdio") {
44
43
  const command = query.command;
@@ -46,7 +45,7 @@ const createTransport = async (req) => {
46
45
  const queryEnv = query.env ? JSON.parse(query.env) : {};
47
46
  const env = { ...process.env, ...defaultEnvironment, ...queryEnv };
48
47
  const { cmd, args } = findActualExecutable(command, origArgs);
49
- console.log(`Stdio transport: command=${cmd}, args=${args}`);
48
+ console.log(`🚀 Stdio transport: command=${cmd}, args=${args}`);
50
49
  const transport = new StdioClientTransport({
51
50
  command: cmd,
52
51
  args,
@@ -54,7 +53,6 @@ const createTransport = async (req) => {
54
53
  stderr: "pipe",
55
54
  });
56
55
  await transport.start();
57
- console.log("Spawned stdio transport");
58
56
  return transport;
59
57
  }
60
58
  else if (transportType === "sse") {
@@ -69,7 +67,6 @@ const createTransport = async (req) => {
69
67
  const value = req.headers[key];
70
68
  headers[key] = Array.isArray(value) ? value[value.length - 1] : value;
71
69
  }
72
- console.log(`SSE transport: url=${url}, headers=${Object.keys(headers)}`);
73
70
  const transport = new SSEClientTransport(new URL(url), {
74
71
  eventSourceInit: {
75
72
  fetch: (url, init) => fetch(url, { ...init, headers }),
@@ -79,7 +76,6 @@ const createTransport = async (req) => {
79
76
  },
80
77
  });
81
78
  await transport.start();
82
- console.log("Connected to SSE transport");
83
79
  return transport;
84
80
  }
85
81
  else if (transportType === "streamable-http") {
@@ -99,18 +95,17 @@ const createTransport = async (req) => {
99
95
  },
100
96
  });
101
97
  await transport.start();
102
- console.log("Connected to Streamable HTTP transport");
103
98
  return transport;
104
99
  }
105
100
  else {
106
- console.error(`Invalid transport type: ${transportType}`);
101
+ console.error(`❌ Invalid transport type: ${transportType}`);
107
102
  throw new Error("Invalid transport type specified");
108
103
  }
109
104
  };
110
105
  let backingServerTransport;
111
106
  app.get("/mcp", async (req, res) => {
112
107
  const sessionId = req.headers["mcp-session-id"];
113
- console.log(`Received GET message for sessionId ${sessionId}`);
108
+ console.log(`📥 Received GET message for sessionId ${sessionId}`);
114
109
  try {
115
110
  const transport = webAppTransports.get(sessionId);
116
111
  if (!transport) {
@@ -122,34 +117,34 @@ app.get("/mcp", async (req, res) => {
122
117
  }
123
118
  }
124
119
  catch (error) {
125
- console.error("Error in /mcp route:", error);
120
+ console.error("Error in /mcp route:", error);
126
121
  res.status(500).json(error);
127
122
  }
128
123
  });
129
124
  app.post("/mcp", async (req, res) => {
130
125
  const sessionId = req.headers["mcp-session-id"];
131
- console.log(`Received POST message for sessionId ${sessionId}`);
126
+ console.log(`📥 Received POST message for sessionId ${sessionId}`);
132
127
  if (!sessionId) {
133
128
  try {
134
- console.log("New streamable-http connection");
129
+ console.log("🔄 New streamable-http connection");
135
130
  try {
136
131
  await backingServerTransport?.close();
137
132
  backingServerTransport = await createTransport(req);
138
133
  }
139
134
  catch (error) {
140
135
  if (error instanceof SseError && error.code === 401) {
141
- console.error("Received 401 Unauthorized from MCP server:", error.message);
136
+ console.error("🔒 Received 401 Unauthorized from MCP server:", error.message);
142
137
  res.status(401).json(error);
143
138
  return;
144
139
  }
145
140
  throw error;
146
141
  }
147
- console.log("Connected MCP client to backing server transport");
142
+ console.log("Connected MCP client to backing server transport");
148
143
  const webAppTransport = new StreamableHTTPServerTransport({
149
144
  sessionIdGenerator: randomUUID,
150
145
  onsessioninitialized: (sessionId) => {
151
146
  webAppTransports.set(sessionId, webAppTransport);
152
- console.log("Created streamable web app transport " + sessionId);
147
+ console.log("Created streamable web app transport " + sessionId);
153
148
  },
154
149
  });
155
150
  await webAppTransport.start();
@@ -160,7 +155,7 @@ app.post("/mcp", async (req, res) => {
160
155
  await webAppTransport.handleRequest(req, res, req.body);
161
156
  }
162
157
  catch (error) {
163
- console.error("Error in /mcp POST route:", error);
158
+ console.error("Error in /mcp POST route:", error);
164
159
  res.status(500).json(error);
165
160
  }
166
161
  }
@@ -175,30 +170,28 @@ app.post("/mcp", async (req, res) => {
175
170
  }
176
171
  }
177
172
  catch (error) {
178
- console.error("Error in /mcp route:", error);
173
+ console.error("Error in /mcp route:", error);
179
174
  res.status(500).json(error);
180
175
  }
181
176
  }
182
177
  });
183
178
  app.get("/stdio", async (req, res) => {
184
179
  try {
185
- console.log("New connection");
180
+ console.log("🔄 New connection");
186
181
  try {
187
182
  await backingServerTransport?.close();
188
183
  backingServerTransport = await createTransport(req);
189
184
  }
190
185
  catch (error) {
191
186
  if (error instanceof SseError && error.code === 401) {
192
- console.error("Received 401 Unauthorized from MCP server:", error.message);
187
+ console.error("🔒 Received 401 Unauthorized from MCP server:", error.message);
193
188
  res.status(401).json(error);
194
189
  return;
195
190
  }
196
191
  throw error;
197
192
  }
198
- console.log("Connected MCP client to backing server transport");
199
193
  const webAppTransport = new SSEServerTransport("/message", res);
200
194
  webAppTransports.set(webAppTransport.sessionId, webAppTransport);
201
- console.log("Created web app transport");
202
195
  await webAppTransport.start();
203
196
  backingServerTransport.stderr.on("data", (chunk) => {
204
197
  webAppTransport.send({
@@ -213,48 +206,43 @@ app.get("/stdio", async (req, res) => {
213
206
  transportToClient: webAppTransport,
214
207
  transportToServer: backingServerTransport,
215
208
  });
216
- console.log("Set up MCP proxy");
217
209
  }
218
210
  catch (error) {
219
- console.error("Error in /stdio route:", error);
211
+ console.error("Error in /stdio route:", error);
220
212
  res.status(500).json(error);
221
213
  }
222
214
  });
223
215
  app.get("/sse", async (req, res) => {
224
216
  try {
225
- console.log("New SSE connection. NOTE: The sse transport is deprecated and has been replaced by streamable-http");
226
217
  try {
227
218
  await backingServerTransport?.close();
228
219
  backingServerTransport = await createTransport(req);
229
220
  }
230
221
  catch (error) {
231
222
  if (error instanceof SseError && error.code === 401) {
232
- console.error("Received 401 Unauthorized from MCP server:", error.message);
223
+ console.error("🔒 Received 401 Unauthorized from MCP server:", error.message);
233
224
  res.status(401).json(error);
234
225
  return;
235
226
  }
236
227
  throw error;
237
228
  }
238
- console.log("Connected MCP client to backing server transport");
239
229
  const webAppTransport = new SSEServerTransport("/message", res);
240
230
  webAppTransports.set(webAppTransport.sessionId, webAppTransport);
241
- console.log("Created web app transport");
242
231
  await webAppTransport.start();
243
232
  mcpProxy({
244
233
  transportToClient: webAppTransport,
245
234
  transportToServer: backingServerTransport,
246
235
  });
247
- console.log("Set up MCP proxy");
248
236
  }
249
237
  catch (error) {
250
- console.error("Error in /sse route:", error);
238
+ console.error("Error in /sse route:", error);
251
239
  res.status(500).json(error);
252
240
  }
253
241
  });
254
242
  app.post("/message", async (req, res) => {
255
243
  try {
256
244
  const sessionId = req.query.sessionId;
257
- console.log(`Received message for sessionId ${sessionId}`);
245
+ console.log(`📥 Received message for sessionId ${sessionId}`);
258
246
  const transport = webAppTransports.get(sessionId);
259
247
  if (!transport) {
260
248
  res.status(404).end("Session not found");
@@ -263,7 +251,7 @@ app.post("/message", async (req, res) => {
263
251
  await transport.handlePostMessage(req, res);
264
252
  }
265
253
  catch (error) {
266
- console.error("Error in /message route:", error);
254
+ console.error("Error in /message route:", error);
267
255
  res.status(500).json(error);
268
256
  }
269
257
  });
@@ -281,7 +269,7 @@ app.get("/config", (req, res) => {
281
269
  });
282
270
  }
283
271
  catch (error) {
284
- console.error("Error in /config route:", error);
272
+ console.error("Error in /config route:", error);
285
273
  res.status(500).json(error);
286
274
  }
287
275
  });
@@ -295,10 +283,12 @@ const findAvailablePort = async (startPort) => {
295
283
  resolve(port);
296
284
  });
297
285
  });
298
- server.on('error', (err) => {
299
- if (err.code === 'EADDRINUSE') {
286
+ server.on("error", (err) => {
287
+ if (err.code === "EADDRINUSE") {
300
288
  // Port is in use, try the next one
301
- findAvailablePort(startPort + 1).then(resolve).catch(reject);
289
+ findAvailablePort(startPort + 1)
290
+ .then(resolve)
291
+ .catch(reject);
302
292
  }
303
293
  else {
304
294
  reject(err);
@@ -316,7 +306,7 @@ const startServer = async () => {
316
306
  if (availablePort !== Number(PORT)) {
317
307
  console.log(`⚠️ Port ${PORT} was in use, using available port ${availablePort} instead`);
318
308
  }
319
- console.log(`⚙️ Proxy server listening on port ${availablePort}`);
309
+ console.log(`\x1b[32m%s\x1b[0m`, `⚙️ Proxy server listening on port ${availablePort}`);
320
310
  });
321
311
  server.on("error", (err) => {
322
312
  console.error(`❌ Server error: ${err.message}`);