MagicTeX MCP Server
Provides integration with Overleaf, enabling one-click opening of LaTeX projects in Overleaf, exporting the project as a .zip bundle, downloading PDFs, and syncing via Git push to Overleaf's Premium Git bridge.
Click on "Install 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., "@MagicTeX MCP ServerCompile main.tex and show me the PDF"
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.
MagicTeX — LaTeX Editor for AI Agents
English · 简体中文 · 日本語 · 한국어 · Español · Français · Deutsch · Português
MagicTeX is a LaTeX editor built for AI agents — an Overleaf-like
one-window workspace for Claude Code, served by an MCP server, with no local TeX
install and no Overleaf account: live PDF preview, a source editor with a Visual
(WYSIWYG) mode, change history, and comments you anchor on the rendered PDF that
become edit instructions for the agent. (npm package: magictex-mcp.)
It compiles with a WASM TeX Live 2026 engine (texlyre-busytex) running inside a headless browser, so there's nothing multi-gigabyte to install — just a one-time WASM asset download.

See it before you install
A guided walkthrough of the comment → agent loop lives at zoelin.dev/tools/magictex, built from real tool output. It's a replay, not a hosted instance — the TeX engine is a one-time ~650 MB download and the agent half is Claude itself, so MagicTeX runs next to your project rather than in a web page.
Related MCP server: Unofficial Overleaf MCP Server
The workspace
One browser window (inspired by Typst's one-surface editor and LiquidText's anchored annotations):
┌──────────────────────────────────────────────────────────────┐
│ ✓ up to date · 13 pages Export .zip · Download PDF │
├────────────┬──────────────────────────────┬──────────────────┤
│ Source / │ PDF (live) │ Comments │
│ History │ select text → 💬 comment │ accepted → ask │
│ editor, │ highlights stay anchored │ Claude to │
│ timeline │ auto-reloads on every edit │ address them │
│ + diffs │ │ → resolved ✓ │
└────────────┴──────────────────────────────┴──────────────────┘Comment → Claude loop (the point of it all). Review the rendered document like a supervisor marking up a printout: select text, attach a comment ("tighten this paragraph"). Then tell Claude to "address my comments" — it pulls them via
check_commentsas located work items (page + quoted passagethe source
file:lineit anchors to + your ask), edits the source, and resolves each card with a note. You interact with the document; Claude interacts with the source. Run it hands-off with/loop— seedocs/AGENT-LOOP.md.
Editable source panel. A CodeMirror LaTeX editor with the project's files — save (Ctrl+S) recompiles and refreshes the PDF, Typst-style. Or keep using your own editor: any save triggers the same live loop.
Live reload. A file watcher recompiles on every save — Claude's edits, the built-in editor's, or your external editor's.
Change history. Each successful compile is auto-snapshotted to a hidden git ref (
refs/latex-preview/checkpoints) — never touching your branches,git log, or working tree. The History tab shows the timeline and each checkpoint's colorized diff beside the PDF.Get to Overleaf. Download PDF, Export .zip (clean build-inputs bundle), and a one-click Open in Overleaf link for public GitHub repos; Premium Git-bridge sync is a documented
git push. Seedocs/USER-GUIDE.md.Review workflow (reviewer → gate → resolver). A reviewer/defender agent posts comments via
add_comment; you Accept/Reject them (or flip Auto-accept for copilot mode); an author loop resolves the accepted ones. Comments carry roles and a reply thread. Seedocs/AGENT-LOOP.md.Save vs. recompile, your call. The built-in editor auto-saves every 30s without recompiling; Ctrl+S / Save / Recompile rebuild the PDF on demand. (Flip ⚡ Live for recompile-as-you-type.) Your own editor and Claude's edits still auto-recompile via the watcher.
Real projects. Auto-detects the main file, gathers multi-file
\input/\include,.bib, in-repo.cls/.sty/.bstand figures, runs BibTeX and reruns when needed; common missing packages are auto-injected.Compile backend. Uses your local latexmk when you have one — full package fidelity, output matching Overleaf — and the bundled zero-install WASM TeX Live when you don't. Force either with
backend: "system"/"wasm". Every compile reports which one ran.Document classes.
IEEEtranis bundled, because no venue class ships in the WASM TeX Live and a missing class can't be worked around the way a package can. Conference classes (NeurIPS, ICML, CVPR, ACL, AAAI …) carry no redistributable licence, so put the.clsfrom the author kit beside your source — it's picked up automatically.MCP tools:
render_preview(compile + open the workspace),check_comments/resolve_comment/add_comment/reply_to_comment(the review loop),show_diff(side-by-side diff as an image — useful on image-capable clients).Actionable errors. Failed compiles return parsed
{file, line, message}errors so Claude can self-correct, and show in the workspace.
Setup
MagicTeX is on npm as magictex-mcp and
listed in the official MCP registry as
io.github.ZoeLinUTS/magictex — so any client that reads the registry can find it.
There's nothing to clone and no TeX install; npx fetches it on first use.
Add it to your paper project's
.mcp.json(see.mcp.json.example):{ "mcpServers": { "magictex": { "command": "npx", "args": ["-y", "magictex-mcp"] } } }For local development from a clone, point it at the source instead:
"command": "npx", "args": ["tsx", "/absolute/path/to/magictex-mcp/src/server.ts"]Restart Claude Code (or
/mcpreconnect) so it picks up the server.Ask Claude to render. e.g. "render a preview of this paper" → the first call downloads the WASM TeX Live assets (~650 MB, one time), compiles, and opens the live preview tab. Subsequent edits reload it automatically.
The WASM assets are not in this repo. They're fetched on first run into a
per-user cache — ~/Library/Caches/magictex on macOS, $XDG_CACHE_HOME/magictex
on Linux, %LOCALAPPDATA%\magictex on Windows — so upgrading MagicTeX doesn't
re-download them, and a checkout, a global install and an npx run share one copy.
Set MAGICTEX_ASSETS_DIR to put them elsewhere. To pre-fetch:
npx texlyre-busytex download-assets <that directory>.
Install as a Claude Code plugin (slash commands)
For a low-typing workflow, install MagicTeX as a plugin — one install gives you the MCP server and the slash commands:
/plugin marketplace add ZoeLinUTS/MagicTeX-mcp
/plugin install magictexThen, in your paper project, use the workflow commands for the common flows:
/magic-latex— compile and open the workspace (the live preview)./ai-review [skill]— review the paper with a skill (defaultacademic-paper-revision; pass any skill name) and post comments for you to Accept/Reject. Missing skills are reported with an install hint./address-comments— resolve your accepted comments (loop it with/loop 60s /address-comments).⚡
/ultra-agents [skill] [depth]— fully autonomous: review, auto-accept, fix, repeat, up todepthrounds (default 2), stopping early the moment a round finds nothing new. No per-round approval — that's the point, and the risk.depth > 5asks you to confirm before starting. Ends with a summary (what was raised, what changed, which checkpoints to look at) — every round is still an ordinary, revertible checkpoint. Seedocs/AGENT-LOOP.md.
One command per tool
Every MCP tool also has a slash command with the same name, so you can drive any
single step by typing the tool name. The rule to teach: the tool is X → type
/X.
Type this | Runs tool | What it does |
|
| Compile the paper and open/refresh the live preview. |
|
| List the comments you've accepted, as edit instructions (no edits yet). |
|
| Mark a comment done after the edit; it turns green for your review. |
|
| Anchor a comment onto a passage for you to Accept/Reject. |
|
| Add a threaded reply to a comment. |
|
| Side-by-side visual diff as an image (current changes, or a checkpoint). |
|
| Recent checkpoints with their sha, newest first — find one to pass into |
You never have to type these — plain English works too ("render a preview", "address my comments"). The commands are just a fast, teachable shorthand.
The plugin bundles the MCP server (
npx magictex-mcp), so installing the plugin is all you need — the.mcp.jsonabove is the alternative if you'd rather not install a plugin. The slash commands work either way.
Tools
The MCP surface, for any client that speaks MCP. (In Claude Code you can just ask in plain English, or use the slash commands above — these are the underlying tools.)
Tool | Parameters | What it does |
|
| Compiles the project and opens/refreshes the live workspace. The main file is auto-detected by scanning for |
|
| Returns the accepted comments as located work items — page, quoted passage, the source |
|
| Anchors a comment onto a passage. Posts as a suggestion awaiting your Accept/Reject unless |
|
| Marks a comment done after the edit, with one line describing what changed. It turns green in the workspace for your review. |
|
| Adds a threaded reply, so a disagreement can be worked out on the comment instead of in chat. |
|
| Renders a side-by-side diff as an image, shown inline in the conversation. Defaults to the current uncommitted changes; pass a checkpoint sha for a saved version. |
|
| Recent checkpoints with their sha, newest first — use it to find one to pass to |
The headline workflows are built on top of these, not among them. /magic-latex,
/ai-review, /address-comments and ⚡ /ultra-agents are Claude Code plugin
commands that orchestrate the tools above — /ultra-agents chains review →
auto-accept → fix for as many rounds as you allow, and is the reason add_comment
takes an accepted flag. They are not part of the MCP surface, so another MCP client
sees the seven tools only. See the plugin section
and docs/AGENT-LOOP.md.
See it in the terminal
These are real tool outputs, captured verbatim from an actual run against the sample paper — not mocked up. This is what you see in Claude Code while the browser workspace (screenshot above) reflects the same state live.
You type:
/magic-latexClaude calls render_preview and replies:
✓ Compiled main.tex with xelatex in 1900ms — 2 files. Workspace (live preview,
source editor, history, PDF comments — auto-reloads on edits):
http://127.0.0.1:52042/appYou (or a reviewer skill) leave a comment, then ask what's ready to act on. Claude
calls check_comments:
1 accepted comment — edit each at its source location per the instruction, then
call resolve_comment with its id and a one-line note:
[id: 2fce9e3c8b5f] p.1 — "Sorting widgets efficiently is a long-standing problem"
↳ source: main.tex:15
→ Tighten this opening sentence.
(1 reviewer suggestion still awaits the human's accept in the workspace — not
actionable yet.)Claude makes the edit and calls resolve_comment:
✓ Resolved comment 2fce9e3c8b5f ("Sorting widgets efficiently is a long-standing
problem…") — the card now shows: Rewrote the opening sentence.Ask again, and the accepted queue is empty — only the still-unaccepted suggestion remains, waiting on you:
No accepted comments. (2 already resolved.)
(1 reviewer suggestion still awaits the human's accept in the workspace — not
actionable yet.)How it works
Claude edits .tex ─┐
file watcher ─────┼─▶ compile coordinator ─▶ headless Chromium ─▶ WASM TeX ─▶ PDF
render_preview ───┘ (serialized) (engine host) │
▼
your workspace (/app) ◀── WebSocket "reload" ◀── local HTTP server
Source · PDF · History · Comments (serves /app + /latest.pdf)The WASM engines need DOM/Worker globals, so the server hosts a hidden headless
Chromium as its compile worker; the workspace you open is a lightweight React +
pdf.js app with no WASM in it. See docs/ARCHITECTURE.md.
flowchart LR
H["👤 You<br/>Source · PDF · History · Comments"]
A["🤖 Claude Code<br/>+ review / author agents"]
H <-->|"select text →<br/>anchor comment"| SRV["Preview server<br/>HTTP + WebSocket · serves /app"]
A -->|"7 MCP tools"| MCP["MCP server<br/>render_preview · show_diff · list_checkpoints<br/>check / resolve / add / reply_comment"]
SRV --> CO["Compile coordinator<br/>(serialized)"]
MCP --> CO
A -. edits source .-> FILES[("Paper files · git repo")]
FILES --> WATCH["File watcher"] --> CO
CO --> ENG["WASM busytex<br/>(headless Chromium)"] --> PDF["/latest.pdf"]
PDF -. live reload .-> H
CO --> CK["git checkpoints<br/>(hidden ref) → History"]
SRV <--> CJSON[(".latex-preview/<br/>comments.json")]
MCP <--> CJSON
CJSON -->|"check_comments<br/>(your accepted asks)"| ABoth front doors — you in the workspace, agents through the 7 MCP tools — meet at
the same coordinator, comment store, and git history. You act on the rendered
document (anchor a comment); Claude acts on the source (reads your comments via
check_comments, edits, resolve_comment). That shared substrate is what makes
the comment loop, the review workflow, and traceable history possible.
Requirements
Node 20.19+ (the floor
chokidarandplaywrightactually need; the server checks at startup and says so)Playwright's Chromium (installed automatically; ~150–300 MB) — or set it to reuse your installed Chrome.
~650 MB disk for the one-time WASM TeX Live assets — all of it fetched on the first run, in three package sets (basic 87 MB, recommended 190 MB, extra 324 MB, plus the 31 MB engine). A normal paper only loads the basic set; the larger two sit on disk until something needs them. Cached per user, not per install, so upgrading MagicTeX doesn't re-download them. Override the location with
MAGICTEX_ASSETS_DIR.A local TeX install is optional. See below for when it matters.
Do I need a local TeX distribution?
No — the bundled WASM engine compiles with nothing installed, which is the whole
point. But it ships a subset of TeX Live, so some things aren't in it: svg,
most venue document classes, and various less common packages. When one is
missing you'll be told, rather than handed a silently wrong PDF.
Install a distribution when you want output that matches Overleaf exactly. MagicTeX picks it up on its own — no configuration:
macOS | |
Linux |
|
Windows | TeX Live, or MiKTeX plus Strawberry Perl |
latexmkis what MagicTeX looks for onPATH, but it isn't something you install on its own — it's a driver script that comes inside the distributions above. Check withlatexmk -version, notwhich latexmk:latexmkis a Perl script, and MiKTeX putslatexmk.exeon yourPATHwithout shipping a Perl to run it with — so the file is found and still cannot execute. On macOS you may needeval "$(/usr/libexec/path_helper)"or a fresh terminal first.
Every compile tells you which one ran — xelatex · system or xelatex · wasm.
Development
npm install
npm run typecheck # tsc for the server and the UI
npm run build:ui # build the React workspace to ui/dist
npm test # the unit suite — engine-free, no browser, seconds
npm start # run the server on stdio (for a manual MCP client)Two tiers, on purpose. npm test covers the comment store, anchor matching, line
and column geometry, the history repo, asset paths, compile-log classification, the
preview server's shutdown, and an MCP workflow E2E — all without a browser or a TeX
engine, so it stays fast and deterministic. CI (.github/workflows/ci.yml) runs
typecheck + UI build + that suite on Node 20 and 22 for every push and pull request.
The things a unit test structurally cannot see — highlight geometry at several zoom
levels, what a failed render actually tells the reader, whether shutting down closes
the server and warns any open window — live in scripts/smoke-*.mjs and run against
a real browser and a real compile in .github/workflows/smoke-macos.yml. Each of
those exists because something shipped broken that the unit suite was green through.
Please keep both green and add coverage with changes.
Documentation
User guide — everyday use, the comment loop, Visual mode, the file tree, getting your paper into Overleaf, package coverage.
The agent loop — comments as triggers, running it hands-off with
/loop, the reviewer → gate → resolver workflow, and ⚡/ultra-agents.Roadmap — what's shipped for concurrent agents, and what real parallel multi-agent editing still needs.
Architecture — why a headless browser, what every module does, the compile flow.
All four are translated into the same 8 languages as this README — each page has its own language switcher at the top.
Roadmap
Multiple Claude Code sessions can already work the same project concurrently without
corrupting comments or the checkpoint history (see docs/ROADMAP.md)
— true parallel multi-agent editing (reviewer/author/defender on their own git branches,
merged back together) is the next milestone.
Sponsor this project
MagicTeX is free and open source (AGPL-3.0). If it saves you time on your papers, please consider sponsoring the project — it funds continued development. A ⭐ on the repo helps too.
Acknowledgements
MagicTeX is written and maintained by Zoe Lin, built with Claude Code.
Thanks to David Turnbull, who told me the story of Knuth spending ten years
building his own typesetter rather than accept how his book looked — the story this
project keeps arguing with. And to the maintainers of
texlyre-busytex, without whose WASM
TeX Live none of this would run locally at all.
License
AGPL-3.0-or-later — matching the texlyre-busytex engine it builds on.
See THIRD_PARTY_NOTICES.md.
Available Tools
7 toolsadd_commentRaise a review comment on the paperA
Post a review comment anchored to a passage of the paper — for a reviewer agent marking up the document. Give the exact quoted text from the compiled paper (or the source prose) it refers to, and your comment/instruction. By default it is created as a suggestion the human accepts in the workspace before the author loop acts on it; pass accepted:true only in fully-autonomous ("copilot") mode to make it immediately actionable. Use this to leave many targeted comments rather than one long critique.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | PDF page the passage is on, if known (default 1; the workspace re-anchors by text anyway). | |
| role | No | Your role: "reviewer" (default) critiques and asks for changes; "defender" stress-tests claims / pushes back. | |
| quote | Yes | The exact passage the comment is about (a sentence or phrase from the paper). | |
| comment | Yes | The review comment or revision instruction for this passage. | |
| accepted | No | Autonomous mode: create it already accepted (actionable) instead of a suggestion awaiting the human. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It discloses key behavioral traits: the default is a suggestion requiring human acceptance, and accepted:true is for autonomous mode only. It also adds the nuance that the author loop acts only after human acceptance. This goes beyond the schema's parameter description, which focuses only on the accepted field's mechanics.
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 four sentences long, front-loaded with the core purpose, and every sentence contributes value. It avoids fluff and repeats nothing from the schema. The structure flows from what → how → behavior → usage, which is ideal.
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 no output schema and no annotations, the description covers the essential workflow: anchoring to a passage, providing exact quote, default suggestion behavior, and usage for targeted comments. Minor gaps exist (e.g., no mention of role parameter, but that is fully documented in the schema). Overall, it is sufficiently complete for an agent to use the tool 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 the baseline is 3. The description adds meaningful guidance beyond the schema, particularly for the 'quote' parameter (exact quoted text from compiled paper or source prose) and for 'accepted' (clarifying when to use true vs default). This elevates the score to 4.
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 tool's function with a specific verb and resource: 'Post a review comment anchored to a passage of the paper.' It also adds context ('for a reviewer agent marking up the document') and distinguishes from sibling tools like reply_to_comment and resolve_comment, which serve different purposes.
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?
Explicit usage guidance is provided in the final sentence: 'Use this to leave many targeted comments rather than one long critique.' The description also implies when this tool is appropriate (reviewer marking up the document) without explicitly naming alternatives, but the guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_commentsCheck accepted PDF commentsA
List the comments the user has accepted on the rendered PDF, as located work items. Each has an id, page, the quoted passage, the source file:line it anchors to (best-effort), and the user's instruction. Call this when the user asks to "address/check my comments" (or after they mention leaving comments) — or on each pass of an agent loop watching for new comments. For each item: open the source at the given location, make the requested edit (saving triggers a recompile + a checkpoint automatically), then call resolve_comment with its id and a one-line note. If it returns none, there is nothing accepted yet — reviewer suggestions awaiting the human's accept don't count.
| Name | Required | Description | Default |
|---|---|---|---|
| includeResolved | No | Also list resolved comments (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses what the tool returns, notes the 'best-effort' nature of source file:line anchoring, and explains the acceptance semantics (only accepted comments, not mere suggestions). It doesn't explicitly mention side effects, but as a listing tool, the absence of modification language implies read-only behavior, and the workflow description avoids conflating this tool with edits.
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 information-dense but well-structured: front-loaded purpose, then returned fields, then usage guidance, then workflow, then edge case. Every sentence serves a purpose, no filler. It is longer than average but earns its length by providing crucial operational detail.
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 there is no output schema, the description fully specifies the return data (id, page, quote, source location, instruction) and the none-case. It also provides necessary workflow context (open source, edit, resolve_comment) and clarifies what counts as accepted. This is complete for an agent to invoke and process the tool 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% for the single optional parameter includeResolved, with a clear description in the schema. The tool description does not mention the parameter, but since the schema fully documents it, the description adds no additional value; 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?
The description clearly states the tool 'List the comments the user has accepted on the rendered PDF', specifying the verb, resource, and scope. It distinguishes this from sibling tools like add_comment or resolve_comment by focusing on listing accepted comments and enumerating the returned fields (id, page, quote, source location, instruction).
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?
Explicitly explains when to use: 'Call this when the user asks to address/check my comments' or on each pass of an agent loop. It also specifies a workflow (open source, edit, resolve_comment) and clarifies an edge case: if none returned, reviewer suggestions not yet accepted don't count. This gives clear context and practical direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_checkpointsList recent checkpointsA
List recent checkpoints (auto-saved on each successful compile) — sha, timestamp, and file/line-change stat, newest first. Use this to find a sha to pass into show_diff, or to cite specific saved versions when summarizing a multi-step editing session.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max checkpoints to return, newest first (default 10). |
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 checkpoints are auto-saved on successful compiles and describes the return content and ordering. It does not explicitly state that the operation is read-only, but this is strongly implied by 'list' and the absence of any mutation language.
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 action and purpose. Every clause adds value—the auto-save context, the returned fields, and the specific use cases. No redundant phrasing.
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 listing tool with one optional parameter, the description adequately covers what it returns (fields and ordering) and when to use it, including integration with show_diff. No output schema is present, but the description sufficiently describes the output structure.
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 input schema provides 100% coverage for the lone 'limit' parameter, including a clear description. The tool description does not add extra parameter semantics, so the 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?
The description clearly states it lists recent checkpoints, specifying the fields (sha, timestamp, file/line-change stat) and ordering (newest first). It distinguishes itself from sibling tools by mentioning use with show_diff and summarizing multi-step sessions.
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 explicitly says to use this tool to find a sha for show_diff or to cite saved versions, providing clear context for when to use it. It also implies an alternative (show_diff) in the workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_previewRender LaTeX previewA
Compile the current project's LaTeX to a PDF locally and update the live preview. Uses the machine's TeX install when it has one, otherwise a bundled WASM TeX Live in a headless browser — so no local TeX is required. Returns compile success/errors, which engine and backend ran, the file count, and the local preview URL — open it to see the rendered pages. Call this after editing .tex files to see and verify the rendered result.
| Name | Required | Description | Default |
|---|---|---|---|
| engine | No | TeX engine. Defaults to xelatex. | |
| backend | No | Compiler backend. Default "auto": use the local TeX install (latexmk) when there is one — full package fidelity, output matching Overleaf — else the bundled WASM TeX Live. "system" forces the local one and errors if absent; "wasm" forces the bundled one. | |
| mainFile | No | Path to the main .tex file, relative to the project root. Auto-detected (by scanning for \documentclass) if omitted. | |
| shellEscape | No | Let the document run external programs (LaTeX shell-escape) — needed by \includesvg (Inkscape), minted (Pygments) and similar. Off by default: it lets a .tex execute shell commands, so enable it only for sources you trust. Has no effect on the wasm backend, which cannot run subprocesses at all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and excels: it discloses backend selection logic, shellEscape security implications, return contents, and the fallback behavior when no local TeX is installed. It even notes shellEscape has no effect on the wasm backend.
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 concise at five sentences, covering purpose, backend behavior, return values, and usage context. There is slight redundancy with the backend parameter description, but each sentence earns its place.
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?
No output schema exists, but the description enumerates exactly what is returned (compile success/errors, engine, backend, file count, preview URL). It also explains mainFile auto-detection and shellEscape security, making it complete for a tool with this 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?
The input schema already provides full coverage (100%) with detailed descriptions for all four parameters. The tool description adds only that it reports which engine/backend ran, offering no extra parameter semantics, so 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?
The first sentence states a specific action (compile LaTeX to PDF) and resource (current project) with an outcome (update live preview), clearly distinguishing it from sibling tools that handle diffs and comments.
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 explicitly says 'Call this after editing .tex files to see and verify the rendered result,' providing clear when-to-use guidance. It doesn't mention when-not-to-use or name alternative tools, but siblings are functionally distinct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_commentReply to a comment threadA
Add a reply to a comment's thread — to ask the human a clarifying question, explain your reasoning, or (as a defender) push back on another agent's suggestion before it is resolved. Use the comment id from check_comments. This does not resolve the comment; use resolve_comment for that.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The comment id, from check_comments. | |
| role | No | Who is replying (default "author"). | |
| text | Yes | Your reply. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full load. It discloses the key side-effect boundary (does not resolve) and the intended timing ('before it is resolved'), though it does not mention permissions or behavior on resolved threads.
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?
Three tightly written sentences: the first states the action and purpose, the second gives the id source, and the third clarifies a key distinction. Every sentence earns its place with no redundancy.
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 3-parameter mutation tool with no output schema, the description is complete: it covers purpose, use cases, id provenance, and relationship to sibling tools, leaving no significant gap for an agent to select and invoke it.
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 description adds little beyond the schema. It reinforces the id source and gives context for the role parameter ('as a defender'), but text and role meaning are already documented 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 begins with a specific verb+resource ('Add a reply to a comment's thread') and lists concrete use cases. It also explicitly distinguishes this tool from resolve_comment, making its purpose unmistakable.
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 states clear when-to-use scenarios (clarifying question, explaining reasoning, defender pushback) and gives an explicit alternative: 'This does not resolve the comment; use resolve_comment for that.' It also tells the agent to use the comment id from check_comments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_commentResolve a PDF commentA
Mark a workspace comment as resolved after you have made the edit it asked for. Pass the comment id (from check_comments) and a one-line note describing what you changed — the note is shown to the user on the comment card.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The comment id, as returned by check_comments. | |
| note | Yes | One line describing the edit you made to address it. |
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 that the note is shown to the user on the comment card, which is useful. However, it does not mention any irreversibility, permissions, or post-resolution behavior, leaving some gaps.
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 sentence that is front-loaded with the action, then provides necessary parameter context. No wasted words.
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 two-parameter tool with no output schema, the description adequately covers purpose, parameter sources, and user-facing behavior. It lacks a mention of confirmation or error handling, but that is not critical given the simplicity.
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 already describes both parameters clearly (100% coverage). The description adds value by specifying that the id comes from check_comments and that the note is user-visible, going beyond the schema's own descriptions.
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 verb 'Mark' and the resource 'workspace comment' with the specific action of resolving. It distinguishes itself from sibling tools like add_comment and reply_to_comment by focusing on resolution after an edit.
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 provides clear usage context: use after making the edit the comment asked for. It also indicates the id comes from check_comments. It doesn't explicitly mention when not to use or alternatives, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_diffShow diff (side-by-side image)A
Render a side-by-side git diff as an image, shown inline in the conversation. Use this when the user asks to SEE a diff visually — it returns a picture, not a text summary. Defaults to current uncommitted changes; pass a checkpoint sha for a specific saved version.
| Name | Required | Description | Default |
|---|---|---|---|
| checkpoint | No | A checkpoint commit sha (from the preview History panel) to diff. Omit to show the current uncommitted changes vs the last commit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and adequately discloses key behaviors: it returns an inline image, defaults to uncommitted changes, and can target a checkpoint sha. It does not mention side effects or limitations, but for a read-only rendering tool this is sufficient.
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 core action, and every clause adds value. No fluff or repetition.
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 tool with no output schema, the description is complete: it explains what the tool returns, the default behavior, how to get a specific version, and when to use it. No gaps for a typical use case.
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 parameter 'checkpoint' is fully described in the schema. The tool description reiterates the checkpoint behavior but adds no new semantic detail beyond what the schema already provides, so 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?
The description clearly states 'Render a side-by-side git diff as an image' with a specific verb and resource, and distinguishes it from a text summary. It also differentiates from siblings by focusing on visual diff rendering rather than previews or comments.
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?
Explicitly says 'Use this when the user asks to SEE a diff visually' and clarifies it returns a picture, not text. It provides context on default behavior and checkpoint usage, though it does not name a specific alternative tool for text diffs, so it stops short of full when-not guidance.
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. Dates show when Glama detected each change.
7 tool updates
v0.1.10- First observed
add_comment - First observed
check_comments - First observed
list_checkpoints - First observed
render_preview - First observed
reply_to_comment - First observed
resolve_comment - First observed
show_diff
TDQS
Each tool targets a distinct action in the workflow: rendering diffs, listing checkpoints, compiling previews, and managing the comment lifecycle. There is no overlap between the comment tools since they cover add, list, reply, and resolve as separate operations.
All tool names follow a consistent verb_noun pattern with lowercase and underscores (show_diff, list_checkpoints, render_preview, check_comments, resolve_comment, reply_to_comment, add_comment). The verbs clearly indicate the action, and nouns identify the object, making the naming pattern predictable.
Seven tools is well-scoped for the server's purpose of LaTeX editing with preview, versioning, and comment review. Each tool has a clear role, and the count is neither too sparse nor bloated.
The tool set covers the important workflow: compile preview, view diff, list/resolve/reply/add comments. A minor gap is the lack of a checkpoint-restore tool, but list_checkpoints and show_diff provide sufficient visibility for version history. Overall, the surface is quite complete for the stated purpose.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Overleaf alternative online LaTeX editor. AI agents edit, comment, and chat. Keep or revert edits.
Persistent AI LaTeX workspace: edit and compile multi-file projects, export publication-ready PDFs.
Edit your Overleaf LaTeX projects from Claude and ChatGPT; every change is a real Git commit.
Create and improve live, shared interactive documents with your agent.
1
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables collaborative document authoring and composition with project-based organization, transforming Markdown and LaTeX content into professional PDFs with conflict-free multi-agent editing capabilities.620MIT
- 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.10-
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to read, edit, and compile LaTeX documents in Overleaf projects with tracked changes via the Model Context Protocol.1MIT
- FlicenseNot gradedqualityCmaintenanceEnables 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.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ZoeLinUTS/MagicTeX-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server