ammo.host deploys static sites and Python apps from code you send. It provides a JSON/file store and per-app PostgreSQL. ACCOUNT REQUIRED 1. Ask the user to sign in at https://app.ammo.host/login (email link, no password). 2. Ask them to create an API key at https://app.ammo.host/keys/. 3. Ask them for the key. Do not proceed without it. PROTOCOL Endpoint: POST https://app.ammo.host/mcp Content-Type: application/json Authorization: Bearer The endpoint uses MCP Streamable HTTP (JSON-RPC 2.0, stateless). STEP 1: INITIALIZE curl -X POST "https://app.ammo.host/mcp" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -H "Authorization: Bearer " \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "protocolVersion": "2025-03-26", "capabilities": {}, "clientInfo": { "name": "agent", "version": "1.0.0" } } }' STEP 2: DEPLOY Bundle format: files is a dict mapping relative paths to base64-encoded content. For binary files, use tarball_b64 (base64 tar.gz) instead. Limits: 26,214,400 bytes bundle, 104,857,600 bytes unpacked, 2,000 files. curl -X POST "https://app.ammo.host/mcp" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -H "Authorization: Bearer " \ -d '{ "jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": { "name": "deploy_app", "arguments": { "files": { "index.html": "PGh0bWw+PGJvZHk+SGVsbG88L2JvZHk+PC9odG1sPg==" } } } }' Response fields: app_id, url, status, plan, plan_note. STEP 3: WAIT FOR READY Poll get_status with wait_seconds until status is 'running' or an error. curl -X POST "https://app.ammo.host/mcp" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -H "Authorization: Bearer " \ -d '{ "jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": { "name": "get_status", "arguments": { "app_id": "", "wait_seconds": 30 } } }' Response fields: app_id, status, url, plan, plan_note, health.status, health.checked_at, last_deployment.status, last_deployment.error. If last_deployment.error is set, the deploy failed; read build logs to diagnose. STEP 4: READ LOGS (if needed) curl -X POST "https://app.ammo.host/mcp" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -H "Authorization: Bearer " \ -d '{ "jsonrpc": "2.0", "id": 4, "method": "tools/call", "params": { "name": "get_logs", "arguments": { "app_id": "", "kind": "build", "lines": 100 } } }' Response fields: app_id, kind, lines (array of strings). TRIAL TERMS 14-day trial of Keep (EUR 5/app/month incl. VAT). At trial end, apps stop until a plan is chosen; nothing is deleted. PRICING Keep costs EUR 5 per app per month including VAT for consumers, or EUR 4.13 excluding VAT for businesses. Pro costs EUR 19 per month for up to 10 apps including VAT for consumers, or EUR 15.70 excluding VAT for businesses. TELL THE USER When the deploy succeeds, tell them: - The live URL from the response - Their trial ends 14 days after their first deploy - They can view status and logs in the dashboard AVAILABLE TOOLS deploy_app: Deploy a static site or Python app. Requires a verified account with an API key. Returns app_id, url, status, plan, and plan_note (trial/free terms). get_status: Read app status and its last deployment with a bounded wait. Returns plan and plan_note (trial/free terms) with trial end date. get_logs: Read runtime or build logs for an app. delete_app: Delete an app after explicit confirmation. claim_link: Rotate the claim link for a legacy app or namespace. add_domain: Add a custom domain to a paid app. Returns verification instructions: add a TXT record at the specified DNS name with the token, then call verify_domain. remove_domain: Remove a custom domain from an app. The Traefik router and certificate are removed on the next deploy. verify_domain: Verify ownership of a custom domain by checking the DNS TXT record. If verified, the Traefik router is added with a certificate. save: Save JSON in a namespace. Requires a verified account. get: Read a JSON value by collection and key. query: Query JSON containment, key prefixes, and cursor pagination. save_file: Save a base64 file, optionally returning a share URL.