# leftblank-office

> LeftBlank Office is a remote MCP server where AI agents write, check and share Typst documents:
> papers, books, slide decks, reports, math notes, CVs and letters.

I want you to connect LeftBlank Office for me. Do every step yourself; ask me only for what you
cannot do. I may not be a developer, so tell me the result in plain words, in my language.

## OBJECTIVE

Add the MCP server `leftblank-office` (`https://office.leftblank.app/mcp`, Streamable HTTP) to this agent.

## DONE WHEN

The `get_app_state` tool of `leftblank-office` returns `platform: "web"`, and I have my claim link.

## TODO

- [ ] Reuse a saved account or create one
- [ ] Add the server
- [ ] Verify with `get_app_state`
- [ ] Tell me it is ready

## Steps

### 1. Account

If `~/.config/leftblank/account.json` exists, reuse it. Otherwise create an account; no sign-up page
is involved. Put my name instead of "Ada Lovelace" if you know it:

```sh
mkdir -p ~/.config/leftblank && (umask 077 && curl -s -X POST https://office.leftblank.app/api/accounts \
  -H 'content-type: application/json' -d '{"name":"Ada Lovelace"}' \
  -o ~/.config/leftblank/account.json)
```

The file holds `token`, `mcp_url` and `claim_url`. Never print the token. One account per person:
reuse it next time.

If I say I already have an account, skip this step and add the server without a token: the
client then signs me in with my passkey in the browser (`/mcp` in Claude Code,
`codex mcp login leftblank-office` in Codex).

### 2. Add the server

Keep my other MCP servers as they are, and do not change approval or security settings.

```sh
# Claude Code
claude mcp add --transport http --scope user leftblank-office https://office.leftblank.app/mcp \
  --header "Authorization: Bearer $(jq -r .token ~/.config/leftblank/account.json)"
```

```toml
# Codex: ~/.codex/config.toml, with LEFTBLANK_TOKEN exported from the account file
[mcp_servers.leftblank-office]
url = "https://office.leftblank.app/mcp"
bearer_token_env_var = "LEFTBLANK_TOKEN"
```

Other clients: any client with Streamable HTTP and OAuth 2.1 (dynamic client registration) can
use the URL directly; a client that only sends headers uses `Authorization: Bearer <token>`.

No shell (claude.ai, Claude Desktop, ChatGPT and other chat apps): do not look for workarounds.
Tell me to open Settings → Connectors → Add custom connector, paste `https://office.leftblank.app/mcp`, choose
Connect and create a passkey when the browser asks. That is the whole setup.

### 3. Verify

Call `get_app_state`. If your client loads new tools only in a new session, check with one
request instead, and tell me to start a new conversation:

```sh
curl -s https://office.leftblank.app/mcp -H 'content-type: application/json' \
  -H 'accept: application/json, text/event-stream' -H 'mcp-protocol-version: 2025-11-25' \
  -H "authorization: Bearer $(jq -r .token ~/.config/leftblank/account.json)" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_app_state","arguments":{}}}'
```

Until this succeeds, report "configured but not verified".

### 4. Tell me

Say it is ready. Give me the `claim_url`: opening it and creating a passkey lets me see,
download and share my documents in a browser (an unclaimed account holds up to 20 documents).
Suggest a first request, such as "Write a one-page note about … and send me a link", and
mention that I can pick a look at https://office.leftblank.app/themes or start from a finished example at https://office.leftblank.app/showcase.

EXECUTE NOW: complete the TODO list above until `get_app_state` answers through `leftblank-office`.

Once connected, the server tells you how to work with its tools. More context: https://office.leftblank.app/llms.txt
