@ateam-ai/mcp 0.4.28 → 0.4.30

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 (2) hide show
  1. package/package.json +1 -1
  2. package/src/tools.js +27 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ateam-ai/mcp",
3
- "version": "0.4.28",
3
+ "version": "0.4.30",
4
4
  "mcpName": "io.github.ariekogan/ateam-mcp",
5
5
  "description": "A-Team MCP Server — build, validate, and deploy multi-agent solutions from any AI environment",
6
6
  "type": "module",
package/src/tools.js CHANGED
@@ -102,7 +102,15 @@ function _summarizeDef(def) {
102
102
  ...(def.connectors && { connectors: pick(def.connectors, "id") }),
103
103
  ...(def.platform_connectors && { platform_connectors: pick(def.platform_connectors, "id") }),
104
104
  ...(def.ui_plugins && { ui_plugins: pick(def.ui_plugins, "id") }),
105
- ...(def.tools && { tools: pick(def.tools, "name") }),
105
+ // OPEN-20: `tools` here are the DECLARED tools only. A skill's REAL callable
106
+ // set also includes every tool of each connector in `connectors[]` — Core
107
+ // auto-imports those at deploy, so they're callable at runtime even though
108
+ // they're NOT listed here. So this summary UNDER-reports the toolset; don't
109
+ // read a connector tool's absence as "missing".
110
+ ...(def.tools && { tools_declared: pick(def.tools, "name") }),
111
+ ...((Array.isArray(def.connectors) && def.connectors.length > 0) && {
112
+ _tools_note: `Callable tools = tools_declared + ALL tools from linked connectors [${pick(def.connectors, "id").join(", ")}] (Core auto-imports them at deploy — NOT listed above). For the real runtime set use ateam_get_solution(view:"connectors_health") or a live ateam_test_skill; a connector tool (e.g. 'connector.foo.get') is callable via the LINK even if it isn't in tools_declared.`,
113
+ }),
106
114
  _fields: Object.keys(def),
107
115
  _note: "compact summary — pass include_definition:true to ateam_patch for the full definition.",
108
116
  };
@@ -3151,6 +3159,7 @@ const handlers = {
3151
3159
  ateam_patch: async ({ solution_id, target, skill_id, updates, test_message, dry_run, source, include_definition }, sid) => {
3152
3160
  const phases = [];
3153
3161
  let isNewSkill = false;
3162
+ let _connectorToolPush = null;
3154
3163
  const _diff = { arrays_merged: [], arrays_replaced: [], scalars_changed: [], sections_replaced: [] };
3155
3164
 
3156
3165
  // Two backing stores, chosen EXPLICITLY by `source` (never inferred):
@@ -3250,6 +3259,18 @@ const handlers = {
3250
3259
  const field = key.replace(/_push$/, "");
3251
3260
  const { parent, leaf } = _resolveDottedField(patched, field);
3252
3261
  parent[leaf] = [...(Array.isArray(parent[leaf]) ? parent[leaf] : []), ...value];
3262
+ // Record the merge so a successful push is NOT reported as an empty
3263
+ // diff / silent no-op (OPEN-21 reporting gap).
3264
+ _diff.arrays_merged.push({ field, added: value.length });
3265
+ // OPEN-21: a connector's tools are granted by LINKING the connector
3266
+ // (connectors_push), NOT by pushing a definition into tools[]. Flag an
3267
+ // obviously connector-served push so we can redirect the agent.
3268
+ if (field === "tools") {
3269
+ const connectorish = value
3270
+ .filter((t) => t?.source?.type === "mcp_bridge" || (typeof t?.name === "string" && t.name.endsWith(":*")))
3271
+ .map((t) => t?.name).filter(Boolean);
3272
+ if (connectorish.length) _connectorToolPush = connectorish;
3273
+ }
3253
3274
  } else if (key.endsWith("_delete")) {
3254
3275
  if (!Array.isArray(value)) {
3255
3276
  return { ok: false, phase: "patch", error: `${key} requires an array of names/ids (got ${typeof value}). Pass {"${key}": ["name1", "name2"]}.` };
@@ -3508,6 +3529,11 @@ const handlers = {
3508
3529
  ...(include_definition
3509
3530
  ? { patched }
3510
3531
  : { patched_summary: _summarizeDef(patched) }),
3532
+ _diff,
3533
+ ...(_connectorToolPush && {
3534
+ _connector_tool_hint:
3535
+ `Heads up: ${_connectorToolPush.join(", ")} look like CONNECTOR-served tools. A skill gains a connector's tools by LINKING the connector — updates:{ "connectors_push": ["<connector-id>"] } — NOT by pushing a definition into tools[]; Core auto-imports the connector's live tools at deploy. tools_push is only for the skill's OWN tool definitions.`,
3536
+ }),
3511
3537
  ...(isNewSkill && { created_skill: skill_id }),
3512
3538
  ...(redeployResult && { redeploy: redeployResult }),
3513
3539
  ...(widget_health && { widget_health }),