# Établi's MCP server

Établi's tools for AI assistants and coding agents, at `https://api.etabli.io/mcp`. With no key they plan physical work and draft it for the person to claim and publish on etabli.io; with a buyer key, `https://api.etabli.io/mcp/full` runs the whole loop, from posting a project to placing orders.

- **Server URL:** `https://api.etabli.io/mcp`
- **Transport:** Streamable HTTP, stateless
- **Authentication:** None. A buyer key adds tools
- **Skill:** `npx skills add https://etabli.io`

## Add it to your agent

One command or link per client. No key, no sign-in: the server's tools plan work, draft it for the person to claim, and request firm prices, and nothing on it spends money.

- **Claude Code:** `claude mcp add --transport http etabli https://api.etabli.io/mcp`
- **Codex:** `codex mcp add etabli --url https://api.etabli.io/mcp`. Or add it to `~/.codex/config.toml`, which the Codex CLI, the IDE extension and the ChatGPT desktop app share:

  ```toml
  [mcp_servers.etabli]
  url = "https://api.etabli.io/mcp"
  ```
- **Cursor:** [Add to Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=etabli&config=eyJ1cmwiOiJodHRwczovL2FwaS5ldGFibGkuaW8vbWNwIn0=). Or open [cursor.com/install-mcp](https://cursor.com/install-mcp?name=etabli&config=eyJ1cmwiOiJodHRwczovL2FwaS5ldGFibGkuaW8vbWNwIn0%3D) in a browser.
- **VS Code (Copilot):** [Add to VS Code](https://vscode.dev/redirect/mcp/install?name=etabli&config=%7B%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fapi.etabli.io%2Fmcp%22%7D). Or run `code --add-mcp '{"name":"etabli","type":"http","url":"https://api.etabli.io/mcp"}'`.
- **Gemini CLI:** `gemini mcp add --transport http etabli https://api.etabli.io/mcp`
- **Claude (claude.ai, desktop):** [Add a custom connector](https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=Etabli&connectorUrl=https%3A%2F%2Fapi.etabli.io%2Fmcp). Or: Customize → Connectors → Add custom connector, with the URL `https://api.etabli.io/mcp` and no sign-in.
- **ChatGPT:** chatgpt.com/plugins → **+** → Add custom MCP server → Connection: URL `https://api.etabli.io/mcp`, Authentication: none → create it as a plugin.
- **Kiro:** [Add to Kiro](https://kiro.dev/launch/mcp/add?name=etabli&config=%7B%22url%22%3A%22https%3A%2F%2Fapi.etabli.io%2Fmcp%22%2C%22disabled%22%3Afalse%2C%22autoApprove%22%3A%5B%5D%7D)
- **Goose:** [Add to Goose](goose://extension?url=https%3A%2F%2Fapi.etabli.io%2Fmcp&type=streamable_http&id=etabli&name=Etabli&description=Plan%20physical%20work%20into%20legs%20and%20get%20prices%20from%20workshops)
- **Any MCP client:** Streamable HTTP, no authentication. Some clients call the type `streamableHttp` or `streamable_http`.

  ```json
  {
    "mcpServers": {
      "etabli": {
        "type": "http",
        "url": "https://api.etabli.io/mcp"
      }
    }
  }
  ```
- **Skill (70+ agents):** `npx skills add https://etabli.io`. Installs Établi's skill, `order-physical-work`, into the agents on your machine: when to use Établi and how to order with it.

## Tools

| Tool | Needs | Does |
| --- | --- | --- |
| `how_etabli_works` | Nothing | What Établi is, the delivery shapes with examples, the flow, and what needs an account. |
| `preview_quote` | Nothing | The plan: a job card per leg, with open questions and suggested answers. No price of Établi's own; nothing is ordered. |
| `create_project` | Nothing | Drafts the project for the person to claim. Returns `claimLine`, to show them word for word (a link with a short code), and a project key to keep. Nothing reaches workshops and nothing is charged until they claim and publish it on etabli.io. |
| `get_project` | The draft's project key, or a buyer key | Where a project stands: the claim, each leg, the latest events, and `next`, what to do now and when to look again. |
| `request_firm_prices` | The person's yes | Firm prices by email instead of a draft: puts the request out to bid and emails the person the offers. It shares their name and email: call it only once they have agreed. |
| `get_tender`, `list_clarifications`, `list_project_offers`, `list_offers`, `get_order`, `get_statement` | A buyer key | Read-only status of that buyer's projects, tenders, offers and orders. |
| `post_project`, `post_tender`, `answer_questions` | A buyer key, on `/mcp/full` | Plan a request into legs, or one tender, and answer their questions. |
| `publish_project`, `publish_tender`, `answer_clarification`, `award_project`, `award_tender`, `place_order` | A buyer key, on `/mcp/full` | Put work out to bid, answer workshops, award contracts and place orders. These reach workshops or commit money: confirm each with the person. |

## With a buyer key

On `https://api.etabli.io/mcp`, a buyer key (`Authorization: Bearer etb_live_…`) adds the read-only status tools. For the whole loop, connect to `https://api.etabli.io/mcp/full` and keep the key in an environment variable, never in a link or a prompt:

- **Claude Code:** `claude mcp add --transport http etabli https://api.etabli.io/mcp/full --header "Authorization: Bearer $ETABLI_API_KEY"`
- **Codex:** `codex mcp add etabli --url https://api.etabli.io/mcp/full --bearer-token-env-var ETABLI_API_KEY`
- **Cursor:** In `.cursor/mcp.json`:

  ```json
  {
    "mcpServers": {
      "etabli": {
        "url": "https://api.etabli.io/mcp/full",
        "headers": {
          "Authorization": "Bearer ${env:ETABLI_API_KEY}"
        }
      }
    }
  }
  ```

An assistant working for one person doesn't need a key: `create_project` drafts the project, and the person claims and publishes it on etabli.io. Buyer keys are for companies that run the whole loop themselves: [request API access](https://etabli.io/#access).

## What an assistant should know

- Show the person `create_project`'s `claimLine` word for word, on its own line, and keep the `projectKey` out of the conversation. Only the person can claim and publish the project: never claim it for them.
- Bids take days once the person publishes. Check with `get_project` when its `next` says, not sooner, and tell the person they'll get a status link when they claim.
- Ask the person before `request_firm_prices`, and before passing `contact` to `create_project`: both share their name and email. `request_firm_prices` can't be recalled; many clients ask for approval too, because it is marked destructive.
- Confirm with the person before `award_project`, `award_tender` and every `place_order`: they commit real money.
- Don't quote a price before the bids are in. Établi has no price list; a preview has no price of its own.
- In a headless run (`claude -p`, an agent SDK) nobody can approve a tool call. Allowlist the read-only tools, or call the HTTP preview, which needs no approval: `POST /v1/quotes/preview`.
- Everything the server does goes through the same API: [the docs](https://etabli.io/docs) have the same steps over HTTP.

## Try it

Once it's connected, ask your assistant:

- “Plan 48 embroidered quarter-zips with our logo, shipped to our office within 3 weeks.”
- “Send a branded hoodie to each of our 35 remote employees' homes. Can Établi do that?”
- “We sell t-shirts online. Could someone print and ship each order within 3 days?”
- “Pastel self-watering pots made overseas in lots of 100, and a US nursery that pots a plant in one and ships each order.”

## Protocol

- Streamable HTTP: JSON-RPC over POST. Stateless, so there's no session or stream to open (a GET answers 405).
- MCP protocol 2026-07-28, and 2025-era clients through the `initialize` handshake.
- Requests are rate-limited per IP address, across `/mcp` and `/mcp/full`.
- Browser requests from other websites' origins get 403; the assistants' own origins are allowed.
- In clients that show MCP Apps, `preview_quote` draws the plan as a job card.

---

This is the markdown version of https://etabli.io/mcp. Every page on etabli.io has one at the same path plus .md (https://etabli.io/index.md for the home page). For agents: an overview at https://etabli.io/llms.txt, and everything in one file at https://etabli.io/llms-full.txt.
