Productivity & teams
Redmine
Issues, time entries and projects in your Redmine, from your agent.
12 endpoints
Connect your Overleaf projects to your AI agent. It compiles, fixes errors, replies to co-author comments and reviews tracked changes while you write. Nothing to install and no API key from Overleaf.
15 tools Read and write
Overleaf's only public API, Open in Overleaf, sends LaTeX in to create a new project. Existing projects are reached through Git on paid plans. There is no official MCP server (checked 6 Nov 2026). Cotlet runs 15 Overleaf tools hosted, over MCP for agents and REST for scripts.
| What you need | Open in Overleaf | Git integration | Cotlet |
|---|---|---|---|
| List your projects and tags | No | No | Yes |
| Read and edit project files | No | Paid plans, by push | Yes, in the editor |
| Compile and read the errors | No | No | Yes |
| Comments and tracked changes | No | Pushes can drop them | Yes, they stay in place |
| Invite collaborators | No | No | Yes, after your OK |
| Works on the free Overleaf plan | Yes | Paid plans only | Yes |
Checked 6 Nov 2026. Sources: Overleaf: Open in Overleaf API · Overleaf Docs: Git integration · Overleaf: plans and pricing · Zapier: Overleaf page (404)
Use your own account in its Cloud Browser.
Paste one address into your agent.
Fix my errors, answer my comments.
We never keep your Overleaf password, and edits, replies and invites wait for your OK before anyone sees them. Who can see your session
Enable Overleaf for agents. Sign up, log in to Overleaf in its Cloud Browser, then press Enable for agents.
Add the Cotlet address. Add https://cotlet.dev/mcp/v1 as an MCP server or connector in your agent.
Approve the connection. Chat apps ask you to sign in to Cotlet. Editors, n8n and scripts use an API key from the console.
One shared address, https://cotlet.dev/mcp/v1, also carries Overleaf next to your other apps. If you enable Overleaf after connecting, refresh the connector so the new tools show up.
Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet-overleaf \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet-overleaf": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet-overleaf]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: overleaf_read Make: MCP Client > Call a tool
Zapier: MCP Client by Zapier > Run Tool
Server URL: https://cotlet.dev/mcp/v1
Token: <your key>
Tool: overleaf_write Owned and shared projects both appear, with your role. Only text files can be read; images are listed with their size.
Returns each project with its ID, name, owner, tags and last modified time, newest first. Both projects you own and projects shared with you are listed, with your role in each. Results come in pages; pass next_cursor back until it is empty.
MCP calloverleaf_read → list_projects
REST endpointGET https://cotlet.dev/api/v1/overleaf/projects
| Name | Type | Description |
|---|---|---|
| tag string | string | Only projects with this tag name. |
| query string | string | Only projects whose name contains this text. |
| cursor string | string | Next page cursor from the previous call. |
{
"projects": [
{
"project_id": "66f1a2b3c4d5e6f708192a3b",
"name": "Thesis draft",
"owner": "You",
"role": "owner",
"tags": [
"Thesis"
],
"last_modified": "2026-11-03T16:20:00Z"
},
{
"project_id": "66e8d7c6b5a4938271605f4e",
"name": "Conference paper",
"owner": "Anna Keller",
"role": "editor",
"tags": [],
"last_modified": "2026-11-01T09:05:00Z"
}
],
"next_cursor": null
} Returns the project name, main document, LaTeX compiler, TeX Live version, your role, the people with access and their permission (Viewer, Reviewer or Editor) and pending invites. Use it before a compile or an invite to see how the project is set up.
MCP calloverleaf_read → get_project
REST endpointGET https://cotlet.dev/api/v1/overleaf/projects/{project_id}
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. It is the part after /project/ in the editor URL. |
{
"project_id": "project_8c41d2"
} {
"project_id": "66f1a2b3c4d5e6f708192a3b",
"name": "Thesis draft",
"main_document": "main.tex",
"compiler": "pdfLaTeX",
"tex_live_version": "2025",
"your_role": "owner",
"collaborators": [
{
"name": "Anna Keller",
"email": "anna@example.com",
"permission": "reviewer",
"status": "active"
}
]
} Returns every file and folder with its path and type (text or binary), folders first, then files in alphabetical order. Text files such as .tex and .bib can be read with read_file; images and other binary files are listed only.
MCP calloverleaf_read → list_files
REST endpointGET https://cotlet.dev/api/v1/overleaf/projects/{project_id}/files
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. It is the part after /project/ in the editor URL. |
{
"project_id": "project_8c41d2"
} {
"files": [
{
"path": "sections",
"type": "folder"
},
{
"path": "sections/intro.tex",
"type": "text"
},
{
"path": "figures/overview.png",
"type": "binary"
},
{
"path": "main.tex",
"type": "text"
},
{
"path": "refs.bib",
"type": "text"
}
]
} Returns the file's text with line numbers, so a comment or compile error can be matched to its line. Binary files such as images return their type and size, not content. Reading does not change the project.
MCP calloverleaf_read → read_file
REST endpointGET https://cotlet.dev/api/v1/overleaf/projects/{project_id}/files/read
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. It is the part after /project/ in the editor URL. |
| file_path string required | string | Path of the file in the project, as list_files shows it, for example sections/intro.tex. |
{
"project_id": "project_8c41d2",
"file_path": "file path"
} {
"file_path": "sections/intro.tex",
"lines": [
{
"line": 1,
"text": "\\section{Introduction}"
},
{
"line": 2,
"text": "Recent work on sparse attention show large gains on long inputs."
}
]
} Returns the line range that changed. If old_text is missing or appears more than once, nothing changes and the call returns an error. Collaborators with the project open see the edit appear. If the signed-in account is a Reviewer, Overleaf tracks the change, as it does for any reviewer. By default you confirm each call; you can switch that off for this tool.
MCP calloverleaf_write → edit_file
REST endpointPATCH https://cotlet.dev/api/v1/overleaf/projects/{project_id}/file
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. It is the part after /project/ in the editor URL. |
| file_path string required | string | Path of the file in the project, as list_files shows it, for example sections/intro.tex. |
| old_text string required | string | Exact text to replace. It must appear once in the file. |
| new_text string required | string | Text to put in its place. |
{
"project_id": "project_8c41d2",
"file_path": "file path",
"old_text": "old text",
"new_text": "new text"
} {
"file_path": "sections/intro.tex",
"changed_lines": [
2,
2
],
"tracked": false
} Returns the project's tags after the change. Tags are private to your account and no one else sees them, and remove: true undoes the call, so it needs no confirmation.
MCP calloverleaf_write → tag_project
REST endpointPOST https://cotlet.dev/api/v1/overleaf/projects/{project_id}/tag
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. It is the part after /project/ in the editor URL. |
| tag string required | string | Tag name. A tag that does not exist yet is created first. |
| remove boolean | boolean | Remove the tag from the project instead. Default false. |
{
"project_id": "project_8c41d2",
"tag": "tag"
} {
"project_id": "66f1a2b3c4d5e6f708192a3b",
"tags": [
"Thesis",
"Old"
]
} Uses the main document and compiler set in the project. A free account has a 10 second compile limit, paid plans 240 seconds.
Returns the status (success or failed), whether a PDF was produced, and the errors and warnings with file and line. The compile uses the main document and compiler set in the project, and a free account has a shorter compile timeout than a paid one. It only creates generated files in the project, reaches no one, and needs no confirmation.
MCP calloverleaf_write → compile_project
REST endpointPOST https://cotlet.dev/api/v1/overleaf/projects/{project_id}/compile
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. It is the part after /project/ in the editor URL. |
| mode string | string | normal or draft. Draft is Overleaf's Fast [draft] mode and skips image processing. Default normal. |
| stop_on_first_error boolean | boolean | Stop the compile at the first error. Default false. |
{
"project_id": "project_8c41d2"
} {
"status": "failed",
"pdf_produced": false,
"errors": [
{
"file_path": "sections/intro.tex",
"line": 14,
"message": "Undefined control sequence."
}
],
"warnings": [
{
"file_path": "main.tex",
"line": 21,
"message": "Citation 'lee2024' on page 3 undefined."
}
]
} Track changes and full history need a premium plan on the project owner's account. On a free project, history shows the last 24 hours and labeled versions.
Returns each thread with its ID, file, line, the text it is attached to, every message with author and time, and whether it is resolved. Threads come file by file, in document order. Anyone with access to the project can see these comments, as in the editor's review panel.
MCP calloverleaf_read → list_comments
REST endpointGET https://cotlet.dev/api/v1/overleaf/projects/{project_id}/comments
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. It is the part after /project/ in the editor URL. |
| include_resolved boolean | boolean | Also return resolved threads. Default false. |
{
"project_id": "project_8c41d2"
} {
"threads": [
{
"thread_id": "66fa01b2c3d4e5f607182930",
"file_path": "sections/intro.tex",
"line": 2,
"selected_text": "sparse attention show large gains",
"resolved": false,
"messages": [
{
"author": "Anna Keller",
"text": "Subject and verb do not agree. Also, which gains?",
"at": "2026-11-02T10:12:00Z"
}
]
}
]
} Returns the new thread ID and the line it is attached to. The comment is visible to everyone with access to the project. The tool does not edit the file. By default you confirm each call; you can switch that off for this tool.
MCP calloverleaf_write → add_comment
REST endpointPOST https://cotlet.dev/api/v1/overleaf/projects/{project_id}/comments
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. It is the part after /project/ in the editor URL. |
| file_path string required | string | Path of the file in the project, as list_files shows it, for example sections/intro.tex. |
| selected_text string required | string | Exact text the comment attaches to. It must appear once in the file. |
| body string required | string | The comment text. |
{
"project_id": "66f1a2b3c4d5e6f708192a3b",
"file_path": "sections/intro.tex",
"selected_text": "sparse attention show large gains",
"body": "Subject and verb do not agree. Also, name the datasets where the gains were measured."
} {
"thread_id": "66fa01b2c3d4e5f607182931",
"file_path": "sections/intro.tex",
"line": 2,
"resolved": false
} Returns the thread with your reply added at the end. Everyone with access to the project sees it. By default you confirm each call; you can switch that off for this tool.
MCP calloverleaf_write → reply_to_comment
REST endpointPOST https://cotlet.dev/api/v1/overleaf/projects/{project_id}/comment/replies
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. It is the part after /project/ in the editor URL. |
| thread_id string required | string | Thread ID from list_comments. |
| body string required | string | The reply text. |
{
"project_id": "project_8c41d2",
"thread_id": "thread_8c41d2",
"body": "body"
} {
"thread_id": "66fa01b2c3d4e5f607182930",
"message_count": 2,
"resolved": false
} Returns the thread with resolved set to true. A resolved thread leaves the open list for everyone with access to the project. By default you confirm each call; you can switch that off for this tool.
MCP calloverleaf_write → resolve_comment
REST endpointPOST https://cotlet.dev/api/v1/overleaf/projects/{project_id}/comment/resolve
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. It is the part after /project/ in the editor URL. |
| thread_id string required | string | Thread ID from list_comments. |
{
"project_id": "project_8c41d2",
"thread_id": "thread_8c41d2"
} {
"thread_id": "66fa01b2c3d4e5f607182930",
"resolved": true
} Returns each pending change with its ID, file, line, type (insertion or deletion), the text and the author. Changes come in document order. Track changes is a premium feature: on a project whose owner has no premium plan, the list is empty.
MCP calloverleaf_read → list_tracked_changes
REST endpointGET https://cotlet.dev/api/v1/overleaf/projects/{project_id}/tracked-changes
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. It is the part after /project/ in the editor URL. |
| file_path string | string | Only changes in this file. |
{
"project_id": "project_8c41d2"
} {
"changes": [
{
"change_id": "66fb11c2d3e4f5a607182941",
"file_path": "sections/intro.tex",
"line": 2,
"type": "insertion",
"text": "shows",
"author": "Anna Keller",
"at": "2026-11-02T10:20:00Z"
},
{
"change_id": "66fb11c2d3e4f5a607182942",
"file_path": "sections/intro.tex",
"line": 2,
"type": "deletion",
"text": "show",
"author": "Anna Keller",
"at": "2026-11-02T10:20:00Z"
}
]
} Returns the change with its new state. Accepting makes the text part of the file; rejecting restores the text before the change. The edit is visible to everyone with the project open. Your role in the project decides whether Overleaf allows it. By default you confirm each call; you can switch that off for this tool.
MCP calloverleaf_write → review_tracked_change
REST endpointPOST https://cotlet.dev/api/v1/overleaf/projects/{project_id}/tracked-change/review
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. It is the part after /project/ in the editor URL. |
| change_id string required | string | Change ID from list_tracked_changes. |
| action string required | string | accept or reject. |
{
"project_id": "project_8c41d2",
"change_id": "change_8c41d2",
"action": "action"
} {
"change_id": "66fb11c2d3e4f5a607182941",
"action": "accept",
"file_path": "sections/intro.tex",
"line": 2
} Returns versions newest first, each with its time, the people who edited and its label if it has one. Full project history is a premium feature: on a free project the list shows edits from the last 24 hours and labeled versions only.
MCP calloverleaf_read → list_history_versions
REST endpointGET https://cotlet.dev/api/v1/overleaf/projects/{project_id}/history-versions
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. It is the part after /project/ in the editor URL. |
| labels_only boolean | boolean | Only versions with a label you created. Default false. |
{
"project_id": "project_8c41d2"
} {
"versions": [
{
"version": 214,
"at": "2026-11-03T16:20:00Z",
"editors": [
"You"
],
"label": null
},
{
"version": 198,
"at": "2026-10-28T08:00:00Z",
"editors": [
"You",
"Anna Keller"
],
"label": "Submitted to supervisor"
}
]
} The number of Editors and Reviewers you can invite follows the project owner's plan. A free plan allows 1; Viewers are unlimited.
Returns the invite with its status pending. Overleaf emails the person, and the invite shows as a pending invite in the project's Share menu until they accept. The number of Editors and Reviewers you can invite depends on the project owner's plan; a free plan allows 1, and Viewers are unlimited. By default you confirm each call; you can switch that off for this tool.
MCP calloverleaf_write → invite_collaborator
REST endpointPOST https://cotlet.dev/api/v1/overleaf/projects/{project_id}/collaborator/invite
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. It is the part after /project/ in the editor URL. |
| email string required | string | Email address of the person to invite. |
| permission string required | string | viewer, reviewer or editor. |
{
"project_id": "project_8c41d2",
"email": "jane@example.com",
"permission": "permission"
} {
"email": "anna@example.com",
"permission": "reviewer",
"status": "pending"
} Your logged-in Overleaf profile, encrypted with AES-256-GCM, in Finland. Not the password.
The 15 Overleaf tools. Never the cookie.
Your projects, files, comments and the people you share with.
Billing, plan, password and deleting a project.
Email, Google, ORCID, IEEE or SSO. You do it, we never type a password.
Disable for agents or reset the browser in the console. Your Overleaf account is untouched.
Our site scores A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results). There is no SOC 2 report or third-party pentest yet.
When Overleaf moves a button or renames a field, the fix happens on our side and your prompts keep working. status.cotlet.dev watches the site, console and API every 3 minutes.
| Action | Undo |
|---|---|
| Edit a file | Restore the earlier version in Overleaf History (full history on paid plans, the last 24 hours on Free) |
| Add or reply to a comment | Edit or delete it in the review panel |
| Resolve a comment | The thread moves to the resolved list in the review panel |
| Accept or reject a tracked change | Restore the earlier version in History |
| Invite a collaborator | Revoke the pending invite under Manage access; the email is already out |
| Tag a project | Call the tool again with remove set |
6 of 15 tools ask first: every edit, comment, reply, resolve, tracked change decision and invite, because co-authors see them. Reads, compiles and private tags reach nobody, so they run at once. Switch the wait off per tool for a scheduled run.
Your role in the project decides what Overleaf allows. A Reviewer's edits are tracked, as in the editor.
{
"name": "add_comment",
"arguments": {
"project_id": "66f1a2b3c4d5e6f708192a3b",
"file_path": "sections/intro.tex",
"selected_text": "sparse attention show large gains",
"body": "Subject and verb do not agree. Also, name the datasets where the gains were measured."
}
} curl -X POST https://cotlet.dev/api/v1/overleaf/projects/66f1a2b3c4d5e6f708192a3b/comments \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"file_path":"sections/intro.tex","selected_text":"sparse attention show large gains","body":"Subject and verb do not agree. Also, name the datasets where the gains were measured."}' {
"thread_id": "66fa01b2c3d4e5f607182931",
"file_path": "sections/intro.tex",
"line": 2,
"resolved": false
} Scripts and cron jobs reach the same tools over REST, with the same key and price. A call that fails costs nothing. The tools table lists the REST path of each tool.
About $18 a monthfor a researcher with a thesis and a paper under review, 3,020 credits. Your Overleaf plan is billed by Overleaf as before.
| Job | Calls | Credits |
|---|---|---|
| Fix compile errors, 3 per draft | 8 × 6 | 480 |
| Work through a round of 8 comments | 21 × 3 | 630 |
| Review a supervisor's tracked changes | 7 × 3 | 210 |
| Check what changed since the last labeled version | 1 × 4 | 40 |
| Tag finished projects | 10 × 1 | 100 |
| Invite co-authors to a new project | 3 × 2 | 60 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 3,020 |
The month is our example, not an Overleaf figure: Overleaf publishes no usage numbers for a typical account. Each fix, reply or tracked change is a read and a write, so a round of 8 comments takes about 21 calls. Overleaf plans, checked 6 Nov 2026: Free $0, Standard $25 a month or $199 a year, Pro $45 a month or $399 a year. Dollars at the $29 pack rate.
| Credits | Price, one time | Calls at 10 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 500 | $5.80 |
| 15,000 | $79 | 1,500 | $5.27 |
| 32,000 | $149 | 3,200 | $4.66 |
| 60,000 | $249 | 6,000 | $4.15 |
Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.
| Option | What it does | Where it stops |
|---|---|---|
| mjyoo2/OverleafMCP | MCP server that reads projects, parses LaTeX structure and pushes section edits through Git. 342 stars, MIT, last commit 3 May 2026. | Runs on your computer and needs Git integration, a paid Overleaf feature. |
| aloth/olcli | Command line tool to pull, push, sync and compile, with an MCP server. 243 stars, MIT, last commit 2 Nov 2026. | You install and run it yourself. |
| lonetis/claudeleaf | SDK, CLI and MCP server that edits in the Overleaf web editor in real time. 40 stars, MIT, last commit 20 Oct 2026. | Runs on your computer. |
| DanielHou315/overleaf-mcp-rt | Real-time MCP server for overleaf.com and self-hosted Overleaf. 13 stars, AGPL-3.0, last commit 20 Sep 2026. | Runs on your computer. |
| Overleaf AI Assistant | Built into the editor: chat with your document and LaTeX help. 5 AI uses a day on Free and Student, 10 on Standard, Max on Pro. | Works inside the Overleaf editor only, not from your own agent. |
| Open in Overleaf and Git integration | Overleaf's own routes: one creates a new project, the other syncs files on paid plans. | No compile, comments, tracked changes or invites. |
We found no hosted Overleaf MCP server besides ours. A community server is free and fine on your own laptop. Cotlet adds hosting around the clock, use from ChatGPT and your phone, and one account for your other apps.
Take Group sp. z o.o. runs Cotlet. It is a software company registered in Poland, EU (VAT PL6342984273), working since 2019, founded by Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Write to contact@cotlet.dev with questions about the Overleaf tools.
Sign up at cotlet.dev, log in to Overleaf once in its Cloud Browser and add Cotlet to ChatGPT or Claude, following the steps in your console. No API key is needed. ChatGPT and Claude then work in your Overleaf account through Cotlet, in their phone apps too.
With Cotlet, ChatGPT, Claude and other AI agents handle jobs like these in Overleaf: fix LaTeX compile errors; work through co-author comments; review tracked changes before submission. You ask in plain words, and anything that reaches other people waits for your OK first.
Create a free account at https://cotlet.dev, open Overleaf under Integrations in the console and log in to Overleaf in its Cloud Browser. The trial starts with your first app, no card asked.
No for projects, files, comments, compiles, tags and invites. Track changes needs a premium plan on the project owner's account, and full project history does too: a free project shows the last 24 hours and labeled versions (Overleaf Docs: Premium features, History and versioning). A free plan also allows 1 Editor or Reviewer collaborator per project.
No. Git integration is a premium Cloud feature that clones and pushes files with no branches or tags. It cannot compile, comment or invite. Overleaf also warns that pushes can drop or displace tracked changes and comments (Overleaf Docs: Git integration). Cotlet works in the editor, so comments and tracked changes stay in place.
Overleaf documents none (checked 6 Nov 2026), so nothing tells an agent that a co-author commented. Run your agent on a schedule instead, for example a weekly list_comments pass.
Yes. Cotlet works in your own account on any plan. Overleaf's limits stay: a 10 second compile limit, 1 collaborator per project, no track changes and 24 hours of history on a free project.
Only the door is different. Both expose the same 15 tools, inputs and answers, with one API key and one price. Agents use MCP; scripts and HTTP steps use REST.
No. Cotlet is independent and not affiliated with Overleaf.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy