Skip to main content
Glama

Overleaf Community Edition MCP Server & REST Bridge πŸš€

License: MIT Docker MCP

A native Model Context Protocol (MCP) server and REST API bridge specifically built for self-hosted Overleaf Community Edition (ShareLaTeX).

Connect AI coding assistants and agents (Claude Desktop, Cursor, Antigravity, Windsurf) directly to your private Overleaf instance to explore, read, live-edit, patch, and compile LaTeX documents with real-time browser synchronization and automated log diagnosis.


⚑ Why Overleaf Community Edition Needs This

Overleaf Community Edition (CE) is the go-to self-hosted solution for academic labs, universities, and privacy-conscious researchers. However:

  1. No Public API or Git Sync: Overleaf reserves official REST APIs and Git integration (git.overleaf.com) for paid Cloud plans and Server Pro licenses.

  2. The Operational Transformation (OT) Trap: Overleaf manages live editing in-memory and Redis through document-updater. Editing documents directly in MongoDB corrupts active sessions or gets overwritten.

  3. No Automated Compilations for AI: Existing community MCP tools only do local Git commitsβ€”they cannot trigger the server-side TeX Live engine (clsi), parse LaTeX compile errors, or return the resulting PDF.

What overleaf-ce-mcp does differently:

  • βœ… 100% Native to Community Edition: Works out of the box with standard sharelatex/sharelatex Docker deployments (tested on CE v5 & v6).

  • βœ… OT-Safe & Real-Time Sync: Files written or patched through this bridge pass through Overleaf's upload pipeline. Connected browser tabs immediately see changes live on screen via WebSockets without disconnecting or corrupting the document.

  • βœ… Server-Side LaTeX Compilation: Compiles projects using your instance's TeX Live environment (pdflatex, xelatex, lualatex).

  • βœ… Structured Error & Warning Extraction: Automatically parses LaTeX .log files and extracts exact line numbers, error messages, and context snippets so your AI agent can auto-debug its own LaTeX code.

  • βœ… Direct PDF Delivery: Generates authenticated URLs and streaming endpoints for instant PDF preview and download.

  • βœ… Protected & Dual Protocol: Protected by Authorization: Bearer <API_KEY>, exposing both MCP (Streamable HTTP /mcp & SSE /sse) and a clean REST API.


Related MCP server: Unofficial Overleaf MCP Server

πŸ“ Architecture

flowchart LR
    subgraph Client["Your Local Machine"]
        AI["AI Assistant (Antigravity / Claude / Cursor)"]
    end

    subgraph Server["Your Server (Docker Network)"]
        Bridge["overleaf-ce-mcp (:8000)"]
        Overleaf["Overleaf Web (:80 / :3000)"]
        DocUpdater["document-updater (:3003)"]
        CLSI["CLSI / TeX Live (:3013)"]
        Redis[("Redis (:6379)")]
        Mongo[("MongoDB (:27017)")]
    end

    AI -- "MCP / REST (Bearer Auth)" --> Bridge
    Bridge -- "Session Injection" --> Redis
    Bridge -- "Project Metadata" --> Mongo
    Bridge -- "OT-Safe Upload / Sync" --> Overleaf
    Overleaf <--> DocUpdater
    Overleaf <--> Redis
    Overleaf -- "Compile LaTeX" --> CLSI
    DocUpdater <--> Mongo

πŸ› οΈ MCP Tools Reference

When connected, your AI assistant receives the following tools:

Tool

Parameters

Description

list_projects

None

Lists all projects with their project_id, name, compiler, rootDoc_id, and lastUpdated timestamp.

get_project_files

project_id

Returns the complete hierarchical folder tree (tree), text doc IDs (.tex, .bib, .cls), and binary file IDs (.png, .jpg, .pdf).

read_file

project_id, path_or_doc_id

Fetches the live text content synchronized with document-updater (or Base64 data for binary files). Accepts doc ID or path ("main.tex", "sections/intro.tex").

write_file

project_id, folder_id, filename, content, is_base64

Creates or updates a file safely via Overleaf's OT upload engine without breaking active browser tabs. Supports text or Base64 images.

patch_file

project_id, path_or_doc_id, old_str, new_str, replace_all

Replaces an exact text block inside a document in real time. Perfect for targeted, low-latency edits.

compile_project

project_id, root_doc_id, compiler, draft

Compiles the LaTeX project, extracts parsed errors/warnings from output.log, and returns the PDF download URL.

create_folder

project_id, parent_folder_id, name

Creates a new folder in the project hierarchy.

delete_entity

project_id, entity_type, entity_id

Deletes a doc, binary file, or folder cleanly from Overleaf.


πŸš€ Quick Start (Docker Compose)

1. Add overleaf-mcp to your Overleaf docker-compose.yml

In your existing Overleaf deployment directory (where docker-compose.yml or Overleaf Toolkit resides), add the overleaf-mcp service:

services:
  # ... your existing overleaf, overleaf-mongo, overleaf-redis services ...

  overleaf-mcp:
    image: ghcr.io/alanmagno1/overleaf-ce-mcp:latest
    container_name: overleaf-mcp
    restart: unless-stopped
    mem_limit: 256m
    depends_on:
      overleaf:
        condition: service_started
      overleaf-mongo:
        condition: service_healthy
      overleaf-redis:
        condition: service_started
    ports:
      # Expose on your desired host port:
      - "8099:8000"
    environment:
      # Generate a secure key: openssl rand -hex 32
      OVERLEAF_MCP_API_KEY: "your-secret-api-key-here"

      # Internal Docker URLs (match your existing service names):
      OVERLEAF_WEB_URL: "http://overleaf:80"
      OVERLEAF_API_URL: "http://overleaf:3000"
      OVERLEAF_MONGO_URL: "mongodb://overleaf-mongo:27017/sharelatex?replicaSet=overleaf"
      OVERLEAF_REDIS_URL: "redis://overleaf-redis:6379/0"

      # Base URLs used to format PDF download links in compile outputs:
      OVERLEAF_PUBLIC_BASE_URL: "https://overleaf.example.com/mcp-bridge"
      OVERLEAF_TAILSCALE_BASE_URL: "http://your-server-ip:8099"
    networks:
      - default
      - overleaf-net

2. Start the service

docker compose up -d overleaf-mcp

3. Verify Health

curl http://localhost:8099/api/health
# {"status":"ok","service":"overleaf-ce-mcp"}

🌐 Exposing Over HTTPS (Reverse Proxy / Cloudflare Tunnel)

If your Overleaf instance is published behind a domain (e.g. https://overleaf.example.com), you can route /mcp-bridge/ to the bridge container.

Option A: Via Overleaf's Internal Nginx

Add this snippet to /etc/nginx/vhost-extras/overleaf/mcp-bridge.conf (or mount it in your compose file):

location ^~ /mcp-bridge/ {
    resolver 127.0.0.11 valid=5s ipv6=off;
    set $mcp_upstream http://overleaf-mcp:8000;
    proxy_pass $mcp_upstream;

    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Connection "";

    # Critical for SSE (Server-Sent Events) and compilations:
    proxy_buffering off;
    proxy_cache off;
    chunked_transfer_encoding on;
    proxy_read_timeout 10m;
    proxy_send_timeout 10m;
}

location = /mcp-bridge {
    return 308 /mcp-bridge/;
}

Reload Nginx:

docker exec overleaf nginx -s reload

Option B: Via Caddy

overleaf.example.com {
    handle /mcp-bridge/* {
        reverse_proxy overleaf-mcp:8000 {
            flush_interval -1
        }
    }
    handle {
        reverse_proxy overleaf:80
    }
}

πŸ’» Client Configuration

Antigravity (~/.gemini/antigravity/mcp_config.json)

{
  "mcpServers": {
    "overleaf": {
      "serverUrl": "https://overleaf.example.com/mcp-bridge/mcp",
      "headers": {
        "Authorization": "Bearer your-secret-api-key-here"
      }
    }
  }
}

Claude Desktop (claude_desktop_config.json)

Using mcp-remote to bridge Streamable HTTP to Claude Desktop's stdio:

{
  "mcpServers": {
    "overleaf": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://overleaf.example.com/mcp-bridge/mcp",
        "--header",
        "Authorization: Bearer your-secret-api-key-here"
      ]
    }
  }
}

Cursor (~/.cursor/mcp.json)

{
  "mcpServers": {
    "overleaf": {
      "url": "https://overleaf.example.com/mcp-bridge/mcp",
      "headers": {
        "Authorization": "Bearer your-secret-api-key-here"
      }
    }
  }
}

πŸ“‘ REST API Reference

All REST endpoints accept Authorization: Bearer <API_KEY>, X-API-Key: <API_KEY>, or query param ?api_key=<API_KEY>.

  • GET /api/health: Health status (public).

  • GET /api/projects: List all projects with metadata.

  • GET /api/projects/{id}/files: Get full folder tree and flat file/doc indices.

  • GET /api/projects/{id}/file?path_or_doc_id=main.tex: Read doc content in real time.

  • POST /api/projects/{id}/file: Create or overwrite file (folder_id, filename, content, is_base64).

  • PATCH /api/projects/{id}/file: Patch file (path_or_doc_id, old_str, new_str, replace_all).

  • POST /api/projects/{id}/compile: Trigger compilation (compiler, draft, root_doc_id).

  • GET /api/projects/{id}/pdf: Download the latest compiled PDF binary.

  • GET /api/projects/{id}/log: Retrieve raw LaTeX compile .log.

  • POST /api/projects/{id}/folder: Create subfolder (parent_folder_id, name).

  • DELETE /api/projects/{id}/{entity_type}/{entity_id}: Delete entity (doc, file, folder).


πŸ”’ Security & Privacy

  1. Keep OVERLEAF_MCP_API_KEY Strong: Generate with openssl rand -hex 32.

  2. Do Not Expose Raw Ports to the Public Internet: Expose the port only on your local network/VPN (Tailscale, WireGuard) or behind an authenticating reverse proxy with TLS (Cloudflare Tunnel, Caddy, Nginx).

  3. Container Isolation: overleaf-ce-mcp only needs network access to overleaf, overleaf-mongo, and overleaf-redis. It does not need root privileges inside the container.

  4. Privacy Policy: overleaf-ce-mcp is 100% self-hosted and collects zero external telemetry or user data. See PRIVACY.md for full details.


πŸ“„ License

Distributed under the MIT License.

Authored by Alan Magno.

Related MCP Connectors

Related MCP Servers