@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.
- package/client/bin/start.js +28 -4
- package/client/dist/assets/{OAuthCallback-B9WXxW14.js → OAuthCallback-DkLMDxkx.js} +1 -1
- package/client/dist/assets/{OAuthDebugCallback-Dypsoomr.js → OAuthDebugCallback-DaNmVTKt.js} +1 -1
- package/client/dist/assets/{index-BwJsKGKK.js → index-CLxTHffA.js} +1593 -314
- package/client/dist/assets/{index-C9Kqkwaq.css → index-ebsMqCvj.css} +83 -0
- package/client/dist/index.html +2 -2
- package/package.json +1 -1
- package/server/build/index.js +25 -35
|
@@ -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
|
}
|
package/client/dist/index.html
CHANGED
|
@@ -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-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
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
package/server/build/index.js
CHANGED
|
@@ -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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
299
|
-
if (err.code ===
|
|
286
|
+
server.on("error", (err) => {
|
|
287
|
+
if (err.code === "EADDRINUSE") {
|
|
300
288
|
// Port is in use, try the next one
|
|
301
|
-
findAvailablePort(startPort + 1)
|
|
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}`);
|