@ateam-ai/mcp 0.3.46 → 0.3.48

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ateam-ai/mcp",
3
- "version": "0.3.46",
3
+ "version": "0.3.48",
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/agentDoc.js CHANGED
@@ -40,10 +40,27 @@ export function renderAgentDocHeader({ solution, skills = [], connectors = [] })
40
40
  return `- **${s.id}** _(${role})_ — ${oneLine(desc)}`;
41
41
  }).join("\n") || "_(no skills defined)_";
42
42
 
43
- const platformConnectorIds = (solution?.platform_connectors || []).map((c) => c.id);
43
+ // Classify connectors by the `source` field on solution.platform_connectors[].
44
+ // Default "platform" for back-compat with older solutions that don't set it.
45
+ // Solution-owned connectors (source:"solution") have source code in
46
+ // connectors/<id>/ inside the repo. See skill-validator schema for the
47
+ // platform_connectors[i].source field. The previous classifier put EVERY
48
+ // platform_connectors entry into the "platform" bucket regardless of
49
+ // ownership, which misclassified solution-owned connectors and bit ada
50
+ // on 2026-05-15.
51
+ const pcs = solution?.platform_connectors || [];
52
+ const platformConnectorIds = pcs
53
+ .filter((c) => (c.source || "platform") === "platform")
54
+ .map((c) => c.id);
44
55
  const solutionConnectorIds = [
45
- ...new Set(connectors.map((c) => c.id).filter(Boolean)),
46
- ];
56
+ ...new Set([
57
+ // Anything explicitly marked source:"solution"
58
+ ...pcs.filter((c) => c.source === "solution").map((c) => c.id),
59
+ // Plus anything in the separately-passed connectors list (live runtime
60
+ // discovery) that isn't already accounted for as platform.
61
+ ...connectors.map((c) => c.id).filter(Boolean),
62
+ ]),
63
+ ].filter((id) => !platformConnectorIds.includes(id));
47
64
  const connectorTable = buildConnectorTable({
48
65
  platform: platformConnectorIds,
49
66
  solution: solutionConnectorIds,
package/src/tools.js CHANGED
@@ -1068,7 +1068,8 @@ export const tools = [
1068
1068
  name: "ateam_github_read",
1069
1069
  core: true,
1070
1070
  description:
1071
- "Read any file from a solution's GitHub repo. Returns the file content. Use this to read connector source code, skill definitions, or any versioned file. Great for reviewing previous versions or understanding what's in the repo.",
1071
+ "Read any file from a solution's GitHub repo. Returns the file content. Use this to read connector source code, skill definitions, or any versioned file. " +
1072
+ "Default reads from `main` (deployed/prod state). Pass `ref: 'dev'` to read in-progress work.",
1072
1073
  inputSchema: {
1073
1074
  type: "object",
1074
1075
  properties: {
@@ -1080,6 +1081,11 @@ export const tools = [
1080
1081
  type: "string",
1081
1082
  description: "File path in the repo (e.g. 'connectors/home-assistant-mcp/server.js', 'solution.json', 'skills/order-support/skill.json')",
1082
1083
  },
1084
+ ref: {
1085
+ type: "string",
1086
+ description: "Branch, tag, or commit SHA to read from. Default: 'main' (prod). Use 'dev' to read in-progress work.",
1087
+ default: "main",
1088
+ },
1083
1089
  },
1084
1090
  required: ["solution_id", "path"],
1085
1091
  },
@@ -1091,7 +1097,8 @@ export const tools = [
1091
1097
  "Edit a file in the solution's GitHub repo and commit. Two modes:\n" +
1092
1098
  "1. FULL FILE: provide `content` — replaces entire file (good for new files or small files)\n" +
1093
1099
  "2. SEARCH/REPLACE: provide `search` + `replace` — surgical edit without sending full file (preferred for large files like server.js)\n" +
1094
- "Always use search/replace for large files (>5KB). Always read the file first with ateam_github_read to get the exact text to search for.",
1100
+ "Always use search/replace for large files (>5KB). Always read the file first with ateam_github_read to get the exact text to search for.\n\n" +
1101
+ "DEFAULTS TO `dev` BRANCH — writes don't touch prod. Use ateam_github_promote to ship dev→main when ready. Pass ref:'main' only for emergency hotfixes.",
1095
1102
  inputSchema: {
1096
1103
  type: "object",
1097
1104
  properties: {
@@ -1119,6 +1126,11 @@ export const tools = [
1119
1126
  type: "string",
1120
1127
  description: "Optional commit message (default: 'Update <path>')",
1121
1128
  },
1129
+ ref: {
1130
+ type: "string",
1131
+ description: "Target branch. Default: 'dev' (safe — won't touch prod). Use 'main' only for emergency hotfixes.",
1132
+ default: "dev",
1133
+ },
1122
1134
  },
1123
1135
  required: ["solution_id", "path"],
1124
1136
  },
@@ -1147,7 +1159,8 @@ export const tools = [
1147
1159
  description:
1148
1160
  "Write a file to the solution's GitHub repo. Use this to create new connector files or replace existing ones — one file per call. " +
1149
1161
  "This is the PRIMARY way to write connector code after first deploy. " +
1150
- "Write each file individually (server.js, package.json, UI assets), then call ateam_build_and_run() to deploy.",
1162
+ "Write each file individually (server.js, package.json, UI assets), then call ateam_github_promote() to ship to prod (dev→main), then ateam_build_and_run() to deploy.\n\n" +
1163
+ "DEFAULTS TO `dev` BRANCH.",
1151
1164
  inputSchema: {
1152
1165
  type: "object",
1153
1166
  properties: {
@@ -1167,6 +1180,11 @@ export const tools = [
1167
1180
  type: "string",
1168
1181
  description: "Optional commit message (default: 'Write <path>')",
1169
1182
  },
1183
+ ref: {
1184
+ type: "string",
1185
+ description: "Target branch. Default: 'dev'.",
1186
+ default: "dev",
1187
+ },
1170
1188
  },
1171
1189
  required: ["solution_id", "path", "content"],
1172
1190
  },
@@ -1175,7 +1193,8 @@ export const tools = [
1175
1193
  name: "ateam_github_log",
1176
1194
  core: true,
1177
1195
  description:
1178
- "View commit history for a solution's GitHub repo. Shows recent commits with messages, SHAs, timestamps, and links. Use this to see what changes have been made and when.",
1196
+ "View commit history for a solution's GitHub repo. Shows recent commits with messages, SHAs, timestamps, and links. " +
1197
+ "Default reads from `main` (prod). Pass `ref: 'dev'` to see in-progress work.",
1179
1198
  inputSchema: {
1180
1199
  type: "object",
1181
1200
  properties: {
@@ -1187,6 +1206,27 @@ export const tools = [
1187
1206
  type: "number",
1188
1207
  description: "Max commits to return (default: 10)",
1189
1208
  },
1209
+ ref: {
1210
+ type: "string",
1211
+ description: "Branch to read commits from. Default: 'main'.",
1212
+ default: "main",
1213
+ },
1214
+ },
1215
+ required: ["solution_id"],
1216
+ },
1217
+ },
1218
+ {
1219
+ name: "ateam_github_diff",
1220
+ core: true,
1221
+ description:
1222
+ "Compare two branches. Default base=main, head=dev — shows what's about to ship if you call ateam_github_promote(). " +
1223
+ "Returns the list of commits and files that would land on main.",
1224
+ inputSchema: {
1225
+ type: "object",
1226
+ properties: {
1227
+ solution_id: { type: "string", description: "The solution ID" },
1228
+ base: { type: "string", description: "Base branch (the target). Default: 'main'.", default: "main" },
1229
+ head: { type: "string", description: "Head branch (the source). Default: 'dev'.", default: "dev" },
1190
1230
  },
1191
1231
  required: ["solution_id"],
1192
1232
  },
@@ -1200,7 +1240,10 @@ export const tools = [
1200
1240
  name: "ateam_github_promote",
1201
1241
  core: true,
1202
1242
  description:
1203
- "Create a checkpoint (safe point) on the current main branch. Tags the current state with safe-YYYY-MM-DD-NNN so you can rollback to it later. Use this before risky changes or when the solution is in a known-good state.",
1243
+ "SHIP DEV TO PROD. Merges the `dev` branch into `main` and auto-tags the new main HEAD as safe-YYYY-MM-DD-NNN. " +
1244
+ "Use after testing your dev work, when you're ready to deploy changes to production.\n\n" +
1245
+ "Workflow: 1) ateam_github_patch (writes to dev) → 2) ateam_github_promote (merges dev→main) → 3) ateam_build_and_run (deploys main).\n\n" +
1246
+ "Pass dry_run:true to see what's about to ship without merging. On merge conflict the call returns 409 — resolve manually on GitHub (open a PR or use the web UI), then retry.",
1204
1247
  inputSchema: {
1205
1248
  type: "object",
1206
1249
  properties: {
@@ -1210,7 +1253,15 @@ export const tools = [
1210
1253
  },
1211
1254
  label: {
1212
1255
  type: "string",
1213
- description: "Optional: human-readable label for this checkpoint (e.g., 'before refactor', 'v2 stable')",
1256
+ description: "Optional: human-readable label for the auto-tag (e.g., 'v2 stable', 'before refactor')",
1257
+ },
1258
+ dry_run: {
1259
+ type: "boolean",
1260
+ description: "If true: show the diff (commits + files about to ship) without merging. Default: false.",
1261
+ },
1262
+ skip_tag: {
1263
+ type: "boolean",
1264
+ description: "If true: merge without creating an auto-tag. Default: false (auto-tag enabled).",
1214
1265
  },
1215
1266
  },
1216
1267
  required: ["solution_id"],
@@ -1220,7 +1271,9 @@ export const tools = [
1220
1271
  name: "ateam_github_rollback",
1221
1272
  core: true,
1222
1273
  description:
1223
- "Rollback main branch to a previous checkpoint (safe-* tag). Resets main to the specified checkpoint commit. ⚠️ DESTRUCTIVE — use with caution. Use ateam_github_list_versions to find available checkpoints first.",
1274
+ "Roll prod (`main` branch) back to a previous state.\n\n" +
1275
+ "ADDITIVE — does NOT destroy history. Creates a new commit on top of main whose tree matches the target's tree. The history of everything between target and current main is preserved (you can roll back the rollback).\n\n" +
1276
+ "Workflow: 1) ateam_github_list_versions (find a safe-* tag) → 2) ateam_github_rollback(target: 'safe-...') → 3) ateam_build_and_run (deploys the reverted state).",
1224
1277
  inputSchema: {
1225
1278
  type: "object",
1226
1279
  properties: {
@@ -1228,12 +1281,12 @@ export const tools = [
1228
1281
  type: "string",
1229
1282
  description: "The solution ID",
1230
1283
  },
1231
- tag: {
1284
+ target: {
1232
1285
  type: "string",
1233
- description: "Required: checkpoint tag to rollback to (e.g., 'safe-2026-03-11-001')",
1286
+ description: "Tag (e.g., 'safe-2026-05-19-001') or commit SHA to revert main to. Use ateam_github_list_versions to find safe-* tags.",
1234
1287
  },
1235
1288
  },
1236
- required: ["solution_id", "tag"],
1289
+ required: ["solution_id", "target"],
1237
1290
  },
1238
1291
  },
1239
1292
  {
@@ -2794,25 +2847,40 @@ const handlers = {
2794
2847
  ateam_github_status: async ({ solution_id }, sid) =>
2795
2848
  get(`/deploy/solutions/${solution_id}/github/status`, sid),
2796
2849
 
2797
- ateam_github_read: async ({ solution_id, path: filePath }, sid) =>
2798
- get(`/deploy/solutions/${solution_id}/github/read?path=${encodeURIComponent(filePath)}`, sid),
2850
+ ateam_github_read: async ({ solution_id, path: filePath, ref }, sid) => {
2851
+ const qs = new URLSearchParams({ path: filePath });
2852
+ if (ref) qs.set('branch', ref);
2853
+ return get(`/deploy/solutions/${solution_id}/github/read?${qs.toString()}`, sid);
2854
+ },
2799
2855
 
2800
- ateam_github_patch: async ({ solution_id, path: filePath, content, search, replace, message }, sid) =>
2801
- post(`/deploy/solutions/${solution_id}/github/patch`, { path: filePath, content, search, replace, message }, sid),
2856
+ ateam_github_patch: async ({ solution_id, path: filePath, content, search, replace, message, ref }, sid) =>
2857
+ post(`/deploy/solutions/${solution_id}/github/patch`, { path: filePath, content, search, replace, message, ref }, sid),
2802
2858
 
2803
- ateam_github_write: async ({ solution_id, path: filePath, content, message }, sid) =>
2804
- post(`/deploy/solutions/${solution_id}/github/patch`, { path: filePath, content, message }, sid),
2859
+ ateam_github_write: async ({ solution_id, path: filePath, content, message, ref }, sid) =>
2860
+ post(`/deploy/solutions/${solution_id}/github/patch`, { path: filePath, content, message, ref }, sid),
2805
2861
 
2806
- ateam_github_log: async ({ solution_id, limit }, sid) => {
2807
- const qs = limit ? `?limit=${limit}` : "";
2808
- return get(`/deploy/solutions/${solution_id}/github/log${qs}`, sid);
2862
+ ateam_github_log: async ({ solution_id, limit, ref }, sid) => {
2863
+ const qs = new URLSearchParams();
2864
+ if (limit) qs.set('limit', String(limit));
2865
+ if (ref) qs.set('branch', ref);
2866
+ const q = qs.toString();
2867
+ return get(`/deploy/solutions/${solution_id}/github/log${q ? '?' + q : ''}`, sid);
2868
+ },
2869
+
2870
+ ateam_github_diff: async ({ solution_id, base, head }, sid) => {
2871
+ const qs = new URLSearchParams();
2872
+ if (base) qs.set('base', base);
2873
+ if (head) qs.set('head', head);
2874
+ const q = qs.toString();
2875
+ return get(`/deploy/solutions/${solution_id}/github/diff${q ? '?' + q : ''}`, sid);
2809
2876
  },
2810
2877
 
2811
- ateam_github_promote: async ({ solution_id, label }, sid) =>
2812
- post(`/deploy/solutions/${solution_id}/promote`, label ? { label } : {}, sid),
2878
+ ateam_github_promote: async ({ solution_id, label, dry_run, skip_tag }, sid) =>
2879
+ post(`/deploy/solutions/${solution_id}/promote`, { label, dry_run, skip_tag }, sid),
2813
2880
 
2814
- ateam_github_rollback: async ({ solution_id, tag }, sid) =>
2815
- post(`/deploy/solutions/${solution_id}/rollback`, { tag }, sid),
2881
+ ateam_github_rollback: async ({ solution_id, target, tag }, sid) =>
2882
+ // Accept both `target` (new spec) and `tag` (legacy callers)
2883
+ post(`/deploy/solutions/${solution_id}/rollback`, { target: target || tag }, sid),
2816
2884
 
2817
2885
  ateam_github_list_versions: async ({ solution_id }, sid) =>
2818
2886
  get(`/deploy/solutions/${solution_id}/versions/dev`, sid),