{"serverId":"mcp-registry/io.github.ariekogan/ateam-mcp","tools":[{"name":"ateam_build_and_run","fixed":{"name":"ateam_build_and_run","description":"DEPLOY THE CURRENT MAIN BRANCH TO A-TEAM CORE. ⚠️ HEAVIEST OPERATION (60-180s): validates solution+skills → deploys all connectors+skills to Core (regenerates MCP servers) → health-checks → optionally runs a warm test → auto-pushes to GitHub.\n\n🌳 DEV/PROD WORKFLOW:\n  1. Edit files → ateam_github_patch (writes to `dev` branch by default)\n  2. (Optional) Preview what's about to ship → ateam_github_diff\n  3. Ship dev → main → ateam_github_promote (merges + auto-tags `prod-YYYY-MM-DD-NNN`)\n  4. Depl","inputSchema":{"type":"object","required":[],"properties":{"github":{"type":"boolean","description":"Optional: if true, pull connector source code from main. AUTO-DETECTED: if you omit both mcp_store and github, the system checks if a repo exists and pulls from main automatically."},"skills":{"type":"array","items":{"type":"object"},"description":"Optional after first deploy: skill definitions. If omitted, auto-pulled from main (skills/{id}/skill.json)."},"solution":{"type":"object","description":"Full solution definition. Required on first deploy. After first deploy, just pass solution_id instead — everything is auto-pulled from GitHub main."},"mcp_store":{"type":"object","description":"Optional: connector source code files. Key = connector id, value = array of {path, content}."},"connectors":{"type":"array","items":{"type":"object"},"description":"Optional: connector metadata (id, name, transport). Entry points auto-detected from mcp_store."},"solution_id":{"type":"string","description":"The solution ID. Use this INSTEAD of passing the full solution object — the solution definition is auto-pulled from main. Required if solution object is omitted."},"test_message":{"type":"string","description":"Optional: send a test message after deployment to verify the skill works. Returns the full execution result."},"test_skill_id":{"type":"string","description":"Optional: which skill to test (defaults to the first skill)."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":554,"tokensAfter":554},{"name":"ateam_chain_status","fixed":{"name":"ateam_chain_status","description":"SLIM chain status — the chip-quick poll. Given a chain_id (from ateam_conversation), returns the WHOLE-CHAIN aggregate status cheaply: chain_status + chain_done (true only when the ENTIRE chain — root job + every handoff + askAnySkill subcall — is terminal), plus pending_question, result, and a short progress line.\n\nThis is what you poll on a loop after ateam_conversation — NOT ateam_get_chain (that returns the full tree; too heavy for periodic polling). A single job can finish while the chain i","inputSchema":{"type":"object","required":["chain_id"],"properties":{"job_id":{"type":"string","description":"Alias for chain_id — any job in the chain resolves to the chain aggregate. The handler has always accepted it; without this declaration MCP stripped it before the handler could see it."},"actor_id":{"type":"string","description":"Optional. WHO is asking. A job belongs to an actor and Core enforces that on per-job reads, so a tenant key alone is refused. Usually unnecessary — the session remembers the actor from ateam_conversation/ateam_test_skill. Pass it to inspect a job run by a DIFFERENT actor (e.g. a real user's)."},"chain_id":{"type":"string","description":"The chain id returned by ateam_conversation (the conversation's identity). Any job id in the chain also works — Core resolves the chain aggregate."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":383,"tokensAfter":383},{"name":"ateam_create_connector","fixed":{"name":"ateam_create_connector","description":"Scaffold a new MCP connector with server.js + package.json + README. Eliminates ~50% of identical boilerplate (MCP server setup, tool registration, stdio transport). You then fill in the tool implementations. Set ui_capable=true to include ui.listPlugins / ui.getPlugin stubs (plugin source files added separately via ateam_create_plugin). After scaffolding, the files are uploaded to Core via the same path as ateam_upload_connector.","inputSchema":{"type":"object","required":["solution_id","connector_id"],"properties":{"name":{"type":"string","description":"Human-readable name for the connector (e.g. 'Hue Lights'). Defaults to connector_id."},"ui_capable":{"type":"boolean","description":"If true, include ui.listPlugins/ui.getPlugin handler stubs. Default: false."},"solution_id":{"type":"string","description":"The solution ID"},"connector_id":{"type":"string","description":"Connector ID (lowercase-with-dashes, no spaces). Becomes the directory name."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":282,"tokensAfter":282},{"name":"ateam_create_plugin","fixed":{"name":"ateam_create_plugin","description":"Scaffold a UI plugin (iframe HTML, React Native TSX, or both) inside an existing connector. Eliminates ~50% of identical plugin boilerplate (imports, theme/bridge hooks, postMessage protocol, default export shape). You then fill in the component body. Use kind='iframe' for web-only, 'rn' for mobile-only, 'adaptive' for both. Also writes ui-dist/<plugin>/manifest.json with the required render block.\n\n⚠️ RENDERING IS NOT AUTOMATIC. At deploy, Phase 5 discovers plugins by calling each connector's u","inputSchema":{"type":"object","required":["solution_id","connector_id","plugin_name"],"properties":{"kind":{"enum":["iframe","rn","adaptive"],"type":"string","description":"Render mode. 'adaptive' (default) produces both iframe + RN scaffolds."},"plugin_name":{"type":"string","description":"Plugin name (lowercase-with-dashes). E.g. 'memories-panel'. Becomes the dir name."},"solution_id":{"type":"string","description":"The solution ID"},"connector_id":{"type":"string","description":"Existing connector to add the plugin into (e.g. 'personal-assistant-ui-mcp')"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":311,"tokensAfter":311},{"name":"ateam_delete_connector","fixed":{"name":"ateam_delete_connector","description":"⚠️ CASCADING — any skill whose engine.bootstrap_tools or tools[] name a tool from this connector will FAIL its next execution. Stops and deletes the connector from A-Team Core; drops references from the solution definition (grants, platform_connectors, ui_plugins ids starting `mcp:<connector-id>:*`) and skill definitions (connectors array); cleans up mcp-store files. ALSO REMOVES THE SOURCE: `connectors/<id>/` is deleted from the repo (main AND dev) in the same call, so the delete is DURABLE. Th","inputSchema":{"type":"object","required":["solution_id","connector_id","confirm"],"properties":{"confirm":{"type":"boolean","description":"REQUIRED. Must be exactly true. A missing/false value refuses the call with a recovery hint."},"solution_id":{"type":"string","description":"The solution ID (e.g. 'smart-home-assistant')"},"connector_id":{"type":"string","description":"The connector ID to remove (e.g. 'device-mock-mcp')"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":273,"tokensAfter":273},{"name":"ateam_delete_skill","fixed":{"name":"ateam_delete_skill","description":"⚠️ IRREVERSIBLE in Core + Builder FS — kills the running MCP process, unregisters from skill registry, deletes the Mongo record, drops from solution.skills[] and solution.linked_skills, and removes the skill's files from Builder FS. REQUIRES `confirm:true`. RECOVERY: the skill still lives in GitHub — `ateam_github_pull` rebuilds the whole solution (no per-skill restore path).","inputSchema":{"type":"object","required":["solution_id","skill_id","confirm"],"properties":{"confirm":{"type":"boolean","description":"REQUIRED. Must be exactly true. A missing/false value refuses the call with a recovery hint."},"skill_id":{"type":"string","description":"The skill ID to remove (e.g. 'linkedin-agent')"},"solution_id":{"type":"string","description":"The solution ID (e.g. 'personal-adas')"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":233,"tokensAfter":233},{"name":"ateam_delete_solution","fixed":{"name":"ateam_delete_solution","description":"⚠️ IRREVERSIBLE — kills Mongo state, running MCP processes, and Builder FS for the whole solution and every skill. REQUIRES `confirm:true` AND `confirm_solution_id` echoing the solution id you're destroying (defeats typos and hallucinated ids). RECOVERY: the GitHub repo is untouched; `ateam_github_pull` rebuilds the solution from `main`. Prefer that over re-deploying from memory.","inputSchema":{"type":"object","required":["solution_id","confirm","confirm_solution_id"],"properties":{"confirm":{"type":"boolean","description":"REQUIRED. Must be exactly true. A missing/false value refuses the call with a recovery hint."},"solution_id":{"type":"string","description":"The solution ID to delete"},"confirm_solution_id":{"type":"string","description":"REQUIRED. Must exactly equal `solution_id`. This defeats typos and hallucinated ids — you can't wipe a solution you couldn't spell."}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":261,"tokensAfter":261},{"name":"ateam_get_chain","fixed":{"name":"ateam_get_chain","description":"Inspect the full chain tree — the whole run rooted at chain_id, walking down through every handoff and askAnySkill subcall.\n\nUse when a chain has already run and you want to analyze the structure: which skill called which, how deep the call tree went, which tool inside which job invoked which sub-tool. The two main shapes:\n  • response.data.chainJobs[] — one entry per job in the chain. Fields: jobId, skill, status, iteration, depth (0 = root, +1 per askAnySkill subcall hop), relation ('root' | '","inputSchema":{"type":"object","required":[],"properties":{"job_id":{"type":"string","description":"Alias for chain_id. Any job inside the chain works — Core walks up to the root — but you rarely hold one; prefer chain_id."},"actor_id":{"type":"string","description":"Optional. WHO is asking. A job belongs to an actor and Core enforces that on per-job reads, so a tenant key alone is refused. Usually unnecessary — the session remembers the actor from ateam_conversation/ateam_test_skill. Pass it to inspect a job run by a DIFFERENT actor (e.g. a real user's)."},"chain_id":{"type":"string","description":"THE EXECUTION'S IDENTITY — what ateam_conversation returns and what you actually hold. A chain is the whole run: root job + every handoff + every askAnySkill subcall. Prefer this."},"skill_slug":{"type":"string","description":"Optional. The skill slug for the job — speeds up the lookup when the job isn't in memory and must be loaded from storage. Omit if you don't have it; lookup still works but does an extra round-trip."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":440,"tokensAfter":440},{"name":"ateam_get_connector_source","fixed":{"name":"ateam_get_connector_source","description":"Read a connector's AUTHORED source — the code the Builder holds as the source of record (its authored store, or GitHub). Returns a file manifest, or one file's content with path:'<file>'. Use this BEFORE patching or rewriting a connector, so you make surgical fixes instead of blind full rewrites. Every answer carries `provenance` (authored_fs | github) so you know which store you are reading.\n\nThis does NOT return what Core is currently RUNNING. Those are different questions and used to share on","inputSchema":{"type":"object","required":["solution_id","connector_id"],"properties":{"path":{"type":"string","description":"Optional. Read ONE file (e.g. 'server.js', 'ui-dist/panel/index.html'). Omit to get a file manifest (paths + sizes, no content) — a whole connector's source exceeds the ~50KB output limit and truncates, so read files one at a time."},"solution_id":{"type":"string","description":"The solution ID (e.g. 'smart-home-assistant')"},"connector_id":{"type":"string","description":"The connector ID to read (e.g. 'home-assistant-mcp')"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":310,"tokensAfter":310},{"name":"ateam_get_deployed_connector_source","fixed":{"name":"ateam_get_deployed_connector_source","description":"Read the DEPLOYED copy of a connector — the files ADAS Core is actually running. This is a runtime projection of the last successful deploy, NOT the source of record: it can differ from the authored source, and it may exist for a connector the Builder cannot reproduce at all. Answers carry authored_source_of_record:false so that is never in doubt.\n\nUse it to diagnose (\"what is actually running?\"), to compare against ateam_get_connector_source, or to inspect a connector whose authored source is m","inputSchema":{"type":"object","required":["solution_id","connector_id"],"properties":{"path":{"type":"string","description":"Optional. Read ONE file. Omit for a manifest (paths + sizes) — a whole connector exceeds the output limit and truncates."},"solution_id":{"type":"string","description":"The solution ID"},"connector_id":{"type":"string","description":"The connector ID to inspect"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":267,"tokensAfter":267},{"name":"ateam_get_examples","fixed":{"name":"ateam_get_examples","description":"Get complete working examples that pass validation. Study these before building your own.","inputSchema":{"type":"object","required":["type"],"properties":{"type":{"enum":["skill","connector","connector-ui","solution","script-cache-skill","ui-plugin-native","ui-plugin-iframe","device-tools","index"],"type":"string","description":"Example type: 'skill' = Order Support Agent, 'connector' = stdio MCP connector, 'connector-ui' = UI-capable connector, 'solution' = full 3-skill e-commerce solution, 'script-cache-skill' = fat-tool skill with script_cache opt-in (reference implementation of script-level JIT shortcuts — study this before building any browser-automation skill), 'ui-plugin-native' = complete working React Native (mobile) UI plugin (rn-src/index.tsx + esbuild build:rn → rn-bundle, @adas/plugin-sdk, es2015), 'ui-plugin-iframe' = complete working web (iframe) UI plugin with the postMessage protocol, 'device-tools' = a solution's OWN tools that execute ON THE PHONE (runtime:\"device\") — BOTH halves and why they must agree: the plugin-bundle implementation, the connector manifest that declares it (Core cannot introspect a phone, so the manifest is the entire contract), and the skill wiring without which the skill gets none of them. Read this before designing anything that needs a LIVE device reading rather than the last synced one, 'index' = list all available examples"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":401,"tokensAfter":401},{"name":"ateam_get_execution_logs","fixed":{"name":"ateam_get_execution_logs","description":"Get execution logs for a solution — recent jobs with step traces, tool calls, errors, and timing. Essential for debugging what actually happened during skill execution. (Advanced.)","inputSchema":{"type":"object","required":["solution_id"],"properties":{"limit":{"type":"number","description":"Max jobs to return (default: 10, max: 50)"},"job_id":{"type":"string","description":"Optional: get detailed trace for a specific job ID"},"actor_id":{"type":"string","description":"The actor whose job this is. REQUIRED for per-job detail: a job belongs to an actor and Core refuses the detail endpoint without one (the list form does not check). Use the same actor_id you passed to ateam_conversation."},"chain_id":{"type":"string","description":"The CHAIN id — what ateam_conversation returns and ateam_chain_status takes. Prefer this: it is the id you actually hold. Resolved to the underlying job for you."},"skill_id":{"type":"string","description":"Optional: filter logs to a specific skill"},"solution_id":{"type":"string","description":"The solution ID"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":308,"tokensAfter":308},{"name":"ateam_get_lessons","fixed":{"name":"ateam_get_lessons","description":"Read what EARLIER runs on this solution learned — newest first, bounded. Call this during orientation, BEFORE planning: it is the only thing that carries context across runs, and it is cheap. Each entry says which tool misled a previous run, the verbatim error, what was tried instead, and whether that worked. An empty list is a real answer (nothing learned yet).","inputSchema":{"type":"object","required":["solution_id"],"properties":{"limit":{"type":"number","description":"Max entries, newest first (default 20)"},"solution_id":{"type":"string","description":"The solution ID"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":175,"tokensAfter":175},{"name":"ateam_get_metrics","fixed":{"name":"ateam_get_metrics","description":"Get execution metrics — timing, tool stats, bottlenecks, signals, and recommendations. (Advanced.)","inputSchema":{"type":"object","required":["solution_id"],"properties":{"job_id":{"type":"string","description":"Optional: deep analysis for a specific job"},"actor_id":{"type":"string","description":"Optional. WHO is asking. A job belongs to an actor and Core enforces that on per-job reads, so a tenant key alone is refused. Usually unnecessary — the session remembers the actor from ateam_conversation/ateam_test_skill. Pass it to inspect a job run by a DIFFERENT actor (e.g. a real user's)."},"chain_id":{"type":"string","description":"Optional: deep analysis for the job behind a CHAIN id — what ateam_conversation returns and what you actually hold. Resolved to the job for you."},"skill_id":{"type":"string","description":"Optional: recent metrics for a specific skill"},"solution_id":{"type":"string","description":"The solution ID"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":275,"tokensAfter":275},{"name":"ateam_get_progress","fixed":{"name":"ateam_get_progress","description":"What this build has already ACHIEVED — read it FIRST when continuing a run, before any orientation call. Returns the CURRENT status per step (latest entry wins) plus recent history.\n\nThen build only the steps that are ABSENT or not yet `verified`.\n\nABSENT IS NOT \"NOTHING WAS DONE\" — the journal may predate a step, or a run may have died before writing. It is a fast path, not a new source of truth: check before rebuilding something expensive.\n\nComplements ateam_get_lessons, which records what BRO","inputSchema":{"type":"object","required":["solution_id"],"properties":{"limit":{"type":"number","description":"History entries to return (default 60). `steps` is always complete."},"solution_id":{"type":"string","description":"The solution ID"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":223,"tokensAfter":223},{"name":"ateam_get_solution","fixed":{"name":"ateam_get_solution","description":"Read solution state — definition, skills, health, status, or export. Use this to inspect deployed solutions.","inputSchema":{"type":"object","required":["solution_id","view"],"properties":{"view":{"enum":["definition","skills","health","status","export","validate","connectors_health"],"type":"string","description":"What to read: 'definition' = full solution def, 'skills' = list skills, 'health' = live health check, 'status' = deploy status, 'export' = exportable bundle, 'validate' = re-validate from stored state, 'connectors_health' = connector status"},"limit":{"type":"number","description":"Optional byte-paging: max bytes of the serialized result to return in this page (pair with 'offset'). Omit both for the whole result (may truncate at the output cap)."},"offset":{"type":"number","description":"Optional byte-paging: start returning the serialized result from this byte offset. Use with 'limit' to page a result larger than the ~50KB output cap; the response's _paging.next_offset gives the next page (null when done). Concatenate the `content` slices across pages, then JSON.parse."},"section":{"type":"string","description":"Optional (with skill_id): return ONLY this section of the skill instead of the whole definition — avoids the ~50KB output truncation on big skills. Dotted paths work (e.g. 'role', 'tools', 'intents.supported', 'policy', 'engine'). Omit for the full skill; use ateam_show_skill_minimal for the slim authoring view."},"skill_id":{"type":"string","description":"Optional: read a specific skill by ID (original or internal)"},"solution_id":{"type":"string","description":"The solution ID"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":465,"tokensAfter":465},{"name":"ateam_get_spec","fixed":{"name":"ateam_get_spec","description":"Get the A-Team specification — schemas, validation rules, system tools, agent guides, and templates. Start here after bootstrap to understand how to build skills and solutions. Use 'section' to get just one part of the skill spec (much smaller than the full spec). Use 'search' to find specific fields or concepts across the spec.\n\nWhen designing a persona that orchestrates logic via run_python_script (the Python-as-orchestrator pattern), also fetch topic='python_helpers' — that returns the adas.*","inputSchema":{"type":"object","required":["topic"],"properties":{"topic":{"enum":["capabilities","realizations","overview","skill","solution","enums","connector-multi-user","python_helpers","widgets","ui-plugins","actor-storage","voice","voice-native","triggers","sub-agent","consumer-roles","mobile-connector","device-capabilities","monitoring"],"type":"string","description":"What to fetch: 'realizations' = HOW to build a capability: for each one the valid physical routes with use_when / do_not_use_when / execution / freshness, so device-dependent design picks a route deliberately instead of by accident. 'capabilities' = START HERE IF YOU ARE NEW — the capability index, organised by what a solution DOES rather than by our build artifacts: can I see what the user sees? talk with them out loud? know where they are and that they are moving? act while they sleep? remember each user? show them something? Each question gets a one-word answer (yes / yes-with-gaps / not yet / unknown) and the topics to read next. Every other topic below is named after an ARTIFACT, so if you do not already know our vocabulary this is the only door you can find by thinking about your own problem. '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. 'device-capabilities' = THE DEVICE CAPABILITY MATRIX, GENERATED from the mobile SDK's own artefacts and stamped with their hashes: every native.* API (mechanical one-shot verbs), every deviceState.* domain (semantic state a reasoning loop reads, with freshness + confidence) and every server-called device.* tool, each with status (done / partial / shape-only / missing) and what is left. READ THIS before concluding the phone cannot do something — camera, video, scanning, vision, sensors, location, on-device storage. Absence from any other spec topic is NOT evidence. 'monitoring' = THE MONITORING CONTRACT: which tools are safe to call in a poll loop (with cost / poll interval / whether output stays bounded as the run grows), which are not and what to use instead, plus the running ateam-mcp version. Read this BEFORE writing any loop that watches a build — the safe poll is ateam_chain_status, never ateam_get_chain."},"search":{"type":"string","description":"Optional: filter the spec to only sections containing this search term. Works with any topic. Example: search='bootstrap' returns only fields/sections mentioning 'bootstrap'."},"section":{"enum":["engine","tools","intents","policy","triggers","connectors","role","template","guide"],"type":"string","description":"Optional: get just one section of the skill spec (only works with topic='skill'). Sections: 'engine' = model/reasoning/planner optimization/bootstrap tools, 'tools' = tool definitions/meta tools, 'intents' = intents/problem/scenarios, 'policy' = access control/grants/workflows, 'triggers' = automation triggers, 'connectors' = connector linking/channels, 'role' = persona/goals, 'template' = minimal quick start, 'guide' = build steps/common mistakes"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":1239,"tokensAfter":1239},{"name":"ateam_get_widget_catalog","fixed":{"name":"ateam_get_widget_catalog","description":"Get the live catalog of widgets (UI plugins) available in this tenant's solution. Returns platform-bundled + solution-bundled + skill-declared widgets, each with a paste-ready how_to_use block (solution.json snippet + opener_call + persona_phrasing + binding_notes).\n\nUse this when wiring widgets into a skill or solution — the how_to_use block is designed to be copied verbatim into the solution.json ui_plugins[] entry and into the persona's opener phrasing, so you don't have to hand-roll either. ","inputSchema":{"type":"object","required":[],"properties":{"format":{"enum":["summary","full"],"type":"string","description":"Optional. 'full' (default) returns each widget with its paste-ready how_to_use block (solution.json snippet, opener_call, persona_phrasing, binding_notes). 'summary' returns just id/name/origin/description for a quick overview."},"origin":{"enum":["all","platform","solution","skill"],"type":"string","description":"Optional. Filter by widget origin. 'all' (default) returns everything. 'platform' = platform-bundled only. 'solution' = solution-bundled only. 'skill' = skill-declared only."},"solution_id":{"type":"string","description":"Optional. The solution to query. Defaults to the tenant's current solution."},"include_unused":{"type":"boolean","description":"Optional. If true, includes widgets that are available but not currently referenced by any skill or ui_plugins entry. Default false (only widgets actually wired into the solution)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":426,"tokensAfter":426},{"name":"ateam_get_workflows","fixed":{"name":"ateam_get_workflows","description":"Get the builder workflows — step-by-step state machines for building skills and solutions. Use this to guide users through the entire build process conversationally. Returns phases, what to ask, what to build, exit criteria, and tips for each stage.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":96,"tokensAfter":96},{"name":"ateam_github_list_versions","fixed":{"name":"ateam_github_list_versions","description":"List all available checkpoints (safe-* tags) for a solution. Shows tag name, date, counter, and commit SHA. Use before rollback to see available safe points.","inputSchema":{"type":"object","required":["solution_id"],"properties":{"solution_id":{"type":"string","description":"The solution ID"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":97,"tokensAfter":97},{"name":"ateam_github_patch","fixed":{"name":"ateam_github_patch","description":"Edit a file in the solution's GitHub repo and commit. Two modes:\n1. FULL FILE: provide `content` — replaces entire file (good for new files or small files)\n2. SEARCH/REPLACE: provide `search` + `replace` — surgical edit without sending full file (preferred for large files like server.js)\nAlways 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\nDEFAULTS TO `dev` BRANCH — writes don't touch prod. Use ateam_github_prom","inputSchema":{"type":"object","required":["solution_id","path"],"properties":{"ref":{"type":"string","default":"dev","description":"Target branch. Default: 'dev' (safe — won't touch prod). Use 'main' only for emergency hotfixes."},"path":{"type":"string","description":"File path to create/update (e.g. 'connectors/home-assistant-mcp/server.js')"},"branch":{"type":"string","description":"Branch to read/write (alias for `ref`). Declared so MCP does not strip it — an undeclared argument is dropped silently, which made a branch:\"dev\" read return `main` with no error."},"search":{"type":"string","description":"Exact text to find in the file (mode 2 — search/replace). Must match exactly including whitespace."},"content":{"type":"string","description":"The full file content to write (mode 1 — full file replacement)"},"message":{"type":"string","description":"Optional commit message (default: 'Update <path>')"},"replace":{"type":"string","description":"Text to replace the search string with (mode 2 — required with search)"},"solution_id":{"type":"string","description":"The solution ID"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":459,"tokensAfter":459},{"name":"ateam_github_read","fixed":{"name":"ateam_github_read","description":"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. Default reads from `main` (deployed/prod state). Pass `ref: 'dev'` to read in-progress work.\n\n⚠️ NOT RUNTIME STATE. For `solution.json` and `skills/<id>/skill.json` this returns a git MIRROR, not what is deployed. Connector-imported tools are regenerated at deploy time, so a repo copy's `tools[]` can differ from production (on one solution `dev`","inputSchema":{"type":"object","required":["solution_id","path"],"properties":{"ref":{"type":"string","default":"main","description":"Branch, tag, or commit SHA to read from. Default: 'main' (prod). Use 'dev' to read in-progress work."},"path":{"type":"string","description":"File path in the repo (e.g. 'connectors/home-assistant-mcp/server.js', 'solution.json', 'skills/order-support/skill.json')"},"branch":{"type":"string","description":"Branch to read/write (alias for `ref`). Declared so MCP does not strip it — an undeclared argument is dropped silently, which made a branch:\"dev\" read return `main` with no error."},"solution_id":{"type":"string","description":"The solution ID"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":345,"tokensAfter":345},{"name":"ateam_github_status","fixed":{"name":"ateam_github_status","description":"Check if a solution has a GitHub repo, its URL, and the latest commit. Use this to verify GitHub integration is working for a solution.","inputSchema":{"type":"object","required":["solution_id"],"properties":{"solution_id":{"type":"string","description":"The solution ID"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":89,"tokensAfter":89},{"name":"ateam_github_write","fixed":{"name":"ateam_github_write","description":"Write a file to the solution's GitHub repo. Use this to create new connector files or replace existing ones — one file per call. This is the PRIMARY way to write connector code after first deploy. 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\nDEFAULTS TO `dev` BRANCH.","inputSchema":{"type":"object","required":["solution_id","path","content"],"properties":{"ref":{"type":"string","default":"dev","description":"Target branch. Default: 'dev'."},"path":{"type":"string","description":"File path to write (e.g. 'connectors/my-mcp/server.js', 'connectors/my-mcp/package.json')"},"content":{"type":"string","description":"The full file content"},"message":{"type":"string","description":"Optional commit message (default: 'Write <path>')"},"solution_id":{"type":"string","description":"The solution ID"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":270,"tokensAfter":270},{"name":"ateam_list_solutions","fixed":{"name":"ateam_list_solutions","description":"List all solutions deployed in the Skill Builder.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":41,"tokensAfter":41},{"name":"ateam_patch","fixed":{"name":"ateam_patch","description":"Surgically update ANY field in a skill or solution definition, redeploy, and optionally re-test — all in one step.\n\n⚠️ MERGE-BY-DEFAULT (v0.4.0) — Arrays are protected from silent replace. Bare array writes on solution.linked_skills / ui_plugins / platform_connectors / handoffs / grants / triggers (etc.) and skill.tools / connectors / handoffs / scenarios are REFUSED to prevent sibling loss. Add or remove items with the _push / _delete / _update suffixes; opt into a full-array replace only when ","inputSchema":{"type":"object","required":["solution_id","target","updates"],"properties":{"source":{"enum":["github","local"],"type":"string","description":"Where the solution/skill definition lives. Omit (DEFAULT) — prefer the tenant's GitHub repo (GitHub is master), but AUTO-DEGRADE to the Builder FS store if the tenant hasn't connected a repo, so a simple def patch always succeeds (it's pushed to GitHub once connected). 'github' — force GitHub; fails loud if not connected (use when you specifically require the repo write). 'local' — force the Builder FS store, no GitHub (repo-less bootstrap tenant). Redeploy is local in all modes."},"target":{"enum":["solution","skill"],"type":"string","description":"What to update: 'solution' for solution definition, 'skill' for skill definition fields (problem, role, intents, tools, policy, engine, scenarios, etc.)"},"dry_run":{"type":"boolean","description":"If true, apply the patch in memory and return the diff (arrays_merged, arrays_replaced, dropped_ids, added_ids, would_write_bytes) WITHOUT writing to GitHub or redeploying. Preview a change before committing to it."},"updates":{"type":"object","description":"The update payload. Use dot notation for nested scalars (e.g. 'problem.statement': 'new value'). For arrays, use _push/_delete/_update suffixes (e.g. 'tools_push', 'tools_delete'). You can update ANY field in the skill definition: problem, role, intents, tools, policy, engine, scenarios, glossary, etc."},"skill_id":{"type":"string","description":"Required when target is 'skill'. The skill ID to patch."},"solution_id":{"type":"string","description":"The solution ID"},"test_message":{"type":"string","description":"Optional: re-test the skill after patching. Requires skill_id."},"include_definition":{"type":"boolean","description":"If true, return the FULL patched definition. Default false — the result returns a compact patched_summary instead, because the full definition can exceed the ~50KB output limit and truncate the rest of the result (redeploy status, widget_health)."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":723,"tokensAfter":723},{"name":"ateam_show_skill_minimal","fixed":{"name":"ateam_show_skill_minimal","description":"Show the minimal authoring view of a skill — persona + connectors + handoff_when + style + policy guardrails only. ~10× smaller than ateam_get_solution(view:'skills') for the same skill. Use this when you only need the irreducible author content (Phase 9 of the strip).","inputSchema":{"type":"object","required":["solution_id","skill_id"],"properties":{"skill_id":{"type":"string","description":"The skill ID"},"solution_id":{"type":"string","description":"The solution ID"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":147,"tokensAfter":147},{"name":"ateam_show_solution_minimal","fixed":{"name":"ateam_show_solution_minimal","description":"Show the minimal authoring view of a solution — name + description + style + routing_mode + identity_mode + skill ids + connector ids only. Skips deployed metadata, handoffs (auto-generated), grants, ui_plugins, validation results. Use this for fast inspection without the verbose fields (Phase 9 of the strip).","inputSchema":{"type":"object","required":["solution_id"],"properties":{"solution_id":{"type":"string","description":"The solution ID"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":140,"tokensAfter":140},{"name":"ateam_spec_search","fixed":{"name":"ateam_spec_search","description":"Semantic search over the FULL ateam platform /spec documentation — the deep fallback behind ateam_design_advisor. Ask a natural-language 'how do I…' question and get the most relevant doc chunks (with their topic + heading), then read the full topic via ateam_get_spec(topic). Use this when the advisor's pointer isn't enough, or for details/examples on anything — including topics outside the curated capability list. Read-only.","inputSchema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","description":"Natural-language question, e.g. 'how do I send a proactive daily reminder?' or 'per-user persistence'."},"top_k":{"type":"number","description":"How many chunks to return (default 8, max 25)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":216,"tokensAfter":216},{"name":"ateam_status_all","fixed":{"name":"ateam_status_all","description":"Show GitHub sync status for ALL tenants and solutions in one call. Requires master key authentication. Returns a summary table of every tenant's solutions with their GitHub sync state.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":77,"tokensAfter":77},{"name":"ateam_test_status","fixed":{"name":"ateam_test_status","description":"Poll the progress of an async test. Pass chain_id for the WHOLE run (recommended — the root job finishing does NOT mean the run finished; a handoff may still be going). Pass job_id to poll one job alone: iteration count, tool call steps, status, and result when done.\n\nSet include_chain:true to ALSO include the full chain tree (every job in the chain, rooted at this job_id, with parent/child linkage). Use when this job dispatched askAnySkill subcalls and you want a single snapshot of the whole mu","inputSchema":{"type":"object","required":["solution_id"],"properties":{"job_id":{"type":"string","description":"ONE job inside the chain, when you want that job alone. Omit and pass chain_id for the whole run — a root job can be 'completed' while a handoff is still running."},"actor_id":{"type":"string","description":"Optional. WHO is asking. A job belongs to an actor and Core enforces that on per-job reads, so a tenant key alone is refused. Usually unnecessary — the session remembers the actor from ateam_conversation/ateam_test_skill. Pass it to inspect a job run by a DIFFERENT actor (e.g. a real user's)."},"chain_id":{"type":"string","description":"THE EXECUTION'S IDENTITY — what ateam_conversation returns and what you actually hold. A chain is the whole run: root job + every handoff + every askAnySkill subcall. Prefer this."},"skill_id":{"type":"string","description":"The skill ID"},"solution_id":{"type":"string","description":"The solution ID"},"include_chain":{"type":"boolean","description":"If true, includes response.chain — the full chain tree rooted at this job_id (chainJobs[] with parentJobId/relation/depth, executionSteps[] with tool-nesting). Costs one extra Core call. Default false (back-compat)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":495,"tokensAfter":495},{"name":"ateam_upload_connector","fixed":{"name":"ateam_upload_connector","description":"Upload connector code to Core and restart — WITHOUT redeploying skills.\n\nMERGES with the GitHub state at `ref` by default (default ref: 'dev'). Sending a partial file set ONLY overlays those files — the rest of the connector is preserved from GitHub. To fully replace the connector dir (historical behavior), pass replace:true.\n\nModes:\n  • github:true (no files)        — deploy the GitHub state at `ref` as-is.\n  • github:true + files:[]        — GitHub state at `ref` as BASE, your files overlay on","inputSchema":{"type":"object","required":["solution_id","connector_id"],"properties":{"ref":{"type":"string","description":"GitHub branch to read from for the BASE state. Default: 'dev' (matches ateam_github_patch). Pass 'main' to read from production. Pre-2026-06-05 callers that relied on the silent-main default must pass ref:'main' explicitly."},"files":{"type":"array","items":{"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"Relative file path (e.g. 'server.js', 'ui-dist/panel/index.html')"},"content":{"type":"string","description":"File content as an inline string. Prefer content_base64 when the content has complex escaping (HTML/JS/JSON)."},"content_base64":{"type":"string","description":"File content as a single-line base64 string — escape-safe. PREFERRED for a multi-file connector so large HTML/JS/bundles don't need hand-escaping in the tool call. Provide exactly ONE of content / content_base64 per file."}}},"description":"Files to upload — each needs 'path' plus ONE of content (inline string) or content_base64 (escape-safe base64; preferred for multi-file connectors). By default merges with the GitHub state at `ref`. Set replace:true to wipe the connector dir and write only these files."},"force":{"type":"boolean","description":"RECOVERY: respawn the connector + re-inject its CURRENT env even when the source is UNCHANGED. Normally an unchanged-source upload no-ops (unchanged:true) and leaves the process running. But a connector spawned before a shared-secret rotation keeps the STALE secret — it still lists tools (looks healthy) yet 401s on every per-actor call, with no recovery short of a fake source edit. Use `ateam_upload_connector(solution_id, connector_id, github:true, force:true)` to pull the current source and force a fresh respawn (which picks up the current secret). Default: false."},"github":{"type":"boolean","description":"If true, pull connector files from GitHub repo at `ref`. Default: false. Combine with files:[] to use GitHub as the base and overlay your files."},"replace":{"type":"boolean","description":"Opt into FULL REPLACE: wipe the connector dir and write only the provided `files`. Default: false (= merge with GitHub state at `ref`). Use with intent — sending an incomplete file set with replace:true will break the connector."},"solution_id":{"type":"string","description":"The solution ID"},"connector_id":{"type":"string","description":"The connector ID to upload (e.g. 'personal-assistant-ui-mcp')"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":853,"tokensAfter":853}],"toolsChanged":32,"tokensSaved":0,"todo":[],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}