# Build on RALPH

RALPH is agent-first. The same API that runs the web app answers your agent through an MCP server, your code through REST, and operators through the ralph CLI.

## Start here

- [MCP server](/developers/mcp): connect Claude or ChatGPT to your organisation, then ask it to set up your org, book a lesson or log a flight.
- [API reference](/developers/api): every REST endpoint, rendered from the OpenAPI contract, with the contract itself to download.
- [CLI](/developers/cli): `ralph`, the operator CLI. Sign in through the browser, mint an agent key, check it works.
- [Changelog](/developers/changelog): what changed, newest first.

## What every surface shares

- **One source of truth.** The OpenAPI contract defines the API. The MCP tools map onto it and add no rules of their own, so a tool lets your agent do only what you could do yourself. Some things, such as managing agent keys or reading the full audit trail, have no tool: they stay with the API and the app.
- **Errors you can act on.** Every API error is an RFC 9457 problem with a stable `type`, which the MCP server passes to your agent as it is. A refused booking says which check failed and how to resolve it. The CLI prints the problem's title and detail.
- **Safe retries.** Creating a booking takes an `Idempotency-Key`, so the same request retried with the same key within 24 hours never books twice. The MCP server sends one with each of its own calls.
- **One person, one organisation.** An agent's access token or agent key acts for one person in one organisation, and the audit trail names them.
