Typst Web MCP
Typst Web MCP is an MCP server that lets AI agents manage and edit typst.app cloud projects, sync Yjs CRDT text, search/replace, compile diagnostics, export PDFs, and capture previews.
Authenticate with Typst Web via email/password or session cookie, with browser fallback, and check auth status.
List, inspect, create, and delete Typst Web projects, including initial files and pinned compiler versions.
List, read, create, overwrite, and targeted-edit project text files using paged reads, content hashes, dry runs, and CRDT synchronization.
Search text or regex across project files and perform single or batch find-and-replace operations.
Upload or replace binary assets such as PNG, JPG, SVG, PDF, and fonts; rename, move, or delete files.
Retrieve compiler diagnostics via local Typst CLI, Typst Web cloud compiler, or automatic fallback.
Export projects to PDF and capture high-DPI PNG previews or live browser screenshots.
Preserve collaborator cursors and version history through native Yjs CRDT and Typst Web WebSocket/REST persistence.
Provides tools for interacting with typst.app cloud projects, enabling AI agents to manage projects and files, perform real-time Yjs CRDT document editing, upload binary assets, run Typst compiler diagnostics, export PDFs, and capture high-DPI preview screenshots.
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 Web MCPcheck my typst project for errors"
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 Web MCP
Model Context Protocol (MCP) server for https://typst.app — cloud projects, Yjs CRDT editing, and Typst compiler diagnostics
Installation
Add typst-mcp to your MCP client configuration (.pi/agent/mcp-adapter.json, claude_desktop_config.json, or .cursor/mcp.json).
Prerequisites
Node.js
>= 18Typst CLI (optional:
typstonPATHfor local CLI compilation speed; if not installed,typst_get_diagnosticsautomatically uses Typst Web cloud compiler diagnostics)
Option 1: Normal (Standard)
Runs the published typst-mcp package (npx -y typst-mcp):
{
"mcpServers": {
"typst-mcp": {
"command": "npx",
"args": ["-y", "typst-mcp"],
"env": {
"TYPST_EMAIL": "your-email@example.com",
"TYPST_PASSWORD": "your-password"
}
}
}
}Option 2: Always Latest
Bypasses local npx cache to automatically pull and run the newest release on launch (npx -y typst-mcp@latest):
{
"mcpServers": {
"typst-mcp": {
"command": "npx",
"args": ["-y", "typst-mcp@latest"],
"env": {
"TYPST_EMAIL": "your-email@example.com",
"TYPST_PASSWORD": "your-password"
}
}
}
}Related MCP server: Typleaf MCP Server
Overview
typst-web-mcp connects AI coding and writing agents directly to collaborative typst.app cloud projects. Instead of relying on brittle browser DOM scraping, it implements the native typst.app client protocol:
Native Yjs CRDT Text Sync: Decodes and mutates multiplayer
Y.Doc(doc.getText("text")) state vectors so surgical edits preserve collaborator cursors and version history.Binary
/editing/v3WebSocket Wire Protocol: Encodes and decodeslib0variable-length binary frames (Subscribe,TextUpdate,Pong,Refresh,Presence,Cursor,Leave) with REST/v1/files/:projectId/:fileId/yjspersistence.GraphQL & REST Project Management: Full project CRUD, file tree inspection, rename/move, delete, and binary figure/asset uploads (
PNG,JPG,SVG,PDF, fonts).Direct Authentication + Fallback: Authenticates via
GET /v1/to-signin+POST /v1/auth/signin(__Http-typst-session), with persistent session caching and automatic cookie/Playwright fallback on challenge.Compiler Diagnostics, Preview Screenshots & PDF Export: Synchronizes cloud Yjs text and binary assets into an isolated workspace and runs the Typst compiler to return structured line/column diagnostics, high-DPI PNG preview screenshots (
typst_capture_screenshot), and compiled PDFs (typst_export_pdf).
MCP Tools (18 Tools)
Category | Tool Name | Description |
Auth |
| Authenticate with |
Auth |
| Check active authentication state, login method, and stored session cookies. |
Projects |
| List all owned and shared/external projects in the user's |
Projects |
| Retrieve full project metadata, access permissions, pinned compiler version, and file tree ( |
Projects |
| Create a new |
Projects |
| Permanently delete a |
Files & CRDT |
| List all multiplayer Yjs text files and binary asset blobs in a project. |
Files & CRDT |
| Read bounded source pages (200 lines/16 KiB by default), with compact metadata, whole-file content hashes, separate continuation fields, and native image blocks. |
Files & CRDT |
| Create or overwrite a |
Files & CRDT |
| Apply validated, unique edits to one snapshot with optional stale-content protection, exact matching by default, compact receipts, opt-in fuzzy fallback, and bounded diff previews. |
Search & Replace |
| Search for text or regular expressions across project files, returning file paths, line numbers, and optional surrounding context lines. |
Search & Replace |
| Replace text or regex in one file or project-wide. Batch ordered replacement rules in one call with one save per changed file, compact summaries, optional diffs, and dry-run previews. |
Assets & Tree |
| Upload or replace binary assets ( |
Assets & Tree |
| Rename or move a file inside a |
Assets & Tree |
| Delete a file or binary asset from a project ( |
Compiler |
| Retrieve compiler diagnostics (errors, warnings, line/column numbers, and hints). Supports both local Typst CLI ( |
Compiler |
| Sync all cloud text & binary assets, compile the project to PDF, and save to |
Preview |
| Capture high-DPI PNG preview screenshots ( |
Read and edit efficiently
Use
typst_grep_projectto locate relevant text, then read just that range withtypst_read_file(offsetis 1-based,limitdefaults to 200 lines,maxBytesdefaults to 16 KiB and can be raised to 1 MiB).Keep the returned
contentHash. It is SHA-256 of the entire raw text file, including BOM and line endings, even when reading a range or displaying line numbers.Send all disjoint edits in one
typst_edit_filecall, withexpectedHashset to that hash. Prefer a short uniqueoldTextanchor over repeating a whole file.
{
"projectId": "your-project-id",
"filePath": "main.typ",
"expectedHash": "<contentHash from the read response>",
"edits": [
{ "oldText": "September 2025", "newText": "September 2026" }
]
}Text read responses include source only in content, with totalLines, startLine, endLine, truncated, and nextOffset when more source remains. They never repeat source in truncation metadata or append instructions to it. Complete lines and original line endings are retained, so unnumbered pages can be concatenated without losing bytes. A trailing newline does not create a phantom extra line. An empty file has totalLines: 0, startLine: 1, endLine: 0.
Read metadata defaults to {id, name}. Use output: "full" for full file metadata; this does not increase the source range. lineNumbers: true adds display prefixes: remove those prefixes when constructing oldText. Byte budgets include those prefixes. If one line cannot fit, the tool returns an actionable error rather than an empty page that cannot advance.
Edits match against the same original snapshot, not the result of previous edits. All entries must be valid, and each anchor must be unique, including overlapping occurrences. Invalid batches, overlapping ranges, and stale hashes fail before saving. matchMode: "exact" is the default and accepts LF/CRLF differences. Use matchMode: "fuzzy" to opt into Unicode quote/dash/space and NFKC fallback when no exact match exists. Fallback matching preserves characters outside the matched span. Edits retain the BOM and untouched line endings, including mixed LF/CRLF files.
Successful edits return a compact receipt with file ID/name, appliedCount, the resulting contentHash, and firstChangedLine. This avoids returning the same changes as both a diff and a patch. Optional controls:
output: "diff"adds a display diff;output: "full"also adds a patch and full metadata.Each diff/patch field is limited to 100 lines and
maxDiffBytesbytes (default 8192, maximum 1 MiB).diffTruncated/patchTruncatedexplicitly flag omissions; read the affected range for complete source.dryRun: truevalidates and previews without saving and defaults to diff output. ItsappliedCountdescribes proposed edits; itscontentHashstill identifies the unchanged cloud text.
expectedHash is checked on fresh text inside the shared file mutation queue, which serializes local edits, replacements, and whole-file writes to existing files. It detects changes made since the read; it is not a cloud compare-and-swap transaction and cannot prevent a collaborator from editing during the subsequent save. Yjs still merges concurrent cloud updates.
Changed defaults: reads previously allowed 2,000 lines/50 KiB and embedded continuation hints in content. Read callers should follow nextOffset now. MCP edits previously returned full diffs/patches and used fuzzy fallback automatically; request output: "full" or matchMode: "fuzzy" explicitly when needed. The low-level editYjsText helper retains its legacy fuzzy default; the client/MCP edit path defaults to exact matching.
Batch replacements for agents
Use one typst_find_and_replace call for related replacements. For example, expand abbreviated month names throughout all .typ files:
{
"projectId": "your-project-id",
"glob": "*.typ",
"replacements": [
{ "pattern": "\\bSep\\b", "replacement": "September", "regex": true },
{ "pattern": "\\bOct\\b", "replacement": "October", "regex": true }
]
}Each file is downloaded once, all rules run in order on the previous rule's result, and the file is saved once if its final text changed. All rules are validated before any files are written. File mutations remain serialized with other edits; a project-wide operation is not atomic across files if a network or save error occurs.
Batch calls default to output: "summary":
{
"filesModified": [
{
"file": "main.typ",
"replacementsCount": 3,
"replacementCounts": [2, 1],
"firstChangedLine": 4
}
],
"totalReplacements": 3,
"dryRun": false
}replacementCounts follows the input rule order and counts matches applied by each rule in that changed file. Unchanged files, including batches whose rules cancel each other out, are omitted and do not contribute to totals.
Set
dryRun: trueto preview without saving. Addoutput: "diff"to include a single combined display diff per file.Set
output: "full"to include both the display diff and unified patch.Set
regex,ignoreCase, andlimiton each batch rule.limitis a non-negative integer per rule per file;0disables that rule.Use either
replacementsor the existingpattern/replacementfields. Existing single-replacement calls still default tooutput: "full"; they can request"summary"too.Use
filePathto target one file by path or ID. A missing explicit file returns an error.
Development & Verification
From Source (Development)
Requires Bun >= 1.2:
git clone https://github.com/caphefalumi/typst-web-mcp.git
cd typst-web-mcp
bun install
bun run devBuild & Test
# Compile publishable output to dist/
bun run build
# Typecheck with strict TypeScript
bun run typecheck
# Full suite (includes test/smoke.test.ts: dist bin + npx -y typst-mcp)
bun test
# Smoke only (same as pi npx MCP config)
bun run test:smokePush/PR to main runs .github/workflows/ci.yml (bun ci, build, typecheck, bun test).
Publishing to npm
Same flow as Canvas-CLI:
Bump
versioninpackage.json(must not match a version already on npm).Commit, push, and create a GitHub Release for that tag — or run Actions → Publish → Run workflow (
workflow_dispatch).
.github/workflows/npm-publish.yml runs the same checks as CI (bun test, including smoke) in a test job; the publish job runs only if that passes, on the npm-publish environment: bun ci, bun run build, then npm publish --access public via npm trusted publishing (OIDC). The publish step clears NODE_AUTH_TOKEN so the CLI uses GitHub OIDC instead of a stale token from setup-node.
Trusted publisher (maintainers): package typst-mcp → Settings → Trusted publishing → GitHub Actions — user/org caphefalumi, repo typst-web-mcp, workflow file npm-publish.yml, environment npm-publish, allow npm publish.
License
Released under the MIT License. Copyright (c) 2026 Dang Duy Toan (caphefalumi).
Available Tools
18 toolstypst_auth_loginA
Authenticate with https://typst.app using direct email/password API login (POST /v1/auth/signin) or a session cookie (__Http-typst-session), with automatic cookie/browser fallback on challenge.
| Name | Required | Description | Default |
|---|---|---|---|
| No | Typst account email (falls back to TYPST_EMAIL env var) | ||
| password | No | Typst account password (falls back to TYPST_PASSWORD env var) | |
| sessionCookie | No | Optional __Http-typst-session cookie value or full Cookie header string (falls back to TYPST_SESSION_COOKIE) | |
| useBrowserFallback | No | Enable automatic fallback if Turnstile/CAPTCHA challenge blocks direct HTTP login (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose meaningful behavior: the concrete endpoint hit and that a Turnstile/CAPTCHA challenge triggers automatic cookie/browser fallback. It omits what happens on failure, whether credentials are persisted, session lifetime, and what the tool returns or how the resulting session is consumed by sibling tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the verb and destination, then enumerates the mechanisms. It is dense but every clause carries information; no filler or restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations and no output schema, the definition covers the input side well but leaves the result side blank — whether a session token is stored, returned, or shared with sibling typst_* tools, and failure modes. An agent can invoke it, but cannot predict what it gets back or what to do next.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real mapping value by tying the two auth paths to their parameters — POST /v1/auth/signin corresponds to email/password, and the named __Http-typst-session cookie corresponds to sessionCookie, while the 'fallback on challenge' clause explains useBrowserFallback.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (authenticate) against a specific resource (typst.app) and names the exact mechanisms: direct email/password API login to POST /v1/auth/signin, or the __Http-typst-session cookie. It is trivially distinguishable from the sibling typst_auth_status, which checks state rather than establishing it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description presents two authentication paths (credential login vs. session cookie) and notes a browser fallback, which implies context for choosing an approach. However, it never says when to prefer email/password over a session cookie, whether auth is a prerequisite for the other typst_* tools, or when this should be called rather than typst_auth_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typst_auth_statusA
Check current https://typst.app authentication status, active session cookies, and login method.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully names the three pieces of information returned, but doesn't say whether it performs a network round-trip, what happens when unauthenticated (error vs. empty result), or whether it mutates/refreshes session state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tightly scoped sentence with no filler; the most important information (what is checked) comes first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only check with no output schema, enumerating the returned facts is largely sufficient. The main omission is the unauthenticated/error behavior an agent would need to interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so baseline is 4 and there is nothing about which the description could add parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Check') and concrete resources: authentication status, active session cookies, and login method. This naturally distinguishes it from the sibling typst_auth_login, though it doesn't name that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus typst_auth_login, or whether it should be run before authenticated operations. Usage is only implied by the word 'Check'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typst_capture_screenshotA
Capture high-resolution PNG preview screenshots to verify the visual status of a https://typst.app project (mode='pages' renders compiled PNG pages via Typst; mode='browser' captures the live typst.app web editor & preview pane via Playwright).
| Name | Required | Description | Default |
|---|---|---|---|
| ppi | No | Pixels per inch resolution for rendered PNGs (default: 144) | |
| mode | No | 'pages' (default) compiles high-DPI PNG pages from synced project files; 'browser' captures the live https://typst.app/project/:id UI | |
| pages | No | Page range to capture, e.g. '1', '1-3', '1,4', or 'all' (default: 'all') | |
| mainFile | No | Optional main .typ entry file override | |
| outputDir | No | Optional directory path to save the rendered PNG screenshot files | |
| projectId | Yes | The Typst project ID | |
| includeBase64 | No | Include screenshots as image blocks for direct vision inspection (default: true; set false to return paths and metadata only) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the burden of behavioral transparency. It adds crucial operational details like referencing 'Playwright' for web capture and specifying the output format (PNG previews).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but highly efficient, dedicating one sentence to defining the entire tool's function and its modes without unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of an output schema, the description is fully self-contained, explaining the nature of the input and the resulting visual verification output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description provides essential context for the function's purpose (visual status verification) which the schema merely implements. It also explains the implication of the 'mode' parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the goal (capture high-resolution PNG preview screenshots) and precisely defines the two different operational modes ('pages' vs. 'browser'), making it easily distinguishable from standard file read/write tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The distinction between the 'pages' mode (compilation) and the 'browser' mode (live capture) effectively guides the agent on when to use the tool for different visual verification tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typst_create_projectC
Create a new project on https://typst.app with optional initial .typ/.bib files and pinned Typst compiler version.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Project title | |
| files | No | Optional initial text files (defaults to main.typ) | |
| owner | No | Optional owner user/team ID | |
| folder | No | Optional folder ID | |
| pinnedVersion | No | Typst compiler version (default: 0.15.1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses that files are optional and a compiler version can be pinned, but omits critical context: whether authentication is required (a typst_auth_login sibling exists), what happens on duplicate project names, what the call returns, and whether creation is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with zero waste; every clause contributes to what the tool creates and what optional inputs it accepts.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the definition is too thin. It should at least mention authentication requirements and expected return behavior; as written, an agent would have to infer these from sibling tools or trial and error.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented. The description only restates the optional files and pinned compiler version, adding no syntax or behavioral detail beyond the schema, which is the baseline 3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — 'Create a new project' — and names the platform, which is enough to distinguish it from list, get, and delete siblings. It does not explicitly contrast with an alternative, but no sibling offers competing creation semantics, so the purpose is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, no mention of prerequisites such as authentication, and no exclusions or edge-case conditions. Usage is implied by the name alone rather than explained.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typst_delete_fileC
Delete a file or asset from a https://typst.app project via DeleteFilesMutation.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | Yes | File path/name or file ID to delete | |
| projectId | Yes | The Typst project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It conveys that this is destructive ('Delete') and names the mutation, but says nothing about whether deletion is permanent, what happens when the path does not exist, or whether it cascades to referencing assets.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the verb and resource first, then the domain and mechanism. The trailing 'via DeleteFilesMutation' is low-value implementation detail but does not bloat the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, no-output-schema destructive tool, the description covers identity but not consequences, error behavior, or auth requirements. Adequate to identify the call, thin for calling it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both projectId and filePath are already documented, including the useful detail that filePath accepts a path/name or a file ID. The description adds no parameter information beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: delete a file or asset in a Typst project, and identifies the underlying DeleteFilesMutation. It is distinguishable from typst_delete_project (project-level) and from typst_rename_file/typst_write_file, though it doesn't explicitly say so.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus typst_rename_file, typst_write_file, or typst_delete_project, and no prerequisites such as auth or membership. The agent must infer usage entirely from the name and schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typst_delete_projectB
Permanently delete a project on https://typst.app by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | The Typst project ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden, and it does disclose the single most important trait: the deletion is permanent/irreversible. However, it says nothing about authentication requirements, what happens to files contained in the project, or behavior when the ID does not exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with the destructive nature front-loaded and zero filler. Nothing in it is redundant or misplaced.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with no output schema, the definition covers the essential action and irreversibility. It is only slightly thin on prerequisites (auth) and side effects on project contents, which an agent calling a delete tool would want.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single projectId parameter is fully documented in the schema, so the baseline is 3. The description's "by ID" merely echoes the schema and adds no format or validation detail beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Permanently delete a project") with a scoping hint ("by ID"), which makes it distinguishable from typst_delete_file and typst_get_project without opening the schema. It does not explicitly name or contrast a sibling, so it falls just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus typst_get_project or typst_delete_file, and no stated prerequisites. The word "Permanently" hints at caution but gives no conditional or alternative-routing instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typst_edit_fileA
Apply all targeted edits against one original file snapshot, with one save. Prefer short unique oldText anchors and expectedHash from typst_read_file to reject stale edits. Exact matching by default (LF/CRLF resilient); matchMode='fuzzy' opts into Unicode/whitespace fallback. Malformed, ambiguous, or overlapping edits fail without saving. Summary output by default; dryRun previews a bounded diff. Unchanged characters and BOM are preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| edits | No | One or more targeted non-overlapping replacements. Each oldText must be unique in the original file. | |
| dryRun | No | Validate and preview edits without saving (default: false). Returned contentHash still identifies unchanged cloud text. | |
| output | No | summary (default): counts, new contentHash, firstChangedLine; diff: also a bounded display diff; full: also bounded patch and full metadata. dryRun defaults to diff. | |
| newText | No | Optional replacement text for single replacement shorthand | |
| oldText | No | Optional shorthand for a single replacement (used if edits is omitted) | |
| filePath | No | File path/name (e.g. 'main.typ') or file ID | |
| matchMode | No | exact (default) matches source with newline normalization. fuzzy enables Unicode quote/dash/space/NFKC fallback only when an exact match is absent. | |
| projectId | No | The Typst project ID | |
| expectedHash | No | Recommended: contentHash from the latest read. Checked against fresh downloaded text inside the file mutation queue; stale files fail without saving. | |
| maxDiffBytes | No | Byte budget per diff/patch field (default: 8192). Each also has a 100-line cap. Truncation is explicit; read affected ranges for full details. | |
| preferWebSocket | No | Push real-time TextUpdate over /editing/v3 WebSocket in addition to REST persistence (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so well: it discloses atomic save semantics, default exact matching, LF/CRLF resilience, fuzzy fallback behavior, failure-without-saving on malformed or overlapping edits, dryRun preview behavior, and preservation of unchanged characters and BOM.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and dense with relevant behavior in only a few sentences. Every sentence contributes either scope, matching semantics, failure behavior, output behavior, or preservation guarantees.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having 11 parameters and no output schema, the description covers the essential edit semantics, failure modes, output modes, and preservation guarantees an agent needs to invoke it correctly. Remaining details are well covered by the fully documented input schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 11 parameters, including oldText, expectedHash, matchMode, output, and dryRun. The description adds some useful emphasis on short unique anchors and expectedHash freshness, but most parameter meaning is already present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: applying targeted edits to one original file snapshot with a single save. That clearly distinguishes it from full-file writes, but it does not explicitly name or compare against the closest sibling alternatives such as typst_find_and_replace or typst_write_file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives useful safety advice to prefer short unique oldText anchors and expectedHash from typst_read_file, but it does not say when to choose this tool over typst_find_and_replace or typst_write_file. Usage is implied by the multi-edit atomic-edit framing rather than stated with explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typst_export_pdfB
Synchronize all text and binary files from a https://typst.app project, compile the document to PDF, and save it to outputPath.
| Name | Required | Description | Default |
|---|---|---|---|
| mainFile | No | Optional main .typ entry file override | |
| projectId | Yes | The Typst project ID | |
| outputPath | No | Optional local filesystem path to save the compiled PDF |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose a meaningful composite behavior: a file sync side effect plus a compile step plus a save. However, it doesn't say where the synchronized files land, whether local files are overwritten, whether authentication to typst.app is required, or what happens if outputPath is omitted. Those are real gaps for a tool with network and filesystem side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence of moderate length that front-loads the action sequence (sync, compile, save) with no filler. It reads as a run-on only because it packs three distinct phases into one clause chain.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter, no-annotation tool with no output schema, the description should state what is returned (a path, a binary, or nothing) and what happens when outputPath is omitted. Neither is covered, though the core three-phase behavior is conveyed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so projectId and mainFile are already documented in the schema. The description only reinforces outputPath as the save destination and adds the compile-target framing for mainFile, but does not clarify the optional-vs-required behavior of outputPath. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states specific verbs and resources: synchronize project files, compile to PDF, save to outputPath. This is clearly distinguishable from siblings like typst_capture_screenshot or typst_read_file, which do not produce a compiled PDF. It stops short of naming an alternative, so it's clear but not perfectly differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the description (you would call this to get a PDF), but there is no explicit statement of when to use this versus e.g. typst_capture_screenshot or typst_read_file, and no prerequisites or caveats are given. The reader must infer the context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typst_find_and_replaceA
Find and replace text or regex in one file or project-wide. Use replacements to batch mappings (e.g. Sep → September, Oct → October) in one call with one save per file. Rules run sequentially; later rules see earlier results. Batch output defaults to compact summary; request output='diff' or 'full' for previews. Supports dryRun and per-file mutation serialization. Project-wide changes are not atomic across files.
| Name | Required | Description | Default |
|---|---|---|---|
| glob | No | Optional glob pattern to filter target files when searching project-wide (e.g. '*.typ') | |
| limit | No | Maximum number of replacements per file (default: replace all occurrences) | |
| regex | No | Whether pattern is a regular expression (default: false) | |
| dryRun | No | If true, returns unified diffs and match counts without saving changes (default: false) | |
| output | No | summary: counts and first changed line; diff: also display diff; full: also unified patch. Defaults to summary for batches, full for legacy pattern/replacement calls. Applies to dry runs too. | |
| pattern | No | Search pattern to replace (literal substring or regex) | |
| filePath | No | Optional file path/name (e.g. 'main.typ'). If omitted, searches and replaces across all text files in the project. | |
| projectId | Yes | The Typst project ID | |
| ignoreCase | No | Case-insensitive search (default: false) | |
| replacement | No | Replacement text (supports $1, $2 capture groups if regex is true) | |
| replacements | No | Ordered replacement rules instead of pattern/replacement. Each rule runs on the previous result. Set regex, ignoreCase, and limit per rule. All rules are validated before any writes; each changed file is saved once. | |
| preferWebSocket | No | Push real-time TextUpdate over /editing/v3 WebSocket before REST persistence (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries real weight and delivers: sequential rule ordering where later rules see earlier results, one save per changed file, per-file mutation serialization, and the important caveat that project-wide changes are not atomic across files. Missing are reversibility/undo guarantees and any permission or locking requirements, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six compact sentences, front-loaded with the core action and scope, then escalating to batch semantics, output modes, and the atomicity caveat. Slightly dense but no sentence is filler; it could be tightened marginally.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutating tool with a oneOf schema and no output schema, the description covers the highest-risk behaviors: save granularity, rule sequencing, dry-run preview, and non-atomicity across files. Given the schema fully documents parameters, the remaining gap is only around return-value shape and rollback, which is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 12 parameters are already documented. The description adds only marginal meaning, mostly restating ordering semantics that the schema's 'replacements' description already states and the output default behavior that the 'output' field already explains. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Find and replace text or regex') and states the two scopes (single file vs project-wide). It is clearly distinguishable from typst_edit_file and typst_grep_project in substance, but never names or contrasts those siblings explicitly, which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage context: use the 'replacements' array to batch mappings in one call with one save per file, and preview with dryRun or output='diff'. It does not state when to prefer typst_edit_file for arbitrary rewrites or typst_grep_project for search-only, so no explicit exclusions or alternatives are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typst_get_diagnosticsA
Retrieve compiler diagnostics (errors, warnings, line/column numbers, and hints) for a https://typst.app project. Supports both local Typst CLI compilation (fastest) and Typst Web cloud diagnostics (zero-binary fallback using typst.app cloud compiler).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Diagnostics mode: 'auto' (prefers local Typst CLI if installed, falls back to Typst Web cloud compiler), 'cli' (requires local typst binary), or 'web' (uses Typst Web cloud compiler). Defaults to 'auto'. | |
| mainFile | No | Optional main .typ entry file override (defaults to project previewed file or main.typ) | |
| projectId | Yes | The Typst project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the key behavioral trait: two execution backends, with local CLI preferred for speed and a zero-binary cloud fallback. It does not mention that web mode may require authentication or what happens when neither backend is available, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the resource and the returned data, then the backend nuance. No filler or redundancy; every clause adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the diagnostic fields returned (errors, warnings, line/column, hints) and explaining backend selection. Minor gaps remain around auth requirements for web mode and failure behavior, but an agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameter documentation is already complete and 3 is the baseline. The description adds only marginal semantic value, echoing the local-vs-cloud tradeoff ('fastest', 'zero-binary fallback') that the mode enum description already explains.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve compiler diagnostics ... for a typst.app project') and enumerates the payload (errors, warnings, line/column numbers, hints). It is clearly distinct from siblings such as typst_read_file or typst_export_pdf, which read content or render output rather than report compilation problems.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the tool to call after editing to verify compilation, and the mode parentheticals hint at when local vs cloud applies. There is no explicit statement of when to prefer this over alternatives (e.g., read_file for inspecting source) or any prerequisites, so the guidance stays at the minimum-viable level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typst_get_projectA
Get detailed metadata, access permissions, pinned compiler version, and full file tree for a https://typst.app project.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | The Typst project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses what is returned (metadata, permissions, compiler version, file tree), which is useful behavioral context. However, it does not explicitly state that the operation is read-only, whether authentication is required, or any rate limits—details an agent might need for a project access tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that efficiently lists the key returned information. Every phrase earns its place, and there is no redundant or vague language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with one parameter, no output schema, and no annotations, the description provides a clear inventory of what the agent will receive. It is nearly complete, though it could mention authentication or read-only behavior to fully cover the lack of annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage for the single parameter, so the baseline is 3. The description adds no additional meaning about the 'projectId' parameter beyond what the schema already provides, which is acceptable given the high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and enumerates the resource contents: detailed metadata, access permissions, pinned compiler version, and full file tree. It clearly distinguishes this tool from list_projects and list_files by scoping to a single project's full details. However, it does not explicitly name sibling tools to differentiate further, keeping it at a 4.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage is implied: an agent would infer this is for inspecting a project's details. There is no explicit statement of when to use this versus list_projects or list_files, nor any exclusions or prerequisites. The context is clear enough to be minimally viable but lacks direct guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typst_grep_projectA
Search for text or regular expressions across files in a https://typst.app project. Returns matching lines with file paths, line numbers, and optional surrounding context lines.
| Name | Required | Description | Default |
|---|---|---|---|
| glob | No | Optional glob pattern to filter files (e.g. '*.typ' or '*.bib') | |
| path | No | Optional directory or file path to restrict search (e.g. 'chapters/' or 'main.typ') | |
| limit | No | Maximum number of matches to return (default: 100) | |
| context | No | Number of lines to show before and after each match (default: 0) | |
| literal | No | Treat pattern as literal string instead of regex (default: false) | |
| pattern | Yes | Search pattern (regular expression or literal string) | |
| projectId | Yes | The Typst project ID | |
| ignoreCase | No | Case-insensitive search (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose useful behavior: regex or literal matching, and that results include file paths, line numbers and optional context. It omits the read-only/non-mutating guarantee, the default match limit, and any scope or performance caveats.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences with the operation front-loaded and the return format second. No filler, though it could fold in one routing hint without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an eight-parameter read tool with a fully described schema and no output schema, the description covers what it does and what comes back. The missing piece is the behavioral context that annotations would normally supply, such as read-only safety and the default result limit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter including glob, path, limit, context, literal and ignoreCase is already documented in the schema. The description adds only that regexes are supported by default, which the schema also implies; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: search for text or regex across files in a Typst project, and summarizes the return shape. It is clearly distinguishable from typst_find_and_replace and typst_read_file by being read-only search, though it never names a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the verb 'search'. There is no guidance on when to prefer this over typst_read_file or typst_list_files, nor on when a regex versus literal search is appropriate beyond the parameter default.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typst_list_filesB
List all files (multiplayer Yjs text files and binary asset blobs) inside a https://typst.app project.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | The Typst project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does add real value by disclosing what the listing contains (Yjs text files plus binary asset blobs) even though no output schema exists. However it says nothing about pagination, ordering, whether directories are included, or authentication requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. The scope ('inside a project') and the content description both land before the sentence ends.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with no output schema, the description covers purpose and return content adequately. Minor gaps remain around authentication and result shape, but nothing essential to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and the schema already documents projectId at 100% coverage ('The Typst project ID'). The description reinforces the project scoping but adds no format, sourcing, or validation details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all files ... inside a project') and even enumerates the resource subtypes ('multiplayer Yjs text files and binary asset blobs'). It is clearly distinguishable from typst_list_projects and typst_read_file, though it does not explicitly name those siblings as contrasts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to call this instead of typst_list_projects or typst_get_project, nor does it mention prerequisites such as needing a projectId obtained elsewhere. Usage must be inferred entirely from the object ('inside a project').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typst_list_projectsA
List all owned and shared/external projects in the authenticated user's https://typst.app dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the auth precondition ('authenticated user') and that both owned and shared/external projects are included — a meaningful behavioral fact. It does not disclose whether results are paginated, ordered, or truncated for large accounts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, verb and scope front-loaded, zero filler. Nothing in it is redundant with structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read tool with no output schema, the description covers source and scope; the only gap is that it does not indicate what a returned project entry contains or whether results are grouped by owner vs shared. That is a minor omission for such a simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate beyond scope; the baseline for a parameterless tool applies. The 'owned and shared/external' qualifier usefully narrows what the empty call returns.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (projects), plus the scope 'owned and shared/external', which separates it from typst_get_project (single project) and typst_list_files (files inside a project). It does not explicitly name those siblings, but the resource noun makes the distinction readable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance and no named alternative; usage is only implied by the scope (enumerate dashboard projects, likely to obtain project identifiers for typst_get_project / typst_list_files). Adequate but leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typst_read_fileA
Read project text in bounded pages (default 200 lines/16 KiB) or images as native image blocks. content contains source only; use nextOffset for continuation. contentHash covers the entire raw text file: pass it as expectedHash to typst_edit_file. Compact file metadata by default; output='full' adds metadata, not extra source lines. Use grep to locate relevant lines before reading large files.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum complete lines to read (default: 200). Use nextOffset to continue. | |
| offset | No | Line number to start reading from (1-indexed) | |
| output | No | compact (default): minimal file metadata; full: all file metadata. Both use offset/limit/maxBytes pagination. | |
| filePath | Yes | File path/name (e.g. 'main.typ') or file ID | |
| maxBytes | No | Maximum returned source bytes, including line number prefixes (default: 16384, maximum: 1 MiB). Increase for unusually long lines. | |
| projectId | Yes | The Typst project ID | |
| lineNumbers | No | Whether to prefix each line with its 1-indexed line number (e.g. '1 | ') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose real behavior: default 200-line/16 KiB paging, continuation via offset, image files returned as native image blocks, and that contentHash covers the whole raw file. It doesn't say what happens on missing files or non-text assets, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, front-loaded with the core capability, then pagination, hash, and output-mode details. Slightly terse in places but no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers what content contains, what contentHash is for, what compact/full change, and how pagination behaves, which is enough to call a read tool with no annotations and no output schema. Error handling and image-specific paging limits are the only notable omissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds useful meaning about pagination continuation and the compact-vs-full metadata distinction. However, it refers to 'nextOffset' when the actual parameter is 'offset', which can mislead an agent about the parameter name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read project text ... or images as native image blocks') plus scope ('in bounded pages'), and explicitly routes large-file lookups to grep, so it is distinguishable from typst_grep_project and the write siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete guidance: use grep to locate lines before reading large files, use nextOffset to continue, and pass contentHash as expectedHash to typst_edit_file. It lacks an explicit 'when not to use' or a note on how it differs from typst_list_files, but the intended workflow is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typst_rename_fileB
Rename or move a file inside a https://typst.app project via UpdatesFileMutation.
| Name | Required | Description | Default |
|---|---|---|---|
| newName | Yes | New destination path/name inside the project | |
| filePath | Yes | Existing file path/name or file ID | |
| projectId | Yes | The Typst project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and only adds an internal implementation detail (UpdatesFileMutation). It does not disclose whether an existing destination file is overwritten, whether new directories are created, permission/auth requirements, or what the mutation returns — material gaps for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. The trailing 'via UpdatesFileMutation' is the only element of dubious value to an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A three-required-parameter mutation with no annotations and no output schema needs more: overwrite behavior, error conditions on missing source or colliding destination, and expected result are all unaddressed. The description is too thin for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (projectId, filePath, newName) are already documented in the schema. The description adds no format or path semantics beyond that baseline, which is acceptable given the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (rename or move) and resource (a file) scoped to a Typst project, which is clear enough for an agent to distinguish it from read/write/delete file siblings. It stops short of naming or contrasting those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The rename/move framing implies when the tool applies versus typst_write_file or typst_edit_file, but no explicit when-to-use, prerequisites, or alternative routing is given. Usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typst_upload_assetA
Upload or replace a binary asset (PNG, JPG, SVG, PDF, font, etc.) in a https://typst.app project from a local file path or base64 data.
| Name | Required | Description | Default |
|---|---|---|---|
| convert | No | Whether typst.app should convert the uploaded file | |
| fileName | Yes | Destination path inside the Typst project (e.g. 'figures/plot.png') | |
| projectId | Yes | The Typst project ID | |
| base64Data | No | Base64-encoded binary payload (used if localFilePath is not provided) | |
| localFilePath | No | Local filesystem path to read binary asset bytes from |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that the tool can overwrite an existing asset ('replace') and accepts either a local path or base64 payload, but it omits authentication requirements, overwrite/destructive semantics, size limits, and how conversion interacts with the upload.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence that names the action, resource, formats, destination, and source options without filler. Every clause contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter upload tool with no output schema, the description covers purpose, asset types, destination, and source methods adequately, and the rich input schema fills in parameter details. The main gap is the lack of any auth or overwrite-safety context, which matters because annotations are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters in detail. The description reinforces that source data can come from a local path or base64, but it adds no meaningful semantics beyond the schema, especially for the undocumented-in-description 'convert' parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb pair ('Upload or replace') and a precise resource ('binary asset') with concrete examples (PNG, JPG, SVG, PDF, font). It distinguishes itself from text-file siblings such as typst_write_file by explicitly framing the tool around binary assets and local file/base64 sourcing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The binary-asset framing implies when this tool applies, and the source options (local path vs base64) are clear. However, it does not explicitly say when to use this over siblings like typst_write_file or typst_edit_file, nor does it state exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typst_write_fileB
Create or overwrite a text file (.typ, .bib, .toml, etc.) in a https://typst.app project, synchronizing the Yjs CRDT update via WebSocket (/editing/v3) and REST (/v1/files/:projectId/:fileId/yjs).
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Full UTF-8 text content to write | |
| filePath | Yes | File path/name (e.g. 'main.typ') or file ID | |
| projectId | Yes | The Typst project ID | |
| preferWebSocket | No | Also push real-time TextUpdate over /editing/v3 WebSocket before REST persistence (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It usefully discloses Yjs CRDT synchronization via WebSocket and REST endpoints and notes that it creates or overwrites, but it omits authentication requirements, overwrite consequences, error behavior, and limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single front-loaded sentence with the main action stated first. The WebSocket/REST detail is dense but still relevant, and there is little wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is adequate but incomplete: it does not mention authentication prerequisites, failure modes, return behavior, or how it relates to typst_edit_file. The fully described input schema compensates partially.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and all four parameters are already documented in the input schema. The description adds only file-type examples and no additional parameter semantics, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Create or overwrite a text file" in a typst.app project. It is clear what the tool does, though it does not explicitly distinguish itself from the sibling typst_edit_file tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies use for creating or overwriting files but gives no explicit guidance on when to use this versus typst_edit_file or other file tools. There are no when-not conditions or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v1.3.1- Changed
typst_capture_screenshot1 field changed- changed
Input schema / properties / includeBase64 / descriptionPrevious value: -"Include base64-encoded PNG data in response for direct vision inspection (default: false)"New value: +"Include screenshots as image blocks for direct vision inspection (default: true; set false to return paths and metadata only)"
- Changed
typst_edit_file12 fields changed- added
Input schema / properties / dryRunAdded value: +{ + "description": "Validate and preview edits without saving (default: false). Returned contentHash still identifies unchanged cloud text.", + "type": "boolean" +} - changed
Input schema / properties / edits / descriptionPrevious value: -"Non-overlapping exact text replacements to apply to the Yjs document"New value: +"One or more targeted non-overlapping replacements. Each oldText must be unique in the original file." - changed
Input schema / properties / edits / items / properties / oldText / descriptionPrevious value: -"Exact unique substring to replace"New value: +"Unique source substring to replace. All edits match the original file, not earlier edits' results." - added
Input schema / properties / edits / items / properties / oldText / minLengthAdded value: +1 - added
Input schema / properties / edits / minItemsAdded value: +1 - added
Input schema / properties / expectedHashAdded value: +{ + "description": "Recommended: contentHash from the latest read. Checked against fresh downloaded text inside the file mutation queue; stale files fail without saving.", + "pattern": "^[a-fA-F0-9]{64}$", + "type": "string" +} - added
Input schema / properties / matchModeAdded value: +{ + "description": "exact (default) matches source with newline normalization. fuzzy enables Unicode quote/dash/space/NFKC fallback only when an exact match is absent.", + "enum": [ + "exact", + "fuzzy" + ], + "type": "string" +} - added
Input schema / properties / maxDiffBytesAdded value: +{ + "description": "Byte budget per diff/patch field (default: 8192). Each also has a 100-line cap. Truncation is explicit; read affected ranges for full details.", + "maximum": 1048576, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / newTextAdded value: +{ + "description": "Optional replacement text for single replacement shorthand", + "type": "string" +} - added
Input schema / properties / oldTextAdded value: +{ + "description": "Optional shorthand for a single replacement (used if edits is omitted)", + "type": "string" +} - added
Input schema / properties / outputAdded value: +{ + "description": "summary (default): counts, new contentHash, firstChangedLine; diff: also a bounded display diff; full: also bounded patch and full metadata. dryRun defaults to diff.", + "enum": [ + "summary", + "diff", + "full" + ], + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "projectId", - "filePath", - "edits" -]
- Added
typst_find_and_replace - Changed
typst_get_diagnostics1 field changed- added
Input schema / properties / modeAdded value: +{ + "description": "Diagnostics mode: 'auto' (prefers local Typst CLI if installed, falls back to Typst Web cloud compiler), 'cli' (requires local typst binary), or 'web' (uses Typst Web cloud compiler). Defaults to 'auto'.", + "enum": [ + "auto", + "cli", + "web" + ], + "type": "string" +}
- Added
typst_grep_project - Changed
typst_read_file5 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Maximum complete lines to read (default: 200). Use nextOffset to continue.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / lineNumbersAdded value: +{ + "description": "Whether to prefix each line with its 1-indexed line number (e.g. '1 | ')", + "type": "boolean" +} - added
Input schema / properties / maxBytesAdded value: +{ + "description": "Maximum returned source bytes, including line number prefixes (default: 16384, maximum: 1 MiB). Increase for unusually long lines.", + "maximum": 1048576, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Line number to start reading from (1-indexed)", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / outputAdded value: +{ + "description": "compact (default): minimal file metadata; full: all file metadata. Both use offset/limit/maxBytes pagination.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
16 tool updates
v1.0.2- First observed
typst_auth_login - First observed
typst_auth_status - First observed
typst_capture_screenshot - First observed
typst_create_project - First observed
typst_delete_file - First observed
typst_delete_project - First observed
typst_edit_file - First observed
typst_export_pdf - First observed
typst_get_diagnostics - First observed
typst_get_project - First observed
typst_list_files - First observed
typst_list_projects - First observed
typst_read_file - First observed
typst_rename_file - First observed
typst_upload_asset - First observed
typst_write_file
TDQS
Scored across 18 tools
Most tools have clearly distinct resource/action targets, and descriptions help separate rendering, searching, and file mutation operations. Some overlap remains between typst_write_file, typst_edit_file, and typst_find_and_replace, plus minor overlap between typst_list_files and typst_get_project.
All tools use a consistent typst_ prefix and snake_case, with mostly predictable action_resource names. Minor deviations include typst_auth_login/typst_auth_status using auth as a grouping prefix and typst_find_and_replace using a compound verb.
At 18 tools, the surface is slightly above the typical sweet spot but still reasonable for a project-management, file-editing, and rendering MCP. Each tool covers a meaningful operation, though the three content-mutation tools add some density.
Core project, file, auth, search, compile, export, and screenshot workflows are well covered, including binary asset handling. Minor gaps exist around project metadata updates, sharing/permissions management, and auth logout.
Maintenance
Related MCP Connectors
Persistent cloud workspaces for AI agents: run commands, edit files, use git and a browser.
Project memory, documentation and controlled secret access for AI coding agents.
Shared project context for AI agents and teams: docs, tasks, and messages that stay current.
Deploy and manage Jade Hosting projects from AI clients. Jade account and OAuth required.
Related MCP Servers
- FlicenseBqualityCmaintenanceEnables AI agents to interact with Overleaf projects directly, including creating projects, managing files, and editing documents in real-time using Overleaf's native Operational Transformation protocol.101-
- 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
- AlicenseAqualityCmaintenanceEnables local AI agents to discover projects and read, upload, update, and delete files in a self-hosted collaborative LaTeX/Markdown writing platform, plus maintain a local mirror with git-style pull, push, and status synchronization.14MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI clients such as Claude, Cursor, VS Code, and Windsurf to manage workspaces, projects, tasks, and AI agents through hosted OAuth or local stdio tools.1,927 npmMIT