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