Skip to main content
Glama

overleaf-mcp

An MCP server for self-hosted Overleaf Community Edition. Lets a coding agent create projects, write LaTeX, compile, and read back structured diagnostics — while a human edits the same document in the browser.

compile → {
  "verdict": "FAILED with 1 fixable LaTeX error(s)",
  "errors": [{
    "file": "./main.tex", "line": 4,
    "message": "Is \\usepackage{natbib} missing?",
    "fixable": true
  }]
}

The raw log said ! Undefined control sequence.


Why this exists

Existing Overleaf MCP servers target overleaf.com and authenticate one of two ways:

  • Git bridge — the most popular ones. Unusable on Community Edition: the git bridge is a Server Pro feature. The CE image neither builds nor starts it (absent from server-ce/services.js, server-ce/runit/, and the Dockerfile), and Features.mjs gates it on Settings.enableGitBridge, which CE never sets.

  • Session cookies / headless browser — works, but sessions expire, CSRF has to be handled, and login-flow changes break it.

Self-hosting opens a third door that overleaf.com users cannot reach, because it is an internal interface there: Overleaf's own privateApiRouter, authenticated with plain HTTP Basic. No session, no CSRF, no browser.

Related MCP server: Overleaf MCP

What it does differently

Structured diagnostics, not raw logs. Vendors Overleaf's own log parser and its 1200-line ruleset — years of accumulated knowledge translating cryptic TeX messages into actionable ones, including a command→package map (\citepnatbib, \toprulebooktabs).

Separates "fix your LaTeX" from "fix your server." A missing package is not something an agent can solve by editing source. Conflating the two is what makes agents loop until they run out of context — the failure mode The AI Scientist reports as a central bottleneck. Compare:

verdict: FAILED with 1 fixable LaTeX error(s) — see errors[] for file/line.

verdict: BLOCKED: the server environment cannot build this document —
         missing package/class file hyperxmp.sty. Install it on the server
         (tlmgr install ...); the agent cannot fix this in source.
         Do not retry without changing the server.

Both are "compile produced no PDF." Only one is worth another attempt.

Architecture

Two backends, because neither alone suffices:

Concern

Backend

Why

Project CRUD

api process :3000

Stable HTTP Basic interface — the one Dropbox/GitHub sync uses

Compilation

CLSI :3013

Returns output.log. The web API's compile endpoint obtains a buildId internally and never exposes it, so diagnostics are unreachable through it

Writes enter through EditorController.upsertDocWithPath — the same entry point the web UI uses. For an existing document that reaches DocumentUpdaterHandler.setDocument, which diffs old against new and applies the result as an operational transform. An agent write is merged into the live document exactly like a keystroke: a human with the project open sees it immediately, their cursor survives, and it lands in project history.

Verified against a live instance: with the document loaded in document-updater, an agent write moved it from version 0 to version 1 — an incremental operation, not a reload.

Requirements

  • Self-hosted Overleaf Community Edition (Server Pro works too)

  • Shell access to the host running it

  • Node.js ≥ 20 wherever the MCP server runs

  • Overleaf reachable over HTTPS

Setup

1. Enable agent access on the server

git clone https://github.com/lintheyoung/overleaf-mcp
cd overleaf-mcp

# Kubernetes / k3s (Zeabur, Coolify, ...)
bash deploy/setup.sh --k8s --namespace <ns> --deployment <name>

# docker compose — not yet verified end to end, see Caveats
bash deploy/setup.sh --docker --container sharelatex

Find the namespace and deployment with kubectl get deploy -A | grep -i overleaf; for compose it is the service name in docker-compose.yml (usually sharelatex).

This generates secrets under /etc/overleaf-agent, injects them so Overleaf uses them, and installs an nginx reverse proxy exposing two prefixes:

Path

Upstream

Guard

/agent-api/

Overleaf api :3000

HTTP Basic (app) + path allow-list (nginx)

/agent-clsi/

CLSI :3013, artifacts :8080

X-Agent-Token (nginx)

It mounts at /etc/nginx/vhost-extras/overleaf/, an include directory the stock Overleaf vhost already provides — no vendor file is overwritten.

CAUTION

CLSI has no authentication of its own. It runs arbitrary LaTeX, which on Community Edition means arbitrary code execution inside the container with filesystem and network access. The token gate is not optional hardening; it is the only thing standing in front of it. Never expose :3013 directly.

The allow-list matters too: privateApiRouter also carries endpoints for user expiry and project deactivation. Only what an agent needs is routed; everything else under /agent-api/ returns 404 even with valid credentials.

2. Survive redeploys (managed platforms)

Platforms like Zeabur own the Deployment. A restart keeps the configuration above; a redeploy rebuilds from the platform's spec and silently drops it — the API starts answering 401 and the routes 404.

sudo install -m 700 deploy/restore.sh /usr/local/sbin/overleaf-agent-restore.sh
sudo install -m 644 deploy/systemd/* /etc/systemd/system/
sudo systemctl enable --now overleaf-agent-restore.timer

Runs 3 minutes after boot, then hourly. It is a no-op when nothing is missing — patching a Deployment triggers a rollout, so an unconditional timer would restart Overleaf every hour.

3. Build and register the server

npm install && npm run build

npm run vendor (invoked by build) fetches Overleaf's log parser from GitHub. See Licensing.

Find the Overleaf user id that should own agent-created projects — visible in the URL when viewing that user in the admin panel, or from the database.

{
  "mcpServers": {
    "overleaf": {
      "command": "node",
      "args": ["/path/to/overleaf-mcp/dist/index.js"],
      "env": {
        "OVERLEAF_BASE_URL": "https://overleaf.example.com",
        "OVERLEAF_API_USER": "overleaf",
        "OVERLEAF_API_PASS": "<from /etc/overleaf-agent/api_pass>",
        "OVERLEAF_CLSI_TOKEN": "<from /etc/overleaf-agent/clsi_token>",
        "OVERLEAF_OWNER_ID": "<overleaf user id>"
      }
    }
  }
}

4. Verify

node dist/dev/selftest.js   # offline — diagnostics layer only
node dist/dev/smoke.js      # end-to-end against the live instance

smoke creates a project, writes broken LaTeX, checks the diagnostic names natbib, applies the fix, and confirms a PDF comes out.

Configuration

Variable

Required

Default

Meaning

OVERLEAF_BASE_URL

yes

e.g. https://overleaf.example.com

OVERLEAF_API_USER

yes

WEB_API_USER (usually overleaf)

OVERLEAF_API_PASS

yes

WEB_API_PASSWORD

OVERLEAF_OWNER_ID

yes

Overleaf user id owning created projects

OVERLEAF_CLSI_TOKEN

for diagnostics

Must match the nginx config

OVERLEAF_API_PATH

no

/agent-api

OVERLEAF_CLSI_PATH

no

/agent-clsi

Empty disables diagnostics

OVERLEAF_TIMEOUT_MS

no

120000

Raise for long bibliographies

Without OVERLEAF_CLSI_TOKEN the server still runs, but only get_pdf works — no diagnostics.

Tools

Tool

Notes

create_project

Returns id + web URL

list_files / read_file

Reads back from Overleaf, so human edits are visible

write_file

Whole-file replace, merged as an OT

delete_file

compile

Structured diagnostics. Does not return the PDF

get_pdf

Writes the PDF to disk, returns the path

get_log

Raw log, tail-truncated. Last resort

compile withholds PDF bytes deliberately — base64 of a paper would swamp an agent's context for no benefit.

Working alongside a human

OT guarantees no data is lost, not that the result is what you wanted:

The agent reads intro.tex at T0. A human rewrites a paragraph at T1. The agent writes back its T0-derived text at T2. The human's edit is gone from the live document — recoverable from history, but they will not know to look.

Split the paper and give each file an owner:

main.tex              skeleton, rarely touched
sections/intro.tex    agent
sections/related.tex  human

Physical separation beats relying on merge semantics. See CLAUDE.md for rules to hand your agent.

TeX Live packages

deploy/tlget.sh installs packages into TEXMFHOME by unpacking tlnet archives directly, working around two tlmgr behaviours that bite containerised Overleaf:

  • "package X is not relocatable, cannot install it in user mode" — tlmgr refuses to place some packages under TEXMFHOME, the only TeX tree on the persistent volume. The system tree is inside the image and is wiped on every restart. hyperxmp, required by acmart, is one of these.

  • "tlmgr itself needs to be updated" — CTAN's tlnet only carries the current release, so once upstream moves on the tlmgr baked into the image cannot install anything at all.

bash deploy/tlget.sh <namespace> <deployment-substring> hyperxmp

A tlnet archive is just a tarball of a texmf-dist tree, so unpacking it into TEXMFHOME sidesteps both problems and lands the files on the volume.

Licensing

This project is MIT (see LICENSE).

src/vendor/ is not part of it and is not committed. npm run vendor fetches five files from overleaf/overleaf at build time; those remain AGPL-3.0 and belong to Overleaf. Keeping them out of the repository is what keeps the licences separate — otherwise AGPL's network-use clause would extend to everyone running this server.

To pin or audit the fetch:

OVERLEAF_REF=v5.5.4 npm run vendor      # pin to a tag
npm run vendor -- /path/to/overleaf     # use a local checkout

Overleaf is a trademark of Overleaf Inc. This project is not affiliated with or endorsed by them.

Caveats

  • Community Edition has no compile sandbox. Any logged-in user can read container environment variables through LaTeX. Upstream says as much. Only give accounts to people you trust, and do not open registration.

  • write_file replaces whole files. There is no patch/append tool yet.

  • Compilation is synchronous. A bibliography-heavy document takes 20 s+; CLSI's own ceiling is 600 s.

  • Verified against Overleaf CE 5.x on k3s. The --docker path in setup.sh is written but not yet tested end to end — it also cannot inject the environment variables automatically, so that step is manual. Reports welcome.

Available Tools

8 tools
compileA

Compile the project and return structured diagnostics. Returns a verdict, plus errors with file/line and suggested fixes. Does NOT return the PDF itself (it would flood your context) — use get_pdf if you need the bytes. Check verdict first: if it says BLOCKED, the server environment is at fault and retrying will not help.

ParametersJSON Schema
NameRequiredDescriptionDefault
compilerNo
projectIdYes
timeoutSecNoDefault 180, server max 600
rootResourcePathNoDefaults to main.tex

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 and discloses return shape (verdict, errors with file/line and suggestions), an important limitation (PDF is not returned to avoid context flood), and the BLOCKED verdict's irreversibility. This goes well beyond basic semantics.

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, each earning its place: purpose/result, critical exclusion (PDF), and verdict handling. No redundancy, front-loaded with the primary action.

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 annotations or output schema, the description covers return format, failure modes (BLOCKED), and an alternative tool (get_pdf). This gives the agent sufficient context to use and interpret the tool's response.

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 50%; timeoutSec and rootResourcePath are already described in the schema. The description adds no parameter-specific meaning, but the remaining parameters (compiler enum, projectId) are self-explanatory in context. It neither clarifies nor harms.

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 ('Compile') and resource ('the project'), and clearly states the return type ('structured diagnostics'). It distinguishes from sibling tools like get_pdf (which returns the PDF bytes) and get_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 states when not to use: 'Does NOT return the PDF itself — use get_pdf if you need the bytes.' Also instructs to 'Check verdict first: if it says BLOCKED, the server environment is at fault and retrying will not help,' which clarifies a key usage nuance.

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

create_projectA

Create a new Overleaf project and return its id. The project is immediately visible and editable in the Overleaf web UI by a human.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesProject name as shown in the Overleaf UI

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations provided, the description carries the behavioral disclosure burden. It usefully notes that the project is immediately visible and editable in the Overleaf web UI by a human, but it omits important details such as permission requirements, name-conflict behavior, or potential side effects.

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

Conciseness5/5

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

The description consists of two front-loaded sentences. The first states the core action and return value, and the second adds useful contextual information. There is 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 simple one-parameter creation tool, the description adequately covers the action, the immediate side effect (visibility/editable in the web UI), and the return value (id). It does not specify the exact return format or conflict behavior, but given the tool's simplicity and full schema coverage, 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?

The input schema covers the single 'name' parameter at 100% with a clear description. The tool description adds no parameter-specific meaning beyond what the schema already provides, so the 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 ('Create') with a clear resource ('a new Overleaf project') and states the return value ('return its id'). This clearly distinguishes it from the sibling file-manipulation and compilation tools.

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

Usage Guidelines3/5

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

The purpose is inherently distinct from sibling tools, implying this should be used when a new project is needed. However, it does not explicitly state when to use it versus alternatives, nor does it mention any prerequisites or exclusions.

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

delete_fileB

Delete a file from the project.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
projectIdYes

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description must fully disclose behavioral traits. It only states the action without noting whether deletion is permanent, required permissions, or side effects. This is insufficient for a destructive operation, leaving significant behavioral uncertainty.

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, highly concise and front-loaded. It contains no unnecessary words or repetition, earning a perfect score for efficiency.

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 only 2 parameters, but given the absence of annotations, output schema, and parameter explanations, the description provides only the bare minimum. It does not mention return values, error behavior, or how this tool fits with siblings like compile or get_log. It is minimally viable but lacks contextual depth.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 2 required parameters (path, projectId) with no descriptions (0% coverage). The tool description does not mention or explain these parameters, providing no additional meaning beyond the parameter names. The description fails to compensate for the low schema coverage.

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 'Delete a file from the project' uses a specific verb and resource, making the tool's function unambiguous. It clearly distinguishes from sibling tools like read_file, write_file, and list_files by indicating the delete operation.

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

Usage Guidelines3/5

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

The description does not provide explicit guidance on when to use this tool versus alternatives, nor does it mention prerequisites or conditions. Usage is implied by the tool name and simple statement, but no exclusions or alternative recommendations are given.

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

get_logA

Fetch the raw LaTeX log from the last compile. Use only when compile's structured diagnostics are not enough — the raw log is long.

ParametersJSON Schema
NameRequiredDescriptionDefault
maxBytesNo
projectIdYes

TDQS

A3.7/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 burden of behavioral disclosure. It notes the log is raw and long, hinting at potentially large output. However, it omits error conditions, behavior when no compile has run, and what maxBytes controls, leaving 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?

Two sentences, front-loaded with the action, and no filler. 'the raw log is long' efficiently justifies the usage constraint and earns its place.

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

Completeness2/5

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

The tool has 2 parameters and no output schema, but with 0% schema coverage and no annotations, the description needs to explain parameters and edge-case behavior. It misses what happens before the first compile, maxBytes semantics, and possible error responses, so the description is incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description names no parameters. The optional maxBytes parameter is completely undocumented, and projectId is only implied by context. The description adds zero value beyond the schema, which itself is terse.

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?

Clearly states 'Fetch the raw LaTeX log from the last compile' with a specific verb and resource. Distinguishes from sibling tools like compile (which provides diagnostics) and read_file (which reads files generally).

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?

'Use only when compile's structured diagnostics are not enough' explicitly prescribes when to use this tool and points to the alternative (compile). This provides clear decision guidance, similar to the TDQS example that names an alternative.

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

get_pdfA

Compile and save the PDF to a local file, returning the path. Use when you need the artifact itself; for fixing errors use compile instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYes
outputPathNoDefaults to a temp directory

TDQS

A4.3/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 it compiles, saves to a local file, and returns the path, which are key behaviors. However, it omits potential side effects like overwriting files or permission requirements, so it is not fully transparent.

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, each purposeful: the first states the function, the second gives usage guidance. 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 2 parameters and no output schema, the description covers the core purpose, usage guidance, and return value. It lacks parameter details (already penalized) and error handling, but provides a sufficient high-level understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only covers outputPath with a default note, leaving projectId undescribed. The description adds no parameter-specific meaning, failing to explain what projectId identifies or how outputPath behaves beyond the schema, despite the low 50% coverage.

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 'compile and save' with a clear resource (PDF) and specifies the outcome (local file path). It also distinguishes from sibling 'compile' by indicating when to use each, making the 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?

Explicitly states 'Use when you need the artifact itself; for fixing errors use compile instead.' This provides clear context and names an alternative tool, fulfilling the when-to-use guidance thoroughly.

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

list_filesA

List every file in the project with its size. Reflects edits made by humans in the web UI, not just files written through this server.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYes

TDQS

A3.6/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral disclosure burden. It adds a meaningful nuance: the listing reflects edits made by humans in the web UI, not just server-written files. While it doesn't explicitly state read-only behavior, the verb 'List' plus the non-mutating context implies a safe operation. The added context about human edits is valuable beyond what a simple tool description provides.

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 fluff. It front-loads the core purpose in the first sentence and adds a valuable behavioral note in the second. Every word earns its place.

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 description gives the essential behavior and even an extra data-source nuance, but with no output schema and no mention of return format (beyond 'size'), error conditions, or whether directories are included, some gaps remain. For a simple one-parameter tool, it is adequate but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate by explaining parameters. It does not mention projectId at all. The only clue is the phrase 'in the project', which vaguely implies projectId identifies the project, but no actual guidance is given. This fails to add meaning beyond the bare schema field.

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 lists every file in the project with its size, which is a specific verb+resource action. This distinguishes it from sibling tools like read_file or write_file, making its 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 Guidelines3/5

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

The description implies usage for obtaining a full file listing with sizes, but does not explicitly state when to use this tool versus alternatives like read_file for individual files or delete_file for removal. It gives no explicit exclusions or alternative suggestions, so guidance is only implied.

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

read_fileA

Read one file from the project. Call this before rewriting a file a human may have touched, so your edit is based on current content.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYese.g. main.tex or sections/intro.tex
projectIdYes

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations, the description carries the burden of disclosing behavior. It correctly implies a read-only operation but does not describe return format, error behavior (e.g., file not found), or any side effects. The note about human-touched files adds context but not tool 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?

Two concise sentences, front-loaded with the core action. Every word earns its place; no filler or repetition.

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 2-parameter read tool, the description provides purpose and a clear usage hint. However, without an output schema or mention of return value, the agent may need to infer what the tool returns, which is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50% (path has an example, projectId does not). The description does not explain projectId or add meaning beyond the schema's path example. It fails to compensate for the missing parameter documentation.

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 states a specific verb ('Read') and resource ('one file from the project'), clearly distinguishing it from sibling tools like list_files and write_file. Purpose is immediately obvious.

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?

Explicit guidance is provided: 'Call this before rewriting a file a human may have touched, so your edit is based on current content.' This tells the agent when to use this tool versus alternatives.

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

write_fileA

Create or overwrite a file. Writes are merged into the live document as an operational transform, so a human with the project open sees the change immediately and their cursor is preserved. NOTE: this replaces the whole file — read_file first if the content may have changed.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYese.g. main.tex, sections/intro.tex, refs.bib
contentYes
projectIdYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description must disclose behavioral traits on its own. It reveals operational transform merging, live document updates, cursor preservation, and whole-file replacement—all valuable context beyond mere 'write.' It does not mention permissions or failure modes, but the disclosed details are significant.

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 plus a prominent NOTE, with a clear front-loaded purpose. It wastes no words and structures the key safety warning at the end, making it easy to parse.

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 the tool's complexity (operational transform, live updates, overwrite risk), the description covers the critical behaviors and safety guidance. It does not describe return values, but no output schema exists, and this is not essential for a write operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33% (only 'path' has a description). The description adds no explicit meaning for 'content' or 'projectId,' though the note about replacing the whole file implies 'content' is the full file contents. This is insufficient compensation for the low schema coverage.

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 'Create or overwrite a file,' which clearly states the verb and resource. This distinguishes it from sibling tools like read_file and delete_file by focusing on the write operation.

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 advises to 'read_file first if the content may have changed,' providing a direct alternative and a safety caveat. It implies this is the tool for creating or modifying file contents, but does not fully enumerate when not to use it.

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.

  1. 8 tool updatesv0.1.0
    • First observedcompile
    • First observedcreate_project
    • First observeddelete_file
    • First observedget_log
    • First observedget_pdf
    • First observedlist_files
    • First observedread_file
    • First observedwrite_file

TDQS

A3.8/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a distinct operation: project creation, file listing, reading, writing, deleting, compiling, PDF retrieval, and log access. Even the compile/get_pdf/get_log trio is clearly separated by their descriptions (structured diagnostics vs. artifact bytes vs. raw log). No two tools are likely to be confused.

Naming Consistency4/5

Most tools follow a clear verb_noun snake_case pattern (create_project, list_files, read_file, write_file, delete_file, get_pdf, get_log). 'compile' is a single verb without an object, which is a slight deviation, but the naming remains consistent and predictable overall.

Tool Count5/5

Eight tools is well-scoped for an Overleaf/LaTeX project server, covering project creation, file management, compilation, and output handling. Each tool serves a clear purpose without unnecessary bloat.

Completeness3/5

The file-level CRUD (list/read/write/delete) and compile/PDF/log operations are well covered. However, the project lifecycle is incomplete: there is no way to list existing projects, delete a project, or update project metadata, which is a notable gap for a multi-project server.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    An MCP server for Overleaf that allows Claude or other agents to navigate projects, read and edit .tex files, compile, and interact with review-panel comments via Overleaf's real-time Socket.IO API, with seamless support for tracked changes as pending suggestions.
    17
    64 npm
    4
    AGPL 3.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that enables LLMs to compile LaTeX documents and inspect the resulting PDF, supporting an autonomous write-compile-check-revise loop via a self-hosted Overleaf CLSI instance.
    MIT