MCP LaTeX Server
# MCP LaTeX Server
A Model Context Protocol (MCP) server for LaTeX file creation, editing, validation, and compilation. Built with [FastMCP](https://github.com/modelcontextprotocol/python-sdk) and Pydantic for type-safe, structured output.
## Features
- **Create** LaTeX documents from parameters or bundled templates (article, beamer, report)
- **Edit** files with replace, insert, append, and prepend operations
- **Read** and **list** `.tex` files within a secure base directory
- **Validate** syntax — braces, environments, references, required declarations
- **Compile** to PDF with `pdflatex`, `xelatex`, or `lualatex`
- **Resources** — browse and retrieve bundled templates via `latex://` URIs
## Prerequisites
- **Python 3.11.9+**
- **LaTeX distribution** (for compilation):
- Windows: [MiKTeX](https://miktex.org/download) or [TeX Live](https://www.tug.org/texlive/)
- macOS: [MacTeX](https://www.tug.org/mactex/) (`brew install --cask mactex`)
- Linux: `sudo apt install texlive-full` (Debian/Ubuntu) or `sudo dnf install texlive-scheme-full` (Fedora)
## Installation
### Using uv (recommended)
```bash
git clone https://github.com/RobertoDure/mcp-latex-server
cd mcp-latex-server
uv pip install -e .
```
### Using pip
```bash
git clone <repository-url>
cd mcp-latex-server
python -m venv .venv
# Windows
.venv\Scripts\activate
# macOS/Linux
source .venv/bin/activate
pip install -e .
```
### Quick setup (Windows)
```bash
python quick_setup.py
```
This checks Python version, installs dependencies, verifies the server imports correctly, and optionally configures Claude Desktop.
## Configuration
The server uses a single environment variable:
| Variable | Description | Default |
|---|---|---|
| `LATEX_SERVER_BASE_PATH` | Root directory for all file operations | `.` (current directory) |
All file paths passed to tools are resolved relative to this base directory. Access outside it is denied.
## MCP client configuration
### Claude Desktop
Add to your `claude_desktop_config.json`:
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Linux**: `~/.config/Claude/claude_desktop_config.json`
```json
{
"mcpServers": {
"latex-server": {
"command": "uv",
"args": [
"--directory",
"/path/to/mcp-latex-server",
"run",
"latex_server.py"
],
"env": {
"LATEX_SERVER_BASE_PATH": "/path/to/your/latex/files"
}
}
}
}
```
### VS Code (GitHub Copilot)
Add to `.vscode/mcp.json` in your workspace:
```json
{
"servers": {
"latex-server": {
"command": "uv",
"args": [
"--directory",
"/path/to/mcp-latex-server",
"run",
"latex_server.py"
],
"env": {
"LATEX_SERVER_BASE_PATH": "${workspaceFolder}"
}
}
}
}
```
## Tools
### `create_latex_file`
Create a new LaTeX document from parameters.
| Parameter | Type | Default | Description |
|---|---|---|---|
| `file_path` | `str` | *required* | Path for the new `.tex` file |
| `document_type` | `article\|report\|book\|letter\|beamer\|minimal` | `article` | Document class |
| `title` | `str` | `""` | Document title |
| `author` | `str` | `""` | Document author |
| `date` | `str` | `\today` | Document date |
| `content` | `str` | `""` | Body content |
| `packages` | `list[str]` | `[]` | Extra LaTeX packages |
| `geometry` | `str` | `""` | Geometry settings (e.g. `margin=1in`) |
### `create_from_template`
Create a document from a bundled template.
| Parameter | Type | Default | Description |
|---|---|---|---|
| `file_path` | `str` | *required* | Path for the new `.tex` file |
| `template` | `article\|beamer\|report` | `article` | Template name |
### `edit_latex_file`
Edit an existing LaTeX file.
| Parameter | Type | Default | Description |
|---|---|---|---|
| `file_path` | `str` | *required* | Path to the file |
| `operation` | `replace\|insert_before\|insert_after\|append\|prepend` | *required* | Edit operation |
| `new_text` | `str` | *required* | Text to insert or replace with |
| `search_text` | `str\|null` | `null` | Text to find (required for replace/insert) |
| `line_number` | `int\|null` | `null` | 1-based line number (alternative to `search_text`) |
### `read_latex_file`
Read and return the contents of a `.tex` file.
| Parameter | Type | Default | Description |
|---|---|---|---|
| `file_path` | `str` | *required* | Path to the file |
### `list_latex_files`
List all `.tex` files in a directory.
| Parameter | Type | Default | Description |
|---|---|---|---|
| `directory_path` | `str` | `.` | Directory to search |
| `recursive` | `bool` | `false` | Search subdirectories |
### `validate_latex`
Check LaTeX syntax: required declarations, balanced braces, environment matching, undefined references.
| Parameter | Type | Default | Description |
|---|---|---|---|
| `file_path` | `str` | *required* | Path to the file |
### `get_latex_structure`
Extract document structure: class, title, author, packages, and section hierarchy.
| Parameter | Type | Default | Description |
|---|---|---|---|
| `file_path` | `str` | *required* | Path to the file |
### `compile_latex`
Compile a `.tex` file to PDF (runs the engine twice for references/TOC).
| Parameter | Type | Default | Description |
|---|---|---|---|
| `file_path` | `str` | *required* | Path to the file |
| `engine` | `pdflatex\|xelatex\|lualatex` | `pdflatex` | LaTeX engine |
## Resources
| URI | Description |
|---|---|
| `latex://templates` | List available bundled templates |
| `latex://template/{name}` | Get the content of a specific template |
## Testing
Test with the MCP Inspector:
```bash
uv run mcp dev latex_server.py
```
Or run the included test suite:
```bash
python test_server.py
```
## Troubleshooting
**Server won't start** — Verify Python 3.10+ (`python --version`) and that `mcp` is installed (`pip list | grep mcp`).
**Compilation fails** — Ensure a LaTeX distribution is on your PATH (`pdflatex --version`). Install MiKTeX or TeX Live if missing.
**"Access denied" errors** — The requested file path resolves outside `LATEX_SERVER_BASE_PATH`. Use relative paths or adjust the env variable.
**Claude can't connect** — Double-check file paths in your MCP config, restart Claude Desktop, and verify with `uv run mcp dev latex_server.py`.
## License
MIT
TDQS
Scored across 8 tools
Each tool has a clearly distinct purpose with no ambiguity: compile, create from template, create new file, edit file, get structure, list files, read file, and validate syntax. The descriptions reinforce unique functions, preventing misselection.
All tool names follow a consistent verb_noun pattern using snake_case (e.g., compile_latex, edit_latex_file). This predictability makes the set easy to navigate and understand.
With 8 tools, the server is well-scoped for LaTeX document management. Each tool earns its place by covering essential operations like creation, editing, reading, validation, and compilation without bloat.
The toolset provides strong coverage for core LaTeX workflows, including CRUD operations and validation. A minor gap is the lack of tools for managing bibliographies or handling complex LaTeX errors, but agents can work around this with existing tools.