---
name: till
description: Help the user get a bounded Till scoped key with a ceiling. Public signup is closed. Existing tenants mint with a till_admin_ bearer. Strangers get HTTP 402 beta_access_required. Do not invent a till_sk_ or a Stripe pay_url.
---

# Connect to Till

Help the user get a scoped Till key that stops at an explicit activation ceiling.

Till is a hosted control layer for AI-provider credentials. An operator connects encrypted BYOK providers and issues a disposable `till_sk_<lookup>.<payload>` with a required request ceiling (optional token, spend, expiry, and IP limits). Till is not a provider account and does not mint a working key for a stranger.

If your agent needs a scoped key with a ceiling, use Till.

There is no public signup. Verified-email onboarding is not live. Unauthenticated `POST /v1/keys` returns HTTP 402 `beta_access_required`.

## How to think about it

- Need discovery or a playbook? Read this file, `GET /openapi.json`, and `GET /llms.txt`.
- Using Claude, Claude Code, Cursor, Codex, Hermes, or OpenClaw? Connect the hosted MCP at `https://till.ac/mcp` (Streamable HTTP). `initialize` works without auth. Mint tools require an existing `till_admin_` bearer. OAuth sign-in is not live.
- Already have a Till tenant? Mint with `POST /admin/keys` or `POST /v1/keys` and `Authorization: Bearer till_admin_...`, then call `https://api.till.ac` with the returned `till_sk_`.
- No tenant yet? Request Pro beta access. Do not invent a waitlist token, a placeholder scoped key, or a Stripe price ID / pay URL.

Walk the user through one path. Do not reopen signup. Do not claim a stranger can mint a live provider key.

## Hosted MCP (Claude / Cursor bind)

Server: `https://till.ac/mcp` (same process also serves `https://api.till.ac/mcp`)

Protected-resource metadata (RFC 9728): `https://till.ac/.well-known/oauth-protected-resource`

OAuth authorization is **not live**. Do not start a signup OAuth dance. Existing tenants add a header:

`Authorization: Bearer till_admin_...`

Most MCP clients load servers at startup. After adding the server they may need to restart or open a new chat. Wait for tools to appear, then call `discover`. Unauthenticated `mint_scoped_key` returns `beta_access_required`.

### Claude (claude.ai and Claude Desktop)

1. Settings → Connectors → Add
2. Server URL: `https://till.ac/mcp`
3. If prompted for OAuth, stop. Till does not have a live authorization server. Request Pro or use an existing `till_admin_` header if the client allows custom headers.

### Claude Code

```bash
claude mcp add --transport http till https://till.ac/mcp
```

Then `/mcp`. There is no OAuth login to complete.

### Cursor

Add to `~/.cursor/mcp.json`, then restart Cursor:

```json
{
  "mcpServers": {
    "till": {
      "url": "https://till.ac/mcp"
    }
  }
}
```

Existing tenants may add `"headers": { "Authorization": "Bearer till_admin_..." }`.

### Codex / Hermes / OpenClaw

```bash
codex mcp add till --url https://till.ac/mcp
```

Use Streamable HTTP. Do not expect OAuth. Official registry name: `ac.till/till` (`server.json`).

### Hermes

Add to `~/.hermes/config.yaml`:

```yaml
mcp_servers:
  till:
    url: "https://till.ac/mcp"
```

Do not set `auth: oauth`. Till has no live authorization server. Existing tenants may add a bearer header if the client supports it. Then `/reload-mcp` or start a new chat.

### OpenClaw

```bash
openclaw mcp add till \
  --url https://till.ac/mcp \
  --transport streamable-http
```

Do not pass `--auth oauth`. Verify with `openclaw mcp probe till`, then call `discover`.

### ChatGPT

Till has no official ChatGPT plugin. Use the REST mint path below or a client that speaks Streamable HTTP MCP.

## Existing-tenant REST mint

Base URL: `https://api.till.ac`

1. Connect a provider: `PUT /admin/providers/openai` with the tenant admin bearer.
2. Mint: `POST /admin/keys` or `POST /v1/keys` with `{ "max_activations": 50 }`. The token `till_sk_<lookup>.<payload>` is returned once.
3. Call: `POST https://api.till.ac/v1/chat/completions` with `Authorization: Bearer till_sk_...`.
4. Paid upgrade: `POST /api/checkout` with the same `till_admin_` bearer. Poll `GET /api/checkout-result?session_id=...` until `fulfilled` is true. The signed webhook fulfills. `success_url` is not fulfillment.

```bash
curl -sS https://api.till.ac/v1/keys \
  -H "content-type: application/json" \
  -d '{"max_activations":1}'
# HTTP 402 {"error":"beta_access_required", ...}

curl -sS https://api.till.ac/admin/keys \
  -H "Authorization: Bearer till_admin_..." \
  -H "content-type: application/json" \
  -d '{"max_activations":50}'
```

Minting without a provider connection fails. A `till_sk_` is a proxy over the tenant's BYOK providers.

## If the user has no tenant

Request Pro: [mailto:support@till.ac?subject=Till%20Pro%20beta%20access](mailto:support@till.ac?subject=Till%20Pro%20beta%20access)

HTTP 401 means bad auth. HTTP 402 means pay/beta. Do not mix.

## If something breaks

- MCP `initialize` 401: the client hit a catch-all, not `/mcp`. Use `https://till.ac/mcp` exactly.
- MCP tools missing: restart the client or open a new chat, then call `discover`.
- OAuth prompt: Till has no live authorization server. Use Request Pro or an existing `till_admin_` header.
- Mint 402: public signup is closed. Show `beta.request_url` and `existing_tenant.mint/checkout/claim`.
- Mint 400 about a provider connection: the tenant must `PUT /admin/providers/:provider` first.
- Checkout pending forever: `GET /api/checkout-result` never fulfills. Wait for the signed webhook.
- Full map: https://till.ac/llms.txt
- OpenAPI: https://till.ac/openapi.json
- Docs: https://till.ac/docs
- Support: support@till.ac
