@mcp-ts/sdk 1.5.0 → 1.5.1
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/dist/client/react.d.mts +81 -2
- package/dist/client/react.d.ts +81 -2
- package/dist/client/react.js +316 -3
- package/dist/client/react.js.map +1 -1
- package/dist/client/react.mjs +312 -4
- package/dist/client/react.mjs.map +1 -1
- package/dist/client/vue.js +11 -2
- package/dist/client/vue.js.map +1 -1
- package/dist/client/vue.mjs +11 -2
- package/dist/client/vue.mjs.map +1 -1
- package/dist/index.js +55 -11
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +55 -11
- package/dist/index.mjs.map +1 -1
- package/dist/server/index.js +55 -11
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +55 -11
- package/dist/server/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/client/react/index.ts +14 -0
- package/src/client/react/oauth-popup.tsx +446 -0
- package/src/client/react/use-mcp.ts +36 -3
- package/src/client/vue/use-mcp.ts +38 -3
- package/src/server/handlers/sse-handler.ts +39 -0
- package/src/server/mcp/oauth-client.ts +32 -14
- package/supabase/migrations/20260421010000_add_session_cleanup_cron.sql +32 -0
package/dist/index.mjs
CHANGED
|
@@ -1716,13 +1716,8 @@ var MCPClient = class _MCPClient {
|
|
|
1716
1716
|
this.transportType = transportType;
|
|
1717
1717
|
this.emitStateChange("CONNECTED");
|
|
1718
1718
|
this.emitProgress("Connected successfully");
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
const needsTtlPromotion = !existingSession || existingSession.active !== true;
|
|
1722
|
-
if (needsTransportUpdate || needsTtlPromotion) {
|
|
1723
|
-
console.log(`[MCPClient] Saving session ${this.sessionId} with 12hr TTL (connect success)`);
|
|
1724
|
-
await this.saveSession(SESSION_TTL_SECONDS, true);
|
|
1725
|
-
}
|
|
1719
|
+
console.log(`[MCPClient] Saving session ${this.sessionId} with 12hr TTL (connect success)`);
|
|
1720
|
+
await this.saveSession(SESSION_TTL_SECONDS, true);
|
|
1726
1721
|
} catch (error) {
|
|
1727
1722
|
if (error instanceof UnauthorizedError$1 || error instanceof Error && error.message.toLowerCase().includes("unauthorized")) {
|
|
1728
1723
|
let authUrl = "";
|
|
@@ -1760,6 +1755,13 @@ var MCPClient = class _MCPClient {
|
|
|
1760
1755
|
const errorMessage = error instanceof Error ? error.message : "Connection failed";
|
|
1761
1756
|
this.emitError(errorMessage, "connection");
|
|
1762
1757
|
this.emitStateChange("FAILED");
|
|
1758
|
+
try {
|
|
1759
|
+
const existingSession = await storage.getSession(this.identity, this.sessionId);
|
|
1760
|
+
if (!existingSession || existingSession.active !== true) {
|
|
1761
|
+
await storage.removeSession(this.identity, this.sessionId);
|
|
1762
|
+
}
|
|
1763
|
+
} catch {
|
|
1764
|
+
}
|
|
1763
1765
|
throw error;
|
|
1764
1766
|
}
|
|
1765
1767
|
}
|
|
@@ -1783,6 +1785,7 @@ var MCPClient = class _MCPClient {
|
|
|
1783
1785
|
const transportsToTry = this.transportType ? [this.transportType] : ["streamable_http", "sse"];
|
|
1784
1786
|
let lastError;
|
|
1785
1787
|
let tokensExchanged = false;
|
|
1788
|
+
let authenticatedStateEmitted = false;
|
|
1786
1789
|
for (const currentType of transportsToTry) {
|
|
1787
1790
|
const isLastAttempt = currentType === transportsToTry[transportsToTry.length - 1];
|
|
1788
1791
|
try {
|
|
@@ -1794,8 +1797,10 @@ var MCPClient = class _MCPClient {
|
|
|
1794
1797
|
} else {
|
|
1795
1798
|
this.emitProgress(`Tokens already exchanged, skipping auth step for ${currentType}...`);
|
|
1796
1799
|
}
|
|
1797
|
-
|
|
1798
|
-
|
|
1800
|
+
if (!authenticatedStateEmitted) {
|
|
1801
|
+
this.emitStateChange("AUTHENTICATED");
|
|
1802
|
+
authenticatedStateEmitted = true;
|
|
1803
|
+
}
|
|
1799
1804
|
this.emitProgress("Creating authenticated client...");
|
|
1800
1805
|
this.client = new Client(
|
|
1801
1806
|
{
|
|
@@ -1814,6 +1819,7 @@ var MCPClient = class _MCPClient {
|
|
|
1814
1819
|
);
|
|
1815
1820
|
this.emitStateChange("CONNECTING");
|
|
1816
1821
|
await this.client.connect(this.transport);
|
|
1822
|
+
this.transportType = currentType;
|
|
1817
1823
|
this.emitStateChange("CONNECTED");
|
|
1818
1824
|
console.log(`[MCPClient] Updating session ${this.sessionId} to 12hr TTL (OAuth complete)`);
|
|
1819
1825
|
await this.saveSession(SESSION_TTL_SECONDS, true);
|
|
@@ -2680,9 +2686,23 @@ var SSEConnectionManager = class {
|
|
|
2680
2686
|
if (existing) {
|
|
2681
2687
|
return existing;
|
|
2682
2688
|
}
|
|
2689
|
+
const session = await storage.getSession(this.identity, sessionId);
|
|
2690
|
+
if (!session) {
|
|
2691
|
+
throw new Error("Session not found");
|
|
2692
|
+
}
|
|
2683
2693
|
const client = new MCPClient({
|
|
2684
2694
|
identity: this.identity,
|
|
2685
|
-
sessionId
|
|
2695
|
+
sessionId,
|
|
2696
|
+
// These fields are optional in MCPClient, but when rehydrating a known
|
|
2697
|
+
// stored session on the server we pass them explicitly to preserve the
|
|
2698
|
+
// original transport/connection metadata instead of relying on lazy
|
|
2699
|
+
// reloading during initialize().
|
|
2700
|
+
serverId: session.serverId,
|
|
2701
|
+
serverName: session.serverName,
|
|
2702
|
+
serverUrl: session.serverUrl,
|
|
2703
|
+
callbackUrl: session.callbackUrl,
|
|
2704
|
+
transportType: session.transportType,
|
|
2705
|
+
headers: session.headers
|
|
2686
2706
|
});
|
|
2687
2707
|
client.onConnectionEvent((event) => this.emitConnectionEvent(event));
|
|
2688
2708
|
client.onObservabilityEvent((event) => this.sendEvent(event));
|
|
@@ -2739,6 +2759,16 @@ var SSEConnectionManager = class {
|
|
|
2739
2759
|
const client = new MCPClient({
|
|
2740
2760
|
identity: this.identity,
|
|
2741
2761
|
sessionId,
|
|
2762
|
+
// These fields are optional in MCPClient, but when rehydrating a known
|
|
2763
|
+
// stored session on the server we pass them explicitly to preserve the
|
|
2764
|
+
// original transport/connection metadata instead of relying on lazy
|
|
2765
|
+
// reloading during initialize().
|
|
2766
|
+
serverId: session.serverId,
|
|
2767
|
+
serverName: session.serverName,
|
|
2768
|
+
serverUrl: session.serverUrl,
|
|
2769
|
+
callbackUrl: session.callbackUrl,
|
|
2770
|
+
transportType: session.transportType,
|
|
2771
|
+
headers: session.headers,
|
|
2742
2772
|
...clientMetadata
|
|
2743
2773
|
});
|
|
2744
2774
|
client.onConnectionEvent((event) => this.emitConnectionEvent(event));
|
|
@@ -2771,7 +2801,21 @@ var SSEConnectionManager = class {
|
|
|
2771
2801
|
try {
|
|
2772
2802
|
const client = new MCPClient({
|
|
2773
2803
|
identity: this.identity,
|
|
2774
|
-
sessionId
|
|
2804
|
+
sessionId,
|
|
2805
|
+
// These fields are optional in MCPClient, but when rehydrating a known
|
|
2806
|
+
// stored session on the server we pass them explicitly to preserve the
|
|
2807
|
+
// original connection metadata instead of relying on lazy
|
|
2808
|
+
// reloading during initialize().
|
|
2809
|
+
serverId: session.serverId,
|
|
2810
|
+
serverName: session.serverName,
|
|
2811
|
+
serverUrl: session.serverUrl,
|
|
2812
|
+
callbackUrl: session.callbackUrl,
|
|
2813
|
+
// NOTE: transportType is intentionally omitted here.
|
|
2814
|
+
// The session's stored transportType is a placeholder ('streamable_http')
|
|
2815
|
+
// set before transport negotiation. Omitting it lets MCPClient auto-negotiate
|
|
2816
|
+
// (try streamable_http → SSE fallback), which is critical for servers like
|
|
2817
|
+
// Neon that only support SSE transport.
|
|
2818
|
+
headers: session.headers
|
|
2775
2819
|
});
|
|
2776
2820
|
client.onConnectionEvent((event) => this.emitConnectionEvent(event));
|
|
2777
2821
|
await client.finishAuth(code);
|