@ateam-ai/mcp 0.3.38 → 0.3.40

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 +25 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ateam-ai/mcp",
3
- "version": "0.3.38",
3
+ "version": "0.3.40",
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
@@ -32,10 +32,17 @@ import { renderAgentDocHeader, mergeAgentDoc, AGENT_DOC_SENTINEL } from "./agent
32
32
  async function pollDeployJob(jobId, sid, { label = 'deploy', maxMs = 15 * 60_000, intervalMs = 2000 } = {}) {
33
33
  const start = Date.now();
34
34
  let lastStatus = null;
35
+ // URL-encode jobId — older skill-validators returned composite job IDs
36
+ // with literal `/` (e.g. `redeploy-skill-personal-adas/pa-orchestrator-...`)
37
+ // which broke the Express route /deploy/jobs/:jobId. Polling silently
38
+ // 404'd every iteration until the MCP host's stdio idle timeout fired
39
+ // (~30s) and dropped the connection. Encoding here is defense-in-depth
40
+ // even after the server-side fix that replaced `/` with `--`.
41
+ const encodedJobId = encodeURIComponent(jobId);
35
42
  while (Date.now() - start < maxMs) {
36
43
  await new Promise(r => setTimeout(r, intervalMs));
37
44
  try {
38
- const job = await get(`/deploy/jobs/${jobId}`, sid);
45
+ const job = await get(`/deploy/jobs/${encodedJobId}`, sid);
39
46
  lastStatus = job?.status;
40
47
  if (job?.status === 'done' || job?.status === 'failed') {
41
48
  return job; // job entry has the full result merged in
@@ -887,6 +894,19 @@ export const tools = [
887
894
  required: ["solution_id"],
888
895
  },
889
896
  },
897
+ {
898
+ name: "ateam_verify_consistency",
899
+ core: false,
900
+ description:
901
+ "Read-only: do Builder FS and the GitHub repo agree for this solution? Returns { consistent: bool, drifts: [{path, kind}] } where kind ∈ fs_missing | content_differs | gh_missing | gh_read_error | repo_unreachable. Comparison strips ephemeral fields (timestamps, runtime/deploy-state, resolved-on-load flags) so only REAL content drift surfaces. Use this any time you're unsure whether a recent change landed on GitHub or whether your local view of the solution matches what's deployed — much faster than scrolling ateam_github_log manually. No deploy is triggered.",
902
+ inputSchema: {
903
+ type: "object",
904
+ properties: {
905
+ solution_id: { type: "string", description: "The solution ID" },
906
+ },
907
+ required: ["solution_id"],
908
+ },
909
+ },
890
910
 
891
911
  // ═══════════════════════════════════════════════════════════════════
892
912
  // GITHUB TOOLS — version control for solutions
@@ -1245,6 +1265,7 @@ const TENANT_TOOLS = new Set([
1245
1265
  "ateam_get_connector_source",
1246
1266
  "ateam_get_metrics",
1247
1267
  "ateam_diff",
1268
+ "ateam_verify_consistency",
1248
1269
  // GitHub operations
1249
1270
  "ateam_github_push",
1250
1271
  "ateam_github_pull",
@@ -2316,6 +2337,9 @@ const handlers = {
2316
2337
  return get(`/deploy/solutions/${solution_id}/metrics${qsStr}`, sid);
2317
2338
  },
2318
2339
 
2340
+ ateam_verify_consistency: async ({ solution_id }, sid) =>
2341
+ get(`/deploy/solutions/${solution_id}/verify`, sid),
2342
+
2319
2343
  ateam_diff: async ({ solution_id, skill_id }, sid) => {
2320
2344
  const qs = skill_id ? `?skill_id=${encodeURIComponent(skill_id)}` : "";
2321
2345
  return get(`/deploy/solutions/${solution_id}/diff${qs}`, sid);