Skip to main content
Glama

overleaf-mcp

An MCP server for Overleaf that lets a Claude or other agent navigate projects, read/edit .tex files, compile, and work with review-panel comments — over Overleaf's real web/Socket.IO API, the same channel the official web editor uses.

The one feature no existing Overleaf MCP can deliver: when a project has track-changes enabled, the agent's edits appear as pending suggestions in the Review panel, the same way a human collaborator's edits do. You and your collaborators can accept or reject each suggestion. You can also ask the agend to accept/reject them (e.g. "accept all suggestions about typos").

Why a new MCP

The three existing Overleaf MCPs (mjyoo2/overleafmcp, YounesBensafia/overleaf-mcp-server, GhoshSrinjoy/Overleaf-mcp) all write through Overleaf's Git bridge, which has two problems for collaborative academic work:

  1. Commits show up in Overleaf with delay (the bridge polls).

  2. Git-bridge writes bypass tracked changes entirely — even when track-changes mode is on, edits land as direct overwrites, not as suggestions for review.

The overleaf-workshop VSCode extension already uses Overleaf's Socket.IO API rather than Git, but doesn't yet emit tracked changes (issue #94).

overleaf-mcp solves both: a minimal Socket.IO 0.9 client over fetch + ws@8, plus the meta.tc ID seed on applyOtUpdate that flips Overleaf's server-side RangesTracker into track-changes mode.

Related MCP server: overleaf-claude-mcp

Status

Working end-to-end against overleaf.com — 16 tools, tracked-changes edits and review-panel comments both verified. Published on npm as @netique/overleaf-mcp.

Tools

Tool

Description

ping

Health check. Does not contact Overleaf.

list_projects

Lists projects on the configured account, sorted by most recently updated. Supports name_contains, include_archived, include_trashed, limit.

open_project

Joins a project's real-time session and caches its file tree. Returns rich metadata: root_doc_path, compiler, spell_check_language, public_access_level, owner + members (with privileges), and whether track-changes is on for your user.

list_files

Lists the file tree of the open project (cached, no network). Filter by kind and path_contains.

read_file

Reads a doc (returns text + OT version + a summary of tracked changes / comments) or a binary file (base64 + MIME). path is optional — defaults to the project's root doc.

edit_file

Replaces a doc's contents. Computes a minimal diff via diff-match-patch, submits it as an OT operation, and adds meta.tc so the edit lands as a pending suggestion in the Review panel by default. Pass track: "off" to write directly or track: "auto" to honor the project's track-changes setting. path is optional — defaults to the project's root doc.

find_and_replace

Surgical edit: replace one occurrence (or all, with replace_all: true) of old_string with new_string without re-emitting the rest of the doc. Cheaper in tokens than edit_file for targeted changes and avoids whitespace drift from re-emitting surrounding text. By default old_string must be unique; ambiguous matches return a list of line:col locations so you can extend the match. Same track defaults and OT path as edit_file, so it lands as a pending suggestion in the Review panel.

list_tracked_changes

Enumerates every pending tracked-change suggestion across the open project, with author name + email, doc path, op kind (insert/delete), position, op text, change_id. Filter by author_email, author_id_endswith, path_contains, kind, text_contains, limit.

accept_changes

Accepts one or more tracked changes by change_id (from list_tracked_changes). Multi-doc groups are batched automatically. Irreversible.

reject_changes

Rejects one or more tracked changes by change_id. Implemented as applyOtUpdate with the inverse op + u:true (same pathway Overleaf's web client uses). Irreversible.

compile

Triggers an Overleaf compile and returns a unified summary: status, built_cleanly (true iff PDF + zero LaTeX errors), error_count, warning_count, first_errors (sample), output_files, timings. Already fetches and parses output.log inline — no extra read_log call needed for the happy path. Pass root_doc, draft, stop_on_first_error to control.

read_log

Returns the full output.log from the most recent compile, with !-prefixed error lines surfaced at the top. Use when compile's inline summary isn't enough context.

list_comments

Lists review-panel comment threads with doc path, quoted text, author, latest-message preview. Supports include_resolved, path_contains, full.

read_comment_thread

Returns the full message history of one thread.

reply_comment

Posts a new message to an existing thread.

resolve_comment

Marks a thread resolved.

reopen_comment

Reopens a resolved thread.

Typical workflow

Things to ask Claude once overleaf-mcp is connected:

  • "Accept every pending tracked change by John Doe that's only adjusting punctuation or whitespace." — uses list_tracked_changes(author_email: "...") → LLM filters by op text → accept_changes(...).

  • "List my recent Overleaf projects."

  • "Open my thesis project and show me what comments my collaborators have left."

  • "Read intro.tex and fix the missing comma in the second paragraph." → with track-changes on, this lands as a tracked suggestion.

  • "Compile the project and tell me what the LaTeX errors mean." → uses compile then read_log automatically.

  • "For each open comment thread, suggest a fix and reply with what you did." → end-to-end review workflow.

Requirements

  • Node ≥ 20

  • An Overleaf account (overleaf.com or self-hosted Community Edition)

Quick start

No local install needed — npx fetches and runs the latest version. Add this to your Claude Desktop / Claude Code MCP config:

{
  "mcpServers": {
    "overleaf": {
      "command": "npx",
      "args": ["-y", "@netique/overleaf-mcp"]
    }
  }
}

The first MCP tool call (or npx @netique/overleaf-mcp login run ahead of time) opens a Chrome window pointed at Overleaf — log in normally and the session cookie is captured and saved to a file under your config dir. No DevTools paste, no cookie in your MCP config. When the cookie expires (~5 days), the next tool call re-opens the window and refreshes it.

For self-hosted Community Edition: set OL_BASE_URL:

{
  "mcpServers": {
    "overleaf": {
      "command": "npx",
      "args": ["-y", "@netique/overleaf-mcp"],
      "env": { "OL_BASE_URL": "https://overleaf.mylab.edu" }
    }
  }
}

Useful one-shot commands:

npx @netique/overleaf-mcp login              # opens Chrome, captures cookie
npx @netique/overleaf-mcp status             # who am I logged in as
npx @netique/overleaf-mcp logout --confirm   # clear the saved cookie
git clone https://github.com/netique/overleaf-mcp.git
cd overleaf-mcp
npm install
npm run build

Then point your MCP config at the built file:

{
  "mcpServers": {
    "overleaf": {
      "command": "node",
      "args": ["/absolute/path/to/overleaf-mcp/dist/index.js"]
    }
  }
}

Authentication

The session cookie lives in a plaintext file at <configDir>/overleaf-mcp/cookie.json (mode 0600), where <configDir> is ~/Library/Application Support on macOS, $XDG_CONFIG_HOME (or ~/.config) on Linux, %APPDATA% on Windows. The CSRF token is auto-discovered from the /project page on each session — no separate copy needed.

npx @netique/overleaf-mcp login — or an MCP tool call that finds no stored cookie — spawns Chrome with a dedicated browser profile at <configDir>/overleaf-mcp/chrome-profile/, points it at ${OL_BASE_URL}/project, and reads the session cookie via the Chrome DevTools Protocol once the dashboard loads. Why a dedicated profile:

  • We don't touch your real Chrome profile, so there's no macOS Keychain prompt for your everyday browser.

  • It's a real interactive Chrome window, so captcha, Google OAuth, ORCID, institutional SSO and 2FA all work out of the box.

  • The profile persists. Re-logins are usually a flash: window opens → /project loads → cookie captured → window closes.

When the cookie expires (Overleaf cookies last ~5 days), the next request hits a 302 to /login, overleaf-mcp evicts the stale entry, re-launches Chrome and captures a fresh one. If your browser session also expired, the Chrome window waits for you to log in (up to 5 minutes).

Any Chromium-family browser works — Chrome, Brave, Edge, Arc, Chromium. If findChrome can't locate one automatically, set OL_BROWSER to a binary path.

⚠️ The session cookie grants full account access. The cookie file is mode 0600 but plaintext on disk. Treat it like a password. Remove it with overleaf-mcp logout --confirm.

Environment variables

Var

Default

Notes

OL_BASE_URL

https://www.overleaf.com

Override for self-hosted Overleaf.

OL_BROWSER

auto-detected

Path to a Chromium-family browser if auto-detection fails (Chrome / Brave / Edge / Arc / Chromium).

OL_INSECURE

Set to 1 to pass --ignore-certificate-errors to the captured Chrome instance — for self-hosted CE with a self-signed cert.

OL_CSRF

auto-discovered

Force a specific CSRF token. Only needed if your server doesn't ship the ol-csrfToken meta tag.

OL_MCP_LOG_LEVEL

info

debug, info, warn, error. Goes to stderr; stdout is reserved for MCP JSON-RPC.

Troubleshooting

OverleafAuthError: Session cookie rejected (redirected to /login) — your stored cookie has expired. overleaf-mcp relaunches Chrome automatically on the next tool call to refresh; you should only see this surface as a user-facing error if Chrome itself failed to start.

No Chromium-family browser found — install Chrome (or Brave/Edge/Arc/Chromium), or set OL_BROWSER to a binary path.

Socket.IO handshake returned 502 — Overleaf's load balancer rejected the WebSocket upgrade. Usually means the cookie was rejected — overleaf-mcp should auto-recover on the next tool call.

Could not find ol-csrfToken meta tag — your Overleaf server doesn't expose the CSRF meta tag (rare; mostly very old Community Edition). Set OL_CSRF explicitly.

Edits land but don't show up as tracked suggestions — confirm track-changes is on for your user on this project (Menu → Settings → Track Changes → "For me" or "For everyone"). open_project reports the detected state under track_changes_on_for_me. To force tracking regardless, pass track: "on" to edit_file.

Compile succeeds but read_log returns 404 — Overleaf needs ?clsiserverid=... to route to the right CLSI worker; we add this automatically from the previous compile response. If you see this, the previous compile may not have completed; re-run compile and then read_log.

Acknowledgements

  • overleaf-workshop by @iamhyc and contributors — protocol reference for the HTTP + Socket.IO flow, comment thread endpoints. The 94-review-panel branch was the source for the comment data shapes.

  • overleaf/overleaflibraries/ranges-tracker/index.cjs and services/document-updater/RangesManager.js are the authoritative source for how tracked changes are emitted (the update.meta.tc flag and ID seed format).

  • googlecolab/colab-mcp — UX reference for what an agent-friendly MCP into a hosted editor should feel like.

License

AGPL-3.0-or-later — see LICENSE.

overleaf-mcp incorporates code ported from two AGPL-3.0 projects (overleaf-workshop and overleaf/overleaf — see Acknowledgements), so the combined work is distributed under the same terms. Practical implications:

  • You can use, study, and modify overleaf-mcp freely.

  • If you redistribute it, modified or not, recipients must also receive the source under AGPL-3.0.

  • If you run a modified version as a network service that users interact with, you must make the modified source available to those users. Running unmodified overleaf-mcp as your own personal MCP server is unaffected.

Available Tools

17 tools
accept_changesAccept tracked changes by idA

Permanently accepts the specified tracked-change suggestions. The text stays in the doc; the pending-change metadata is cleared. Pass the change_id values from list_tracked_changes. Changes that span multiple docs are grouped automatically. Irreversible.

ParametersJSON Schema
NameRequiredDescriptionDefault
change_idsYesTracked-change ids to accept (from list_tracked_changes).

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses the permanent, mutating nature, the clearing of pending-change metadata, automatic grouping across docs, and irreversibility—excellent transparency for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five short sentences, each providing essential information. Front-loaded with the core action, no redundancy, and well-structured for quick comprehension.

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 single-parameter tool with no output schema, the description covers purpose, effect, input sourcing, grouping behavior, and irreversibility. It is complete given the context and tool 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?

Schema coverage is 100% and the schema description already references list_tracked_changes. The tool description repeats the source but adds no new parameter-level details, 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 it permanently accepts tracked-change suggestions, and explains the effect on text and metadata. This distinguishes it from reject_changes by specifying what 'accept' means (text stays, metadata cleared).

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?

Provides clear context: use change_ids from list_tracked_changes and warns that the action is irreversible. However, it does not explicitly mention when to use this tool versus reject_changes, though the name and behavior imply the distinction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compileCompile the open Overleaf projectA

Triggers a LaTeX compile on Overleaf's CLSI, then fetches output.log and returns a unified summary: status, whether a PDF was produced, error_count (parsed ! -prefixed log lines), warning_count, first error lines, output file list, timings. Note: Overleaf returns status:"success" even when LaTeX has errors (PDF is still generated under nonstopmode). The truthful 'did it build cleanly?' check is error_count === 0. Use read_log for the full log when more context is needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
draftNoDraft mode — faster but uses placeholder images for figures.
root_docNoProject-relative path to use as the LaTeX root (e.g. 'main.tex'). Defaults to the project's configured root doc.
stop_on_first_errorNoStop on the first LaTeX error instead of continuing to produce a partial PDF.

TDQS

A4.7/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. It discloses that it fetches output.log, parses error/warning counts, returns timings, and importantly notes that Overleaf returns 'success' even when LaTeX has errors, providing a truthful check. This goes beyond basic expectations and covers key behavioral nuances.

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 three sentences long, with the main action front-loaded. Every sentence adds value: the trigger and summary, the critical caveat about status, and the pointer to read_log. No fluff.

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?

Despite having no output schema, the description explicitly lists what the return contains (status, PDF produced, error_count, warning_count, first error lines, output file list, timings), making the tool's behavior fully comprehensible. The parameter schema is also rich, so the overall context is complete.

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 doesn't need to explain parameters. It does not add extra semantics beyond what the schema already provides for draft, root_doc, and stop_on_first_error, but that's acceptable given the high baseline.

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 triggers a LaTeX compile on Overleaf's CLSI and returns a unified summary. It specifies the exact action, target resource, and output fields, distinguishing it from sibling tools like read_log.

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 this tool (to compile and get a summary) and when to use an alternative ('Use read_log for the full log when more context is needed'). It also clarifies the edge case of 'success' status to guide correct interpretation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_fileEdit a .tex doc in the open Overleaf projectA

Replaces the contents of a doc by computing a minimal diff and submitting it as an OT operation over the live Socket.IO connection. The change lands in the web editor in real time. By default the edit appears as a pending suggestion in the Review panel (track:'on'); pass track:'off' to write directly. If path is omitted, defaults to the project's root doc. Only .tex / .bib / .md / similar text docs are editable — binary files are not.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoProject-relative path of the doc to edit, e.g. 'main.tex' or 'chapters/intro.tex'. If omitted, defaults to the project's root doc.
trackNoTracked-changes mode. This is a client *request*, not a guarantee — when the project has `track_changes_on_for_me: true` (visible in `open_project`'s response), the server forces tracking regardless of what you pass, and the tool response will report `tracked: true, track_overridden: true`. Don't tell the user 'this will be untracked' without first checking that flag from `open_project`. Modes: 'on' (default) — explicitly request tracking; edit lands as a pending suggestion in Overleaf's Review panel, the agent-collaborator-friendly choice. 'off' — request a direct untracked write (may be overridden as above). 'auto' — track iff the project's tc setting says so.on
new_contentYesDesired full content of the file. The server computes a diff against the current content and submits the minimal OT operation.
strict_versionNoIf true, re-fetch the doc version from the server before sending the edit and refuse if the cached baseline is stale. Catches races from parallel agents (each MCP process has its own cache) or a concurrently open Overleaf web editor at the cost of one extra round-trip. Without this, the server's OT transform handles stale-version edits silently, which can land the op in an unexpected location or collapse it to a no-op. Recommended when several agents may be editing the same project.
expected_versionNoOptional safety check. If provided and the doc's current version differs, the edit is rejected.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden. It discloses that edits are applied as OT operations in real-time, that tracking is the default, and that only text docs are editable. It does not mention potential server-side overrides of the tracking request or stale-version races, though these are covered in the schema's parameter descriptions. Overall it provides meaningful behavioral context beyond a simple 'edit' summary.

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 three sentences, front-loaded with the core action, and every sentence adds information: the mechanism, the default tracking behavior, the path default, and the file-type restriction. No redundant or filler content.

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 tool with no output schema and five parameters, the description covers the core purpose, typical usage, and key constraints. It does not explain the overridable tracking behavior or version-check parameters, but those are thoroughly described in the schema, so the description is sufficient to give the agent a solid mental model. The lack of authentication/permission details is acceptable as it is likely handled at a higher level.

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 value by clarifying the path default and the track behavior ('By default appears as a pending suggestion... pass track:'off' to write directly') and by stating the file-type restriction, which is not in the schema. However, it does not elaborate on strict_version or expected_version, which are already well-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 clearly states the tool's function: 'Replaces the contents of a doc' via a minimal diff and OT operation over Socket.IO. It distinguishes from siblings by specifying the real-time nature, Review panel behavior, and the restriction to text documents. The purpose is unambiguous and specific.

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 gives clear usage context: when to use track:'on' vs 'off', the default path behavior, and that binary files are not editable. However, it does not explicitly contrast with the sibling tool find_and_replace, which might be used for targeted substitutions rather than full-content replacement. The parameter descriptions in the schema add further mode guidance (auto/on/off).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_and_replaceSurgical find-and-replace in an Overleaf docA

Replace one occurrence — or all, with replace_all: true — of old_string with new_string in a doc, without re-emitting the rest of the file. By default old_string must be unique; ambiguous matches are returned with line:column locations so you can extend the match. Submits the minimal OT operation through the same pathway as edit_file, so by default it lands as a pending suggestion in Overleaf's Review panel (track:'on'). If path is omitted, defaults to the project's root doc. USE WHEN: a SINGLE targeted edit (one typo, one label rename, one heading change) in a large doc — saves tokens vs. re-emitting the body and avoids accidental whitespace drift. AVOID FOR BATCH WORK: for multiple substitutions (e.g. converting many words, applying a style guide across a chapter) prefer ONE edit_file call with all changes computed client-side. Each find_and_replace is its own round-trip with its own race window, its own tracked-change entry, and its own cache-sync cycle — calling it N times for N small changes amplifies the failure modes that one batched edit_file would avoid.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoProject-relative path of the doc to edit, e.g. 'main.tex'. If omitted, defaults to the project's root doc.
trackNoTracked-changes mode. This is a client *request*, not a guarantee — when the project has `track_changes_on_for_me: true` (visible in `open_project`'s response), the server forces tracking regardless of what you pass, and the tool response will report `tracked: true, track_overridden: true`. Don't tell the user 'this will be untracked' without first checking that flag from `open_project`. Modes: 'on' (default) — explicitly request tracking; edit lands as a pending suggestion in Overleaf's Review panel. 'off' — request a direct untracked write (may be overridden as above). 'auto' — track iff the project's tc setting says so.on
new_stringYesReplacement text. May be empty (effectively a delete).
old_stringYesExact substring to find — must match byte-for-byte including whitespace. Must be unique in the doc unless `replace_all` is true.
replace_allNoIf true, replace every occurrence of `old_string`. If false (default), `old_string` must match exactly once — multi-match returns a list of locations so you can disambiguate with a longer `old_string`.
strict_versionNoIf true, re-fetch the doc version before sending the edit and refuse if the cached baseline is stale. Catches races from parallel agents (each MCP process has its own cache) or a concurrently open Overleaf web editor at the cost of one extra round-trip. Without this, the server's OT transform handles stale-version edits silently, which can land the op in an unexpected location or collapse it to a no-op. Recommended when several agents may be editing the same project.
expected_versionNoOptional safety check. If the doc's current version differs, the edit is rejected.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description discloses key behaviors: track:'on' default lands as pending suggestion, uniqueness requirement, ambiguity handling, OT operation minimalism, path default, race windows, cache-sync, and version checking. It also notes that track is a request not a guarantee (via schema, but description references).

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 front-loaded with a clear summary, then structured into 'USE WHEN' and 'AVOID FOR BATCH WORK' sections. Every sentence adds value—no fluff. Length is justified by the tool's complexity.

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 tool with no output schema and no annotations, the description covers purpose, usage, edge cases, and trade-offs thoroughly. It does not enumerate response fields, but it provides sufficient context for an agent to decide when and how to invoke it. Minor gap: no explicit mention of success response structure, but the provided detail is strong overall.

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 covers all 7 parameters with detailed descriptions (100% coverage). The description adds some behavioral nuance (e.g., ambiguity resolution) but largely restates schema semantics. 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 opens with a precise definition: 'Replace one occurrence — or all, with replace_all: true — of old_string with new_string in a doc, without re-emitting the rest of the file.' It clearly differentiates from edit_file by positioning itself as the surgical single-edit tool, and explicitly contrasts with edit_file in the usage guidance.

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?

Provides explicit 'USE WHEN' and 'AVOID FOR BATCH WORK' sections. It names edit_file as the alternative for batch work and explains trade-offs (round-trips, race windows, tracked-change entries).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_commentsList review-panel comment threadsA
Read-only

Returns all review-panel comment threads in the open project, sorted by most recently updated. Each entry includes the thread id, the doc path it's anchored on, the quoted text it refers to, the latest message preview, and whether it's resolved. Use read_comment_thread for full content.

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNoInclude full message history per thread instead of just a preview.
path_containsNoFilter to threads anchored in docs whose path contains this substring.
include_resolvedNoInclude already-resolved threads (default: false — show open threads only).

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotation readOnlyHint=true aligns with 'Returns.' The description adds sorting and field details. However, it says 'Returns all review-panel comment threads' while the schema's include_resolved parameter defaults to false, meaning only open threads are returned by default, overstating the tool's behavior and missing a key default filter.

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 two sentences, with the first sentence stating purpose and sorting, and the second enumerating returned fields and pointing to an alternative. No filler or redundant content.

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?

Without an output schema, the description provides a useful field list. It also gives context about the open project and points to the full-content tool. The gap is the 'all' vs. default-open-threads mismatch, but the schema's include_resolved description partially covers this. Overall quite complete for a read-only list operation.

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% with descriptions for all three parameters, so the baseline is 3. The description does not add significant parameter-level meaning beyond the schema; it mentions 'latest message preview' but does not explicitly connect it to the `full` parameter.

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 uses a specific verb ('Returns') and identifies the resource ('review-panel comment threads') and scope ('in the open project'), with sorting behavior. It also distinguishes from the sibling 'read_comment_thread' by pointing to it for full content.

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 states 'Use read_comment_thread for full content,' providing a clear alternative. This makes it clear when to use the listing tool versus the full-content tool, offering strong guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_filesList files in the open Overleaf projectA
Read-onlyIdempotent

Returns the file tree of the currently open project as a flat list of project-relative paths. Cheap — uses cached data from open_project, no network. Each entity has a path (e.g. 'chapters/intro.tex'), an id, and a kind ('doc' | 'file' | 'folder').

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoFilter by entity kind. 'doc' = editable .tex/.md files, 'file' = binary assets (images, PDFs), 'folder' = directories.all
path_containsNoCase-insensitive substring filter on the project-relative path.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint. The description adds valuable context that the tool uses cached data from open_project and makes no network calls, indicating potential staleness and a prerequisite that open_project must have been called. It also details the return entity structure, going beyond annotation coverage.

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 exceptionally concise, consisting of two information-dense sentences. It front-loads the core purpose and then adds relevant details about cost, data source, and return format, with no wasteful wording.

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?

With no output schema, the description compensates by specifying the return structure (flat list, path, id, kind) and providing an example path. It also conveys the cheap/no-network nature, which is important for an agent's decision-making. The tool is simple with optional parameters, and the description is complete for correct invocation.

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 description coverage is 100%, with both parameters (kind and path_contains) fully described including enum values and substring filter behavior. The description does not add significant parameter-specific details beyond what the schema already provides, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns the file tree of the currently open project as a flat list of project-relative paths. It specifies the resource (files) and the verb (returns/list), and is distinct from sibling tools like read_file (reads content) or list_projects (lists projects).

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 context by noting the tool is cheap and uses cached data from open_project, implying it is suitable for quick file tree lookups. However, it does not explicitly mention alternatives or when not to use it, lacking explicit exclusionary guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_projectsList Overleaf projectsA
Read-onlyIdempotent

Lists projects on the configured Overleaf account, sorted by most recently updated. Returns each project's id, name, last update time, and owner. Use the returned id with open_project to start working on a project.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of projects to return, after sorting by most recently updated (default: 30).
name_containsNoCase-insensitive substring filter on project name.
include_trashedNoInclude trashed projects in the result (default: false).
include_archivedNoInclude archived projects in the result (default: false).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the bar is lower. The description adds context by stating the sort order and the fields returned (id, name, last update time, owner), though it does not disclose pagination or error behavior.

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 two sentences, front-loads the action ('Lists projects'), and provides return value and usage guidance without any wasted words.

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 the simple read-only list operation, full schema coverage, and annotations, the description adequately covers return values and next-step usage. It is complete enough for an agent to select and invoke 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?

All four parameters have schema descriptions with 100% coverage, so the baseline is 3. The description does not add parameter-specific meaning beyond what the schema already provides; it merely mentions sort order which is also 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 clearly states it lists projects on the configured Overleaf account with a specific verb and resource. It distinguishes from sibling tools like list_files by being the top-level project listing, and mentions sorting by most recent update.

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 instructs to use the returned id with open_project for starting work, providing a clear workflow. However, it does not enumerate when not to use this tool or explicitly mention alternatives beyond open_project.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tracked_changesList pending tracked changes across the open projectA
Read-only

Enumerates every pending tracked-change suggestion in the open project (across all docs), with author name + email, doc path, op kind ('insert' | 'delete'), position, inserted/deleted text, and a stable change_id. Use this to plan an accept_changes or reject_changes call: filter the result by author / doc / kind / text, collect the matching change_id values, then pass them. Tracked changes only — review-panel comments are listed by list_comments.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoFilter by op kind.any
limitNoMax changes to return (newest first).
full_textNoInclude the full op text. Default truncates each to 200 chars to keep responses compact.
author_emailNoFilter to changes by this exact author email.
path_containsNoFilter to changes in docs whose project-relative path matches this substring.
text_containsNoCase-insensitive substring filter on the inserted/deleted text.
author_id_endswithNoFilter to changes by user_id matching this suffix (handy when you don't know the email).

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, and the description adds behavioral scope: 'every pending tracked-change suggestion,' 'across all docs,' and the stability of change_id. It also clarifies it does not include comments, which is a behavioral boundary. This goes beyond the annotation without contradicting it.

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 sentences: first states purpose and key outputs, second explains workflow, third draws boundary with list_comments. Front-loaded with the action, no redundant filler.

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?

Despite no output schema, the description enumerates the returned fields (author, doc path, op kind, position, text, change_id) and the new filter params are implied by the workflow sentence. It covers the tool's role in the change-acceptance process thoroughly given its moderate complexity.

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?

Input schema covers all 7 parameters with descriptions (100% coverage), so baseline is 3. The description adds workflow semantics by advising to 'filter the result by author / doc / kind / text' and collect change_id values, linking these filters to downstream accept_changes/reject_changes calls. This adds value beyond schema's individual parameter 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 uses 'Enumerates every pending tracked-change suggestion' with a specific verb and resource scope ('across all docs'), and explicitly distinguishes from list_comments by stating 'Tracked changes only — review-panel comments are listed by list_comments.' This makes the tool's unique purpose unambiguous.

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 provides explicit usage guidance: 'Use this to plan an accept_changes or reject_changes call' and tells the agent to filter and collect change_id values. It also names an alternative (list_comments) for comments, setting a clear when-to-use boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

open_projectOpen Overleaf projectA

Joins the project's real-time Socket.IO session and caches its file tree. Must be called before list_files / read_file / edit_file. Switching projects automatically closes the previous session.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idYesThe Overleaf project id, from list_projects (a hex string like '61d853bcbf1003100e957034').

TDQS

A4.7/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. It discloses two notable side effects: joining a real-time Socket.IO session and caching the file tree. It also reveals the auto-close behavior when switching projects, providing valuable behavioral context beyond the basic action.

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, both purposeful and front-loaded. The first states the core action and side effects, the second gives the usage prerequisite and session behavior. 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 single-parameter setup tool with no output schema and no annotations, the description fully covers purpose, required ordering, and session lifecycle. It gives an agent everything needed to know when and how to invoke it 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 description coverage is 100% for the single parameter project_id, which includes a type, minimum length, and an example. The description adds no further parameter-level detail, so a baseline score of 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 uses a specific verb 'Joins' and names the resource 'the project's real-time Socket.IO session' while also stating it caches the file tree. This clearly distinguishes it from sibling file operations (list_files, read_file, edit_file) by framing it as an initialization step.

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 states 'Must be called before list_files / read_file / edit_file' and notes that switching projects closes the previous session. This gives unambiguous when-to-use guidance and a clear sequencing rule relative to sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pingPingA
Read-onlyIdempotent

Health check. Returns 'pong' and the server version. Does not contact Overleaf.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds important behavioral context beyond the readOnlyHint and idempotentHint annotations: it explicitly clarifies that the tool does not contact Overleaf, which is a non-obvious and crucial trait for a health check. It also discloses the return value ('pong' and server version), enriching the behavioral picture.

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 consists of three short, front-loaded sentences: purpose, output, and a key caveat. Every sentence earns its place with no redundancy or filler, achieving maximum clarity in minimal space.

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 tool with zero parameters and no output schema, the description fully covers the necessary context: what it does, what it returns, and its critical non-contact behavior. The description is self-sufficient and leaves no significant gaps.

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 tool has zero parameters, and the baseline for no parameters is 4. The description does not need to explain parameters, and it correctly doesn't mention any, keeping the focus on behavior and output.

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 identifies the tool as a health check and specifies the exact output: 'pong' and the server version. It is distinct from all sibling tools, none of which serve as a health check, and uses a specific verb ('Health check') plus resource.

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 states that the tool 'does not contact Overleaf', which is an explicit when-not statement, indicating this is a safe local call without side effects. However, it does not explicitly name alternative tools or provide broader usage context, so it stops short of full usage guidelines.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_comment_threadRead a single comment thread's messagesA
Read-only

Fetches the full message history of one thread (all replies with author + timestamp). Use this when list_comments shows a thread that looks relevant.

ParametersJSON Schema
NameRequiredDescriptionDefault
thread_idYesThe thread id, e.g. from list_comments.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already declares this as a read operation. The description adds valuable context beyond the annotation by detailing the returned content (full message history with authors and timestamps), which is especially useful given no output schema. No contradiction exists.

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 two concise sentences with no unnecessary fluff. It front-loads the core function and then provides a usage tip, making every sentence earn its place.

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 read-only tool with one parameter, the description covers the function, the return contents, and the trigger condition for use. It does not mention error handling or edge cases, but these are not essential for this straightforward operation given the annotations.

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 schema fully describes the single parameter thread_id with a clear explanation. The description reinforces the source of the ID (from list_comments) but does not add substantial semantic value beyond the schema, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fetches the full message history of one thread, specifying the resource and scope ('all replies with author + timestamp'). It also distinguishes itself from the sibling list_comments tool by indicating this is for reading a specific thread after discovery.

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 explicitly says 'Use this when `list_comments` shows a thread that looks relevant', providing a clear when-to-use scenario. It does not explicitly name alternatives or exclusion conditions, but the context of sibling tools implies the distinction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_fileRead a file from the open Overleaf projectA
Read-only

Reads the contents of a file by project-relative path. For text docs (.tex, .bib, .md, etc.) the full text appears in both the content array and structuredContent.text; metadata (version, line/byte counts, ranges, tracked-change/comment counts) is in structuredContent. For binary files (images, PDFs) base64 is in content and structuredContent.base64, with MIME type alongside.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoProject-relative path of the file, e.g. 'main.tex' or 'chapters/intro.tex'. If omitted, defaults to the project's root doc (visible as `root_doc_path` in `open_project`'s response).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond the readOnlyHint annotation by detailing output structure: full text in content and structuredContent.text for text files, base64 and MIME type for binaries, and metadata (version, counts, ranges). This gives the agent a clear picture of what to expect, despite not covering error cases.

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, then structured details about output formats. No filler words; every phrase adds information.

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 inventories the response structure (content, structuredContent, metadata, MIME type) and covers both file types. It also mentions the default path behavior, making the tool self-contained enough for an agent to use 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?

The sole parameter 'path' is fully described in the schema, and the description adds the default value (root doc) and references open_project's response for discovering it. This is valuable context beyond 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 uses the specific verb 'Reads' and identifies the resource as 'a file by project-relative path', distinguishing it from sibling tools like list_files (which lists) and edit_file (which modifies). It also clarifies the handling of text vs binary files, making the tool's scope unambiguous.

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 implies when to use this tool (when file contents are needed) and notes the default behavior when path is omitted, referencing open_project's response. However, it does not explicitly contrast with alternatives (e.g., 'use list_files to see available files'), so it stops short of full differentiation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_logRead the last compile's output.logA
Read-only

Returns the full LaTeX log from the most recent compile call. compile already includes the error count + first few errors in its response — use this only when you need more context (full log, line numbers, package warnings, etc.). The content array shows a summary of !-prefixed error lines at the top, then the log truncated to the last 8000 chars for display. structuredContent.log contains the FULL untruncated log so programmatic callers can grep / parse it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses detailed behavioral traits: the `content` array shows a summary of `!`-prefixed error lines at the top, and the log is truncated to the last 8000 chars for display, while `structuredContent.log` contains the full untruncated log. This goes beyond the readOnlyHint annotation and explains exactly what callers can expect.

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 three sentences, each earning its place: the first states the core purpose, the second provides usage guidance, and the third details the response format. It is front-loaded and free of filler.

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 the tool has no parameters and no output schema, the description fully compensates by explaining both the display content and the full structured content. It addresses how the tool differs from `compile` and what the caller can parse. This is complete for a zero-parameter, read-only logging tool.

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 tool has zero parameters, and the schema coverage is 100% as there are no properties. The description does not need to explain parameter semantics, but it enriches understanding by explaining the response structure. Baseline for zero parameters is 4, and this description meets that.

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 returns the full LaTeX log from the most recent compile call, with a specific verb ('Returns') and resource ('full LaTeX log'). It distinguishes itself from the sibling `compile` tool by noting that `compile` already provides error count and first few errors, making this tool's purpose clear and complementary.

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 explicitly states when to use this tool: 'use this only when you need more context (full log, line numbers, package warnings, etc.)' and contrasts it with `compile`, which includes error count and first few errors. This provides clear usage guidance and indirectly names an alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reject_changesReject tracked changes by idA

Rejects the specified tracked-change suggestions. For tracked inserts the inserted text is removed; for tracked deletes the strikethrough is cleared and the text stays. Implemented as an OT update with u:true flags on the inverse ops — same pathway Overleaf's web client uses. Pass the change_id values from list_tracked_changes. Irreversible.

ParametersJSON Schema
NameRequiredDescriptionDefault
change_idsYesTracked-change ids to accept (from list_tracked_changes).

TDQS

A4.4/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 that the operation is irreversible, explains the distinct handling of inserts and deletes, and even mentions the underlying OT implementation (u:true flags) and Overleaf parity. This is strong transparency, though it omits error scenarios or invalid id behavior.

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 sentences, all information-dense and front-loaded with the primary purpose. Every sentence earns its place: action/effect, implementation detail, and source of ids with an irreversibility warning. No word waste.

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?

The tool is a simple mutation with one parameter, and the description covers the core behavior, data source, and irreversibility. The absence of error-handling details or return format is acceptable given no output schema and the straightforward nature, but it could be slightly more complete with invalid-id behavior.

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 covers 100% of parameters, providing a description for change_ids. The tool description adds value by explicitly telling the agent to source change_ids from list_tracked_changes, and clarifies the param refers to tracked-change suggestions. It also implicitly corrects the schema's 'to accept' wording by using 'rejects'.

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 opens with 'Rejects the specified tracked-change suggestions', using a specific verb and resource that clearly identifies the action. It further distinguishes itself from the sibling accept_changes by detailing the exact outcome for inserts vs deletes. This is unambiguous and contextually differentiated.

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 instruction to 'Pass the `change_id` values from `list_tracked_changes`' provides clear guidance on where to obtain the required input. While it doesn't explicitly state when to avoid using it, the inverse nature versus accept_changes is inherent in the description, and the irreversibility warning implies caution.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reopen_commentReopen a resolved comment threadB

Reopens a previously-resolved thread.

ParametersJSON Schema
NameRequiredDescriptionDefault
thread_idYesThe thread id, e.g. from list_comments.

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It simply restates the action without explaining side effects, required permissions, or what 'reopen' entails (e.g., whether the thread becomes editable again, if replies are allowed).

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 with no redundant words or repeated information. It is appropriately minimal for a simple tool with one parameter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple one-parameter tool with a clear name and no output schema. The description covers the core purpose, but the lack of annotations and behavioral details means it does not fully explain the consequences of the action. It is adequate but leaves room for more context.

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 description coverage is 100% for the single parameter thread_id, which is fully described with an example source ('e.g., from list_comments'). The description adds no additional meaning beyond what the schema already provides, so the baseline of 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 'Reopens a previously-resolved thread' clearly states the specific verb (reopens) and resource (thread). It distinguishes itself from the sibling tool 'resolve_comment' by indicating the opposite action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives. The context of sibling tools like 'resolve_comment' and 'list_comments' implicitly suggests a use case, but the description provides no when/when-not criteria or alternative recommendations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reply_commentPost a reply to a comment threadA

Adds a new message to an existing comment thread. Threads come from list_comments. The message appears immediately in Overleaf's review panel for collaborators.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesThe reply text to post in the thread.
thread_idYesThe thread id, e.g. from list_comments.

TDQS

A4.2/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 of disclosure. It clearly indicates this is a write operation by stating it 'adds a new message' and gives a concrete behavioral effect: 'appears immediately in Overleaf's review panel for collaborators.' This goes beyond the schema, though it omits potential side effects like notifications or error conditions.

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 concise, composed of three short sentences, each adding essential information: the core action, how to obtain thread IDs, and the immediate visibility effect. No filler or redundancy.

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 covers the key aspects: what it does, where thread_ids come from, and the result of the action. It omits any prerequisites (e.g., project ownership, open project) but given the straightforward scope, it is sufficiently complete.

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 description coverage is 100% for both parameters, with thread_id already referencing list_comments. The description's separate mention of list_comments adds no new parameter meaning beyond what the schema provides, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Adds a new message') and the target resource ('existing comment thread'), which immediately distinguishes it from siblings like resolve_comment or reopen_comment. The title reinforces this, and the mention that threads come from list_comments further anchors its purpose.

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 implies the correct usage workflow: first obtain a thread via list_comments, then use this tool with the thread_id. It provides clear context for when to use this tool, though it does not explicitly state when not to use it or name alternative tools for different actions (e.g., resolving).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_commentResolve a comment threadA

Marks a thread as resolved. Use after addressing the comment (e.g. by editing the doc and replying).

ParametersJSON Schema
NameRequiredDescriptionDefault
thread_idYesThe thread id, e.g. from list_comments.

TDQS

A3.7/5.0
Behavior2/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 of behavioral disclosure. It states the action ('marks as resolved') but does not mention potential side effects, whether the action is reversible (though a sibling reopen_comment exists), or any permissions/constraints. This is a gap for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action, followed by a concise usage guideline. No redundancy or wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with a single parameter and no output schema, and the description covers purpose and usage. However, the lack of behavioral details and annotations means the description is only minimally complete, not fully transparent about consequences.

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% (thread_id is documented with an example source). The description adds no parameter-specific information beyond the schema, so the baseline of 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 uses a specific verb ('Marks') and resource ('a thread as resolved'), clearly distinguishing it from sibling tools like reply_comment and reopen_comment. It also adds context on when this action is appropriate.

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?

Provides clear context on when to use the tool ('after addressing the comment'), with a concrete example. It doesn't explicitly state when not to use it or mention alternatives, but the guidance is sufficient for a simple operation.

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. 17 tool updatesv0.3.5
    • First observedaccept_changes
    • First observedcompile
    • First observededit_file
    • First observedfind_and_replace
    • First observedlist_comments
    • First observedlist_files
    • First observedlist_projects
    • First observedlist_tracked_changes
    • First observedopen_project
    • First observedping
    • First observedread_comment_thread
    • First observedread_file
    • First observedread_log
    • First observedreject_changes
    • First observedreopen_comment
    • First observedreply_comment
    • First observedresolve_comment

TDQS

A4.1/5.0
Disambiguation5/5

Each tool targets a distinct resource and action: project listing/opening, file reading/editing, find-and-replace, compile/log, comments (list/read/reply/resolve/reopen), and tracked changes (list/accept/reject). Even edit_file and find_and_replace are clearly differentiated by scope intent.

Naming Consistency5/5

All tools follow a consistent snake_case verb_noun pattern (list_projects, open_project, read_file, edit_file, compile, read_log, reply_comment, accept_changes). The compound find_and_replace is still in the same style. No mixing of conventions.

Tool Count4/5

At 17 tools, this is slightly above the typical 3-15 well-scoped range, but the breadth of Overleaf's collaboration and review features (comments, tracked changes, compile, log) justifies the count. Each tool earns its place.

Completeness3/5

The set covers the core editing and review workflows well: read/edit, compile, inspect log, manage comments and tracked changes. However, it lacks create/delete operations for projects and files, and there is no way to download the compiled PDF, leaving notable lifecycle gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

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/netique/overleaf-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server