@ateam-ai/mcp 0.4.42 → 0.4.44

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 +93 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ateam-ai/mcp",
3
- "version": "0.4.42",
3
+ "version": "0.4.44",
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
@@ -26,6 +26,7 @@ const STAMP_WHERE_TOOLS = new Set([
26
26
  "ateam_github_patch", "ateam_github_write", "ateam_github_push",
27
27
  "ateam_github_promote", "ateam_github_rollback",
28
28
  "ateam_test_skill", "ateam_test_pipeline", "ateam_test_connector", "ateam_test_notification",
29
+ "ateam_verify_surface",
29
30
  ]);
30
31
  import { renderAgentDocHeader, mergeAgentDoc, AGENT_DOC_SENTINEL } from "./agentDoc.js";
31
32
 
@@ -1935,6 +1936,66 @@ export const tools = [
1935
1936
  // INFRASTRUCTURE — redeploy, master key bulk operations
1936
1937
  // ═══════════════════════════════════════════════════════════════════
1937
1938
 
1939
+ {
1940
+ name: "ateam_verify_surface",
1941
+ core: true,
1942
+ description:
1943
+ "PROVE a connector ui_plugin actually renders WITH DATA — the required evidence that a user-visible " +
1944
+ "UI fix is done. A plugin fetches its data over postMessage from its parent window, so opening its " +
1945
+ "iframe alone shows the empty state and 'confirms' the very bug you're checking. This opens the plugin " +
1946
+ "in the REAL host surface in headless Chromium, records every MCP tool call it makes, and returns " +
1947
+ "{ ok, verdict, visible_text, calls, failures }. It distinguishes 'invented tool name' / 'right tool, " +
1948
+ "no data' / 'plugin never asked'. FAIL-CLOSED: a browser-mcp outage returns ok:false verdict:'inconclusive' " +
1949
+ "(never a soft pass). Run AFTER a UI/data fix; quote visible_text in your report. Requires authentication.",
1950
+ inputSchema: {
1951
+ type: "object",
1952
+ properties: {
1953
+ solution_id: { type: "string", description: "The solution id." },
1954
+ plugin_id: {
1955
+ type: "string",
1956
+ description: "The ui_plugin id to probe, e.g. 'mcp:accounting-mcp:spending-dashboard'.",
1957
+ },
1958
+ expect: {
1959
+ type: "object",
1960
+ description: "Optional assertion: { tools: ['memory.get', ...] } — each MUST be called by the plugin, else ok:false.",
1961
+ properties: { tools: { type: "array", items: { type: "string" } } },
1962
+ },
1963
+ actor_id: { type: "string", description: "Optional actor to render as; defaults to the solution's context actor." },
1964
+ },
1965
+ required: ["solution_id", "plugin_id"],
1966
+ },
1967
+ },
1968
+ {
1969
+ name: "ateam_connector_logs",
1970
+ core: true,
1971
+ description:
1972
+ "Read what a connector process actually PRINTED to stderr. This is the only place a connector's " +
1973
+ "internal failure is visible: a tool that catches its own error still returns ok:true, and the widget " +
1974
+ "then renders an empty state that looks like real data.\n\n" +
1975
+ "Real case (2026-08-11): a dashboard connector's ledger.getData got 401 Authentication required from " +
1976
+ "Core, swallowed it, returned an empty ledger, and displayed 0.00 everywhere — while the upload said " +
1977
+ "ok, the tool said ok:true, and the surface probe said surface_ok. The word 'Authentication' appeared " +
1978
+ "ONLY here.\n\n" +
1979
+ "USE IT whenever a tool succeeds but the data is empty, wrong, or zero — that combination is the " +
1980
+ "signature of a swallowed error, and 'the call returned ok' is not evidence it worked. Pass the " +
1981
+ "returned `cursor` back as `since` to read only what is new since your last look, so you can bracket " +
1982
+ "an action and see exactly what it printed. Only stdio (solution) connectors stream stderr through " +
1983
+ "Core; a platform/HTTP connector answers ok:false with a reason.",
1984
+ inputSchema: {
1985
+ type: "object",
1986
+ properties: {
1987
+ solution_id: { type: "string", description: "The solution ID" },
1988
+ connector_id: { type: "string", description: "The connector ID (e.g. 'accounting-dashboard-mcp')" },
1989
+ since: {
1990
+ type: "number",
1991
+ description: "Cursor from a previous call — returns only lines printed after it. Omit for the whole retained tail.",
1992
+ },
1993
+ limit: { type: "number", description: "Max lines (default 100, max 300)" },
1994
+ errors_only: { type: "boolean", description: "Keep only lines that read as errors (401/failed/exception/refused/…)" },
1995
+ },
1996
+ required: ["solution_id", "connector_id"],
1997
+ },
1998
+ },
1938
1999
  {
1939
2000
  name: "ateam_redeploy",
1940
2001
  core: true,
@@ -2048,10 +2109,12 @@ const TENANT_TOOLS = new Set([
2048
2109
  "ateam_list_solutions",
2049
2110
  "ateam_get_solution",
2050
2111
  "ateam_get_execution_logs",
2112
+ "ateam_connector_logs",
2051
2113
  "ateam_conversation",
2052
2114
  "ateam_test_skill",
2053
2115
  "ateam_test_notification",
2054
2116
  "ateam_test_pipeline",
2117
+ "ateam_verify_surface",
2055
2118
  "ateam_test_voice",
2056
2119
  "ateam_test_status",
2057
2120
  "ateam_test_abort",
@@ -2588,7 +2651,7 @@ const handlers = {
2588
2651
  { step: 2, action: "Build & Run", description: "Define your solution + skills + connector code, then validate, deploy, and health-check in one call. Include mcp_store with connector source code on the first deploy.", tools: ["ateam_build_and_run"] },
2589
2652
  { step: 3, action: "Version", description: "Every deploy auto-pushes to main on GitHub. The repo (tenant--solution-id) is the source of truth for connector code.", tools: ["ateam_github_status", "ateam_github_log"] },
2590
2653
  { step: 4, action: "Iterate", description: "Edit connector code ONE FILE AT A TIME via ateam_github_patch, then redeploy with ateam_build_and_run (auto-pulls from GitHub). NEVER re-pass all connector code inline after first deploy. For skill definitions, use ateam_patch.", tools: ["ateam_github_patch", "ateam_build_and_run", "ateam_patch"] },
2591
- { step: 5, action: "Test & Debug", description: "Chat with the solution via ateam_conversation (auto-routes; multi-turn via actor_id). It is ASYNC — see conversation_flow below: kick off → get chain_id → poll ateam_chain_status until chain_done → read the reply. Use ateam_test_pipeline for intent debugging, ateam_test_voice for voice. Diagnose with logs and metrics.", tools: ["ateam_conversation", "ateam_chain_status", "ateam_get_chain", "ateam_test_pipeline", "ateam_test_skill", "ateam_test_voice", "ateam_get_execution_logs", "ateam_get_metrics"] },
2654
+ { step: 5, action: "Test & Debug", description: "Chat with the solution via ateam_conversation (auto-routes; multi-turn via actor_id). It is ASYNC — see conversation_flow below: kick off → get chain_id → poll ateam_chain_status until chain_done → read the reply. Use ateam_test_pipeline for intent debugging, ateam_test_voice for voice. For a UI plugin, ateam_verify_surface PROVES it renders with data (required evidence for a user-visible fix). Diagnose with logs and metrics. ⚠️ A tool answering ok:true with EMPTY/zero data is not proof it worked — that is the signature of a connector swallowing its own error. Read ateam_connector_logs before you believe a green result.", tools: ["ateam_conversation", "ateam_chain_status", "ateam_get_chain", "ateam_test_pipeline", "ateam_test_skill", "ateam_test_voice", "ateam_verify_surface", "ateam_connector_logs", "ateam_get_execution_logs", "ateam_get_metrics"] },
2592
2655
  { step: 6, action: "Checkpoint", description: "When solution is in a good state, create a checkpoint (safe point). You can rollback to any checkpoint if something breaks.", tools: ["ateam_github_promote", "ateam_github_list_versions"] },
2593
2656
  ],
2594
2657
  },
@@ -2650,7 +2713,7 @@ const handlers = {
2650
2713
  },
2651
2714
  advanced_tools: {
2652
2715
  _note: "These tools are available but hidden from the default tool list. Call them by name when you need fine-grained control.",
2653
- debugging: ["ateam_get_execution_logs", "ateam_get_metrics", "ateam_diff", "ateam_get_connector_source"],
2716
+ debugging: ["ateam_get_execution_logs", "ateam_connector_logs", "ateam_get_metrics", "ateam_diff", "ateam_get_connector_source"],
2654
2717
  manual_lifecycle: ["ateam_validate_skill", "ateam_validate_solution", "ateam_deploy_solution", "ateam_deploy_skill", "ateam_deploy_connector", "ateam_update", "ateam_redeploy"],
2655
2718
  async_testing: ["ateam_test_status", "ateam_test_abort"],
2656
2719
  other: ["ateam_upload_connector_files", "ateam_solution_chat"],
@@ -3951,6 +4014,34 @@ const handlers = {
3951
4014
  };
3952
4015
  },
3953
4016
 
4017
+ ateam_connector_logs: async ({ solution_id, connector_id, since, limit, errors_only }, sid) => {
4018
+ if (!solution_id) throw new Error("solution_id required");
4019
+ if (!connector_id) throw new Error("connector_id required");
4020
+ const qs = new URLSearchParams();
4021
+ if (since) qs.set("since", String(since));
4022
+ if (limit) qs.set("limit", String(limit));
4023
+ if (errors_only === true) qs.set("errors_only", "true");
4024
+ const qsStr = qs.toString() ? `?${qs}` : "";
4025
+ return get(
4026
+ `/deploy/solutions/${solution_id}/connectors/${encodeURIComponent(connector_id)}/logs${qsStr}`,
4027
+ sid
4028
+ );
4029
+ },
4030
+
4031
+ ateam_verify_surface: async ({ solution_id, plugin_id, expect, actor_id }, sid) => {
4032
+ if (!solution_id) return { ok: false, error: "solution_id required" };
4033
+ if (!plugin_id) return { ok: false, error: "plugin_id required" };
4034
+ const body = {};
4035
+ if (expect) body.expect = expect;
4036
+ if (actor_id) body.actor_id = actor_id;
4037
+ // Forwards to the skill-validator, which runs Core's ui.surfaceProbe via /mcp.
4038
+ // 60s: navigate + settle + warm-retry inside Core, plus the hop.
4039
+ return await post(
4040
+ `/deploy/solutions/${solution_id}/plugins/${encodeURIComponent(plugin_id)}/verify-surface`,
4041
+ body, sid, { timeoutMs: 60000 }
4042
+ );
4043
+ },
4044
+
3954
4045
  ateam_test_skill: async ({ solution_id, skill_id, message, wait, wait_for, chain_timeout_ms, actor_id }, sid) => {
3955
4046
  // Resolve wait mode. Priority: wait_for (new explicit form) > wait (legacy).
3956
4047
  // wait:false → "never" (return job_id, no polling)