Skip to main content
Glama

emacs-mcp

An MCP (Model Context Protocol) server that bridges Claude Code with Emacs via emacsclient.

Features

Phase 1: Core (Buffer & Eval)

Tool

Description

emacs_eval

Execute arbitrary Elisp code

emacs_buffer_read

Read contents of a buffer

emacs_buffer_write

Write/replace content in a buffer

emacs_buffer_edit

Apply targeted edits (find and replace)

emacs_buffer_list

List all open buffers

emacs_buffer_switch

Switch to a buffer

emacs_buffer_create

Create a new buffer

emacs_buffer_kill

Close/kill a buffer

Phase 2: File & Project Operations

Tool

Description

emacs_file_open

Open a file (with optional line/column)

emacs_file_save

Save buffer to file

emacs_file_save_as

Save buffer to new path

emacs_file_info

Get file metadata

emacs_project_list

List known projects

emacs_project_current

Get current project info

emacs_project_switch

Switch to a project

emacs_project_files

List files in project

emacs_project_search

Search files by pattern

emacs_workspace_list

List workspaces/tabs

emacs_workspace_current

Get current workspace

emacs_workspace_switch

Switch workspace

emacs_workspace_create

Create new workspace

emacs_workspace_delete

Delete workspace

emacs_workspace_save

Save workspace state

Phase 3: Org-mode Integration

Tool

Description

emacs_org_read

Read org document (raw or parsed structure)

emacs_org_write

Write content to org buffer

emacs_org_heading_add

Add a new heading

emacs_org_heading_update

Update heading title/content

emacs_org_heading_delete

Delete a heading and subtree

emacs_org_heading_move

Move heading (up/down/promote/demote)

emacs_org_todo_set

Set TODO state for a heading

emacs_org_todo_list

List all TODO items

emacs_org_tag_set

Set tags for a heading

emacs_org_property_set

Set a property for a heading

emacs_org_export

Export to html/pdf/markdown/latex/ascii/odt

emacs_org_agenda

Query agenda (day/week/month)

emacs_org_capture

Create entry via capture template

emacs_org_search

Search org files (text/heading/tag/property)

Phase 4: Git/Magit Integration

Tool

Description

emacs_git_status

Get git status (staged, unstaged, untracked)

emacs_git_diff

Get diff (staged/unstaged/committed)

emacs_git_log

Get commit log

emacs_git_stage

Stage files for commit

emacs_git_unstage

Unstage files

emacs_git_commit

Create a commit

emacs_git_branch_list

List branches

emacs_git_branch_current

Get current branch

emacs_git_branch_checkout

Checkout a branch

emacs_git_stash_list

List stashes

emacs_git_stash_push

Create a stash

emacs_git_stash_pop

Pop a stash

emacs_git_blame

Show git blame for a file

Phase 5: Ediff & Comparison

Tool

Description

emacs_ediff_files

Compare two files (unified/context/side-by-side)

emacs_ediff_buffers

Compare two buffers

emacs_ediff_regions

Compare two text strings

emacs_ediff_3way

Three-way file comparison (for merges)

emacs_diff_summary

Get summary of differences

Resources

URI

Description

emacs://buffers

List of all open buffers

emacs://buffer/{name}

Contents of a buffer

emacs://projects

List of known projects

emacs://project/current

Current project info

emacs://project/{path}/files

Files in a project

emacs://workspaces

List of workspaces

emacs://workspace/current

Current workspace

emacs://org/agenda

Today's agenda items

emacs://org/todos

All TODO items

emacs://org/files

Org-agenda files

emacs://org/capture-templates

Available capture templates

emacs://git/status

Current git status

emacs://git/branch

Current branch info

Compatibility

  • Vanilla Emacs: Uses project.el and tab-bar-mode

  • Doom Emacs: Uses projectile and +workspace (auto-detected)

Related MCP server: claude-bridge

Prerequisites

  1. Emacs 28+ with daemon support

  2. Node.js 18+

  3. Running Emacs daemon:

    emacs --daemon

Installation

npm install
npm run build

Configuration

Add to your Claude Code .mcp.json:

{
  "mcpServers": {
    "emacs": {
      "command": "node",
      "args": ["/path/to/emacs-mcp/dist/index.js"],
      "env": {
        "EMACS_SOCKET": "/run/user/1000/emacs/server",
        "EMACSCLIENT_PATH": "/usr/bin/emacsclient"
      }
    }
  }
}

Environment Variables

Variable

Description

Default

EMACS_SOCKET

Path to Emacs daemon socket

Auto-detect

EMACSCLIENT_PATH

Path to emacsclient binary

emacsclient

EMACS_TIMEOUT

Default timeout for operations (ms)

5000

EMACS_ORG_DIRECTORY

Org files directory

~/org

Usage Examples

Claude: Read the contents of the *scratch* buffer
> Uses emacs_buffer_read tool

Claude: List all open buffers
> Uses emacs_buffer_list tool

Claude: Evaluate (+ 1 2 3) in Emacs
> Uses emacs_eval tool

Claude: What projects do I have open?
> Uses emacs_project_list tool

Claude: Switch to workspace "main"
> Uses emacs_workspace_switch tool

Claude: Open /path/to/file.ts at line 42
> Uses emacs_file_open tool

Claude: Show me my TODO items
> Uses emacs_org_todo_list tool

Claude: Add a TODO heading "Review PRD" to notes.org
> Uses emacs_org_heading_add tool

Claude: What's on my agenda this week?
> Uses emacs_org_agenda tool

Claude: Export my notes.org to PDF
> Uses emacs_org_export tool

Claude: What's my git status?
> Uses emacs_git_status tool

Claude: Show me the recent commits
> Uses emacs_git_log tool

Claude: Stage all changes and commit
> Uses emacs_git_stage and emacs_git_commit tools

Claude: What branch am I on?
> Uses emacs_git_branch_current tool

Claude: Compare file.ts with file.ts.bak
> Uses emacs_ediff_files tool

Claude: Show me the differences between these two buffers
> Uses emacs_ediff_buffers tool

Claude: Do a three-way merge comparison
> Uses emacs_ediff_3way tool

Development

# Watch mode
npm run dev

# Run tests
npm test

# Lint
npm run lint

Roadmap

See PRD.md for full roadmap:

  • Phase 1: Core Infrastructure (MVP)

  • Phase 2: File & Project Operations

  • Phase 3: Org-mode Integration

  • Phase 4: Git/Magit Integration

  • Phase 5: Ediff & Advanced Features

License

MIT

Available Tools

55 tools
emacs_buffer_createC

Create a new buffer

Inputs: name (required), mode, content.

emacs_buffer_editC

Apply targeted edits to a buffer (find and replace)

Inputs: buffer (required), new_text (required), old_text (required), save.

emacs_buffer_killC

Close/kill a buffer

Inputs: buffer (required), force.

emacs_buffer_listA

List all open buffers with metadata

Inputs: include_hidden.

emacs_buffer_readC

Read the contents of an Emacs buffer

Inputs: buffer (required).

emacs_buffer_switchA

Switch to a specific buffer (make it current)

Inputs: buffer (required).

emacs_buffer_writeC

Write/replace content in an Emacs buffer

Inputs: buffer (required), content (required), save.

emacs_diff_summaryB

Get a summary of differences between two files or buffers

Inputs: source (required), target (required), type.

emacs_ediff_3wayA

Three-way comparison of files (useful for merge conflicts)

Inputs: file_a (required), file_b (required), file_ancestor (required), format.

emacs_ediff_buffersC

Compare two buffers and return the diff

Inputs: buffer_a (required), buffer_b (required), format, context_lines.

emacs_ediff_filesB

Compare two files and return the diff

Inputs: file_a (required), file_b (required), format, context_lines.

emacs_ediff_regionsB

Compare two text regions and return the diff

Inputs: text_a (required), text_b (required), format, label_a, +2 more.

emacs_evalB

Execute Emacs Lisp code and return the result

Inputs: code (required), timeout.

emacs_file_infoA

Get information about a file (exists, readable, writable, size, etc.)

Inputs: path (required).

emacs_file_openC

Open a file in Emacs

Inputs: path (required), line, column.

emacs_file_saveB

Save the current or specified buffer to file

Inputs: buffer.

emacs_file_save_asB

Save buffer to a new file path

Inputs: path (required), buffer (required).

emacs_git_blameC

Show git blame for a file

Inputs: file (required), end_line, start_line.

emacs_git_branch_checkoutC

Checkout a branch

Inputs: branch (required), create.

emacs_git_branch_currentB

Get current branch name

Inputs: no named parameters.

emacs_git_branch_listC

List git branches

Inputs: all.

emacs_git_commitC

Create a git commit with a message

Inputs: message (required), amend.

emacs_git_diffA

Get diff for staged, unstaged, or committed changes

Inputs: type (required), file, commit.

emacs_git_logC

Get commit log

Inputs: file, count, branch, format.

emacs_git_stageB

Stage file(s) for commit

Inputs: files.

emacs_git_stash_listA

List git stashes

Inputs: no named parameters.

emacs_git_stash_popB

Pop the latest stash

Inputs: index.

emacs_git_stash_pushB

Create a new stash

Inputs: message, include_untracked.

emacs_git_statusA

Get git status (staged, unstaged, untracked files)

Inputs: repo_path.

emacs_git_unstageB

Unstage file(s)

Inputs: files.

emacs_org_agendaC

Query org-agenda items

Inputs: span, filter.

emacs_org_captureC

Create a new org entry using capture templates

Inputs: template (required), title, content.

emacs_org_exportC

Export org document to various formats

Inputs: buffer (required), format (required), async, output_path.

emacs_org_heading_addB

Add a new heading to an org document

Inputs: level (required), title (required), buffer (required), tags, +3 more.

emacs_org_heading_deleteB

Delete a heading and its subtree

Inputs: buffer (required), heading (required).

emacs_org_heading_moveC

Move a heading up, down, or change its level

Inputs: buffer (required), heading (required), direction (required).

emacs_org_heading_updateC

Update an existing heading (title, content, or properties)

Inputs: buffer (required), heading (required), new_title, new_content, +1 more.

emacs_org_property_setC

Set a property for a heading

Inputs: value (required), buffer (required), heading (required), property (required).

emacs_org_readB

Read org document content with optional parsed structure

Inputs: buffer (required), format.

emacs_org_tag_setB

Set tags for a heading

Inputs: tags (required), buffer (required), heading (required).

emacs_org_todo_listB

List all TODO items in a buffer or across org files

Inputs: state, buffer.

emacs_org_todo_setB

Set TODO state for a heading

Inputs: state (required), buffer (required), heading (required).

emacs_org_writeC

Write/replace content in an org buffer

Inputs: buffer (required), content (required), save.

emacs_project_currentA

Get the current project root and name

Inputs: no named parameters.

emacs_project_filesB

List files in the current or specified project

Inputs: path, limit.

emacs_project_listA

List known projects (supports both project.el and projectile)

Inputs: no named parameters.

emacs_project_switchC

Switch to a different project

Inputs: path (required).

emacs_workspace_createC

Create a new workspace/tab

Inputs: name (required).

emacs_workspace_currentA

Get the current workspace/tab name

Inputs: no named parameters.

emacs_workspace_deleteB

Delete a workspace/tab

Inputs: name (required).

emacs_workspace_listA

List all workspaces/tabs

Inputs: no named parameters.

emacs_workspace_saveC

Save workspace state

Inputs: no named parameters.

emacs_workspace_switchB

Switch to a workspace/tab by name or index

Inputs: name, index.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.3/5.0

    Scored across 55 tools

    Disambiguation4/5

    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.

    Naming Consistency5/5

    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.

    Tool Count2/5

    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.

    Completeness5/5

    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.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers