On this page

#An AI agent for the app you're building

Vatio gives the app you're building with a coding agent — Claude Code, Cursor or Codex, live or still in progress — an agent that knows the app and its users. Your coding agent builds and tests it from your project through the Vatio MCP; Vatio holds it and runs the conversations with visitor identity, access controls, human handoff and tested changes.

There are no configuration files to keep in your repository: the agent lives on Vatio. You decide what it may do. Your team has every change at once, and your users get it once the tests that pass today pass on it.

#Get started

Two steps, from your app's project.

  1. Connect the Vatio MCP, https://vatio.ai/mcp: the tools your coding agent builds and tests the agent with. In Claude Code, the next step adds it for you. In Cursor, Codex, claude.ai, ChatGPT or any other MCP client, add it as Vatio in Claude and ChatGPT says.

  2. Install the skills and run /vatio-init:

    Terminal window
    npx @vatio-ai/skills

    It copies the Vatio skills into the project and adds the MCP to its .mcp.json. Open Claude Code there, approve the vatio server it asks about, sign in to Vatio when it asks (or run /mcp), and run:

    /vatio-init

    In Cursor, Codex or another coding agent, ask it to use vatio-init.

vatio-init reads your app, asks only what the code cannot answer, builds the agent, writes the tests it must pass, puts it in your app and gives you a link to try it. Signing in, with email, Google or GitHub, creates your account; the inbox is where the agent is tried, connected and supervised. Every change after that reaches your users once its tests pass (Deployments). You need Node.js 20 or newer for the skills.

No app yet, or no code at hand: add the MCP as a connector in Claude, ChatGPT or Cursor and ask for the agent you want, then try it in the inbox's Try the agent.

In Claude Code you can also install the skills as a plugin, which brings the MCP with it and keeps them up to date on its own.

#Improve from real conversations

Report a wrong reply in the inbox and say what should have happened. Then run /vatio-improve in your coding agent. It fixes the cause through the MCP (or in your backend, when that is where it is). Your team has each fix at once, and Vatio replays the reported cases and your tests against it: your users get it once every test that passes today passes on it, and a test it breaks holds it back from them (Deployments).

The daily email brings the command when new reports arrive. This is an owner-led routine; Vatio does not rewrite your agent by itself. Tests cover reported cases, not every possible conversation.

#Where to do what

  • Your coding agent, through the MCP: create the agent, change its behavior and connections, and write and run its tests.
  • Inbox (inbox.vatio.ai): follow conversations, reply as a person, report mistakes and read the knowledge. Whoever builds the agent also finds there Try the agent (talk to the newest version on the web, WhatsApp or Instagram) and the team's conversations, marked Team among the customers' in Conversations; where the newest change stands, and Undo the last change, in Continuous improvement; the agent itself in Agent (who it is, what it was told, what it knows and its tools, read-only); under Channels, WhatsApp, Instagram, Web chat (the widget and the business's name and brand) and Integrations (the SDKs); API keys, Webhooks, Secrets, and, for the owner, Team and Security. Supervisors and viewers get the conversations, improvement, analytics and knowledge sections; Teams has who sees what.

#Technical reference

The pages below are the contract your coding agent works from: the agent, tools, knowledge, authentication, channels and APIs, each changed through the MCP's tools. The quickstart walks through those tools by hand. A team that keeps its agent as files in a repository (vatio.yml, deployed with vatio push) uses the CLI and the manifest; commands written as vatio assume a global CLI install, and npx @vatio-ai/cli@latest works in their place.

#Build

#Connect

#Source code

Everything you install is a public repository under github.com/vatio-ai. Read the source there, and open an issue in the repository of the package that misbehaved.

RepositoryWhat it isInstall
vatio-ai/cliThe CLInpx @vatio-ai/cli
vatio-ai/skillsSkills for coding agentsnpx @vatio-ai/skills
vatio-ai/widgetThe web widgetnpm install @vatio-ai/widget
vatio-ai/sdkBrowser SDKnpm install @vatio-ai/sdk
vatio-ai/iosiOS SDKSwift Package Manager
vatio-ai/androidAndroid SDKcom.github.vatio-ai:android on JitPack
vatio-ai/flutterFlutter SDKflutter pub add vatio from pub.dev
vatio-ai/rubyRuby gemgem "vatio-sdk" from RubyGems

The widget, the skills and the gem are MIT. The CLI and the SDKs are source-available under the license in each repository.

#For coding agents

This entire site is also one Markdown file: /docs.md, or vatio docs from the terminal. Every individual page is available as Markdown at its own path plus .md — /mcp.md, for instance — so an agent can read the one page it needs rather than the whole contract. The index of them is /llms.txt.

Terminal window
vatio docs --save vatio-docs.md
vatio docs tools # one page
vatio docs search request.requires

That fetches the documentation from your configured Vatio host. Run it again to refresh the file; the CLI keeps no offline cache. vatio docs PAGE prints one page, and vatio docs search TERM the sections that mention TERM, with their page and the lines around each match; see Reading the docs.

You build, test and change the agent with the Vatio MCP's tools (list_workspaces, update_agent, chat_with_agent, add_test…). Vatio holds the agent: nothing about it goes into the app's repository except what puts it in the app, and any endpoint of the app it calls. If you do not have the tools, connect https://vatio.ai/mcp first (Connect); a person who must sign in does that step themselves. A person starts with npx @vatio-ai/skills and /vatio-init (Get started). However they asked you, the procedures below are the ones vatio-init follows. If the developer was added to someone else's workspace, start with Joining an existing workspace.

#Starting a new agent

If you are a coding agent asked to build someone a Vatio agent, this is the order that works:

  1. Install the skills. Unless .agents/skills/vatio-init is already there, run npx @vatio-ai/skills from the root of the project. It copies the Vatio skills into .agents/skills/ and .claude/skills/, so this procedure and the one for improving the agent are in the repository for the next session, whichever coding agent runs it, and adds the MCP to the project's .mcp.json. In Claude Code a server added during a session loads when it starts again.
  2. Look before creating. list_workspaces lists every workspace the person reaches. Read the app too: what it does and for whom, the API an agent could call, how its users sign in, the docs or policies it could read, and whether Vatio is already in it (cdn.vatio.ai, @vatio-ai/widget, data-workspace, an SDK's setup) or a vatio.yml is (git ls-files '*vatio.yml'). If the app already has a workspace, follow Joining an existing workspace instead. Tell the person you work for what you found and what you recommend the agent do before writing anything.
  3. Ask the owner, briefly, what the code does not answer. What the business does and who writes in; what the agent must never say or promise; when it has to hand the conversation to a person; and which of their systems it should read from (an API, a calendar, a catalog) — those become tools. Do not invent business facts you were not given.
  4. Create the workspace and the agent. create_workspace, then update_agent with instructions from the answers, the never-say rules as explicit rules. Anything long the agent should read rather than memorize is knowledge: create_knowledge_base, write_knowledge_entry, and the base in the agent's knowledge.
  5. Connect the app's backend. set_secret for its URL and credential, from the app's .env and never repeated back; set_backend with a base_url and headers that read them as $env.KEY; one set_tool per endpoint (Tools), and one that asks for a person for the human cases. A tool that writes needs a test value (set_secret with tests: true) so tests never write to production.
  6. Try it. chat_with_agent a few representative conversations — including one that should hand off and one that asks for something it must not say — and read the tools each reply called.
  7. Write the tests. add_test with a question and what the answer should do, for each question that matters: three or four, the hand-off and a must-not-say included. Each answers at once with a chat_id; get_test with it, a few seconds later, shows whether it passes now. run_tests replays them all, and from then on a change that breaks one that passes is held back from everyone (Testing).
  8. Hand over the link. get_status gives try_it: the inbox with Try the agent open, with a conversation right in the inbox, WhatsApp and Instagram. Report what you tried, how it answered and the tests.
  9. Put it in the app. Once they have tried it, add it where the app's users will talk to it — the web widget, or the iOS, Android or Flutter SDK — and follow Putting the agent in the app.
  10. Say how changes reach people. Tell the person you work for that there is nothing to publish: every change reaches the team at once and the app's users once the tests that pass today pass on it, a few minutes later. A test it breaks holds it back from them and emails whoever made it; get_status says where the newest change stands, and rollback undoes the last one (Deployments).
  11. Tell us how it went. Before you finish, send the Vatio team a few sentences with the MCP's send_feedback: which step of setting up the agent took the most work, and why (a tool that refused something, an error that left you guessing, docs that were missing). Do it even when it all went smoothly, with no secrets or personal data. It is read by the people who write both the tools and these docs.

#Putting the agent in the app

If you are a coding agent asked to put a workspace's agent where the app's users can talk to it, this is the order that works. It usually follows Starting a new agent, once the person has tried the agent.

  1. Find where it goes. Read the project: a web app, an iOS app (an .xcodeproj or Package.swift), an Android app (a Gradle module with com.android.application), a Flutter app (a pubspec.yaml that depends on flutter), or several. For React Native or Expo there is no Vatio SDK yet: say so, and send vatio feedback that one was asked for, rather than improvising one.

  2. One publishable key. get_status returns it in put_in_the_app: publishable_key, and widget, the widget's script tag with it. The same key serves development and release builds alike, from any site or app, so there are no origins to collect or set (Publishable keys). Make no key of your own. A page served from the developer's own machine (localhost, a private address, a .local or .test name) talks to the newest version, the one the team has, and its conversations are the team's; everywhere else, the app talks to the version everyone has, a mobile app's development builds included.

    A vatpub_ key is meant to ship in page source and inside an app, so put it in the app's configuration (an environment variable, a build setting). Never a vat_ developer token.

  3. Add it.

    • Web: the widget, once for the whole app: its script tag in the layout every page shares, or @vatio-ai/widget mounted from the app's root (in React, in an effect that returns widget.unmount). Build your own interface with the browser SDK only when asked to.
    • iOS: the Swift package vatio-ai/ios (iOS SDK). It has no UI, so write the chat screen in the app's own style, starting from Example/VatioExample/Views.swift in that repository: the messages, a composer, the typing indicator, and chat.resume() when the screen appears. For a whole app (the conversation list, photos, voice notes, the feedback card, settings), Vatio Chat for iOS has each in a file of its own.
    • Android: vatio-ai/android from JitPack (Android SDK). Keep the chat in a ViewModel and close it in onCleared(), and write the screen starting from example/src/main/kotlin/ai/vatio/example/Views.kt in that repository. Vatio Chat for Android is a whole app on it, in Compose.
    • Flutter: the vatio package from pub.dev, with flutter pub add vatio (Flutter SDK). Keep the VatioChat with the app's long-lived services and dispose() it with them, and write the screen starting from example/lib/views.dart in vatio-ai/flutter. An Android release build needs the INTERNET permission in the main manifest.
  4. Say who is signed in, when the agent must know (their orders, their account). Signed-out users get no token, and the agent answers them with its public tools. Make a keypair (openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out vatio-private.pem, then openssl pkey -in vatio-private.pem -pubout) and set_auth with the public key. The app's backend signs a short-lived token for the signed-in user with the private key (Authentication), kept in its secrets and never committed. The web renders it onto the widget as data-visitor-token or passes it to identify() (Sessions and channels); a mobile app gets it from an endpoint of that backend that requires the app's own session, and passes it to VatioChat as visitorToken. The private key never goes into the app.

    A different user is a different conversation: create a new chat when someone signs in or out.

  5. Try it in a development build. Run the app, open the chat, and ask something its knowledge answers and, signed in as a test user, something one of its private tools answers. The key works from any site or app; origin_not_allowed means the call sent no origin at all, while a browser and Vatio's SDKs always send one (Publishable keys).

  6. Hand it over. Say what you added and where the key lives. The app, once deployed, answers with the version everyone has, and each change reaches it once the tests that pass today pass on it.

#Joining an existing workspace

If you are a coding agent asked to get a developer working on a workspace someone else added them to (Teams), this is the order that works:

  1. Sign in as the invited address. Connect the MCP signed in with the email they were invited with: list_workspaces then shows the workspace and their role. Any other address is a different account that does not reach it.
  2. Explain the agent. get_agent (what it is for, its tools, its knowledge, when it hands off) and get_status (where the newest change stands). list_reports says what supervisors have reported and which tests fail, and get_tool_health which tool calls are failing. Recommend from what you find: the reports are work for Improve your agent from flags, and a failing tool is a fix in the backend it calls.
  3. Change it like the rest of the team. Every change builds on the newest version, which the whole workspace shares: the team has it at once, and everyone once the tests that pass today pass on it (Deployments). run_tests shows how the newest version does on every report and test.
  4. A vatio.yml in the repository means the team kept the agent as files and deployed it with vatio push. The agent on Vatio is the one that counts. Changing it through the MCP is fine: their next vatio push is refused until vatio pull brings your changes into the files (Edits made outside your files). If nobody needs the files any more, recommend removing vatio.yml, tools/ and identity.pub from the repository, and do it only with their yes.

Once supervisors use it, list_reports is where improving it starts — see Improve your agent from flags. The vatio-ai/skills skills from step 1 carry both starting points and sharing a session, as a Claude Code plugin or, for any coding agent, with npx @vatio-ai/skills (Claude Code).

Release notes are in the changelog.

Last updated:

Latest CLI version: 0.135.0 · Changelog · The whole contract as Markdown: /docs/docs.md · or vatio docs