LeftBlank Office

Hosted MCP server that gives AI agents a Typst workspace: create papers, slides, dimensional drawings and math, compile with Typst 0.15.1, render pages to check the result, and share a link or PDF. Nothing to install; OAuth 2.1 sign-in with a passkey.

Hosted MCP Server

npx add-mcp 'https://office.leftblank.app/mcp'

Installs into Claude Code, Codex, Cursor and more

Documentation

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:

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.

# 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)"
# 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:

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