Repository navigation
Releases
mcp-server-overleaf 0.3.9
There is no 0.3.8. Glama already uses that label for a rebuild of 0.3.7, so this release
skips it and keeps the npm version and Glama's label the same.
- Say in the tool descriptions what each argument does beyond its schema, and how each tool
fails.replace_textinsertsreplaceWithliterally, so$$and$1are kept. A section
title is matched against the title in braces: an exact title wins over the first one that
contains it.write_filewithexpectedRevisionrefuses a file that no longer exists.
compile_projectnames the files it tries whenmainTexFileis omitted, and it compiles the
clone without pulling.search_projectskips a new file untilpush_changescommits it.
show_diffdoes not pull.discard_local_changesdeletes new files too. Glama's tool
definition score had marked 13 of the 18 tools down for adding nothing to their parameters. - Stop the integration tests from failing intermittently with ENOTEMPTY while deleting a clone.
Git startsgit maintenance run --auto --detachafter fetch, commit and push, and that
process can still be writing inside a clone after the server has exited. The tests now turn
automatic maintenance off, through the environment for the server and through the bare
repository's own config for the push side, which does not see that environment.
Install in Claude Desktop by downloading mcp-server-overleaf.mcpb below and double-clicking it. Everywhere else: npx --yes mcp-server-overleaf@0.3.9 setup.
mcp-server-overleaf 0.3.7
- Start without any credentials instead of exiting. With no token and no registered project,
the server now lists its tools, and every call that needs Overleaf answers that
OVERLEAF_GIT_TOKENis not set, as doeslist_projects. Glama's sandbox starts a listed
server with no credentials, and 0.3.6 exited there before answeringinitialize. A project
registered without any token is still a startup error, since that configuration is half written. - Wait for the package document
npm installreads, not only the per-version one, before
verifying a publication. For 0.3.6 the version document answered while the abbreviated
packument the install fetches still lacked the version, so the install failed with ETARGET,
and the GitHub release and the MCP registry listing were skipped until the job was rerun.
Install in Claude Desktop by downloading mcp-server-overleaf.mcpb below and double-clicking it. Everywhere else: npx --yes mcp-server-overleaf@0.3.7 setup.
mcp-server-overleaf 0.3.6
-
Say in every tool description what the tool returns. Only
project_summarydeclares an
output schema, so for the other seventeen the description is the only place a client learns
the reply's shape and its no-op cases: a missing snippet, a section title that matches
nothing, a destination that already exists. The edit and file tools now also say that they
pull from Overleaf first.move_filenamed\\inputwith two backslashes because the source
escaped them twice; it now names\input, and the contract test rejects a doubled backslash
in any description. -
Give npm up to ten minutes to serve a new version before the release workflow calls the
publication missing. npm accepts a publish before its registry returns it, and 0.3.5 took
about two minutes to appear; the check allowed one, so it failed a publish that had
succeeded and skipped the GitHub release and the MCP registry listing until it was rerun.
Install in Claude Desktop by downloading mcp-server-overleaf.mcpb below and double-clicking it. Everywhere else: npx --yes mcp-server-overleaf@0.3.6 setup.
mcp-server-overleaf 0.3.5
-
Stop the package check failing on upstream patch releases. It installs the packed archive
the way a user does, which makes npm resolve this package's declared ranges against the
registry instead of reading the archive's shrinkwrap, so that tree is always the newest one
those ranges allow — then it required that tree to be version-identical to the lock. The two
can only agree in the window between an upstream publish and the nextnpm update, so CI
went red on branches that had not touched a dependency, with the same unrelated dependency
bump as the fix each time.honohit it most often, being an unpinned peer of the MCP SDK
with a fast release cadence, but every runtime range was exposed the same way. The trees are
now compared by shape: a package in one and not the other fails, and so does a major version
apart (a minor, for a 0.x package), which is how an unpinned peer would slip an untested
major into a user's tree. Every copy npm nests counts, so a second major nested beside the
hoisted one fails too. A newer patch or minor is only printed, withnpm updateas the way
to bring the lock level, since both trees are tested. Dependabot will not do it: its npm
version updates only bump dependencies this package names, andhonois not one. -
Add executable specifications.
tests/features/publishingToOverleaf.featurestates in plain
sentences what this server promises a co-author — an edit waits in the clone, a push that
would overwrite their newer work is refused, a deletion stays local until it is pushed — and
every sentence is bound to a real call against the server over stdio. The prose and the
behaviour are checked against each other on every run: a sentence with no binding fails the
suite, so the document cannot quietly stop being true. Run through Vitest with
@amiceli/vitest-cucumber, a development dependency, so there is no second test command. -
Refresh the runtime dependencies to the newest versions the declared ranges allow:
@modelcontextprotocol/server2.3.1,@modelcontextprotocol/node2.1.1 andhono4.13.13.
The MCP SDK packages are now licensed Apache-2.0, and@modelcontextprotocol/nodedepends
onhonodirectly instead of as a peer. -
Let the repository audit accept a named advisory until a review date.
node-forgehas a
high-severity advisory with no fixed release, reached only through@anthropic-ai/mcpb, a
development dependency, in a signature check this repository never calls; npm cannot
ignore one advisory, so it held every branch red.npm run audit:dependenciesnow fails on
anything not listed inscripts/audit/acceptedAdvisories.mjs, and on a listed advisory once
its review date passes. The audit of the installed runtime tree is unchanged and accepts
nothing. -
Fix the category names
project_summarypromises. Its output schema named a category
bib, which this project has never produced; the real names aretex,bibliography,
figure,class-or-style,build-artifactandother, and two of them were missing
from the list entirely. The schema now builds that list fromLATEX_FILE_CATEGORIESin
latexProjectFiles.ts, so prose can no longer drift from what the code emits. -
Cover the three places where a test could not have caught a defect it was meant to.
delete_fileandmove_fileremove and relocate files from a client-supplied path, but
symlinkEscape.test.ts— the file that proves path containment for every other file
operation — did not exercise them; it does now, for both ends of a move.rangespayload
parsing had no unit test at all, although it is the one input on this server with no
published contract and the fake remote only ever produces well-formed shapes. And the
project_summaryassertion parsed the text block, so it would have passed with no
structured content on the wire at all; it now validates the wire value against the
schema the tool advertises. -
Add
delete_fileandmove_file, the two parts of the file surfacewrite_filecould not
express: the server could create and overwrite a file but never remove or rename one, so
cleaning up an obsolete draft or reorganising a paper's sections meant leaving Overleaf.
Both go through the Git bridge like every other edit, so a removal is local until
push_changesanddiscard_local_changesundoes it.move_filerefuses rather than
overwrite an existing destination, and says which LaTeX references it has not rewritten. -
Rewrite every tool description and every parameter description against what the code
actually does. Three tools described theirprojectparameter more narrowly than the
server accepts, or did not describe it at all, so a model could not know an Overleaf
address was a valid value. Descriptions now also state when to call a tool and when to
prefer another, which side effects it has, and where its behaviour stops:search_project
names the eight extensions it actually searches,read_sectionandedit_sectionname the
trailing matter a section stops at, andadd_commentsays the thread it creates is empty. -
Declare
openWorldHinton every tool. Every tool butlist_projectscontacts Overleaf,
including the read tools, which pull before answering; none of them said so. -
Declare an
outputSchemaforproject_summaryand return its result as
structuredContent, so a client gets a typed object with documented fields instead of a
JSON string it has to parse out of a text block.
Install in Claude Desktop by downloading mcp-server-overleaf.mcpb below and double-clicking it. Everywhere else: npx --yes mcp-server-overleaf@0.3.5 setup.
mcp-server-overleaf 0.3.4
- Describe this server by what makes it different. Every storefront line, on npm, in the MCP
registry, and in both plugin marketplaces, said "over the Overleaf Git bridge", which is the
positioning of every competing Overleaf server and omits the one capability none of them
has. The package description, the plugin and bundle copy, and the README's opening now name
tracked changes. - List
OVERLEAF_SESSION_COOKIEin the registry record and in--help. Neither mentioned it,
so nothing a user could read before installing said the tracked-changes tools existed.
Install in Claude Desktop by downloading mcp-server-overleaf.mcpb below and double-clicking it. Everywhere else: npx --yes mcp-server-overleaf@0.3.4 setup.
mcp-server-overleaf 0.3.3
- Add three optional tools that reach Overleaf's editor instead of its Git bridge, so an edit
can arrive as a suggestion in the review panel rather than as finished text.suggest_edit
sets the tracked-changes flag on an editor operation, which a Git push cannot express;
list_tracked_changesreads the suggestions and comment-thread anchors on a document;
add_commentanchors a thread to a passage. They need an Overleaf session cookie, which is
a different and broader credential than the Git token, so they are registered only when one
is configured and the other sixteen tools are unchanged without it. See
Tracked changes for what they cannot do and why the protocol they
use is less stable than the bridge. - Implement Overleaf's Socket.IO 0.9 wire format directly rather than depending on the
browser client it is forked from, and use the WebSocket built into Node, so the new tools
add no runtime dependency. The codec is verified packet by packet against Overleaf's own
parser. - Open the README with what distinguishes this server, since the answer to "which Overleaf
MCP server" was previously only reachable by reading a comparison document. - Extend the related-projects comparison to the two servers that do not use the Git bridge,
and record which of their capabilities this one now has.
Install in Claude Desktop by downloading mcp-server-overleaf.mcpb below and double-clicking it. Everywhere else: npx --yes mcp-server-overleaf@0.3.3 setup.
mcp-server-overleaf 0.3.2
- Accept a project's Overleaf address wherever a tool takes
project, not just its raw
24-character id. Someone reaching for a second paper has what the address bar holds, and
the id-only form meant a client configured with one project could reach the rest of the
account only through a string nobody has to hand.setupandOVERLEAF_PROJECT_ID
already took an address; the tools now agree with them. - Have
list_projectssay that any other project can be named by its address, so the
configured list stops reading as the only choice. Its empty state no longer leads with
OVERLEAF_PROJECTS, an environment variable a bundle or plugin user never sets. - Correct what this project says about Overleaf plans. Overleaf documents Git integration
as gated on the project owner's subscription rather than the caller's, and documents no
plan restriction on generating a token. The README, thesetupfailure message, and the
Claude Desktop install panel each claimed the user's own plan had to include Git. - Ship this repository as a plugin marketplace for both Claude Code and Codex. Adding it
withclaude plugin marketplace add yangzichao/mcp-server-overleafor the matching
codexcommand, then installingoverleaf@mcp-server-overleaf, replaces a hand-written
client configuration entry. Oneplugins/overleafdirectory serves both clients, so they
cannot drift apart. The plugin declares no environment variables, so a public marketplace
cannot carry a credential; the server reads theprojects.jsonthatsetupwrites.
npm run plugins:buildregenerates both manifests and both marketplaces from
package.json, and the check suite fails if the committed files drift. - Lead the README with a table of every client and the route that installs it, and fix a
stale link from the ChatGPT tunnel guide into the README. - Refresh the shrinkwrap for zod 4.6.2.
Install in Claude Desktop by downloading mcp-server-overleaf.mcpb below and double-clicking it. Everywhere else: npx --yes mcp-server-overleaf@0.3.2 setup.
mcp-server-overleaf 0.3.1
- List the server in the official MCP registry. The release workflow now authenticates with
GitHub OIDC and publishesserver.jsonunderio.github.yangzichao/mcp-server-overleaf,
describing both the npm package and the.mcpbbundle, with the bundle hash taken from the
exact file the same job attached to the release. - Add
mcpNametopackage.json, which is how the registry proves npm package ownership.
Install in Claude Desktop by downloading mcp-server-overleaf.mcpb below and double-clicking it. Everywhere else: npx --yes mcp-server-overleaf@0.3.1 setup.
mcp-server-overleaf 0.3.0
- Package the server as a Claude Desktop bundle:
npm run mcpb:buildproduces a.mcpb
archive holding the published npm tarball, its runtime dependencies, a generated
icon, and a manifest whose tool list is read back from the staged server over stdio. The
release workflow attaches it to the GitHub release, so Claude Desktop users install by
double-clicking one file. - Accept an Overleaf project URL wherever
OVERLEAF_PROJECT_IDis read, not only a bare
24-character id. The desktop install panel can now ask for the address bar. - Mark
replace_textandpush_changeswithdestructiveHint: true. Both change the user's
paper, and the Connectors Directory requires the applicable hint on every tool. - Add a privacy policy covering what the server stores, where it sends it, and what it never
collects.
Install in Claude Desktop by downloading mcp-server-overleaf.mcpb below and double-clicking it. Everywhere else: npx --yes mcp-server-overleaf@0.3.0 setup.