MCP server for managing Overleaf projects through Git synchronization.
Runs on your machine from its package; the steps are below.
At most: creates or changes data: records, files, settings.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
uvx overleaf-mcp-integration
MCP client config
{
"mcpServers": {
"overleaf": {
"command": "uvx",
"args": [
"overleaf-mcp-integration"
]
}
}
}An MCP server for managing Overleaf projects through Git synchronization.
flowchart LR
C[MCP Client\nClaude Desktop / other MCP host] -->|Tool Call| S[Overleaf MCP Server]
S -->|Git Sync| O[Overleaf Git Remote]
S -->|Read / Write| L[Local Repo Mirror]
L -->|Commit + Push| O
O -->|Pull / Fetch| L
S -->|Tool Result| C
sequenceDiagram
participant Client as MCP Client
participant Server as Overleaf MCP Server
participant Local as Local Mirror
participant Overleaf as Overleaf Git
Client->>Server: list_files / read_file
Server->>Local: Ensure local clone
Server->>Overleaf: git pull
Overleaf-->>Server: latest content
Server-->>Client: file list / file content
Client->>Server: write_file(path, content)
Server->>Local: update file
Server->>Local: git commit
Server->>Overleaf: git push
Server-->>Client: success + metadata
uv package managerhttps://www.overleaf.com/project/69a4f7cc4eaf13bd56de5b04 → 69a4f7cc4eaf13bd56de5b04)..env - copy .env.example to .env and fill in:OVERLEAF_TOKEN=your_git_token
PROJECT_ID=your_project_id
project_idcan also be passed per tool call, butPROJECT_IDis still required by the server configuration.
The Overleaf Git token is account-wide credential material. Store it only in
the MCP client's environment or a protected .env file, and rotate it if it
is exposed.
Files in an Overleaf project are untrusted input. A .tex file or project
configuration can contain instructions aimed at the model; treat file contents
as data, not as commands. Keep OVERLEAF_ALLOWED_PROJECTS restricted to the
projects the server should be able to access:
OVERLEAF_ALLOWED_PROJECTS=project_id_a,project_id_b
The default allowlist contains only PROJECT_ID.
git clone https://github.com/younesbensafia/overleaf-mcp-server.git
cd overleaf-mcp-server
uv sync
cp .env.example .env # then edit with your token/project id
uv run overleaf-mcp
Without a checkout, run the Git version directly with:
uvx --from git+https://github.com/younesbensafia/overleaf-mcp-server overleaf-mcp
Plain uvx overleaf-mcp is appropriate only after the project is published to
PyPI.
The server listens on stdio - connect your MCP client (Claude Desktop, etc.) to it.
For a large project, call sync_project first. The initial Git clone can take
longer than an MCP client's individual tool request timeout.
| Tool | Description |
|---|---|
list_files | Pull and list files from Overleaf project |
read_file | Read file content |
write_file | Overwrite a complete text file, commit, and push to Overleaf |
edit_file | Replace one exact text match, commit, and push to Overleaf |
sync_project | Force a pull/sync from Overleaf |
read_file accepts optional zero-based offset and bounded limit line
parameters for reading large documents in chunks.
Add to ~/.config/Claude/claude_desktop_config.json:
{
"mcpServers": {
"overleaf": {
"command": "uv",
"args": ["--directory", "/path/to/overleaf-mcp-server", "run", "overleaf-mcp"],
"env": {
"OVERLEAF_TOKEN": "your_git_token",
"PROJECT_ID": "your_project_id"
}
}
}
}
PROJECT_ID in .env.project_id explicitly in tool calls.sync_project before write_file if the remote changed.uv sync.MIT - See LICENSE