{"serverId":"mcp-registry/io.agent4/agent4-io","tools":[{"name":"add_knowledge_file","fixed":{"name":"add_knowledge_file","description":"Add a local file's content to a knowledge base (txt/md/html/pdf/docx).\n\n    **This MCP runs on the platform server and cannot read paths on YOUR machine.** For text\n    files, read the content yourself and call `add_knowledge_text`; for binaries (pdf/docx),\n    upload via the console, or curl `/knowledge-bases/{name}/documents/upload`.\n\n    **To ingest a whole folder, zip it and send that one endpoint** — subdirectories are walked,\n    md/txt/pdf/html/docx are ingested one by one, and document n","inputSchema":{"type":"object","title":"add_knowledge_fileArguments","required":["kb_name","path"],"properties":{"path":{"type":"string","title":"Path"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","default":null},"kb_name":{"type":"string","title":"Kb 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":234,"tokensAfter":234},{"name":"add_knowledge_text","fixed":{"name":"add_knowledge_text","description":"Add a **text** document to a knowledge base (chunking + embedding happen synchronously;\n    returns the real chunk count).\n\n    For **local files** (pdf/docx…) see `add_knowledge_file`.\n    ","inputSchema":{"type":"object","title":"add_knowledge_textArguments","required":["kb_name","title","content"],"properties":{"title":{"type":"string","title":"Title"},"content":{"type":"string","title":"Content"},"kb_name":{"type":"string","title":"Kb 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":139,"tokensAfter":139},{"name":"create_agent","fixed":{"name":"create_agent","description":"Create an agent.\n\n    `name` is lower-cased on save — it is a key, not a display name.\n\n    soul = persona/identity; task = duties and boundaries; tools = tool-name whitelist (check\n    list_tools first; the system tools time/geo/weather **and `compute_chart`** are\n    **auto-enabled by default**, no need to list them — but note that passing `tools` at all\n    replaces that default list, so include them yourself if you pass any);\n    knowledge_bases = attached knowledge base names (once attached","inputSchema":{"type":"object","title":"create_agentArguments","required":["name"],"properties":{"name":{"type":"string","title":"Name"},"soul":{"type":"string","title":"Soul","default":""},"task":{"type":"string","title":"Task","default":""},"alias":{"type":"string","title":"Alias","default":""},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","default":null},"tools":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tools","default":null},"skills":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Skills","default":null},"ask_forms":{"type":"boolean","title":"Ask Forms","default":true},"published":{"type":"boolean","title":"Published","default":false},"knowledge_bases":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Knowledge Bases","default":null}}},"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":394,"tokensAfter":394},{"name":"create_knowledge_base","fixed":{"name":"create_knowledge_base","description":"Create a knowledge base.\n\n    **Write `description` — it is what routes questions to this base.** Before each answer the\n    platform reads every attached base's `description` and decides which ones this question needs;\n    a base whose description is vague or blank gets searched when it should not, or missed when it\n    should. One line, in the words a visitor would use, naming the subject **and the boundary**:\n    \"Country-by-country medical device registration requirements — not company or pr","inputSchema":{"type":"object","title":"create_knowledge_baseArguments","required":["name"],"properties":{"name":{"type":"string","title":"Name"},"top_k":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Top K","default":null},"description":{"type":"string","title":"Description","default":""},"instructions":{"type":"string","title":"Instructions","default":""},"max_distance":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Distance","default":null}}},"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":285,"tokensAfter":285},{"name":"create_share","fixed":{"name":"create_share","description":"Create a **share / integration entry point** for an agent — this is how end users actually reach it.\n\n    **`published=True` only means \"visible\", not \"reachable\"**: for end users to talk to the agent\n    you must create a share. The response carries a directly openable chat link\n    (`{public_base}/s/<token>`) and the website embed URL (`{public_base}/embed/<token>`).\n    For a website widget, paste one line before </body>:\n    `<script src=\"{public_base}/embed.js\" data-token=\"<token>\"></script","inputSchema":{"type":"object","title":"create_shareArguments","required":["agent_name"],"properties":{"label":{"type":"string","title":"Label","default":""},"agent_name":{"type":"string","title":"Agent 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":213,"tokensAfter":213},{"name":"create_skill","fixed":{"name":"create_skill","description":"Create a skill. description = \"when to use\" (goes into the system prompt, keep it short);\n    instructions = the detailed guide (fetched on demand via load_skill).\n\n    The paradigm (important): instructions are visible only AFTER the model calls load_skill — if\n    calling some tool is **mandatory** (\"user gives a phone number → must call save_contact\"), the\n    trigger must be written into description, otherwise models often answer directly without\n    loading the skill and the rule never take","inputSchema":{"type":"object","title":"create_skillArguments","required":["name"],"properties":{"name":{"type":"string","title":"Name"},"tools":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tools","default":null},"description":{"type":"string","title":"Description","default":""},"instructions":{"type":"string","title":"Instructions","default":""}}},"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":260,"tokensAfter":260},{"name":"create_storyline","fixed":{"name":"create_storyline","description":"Create a storyline draft. After creating, self-check with validate_storyline, then\n    publish_storyline.\n\n    user_visibility — what the end user sees of their own run: \"invisible\" (default, no UI),\n    \"named\" (a banner with the storyline name only), \"trail\" (banner + read-only view where\n    untaken branches and future steps are redacted grey blocks), \"full\" (banner with step x/y +\n    full read-only map). `learner_visibility` is the deprecated old name (legacy values\n    hidden/completed_onl","inputSchema":{"type":"object","title":"create_storylineArguments","required":["agent_name","key"],"properties":{"key":{"type":"string","title":"Key"},"name":{"type":"string","title":"Name","default":""},"entry":{"type":"string","title":"Entry","default":"auto"},"graph":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Graph","default":null},"agent_name":{"type":"string","title":"Agent Name"},"allow_exit":{"type":"boolean","title":"Allow Exit","default":false},"is_default":{"type":"boolean","title":"Is Default","default":false},"concurrency":{"type":"string","title":"Concurrency","default":"user"},"description":{"type":"string","title":"Description","default":""},"on_complete":{"type":"string","title":"On Complete","default":"end"},"display_name":{"type":"string","title":"Display Name","default":""},"show_profile":{"type":"boolean","title":"Show Profile","default":false},"enroll_trigger":{"type":"string","title":"Enroll Trigger","default":""},"profile_schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Profile Schema","default":null},"user_visibility":{"type":"string","title":"User Visibility","default":"invisible"},"next_storyline_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Storyline Id","default":null},"allow_agent_enroll":{"type":"boolean","title":"Allow Agent Enroll","default":false},"learner_visibility":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Learner Visibility","default":null}}},"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":575,"tokensAfter":575},{"name":"export_storyline","fixed":{"name":"export_storyline","description":"Export a portable storyline JSON (schema_version + definition; no tenant/version/id) for\n    backup, migration or re-import.","inputSchema":{"type":"object","title":"export_storylineArguments","required":["storyline_id"],"properties":{"storyline_id":{"type":"string","title":"Storyline Id"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":94,"tokensAfter":94},{"name":"get_agent","fixed":{"name":"get_agent","description":"Get one agent's full configuration (soul/task/tools/skills/knowledge_bases/model/params).","inputSchema":{"type":"object","title":"get_agentArguments","required":["name"],"properties":{"name":{"type":"string","title":"Name"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":73,"tokensAfter":73},{"name":"get_end_user","fixed":{"name":"get_end_user","description":"Get one end user's detail: basic profile (name, contact email/phone, city, timezone) + their\n    spaces.\n\n    Never any conversation content. Carries a `console_url` to the user's detail page.","inputSchema":{"type":"object","title":"get_end_userArguments","required":["uid"],"properties":{"uid":{"type":"string","title":"Uid"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":104,"tokensAfter":104},{"name":"get_knowledge_base","fixed":{"name":"get_knowledge_base","description":"Get one knowledge base's configuration (including the full instructions text shown to the model).","inputSchema":{"type":"object","title":"get_knowledge_baseArguments","required":["name"],"properties":{"name":{"type":"string","title":"Name"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":80,"tokensAfter":80},{"name":"get_knowledge_index","fixed":{"name":"get_knowledge_index","description":"Show the structured index profile: per column coverage, type, numeric range, top values, warnings.\n\n    **The warnings are the point.** On a real 4,500-document catalogue this surfaced three data\n    problems nobody knew about: 1,058 documents with `page_count` 0, 505 with `reading_level` 0,\n    493 with `word_count` 0 — those are not zeros, they are missing values recorded as 0, and they\n    silently poison every average, minimum and range filter built on them.\n\n    Report the warnings to the u","inputSchema":{"type":"object","title":"get_knowledge_indexArguments","required":["name"],"properties":{"name":{"type":"string","title":"Name"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":195,"tokensAfter":195},{"name":"get_skill","fixed":{"name":"get_skill","description":"Get one skill's full content (including the complete instructions text).","inputSchema":{"type":"object","title":"get_skillArguments","required":["name"],"properties":{"name":{"type":"string","title":"Name"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":69,"tokensAfter":69},{"name":"get_storyline","fixed":{"name":"get_storyline","description":"Get one storyline's full definition (whole graph + profile_schema + top-level fields).","inputSchema":{"type":"object","title":"get_storylineArguments","required":["storyline_id"],"properties":{"storyline_id":{"type":"string","title":"Storyline Id"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":81,"tokensAfter":81},{"name":"import_storyline","fixed":{"name":"import_storyline","description":"Import an exported storyline JSON as a draft. **Artifacts like \"generate a storyline from a\n    novel / source material\" land here.**\n\n    payload = the structure returned by export_storyline (schema_version + graph + profile_schema\n    + top-level fields). Version-aware: payloads newer than the system supports are rejected.\n    Always creates new, never claims default, key collisions auto-rename.\n    override_agent_name rebinds the imported line to an agent that exists in the target tenant.","inputSchema":{"type":"object","title":"import_storylineArguments","required":["payload"],"properties":{"payload":{"type":"object","title":"Payload","additionalProperties":true},"override_agent_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Override Agent Name","default":null}}},"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":234,"tokensAfter":234},{"name":"list_agents","fixed":{"name":"list_agents","description":"List all agents in this tenant (name + published state).","inputSchema":{"type":"object","title":"list_agentsArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":49,"tokensAfter":49},{"name":"list_end_users","fixed":{"name":"list_end_users","description":"List this tenant's **end users** (the people chatting with your agents) — roster only,\n    never any conversation content.\n\n    Each user carries: display name, login method (email / oauth:* / proxy), email (if any),\n    space/session/document counts, last-24h token usage, and a `console_url` (click through for\n    detail). q filters by name or external id; sort ∈ recent (default) | tokens24h (descending\n    24h usage). Pagination: pass the returned next_cursor back as cursor.\n    Typical: list_","inputSchema":{"type":"object","title":"list_end_usersArguments","properties":{"q":{"type":"string","title":"Q","default":""},"sort":{"type":"string","title":"Sort","default":"recent"},"limit":{"type":"integer","title":"Limit","default":50},"cursor":{"type":"string","title":"Cursor","default":""}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":236,"tokensAfter":236},{"name":"list_knowledge_bases","fixed":{"name":"list_knowledge_bases","description":"List this tenant's knowledge bases (with doc/chunk counts and relevance cutoff).","inputSchema":{"type":"object","title":"list_knowledge_basesArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":60,"tokensAfter":60},{"name":"list_mcp_servers","fixed":{"name":"list_mcp_servers","description":"List the MCP servers connected in this tenant's tool library (read-only; secret fields omitted).","inputSchema":{"type":"object","title":"list_mcp_serversArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":63,"tokensAfter":63},{"name":"list_page_contexts","fixed":{"name":"list_page_contexts","description":"List all page playbooks of this tenant (with match rules, greeting mode, position).","inputSchema":{"type":"object","title":"list_page_contextsArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":60,"tokensAfter":60},{"name":"list_shares","fixed":{"name":"list_shares","description":"List an agent's shares (token / label / disabled / chat link / embed URL / appearance config).\n\n    When the top-level `pretty_url` is non-empty it is the preferred link to give humans\n    (see create_share).","inputSchema":{"type":"object","title":"list_sharesArguments","required":["agent_name"],"properties":{"agent_name":{"type":"string","title":"Agent Name"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":113,"tokensAfter":113},{"name":"list_skills","fixed":{"name":"list_skills","description":"List this tenant's skills.","inputSchema":{"type":"object","title":"list_skillsArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":40,"tokensAfter":40},{"name":"list_storylines","fixed":{"name":"list_storylines","description":"List this tenant's storylines (optionally filtered by agent). Includes state, version, default flag.","inputSchema":{"type":"object","title":"list_storylinesArguments","properties":{"agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent","default":null}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":87,"tokensAfter":87},{"name":"list_tools","fixed":{"name":"list_tools","description":"List tool names assignable to agents, with their descriptions (incl. the tenant's connected MCP tools).","inputSchema":{"type":"object","title":"list_toolsArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":61,"tokensAfter":61},{"name":"list_user_sessions","fixed":{"name":"list_user_sessions","description":"List one end user's **sessions** — metadata only: agent, title (AI summary), message count,\n    tokens, timestamps.\n\n    **Message bodies are not returned.** Transcripts are rendered in the console: each session\n    carries a `console_url` that **deep-links straight to that conversation, auto-opened** (no\n    digging through the detail page when there are many), plus `user_console_url` to the user's\n    detail page as the general entry. Hand the link to the tenant — a human reads the original\n  ","inputSchema":{"type":"object","title":"list_user_sessionsArguments","required":["uid"],"properties":{"uid":{"type":"string","title":"Uid"},"limit":{"type":"integer","title":"Limit","default":50},"cursor":{"type":"string","title":"Cursor","default":""}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":225,"tokensAfter":225},{"name":"page_context_stats","fixed":{"name":"page_context_stats","description":"Open counts and suggested-question click counts per playbook — find copy nobody clicks.","inputSchema":{"type":"object","title":"page_context_statsArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":61,"tokensAfter":61},{"name":"patch_knowledge_index","fixed":{"name":"patch_knowledge_index","description":"Change the structured index schema from one sentence of plain language.\n\n    Example requests: \"also track the author so users can find other books by them\", \"I want to\n    filter by illustrator\", \"drop the cover link\". The model may only emit add/modify/remove/refused\n    — it cannot rewrite the table, so it has no way to damage columns the user did not mention.\n\n    **Data that is not in the documents comes back in `refused`, not as a new column.** Asked for\n    a publication year that the cor","inputSchema":{"type":"object","title":"patch_knowledge_indexArguments","required":["name","request"],"properties":{"name":{"type":"string","title":"Name"},"apply":{"type":"boolean","title":"Apply","default":false},"request":{"type":"string","title":"Request"}}},"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":230,"tokensAfter":230},{"name":"preview_plan","fixed":{"name":"preview_plan","description":"Generate a plan for a goal and return it for review **without persisting anything** — no\n    temporary storyline, no enrollment, no user affected. Use it to inspect plan quality before\n    trusting the feature in production, or to see how the agent's `task` constrains the steps.\n\n    Returns {plan, backend, warnings}. `warnings` flags machine-detectable smells, notably checklist\n    items that are the AGENT's own deliverable (\"produce a summary\") — those can never be ticked off,\n    because tick","inputSchema":{"type":"object","title":"preview_planArguments","required":["agent","goal"],"properties":{"goal":{"type":"string","title":"Goal"},"agent":{"type":"string","title":"Agent"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":205,"tokensAfter":205},{"name":"publish_storyline","fixed":{"name":"publish_storyline","description":"Publish a storyline: validates first (blocking errors → 422), then freezes an immutable\n    version and marks it published.","inputSchema":{"type":"object","title":"publish_storylineArguments","required":["storyline_id"],"properties":{"storyline_id":{"type":"string","title":"Storyline 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":94,"tokensAfter":94},{"name":"resolve_page_context","fixed":{"name":"resolve_page_context","description":"Given a URL (or key), show which playbook it resolves to — always verify after writing a\n    match rule.\n\n    Globs make it easy to write rules that \"look right but never match\" (one `*` short, one path\n    level too many) — and in production the only symptom is visitors silently getting the default\n    playbook, with no error anywhere.\n    ","inputSchema":{"type":"object","title":"resolve_page_contextArguments","properties":{"key":{"type":"string","title":"Key","default":""},"url":{"type":"string","title":"Url","default":""}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":164,"tokensAfter":164},{"name":"search_agent4_docs","fixed":{"name":"search_agent4_docs","description":"Search agent4.io's own product docs — concepts (what a thing *is*) and cookbook recipes (which\n    tool to *call*). Use when you're unsure how an agent4.io feature works, what a term means, or how to\n    build something on the platform. Returns top passages with title, layer (\"concept\"|\"ops\"), url and a\n    snippet. Public content; no tenant data involved.","inputSchema":{"type":"object","title":"search_agent4_docsArguments","required":["query"],"properties":{"k":{"type":"integer","title":"K","default":5},"query":{"type":"string","title":"Query"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":169,"tokensAfter":169},{"name":"search_knowledge_base","fixed":{"name":"search_knowledge_base","description":"Search this knowledge base; returns matching chunks with distances.\n\n    Uses **exactly the same retrieval path as real conversations** — use it to validate the cutoff\n    and chunking: an empty result means this question will be judged \"not covered\" and the agent\n    will answer \"not in the knowledge base\".\n    ","inputSchema":{"type":"object","title":"search_knowledge_baseArguments","required":["kb_name","query"],"properties":{"query":{"type":"string","title":"Query"},"kb_name":{"type":"string","title":"Kb Name"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":161,"tokensAfter":161},{"name":"set_custom_domain","fixed":{"name":"set_custom_domain","description":"Bind the client's own domain to this tenant's chat pages: `https://chat.client.com/` serves\n    the tenant's branded page (or a specific agent's chat), the address bar keeps the client's\n    domain, and the TLS certificate is issued automatically.\n\n    **Have the client configure DNS first**: add a CNAME at their DNS provider pointing to the\n    `cname_target` in the response (`endpoint.agent4.io`). Key points:\n    - **Subdomains only** (`chat.client.com`). An apex domain (`client.com`) cannot c","inputSchema":{"type":"object","title":"set_custom_domainArguments","required":["domain"],"properties":{"domain":{"type":"string","title":"Domain"},"agent_alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Alias","default":null}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":222,"tokensAfter":222},{"name":"set_pwa_branding","fixed":{"name":"set_pwa_branding","description":"Configure a specific **agent's** PWA branding and install experience (applies to that\n    agent's `/s/` standalone chat pages — what gets installed to the home screen is one agent's\n    entry page, so each agent is its own app).\n\n    - `agent`: the agent name whose install branding to configure (required).\n    - `icon_source_url`: public URL of one master image (PNG/JPG/WebP ≥192×192, ideally a square\n      logo). The server derives the full set: browser-tab favicon(48) + install icons 192/512 +","inputSchema":{"type":"object","title":"set_pwa_brandingArguments","required":["agent"],"properties":{"agent":{"type":"string","title":"Agent"},"install_prompt":{"type":"string","title":"Install Prompt","default":""},"icon_source_url":{"type":"string","title":"Icon Source Url","default":""}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":235,"tokensAfter":235},{"name":"tenant_info","fixed":{"name":"tenant_info","description":"This tenant's basic info and quota (plus custom-domain binding status, if any).","inputSchema":{"type":"object","title":"tenant_infoArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":55,"tokensAfter":55},{"name":"update_agent","fixed":{"name":"update_agent","description":"Update **part** of an agent — fields you don't pass stay as they are.\n\n    ⚠️ List-field semantics, don't mix them up: `tools=[...]` / `skills=[...]` /\n    `knowledge_bases=[...]` are **full-list replacement** — items you didn't read first get pushed\n    out. To \"add one / remove one\", use `add_tools` / `remove_tools` (and add_/remove_skills,\n    add_/remove_knowledge_bases): incremental, idempotent, leaves the rest untouched.\n    After the call, **read the response** to verify the final list — ","inputSchema":{"type":"object","title":"update_agentArguments","required":["name"],"properties":{"name":{"type":"string","title":"Name"},"soul":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Soul","default":null},"task":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task","default":null},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","default":null},"tools":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tools","default":null},"skills":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Skills","default":null},"greeting":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Greeting","default":null},"add_tools":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Add Tools","default":null},"ask_forms":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ask Forms","default":null},"published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Published","default":null},"reasoning":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reasoning","default":null},"add_skills":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Add Skills","default":null},"auto_suggest":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Suggest","default":null},"remove_tools":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Remove Tools","default":null},"auto_greeting":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Greeting","default":null},"remove_skills":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Remove Skills","default":null},"suggest_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggest Prompt","default":null},"knowledge_bases":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Knowledge Bases","default":null},"grounding_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Grounding Required","default":null},"add_knowledge_bases":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Add Knowledge Bases","default":null},"remove_knowledge_bases":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Remove Knowledge Bases","default":null}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":792,"tokensAfter":792},{"name":"update_knowledge_base","fixed":{"name":"update_knowledge_base","description":"Update part of a knowledge base — fields you don't pass stay as they are (server-side PATCH merge).","inputSchema":{"type":"object","title":"update_knowledge_baseArguments","required":["name"],"properties":{"name":{"type":"string","title":"Name"},"top_k":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Top K","default":null},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","default":null},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions","default":null},"max_distance":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Distance","default":null}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":189,"tokensAfter":189},{"name":"update_skill","fixed":{"name":"update_skill","description":"Update part of a skill — fields you don't pass stay as they are (server-side PATCH merge,\n    no GET+PUT round-trip).\n\n    ⚠️ `tools=[...]` is **full-list replacement**; to add/remove one use `add_tools`/`remove_tools`\n    (incremental, idempotent). Tools bound to a skill take effect automatically at chat time on any\n    agent the skill is attached to — no need to also add them to the agent's tools.\n    ","inputSchema":{"type":"object","title":"update_skillArguments","required":["name"],"properties":{"name":{"type":"string","title":"Name"},"tools":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tools","default":null},"add_tools":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Add Tools","default":null},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","default":null},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions","default":null},"remove_tools":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Remove Tools","default":null}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":317,"tokensAfter":317},{"name":"update_storyline","fixed":{"name":"update_storyline","description":"Update **part** of a storyline draft — fields you don't pass stay as they are (GET-then-merge\n    on top of a full PUT underneath).\n\n    concurrency: \"user\" = progress belongs to the person (shared across sessions); \"session\" =\n    progress belongs to the case (one run per session). Changes affect only **future** enrolments;\n    in-flight runs are not migrated.\n\n    ⚠️ Especially `graph`: not passing it = keep the existing graph. (This tool once treated \"no\n    graph\" as replace-with-empty — ren","inputSchema":{"type":"object","title":"update_storylineArguments","required":["storyline_id","agent_name","key"],"properties":{"key":{"type":"string","title":"Key"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","default":null},"entry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entry","default":null},"graph":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Graph","default":null},"agent_name":{"type":"string","title":"Agent Name"},"allow_exit":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Exit","default":null},"is_default":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Default","default":null},"concurrency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Concurrency","default":null},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","default":null},"on_complete":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"On Complete","default":null},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","default":null},"show_profile":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Profile","default":null},"storyline_id":{"type":"string","title":"Storyline Id"},"enroll_trigger":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Enroll Trigger","default":null},"profile_schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Profile Schema","default":null},"user_visibility":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Visibility","default":null},"expected_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Version","default":null},"next_storyline_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Storyline Id","default":null},"allow_agent_enroll":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Agent Enroll","default":null},"learner_visibility":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Learner Visibility","default":null}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":716,"tokensAfter":716},{"name":"upsert_page_context","fixed":{"name":"upsert_page_context","description":"Create or fully replace a page playbook.\n\n    `context` is the page background the **server** injects for the agent — write \"who lands on\n    this page, what they are deciding, what they usually worry about\"; do NOT write facts like\n    prices or quotas (those belong in a knowledge base, which also ranks higher in authority).\n\n    `url_pattern` is a glob (`*/pricing`, `*/solutions/*`), matches the path only, ignores query\n    strings and trailing slashes; without it the page must report the key ","inputSchema":{"type":"object","title":"upsert_page_contextArguments","required":["key"],"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label","default":""},"context":{"type":"string","title":"Context","default":""},"greeting":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Greeting","default":null},"position":{"type":"integer","title":"Position","default":100},"questions":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Questions","default":null},"is_default":{"type":"boolean","title":"Is Default","default":false},"url_pattern":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url Pattern","default":null},"greeting_mode":{"type":"string","title":"Greeting Mode","default":"generated"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":370,"tokensAfter":370},{"name":"usage_stats","fixed":{"name":"usage_stats","description":"Usage statistics. group ∈ total | agent | user | space | day | model.\n\n    Metadata only — token counts and event counts, never any conversation content.\n    Use group=\"user\" to see who uses the most, group=\"agent\" for the busiest agent.\n    ","inputSchema":{"type":"object","title":"usage_statsArguments","properties":{"group":{"type":"string","title":"Group","default":"total"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":119,"tokensAfter":119},{"name":"validate_storyline","fixed":{"name":"validate_storyline","description":"Validate the storyline graph (entry / dead ends / unreachable / dangling / cross-line targets\n    / rule dimensions). Returns {ok, errors}. Must pass before publishing.","inputSchema":{"type":"object","title":"validate_storylineArguments","required":["storyline_id"],"properties":{"storyline_id":{"type":"string","title":"Storyline Id"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":107,"tokensAfter":107}],"toolsChanged":42,"tokensSaved":0,"todo":[{"tool":"add_knowledge_file","params":["path","title","kb_name"]},{"tool":"add_knowledge_text","params":["title","content","kb_name"]},{"tool":"build_knowledge_index","params":["name","roles"]},{"tool":"clone_storyline","params":["storyline_id"]},{"tool":"configure_share","params":["label","theme","token","launcher","logo_url","agent_name","custom_css","input_mode","theme_color","highlight_color"]},{"tool":"create_agent","params":["name","soul","task","alias","model","tools","skills","ask_forms","published","knowledge_bases"]},{"tool":"create_knowledge_base","params":["name","top_k","description","instructions","max_distance"]},{"tool":"create_share","params":["label","agent_name"]},{"tool":"create_skill","params":["name","tools","description","instructions"]},{"tool":"create_storyline","params":["key","name","entry","graph","agent_name","allow_exit","is_default","concurrency","description","on_complete","display_name","show_profile","enroll_trigger","profile_schema","user_visibility","next_storyline_id","allow_agent_enroll","learner_visibility"]},{"tool":"diagnose_prompt","params":["field","context","current"]},{"tool":"export_storyline","params":["storyline_id"]},{"tool":"get_agent","params":["name"]},{"tool":"get_end_user","params":["uid"]},{"tool":"get_knowledge_base","params":["name"]},{"tool":"get_knowledge_index","params":["name"]},{"tool":"get_skill","params":["name"]},{"tool":"get_storyline","params":["storyline_id"]},{"tool":"import_storyline","params":["payload","override_agent_name"]},{"tool":"improve_prompt","params":["hint","field","context","current"]},{"tool":"list_end_users","params":["q","sort","limit","cursor"]},{"tool":"list_shares","params":["agent_name"]},{"tool":"list_storylines","params":["agent"]},{"tool":"list_user_sessions","params":["uid","limit","cursor"]},{"tool":"patch_knowledge_index","params":["name","apply","request"]},{"tool":"preview_plan","params":["goal","agent"]},{"tool":"publish_storyline","params":["storyline_id"]},{"tool":"resolve_page_context","params":["key","url"]},{"tool":"search_agent4_docs","params":["k","query"]},{"tool":"search_knowledge_base","params":["query","kb_name"]},{"tool":"set_custom_domain","params":["domain","agent_alias"]},{"tool":"set_pwa_branding","params":["agent","install_prompt","icon_source_url"]},{"tool":"test_planner_trigger","params":["agent","expect","samples","messages"]},{"tool":"test_skill_trigger","params":["agent","skill","loaded","samples","messages","expect_tool"]},{"tool":"unpublish_storyline","params":["storyline_id"]},{"tool":"update_agent","params":["name","soul","task","model","tools","skills","greeting","add_tools","ask_forms","published","reasoning","add_skills","auto_suggest","remove_tools","auto_greeting","remove_skills","suggest_prompt","knowledge_bases","grounding_required","add_knowledge_bases","remove_knowledge_bases"]},{"tool":"update_knowledge_base","params":["name","top_k","description","instructions","max_distance"]},{"tool":"update_skill","params":["name","tools","add_tools","description","instructions","remove_tools"]},{"tool":"update_storyline","params":["key","name","entry","graph","agent_name","allow_exit","is_default","concurrency","description","on_complete","display_name","show_profile","storyline_id","enroll_trigger","profile_schema","user_visibility","expected_version","next_storyline_id","allow_agent_enroll","learner_visibility"]},{"tool":"upsert_page_context","params":["key","label","context","greeting","position","questions","is_default","url_pattern","greeting_mode"]},{"tool":"usage_stats","params":["group"]},{"tool":"validate_storyline","params":["storyline_id"]}],"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."}