#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.
-
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. -
Install the skills and run
/vatio-init:Terminal window npx @vatio-ai/skillsIt 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-initIn 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.
| Repository | What it is | Install |
|---|---|---|
| vatio-ai/cli | The CLI | npx @vatio-ai/cli |
| vatio-ai/skills | Skills for coding agents | npx @vatio-ai/skills |
| vatio-ai/widget | The web widget | npm install @vatio-ai/widget |
| vatio-ai/sdk | Browser SDK | npm install @vatio-ai/sdk |
| vatio-ai/ios | iOS SDK | Swift Package Manager |
| vatio-ai/android | Android SDK | com.github.vatio-ai:android on JitPack |
| vatio-ai/flutter | Flutter SDK | flutter pub add vatio from pub.dev |
| vatio-ai/ruby | Ruby gem | gem "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.
vatio docs --save vatio-docs.mdvatio docs tools # one pagevatio docs search request.requiresThat 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:
- Install the skills. Unless
.agents/skills/vatio-initis already there, runnpx @vatio-ai/skillsfrom 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. - Look before creating.
list_workspaceslists 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 avatio.ymlis (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. - 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.
- Create the workspace and the agent.
create_workspace, thenupdate_agentwithinstructionsfrom 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'sknowledge. - Connect the app's backend.
set_secretfor its URL and credential, from the app's.envand never repeated back;set_backendwith abase_urlandheadersthat read them as$env.KEY; oneset_toolper endpoint (Tools), and one that asks for a person for the human cases. A tool that writes needs a test value (set_secretwithtests: true) so tests never write to production. - Try it.
chat_with_agenta 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. - Write the tests.
add_testwith aquestionand what the answershoulddo, for each question that matters: three or four, the hand-off and a must-not-say included. Each answers at once with achat_id;get_testwith it, a few seconds later, shows whether it passes now.run_testsreplays them all, and from then on a change that breaks one that passes is held back from everyone (Testing). - Hand over the link.
get_statusgivestry_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. - 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.
- 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_statussays where the newest change stands, androllbackundoes the last one (Deployments). - 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.
-
Find where it goes. Read the project: a web app, an iOS app (an
.xcodeprojorPackage.swift), an Android app (a Gradle module withcom.android.application), a Flutter app (apubspec.yamlthat depends onflutter), or several. For React Native or Expo there is no Vatio SDK yet: say so, and sendvatio feedbackthat one was asked for, rather than improvising one. -
One publishable key.
get_statusreturns it input_in_the_app:publishable_key, andwidget, 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.localor.testname) 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 avat_developer token. -
Add it.
- Web: the widget, once for the whole app: its
script tag in the layout every page shares, or
@vatio-ai/widgetmounted from the app's root (in React, in an effect that returnswidget.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 fromExample/VatioExample/Views.swiftin that repository: the messages, a composer, the typing indicator, andchat.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/androidfrom JitPack (Android SDK). Keep the chat in aViewModeland close it inonCleared(), and write the screen starting fromexample/src/main/kotlin/ai/vatio/example/Views.ktin that repository. Vatio Chat for Android is a whole app on it, in Compose. - Flutter: the
vatiopackage from pub.dev, withflutter pub add vatio(Flutter SDK). Keep theVatioChatwith the app's long-lived services anddispose()it with them, and write the screen starting fromexample/lib/views.dartinvatio-ai/flutter. An Android release build needs theINTERNETpermission in the main manifest.
- Web: the widget, once for the whole app: its
script tag in the layout every page shares, or
-
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, thenopenssl pkey -in vatio-private.pem -pubout) andset_authwith 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 asdata-visitor-tokenor passes it toidentify()(Sessions and channels); a mobile app gets it from an endpoint of that backend that requires the app's own session, and passes it toVatioChatasvisitorToken. 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.
-
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_allowedmeans the call sent no origin at all, while a browser and Vatio's SDKs always send one (Publishable keys). -
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:
- Sign in as the invited address. Connect the MCP signed in with the
email they were invited with:
list_workspacesthen shows the workspace and their role. Any other address is a different account that does not reach it. - Explain the agent.
get_agent(what it is for, its tools, its knowledge, when it hands off) andget_status(where the newest change stands).list_reportssays what supervisors have reported and which tests fail, andget_tool_healthwhich 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. - 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_testsshows how the newest version does on every report and test. - A
vatio.ymlin the repository means the team kept the agent as files and deployed it withvatio push. The agent on Vatio is the one that counts. Changing it through the MCP is fine: their nextvatio pushis refused untilvatio pullbrings your changes into the files (Edits made outside your files). If nobody needs the files any more, recommend removingvatio.yml,tools/andidentity.pubfrom 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.