@mcp-ts/sdk 1.3.7 → 1.3.10

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.
Files changed (66) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +397 -404
  3. package/dist/adapters/agui-middleware.js.map +1 -1
  4. package/dist/adapters/agui-middleware.mjs.map +1 -1
  5. package/dist/bin/mcp-ts.js +0 -0
  6. package/dist/bin/mcp-ts.js.map +1 -1
  7. package/dist/bin/mcp-ts.mjs +0 -0
  8. package/dist/bin/mcp-ts.mjs.map +1 -1
  9. package/dist/client/index.js.map +1 -1
  10. package/dist/client/index.mjs.map +1 -1
  11. package/dist/client/react.d.mts +10 -28
  12. package/dist/client/react.d.ts +10 -28
  13. package/dist/client/react.js +101 -52
  14. package/dist/client/react.js.map +1 -1
  15. package/dist/client/react.mjs +102 -53
  16. package/dist/client/react.mjs.map +1 -1
  17. package/dist/client/vue.js.map +1 -1
  18. package/dist/client/vue.mjs.map +1 -1
  19. package/dist/index.js +78 -6
  20. package/dist/index.js.map +1 -1
  21. package/dist/index.mjs +73 -6
  22. package/dist/index.mjs.map +1 -1
  23. package/dist/server/index.js +78 -6
  24. package/dist/server/index.js.map +1 -1
  25. package/dist/server/index.mjs +73 -6
  26. package/dist/server/index.mjs.map +1 -1
  27. package/dist/shared/index.js.map +1 -1
  28. package/dist/shared/index.mjs.map +1 -1
  29. package/package.json +185 -185
  30. package/src/adapters/agui-middleware.ts +382 -382
  31. package/src/bin/mcp-ts.ts +102 -102
  32. package/src/client/core/app-host.ts +417 -417
  33. package/src/client/core/sse-client.ts +371 -371
  34. package/src/client/core/types.ts +31 -31
  35. package/src/client/index.ts +27 -27
  36. package/src/client/react/index.ts +20 -16
  37. package/src/client/react/use-app-host.ts +74 -73
  38. package/src/client/react/use-mcp-apps.tsx +224 -214
  39. package/src/client/react/use-mcp.ts +669 -641
  40. package/src/client/vue/index.ts +10 -10
  41. package/src/client/vue/use-mcp.ts +617 -617
  42. package/src/index.ts +11 -11
  43. package/src/server/handlers/nextjs-handler.ts +204 -204
  44. package/src/server/handlers/sse-handler.ts +631 -631
  45. package/src/server/index.ts +57 -57
  46. package/src/server/mcp/multi-session-client.ts +228 -228
  47. package/src/server/mcp/oauth-client.ts +1188 -1188
  48. package/src/server/mcp/storage-oauth-provider.ts +272 -272
  49. package/src/server/storage/crypto.ts +92 -0
  50. package/src/server/storage/file-backend.ts +157 -157
  51. package/src/server/storage/index.ts +176 -176
  52. package/src/server/storage/memory-backend.ts +123 -123
  53. package/src/server/storage/redis-backend.ts +276 -276
  54. package/src/server/storage/redis.ts +160 -160
  55. package/src/server/storage/sqlite-backend.ts +182 -182
  56. package/src/server/storage/supabase-backend.ts +229 -228
  57. package/src/server/storage/types.ts +116 -116
  58. package/src/shared/constants.ts +29 -29
  59. package/src/shared/errors.ts +133 -133
  60. package/src/shared/event-routing.ts +28 -28
  61. package/src/shared/events.ts +180 -180
  62. package/src/shared/index.ts +75 -75
  63. package/src/shared/tool-utils.ts +61 -61
  64. package/src/shared/types.ts +282 -282
  65. package/src/shared/utils.ts +38 -38
  66. package/supabase/migrations/20260330195700_install_mcp_sessions.sql +84 -84
@@ -7,6 +7,7 @@ import { ListToolsResultSchema, CallToolResultSchema, ListPromptsResultSchema, G
7
7
  import * as fs2 from 'fs';
8
8
  import { promises } from 'fs';
9
9
  import * as path from 'path';
10
+ import { createDecipheriv, randomBytes, createCipheriv } from 'crypto';
10
11
 
11
12
  var __defProp = Object.defineProperty;
12
13
  var __getOwnPropNames = Object.getOwnPropertyNames;
@@ -707,6 +708,72 @@ var SqliteStorage = class {
707
708
  }
708
709
  }
709
710
  };
711
+ var ALGORITHM = "aes-256-gcm";
712
+ var IV_LENGTH = 12;
713
+ var ENCRYPTION_PREFIX = "enc:1:";
714
+ var warningLogged = false;
715
+ function getKey() {
716
+ const keyString = process.env.STORAGE_ENCRYPTION_KEY;
717
+ if (!keyString) return null;
718
+ if (keyString.length === 64) {
719
+ return Buffer.from(keyString, "hex");
720
+ } else {
721
+ const keyBuffer = Buffer.alloc(32);
722
+ keyBuffer.write(keyString, 0, 32, "utf-8");
723
+ return keyBuffer;
724
+ }
725
+ }
726
+ function encryptObject(data) {
727
+ if (data === void 0 || data === null) return data;
728
+ const key = getKey();
729
+ if (!key) {
730
+ if (!warningLogged) {
731
+ console.warn("[mcp-ts][Storage] WARNING: STORAGE_ENCRYPTION_KEY is not set. Saving sensitive data in plain-text.");
732
+ warningLogged = true;
733
+ }
734
+ return data;
735
+ }
736
+ try {
737
+ const text = JSON.stringify(data);
738
+ const iv = randomBytes(IV_LENGTH);
739
+ const cipher = createCipheriv(ALGORITHM, key, iv);
740
+ let encrypted = cipher.update(text, "utf-8", "hex");
741
+ encrypted += cipher.final("hex");
742
+ const authTag = cipher.getAuthTag().toString("hex");
743
+ return `${ENCRYPTION_PREFIX}${iv.toString("hex")}:${authTag}:${encrypted}`;
744
+ } catch (e) {
745
+ console.error("[mcp-ts][Storage] Encryption failed, falling back to plain-text.", e);
746
+ return data;
747
+ }
748
+ }
749
+ function decryptObject(data) {
750
+ if (data === void 0 || data === null) return data;
751
+ if (typeof data !== "string" || !data.startsWith(ENCRYPTION_PREFIX)) {
752
+ return data;
753
+ }
754
+ const key = getKey();
755
+ if (!key) {
756
+ console.warn("[mcp-ts][Storage] WARNING: Found encrypted data but STORAGE_ENCRYPTION_KEY is missing. Returning raw encrypted string.");
757
+ return data;
758
+ }
759
+ try {
760
+ const parts = data.split(":");
761
+ if (parts.length !== 5) {
762
+ return data;
763
+ }
764
+ const iv = Buffer.from(parts[2], "hex");
765
+ const authTag = Buffer.from(parts[3], "hex");
766
+ const encryptedText = parts[4];
767
+ const decipher = createDecipheriv(ALGORITHM, key, iv);
768
+ decipher.setAuthTag(authTag);
769
+ let decrypted = decipher.update(encryptedText, "hex", "utf-8");
770
+ decrypted += decipher.final("utf-8");
771
+ return JSON.parse(decrypted);
772
+ } catch (e) {
773
+ console.error("[mcp-ts][Storage] Decryption failed.", e);
774
+ return data;
775
+ }
776
+ }
710
777
 
711
778
  // src/server/storage/supabase-backend.ts
712
779
  var SupabaseStorageBackend = class {
@@ -739,10 +806,10 @@ var SupabaseStorageBackend = class {
739
806
  callbackUrl: row.callback_url,
740
807
  createdAt: new Date(row.created_at).getTime(),
741
808
  identity: row.identity,
742
- headers: row.headers,
809
+ headers: decryptObject(row.headers),
743
810
  active: row.active,
744
811
  clientInformation: row.client_information,
745
- tokens: row.tokens,
812
+ tokens: decryptObject(row.tokens),
746
813
  codeVerifier: row.code_verifier,
747
814
  clientId: row.client_id
748
815
  };
@@ -763,10 +830,10 @@ var SupabaseStorageBackend = class {
763
830
  callback_url: session.callbackUrl,
764
831
  created_at: new Date(session.createdAt || Date.now()).toISOString(),
765
832
  identity,
766
- headers: session.headers,
833
+ headers: encryptObject(session.headers),
767
834
  active: session.active ?? false,
768
835
  client_information: session.clientInformation,
769
- tokens: session.tokens,
836
+ tokens: encryptObject(session.tokens),
770
837
  code_verifier: session.codeVerifier,
771
838
  client_id: session.clientId,
772
839
  expires_at: expiresAt
@@ -791,9 +858,9 @@ var SupabaseStorageBackend = class {
791
858
  if ("transportType" in data) updateData.transport_type = data.transportType;
792
859
  if ("callbackUrl" in data) updateData.callback_url = data.callbackUrl;
793
860
  if ("active" in data) updateData.active = data.active;
794
- if ("headers" in data) updateData.headers = data.headers;
861
+ if ("headers" in data) updateData.headers = encryptObject(data.headers);
795
862
  if ("clientInformation" in data) updateData.client_information = data.clientInformation;
796
- if ("tokens" in data) updateData.tokens = data.tokens;
863
+ if ("tokens" in data) updateData.tokens = encryptObject(data.tokens);
797
864
  if ("codeVerifier" in data) updateData.code_verifier = data.codeVerifier;
798
865
  if ("clientId" in data) updateData.client_id = data.clientId;
799
866
  const { data: updatedRows, error } = await this.supabase.from("mcp_sessions").update(updateData).eq("identity", identity).eq("session_id", sessionId).select("id");