typst-app-mcp
Integrates with the typst.app web editor to read and edit online Typst projects: manage files (read, write, minimal collaborative edits, upload, rename, delete, download), create/duplicate/update/delete projects (including from Universe templates), manage share links, members and invitations, list/add/reply/resolve/delete comments, search templates, and compile projects locally with the typst CLI to PDF/PNG/SVG with diagnostics and page previews.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@typst-app-mcp Fix the compile errors in main.typ and show me the PDF preview"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
typst-app-mcp
MCP server for the typst.app web editor. Lets an AI assistant read and edit your online Typst projects, manage files, comments and sharing, and compile them locally.
typst.app has no public API. This server speaks the same internal API as the web editor (GraphQL + REST + Yjs). It can break whenever typst.app changes, and using it is at your own risk under typst.app's terms.
Tools
Area | Tools |
Account |
|
Files |
|
Projects |
|
Sharing |
|
Comments |
|
Build |
|
Text edits are sent as minimal Yjs updates, so people editing the same file in the browser keep their changes and cursors.
Related MCP server: Typleaf MCP Server
Setup
Needs Node ≥ 20.3 and, for typst_compile, the typst CLI.
npm ci && npm run buildConfiguration (environment):
Variable | |
| Password login; the session is cached in |
| Alternative: value of the |
| typst CLI path (default |
| Where compile output goes (default |
Claude Code, with credentials injected from a vault via vault-mcp's launcher:
claude mcp add typst-app -s user -- node /path/to/vault-mcp/dist/launch.js \
--env TYPST_EMAIL=typst.app:username --env TYPST_PASSWORD=typst.app \
-- node /path/to/typst-app-mcp/dist/index.jsLimits
Free typst.app accounts cannot create comments (
COMMENT_LIMIT_REACHED); reading them works.typst_compileuses your local compiler version, which can differ from the version pinned in the web app.
Development
npm test # unit + MCP protocol tests (offline)
npm run smoke # start-up test of the built server
TYPST_E2E=1 TYPST_EMAIL=… TYPST_PASSWORD=… npm run test:e2e # live test, creates and deletes "mcp-e2e-*" projectsReleases: git tag X.Y.Z && git push origin X.Y.Z (must match package.json); CI builds and attaches the package to a GitHub release.
Available Tools
26 toolstypst_add_commentAdd commentA
Add a review comment to a text file, anchored either on exact text (anchor_text, plus occurrence if it is not unique) or on a line range. The comment stays attached to that text even when the file changes.
Inputs: path (required), content (required), project_id (required), end_line, +3 more.
typst_compileCompile projectAIdempotent
Compile a project with the local typst CLI and return errors/warnings with file and line, plus the output path. Use it after edits to check the document builds. format 'png' with preview_pages>0 returns page images inline so you can look at the layout. Packages (@preview/...) are downloaded automatically.
Inputs: project_id (required), ppi, format, main_file, +2 more.
typst_create_projectCreate projectA
Create a new project, empty or from a Typst Universe template (find one with typst_search_templates). Put it into a team with team_id from typst_whoami. Returns the new project ID.
Inputs: name (required), team_id, template, template_version.
typst_delete_commentDelete commentADestructive
Permanently delete a comment thread. Prefer typst_resolve_comment unless the user asks to delete.
Inputs: comment_id (required), project_id (required).
typst_delete_filesDelete filesADestructive
Permanently delete files from a project. Confirm with the user before deleting anything they did not explicitly ask to remove.
Inputs: paths (required), project_id (required).
typst_delete_projectDelete projectADestructive
Permanently delete a whole project. Only on explicit user request. confirm_name must equal the project's exact name as a safety check.
Inputs: project_id (required), confirm_name (required).
typst_download_projectDownload projectADestructiveIdempotent
Download all files of a project into a local directory (created if missing; existing files with the same paths are overwritten). Useful for backups, git or local editing.
Inputs: directory (required), project_id (required).
typst_duplicate_projectDuplicate projectB
Copy a project (all files) into a new project, optionally into a team.
Inputs: project_id (required), name, team_id.
typst_edit_fileEdit fileA
Replace exact text in a text file, like a find-and-replace that must match precisely (whitespace included). Each old_string must occur exactly once unless replace_all=true. Edits apply in order; if one fails, nothing is saved. Only the changed span is sent, so concurrent edits by collaborators are preserved.
Inputs: path (required), edits (required), project_id (required).
typst_get_projectGet projectARead-onlyIdempotent
Show one project: all files (paths, text/binary, IDs), main file, compiler pin, comment counts, share links, members and invitations.
Inputs: project_id (required), response_format.
typst_invite_memberInvite memberA
Invite someone to a project by email. typst.app sends them an invitation. Ask the user before inviting anyone.
Inputs: email (required), access (required), project_id (required).
typst_list_commentsList commentsARead-onlyIdempotent
List review comments of a project with file, line, the commented text and replies. Resolved comments only with include_resolved=true.
Inputs: project_id (required), response_format, include_resolved.
typst_list_projectsList projectsARead-onlyIdempotent
List typst.app projects: personal, team and shared-with-me, newest first.
Filter with query (case-insensitive substring of the project name). Returns IDs needed by every other tool. Example: "Find my thesis project" -> query="thesis".
Inputs: limit, query, offset, response_format.
typst_read_fileRead fileARead-onlyIdempotent
Read a file from a project. Text files (.typ, .bib, ...) return their content; images are returned inline; other binaries need save_to. Use start_line/end_line for long files. Use line_numbers=true when you plan comments on line ranges.
Inputs: path (required), project_id (required), save_to, end_line, +2 more.
typst_remove_memberRemove memberBDestructive
Remove a member from a project. user_id comes from typst_get_project.
Inputs: user_id (required), project_id (required).
typst_rename_fileRename / move filesAIdempotent
Rename or move files inside a project. Moving to a new folder is just a new path. Remember to update #include/#import paths that point to them.
Inputs: renames (required), project_id (required).
typst_reply_commentReply to commentB
Reply to a comment thread. comment_id comes from typst_list_comments.
Inputs: content (required), comment_id (required), project_id (required).
typst_resolve_commentResolve commentAIdempotent
Mark a comment thread as resolved, or reopen it with resolved=false.
Inputs: comment_id (required), project_id (required), resolved.
typst_revoke_invitationRevoke invitationBDestructiveIdempotent
Withdraw a pending invitation by email.
Inputs: email (required), project_id (required).
typst_search_templatesSearch templatesARead-onlyIdempotent
Search Typst Universe templates (latest versions) to start a project from. Pass the chosen name to typst_create_project. Examples: "IEEE paper" -> query="ieee"; "German thesis" -> query="thesis".
Inputs: limit, query.
typst_update_memberChange member accessAIdempotent
Change an existing member's access. user_id comes from typst_get_project.
Inputs: access (required), user_id (required), project_id (required).
typst_update_projectUpdate project settingsAIdempotent
Rename a project, set its main (previewed/compiled) file, or pin the compiler version used by the web app.
Inputs: project_id (required), name, main_file, pinned_version.
typst_upload_fileUpload local file or folderADestructiveIdempotent
Upload a local file (image, font, .bib, data, ...) or a whole folder into a project. Existing files with the same path are replaced. Hidden files and folders are skipped. Example: local_path="/home/me/figures", remote_path="figures".
Inputs: local_path (required), project_id (required), remote_path.
typst_whoamiWho am IARead-onlyIdempotent
Show the signed-in typst.app account and its workspaces (personal + teams with their IDs). Use the team IDs for typst_create_project.
Inputs: no named parameters.
typst_write_fileWrite fileADestructiveIdempotent
Create a text file or replace its entire content. Collaborators in the web editor see the change live. Prefer typst_edit_file for changes to part of an existing file. Folders are created implicitly by the path.
Inputs: path (required), content (required), project_id (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 26 tools
Tools are organized around clearly distinct resources (projects, files, comments, members, sharing, compile), and descriptions actively steer between near-neighbors like typst_write_file vs typst_edit_file vs typst_upload_file and typst_delete_comment vs typst_resolve_comment. The only residual overlap is among the file-mutation trio, which is handled explicitly rather than left ambiguous.
Every tool follows the same typst_<verb>_<noun> snake_case pattern with a uniform prefix, covering create/get/list/update/delete/duplicate for projects and read/write/edit/upload/rename/delete/download for files. Pluralization (typst_delete_files) mirrors the fact that the operation takes multiple paths, so it is purposeful rather than inconsistent.
At 26 tools this sits just past the comfortable range, and the surface splits into six sub-domains (projects, files, comments, members, sharing, compile). Nearly every tool earns its place, but a few low-frequency ones (typst_revoke_invitation, typst_duplicate_project, typst_whoami) inflate the count.
Full lifecycle coverage exists across projects (create/list/get/update/delete/duplicate), files (read/write/edit/upload/rename/delete/download) and comments (list/add/reply/resolve/delete), plus membership and share links. Minor gaps remain: no cross-file content search, no comment editing, and no way to list members/invitations outside typst_get_project.
Maintenance
Related MCP Connectors
Persistent AI LaTeX workspace: edit and compile multi-file projects, export publication-ready PDFs.
Your Aurentia workspace — projects, CRM, tasks, deliverables — in Claude, Cursor or any MCP client.
A hosted LaTeX editor your assistant can actually use. Search 1,019 free templates, create and edit projects, and compile them to PDF on a real TeX Live farm, getting back the PDF or the compile log when a build fails. Thirteen tools behind OAuth 2.1, with nothing to install and nothing to run locally.
Convert, create and edit Word, PowerPoint, Excel and PDF documents from any AI agent.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to read, write, and compile LaTeX projects locally, view PDF pages as images, and manage project files, with live updates reflected in a web-based editor.-
- AlicenseAqualityBmaintenanceEnables AI assistants to manage Typst and LaTeX projects on self-hosted Typleaf instances, including reading and editing documents, compiling to PDF, analyzing structure and page layout, checking citations, and reviewing git history.229MIT
- AlicenseAqualityBmaintenanceEnables AI agents to authenticate to typst.app cloud projects, list/create/delete projects, and read, write, surgically edit, rename, or delete Yjs CRDT-backed text files and binary assets over the native WebSocket and REST/GraphQL protocol. It also syncs cloud content into a local workspace to return structured Typst compiler diagnostics, export PDFs, and capture preview screenshots.18113 npm1MIT
- FlicenseNot gradedqualityAmaintenanceEnables AI models to interact with Typst by converting LaTeX snippets to Typst, validating Typst syntax, reading Typst documentation, and rendering Typst code as PNG images.-