> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trylath.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Every Lath operation is POST https://platform.trylath.com/<operation name with dots replaced by slashes>, with a JSON body and `Authorization: Bearer <key>`. `email.send` is POST /email/send.
> Branch on `error.code`, never on `error.message`. Every refusal also carries `error.fix`, which names the next step.
> Send an `Idempotency-Key` header on any operation that is not retry-safe, so a retry cannot run it twice.
> A `lath_test_` key emails only the account's own members and sends no SMS; a `lath_live_` key reaches real recipients and is billed.
> The OpenAPI document, generated from the same registry as the routes, is at https://platform.trylath.com/openapi.json.

# MCP

> Every operation is a tool, carrying the input schema and the result schema an agent needs before it calls.

**At** `https://platform.trylath.com/mcp`

The server speaks the Model Context Protocol over HTTP. `tools/list` returns every operation; `tools/call` runs one.

Tool names are the operation with dots replaced by underscores, because MCP names allow `[A-Za-z0-9_-]` only — `sms.send` is `sms_send`, `developers.key.create` is `developers_key_create`.

An agent does not need to be told what exists. It reads the tool list, gets each schema, and calls — which is why the copy-paste prompt names operations rather than URLs.

A tools/call, exactly as the live server accepts it.

```json theme={null}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sms_send",
    "arguments": {
      "to": "+14155550100",
      "body": "Spring sale starts today.",
      "topic": "promotions"
    }
  }
}
```
