@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.
@@ -1645,13 +1645,8 @@ var MCPClient = class _MCPClient {
1645
1645
  this.transportType = transportType;
1646
1646
  this.emitStateChange("CONNECTED");
1647
1647
  this.emitProgress("Connected successfully");
1648
- const existingSession = await storage.getSession(this.identity, this.sessionId);
1649
- const needsTransportUpdate = !existingSession || existingSession.transportType !== this.transportType;
1650
- const needsTtlPromotion = !existingSession || existingSession.active !== true;
1651
- if (needsTransportUpdate || needsTtlPromotion) {
1652
- console.log(`[MCPClient] Saving session ${this.sessionId} with 12hr TTL (connect success)`);
1653
- await this.saveSession(SESSION_TTL_SECONDS, true);
1654
- }
1648
+ console.log(`[MCPClient] Saving session ${this.sessionId} with 12hr TTL (connect success)`);
1649
+ await this.saveSession(SESSION_TTL_SECONDS, true);
1655
1650
  } catch (error) {
1656
1651
  if (error instanceof UnauthorizedError$1 || error instanceof Error && error.message.toLowerCase().includes("unauthorized")) {
1657
1652
  let authUrl = "";
@@ -1689,6 +1684,13 @@ var MCPClient = class _MCPClient {
1689
1684
  const errorMessage = error instanceof Error ? error.message : "Connection failed";
1690
1685
  this.emitError(errorMessage, "connection");
1691
1686
  this.emitStateChange("FAILED");
1687
+ try {
1688
+ const existingSession = await storage.getSession(this.identity, this.sessionId);
1689
+ if (!existingSession || existingSession.active !== true) {
1690
+ await storage.removeSession(this.identity, this.sessionId);
1691
+ }
1692
+ } catch {
1693
+ }
1692
1694
  throw error;
1693
1695
  }
1694
1696
  }
@@ -1712,6 +1714,7 @@ var MCPClient = class _MCPClient {
1712
1714
  const transportsToTry = this.transportType ? [this.transportType] : ["streamable_http", "sse"];
1713
1715
  let lastError;
1714
1716
  let tokensExchanged = false;
1717
+ let authenticatedStateEmitted = false;
1715
1718
  for (const currentType of transportsToTry) {
1716
1719
  const isLastAttempt = currentType === transportsToTry[transportsToTry.length - 1];
1717
1720
  try {
@@ -1723,8 +1726,10 @@ var MCPClient = class _MCPClient {
1723
1726
  } else {
1724
1727
  this.emitProgress(`Tokens already exchanged, skipping auth step for ${currentType}...`);
1725
1728
  }
1726
- this.transportType = currentType;
1727
- this.emitStateChange("AUTHENTICATED");
1729
+ if (!authenticatedStateEmitted) {
1730
+ this.emitStateChange("AUTHENTICATED");
1731
+ authenticatedStateEmitted = true;
1732
+ }
1728
1733
  this.emitProgress("Creating authenticated client...");
1729
1734
  this.client = new Client(
1730
1735
  {
@@ -1743,6 +1748,7 @@ var MCPClient = class _MCPClient {
1743
1748
  );
1744
1749
  this.emitStateChange("CONNECTING");
1745
1750
  await this.client.connect(this.transport);
1751
+ this.transportType = currentType;
1746
1752
  this.emitStateChange("CONNECTED");
1747
1753
  console.log(`[MCPClient] Updating session ${this.sessionId} to 12hr TTL (OAuth complete)`);
1748
1754
  await this.saveSession(SESSION_TTL_SECONDS, true);
@@ -2609,9 +2615,23 @@ var SSEConnectionManager = class {
2609
2615
  if (existing) {
2610
2616
  return existing;
2611
2617
  }
2618
+ const session = await storage.getSession(this.identity, sessionId);
2619
+ if (!session) {
2620
+ throw new Error("Session not found");
2621
+ }
2612
2622
  const client = new MCPClient({
2613
2623
  identity: this.identity,
2614
- sessionId
2624
+ sessionId,
2625
+ // These fields are optional in MCPClient, but when rehydrating a known
2626
+ // stored session on the server we pass them explicitly to preserve the
2627
+ // original transport/connection metadata instead of relying on lazy
2628
+ // reloading during initialize().
2629
+ serverId: session.serverId,
2630
+ serverName: session.serverName,
2631
+ serverUrl: session.serverUrl,
2632
+ callbackUrl: session.callbackUrl,
2633
+ transportType: session.transportType,
2634
+ headers: session.headers
2615
2635
  });
2616
2636
  client.onConnectionEvent((event) => this.emitConnectionEvent(event));
2617
2637
  client.onObservabilityEvent((event) => this.sendEvent(event));
@@ -2668,6 +2688,16 @@ var SSEConnectionManager = class {
2668
2688
  const client = new MCPClient({
2669
2689
  identity: this.identity,
2670
2690
  sessionId,
2691
+ // These fields are optional in MCPClient, but when rehydrating a known
2692
+ // stored session on the server we pass them explicitly to preserve the
2693
+ // original transport/connection metadata instead of relying on lazy
2694
+ // reloading during initialize().
2695
+ serverId: session.serverId,
2696
+ serverName: session.serverName,
2697
+ serverUrl: session.serverUrl,
2698
+ callbackUrl: session.callbackUrl,
2699
+ transportType: session.transportType,
2700
+ headers: session.headers,
2671
2701
  ...clientMetadata
2672
2702
  });
2673
2703
  client.onConnectionEvent((event) => this.emitConnectionEvent(event));
@@ -2700,7 +2730,21 @@ var SSEConnectionManager = class {
2700
2730
  try {
2701
2731
  const client = new MCPClient({
2702
2732
  identity: this.identity,
2703
- sessionId
2733
+ sessionId,
2734
+ // These fields are optional in MCPClient, but when rehydrating a known
2735
+ // stored session on the server we pass them explicitly to preserve the
2736
+ // original connection metadata instead of relying on lazy
2737
+ // reloading during initialize().
2738
+ serverId: session.serverId,
2739
+ serverName: session.serverName,
2740
+ serverUrl: session.serverUrl,
2741
+ callbackUrl: session.callbackUrl,
2742
+ // NOTE: transportType is intentionally omitted here.
2743
+ // The session's stored transportType is a placeholder ('streamable_http')
2744
+ // set before transport negotiation. Omitting it lets MCPClient auto-negotiate
2745
+ // (try streamable_http → SSE fallback), which is critical for servers like
2746
+ // Neon that only support SSE transport.
2747
+ headers: session.headers
2704
2748
  });
2705
2749
  client.onConnectionEvent((event) => this.emitConnectionEvent(event));
2706
2750
  await client.finishAuth(code);