Skip to main content
Glama

MagicTeX — LaTeX Editor for AI Agents

npm MCP registry CI stars last commit license Sponsor

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.

The MagicTeX workspace: file tree, source editor, live PDF, and a reviewer comment

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_comments as located work items (page + quoted passage

    • the source file:line it 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 — see docs/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. See docs/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. See docs/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/.bst and 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. IEEEtran is 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 .cls from 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.

  1. 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"]

  2. Restart Claude Code (or /mcp reconnect) so it picks up the server.

  3. 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 magictex

Then, 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 (default academic-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 to depth rounds (default 2), stopping early the moment a round finds nothing new. No per-round approval — that's the point, and the risk. depth > 5 asks 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. See docs/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

/render_preview

render_preview

Compile the paper and open/refresh the live preview.

/check_comments

check_comments

List the comments you've accepted, as edit instructions (no edits yet).

/resolve_comment [id] [note]

resolve_comment

Mark a comment done after the edit; it turns green for your review.

/add_comment ["quote"] [note]

add_comment

Anchor a comment onto a passage for you to Accept/Reject.

/reply_to_comment [id] [text]

reply_to_comment

Add a threaded reply to a comment.

/show_diff [checkpoint]

show_diff

Side-by-side visual diff as an image (current changes, or a checkpoint).

/list_checkpoints [limit]

list_checkpoints

Recent checkpoints with their sha, newest first — find one to pass into /show_diff.

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.json above 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

render_preview

mainFile? · engine? (pdflatex | xelatex | lualatex, default xelatex) · backend? (wasm | system | auto, default auto — local latexmk if installed, else the bundled WASM engine)

Compiles the project and opens/refreshes the live workspace. The main file is auto-detected by scanning for \documentclass if omitted.

check_comments

includeResolved? (default false)

Returns the accepted comments as located work items — page, quoted passage, the source file:line, and the ask. Reviewer suggestions awaiting your decision are reported but not returned as work.

add_comment

quote · comment · role? (reviewer | defender) · page? · accepted?

Anchors a comment onto a passage. Posts as a suggestion awaiting your Accept/Reject unless accepted is set — that flag is what makes autonomous mode autonomous.

resolve_comment

id · note

Marks a comment done after the edit, with one line describing what changed. It turns green in the workspace for your review.

reply_to_comment

id · text · role? (author | reviewer | defender)

Adds a threaded reply, so a disagreement can be worked out on the comment instead of in chat.

show_diff

checkpoint?

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.

list_checkpoints

limit? (default 10, max 50)

Recent checkpoints with their sha, newest first — use it to find one to pass to show_diff.

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-latex

Claude 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/app

You (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)"| A

Both 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 chokidar and playwright actually 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

MacTeX

Linux

texlive-full, via your package manager

Windows

TeX Live, or MiKTeX plus Strawberry Perl

latexmk is what MagicTeX looks for on PATH, but it isn't something you install on its own — it's a driver script that comes inside the distributions above. Check with latexmk -version, not which latexmk: latexmk is a Perl script, and MiKTeX puts latexmk.exe on your PATH without shipping a Perl to run it with — so the file is found and still cannot execute. On macOS you may need eval "$(/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 tools
add_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPDF page the passage is on, if known (default 1; the workspace re-anchors by text anyway).
roleNoYour role: "reviewer" (default) critiques and asks for changes; "defender" stress-tests claims / pushes back.
quoteYesThe exact passage the comment is about (a sentence or phrase from the paper).
commentYesThe review comment or revision instruction for this passage.
acceptedNoAutonomous mode: create it already accepted (actionable) instead of a suggestion awaiting the human. Default false.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeResolvedNoAlso list resolved comments (default false).

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax checkpoints to return, newest first (default 10).

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
engineNoTeX engine. Defaults to xelatex.
backendNoCompiler 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.
mainFileNoPath to the main .tex file, relative to the project root. Auto-detected (by scanning for \documentclass) if omitted.
shellEscapeNoLet 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

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe comment id, from check_comments.
roleNoWho is replying (default "author").
textYesYour reply.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe comment id, as returned by check_comments.
noteYesOne line describing the edit you made to address it.

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
checkpointNoA checkpoint commit sha (from the preview History panel) to diff. Omit to show the current uncommitted changes vs the last commit.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 7 tool updatesv0.1.10
    • First observedadd_comment
    • First observedcheck_comments
    • First observedlist_checkpoints
    • First observedrender_preview
    • First observedreply_to_comment
    • First observedresolve_comment
    • First observedshow_diff

TDQS

A4.4/5.0
Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivitySlowing
ResponsivenessResponsive

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

Related MCP Servers

Latest Blog Posts

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