Build with AI
Build with AI
Connect your coding agent to Avvio and it works from the current API contract instead of memory. Pick a server and your tool, and one click or one pasted line sets it up.
avvio-docs Searches these docs. Read-only, no key needed.
Set up for Claude Code, Cursor, VS Code, Claude app, ChatGPT, Codex, Gemini CLI and Windsurf / Devin.
claude mcp add --transport http avvio-docs https://docs.avvio.xyz/mcp- Run it in your project directory.
- Type /mcp in Claude Code to check it connected.
Manual config .mcp.json
{
"mcpServers": {
"avvio-docs": {
"type": "http",
"url": "https://docs.avvio.xyz/mcp"
}
}
}Cursor opens and asks you to confirm.
Manual config ~/.cursor/mcp.json
{
"mcpServers": {
"avvio-docs": {
"url": "https://docs.avvio.xyz/mcp"
}
}
}VS Code opens and asks you to confirm.
Manual config .vscode/mcp.json
{
"servers": {
"avvio-docs": {
"type": "http",
"url": "https://docs.avvio.xyz/mcp"
}
}
}https://docs.avvio.xyz/mcp- Open Customize → Connectors.
- Click +, then Add custom connector.
- Paste the URL and click Add. Works on web and desktop.
https://docs.avvio.xyz/mcp- Settings → Security and login → turn on Developer mode.
- Plugins → + → create a developer-mode app with this URL and No authentication.
codex mcp add avvio-docs --url https://docs.avvio.xyz/mcpShared by the Codex CLI, IDE extension and ChatGPT desktop app.
Manual config ~/.codex/config.toml
[mcp_servers.avvio-docs]
url = "https://docs.avvio.xyz/mcp"gemini mcp add --transport http avvio-docs https://docs.avvio.xyz/mcpManual config ~/.gemini/settings.json
{
"mcpServers": {
"avvio-docs": {
"httpUrl": "https://docs.avvio.xyz/mcp"
}
}
}devin mcp add avvio-docs https://docs.avvio.xyz/mcpWindsurf is now Devin Desktop; its Devin Local agent uses this config.
Manual config ~/.config/devin/mcp_config.json
{
"mcpServers": {
"avvio-docs": {
"url": "https://docs.avvio.xyz/mcp",
"transport": "http"
}
}
}https://docs.avvio.xyz/mcpAny MCP client: add a remote server with this URL. No auth.
Manual config mcpServers
{
"mcpServers": {
"avvio-docs": {
"url": "https://docs.avvio.xyz/mcp"
}
}
}avvio-payments Prices and sends payouts. Runs locally over stdio with your API key.
Set up for Claude Code, Cursor, VS Code, Claude app, ChatGPT, Codex, Gemini CLI and Windsurf / Devin.
claude mcp add --env AVVIO_API_KEY=avvio_test_YOUR_TEST_KEY --env AVVIO_ORG_ID=YOUR_ORG_ID --transport stdio avvio-payments -- npx -y @avvio/payments mcp- Run it in your project directory, with your test key in place of the placeholder.
- Type /mcp in Claude Code to check it connected.
Manual config .mcp.json
{
"mcpServers": {
"avvio-payments": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@avvio/payments",
"mcp"
],
"env": {
"AVVIO_API_KEY": "${AVVIO_API_KEY}",
"AVVIO_ORG_ID": "${AVVIO_ORG_ID}"
}
}
}
}- Cursor opens and asks you to confirm.
- Replace the placeholder key and org ID in Settings → MCP.
Manual config ~/.cursor/mcp.json
{
"mcpServers": {
"avvio-payments": {
"command": "npx",
"args": [
"-y",
"@avvio/payments",
"mcp"
],
"env": {
"AVVIO_API_KEY": "avvio_test_YOUR_TEST_KEY",
"AVVIO_ORG_ID": "YOUR_ORG_ID"
}
}
}
}- VS Code opens and asks you to confirm.
- Replace the placeholder key and org ID in mcp.json.
Manual config .vscode/mcp.json
{
"inputs": [
{
"type": "promptString",
"id": "avvio-api-key",
"description": "AVVIO_API_KEY",
"password": true
},
{
"type": "promptString",
"id": "avvio-org-id",
"description": "AVVIO_ORG_ID"
}
],
"servers": {
"avvio-payments": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@avvio/payments",
"mcp"
],
"env": {
"AVVIO_API_KEY": "${input:avvio-api-key}",
"AVVIO_ORG_ID": "${input:avvio-org-id}"
}
}
}
}{
"mcpServers": {
"avvio-payments": {
"command": "npx",
"args": [
"-y",
"@avvio/payments",
"mcp"
],
"env": {
"AVVIO_API_KEY": "avvio_test_YOUR_TEST_KEY",
"AVVIO_ORG_ID": "YOUR_ORG_ID"
}
}
}
}- Claude Desktop only: paste into claude_desktop_config.json.
- Replace the placeholders, then restart Claude.
ChatGPT only connects to remote servers. Use the Codex tab: the ChatGPT desktop app shares Codex’s MCP config.
codex mcp add avvio-payments --env AVVIO_API_KEY=avvio_test_YOUR_TEST_KEY --env AVVIO_ORG_ID=YOUR_ORG_ID -- npx -y @avvio/payments mcpShared by the Codex CLI, IDE extension and ChatGPT desktop app.
Manual config ~/.codex/config.toml
[mcp_servers.avvio-payments]
command = "npx"
args = ["-y","@avvio/payments","mcp"]
env = { AVVIO_API_KEY = "avvio_test_YOUR_TEST_KEY", AVVIO_ORG_ID = "YOUR_ORG_ID" }{
"mcpServers": {
"avvio-payments": {
"command": "npx",
"args": [
"-y",
"@avvio/payments",
"mcp"
],
"env": {
"AVVIO_API_KEY": "avvio_test_YOUR_TEST_KEY",
"AVVIO_ORG_ID": "YOUR_ORG_ID"
}
}
}
}Merge into ~/.gemini/settings.json and replace the placeholders.
{
"mcpServers": {
"avvio-payments": {
"command": "npx",
"args": [
"-y",
"@avvio/payments",
"mcp"
],
"env": {
"AVVIO_API_KEY": "avvio_test_YOUR_TEST_KEY",
"AVVIO_ORG_ID": "YOUR_ORG_ID"
}
}
}
}- Windsurf is now Devin Desktop; its Devin Local agent reads this file.
- Replace the placeholders.
{
"mcpServers": {
"avvio-payments": {
"command": "npx",
"args": [
"-y",
"@avvio/payments",
"mcp"
],
"env": {
"AVVIO_API_KEY": "avvio_test_YOUR_TEST_KEY",
"AVVIO_ORG_ID": "YOUR_ORG_ID"
}
}
}
}Any stdio MCP client. Replace the placeholders.
The docs server searches every guide, recipe and endpoint, and holds no key.
The payments server calls the API with your key, so give it a test key and keep
that key in your client’s private settings. The project configs (.mcp.json,
.vscode/mcp.json) reference it through ${AVVIO_API_KEY} or an input prompt,
so they can be committed without it. Your organization ID is on the
dashboard’s Developer page.
What each server exposes, and the files agents read, are in For agents.
Prompts
Section titled “Prompts”Click a task to copy its prompt or open it in an assistant.
Sandbox test
Section titled “Sandbox test”Hand this to a coding agent with a test key. It runs the happy path and the timeout branch, and stops where a human is required. Replace the two placeholders and change nothing else.
Show the full prompt
Integrate Avvio Payouts for me in sandbox. Test key: `avvio_test_…`. Organization id: `cmsx…`. Base URL: `https://api.avvio.xyz/business/api/v1` (if your Avvio contact gave you a different base URL, a dedicated or sandbox host, use that one; the paths are identical); send `x-api-key` on every call. Read `https://docs.avvio.xyz/llms-full.txt` first, then do exactly this: (1) `GET /payments/organizations/{orgId}/policy` and read your `limits`, `approvals` and `rateLimits`; keep every amount below the caps. (2) `GET /recipients/{orgId}/corridors`, choose MXN, and build the recipient from the fields it lists; invent none. (3) `POST /payments/organizations/{orgId}/sandbox/fund` for 500 USD with an `Idempotency-Key` (a UUID you save). (4) Create one recipient whose account number ends in `0003`. (5) `POST /payments/organizations/{orgId}/payouts` for 50 USD with a new saved `Idempotency-Key` and `reference: "test-1"`. A payout that is accepted answers 200 with the payout body. If you get 202, stop and tell me a human must approve it in the dashboard. (6) Register a webhook endpoint and verify `svix-signature` on the first delivery. (7) Poll `GET /payments/organizations/{orgId}/events?since=` until the payout shows `completed` and then `failed` with `returned_by_bank`. On any timeout, retry with the same `Idempotency-Key`; never mint a new one. Report the `payoutId`, the event `sequence` values and every error `type` you saw.
What a correct run reports
- The policy first:
mode: test,limits(strings ornull, never exceeded),approvals.thresholdUsd(nullunless payouts are held) andrateLimitsper minute. - One recipient built from the corridor’s fields. The MXN field has
checksum: "clabe", so a wrong 18th digit is400 VALIDATION_ERROR; the sandbox accepts only012345678901234567as a wrong-digit exception, and production never does. - A
500.00USD funding, then a50.00USD payout answered200withreference: "test-1", apayoutIdand afee({currency, amount}ornull). - Events in ascending
sequence, one per observed transition:payout.pending,payout.completed, thenpayout.returnedwithstatus: failed,failureCode: returned_by_bank,fundsReturned: true. Apayout.processingmay be missed (the sandbox ticks every ten seconds and0003holds it for eight);0002reliably shows it. - On
0003,completedat 10 seconds and the return at 40, so polling continues a minute pastcompleted. In production a return can take days. - A delivery whose
svix-idequals the eventid, verified. Deliveries go out every 15 seconds, often in bursts; the deliveries log is a bare array, newest first. - The first
/eventscall has nosince(orsince=0); each later one sends the previousnextSince. - Every id treated as an opaque string:
sbx_…in the sandbox, cuids for events, and live rails mint their own. GET /balance_transactionswith the+500.00funding, the-50.00debit (itsfee, andnetthe amount less that fee) and a+50.00payout_return;GET /balanceback at500.00. The sandbox refunds the fee too; a live rail may keep it, so read the return row’samount.- No error
type, or a202 pending_approvaland a stop. - Any retry reported as a replay of the same
Idempotency-Key.
Anything else (an invented field, a 400 VALIDATION_ERROR, a second
payoutId, a cursor sent to /events) is a finding about the docs or the
agent. Send it to us with the requestId.
Payroll test
Section titled “Payroll test”The same journey for an earned-wage-access or payroll platform paying workers for an employer. Replace the same two placeholders.
Show the full prompt
Integrate Avvio Payouts for my earned-wage-access platform, in sandbox. Test key: `avvio_test_…`. Organization id: `cmsx…`. Base URL: `https://api.avvio.xyz/business/api/v1`; send `x-api-key` on every call. Read `https://docs.avvio.xyz/llms-full.txt` first. Three parties: I am the partner; the `endUser` is my customer, the employer paying; the recipient is the worker paid. Do this: (1) `GET /payments/organizations/{orgId}/policy`; keep every amount under `limits`. (2) `GET /recipients/{orgId}/corridors`, choose MXN, build recipients from its field list; invent nothing. (3) Fund 1000 USD via `POST .../sandbox/fund` with a saved `Idempotency-Key`. (4) Create three recipients: `externalId` = the worker's HRIS id (`hris_emp_4471` to `4473`), `endUserId: "employer_acme"`, accounts ending `0002`. (5) Pay one worker: `POST .../payouts` for 120 USD with `endUser: { id: "employer_acme" }`, `reference: "PAYROLL-2026-09-01"` and a new saved key. 200 is accepted; on 202 stop: a human must approve. (6) Pay the other two as one run: `POST .../payouts/batches` with `externalReferenceId: "PAYROLL-2026-09-01"`; if it holds at `awaiting_confirmation`, stop and show me the invalid lines. (7) Register a webhook and verify `svix-signature`. (8) Poll `GET .../events?since=` until every payout is `completed`, then match debits in `GET .../balance_transactions` by `reference`. Retry a timeout with the same `Idempotency-Key`. Report every `payoutId`, the `batchId`, the event `sequence` values and every error `type`.
What a correct payroll run reports
- The policy with
featurescontainingmass_payouts; without it, a stop before step 6 saying batches are off. - Three recipients with
externalId= the HRIS id andendUserId: "employer_acme". Re-sending an HRIS id with the same account returns the existing recipient (201, sameid). - A
120.00USD payout answered200withreference: "PAYROLL-2026-09-01"andendUser.id: "employer_acme". - A batch:
202on submit,statusreachingcompleted,counts.created: 2, and apayoutIdon each line ofGET .../batches/{batchId}/items. A hold atawaiting_confirmationis a stop, not aconfirm. payout.pendingandpayout.completedfor all three payouts, plus thepayout_batch.*transitions, in ascendingsequence; verified deliveries within about 15 seconds of each.- The
+1000.00funding and three debits inGET /balance_transactions, each with itsreferenceand the batch lines with thebatchId; the balance at1000.00less the three amounts. - The same approval stop and idempotent retries as the sandbox run.
Was this page helpful?