Skip to main content
Glama

overleaf-claude-mcp

CI License: MIT Node MCP

Connect Claude to your Overleaf account. Claude can list your projects, pick one, read the LaTeX and the figures, edit files, compile, and pull the PDF back. It can also run your writing through free AI content detectors and check it for plagiarism, and tell you which sentence, in which file, on which line, was flagged.

Overleaf has no public API on the free tier: the Git bridge and Dropbox sync are Premium features. So this server speaks the same internal HTTP and socket endpoints the Overleaf web app uses, authenticated with a browser session you create once. Every endpoint was read out of Overleaf's own JavaScript bundle and then exercised against a live account. See Verified endpoints.


Tutorial

What you need

  • Node 20 or newer (node -v)

  • Chrome or Edge installed

  • An Overleaf account, free tier is fine

  • Claude Code (claude --version) or Claude Desktop

Install from npm, and stay up to date on your own

If you only want to use the server, you do not need this repository at all. Register it straight from npm:

claude mcp add overleaf -- npx -y overleaf-claude-mcp@latest

Then run npm run login:paste once from anywhere, or ask Claude to call overleaf_set_session with your overleaf_session2 cookie, and you are done.

Because the registration resolves @latest, every Claude restart picks up the newest published version. There is nothing to pull and nothing to rebuild. Two things to know: it costs a registry lookup at startup, so a machine with no network will fail to start the server, and the AI detector that drives a real browser needs its Chromium once, with npx playwright install chromium.

Everything below is for working on the server, or for running it from a clone.

Step 1: Run setup

From this folder, on Windows:

setup.cmd

On macOS or Linux:

./setup.sh

Setup runs five steps and prints each one:

  1. Installs dependencies

  2. Builds to dist/

  3. Checks for a working Overleaf session. If there isn't one, a browser window opens on the Overleaf login page

  4. Reads one of your real projects back, to prove the connection works

  5. Offers to register the server with Claude Code

Want Claude to set this up for you? Tell it: "set up overleaf-claude-mcp, read AGENTS.md first". It runs npm run agent-setup, which handles everything non interactively and asks you at most one question. AGENTS.md covers every case including headless servers.

Step 2: Get a session

Setup offers three ways, and picks based on your machine.

No graphical display, such as SSH, Docker, a remote sandbox or CI? Setup detects that and asks you to paste a cookie instead of trying to open a window:

OVERLEAF_SESSION_COOKIE="paste_the_value_here" npm run login:paste

Get the value from any browser where you are already signed in: open https://www.overleaf.com/project, press F12, go to Application, expand Cookies, select the Overleaf origin, and copy the whole Value of overleaf_session2. It is long and starts with s%3A. The cookie is verified against Overleaf before anything is saved.

Otherwise setup offers two browser based options.

Reuse the login you already have. If you are already signed in to Overleaf in Brave, Chrome, Chromium or Edge, setup can lift that session, no typing at all. That browser must be fully closed first, because it holds its cookie database open and it has to decrypt its own cookies. Setup launches it against its own profile, reads the Overleaf cookies, and closes it again.

Or sign in fresh. Say no to the reuse prompt and your default browser opens on the Overleaf login page. Sign in the way you normally would, including 2FA. Nothing types your password for you and your password is never read or stored.

Either way, once the session is confirmed against /project, the cookies are saved to ~/.overleaf-claude-mcp/session.json. A session lasts about five days; overleaf_status tells you how long is left.

That file is equivalent to full access to your Overleaf account. It is gitignored, and written with 0600 permissions on macOS and Linux. On Windows those permission bits are ignored, so the file is only as private as your user profile folder. Do not share it and do not commit it.

Setting up over SSH, with no browser on the server

You do not log in on the server. There is nothing to install there and no browser to open. You borrow the login you already have on your own machine.

On your laptop, in a browser already signed in to Overleaf:

  1. Open https://www.overleaf.com/project

  2. Press F12

  3. Application on Chrome, Brave and Edge, or Storage on Firefox

  4. Expand Cookies, select the Overleaf origin

  5. Click the row named overleaf_session2 and copy the whole Value

In your SSH session:

npm run login:paste

It prompts, you paste, it checks the cookie against Overleaf and saves it. That is the entire process.

If you are running it non interactively, pass the value as an environment variable instead:

OVERLEAF_SESSION_COOKIE="s%3A...." npm run login:paste

The cookie is verified before anything is written, so a truncated or expired paste fails immediately with a clear message rather than half working later. It is never printed back to you or written to logs. Sessions last about five days; repeat this when it lapses.

Step 3: Let setup register the server

At step 5 you get a prompt:

      Register this server with Claude Code now? [y/N]

Answer y. That runs:

claude mcp add overleaf -- node C:/CoolYEAH/overleaf-claude-mcp/dist/index.js

If you skipped it, or you use a different client, register by hand. For Claude Code, run the command above. For Claude Desktop, edit %APPDATA%\Claude\claude_desktop_config.json on Windows or ~/Library/Application Support/Claude/claude_desktop_config.json on macOS:

{
  "mcpServers": {
    "overleaf": {
      "command": "node",
      "args": ["C:/CoolYEAH/overleaf-claude-mcp/dist/index.js"]
    }
  }
}

Updating

How a new version reaches you depends on how you installed it.

Installed with

To get a new version

npx -y overleaf-claude-mcp@latest

Restart Claude. Nothing else.

A clone of this repository

npm run update, then restart Claude

npm run update pulls, installs and rebuilds in one step. Doing only git pull is not enough and fails quietly: dist/ is not tracked, so Claude keeps running the previously built server while the source on disk looks current.

Either way a restart is required, because MCP servers are only loaded when the client starts. Your Overleaf session is not affected by an update; it lives in ~/.overleaf-claude-mcp/, outside the code.

Step 4: Restart Claude

MCP servers are only picked up at startup. Quit and reopen Claude Code or Claude Desktop.

Confirm it loaded:

claude mcp list

You should see overleaf listed as connected. Inside a Claude Code session, /mcp shows the same thing.

Step 5: Use it

Just ask in plain language. Claude picks the tools itself.

List my Overleaf projects
Select the Efficient Reasoning project
Read sections/methodology.tex
In sections/results.tex, change "Table 1" to "Table~\ref{tab:main}"
Compile it and tell me what the LaTeX errors are
Show me figures/fig1.png
Save the compiled PDF to C:/tmp/paper.pdf

Pick a project once and it sticks. The selection is stored in ~/.overleaf-claude-mcp/state.json and survives restarts, so every later request applies to that project until you switch. To work on a different project in one request without switching, name it: "read main.tex from my thesis project".


Related MCP server: claudeleaf

How to trigger it

There is no slash command and nothing to type. Claude reads the tool descriptions and calls them when your request matches. Mentioning Overleaf, or a project or file you already selected, is enough.

If Claude does not reach for the tools, the usual causes are: you did not restart after registering, or no project is selected yet. Ask "what Overleaf project is selected?" to check.

Tools

Tool

Purpose

overleaf_status

Session health, expiry, and current selection

overleaf_set_session

Replace an expired session with a fresh browser cookie

overleaf_project_url

Browser URL for the selected project

overleaf_list_projects

List projects, marking the selected one

overleaf_select_project

Pick the active project by id or name

overleaf_current_project

Show which project is selected

overleaf_list_files

Full file and folder tree

overleaf_read_file

Read a text file, with startLine/endLine paging and an outline mode

overleaf_read_image

View a figure inline

overleaf_download_file

Save any file locally, including compilation artifacts such as output.log

overleaf_grep

Regex search across the project

overleaf_write_file

Create or overwrite a text file

overleaf_edit_file

Exact string replacement inside a file

overleaf_upload_file

Upload any local file, text or binary, straight from disk

overleaf_create_folder

Create a folder and any missing parents

overleaf_rename

Rename a file or folder

overleaf_move

Move a file or folder

overleaf_delete

Delete an entry, requires confirm: true

overleaf_history

Recent versions: who changed what, and when

overleaf_file_at_version

Read a file as it was at a past version

overleaf_diff

What changed in a file between two versions

overleaf_restore_file

Roll a file back, requires confirm: true

overleaf_compile

Server side compile, with page count and output artifacts

overleaf_compile_log

Parsed LaTeX errors and warnings with file:line, filtering and paging

overleaf_check

Dangling \ref, undefined \cite, duplicate labels, uncited entries

overleaf_download_pdf

Compile and save the PDF

overleaf_word_count

Compiled word count

overleaf_ai_detect

Score prose with free AI detectors and list the sentences each one flagged

overleaf_plagiarism_check

Find sentences that already exist word for word on the web, with the source URL

overleaf_detectors

Which detectors are ready and what each one needs

overleaf_select_project takes a project id or any part of a project name. If the name matches more than one project it lists the candidates instead of guessing. overleaf_delete refuses to run unless confirm is true, so Claude cannot delete a file by accident.

Edits are checked for silent damage

overleaf_write_file and overleaf_edit_file compare the file before and after every write and report anything that changed beyond wording: a number that moved or vanished, a dropped \cite, ef or \label, an unbalanced egin. Rewording a paragraph passes silently. Losing a figure from a table, or a citation from a sentence, comes back as a warning on the tool result, so a prose edit cannot quietly corrupt a manuscript.

Checking for AI detection and plagiarism

Ask in plain words: "check my introduction for AI detection", "run the whole paper through a plagiarism check", or paste a paragraph and ask "would this get flagged as AI?"

Both checks accept the same three inputs: text for a pasted passage, filePath for one file in the selected project, or wholeProject for every .tex file at once.

LaTeX is stripped before anything is sent. The preamble, math environments, figures, tables, listings, \cite, ef and \label are all removed, so the detectors score your prose rather than your markup. Every flagged sentence is then mapped back to the file and line it came from, so you can go straight to it and rewrite it.

main.tex, 1204 words, 7810 chars
consensus: 71.5% AI, likely AI, across 2 detector(s)

ZeroGPT    88.0%  Your Text is AI/GPT Generated
Decopy     55.0%  Decopy rates this as mostly AI generated

flagged by more than one detector (2):
  main.tex:112  Furthermore, mitochondria play a crucial role in regulating cellular metabolism...
  main.tex:118  Consequently, it is imperative to acknowledge that the systematic optimisation...

How each check works

The AI detectors are the free public ones, and no API key is needed for the defaults:

Provider

How it is reached

Notes

ZeroGPT

Direct HTTP, the endpoint its own site calls

No key, no quota seen, returns the flagged sentences

Decopy

Playwright drives the real page and the JSON its site fetches is read back

No key, but the anonymous quota runs out after a few checks and resets later

Sapling

Direct HTTP

Only runs if SAPLING_API_KEY is set

GPTZero

Direct HTTP

Only runs if GPTZERO_API_KEY is set

Providers that need a key are skipped silently unless you set one, so out of the box you get ZeroGPT and Decopy. Run overleaf_detectors to see the current state. Text longer than a provider's limit is split at paragraph boundaries and the scores are averaged by length.

The plagiarism check does not use a plagiarism site. The free ones tested here reported verbatim Wikipedia text as original, so instead each long sentence is searched on the web as an exact phrase, and every candidate page is then fetched and read to confirm the wording really appears on it. A sentence is only reported when at least eight consecutive words are found on the page, which is what keeps unrelated search results out of the report. Twelve sentences are sampled evenly across the text by default; raise it with maxQueries.

main.tex, checked by web search, confirmed on the source page
12 passage(s) searched, 1 found verbatim on the web
8.3% of searched passages matched a source, 91.7% appear original

main.tex:5  Mitochondria have a double membrane structure and use aerobic respiration to generate...
  Mitochondria - Wikipedia
  https://en.wikipedia.org/wiki/Mitochondria

A score is evidence, not a verdict. Detectors disagree with each other and all of them flag formal academic prose written by hand, so treat a high number as a prompt to reread the sentence, not as proof of anything.

Refreshing an expired session without leaving Claude

A session lasts about five days. When it expires, paste a fresh overleaf_session2 value and ask Claude to call overleaf_set_session. The cookie is verified against Overleaf before it replaces the stored one, the running server picks it up immediately, and nothing has to be restarted or edited by hand.

Reading a large compile log

overleaf_compile_log parses the log rather than truncating it. Every entry carries the file and line it came from, including the line range of an overfull box, and entries are tallied by kind and by file first so a paper with hundreds of benign warnings does not bury the three that matter:

0 error(s), 251 warning(s) in the whole log

by kind:
   187  overfull-hbox
    61  package-warning
     3  undefined-reference

by file:
   201  sections/results.tex
    50  main.tex

showing 1-40 of 251 matching entr(ies)
- sections/results.tex:412-414  Overfull \hbox (36.51074pt too wide) in paragraph at lines 412--414
...
40 more. Pass offset 40.

Narrow it with severity, kind and file, and page through it with limit and offset. overleaf_check answers the reference questions directly, so you do not have to mine the log for them.

Uploading large content

overleaf_upload_file takes a localPath and works for text as well as binaries. Prefer it over overleaf_write_file whenever the content is already on disk: a 120 KB results.tex is sent straight from the file instead of being retyped as a tool argument.


Troubleshooting

Anything failing at all — ask Claude for overleaf_status first. It reports whether the session is alive, when it expires, and what is selected, which usually identifies the problem immediately.

"No Overleaf session at ..." — you have not signed in yet, or the session expired. Fastest fix from inside Claude: copy a fresh overleaf_session2 cookie and ask Claude to call overleaf_set_session with it. Otherwise run setup.cmd again.

Session reuse says your browser is not signed in — the browser was still running, so its cookie database was locked and could not be read. Close it completely, including any tray icon or "keep running in background" instance, then retry.

Claude does not see the tools — you did not restart Claude after registering. Check claude mcp list.

A tool suddenly fails — Overleaf may have changed an endpoint. Run npm run recon, which probes each endpoint read-only and tells you exactly which call broke.

Check your setup from the terminal, without Claude:

npm run read -- "Efficient Reasoning"

Prints the file tree and every section heading of the matching project. Add a path to dump a single file:

npm run read -- "Efficient Reasoning" sections/methodology.tex

Re-run setup any time. It reuses a working session and re-verifies the connection, so it doubles as a health check.


How it works

The file tree comes from Overleaf's socket connection, because that is the only source that carries entity ids, and ids are what writes need. The handshake is GET /socket.io/1/?projectId=<id>, which is socket.io 0.9 framing; the server then pushes joinProjectResponse with the whole project including rootFolder, doc ids and file hashes. The tree is cached for OVERLEAF_TREE_TTL_MS (default 15s) and invalidated after every write.

Text files are read per document, so a read always reflects the current state. overleaf_grep fetches the documents directly for projects up to OVERLEAF_DOC_GREP_LIMIT docs, which avoids downloading the PDFs and figures that a project archive would drag along; past that limit it falls back to one archive download.

overleaf_read_file stops at OVERLEAF_MAX_READ_CHARS. Rather than dumping a prefix, it returns a structure outline of the file, listing every \section, \label, \caption, float and \input with its line number, which is usually what a large file was being opened for; startLine and endLine then fetch the part you want. Pass outline: true to get that outline for a file of any size. Asking for a path that does not exist suggests the closest real ones rather than dumping the whole file list.

Compiles are cached for OVERLEAF_COMPILE_TTL_MS (default 120s) and invalidated by every write, so reading the log, downloading the PDF and running overleaf_check in a row costs one compile rather than three. Every result says whether it was recompiled or reused, and refresh forces a new compile. Compilation artifacts are not part of the project file tree, so overleaf_download_file recognises output.log, output.blg, output.chktex and the rest and fetches them from the compile output instead.

The log parser reverses TeX's 79 column line wrapping before it reads anything, tracks the (file and ) markers as a stack so every message is attributed to the file that was open, and reads the line numbers TeX actually prints: on input line N for warnings, at lines N--M for boxes, l.N for errors, and the file:line: prefix when -file-line-error is on.

Writes go through the upload endpoint. Uploading over an existing name is an in place update: the entity id is preserved, so Overleaf history and anyone else in the document keep working. Missing parent folders are created first.

Because a write replaces a whole document, there is a guard against clobbering someone else's work. The server remembers a hash of every file it reads. If you then write to that file and Overleaf's copy no longer matches what was read, the write is refused:

"sections/results.tex" changed on Overleaf since you last read it, so writing now would discard those edits.

Read the file again to pick up the change, or pass force to overwrite deliberately. If something does get overwritten, overleaf_history shows the versions and overleaf_restore_file rolls it back.

Verified endpoints

Confirmed live against a real account, not assumed:

Operation

Call

Notes

Project list

GET /project

ol-prefetchedProjectsBlob meta tag

CSRF

GET /project

ol-csrfToken meta tag, resent as x-csrf-token

New project

POST /project/new

returns project_id

File tree

GET /socket.io/1/?projectId= then websocket

joinProjectResponse

Paths only

GET /project/:id/entities

cheap, no ids

Read doc

GET /project/:id/doc/:docId/download

plain text

Read binary

GET /project/:id/blob/:hash

hash comes from the tree

Archive

GET /project/:id/download/zip

used for grep

Create or overwrite

POST /project/:id/upload?folder_id=

multipart, field qqfile

Create doc or folder

POST /project/:id/doc, POST /project/:id/folder

body {name, parent_folder_id}

Rename

POST /project/:id/:type/:entityId/rename

204

Move

POST /project/:id/:type/:entityId/move

204, body {folder_id}

Delete

DELETE /project/:id/:type/:entityId

204

Compile

POST /project/:id/compile

returns outputFiles and clsiServerId

Word count

GET /project/:id/wordcount

History

GET /project/:id/updates?min_count=

version ranges, authors, changed paths

Version content

GET /project/:id/diff?pathname=&from=V&to=V

equal from and to returns the whole file

Diff

GET /project/:id/diff?pathname=&from=&to=

segments keyed u, i, d

:type is doc, file or folder.

Scripts

Command

What it does

setup.cmd / ./setup.sh

Full setup from scratch

npm run setup

Same, assuming dependencies are installed

npm run agent-setup

Non interactive setup for agents, prints RESULT and NEXT_ACTION

npm run login

Sign in fresh, using your default browser

npm run login:paste

Paste a session cookie, for machines with no display

npm run login:browser -- --real-profile

Reuse the session from your everyday browser, which must be closed

npm run mcp-check

Drive the built server as a real MCP client and assert 19 behaviours

npm run read -- "<project>"

Inspect a project from the terminal

npm run recon

Read-only probe of every endpoint

npm run smoke

End-to-end write test in a throwaway project

npm run build

Compile to dist/

npm run update

Pull, install and rebuild a clone in one step

npm test

Offline parser and detector assertions, no network, no credentials

npm run detect -- <file or text>

Run the AI detectors from the terminal

npm run detect -- <file> --plagiarism

Run the plagiarism check from the terminal

npm run detect-live

Hit the real detectors and assert a known AI sample scores high and a human one low

npm run detect:setup

Install the Chromium build Playwright drives

npm run smoke creates a project called claude-mcp-smoketest, then exercises write, overwrite, image upload, rename, move, delete and compile. It leaves the project in your account so you can inspect it. Trash it when you are done.

Configuration

All optional. Copy .env.example to .env in this folder and it is loaded on startup.

Variable

Default

Meaning

OVERLEAF_BASE_URL

https://www.overleaf.com

Point at a self-hosted instance

OVERLEAF_HOME_DIR

~/.overleaf-claude-mcp

Where the session and selection live

OVERLEAF_SESSION_FILE

$OVERLEAF_HOME_DIR/session.json

OVERLEAF_MAX_READ_CHARS

60000

Point at which overleaf_read_file returns an outline instead

OVERLEAF_COMPILE_TTL_MS

120000

How long a compile result is reused before recompiling

OVERLEAF_DOC_GREP_LIMIT

40

Above this many docs, grep uses the archive

OVERLEAF_TREE_TTL_MS

15000

File tree cache lifetime

OVERLEAF_SOCKET_TIMEOUT_MS

20000

OVERLEAF_LOGIN_TIMEOUT_MS

600000

How long the login window waits

OVERLEAF_DETECT_TIMEOUT_MS

90000

How long one detector or page is given to answer

OVERLEAF_DETECT_MIN_CHARS

200

Least prose a check will accept

OVERLEAF_DETECT_BROWSER

chromium

Playwright engine: chromium, firefox or webkit

OVERLEAF_DETECT_HEADLESS

true

Set false to watch the detector pages being driven

SAPLING_API_KEY

unset

Enables the Sapling detector

GPTZERO_API_KEY

unset

Enables the GPTZero detector

Releasing

Publishing is automatic. Bump the version, tag it, and push the tag:

npm version patch
git push --follow-tags

The Release workflow then typechecks, builds, runs the assertions, verifies the server starts, and publishes to npm with provenance. It refuses to publish if the tag and package.json disagree. Everyone on the npx registration gets the new version the next time they restart Claude.

This needs one repository secret, NPM_TOKEN, holding an npm automation token with publish rights.

Project

Limits

None of this is a supported API, and Overleaf can change it at any time. Use it against your own account. Real time collaborative editing is not implemented: writes replace a whole document rather than sending character level operations, so avoid writing to a file while someone else is typing in it.

Available Tools

19 tools
overleaf_compileCompile the projectB

Run a server-side LaTeX compile and report status plus output files.

ParametersJSON Schema
NameRequiredDescriptionDefault
draftNo
projectIdNo
stopOnFirstErrorNo

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations provided, the description must carry behavioral transparency. It does disclose that compilation is server-side and that the tool returns status plus output files, but it does not explain side effects, prerequisites, failure behavior, or timing.

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 one concise sentence and packs the essential action and output summary without wasted words.

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?

For a tool with no annotations, no output schema, and zero parameter descriptions, this is too thin. It does not mention how projectId interacts with project selection, whether draft affects output files, or how the returned status relates to compile_log.

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 0%, so the description needed to compensate. It does not explain what 'draft', 'projectId', or 'stopOnFirstError' mean, their defaults, or which are relevant to the current selected project.

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 ('Run a server-side LaTeX compile') and the result ('report status plus output files'). It also distinguishes itself from siblings like overleaf_compile_log and overleaf_download_pdf.

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?

The description gives no guidance on when to use this tool versus alternatives. It does not mention that compile_log is for logs, download_pdf is for fetching the PDF, or whether a project must be selected first.

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

overleaf_compile_logCompile and read the logB

Compile the project and return parsed LaTeX errors and warnings.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdNo

TDQS

B3.1/5.0
Behavior3/5

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

The description discloses the core side effect (compiling the project) and the output type (parsed errors and warnings). However, with no annotations, it does not explain other behavioral considerations such as whether compilation modifies files, whether it uses the current project or requires a projectId, or how failures are surfaced.

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 concise sentence with no filler. It front-loads the action and output, making it easy to parse.

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 one parameter, no annotations, and no output schema, so the description must do more work. It lacks parameter semantics, usage conditions, and any detail about the parsed output or error behavior, leaving the agent with an incomplete picture.

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 only parameter, projectId, is not mentioned in the description, and schema description coverage is 0%. The phrase 'the project' vaguely suggests a project is involved, but the agent is given no information about how to populate projectId or whether it is optional.

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 compiles the project and returns parsed LaTeX errors and warnings. This distinguishes it from siblings like overleaf_compile (which presumably just compiles) and overleaf_read_file (which reads files without compiling).

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 is given on when to use this tool versus overleaf_compile or overleaf_read_file. The use case is only implied by the action itself, and there is no mention of prerequisites, project selection, or alternatives.

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

overleaf_create_folderCreate a folderC

Create a folder, including any missing parents.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdNo
folderPathYes

TDQS

C2.8/5.0
Behavior2/5

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

The description adds one behavioral trait ('including any missing parents'), but without annotations, it must carry the full burden of disclosure. It does not state what happens if the folder already exists, whether the operation is recursive or idempotent, or any permission requirements.

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

Conciseness4/5

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

The description is a single sentence with no fluff, but the first part 'Create a folder' directly repeats the title. Still, the 'including any missing parents' addition earns its place, making it appropriately concise for the tool's simplicity.

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 no annotations, no output schema, and no schema descriptions, so the description is the sole documentation. It covers the core action but fails to explain parameter roles, expected return values, or error behavior, leaving the overall context 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?

With 0% schema description coverage and no parameter documentation in the description, the meanings of 'folderPath' and 'projectId' are left entirely to the agent's inference. The description only says 'Create a folder' and provides no mapping to the parameters.

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 'Create a folder, including any missing parents' uses a clear verb and resource, and the 'including any missing parents' detail distinguishes it from any hypothetical simple folder creation. No sibling tool is for creating folders, so the purpose is unambiguous.

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 guidance is provided about when to use this tool versus alternative approaches or in which context (e.g., project selection). The only implicit usage is that it creates folders, but no exclusions or comparisons are mentioned.

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

overleaf_current_projectShow active projectA

Report which Overleaf project is currently selected.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It states it reports the current project, making it clear this is a read-only operation, but it does not disclose what happens when no project is selected (e.g., returns null or errors), nor does it specify the return format (ID, name, etc.). This is minimal but not misleading.

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, front-loaded sentence with no filler or redundancy. Every word contributes to its purpose, making it highly concise and well-structured.

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 low complexity (zero parameters, simple getter), the description is mostly complete. It clearly states what the tool does, but since there is no output schema, it would be slightly better to specify the exact return value (e.g., project ID or name). Still, it is adequate for the tool's simplicity.

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

Parameters4/5

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

The tool has zero parameters, so the schema is trivially complete. The description does not need to explain parameters, and the baseline of 4 applies. No additional parameter information is required.

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 action: 'Report which Overleaf project is currently selected.' It uses a specific verb (report) and resource (current project), distinguishing it from siblings like overleaf_list_projects and overleaf_select_project.

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 (when you need to know the current selection) but gives no explicit guidance on when to prefer this over alternatives like list_projects or select_project. It does not mention any exclusions or prerequisites, so it relies on implied context.

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

overleaf_deleteDelete an entryB

Delete a file or folder from the project. Requires confirm to be true.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYes
filePathYes
projectIdNo

TDQS

B3.4/5.0
Behavior3/5

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

Since no annotations are provided, the description carries full burden. It discloses a key requirement (confirm must be true) and the destructive nature of the operation, but lacks details on permanence, permissions, or 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?

Two short sentences with no filler. The most critical behavioral note (requires confirm) is front-loaded and the description is easy to scan.

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?

For a simple delete operation, the description covers the essence, but the lack of parameter documentation and usage context is a gap. Given the low complexity and absence of an output schema, this is adequate but not complete.

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?

With 0% schema description coverage, the description must compensate for parameter meanings. While 'file or folder' hints at filePath and 'confirm' is mentioned, projectId is entirely unaddressed and no value formats or constraints are given.

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 deletes a file or folder from the project, using a specific verb and resource. It distinguishes itself from sibling tools like rename, move, or read, 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 Guidelines2/5

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

No guidance is given on when to use this tool versus alternatives (e.g., rename or move). No exclusions or prerequisites beyond the confirm requirement, leaving the agent to infer when deletion is appropriate.

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

overleaf_download_fileDownload a fileC

Save any project file, including PDFs and images, to a local path.

ParametersJSON Schema
NameRequiredDescriptionDefault
destPathYes
filePathYes
projectIdNo

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It states the basic save-to-local-path action but does not mention whether existing local files are overwritten, whether directories are created, what happens if the source file is missing, or any permission requirements. This is similar to the update_drive example where mutation details were omitted.

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

Conciseness4/5

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

The description is a single concise sentence that front-loads the core action and resource. It is appropriately brief, though it omits useful details that could be added without much verbosity.

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?

Given three parameters, no annotations, no output schema, and many sibling tools, the description is too thin. It fails to explain projectId, distinguish from download_pdf, or clarify return/error behavior, leaving the agent with insufficient context for reliable invocation.

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 coverage is 0% and no parameter descriptions are present. The description partially compensates by mapping 'project file' to filePath and 'local path' to destPath, but it does not clarify the optional projectId parameter or its role in selecting the project. Two of three parameters are only implicitly described.

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?

Description clearly identifies the action ('Save... to a local path') and the resource ('any project file'), with explicit examples (PDFs, images) that distinguish it from the sibling tool overleaf_download_pdf. The verb 'save' effectively conveys 'download' without ambiguity.

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 guidance is provided about when to use this tool versus alternatives like read_file, read_image, or download_pdf. The phrase 'any project file' implies broad applicability but does not state exclusions or recommend when a different sibling would be more appropriate.

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

overleaf_download_pdfDownload the compiled PDFA

Compile the project and save the resulting PDF locally.

ParametersJSON Schema
NameRequiredDescriptionDefault
destPathYes
projectIdNo

TDQS

A3.5/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 full burden. It discloses the main side effects (compilation and local file save) but omits details such as overwrite behavior, failure handling, or whether the current project is used when projectId is omitted. This is moderate transparency but leaves important behavioral questions unanswered.

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 extremely concise at two short sentences with no filler. It front-loads the core action and is easy to parse, even if it is terse.

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?

There is no output schema or annotations, so the description must cover return behavior and edge cases. It does not mention compile failures, whether the PDF is written to destPath, or how project selection works, making it incomplete for a side-effectful 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?

The schema has 0% description coverage for parameters, and the description does not explain destPath or projectId beyond the generic phrase 'save the resulting PDF locally.' While destPath is inferable from 'save locally,' projectId is entirely unaddressed, leaving the agent without guidance on which project to compile.

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?

Description uses a specific verb phrase 'Compile the project and save the resulting PDF locally,' clearly stating both actions and the resource. This distinguishes it from sibling tools like overleaf_compile (which only compiles) and overleaf_download_file (which downloads arbitrary files without compiling).

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?

No explicit when-to-use or alternative comparisons are provided. The description implies a combined compile-and-download workflow, but does not mention when to prefer this over calling overleaf_compile followed by overleaf_download_file, nor 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.

overleaf_edit_fileEdit a text fileC

Replace an exact string inside a project file.

ParametersJSON Schema
NameRequiredDescriptionDefault
filePathYes
newStringYes
oldStringYes
projectIdNo
replaceAllNo

TDQS

C2.6/5.0
Behavior2/5

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

With no annotations, the description must fully disclose behavior. It only states 'replace an exact string' and omits details about replaceAll behavior, error handling when oldString is not found, project selection requirements, or file existence assumptions. This leaves significant ambiguity.

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 concise sentence with no redundancy. It is front-loaded and every word contributes to the core purpose.

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

Completeness1/5

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

For a 5-parameter mutation tool with no annotations and no output schema, this description is severely incomplete. It fails to explain crucial behaviors like replacement scope, project context, and failure modes, making it inadequate for correct agent usage.

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 description adds no meaning to the parameters. With 0% schema description coverage, it should at least explain the roles of oldString, newString, filePath, projectId, and replaceAll, but it does not mention any of them.

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

Purpose4/5

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

The description clearly states the tool replaces an exact string in a project file, using a specific verb and resource. It distinguishes from sibling tools like overleaf_write_file by emphasizing 'exact string', though it does not explicitly name alternatives.

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 guidance is provided on when to use this tool versus alternatives such as overleaf_write_file or overleaf_grep. There is no mention of appropriate scenarios, prerequisites, or exclusions, leaving the agent without decision support.

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

overleaf_grepSearch the projectA

Regex search across every text file in the project.

ParametersJSON Schema
NameRequiredDescriptionDefault
flagsNo
patternYes
projectIdNo
maxMatchesNo

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description must carry the burden of behavioral disclosure. It states the action (regex search on text files) but does not mention read-only nature, case sensitivity, match limits, or performance implications. It adds basic context but lacks depth for a tool with 4 parameters.

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, focused sentence with no redundant words. It front-loads the core purpose and earns its place efficiently, achieving maximum conciseness.

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 4 parameters and no output schema, yet the description does not disclose return format, valid flag values, or the role of projectId relative to the selected project. This is insufficient for an agent to invoke the tool correctly without additional assumptions, especially given the lack of annotations.

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 0%, so the description must compensate. It explains none of the parameters—pattern, flags, projectId, maxMatches—beyond the implicit 'regex' in the verb. While parameter names are somewhat self-explanatory, the description does not clarify flag syntax, project scope, or match limiting behavior, leaving the agent to guess.

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 performs regex search across every text file in the project, with a specific verb and resource. It distinguishes from sibling tools like overleaf_read_file (single file access) and overleaf_word_count (counting), 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 Guidelines4/5

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

The phrase 'across every text file in the project' provides context that this is a project-wide search tool, implying use when scanning multiple files. However, it does not explicitly mention alternatives or when not to use it, but the scope is clear enough to differentiate from file-specific operations.

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

overleaf_list_filesList project filesC

List every file and folder in the project.

ParametersJSON Schema
NameRequiredDescriptionDefault
refreshNo
projectIdNo

TDQS

C2.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. It only states the action without disclosing behavior like whether it requires an active project, what happens if projectId is omitted, or if it returns a flat list or tree structure. The refresh parameter's effect is unexplained.

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

Conciseness4/5

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

The description is a single, concise sentence that is front-loaded and free of fluff. It earns its place, though it could be slightly more informative without becoming verbose.

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?

Given the tool has 2 parameters, no annotations, and no output schema, the description is too thin. It doesn't explain the refresh parameter, the need for projectId, or the return format. For a listing tool, more context about scope and behavior is needed.

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 0%, so the description must compensate. It mentions 'every file and folder' but doesn't explain the two parameters (refresh, projectId) or their semantics. The description adds minimal value beyond the schema's bare property names.

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

Purpose4/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 and folder in a project, which is a specific verb+resource. It distinguishes from siblings like overleaf_read_file or overleaf_list_projects, though it doesn't explicitly differentiate from a potential 'list files' alternative.

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 guidance on when to use this tool versus alternatives. It doesn't mention that projectId is needed or how it relates to the current project selection, nor does it explain the refresh parameter's purpose. Sibling tools like overleaf_current_project or overleaf_select_project are not referenced.

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

overleaf_list_projectsList Overleaf projectsB

List projects on the signed-in Overleaf account.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeArchivedNo

TDQS

B3.1/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 transparency burden. It identifies the operation as listing projects but does not disclose behavior such as whether archived projects are excluded by default, pagination, sorting, or what fields are returned.

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

Conciseness5/5

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

The description is a single sentence that is direct and front-loaded. Every word contributes to the core purpose without unnecessary detail.

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?

Given the lack of an output schema and annotations, the description is too sparse. It does not clarify the includeArchived parameter behavior or what the returned project list will contain, making it incomplete for confident invocation.

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 0% for the single parameter includeArchived. The tool description does not mention this parameter or explain its effect, leaving the agent to infer from the parameter name alone.

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 ('List') and the resource ('projects on the signed-in Overleaf account'). This distinguishes it from sibling tools like overleaf_list_files and overleaf_select_project.

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 guidance is provided about when to use this tool versus alternatives such as overleaf_select_project or overleaf_current_project. There are no exclusions, prerequisites, or hints about typical invocation order.

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

overleaf_moveMove an entryB

Move a file or folder into another folder.

ParametersJSON Schema
NameRequiredDescriptionDefault
filePathYes
projectIdNo
destFolderYes

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of disclosing behavioral traits, but it does not mention side effects (e.g., overwriting), whether moves are recursive, path interpretation, or authentication requirements. It merely states the operation without safety or behavioral details.

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 clear sentence that is front-loaded and free of verbose language. It conveys the core operation without unnecessary padding.

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?

Given the lack of annotations, no output schema, and three under-documented parameters, the description is too minimal. It omits critical context such as required projectId semantics, expected return behavior, and how folders are handled, making it incomplete for reliable invocation.

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 0%, so the description must compensate. It does not explain the role of projectId, path formats, or the relationship between filePath and destFolder beyond what their names imply. The description adds no detail for the three parameters.

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 ('Move') and a clear resource ('a file or folder') with a target ('into another folder'). It distinctly conveys the operation, distinguishing it from siblings like rename or delete.

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 guidance is given about when to use this tool versus alternatives such as rename, upload, or create_folder. The description only states the action, leaving usage context implicit at best.

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

overleaf_read_fileRead a text fileA

Read a LaTeX or other text file. Long files are truncated; use startLine and endLine to page through them.

ParametersJSON Schema
NameRequiredDescriptionDefault
endLineNo
filePathYes
projectIdNo
startLineNo

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the burden of disclosing side effects. The term 'Read' inherently implies a non-destructive operation, and the description does not suggest any modification. It could be more explicit about being read-only, but the intent is clear.

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, consisting of two sentences with no redundant information. It efficiently conveys the core functionality and a key usage hint.

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?

Covers the essential purpose and the truncation behavior, which is sufficient for a simple read operation. It does not specify the return format, but since no output schema is provided, the absence is not critical; the description meets the needs for a basic tool.

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 description adds meaning for startLine and endLine by explaining they serve for paging through truncated files. However, it does not elaborate on filePath or projectId, which are presumably self-explanatory in the Overleaf context, but the schema itself provides no descriptions. Partial 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 clearly states the tool reads a LaTeX or other text file, which is specific and unambiguous. It naturally distinguishes from sibling tools like write_file, edit_file, and grep, as reading is a distinct 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?

Provides actionable guidance by noting that long files are truncated and advising to use startLine and endLine for paging. This directly helps the user handle large files, though it does not explicitly mention when to prefer this over alternatives, which is not critical for a read operation.

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

overleaf_read_imageView an imageA

Fetch an image from the project so it can be viewed directly.

ParametersJSON Schema
NameRequiredDescriptionDefault
filePathYes
projectIdNo

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full transparency burden. 'Fetch' and 'viewed directly' correctly signal a non-mutating, display-oriented operation, but the description does not disclose how the image is returned (binary, base64, URL), what formats are supported, or what errors/limitations apply.

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 front-loaded sentence with no filler. It states the action, the resource, and the purpose without redundancy.

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?

For a simple 2-parameter read tool, the description is close to adequate, but the lack of annotations, output schema, and parameter semantics leaves the agent uncertain about the response format and exact arguments. It supports tool selection but not fully confident invocation.

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 0%, so the description itself must explain the meaning and usage of filePath and projectId. It only hints that filePath refers to an image and that the image comes from a project; it never names the parameters, mentions whether projectId is optional/relative to the current project, or specifies path rules or supported image types.

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 action ('Fetch') and a clearly scoped resource ('an image from the project'), with the intended outcome 'so it can be viewed directly'. This makes the tool's purpose easy to distinguish from siblings like overleaf_read_file or overleaf_download_file.

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 intended use case is implied: use this when you need to view an image from the project. However, it does not explicitly say when not to use it or compare this with alternatives such as overleaf_read_file for text or overleaf_download_file for raw downloads.

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

overleaf_renameRename an entryB

Rename a file or folder in place.

ParametersJSON Schema
NameRequiredDescriptionDefault
newNameYes
filePathYes
projectIdNo

TDQS

B3.1/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 only states that the action is an in-place rename, but omits side effects, overwrite behavior, permissions, and whether renaming a folder affects its contents.

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 front-loaded sentence with no filler or repetition. Every word contributes to the core meaning.

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?

For a 3-parameter mutation tool with no output schema and no annotations, this description is too minimal. It lacks prerequisites, behavior details, return/error information, and context about how projectId or file paths are resolved.

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 0% and the description does not explain filePath, newName, or projectId. While the parameter names are somewhat self-explanatory, the description adds no explicit semantics, constraints, or relationship between the parameters.

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 ('Rename') and identifies the resource ('a file or folder') with the scope 'in place', which clearly distinguishes this from sibling tools like overleaf_move. The title is also clarified by the description.

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?

There is no explicit when-to-use or when-not-to-use guidance, and no alternative tools are mentioned. The only usage signal is the verb 'rename', which is largely implied by the tool name.

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

overleaf_select_projectSelect active projectA

Choose the project every other tool works on. Accepts a project id or part of a project name.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes

TDQS

A3.5/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 disclose behavioral details. It does reveal that the tool changes the active project and accepts partial names, but it does not explain behavior on ambiguous matches, no matches, persistence across calls, or the return value. This is a meaningful gap for a state-changing 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?

The description is two short sentences with no filler. It front-loads the core purpose and immediately defines the parameter semantics, making it easy to scan.

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?

For a simple one-parameter selection tool, the description covers the essential purpose and input meaning. However, with no annotations and no output schema, it omits edge-case behavior and expected results, so it is only minimally 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 schema only states that 'query' is a required string, so the description adds useful meaning by clarifying it can be a project id or part of a project name. However, it lacks specifics such as id format, case sensitivity, or how to disambiguate multiple partial-name matches, leaving some ambiguity.

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 ('Choose') and identifies the resource ('the project every other tool works on'), which clearly distinguishes it from sibling tools like overleaf_list_projects and overleaf_current_project. It also states the accepted input forms (id or part of a name).

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 phrase 'every other tool works on' implies this should be called before using other Overleaf tools, but the description does not explicitly say when not to use it or mention alternatives like listing projects first to find a valid id/name. Usage context is implied rather than stated.

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

overleaf_upload_fileUpload a local fileB

Upload a local file, such as a figure, into the project.

ParametersJSON Schema
NameRequiredDescriptionDefault
filePathYes
localPathYes
projectIdNo

TDQS

B3.1/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 only that a file is uploaded, but does not mention overwrite behavior, file size limits, authentication requirements, or whether an existing target file is replaced. This is a significant 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?

The description is a single sentence that is direct and front-loaded with the action. It wastes no words and is appropriately sized for the tool's simplicity.

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?

With no annotations, no output schema, and zero parameter descriptions, the description is too sparse to provide complete context. It does not explain return values, required project state, or how parameters interrelate, leaving important operational details undocumented.

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 does not explain any of the three parameters (localPath, filePath, projectId). Although the parameter names are somewhat self-explanatory, the description adds no value beyond the minimal schema, leaving the agent without guidance on how to populate these fields.

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 action: 'Upload a local file, such as a figure, into the project.' It uses a specific verb ('upload') and identifies the resource being acted on (local file) and the destination (project). This distinguishes it from sibling tools like write_file or download_file.

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 phrase 'such as a figure' implies a use case (binary or local content), but the description provides no explicit guidance on when to choose this tool over alternatives, nor any exclusions or prerequisites. The usage context is only weakly implied.

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

overleaf_word_countWord countC

Return the compiled word count for the project.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdNo

TDQS

C2.8/5.0
Behavior2/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 behavioral disclosure. It only states the basic action ('Return the compiled word count') without elaborating on side effects, dependencies (like prior compilation), or any limitations, offering minimal insight beyond the obvious.

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

Conciseness4/5

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

The description is a single, front-loaded sentence with no wasted words. It efficiently conveys the core purpose, though the brevity results in missing details, which is acceptable for conciseness but penalized elsewhere.

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?

This simple tool lacks an output schema and has only one undocumented parameter. The description fails to explain what 'compiled word count' means (e.g., does it require compilation? what files are included?), and it does not describe the output format. Given the minimal schema and absence of annotations, the description is insufficient for full contextual understanding.

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 zero description coverage for the projectId parameter, and the tool description does not explain it either. The phrase 'for the project' vaguely alludes to it, but no meaning or usage context is added for the parameter, leaving the agent to guess its format or optionality.

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 compiled word count for the project. It uses a specific action ('Return') and a specific resource ('compiled word count'), which distinguishes it from siblings like overleaf_list_projects or overleaf_read_file.

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?

The description provides no explicit guidance on when to use this tool versus alternatives. It does not mention prerequisites (e.g., whether compilation is required) or any exclusion conditions, leaving usage entirely implied.

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

overleaf_write_fileWrite a text fileA

Create or overwrite a text file in the project. Missing parent folders are created.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes
filePathYes
projectIdNo

TDQS

A3.8/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 burden of behavioral disclosure. It explicitly mentions 'overwrite' and that missing parent folders are created, which are the key behavioral facets. It doesn't discuss permissions, return values, or content restrictions, but the most critical behaviors are disclosed.

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 no wasted words: it states the core purpose and a key additional detail. The information is front-loaded and easy to parse.

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?

For a simple write tool, the description covers the primary operations adequately. However, it does not explicitly distinguish itself from sibling tools, does not mention project context/current project selection, and relies on the agent to infer content semantics and behavior with insufficient detail. These gaps reduce completeness.

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 input schema has zero description coverage. The description adds a small amount of semantic for filePath by noting that missing parent folders are created, but it does not clarify content (beyond being a text string) or the role of projectId. Complete coverage for parameters is required because the description is the only source, and it is insufficient.

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: 'Create or overwrite a text file in the project.' This is a specific verb-plus-resource with scope, and it distinguishes itself from siblings like overleaf_edit_file (targeted edits) and overleaf_upload_file (file uploads) by focusing on full-file text writes.

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 its usage by describing create/overwrite semantics and automatic creation of parent folders, but it does not explicitly say when to use this tool instead of alternatives such as edit_file or upload_file. Usage context is present but not overt.

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. 19 tool updatesv0.2.0
    • First observedoverleaf_compile
    • First observedoverleaf_compile_log
    • First observedoverleaf_create_folder
    • First observedoverleaf_current_project
    • First observedoverleaf_delete
    • First observedoverleaf_download_file
    • First observedoverleaf_download_pdf
    • First observedoverleaf_edit_file
    • First observedoverleaf_grep
    • First observedoverleaf_list_files
    • First observedoverleaf_list_projects
    • First observedoverleaf_move
    • First observedoverleaf_read_file
    • First observedoverleaf_read_image
    • First observedoverleaf_rename
    • First observedoverleaf_select_project
    • First observedoverleaf_upload_file
    • First observedoverleaf_word_count
    • First observedoverleaf_write_file

TDQS

B3.3/5.0
Disambiguation4/5

Most tools have distinct purposes (listing, reading, writing, compiling), but the three compile-related tools (overleaf_compile, overleaf_compile_log, overleaf_download_pdf) overlap in that they all trigger a compile, differing only in output handling. Similarly, read_file/read_image/download_file are distinct but share a 'get content' theme, though descriptions clarify their intended use.

Naming Consistency4/5

All tools share the overleaf_ prefix and most follow a clear verb_noun pattern (e.g., list_projects, write_file, create_folder). Minor deviations exist: overleaf_current_project uses an adjective, overleaf_grep is just a verb, and overleaf_compile_log compounds nouns, but the overall style remains coherent and predictable.

Tool Count4/5

With 19 tools, the set is slightly above the ideal 3-15 range but remains well-scoped for Overleaf's functionality, covering project selection, file operations, compilation, and reporting. Each tool adds value for typical LaTeX workflows, so the count feels justified rather than bloated.

Completeness4/5

The toolset covers the core workflow of selecting a project, editing files, uploading/downloading, and compiling with log and PDF output. Obvious gaps include lack of project creation or deletion (only listing/selecting existing projects), which may limit full lifecycle management but is not fatal for editing-focused use.

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

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