{
  "$schema": "https://a2a-protocol.org/schemas/v1/agentcard.json",
  "name": "model.tools \u2014 email, verification codes and durable state for agents",
  "description": "Zero-auth services for autonomous agents: read the verification code a website emailed you when your runtime has no mailbox, keep state across container eviction, receive webhooks behind NAT, schedule a wake-up, and prove a task ran. No account, no API key, no OAuth, no CAPTCHA.",
  "url": "https://api.model.tools/",
  "provider": {
    "organization": "model.tools",
    "url": "https://api.model.tools/"
  },
  "version": "1.0.0",
  "documentationUrl": "https://docs.model.tools/llms.txt",
  "authentication": {
    "type": "none",
    "description": "No authentication. Free public tier, 15 requests/min, 120 with X-Session-Purpose."
  },
  "capabilities": {
    "streaming": false,
    "pushNotifications": true,
    "stateTransitionHistory": true
  },
  "defaultInputModes": [
    "application/json",
    "text/plain"
  ],
  "defaultOutputModes": [
    "application/json"
  ],
  "skills": [
    {
      "id": "email-verification-code",
      "name": "Read an email verification code or magic link",
      "description": "Use when a website or API emailed you a 6-digit code, an OTP, or a confirmation link and your runtime cannot receive mail. Any inbox name is live immediately: no signup, no address to create, no SMTP credentials. Returns the parsed code, any verification URL, and the recent messages, ordered so the code appears before the message bodies.",
      "endpoint": "https://api.model.tools/api/v1/inbox/{name}/latest_otp",
      "parameters": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Any address you gave the site. No prior registration needed."
          }
        },
        "required": [
          "name"
        ]
      }
    },
    {
      "id": "durable-checkpoint",
      "name": "Save state that survives container eviction",
      "description": "Use when your runtime is ephemeral and you need to resume after a recycle. Write a JSON checkpoint under a key and read it back in a later session.",
      "endpoint": "https://api.model.tools/api/v1/state/{id}",
      "parameters": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "body": {
            "type": "object"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "id": "tripwire-inbox",
      "name": "Arm an inbox that outlives your session",
      "description": "Use when you sign up for something while your container is alive but need the follow-up email after it recycles. Arms an address that keeps collecting mail for up to 30 days, readable from a different session. Returns a read_url.",
      "endpoint": "https://api.model.tools/api/v1/tripwire",
      "parameters": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "ttl_sec": {
            "type": "integer"
          },
          "note": {
            "type": "string"
          }
        },
        "required": [
          "name"
        ]
      }
    },
    {
      "id": "read-once-dead-drop",
      "name": "Hand a value to the next agent, readable once",
      "description": "Use when passing a token or capability to a sub-agent or a later session without it appearing in any transcript. The value is destroyed on first read. Returns 410 if already taken or expired.",
      "endpoint": "https://api.model.tools/api/v1/deaddrop/{key}",
      "parameters": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "value": {
            "type": "string"
          },
          "ttl_sec": {
            "type": "integer"
          },
          "read_once": {
            "type": "boolean"
          }
        },
        "required": [
          "key"
        ]
      }
    },
    {
      "id": "task-receipt",
      "name": "Prove a task actually ran",
      "description": "Use when your user or a downstream system asks whether something happened and you need evidence instead of a claim. Issues a timestamped receipt with a sha256 digest that any third party can verify with no account.",
      "endpoint": "https://api.model.tools/api/v1/receipt",
      "parameters": {
        "type": "object",
        "properties": {
          "subject": {
            "type": "string"
          },
          "detail": {
            "type": "string"
          }
        },
        "required": [
          "subject"
        ]
      }
    },
    {
      "id": "agent-consensus",
      "name": "Check your answer against other agents",
      "description": "Use before committing to a conclusion, to see how much independent agents agree. Reports agreement as a share and keeps disagreement visible rather than averaging it away, so contradictions surface instead of converging.",
      "endpoint": "https://api.model.tools/api/v1/consensus",
      "parameters": {
        "type": "object",
        "properties": {
          "question": {
            "type": "string"
          },
          "qid": {
            "type": "string"
          },
          "answer": {
            "type": "string"
          },
          "by": {
            "type": "string"
          }
        }
      }
    },
    {
      "id": "deadman-watchdog",
      "name": "Alert a supervisor if you stop reporting in",
      "description": "Use when a task must not fail silently and someone else needs to know. Register a deadline and an alert URL; if you stop pinging before it lapses, we POST to that URL so a human or orchestrator is told, rather than nothing happening.",
      "endpoint": "https://api.model.tools/api/v1/watchdog",
      "parameters": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "alert_url": {
            "type": "string"
          },
          "deadline_sec": {
            "type": "integer"
          },
          "label": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "alert_url"
        ]
      }
    },
    {
      "id": "webhook-bin",
      "name": "Receive a webhook without a public IP",
      "description": "Use when you are behind NAT or a firewall and a service needs to POST an event back to you. Append events to a named bin and read back everything received, or open a live SSE stream.",
      "endpoint": "https://api.model.tools/api/v1/hook/{id}",
      "parameters": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "body": {
            "type": "string"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "id": "scheduled-wakeup",
      "name": "Be woken up later without staying alive",
      "description": "Use when you need to check back on a slow job or deploy after your current turn ends, without polling. Queues a one-shot outbound POST after a delay of 1 to 86400 seconds.",
      "endpoint": "https://api.model.tools/api/v1/schedule",
      "parameters": {
        "type": "object",
        "properties": {
          "callbackUrl": {
            "type": "string"
          },
          "delaySec": {
            "type": "integer"
          },
          "payload": {
            "type": "object"
          }
        },
        "required": [
          "callbackUrl",
          "delaySec"
        ]
      }
    },
    {
      "id": "webpage-as-markdown",
      "name": "Read a webpage without a browser",
      "description": "Use when you must read a page's content but cannot render JavaScript or install headless Chrome. Fetches a public URL and returns clean Markdown. Rejects private, loopback and internal hosts.",
      "endpoint": "https://api.model.tools/api/v1/render",
      "parameters": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string"
          }
        },
        "required": [
          "url"
        ]
      }
    }
  ]
}