@massa-ai/mcp-client 1.16.0 → 1.17.0

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 (3) hide show
  1. package/dist/config-cli.js +9639 -8940
  2. package/dist/index.js +162 -149
  3. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -37759,7 +37759,7 @@ var init_esm6 = __esm(() => {
37759
37759
  esm_default = import_lib.default;
37760
37760
  });
37761
37761
 
37762
- // ../../packages/core/dist/data/db-connection.js
37762
+ // ../../packages/core/dist/kernel/db-connection.js
37763
37763
  function getDbConfig() {
37764
37764
  return {
37765
37765
  connectionString: requirePostgresDatabaseUrl(),
@@ -37787,7 +37787,7 @@ var init_db_connection = __esm(() => {
37787
37787
  init_config();
37788
37788
  });
37789
37789
 
37790
- // ../../packages/core/dist/services/project-identity/alias-resolver.js
37790
+ // ../../packages/core/dist/kernel/alias-resolver.js
37791
37791
  class ProjectIdentityAliasResolver {
37792
37792
  ttlMs;
37793
37793
  resolveTimeoutMs;
@@ -112233,7 +112233,7 @@ var require_dist9 = __commonJS((exports, module) => {
112233
112233
  };
112234
112234
  });
112235
112235
 
112236
- // ../../packages/core/dist/services/query/prisma-client.js
112236
+ // ../../packages/core/dist/kernel/prisma-client.js
112237
112237
  var exports_prisma_client = {};
112238
112238
  __export(exports_prisma_client, {
112239
112239
  getPrismaClient: () => getPrismaClient2,
@@ -113044,7 +113044,7 @@ var init_query_understanding = __esm(() => {
113044
113044
  HYDE_SYSTEM = "You write a hypothetical implementation paragraph that a code-knowledge " + "search system will embed and match against real documents. Write ONE " + "concise paragraph (3-6 sentences) of plausible implementation detail " + "(types, function signatures, control flow) that a relevant document would " + "contain. No preamble, no markdown.";
113045
113045
  });
113046
113046
 
113047
- // ../../packages/core/dist/services/structural/types.js
113047
+ // ../../packages/core/dist/kernel/types.js
113048
113048
  var STRUCTURAL_TAXONOMY_VERSION = "1.0.0", SOURCE_SPAN_SCHEMA_VERSION = "1.0.0", STRUCTURAL_FQN_SCHEMA_VERSION = "1.0.0";
113049
113049
  var init_types3 = __esm(() => {
113050
113050
  init_dist();
@@ -114136,7 +114136,7 @@ answer = 42
114136
114136
  });
114137
114137
  });
114138
114138
 
114139
- // ../../packages/core/dist/services/project-identity/registry.js
114139
+ // ../../packages/core/dist/kernel/registry.js
114140
114140
  function directStorePolicy(tableName, columnName) {
114141
114141
  if (/^vector_documents(?:_\d+d)?$/.test(tableName) && columnName === "project_id") {
114142
114142
  return { storeId: tableName, identityColumn: columnName, mutable: true };
@@ -114197,7 +114197,7 @@ var init_registry = __esm(() => {
114197
114197
  ];
114198
114198
  });
114199
114199
 
114200
- // ../../packages/core/dist/services/project-identity/identity-guard-installer.js
114200
+ // ../../packages/core/dist/kernel/identity-guard-installer.js
114201
114201
  async function installGuardOnTable(client, schema, table, column) {
114202
114202
  try {
114203
114203
  await client.query(`SELECT project_identity_install_guard($1::regclass, $2)`, [`${schema}.${table}`, column]);
@@ -114262,7 +114262,7 @@ var init_identity_guard_installer = __esm(() => {
114262
114262
  init_registry();
114263
114263
  });
114264
114264
 
114265
- // ../../packages/core/dist/services/search/lexical-search.js
114265
+ // ../../packages/core/dist/kernel/lexical-search.js
114266
114266
  function dedupeTokens(tokens) {
114267
114267
  const seen = new Set;
114268
114268
  const out = [];
@@ -114926,9 +114926,16 @@ var init_keyword_search_factory = __esm(() => {
114926
114926
  // ../../packages/core/dist/data/vector/base-vector-store.js
114927
114927
  class BaseVectorStore {
114928
114928
  embeddingProviderPromise = null;
114929
+ embeddingProviderFactory;
114930
+ constructor(options) {
114931
+ this.embeddingProviderFactory = options?.embeddingProviderFactory;
114932
+ }
114929
114933
  getEmbeddingProvider() {
114930
114934
  if (!this.embeddingProviderPromise) {
114931
- this.embeddingProviderPromise = createEmbeddingProvider({ cache: true });
114935
+ if (!this.embeddingProviderFactory) {
114936
+ throw new Error("BaseVectorStore: no embeddingProviderFactory was supplied. Construct this store " + "via services/vector/vector-store-factory.ts (getVectorStore), or pass an explicit " + "embeddingProviderFactory to the constructor.");
114937
+ }
114938
+ this.embeddingProviderPromise = this.embeddingProviderFactory();
114932
114939
  }
114933
114940
  return this.embeddingProviderPromise;
114934
114941
  }
@@ -114974,7 +114981,6 @@ class BaseVectorStore {
114974
114981
  }
114975
114982
  }
114976
114983
  var init_base_vector_store = __esm(() => {
114977
- init_embeddings();
114978
114984
  init_dist();
114979
114985
  });
114980
114986
 
@@ -115100,7 +115106,7 @@ var init_postgres_vector_store = __esm(() => {
115100
115106
  tableName = "vector_documents";
115101
115107
  bqEnabled = false;
115102
115108
  constructor(config3) {
115103
- super();
115109
+ super(config3.embeddingProviderFactory ? { embeddingProviderFactory: config3.embeddingProviderFactory } : undefined);
115104
115110
  this.config = {
115105
115111
  poolSize: 10,
115106
115112
  indexType: "hnsw",
@@ -115556,7 +115562,7 @@ var init_postgres_vector_store = __esm(() => {
115556
115562
  };
115557
115563
  });
115558
115564
 
115559
- // ../../packages/core/dist/data/vector/vector-store-factory.js
115565
+ // ../../packages/core/dist/services/vector/vector-store-factory.js
115560
115566
  async function getVectorStore(config3) {
115561
115567
  if (cachedStore)
115562
115568
  return cachedStore;
@@ -115573,6 +115579,7 @@ async function getVectorStore(config3) {
115573
115579
  ...ivfflatLists ? { lists: ivfflatLists } : {}
115574
115580
  };
115575
115581
  const store = new PostgresVectorStore({
115582
+ embeddingProviderFactory: () => createEmbeddingProvider({ cache: true }),
115576
115583
  connectionString,
115577
115584
  poolSize: Number.parseInt(process.env.POSTGRES_VECTOR_POOL_SIZE || "10", 10),
115578
115585
  indexType: process.env.POSTGRES_VECTOR_INDEX || "hnsw",
@@ -115605,6 +115612,7 @@ var init_vector_store_factory = __esm(() => {
115605
115612
  init_dist();
115606
115613
  init_config();
115607
115614
  init_postgres_vector_store();
115615
+ init_embeddings();
115608
115616
  });
115609
115617
 
115610
115618
  // ../../packages/core/dist/services/search/search-cache-pg.js
@@ -116176,7 +116184,7 @@ var init_analytics_factory = __esm(() => {
116176
116184
  init_dist();
116177
116185
  });
116178
116186
 
116179
- // ../../packages/core/dist/services/structural/schema-version.js
116187
+ // ../../packages/core/dist/kernel/schema-version.js
116180
116188
  function parseSemver(version3) {
116181
116189
  const match2 = SEMVER_PATTERN.exec(version3.trim());
116182
116190
  if (!match2)
@@ -116215,7 +116223,7 @@ var init_schema_version = __esm(() => {
116215
116223
  SEMVER_PATTERN = /^(\d+)\.(\d+)\.(\d+)$/u;
116216
116224
  });
116217
116225
 
116218
- // ../../packages/core/dist/services/structural/fqn-codec.js
116226
+ // ../../packages/core/dist/kernel/fqn-codec.js
116219
116227
  import { createHash as createHash3 } from "crypto";
116220
116228
  function normalizedNfcText(value, label) {
116221
116229
  const normalized = value.normalize("NFC").trim();
@@ -120454,7 +120462,7 @@ var init_reranker = __esm(() => {
120454
120462
  });
120455
120463
  });
120456
120464
 
120457
- // ../../packages/core/dist/tools/enum-validation.js
120465
+ // ../../packages/core/dist/kernel/enum-validation.js
120458
120466
  function validateEnum(paramName, value, validValues) {
120459
120467
  if (typeof value !== "string" || !validValues.includes(value)) {
120460
120468
  throw new ToolError(`Invalid ${paramName} value: ${String(value)}. Valid values: ${validValues.join(", ")}.`);
@@ -120526,7 +120534,7 @@ var init_filter_validation = __esm(() => {
120526
120534
  init_enum_validation();
120527
120535
  });
120528
120536
 
120529
- // ../../packages/core/dist/controllers/search-controller.js
120537
+ // ../../packages/core/dist/services/search/search-controller.js
120530
120538
  var exports_search_controller = {};
120531
120539
  __export(exports_search_controller, {
120532
120540
  SearchController: () => SearchController
@@ -121271,7 +121279,7 @@ var init_session_bias = __esm(() => {
121271
121279
  init_synapse();
121272
121280
  });
121273
121281
 
121274
- // ../../packages/core/dist/services/search/search-diagnostics.js
121282
+ // ../../packages/core/dist/kernel/search-diagnostics.js
121275
121283
  function searchBackendUnavailable(component, cause) {
121276
121284
  return cause instanceof SearchServiceError ? cause : new SearchServiceError("SEARCH_BACKEND_UNAVAILABLE", component, { cause });
121277
121285
  }
@@ -132977,7 +132985,7 @@ var init_salience_judge = __esm(() => {
132977
132985
  });
132978
132986
  });
132979
132987
 
132980
- // ../../packages/core/dist/controllers/memory-controller.js
132988
+ // ../../packages/core/dist/services/memory/memory-controller.js
132981
132989
  class MemoryController {
132982
132990
  static instance = null;
132983
132991
  repo;
@@ -133614,102 +133622,43 @@ var init_code_compressor = __esm(() => {
133614
133622
  init_llm_client();
133615
133623
  });
133616
133624
 
133617
- // ../../packages/core/dist/tools/compress_context.js
133618
- class CompressContextTool {
133619
- name = "compress_context";
133620
- description = "Compress context using semantic compression (keeps structure, removes details)";
133621
- inputSchema = {
133622
- type: "object",
133623
- properties: {
133624
- content: {
133625
- type: "string",
133626
- description: "Content to compress"
133627
- },
133628
- strategy: {
133629
- type: "string",
133630
- enum: [
133631
- "code_structure",
133632
- "conversation_summary",
133633
- "semantic_dedup",
133634
- "hierarchical"
133635
- ],
133636
- description: "Compression strategy",
133637
- default: "code_structure"
133638
- },
133639
- language: {
133640
- type: "string",
133641
- description: "Programming language (for code compression)"
133642
- },
133643
- targetRatio: {
133644
- type: "number",
133645
- description: "Target compression ratio (0-1, e.g., 0.7 = 70% reduction)",
133646
- default: 0.7
133647
- }
133648
- },
133649
- required: ["content"]
133625
+ // ../../packages/core/dist/services/compression/compress-with-metrics.js
133626
+ async function compressWithMetrics(compressor, content, strategy, options = {}) {
133627
+ const { language, targetRatio } = options;
133628
+ const unit = language || "code";
133629
+ const originalTokens = estimateTokens(content, unit);
133630
+ logger.info("Compressing context", {
133631
+ originalTokens,
133632
+ strategy,
133633
+ targetRatio
133634
+ });
133635
+ const result = await compressor.compress(content, strategy);
133636
+ const compressedTokens = estimateTokens(result.compressed, unit);
133637
+ const compressionRatio = 1 - compressedTokens / originalTokens;
133638
+ const tokensSaved = originalTokens - compressedTokens;
133639
+ logger.info("Context compressed", {
133640
+ originalTokens,
133641
+ compressedTokens,
133642
+ tokensSaved,
133643
+ actualRatio: compressionRatio.toFixed(2),
133644
+ targetRatio
133645
+ });
133646
+ return {
133647
+ compressed: result.compressed,
133648
+ originalTokens,
133649
+ compressedTokens,
133650
+ tokensSaved,
133651
+ compressionRatio
133650
133652
  };
133651
- compressor;
133652
- constructor() {
133653
- this.compressor = new CodeCompressor;
133654
- }
133655
- async handle(params) {
133656
- const { content, language, targetRatio = 0.7 } = params;
133657
- const strategy = validateEnum("strategy", params.strategy ?? "code_structure", [
133658
- "code_structure",
133659
- "conversation_summary",
133660
- "semantic_dedup",
133661
- "hierarchical"
133662
- ]);
133663
- try {
133664
- const originalTokens = estimateTokens(content, language || "code");
133665
- logger.info("Compressing context", {
133666
- originalTokens,
133667
- strategy,
133668
- targetRatio
133669
- });
133670
- const result = await this.compressor.compress(content, strategy);
133671
- const compressedTokens = estimateTokens(result.compressed, language || "code");
133672
- const actualRatio = 1 - compressedTokens / originalTokens;
133673
- const tokensSaved = originalTokens - compressedTokens;
133674
- logger.info("Context compressed", {
133675
- originalTokens,
133676
- compressedTokens,
133677
- tokensSaved,
133678
- actualRatio: actualRatio.toFixed(2),
133679
- targetRatio
133680
- });
133681
- return {
133682
- success: true,
133683
- data: {
133684
- compressed: result.compressed,
133685
- originalLength: content.length,
133686
- compressedLength: result.compressed.length,
133687
- originalTokens,
133688
- compressedTokens,
133689
- strategy
133690
- },
133691
- metadata: {
133692
- tokensSaved,
133693
- compressionRatio: actualRatio
133694
- }
133695
- };
133696
- } catch (error51) {
133697
- logger.error("Failed to compress context", error51, {
133698
- strategy,
133699
- contentLength: typeof content === "string" ? content.length : 0
133700
- });
133701
- return {
133702
- success: false,
133703
- error: `Failed to compress context: ${error51.message}`
133704
- };
133705
- }
133706
- }
133707
133653
  }
133708
- var init_compress_context = __esm(() => {
133709
- init_code_compressor();
133654
+ var init_compress_with_metrics = __esm(() => {
133710
133655
  init_dist();
133711
- init_dist();
133712
- init_enum_validation();
133656
+ });
133657
+
133658
+ // ../../packages/core/dist/services/compression/index.js
133659
+ var init_compression = __esm(() => {
133660
+ init_code_compressor();
133661
+ init_compress_with_metrics();
133713
133662
  });
133714
133663
 
133715
133664
  // ../../packages/core/dist/services/metrics/token-metrics.js
@@ -134045,7 +133994,7 @@ var init_session_file_cache = __esm(() => {
134045
133994
  SESSION_TTL_MS = 4 * 60 * 60 * 1000;
134046
133995
  });
134047
133996
 
134048
- // ../../packages/core/dist/controllers/context-controller.js
133997
+ // ../../packages/core/dist/services/context/context-controller.js
134049
133998
  class ContextController {
134050
133999
  static instance = null;
134051
134000
  searchCtrl;
@@ -134055,7 +134004,7 @@ class ContextController {
134055
134004
  constructor() {
134056
134005
  this.searchCtrl = SearchController.getInstance();
134057
134006
  this.memoryCtrl = MemoryController.getInstance();
134058
- this.compressor = new CompressContextTool;
134007
+ this.compressor = new CodeCompressor;
134059
134008
  this.sessionCache = SessionFileCache.getInstance();
134060
134009
  }
134061
134010
  static getInstance() {
@@ -134207,15 +134156,16 @@ class ContextController {
134207
134156
  rawTokens,
134208
134157
  maxTokens
134209
134158
  });
134210
- const resp = await this.compressor.handle({
134211
- content: rawContext,
134212
- strategy: "code_structure",
134213
- targetRatio: 0.6
134214
- });
134215
- if (resp.success && resp.data) {
134216
- finalContext = resp.data.compressed;
134217
- compressionRatio = resp.metadata?.compressionRatio || 0;
134218
- tokensSaved = resp.metadata?.tokensSaved || 0;
134159
+ try {
134160
+ const metrics2 = await compressWithMetrics(this.compressor, rawContext, "code_structure", { targetRatio: 0.6 });
134161
+ finalContext = metrics2.compressed;
134162
+ compressionRatio = metrics2.compressionRatio || 0;
134163
+ tokensSaved = metrics2.tokensSaved || 0;
134164
+ } catch (error51) {
134165
+ logger.error("Failed to compress context", error51, {
134166
+ strategy: "code_structure",
134167
+ contentLength: rawContext.length
134168
+ });
134219
134169
  }
134220
134170
  }
134221
134171
  const finalTokens = estimateTokens(finalContext, "code");
@@ -134372,7 +134322,7 @@ var init_context_controller = __esm(() => {
134372
134322
  init_dist();
134373
134323
  init_search_controller();
134374
134324
  init_memory_controller();
134375
- init_compress_context();
134325
+ init_compression();
134376
134326
  init_session_file_cache();
134377
134327
  init_symbol_graph_service();
134378
134328
  init_token_metrics();
@@ -134484,6 +134434,88 @@ var init_get_optimized_context = __esm(() => {
134484
134434
  init_serialize();
134485
134435
  });
134486
134436
 
134437
+ // ../../packages/core/dist/tools/compress_context.js
134438
+ class CompressContextTool {
134439
+ name = "compress_context";
134440
+ description = "Compress context using semantic compression (keeps structure, removes details)";
134441
+ inputSchema = {
134442
+ type: "object",
134443
+ properties: {
134444
+ content: {
134445
+ type: "string",
134446
+ description: "Content to compress"
134447
+ },
134448
+ strategy: {
134449
+ type: "string",
134450
+ enum: [
134451
+ "code_structure",
134452
+ "conversation_summary",
134453
+ "semantic_dedup",
134454
+ "hierarchical"
134455
+ ],
134456
+ description: "Compression strategy",
134457
+ default: "code_structure"
134458
+ },
134459
+ language: {
134460
+ type: "string",
134461
+ description: "Programming language (for code compression)"
134462
+ },
134463
+ targetRatio: {
134464
+ type: "number",
134465
+ description: "Target compression ratio (0-1, e.g., 0.7 = 70% reduction)",
134466
+ default: 0.7
134467
+ }
134468
+ },
134469
+ required: ["content"]
134470
+ };
134471
+ compressor;
134472
+ constructor() {
134473
+ this.compressor = new CodeCompressor;
134474
+ }
134475
+ async handle(params) {
134476
+ const { content, language, targetRatio = 0.7 } = params;
134477
+ const strategy = validateEnum("strategy", params.strategy ?? "code_structure", [
134478
+ "code_structure",
134479
+ "conversation_summary",
134480
+ "semantic_dedup",
134481
+ "hierarchical"
134482
+ ]);
134483
+ try {
134484
+ const metrics2 = await compressWithMetrics(this.compressor, content, strategy, { language, targetRatio });
134485
+ return {
134486
+ success: true,
134487
+ data: {
134488
+ compressed: metrics2.compressed,
134489
+ originalLength: content.length,
134490
+ compressedLength: metrics2.compressed.length,
134491
+ originalTokens: metrics2.originalTokens,
134492
+ compressedTokens: metrics2.compressedTokens,
134493
+ strategy
134494
+ },
134495
+ metadata: {
134496
+ tokensSaved: metrics2.tokensSaved,
134497
+ compressionRatio: metrics2.compressionRatio
134498
+ }
134499
+ };
134500
+ } catch (error51) {
134501
+ logger.error("Failed to compress context", error51, {
134502
+ strategy,
134503
+ contentLength: typeof content === "string" ? content.length : 0
134504
+ });
134505
+ return {
134506
+ success: false,
134507
+ error: `Failed to compress context: ${error51.message}`
134508
+ };
134509
+ }
134510
+ }
134511
+ }
134512
+ var init_compress_context = __esm(() => {
134513
+ init_code_compressor();
134514
+ init_compress_with_metrics();
134515
+ init_dist();
134516
+ init_enum_validation();
134517
+ });
134518
+
134487
134519
  // ../../packages/core/dist/tools/store_memory.js
134488
134520
  class StoreMemoryTool {
134489
134521
  name = "store_memory";
@@ -139635,7 +139667,7 @@ var init_executor2 = __esm(() => {
139635
139667
  init_intent_search();
139636
139668
  });
139637
139669
 
139638
- // ../../packages/core/dist/controllers/executor-controller.js
139670
+ // ../../packages/core/dist/services/executor/executor-controller.js
139639
139671
  import { cpus as cpus2 } from "os";
139640
139672
  function applyIntent(result, intent) {
139641
139673
  if (!intent || !result.stdout)
@@ -139828,7 +139860,7 @@ var init_executor_controller = __esm(() => {
139828
139860
  ];
139829
139861
  });
139830
139862
 
139831
- // ../../packages/core/dist/controllers/graph-controller.js
139863
+ // ../../packages/core/dist/services/symbol/graph-controller.js
139832
139864
  class GraphController {
139833
139865
  static instance = null;
139834
139866
  constructor() {}
@@ -139948,15 +139980,6 @@ var init_graph_controller = __esm(() => {
139948
139980
  init_definition_lookup();
139949
139981
  });
139950
139982
 
139951
- // ../../packages/core/dist/controllers/index.js
139952
- var init_controllers = __esm(() => {
139953
- init_memory_controller();
139954
- init_search_controller();
139955
- init_context_controller();
139956
- init_executor_controller();
139957
- init_graph_controller();
139958
- });
139959
-
139960
139983
  // ../../packages/core/dist/services/project-identity/errors.js
139961
139984
  var ERROR_MESSAGES, ERROR_STATUS, ProjectIdentityError;
139962
139985
  var init_errors4 = __esm(() => {
@@ -161773,6 +161796,11 @@ var init_services = __esm(() => {
161773
161796
  init_search_analytics_pg();
161774
161797
  init_index_manager();
161775
161798
  init_search_diagnostics();
161799
+ init_memory_controller();
161800
+ init_search_controller();
161801
+ init_context_controller();
161802
+ init_executor_controller();
161803
+ init_graph_controller();
161776
161804
  init_l1_memory_cache();
161777
161805
  init_embedding_cache_pg();
161778
161806
  init_code_compressor();
@@ -161834,20 +161862,6 @@ var init_services = __esm(() => {
161834
161862
  init_project_identity();
161835
161863
  });
161836
161864
 
161837
- // ../../packages/core/dist/data/vector/hybrid-search.js
161838
- var init_hybrid_search2 = __esm(() => {
161839
- init_vector_store_factory();
161840
- init_keyword_search_pg();
161841
- init_dist();
161842
- });
161843
-
161844
- // ../../packages/core/dist/data/vector/index.js
161845
- var init_vector = __esm(() => {
161846
- init_hybrid_search2();
161847
- init_vector_store_factory();
161848
- init_base_vector_store();
161849
- });
161850
-
161851
161865
  // ../../packages/core/dist/data/graph-generation/index.js
161852
161866
  var init_graph_generation = __esm(() => {
161853
161867
  init_graph_generation_repository_pg();
@@ -163484,7 +163498,7 @@ __export(exports_dist, {
163484
163498
  var init_dist15 = __esm(() => {
163485
163499
  init_memory_repository_pg();
163486
163500
  init_memory_repository_factory();
163487
- init_vector();
163501
+ init_vector_store_factory();
163488
163502
  init_operation_log_pg();
163489
163503
  init_operation_log_factory();
163490
163504
  init_operation_log_contract();
@@ -163501,7 +163515,6 @@ var init_dist15 = __esm(() => {
163501
163515
  init_proposal_repository();
163502
163516
  init_auto_improve_job();
163503
163517
  init_tools();
163504
- init_controllers();
163505
163518
  init_services();
163506
163519
  init_graph_generation();
163507
163520
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@massa-ai/mcp-client",
3
- "version": "1.16.0",
3
+ "version": "1.17.0",
4
4
  "description": "massa-ai MCP server - Semantic code search, memory, and context compression via Model Context Protocol",
5
5
  "author": "luizgmassa",
6
6
  "type": "module",
@@ -20,8 +20,8 @@
20
20
  "type-check": "tsc --noEmit"
21
21
  },
22
22
  "dependencies": {
23
- "@massa-ai/core": "^1.16.0",
24
- "@massa-ai/shared": "^1.16.0",
23
+ "@massa-ai/core": "^1.17.0",
24
+ "@massa-ai/shared": "^1.17.0",
25
25
  "@modelcontextprotocol/sdk": "^1.0.0"
26
26
  },
27
27
  "devDependencies": {