@framingui/mcp-server 0.6.26 → 0.6.28

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 (146) hide show
  1. package/README.md +4 -3
  2. package/dist/__tests__/react-native-contract.test.d.ts +2 -0
  3. package/dist/__tests__/react-native-contract.test.d.ts.map +1 -0
  4. package/dist/__tests__/react-native-contract.test.js +50 -0
  5. package/dist/__tests__/react-native-contract.test.js.map +1 -0
  6. package/dist/auth/state.d.ts +16 -0
  7. package/dist/auth/state.d.ts.map +1 -1
  8. package/dist/auth/state.js +54 -15
  9. package/dist/auth/state.js.map +1 -1
  10. package/dist/auth/verify.d.ts +9 -0
  11. package/dist/auth/verify.d.ts.map +1 -1
  12. package/dist/auth/verify.js.map +1 -1
  13. package/dist/billing/quota-policy.d.ts +13 -0
  14. package/dist/billing/quota-policy.d.ts.map +1 -0
  15. package/dist/billing/quota-policy.js +32 -0
  16. package/dist/billing/quota-policy.js.map +1 -0
  17. package/dist/billing/tool-metering.d.ts +10 -0
  18. package/dist/billing/tool-metering.d.ts.map +1 -0
  19. package/dist/billing/tool-metering.js +126 -0
  20. package/dist/billing/tool-metering.js.map +1 -0
  21. package/dist/billing/usage-ledger.d.ts +61 -0
  22. package/dist/billing/usage-ledger.d.ts.map +1 -0
  23. package/dist/billing/usage-ledger.js +102 -0
  24. package/dist/billing/usage-ledger.js.map +1 -0
  25. package/dist/billing/usage-sync.d.ts +3 -0
  26. package/dist/billing/usage-sync.d.ts.map +1 -0
  27. package/dist/billing/usage-sync.js +40 -0
  28. package/dist/billing/usage-sync.js.map +1 -0
  29. package/dist/cli/agent-md-templates.d.ts.map +1 -1
  30. package/dist/cli/agent-md-templates.js +58 -38
  31. package/dist/cli/agent-md-templates.js.map +1 -1
  32. package/dist/cli/commands.d.ts +2 -0
  33. package/dist/cli/commands.d.ts.map +1 -0
  34. package/dist/cli/commands.js +20 -0
  35. package/dist/cli/commands.js.map +1 -0
  36. package/dist/cli/guide-template.d.ts.map +1 -1
  37. package/dist/cli/guide-template.js +20 -36
  38. package/dist/cli/guide-template.js.map +1 -1
  39. package/dist/cli/help.d.ts +5 -0
  40. package/dist/cli/help.d.ts.map +1 -0
  41. package/dist/cli/help.js +59 -0
  42. package/dist/cli/help.js.map +1 -0
  43. package/dist/cli/init.d.ts +2 -3
  44. package/dist/cli/init.d.ts.map +1 -1
  45. package/dist/cli/init.js +33 -48
  46. package/dist/cli/init.js.map +1 -1
  47. package/dist/cli/package-manager.d.ts +5 -0
  48. package/dist/cli/package-manager.d.ts.map +1 -0
  49. package/dist/cli/package-manager.js +34 -0
  50. package/dist/cli/package-manager.js.map +1 -0
  51. package/dist/cli/update.d.ts +8 -0
  52. package/dist/cli/update.d.ts.map +1 -0
  53. package/dist/cli/update.js +53 -0
  54. package/dist/cli/update.js.map +1 -0
  55. package/dist/commands/slash-command-adapters.d.ts +9 -0
  56. package/dist/commands/slash-command-adapters.d.ts.map +1 -0
  57. package/dist/commands/slash-command-adapters.js +116 -0
  58. package/dist/commands/slash-command-adapters.js.map +1 -0
  59. package/dist/data/component-fallback-catalog.d.ts +26 -0
  60. package/dist/data/component-fallback-catalog.d.ts.map +1 -0
  61. package/dist/data/component-fallback-catalog.js +149 -0
  62. package/dist/data/component-fallback-catalog.js.map +1 -0
  63. package/dist/data/component-props.d.ts +30 -0
  64. package/dist/data/component-props.d.ts.map +1 -0
  65. package/dist/data/component-props.js +537 -0
  66. package/dist/data/component-props.js.map +1 -0
  67. package/dist/data/component-registry.d.ts +30 -0
  68. package/dist/data/component-registry.d.ts.map +1 -0
  69. package/dist/data/component-registry.js +320 -0
  70. package/dist/data/component-registry.js.map +1 -0
  71. package/dist/data/examples/screen-examples.d.ts +38 -0
  72. package/dist/data/examples/screen-examples.d.ts.map +1 -0
  73. package/dist/data/examples/screen-examples.js +500 -0
  74. package/dist/data/examples/screen-examples.js.map +1 -0
  75. package/dist/data/react-native-runtime-catalog.d.ts +24 -0
  76. package/dist/data/react-native-runtime-catalog.d.ts.map +1 -0
  77. package/dist/data/react-native-runtime-catalog.js +265 -0
  78. package/dist/data/react-native-runtime-catalog.js.map +1 -0
  79. package/dist/index.js +225 -205
  80. package/dist/index.js.map +1 -1
  81. package/dist/platform-support.d.ts +22 -0
  82. package/dist/platform-support.d.ts.map +1 -0
  83. package/dist/platform-support.js +148 -0
  84. package/dist/platform-support.js.map +1 -0
  85. package/dist/project-context-resolution.d.ts +7 -0
  86. package/dist/project-context-resolution.d.ts.map +1 -0
  87. package/dist/project-context-resolution.js +21 -0
  88. package/dist/project-context-resolution.js.map +1 -0
  89. package/dist/project-context-state.d.ts +12 -0
  90. package/dist/project-context-state.d.ts.map +1 -0
  91. package/dist/project-context-state.js +14 -0
  92. package/dist/project-context-state.js.map +1 -0
  93. package/dist/project-context.d.ts +15 -0
  94. package/dist/project-context.d.ts.map +1 -0
  95. package/dist/project-context.js +78 -0
  96. package/dist/project-context.js.map +1 -0
  97. package/dist/prompts/doctor-workflow.js +1 -1
  98. package/dist/prompts/getting-started.d.ts.map +1 -1
  99. package/dist/prompts/getting-started.js +36 -15
  100. package/dist/prompts/getting-started.js.map +1 -1
  101. package/dist/prompts/screen-workflow.d.ts.map +1 -1
  102. package/dist/prompts/screen-workflow.js +54 -3
  103. package/dist/prompts/screen-workflow.js.map +1 -1
  104. package/dist/schemas/mcp-schemas.d.ts +954 -309
  105. package/dist/schemas/mcp-schemas.d.ts.map +1 -1
  106. package/dist/schemas/mcp-schemas.js +130 -1
  107. package/dist/schemas/mcp-schemas.js.map +1 -1
  108. package/dist/tools/detect-project-context.d.ts +5 -0
  109. package/dist/tools/detect-project-context.d.ts.map +1 -0
  110. package/dist/tools/detect-project-context.js +36 -0
  111. package/dist/tools/detect-project-context.js.map +1 -0
  112. package/dist/tools/get-screen-generation-context.d.ts +3 -1
  113. package/dist/tools/get-screen-generation-context.d.ts.map +1 -1
  114. package/dist/tools/get-screen-generation-context.js +120 -20
  115. package/dist/tools/get-screen-generation-context.js.map +1 -1
  116. package/dist/tools/list-components.d.ts.map +1 -1
  117. package/dist/tools/list-components.js +42 -3
  118. package/dist/tools/list-components.js.map +1 -1
  119. package/dist/tools/list-screen-templates.d.ts +3 -1
  120. package/dist/tools/list-screen-templates.d.ts.map +1 -1
  121. package/dist/tools/list-screen-templates.js +3 -3
  122. package/dist/tools/list-screen-templates.js.map +1 -1
  123. package/dist/tools/preview-component.d.ts.map +1 -1
  124. package/dist/tools/preview-component.js +57 -7
  125. package/dist/tools/preview-component.js.map +1 -1
  126. package/dist/tools/preview-theme.d.ts +3 -1
  127. package/dist/tools/preview-theme.d.ts.map +1 -1
  128. package/dist/tools/preview-theme.js +48 -21
  129. package/dist/tools/preview-theme.js.map +1 -1
  130. package/dist/tools/theme-authority.js +1 -1
  131. package/dist/tools/theme-authority.js.map +1 -1
  132. package/dist/tools/validate-environment.d.ts +3 -1
  133. package/dist/tools/validate-environment.d.ts.map +1 -1
  134. package/dist/tools/validate-environment.js +102 -9
  135. package/dist/tools/validate-environment.js.map +1 -1
  136. package/dist/tools/validate-screen-definition.d.ts.map +1 -1
  137. package/dist/tools/validate-screen-definition.js +41 -7
  138. package/dist/tools/validate-screen-definition.js.map +1 -1
  139. package/dist/tools/whoami.d.ts.map +1 -1
  140. package/dist/tools/whoami.js +27 -17
  141. package/dist/tools/whoami.js.map +1 -1
  142. package/dist/utils/style-contract-reader.d.ts +10 -0
  143. package/dist/utils/style-contract-reader.d.ts.map +1 -0
  144. package/dist/utils/style-contract-reader.js +67 -0
  145. package/dist/utils/style-contract-reader.js.map +1 -0
  146. package/package.json +3 -3
@@ -10,6 +10,7 @@
10
10
  import { getAuthData, setAuthData } from '../auth/state.js';
11
11
  import { isMasterAccount, PREMIUM_THEMES } from '../auth/theme-access.js';
12
12
  import { addMcpUtmParams } from '../utils/url-utils.js';
13
+ import { getUsageQuotaSnapshot } from '../billing/usage-ledger.js';
13
14
  /**
14
15
  * whoami 도구 구현
15
16
  * 인증된 유저의 tier/라이선스 스냅샷을 반환
@@ -19,7 +20,7 @@ export async function whoamiTool() {
19
20
  if (!authData || !authData.valid) {
20
21
  return {
21
22
  success: false,
22
- error: '🔐 Authentication required to use FramingUI MCP tools.\n\n🎁 Start your FREE 3-day trial (no credit card):\n → https://framingui.com/auth/signup?utm_source=mcp&utm_medium=cli&utm_campaign=auth_prompt\n\nAlready have an account? Run `framingui-mcp login`',
23
+ error: '🔐 Authentication required to use FramingUI MCP tools.\n\n📊 Start with free quota visibility:\n → https://framingui.com/auth/signup?utm_source=mcp&utm_medium=cli&utm_campaign=auth_prompt\n\nAlready have an account? Run `framingui-mcp login`',
23
24
  };
24
25
  }
25
26
  const email = authData.user?.email || '';
@@ -48,27 +49,27 @@ export async function whoamiTool() {
48
49
  .reverse();
49
50
  latestExpiry = expiryDates[0] || null;
50
51
  }
51
- // Trial 라이선스 확인
52
- let isTrial = false;
53
- let trialExpiresAt = null;
54
- let trialDaysLeft = null;
52
+ // Transition access is still backed by the legacy trial license type for compatibility.
53
+ let hasTransitionAccess = false;
54
+ let accessExpiresAt = null;
55
+ let accessDaysLeft = null;
55
56
  let trialMessage = null;
56
57
  if (authData.licenses && authData.licenses.length > 0) {
57
58
  const trialLicense = authData.licenses.find(l => l.type === 'trial');
58
59
  if (trialLicense) {
59
- isTrial = true;
60
- trialExpiresAt = trialLicense.expiresAt || null;
61
- if (trialExpiresAt) {
60
+ hasTransitionAccess = true;
61
+ accessExpiresAt = trialLicense.expiresAt || null;
62
+ if (accessExpiresAt) {
62
63
  const now = new Date();
63
- const expiryDate = new Date(trialExpiresAt);
64
+ const expiryDate = new Date(accessExpiresAt);
64
65
  const diffMs = expiryDate.getTime() - now.getTime();
65
- trialDaysLeft = Math.max(0, Math.ceil(diffMs / (1000 * 60 * 60 * 24)));
66
- if (trialDaysLeft > 0) {
67
- trialMessage = `You have ${trialDaysLeft} day${trialDaysLeft !== 1 ? 's' : ''} left in your free trial.`;
66
+ accessDaysLeft = Math.max(0, Math.ceil(diffMs / (1000 * 60 * 60 * 24)));
67
+ if (accessDaysLeft > 0) {
68
+ trialMessage = `You have ${accessDaysLeft} day${accessDaysLeft !== 1 ? 's' : ''} left in your transition access window.`;
68
69
  }
69
70
  else {
70
71
  const pricingUrl = addMcpUtmParams('https://framingui.com/pricing', 'whoami');
71
- trialMessage = `Your free trial has expired. Upgrade to continue using premium themes: ${pricingUrl}`;
72
+ trialMessage = `Your transition access window has expired. Upgrade to continue using premium themes: ${pricingUrl}`;
72
73
  }
73
74
  }
74
75
  }
@@ -83,10 +84,19 @@ export async function whoamiTool() {
83
84
  expiresAt: latestExpiry,
84
85
  renewable: true,
85
86
  },
86
- // Trial 정보
87
- is_trial: isTrial,
88
- trial_expires_at: trialExpiresAt,
89
- trial_days_left: trialDaysLeft,
87
+ has_transition_access: hasTransitionAccess,
88
+ access_expires_at: accessExpiresAt,
89
+ access_days_left: accessDaysLeft,
90
+ // Legacy aliases kept until downstream clients stop reading trial_* keys.
91
+ is_trial: hasTransitionAccess,
92
+ trial_expires_at: accessExpiresAt,
93
+ trial_days_left: accessDaysLeft,
94
+ quota: getUsageQuotaSnapshot({
95
+ userId: authData.user?.id ?? null,
96
+ plan: isMaster ? 'master' : (authData.user?.plan ?? 'free'),
97
+ paidQuotaEntitlement: authData.quotaEntitlement ?? null,
98
+ }),
99
+ paid_quota_entitlement: authData.quotaEntitlement ?? null,
90
100
  ...(trialMessage && { message: trialMessage }),
91
101
  };
92
102
  }
@@ -1 +1 @@
1
- {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/tools/whoami.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/tools/whoami.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type StyleContract = 'framingui-native' | 'host-utility' | 'mixed' | 'unknown';
2
+ export interface StyleContractResult {
3
+ styleContract: StyleContract;
4
+ cssFilesChecked: string[];
5
+ uiStylesImportFound: boolean;
6
+ definedVariables: string[];
7
+ missingVariables: string[];
8
+ }
9
+ export declare function readStyleContract(projectPath: string): StyleContractResult;
10
+ //# sourceMappingURL=style-contract-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-contract-reader.d.ts","sourceRoot":"","sources":["../../src/utils/style-contract-reader.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG,kBAAkB,GAAG,cAAc,GAAG,OAAO,GAAG,SAAS,CAAC;AAEtF,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAaD,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,CAgD1E"}
@@ -0,0 +1,67 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ const COMMON_CSS_ENTRY_CANDIDATES = [
4
+ 'app/globals.css',
5
+ 'src/app/globals.css',
6
+ 'styles/globals.css',
7
+ 'src/index.css',
8
+ 'src/main.css',
9
+ 'index.css',
10
+ ];
11
+ const REQUIRED_FRAMINGUI_VARIABLES = ['--bg-background', '--border-default', '--text-tertiary'];
12
+ export function readStyleContract(projectPath) {
13
+ const root = resolveProjectRoot(projectPath);
14
+ const cssFilesChecked = COMMON_CSS_ENTRY_CANDIDATES.map(candidate => path.join(root, candidate)).filter(candidate => fs.existsSync(candidate));
15
+ if (cssFilesChecked.length === 0) {
16
+ return {
17
+ styleContract: 'unknown',
18
+ cssFilesChecked: [],
19
+ uiStylesImportFound: false,
20
+ definedVariables: [],
21
+ missingVariables: [...REQUIRED_FRAMINGUI_VARIABLES],
22
+ };
23
+ }
24
+ const contents = cssFilesChecked
25
+ .map(filePath => {
26
+ try {
27
+ return fs.readFileSync(filePath, 'utf-8');
28
+ }
29
+ catch {
30
+ return '';
31
+ }
32
+ })
33
+ .join('\n');
34
+ const uiStylesImportFound = /@import\s+['"]@framingui\/ui\/styles['"]/.test(contents);
35
+ const definedVariables = REQUIRED_FRAMINGUI_VARIABLES.filter(variable => new RegExp(`${escapeRegExp(variable)}\\s*:`).test(contents));
36
+ const missingVariables = REQUIRED_FRAMINGUI_VARIABLES.filter(variable => !definedVariables.includes(variable));
37
+ let styleContract = 'host-utility';
38
+ if (uiStylesImportFound || missingVariables.length === 0) {
39
+ styleContract = 'framingui-native';
40
+ }
41
+ else if (definedVariables.length > 0) {
42
+ styleContract = 'mixed';
43
+ }
44
+ return {
45
+ styleContract,
46
+ cssFilesChecked,
47
+ uiStylesImportFound,
48
+ definedVariables,
49
+ missingVariables,
50
+ };
51
+ }
52
+ function resolveProjectRoot(projectPath) {
53
+ const normalizedPath = path.resolve(projectPath);
54
+ try {
55
+ if (fs.statSync(normalizedPath).isDirectory()) {
56
+ return normalizedPath;
57
+ }
58
+ }
59
+ catch {
60
+ // Fall through and derive root from the provided path.
61
+ }
62
+ return path.dirname(normalizedPath);
63
+ }
64
+ function escapeRegExp(value) {
65
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
66
+ }
67
+ //# sourceMappingURL=style-contract-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-contract-reader.js","sourceRoot":"","sources":["../../src/utils/style-contract-reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAY7B,MAAM,2BAA2B,GAAG;IAClC,iBAAiB;IACjB,qBAAqB;IACrB,oBAAoB;IACpB,eAAe;IACf,cAAc;IACd,WAAW;CACZ,CAAC;AAEF,MAAM,4BAA4B,GAAG,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC;AAEhG,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,MAAM,IAAI,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,eAAe,GAAG,2BAA2B,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAClE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAC3B,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhD,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO;YACL,aAAa,EAAE,SAAS;YACxB,eAAe,EAAE,EAAE;YACnB,mBAAmB,EAAE,KAAK;YAC1B,gBAAgB,EAAE,EAAE;YACpB,gBAAgB,EAAE,CAAC,GAAG,4BAA4B,CAAC;SACpD,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe;SAC7B,GAAG,CAAC,QAAQ,CAAC,EAAE;QACd,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,mBAAmB,GAAG,0CAA0C,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtF,MAAM,gBAAgB,GAAG,4BAA4B,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CACtE,IAAI,MAAM,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAC5D,CAAC;IACF,MAAM,gBAAgB,GAAG,4BAA4B,CAAC,MAAM,CAC1D,QAAQ,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACjD,CAAC;IAEF,IAAI,aAAa,GAAkB,cAAc,CAAC;IAClD,IAAI,mBAAmB,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzD,aAAa,GAAG,kBAAkB,CAAC;IACrC,CAAC;SAAM,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,aAAa,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,OAAO;QACL,aAAa;QACb,eAAe;QACf,mBAAmB;QACnB,gBAAgB;QAChB,gBAAgB;KACjB,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,WAAmB;IAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC9C,OAAO,cAAc,CAAC;QACxB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uDAAuD;IACzD,CAAC;IAED,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@framingui/mcp-server",
3
- "version": "0.6.26",
4
- "description": "Framingui MCP Server with Claude Code integration and timestamp-based preview system",
3
+ "version": "0.6.28",
4
+ "description": "FramingUI MCP server for production UI workflows, discovery, validation, and quota-aware billing visibility",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -51,7 +51,7 @@
51
51
  "@babel/parser": "^7.28.6",
52
52
  "@babel/traverse": "^7.28.6",
53
53
  "@framingui/core": "^0.4.3",
54
- "@framingui/ui": "^0.6.12",
54
+ "@framingui/ui": "^0.6.11",
55
55
  "@modelcontextprotocol/sdk": "^1.26.0",
56
56
  "zod": "^3.23.8"
57
57
  },