@ateam-ai/mcp 0.4.27 → 0.4.28

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 +23 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ateam-ai/mcp",
3
- "version": "0.4.27",
3
+ "version": "0.4.28",
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
@@ -12,7 +12,7 @@ import {
12
12
  get, post, patch, del,
13
13
  setSessionCredentials, isAuthenticated, isExplicitlyAuthenticated,
14
14
  getCredentials, parseApiKey, touchSession, getSessionContext,
15
- setAuthOverride, switchTenant, isMasterMode, listTenants, getWhere,
15
+ setAuthOverride, switchTenant, isMasterMode, listTenants, getWhere, getBaseUrl,
16
16
  } from "./api.js";
17
17
 
18
18
  // Mutating / stateful tools whose result should carry a `_where` stamp
@@ -332,7 +332,7 @@ export const tools = [
332
332
  properties: {
333
333
  topic: {
334
334
  type: "string",
335
- enum: ["overview", "skill", "solution", "enums", "connector-multi-user", "python_helpers", "widgets", "ui-plugins"],
335
+ enum: ["overview", "skill", "solution", "enums", "connector-multi-user", "python_helpers", "widgets", "ui-plugins", "actor-storage", "voice", "voice-native", "triggers", "sub-agent", "consumer-roles", "mobile-connector"],
336
336
  description:
337
337
  "What to fetch: 'overview' = API overview + endpoints, 'skill' = full skill spec, 'solution' = full solution spec, 'enums' = all enum values, 'connector-multi-user' = multi-user connector guide, 'python_helpers' = adas.* helper namespace for run_python_script orchestration (read this when designing personas that read state → call tools → checkpoint → status; without it, scripts hand-roll JSON parsing and tool delegation = 5-10x larger and brittler), 'widgets' = widget (UI plugin) spec: catalog model, how_to_use block shape (solution.json snippet + opener_call + persona_phrasing + binding_notes), and rules for declaring ui_plugins. Pair with ateam_get_widget_catalog for the live per-tenant inventory. 'ui-plugins' = the DEEP React Native (mobile) plugin build guide: author in rn-src/, compile with a build:rn esbuild script (format=cjs, target=es2015, external react/react-native/@adas/plugin-sdk) to rn-bundle/index.bundle.js, plain-object export — read this before authoring any MOBILE widget.",
338
338
  },
@@ -1863,6 +1863,16 @@ const SPEC_PATHS = {
1863
1863
  python_helpers: "/spec/python_helpers",
1864
1864
  widgets: "/spec/widgets",
1865
1865
  "ui-plugins": "/spec/ui-plugins",
1866
+ // Capability topics — MUST stay in sync with the capability catalog's
1867
+ // spec_topic values so every ateam_design_advisor `read_spec` pointer
1868
+ // resolves (was OPEN-19: advisor pointed at topics get_spec didn't accept).
1869
+ "actor-storage": "/spec/actor-storage",
1870
+ voice: "/spec/voice",
1871
+ "voice-native": "/spec/voice-native",
1872
+ triggers: "/spec/triggers",
1873
+ "sub-agent": "/spec/sub-agent",
1874
+ "consumer-roles": "/spec/consumer-roles",
1875
+ "mobile-connector": "/spec/mobile-connector",
1866
1876
  };
1867
1877
 
1868
1878
  const EXAMPLE_PATHS = {
@@ -2723,10 +2733,20 @@ const handlers = {
2723
2733
  message: `Authenticated to tenant "${resolvedTenant}"${urlNote}. ${result.solutions?.length || 0} solution(s) found.`,
2724
2734
  };
2725
2735
  } catch (err) {
2736
+ // OPEN-18: a well-formed `adas_<tenant>_<hex>` key that's rejected is often
2737
+ // a key for the OTHER environment (a dev key against the prod base, or vice
2738
+ // versa). Surface the base we tried and, if it looks like that mismatch,
2739
+ // hint the dev-api retry — instead of a generic "invalid/unconfigured key".
2740
+ const base = getBaseUrl(sessionId) || "";
2741
+ const wellFormedKey = parseApiKey(api_key).isValid;
2742
+ const triedProd = /(?:^|\/\/)api\.ateam-ai\.com/.test(base);
2743
+ const hint = wellFormedKey && triedProd
2744
+ ? ` This is a well-formed tenant key ("adas_${resolvedTenant}_…") but ${base} rejected it — if it's a DEV key, retry: ateam_auth(api_key, url:"https://dev-api.ateam-ai.com").`
2745
+ : ` (tried ${base || "the default base"})`;
2726
2746
  return {
2727
2747
  ok: false,
2728
2748
  tenant: resolvedTenant,
2729
- message: `Authentication failed: ${err.message}. The user can get a valid API key at https://mcp.ateam-ai.com/get-api-key`,
2749
+ message: `Authentication failed: ${err.message}.${hint} The user can get a valid API key at https://mcp.ateam-ai.com/get-api-key`,
2730
2750
  };
2731
2751
  }
2732
2752
  },