Skip to main content

Zado MCP server — AI agent access to envelope budgets via the Model Context Protocol

Project description

zado-mcp

One-line install for AI agent access to your Zado envelope budgets.

You review the budget on the weekends; your agents shop all week. zado-mcp is the Model Context Protocol server that connects any MCP-capable AI agent (Claude Code, Claude Desktop, OpenAI Assistants, custom) to your Zado instance. The server runs locally over stdio, but every authorization, spending guard, and audit entry is enforced server-side — zado-mcp is a pure transport bridge, not a trust boundary.

AI Agent → zado-mcp (local stdio) → HTTPS → zadofi.ai → real envelopes

The canonical, citable spec for the surface this server implements is the Zado Agent Trust Protocol v0.1.

Install

pip install zado-mcp

Requires Python ≥ 3.10. Two dependencies: mcp, httpx.

Get an agent token

In the Zado app: Settings → Agent Access → Create Agent. Choose:

  • Name — e.g. "Claude Code", "OpenClaw", "Walmart shopper"
  • Scoperead (view only) or spend (view + authorize purchases)
  • Envelopes — optional: bind the agent to specific categories (e.g. groceries only)
  • TTL — token lifetime (default 90 days)

Copy the token when shown — it's displayed once.

Quick Start

zado-mcp init

The interactive flow prompts for your Zado instance URL (default https://zadofi.ai) and the agent token (input is hidden), then writes ~/.config/zado-mcp/config.json (mode 0600). The server reads URL + token from that file at startup — no env vars required in most setups.

After init, paste this short snippet into your agent's MCP config:

{
  "mcpServers": {
    "zado": {
      "command": "zado-mcp",
      "args": ["serve"]
    }
  }
}

Resolution order: explicit kwargs → ZADO_API_URL / ZADO_AGENT_TOKEN env vars → ~/.config/zado-mcp/config.json. So you can override per-host (e.g. point at a local backend during dev) without touching the config file.

Claude Code

Add the snippet above to your .mcp.json (project root or ~/.claude.json), then restart Claude Code. The zado server appears in /mcp with the 5 tools below.

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows) and paste the same snippet. Quit and re-open Claude Desktop.

OpenAI (Responses API) and other HTTP-only MCP clients

zado-mcp v0.1 ships stdio transport only, which is what Claude Code, Claude Desktop, and the OpenAI Agents SDK speak. OpenAI's Responses API MCP integration connects to a remote MCP server over HTTP / Streamable HTTP, not stdio, so it can't talk to zado-mcp serve directly. (Note: the OpenAI Assistants API is deprecated and shuts down on 2026-08-26.)

Two options today:

  1. Use the OpenAI Agents SDK (Python or JS), which speaks stdio MCP the same way Claude Code does — paste the snippet above into the SDK's MCP server list.
  2. Bridge stdio → HTTP with mcp-proxy and point the Responses API at the proxy's URL.

A native HTTP/SSE transport is on the v0.2 roadmap.

Available tools

Tool Scope What it does
check_budget(category) read Returns budgeted / spent / remaining / percentage_used for one envelope.
get_daily_status() read Total available across all envelopes, daily allowance, days remaining, alerts.
list_envelopes() read All envelope balances for the current month.
authorize_purchase(amount, category, vendor) spend Authorize and log a purchase if the envelope has funds. Returns {authorized: true, transaction_id, remaining} or {authorized: false, reason}.
check_pending_authorization(pending_id) spend When authorize_purchase returns pending_human_approval, poll this with the returned pending_id to learn whether the user approved/denied/let it expire.

All tools are pure transport — they delegate to the Zado REST API, which enforces auth, spending caps, rate limits, envelope binding, and audit on every call.

What agents CAN see

  • Envelope names and balances (budgeted, spent, remaining)
  • Daily spending allowance + alerts
  • Whether a specific purchase is affordable

What agents CANNOT see

  • Bank account or routing numbers
  • Bank-connection tokens (Teller, Plaid)
  • Raw transaction history
  • User personal information

Spending guards (spend scope only)

  • Per-transaction cap — default $50, configurable per agent
  • Session cap — cumulative; resets after 24h of inactivity
  • Rate limit — max 3 transactions per minute
  • Budget pacing — denies purchases that consume too much budget too fast
  • Envelope binding — agent can only spend in bound categories
  • Envelope balance — if the envelope is empty, the purchase is denied

All guards run server-side. The local zado-mcp server cannot bypass them.

Kill switch

Settings → Agent Access → Freeze All Agents — one click deactivates every agent token. Use it whenever you're not sure.

Configuration

zado-mcp resolves config in this order (first non-empty wins):

  1. Explicit kwargs to ZadoAPIClient(...) (programmatic use)
  2. Environment variables (ZADO_API_URL, ZADO_AGENT_TOKEN)
  3. ~/.config/zado-mcp/config.json (written by zado-mcp init, mode 0600)
Source Variable / key Required Description
env / config ZADO_API_URL / api_url yes Your Zado instance URL (e.g. https://zadofi.ai)
env / config ZADO_AGENT_TOKEN / agent_token yes Agent token from Settings → Agent Access

Troubleshooting

ZADO_API_URL environment variable not setinit never ran or the agent's MCP config doesn't pass the env vars through. Re-run zado-mcp init and copy the printed snippet exactly.

Zado API error 401: Invalid or revoked agent token — token expired, was revoked from Settings → Agent Access, or the user account changed password. Create a new agent and re-init.

Zado API error 403: Agent scope does not permit this operation — agent is read scope but tried authorize_purchase, or is bound to specific envelopes and tried to spend in a different category. Edit the agent in Settings → Agent Access to widen scope or bindings.

httpx.ConnectError — wrong ZADO_API_URL, your Zado instance is offline, or local DNS issue. Try curl $ZADO_API_URL/healthz from the same shell.

Server starts but agent doesn't see the tools — restart the host (Claude Code / Claude Desktop) after editing .mcp.json. MCP servers are loaded at host startup.

License

MIT — see LICENSE.

Source

github.com/evo-hydra/zado · tools/zado-mcp/

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

zado_mcp-0.2.0.tar.gz (13.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

zado_mcp-0.2.0-py3-none-any.whl (12.8 kB view details)

Uploaded Python 3

File details

Details for the file zado_mcp-0.2.0.tar.gz.

File metadata

  • Download URL: zado_mcp-0.2.0.tar.gz
  • Upload date:
  • Size: 13.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for zado_mcp-0.2.0.tar.gz
Algorithm Hash digest
SHA256 77f677b11ce7ec47c39b488a32d9e22f5442cf7117f4815eeb1f97010ccdebd3
MD5 538247e14f66c97123119e592c48b08b
BLAKE2b-256 0b4f2990e8baf581ed6e11924b98f45613d511abd3332a458617f23bd44454ba

See more details on using hashes here.

File details

Details for the file zado_mcp-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: zado_mcp-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 12.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for zado_mcp-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1eb39ee9869501a83935d05539d9055fc6e000c692d9ab496b2f993f33e1bb13
MD5 e748b9680fb46a9cbddd1e64ac8ea292
BLAKE2b-256 714ed17e8de995c3006b01812bb1d90586020ef331152180a7e547f6a2e36a8a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page