@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/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
- const existingSession = await storage.getSession(this.identity, this.sessionId);
1720
- const needsTransportUpdate = !existingSession || existingSession.transportType !== this.transportType;
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
- this.transportType = currentType;
1798
- this.emitStateChange("AUTHENTICATED");
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);