emacs-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| EMACS_SOCKET | No | Path to Emacs daemon socket | Auto-detect |
| EMACS_TIMEOUT | No | Default timeout for operations (ms) | 5000 |
| EMACSCLIENT_PATH | No | Path to emacsclient binary | emacsclient |
| EMACS_ORG_DIRECTORY | No | Org files directory | ~/org |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
| resources | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| emacs_evalB | Execute Emacs Lisp code and return the result |
| emacs_buffer_readC | Read the contents of an Emacs buffer |
| emacs_buffer_writeC | Write/replace content in an Emacs buffer |
| emacs_buffer_editC | Apply targeted edits to a buffer (find and replace) |
| emacs_buffer_listA | List all open buffers with metadata |
| emacs_buffer_switchA | Switch to a specific buffer (make it current) |
| emacs_buffer_createC | Create a new buffer |
| emacs_buffer_killC | Close/kill a buffer |
| emacs_file_openC | Open a file in Emacs |
| emacs_file_saveB | Save the current or specified buffer to file |
| emacs_file_save_asB | Save buffer to a new file path |
| emacs_file_infoA | Get information about a file (exists, readable, writable, size, etc.) |
| emacs_project_listA | List known projects (supports both project.el and projectile) |
| emacs_project_currentA | Get the current project root and name |
| emacs_project_switchC | Switch to a different project |
| emacs_project_filesB | List files in the current or specified project |
| emacs_project_searchA | Search for files in the project by name pattern |
| emacs_workspace_listA | List all workspaces/tabs |
| emacs_workspace_currentA | Get the current workspace/tab name |
| emacs_workspace_switchB | Switch to a workspace/tab by name or index |
| emacs_workspace_createC | Create a new workspace/tab |
| emacs_workspace_deleteB | Delete a workspace/tab |
| emacs_workspace_saveC | Save workspace state |
| emacs_org_readB | Read org document content with optional parsed structure |
| emacs_org_writeC | Write/replace content in an org buffer |
| emacs_org_heading_addB | Add a new heading to an org document |
| emacs_org_heading_updateC | Update an existing heading (title, content, or properties) |
| emacs_org_heading_deleteB | Delete a heading and its subtree |
| emacs_org_heading_moveC | Move a heading up, down, or change its level |
| emacs_org_todo_setB | Set TODO state for a heading |
| emacs_org_todo_listB | List all TODO items in a buffer or across org files |
| emacs_org_tag_setB | Set tags for a heading |
| emacs_org_property_setC | Set a property for a heading |
| emacs_org_exportC | Export org document to various formats |
| emacs_org_agendaC | Query org-agenda items |
| emacs_org_captureC | Create a new org entry using capture templates |
| emacs_org_searchC | Search org files for text or headings |
| emacs_git_statusA | Get git status (staged, unstaged, untracked files) |
| emacs_git_diffA | Get diff for staged, unstaged, or committed changes |
| emacs_git_logC | Get commit log |
| emacs_git_stageB | Stage file(s) for commit |
| emacs_git_unstageB | Unstage file(s) |
| emacs_git_commitC | Create a git commit with a message |
| emacs_git_branch_listC | List git branches |
| emacs_git_branch_currentB | Get current branch name |
| emacs_git_branch_checkoutC | Checkout a branch |
| emacs_git_stash_listA | List git stashes |
| emacs_git_stash_pushB | Create a new stash |
| emacs_git_stash_popB | Pop the latest stash |
| emacs_git_blameC | Show git blame for a file |
| emacs_ediff_filesB | Compare two files and return the diff |
| emacs_ediff_buffersC | Compare two buffers and return the diff |
| emacs_ediff_regionsB | Compare two text regions and return the diff |
| emacs_ediff_3wayA | Three-way comparison of files (useful for merge conflicts) |
| emacs_diff_summaryB | Get a summary of differences between two files or buffers |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| Emacs Buffers | List of all open Emacs buffers |
| Emacs Projects | List of known projects |
| Current Project | Information about the current project |
| Emacs Workspaces | List of workspaces/tabs |
| Current Workspace | Current workspace/tab name |
| Org Agenda | Today's agenda items |
| Org TODOs | All TODO items across org-agenda files |
| Org Files | List of org-agenda files |
| Capture Templates | Available org-capture templates |
| Git Status | Current git status (staged, unstaged, untracked files) |
| Git Branch | Current git branch information |
TDQS
Scored across 55 tools
Tools are mostly clearly separated by domain (buffer, file, project, workspace, org, git, ediff) and action, so an agent can generally tell them apart. However, a few near-overlaps exist, such as emacs_ediff_files/emacs_diff_summary both comparing files, and emacs_buffer_write vs emacs_buffer_edit with only subtle differences.
All 55 tools follow the exact same emacs_<domain>_<verb> snake_case pattern with no mixed conventions. Verb choices are semantically consistent within each domain (list, create, delete, switch, etc.), making the naming highly predictable.
With 55 tools, this dramatically exceeds the 25+ threshold for 'too many'. Even though Emacs is a broad application, this number creates heavy selection overhead and will likely overwhelm agents trying to choose among such a large surface area.
The set provides thorough lifecycle coverage for buffers, files, projects, workspaces, org documents, git operations, and diff comparisons. Each domain has create/read/update/delete or equivalent operations with no obvious dead ends for the implied scope of controlling Emacs.