Skip to main content
Glama
README.md
# mcp-lock-manager

An MCP server that provides file-level exclusive locking across multiple Claude Code instances. Prevents conflicts when multiple agents edit files in the same project simultaneously.

## How It Works

When multiple Claude Code sessions share a project, they can clobber each other's edits. This MCP server acts as a mutex — each session acquires a lock before editing a file and releases it when done. Locks are stored in a local `.locks/` directory using atomic filesystem operations.

Stale locks from crashed sessions are automatically detected via PID liveness checks and cleaned up.

## Setup

### 1. Install & Build

```bash
git clone https://github.com/maxwellplanck/mcp-lock-manager.git
cd mcp-lock-manager
npm install
npm run build
```

### 2. Configure Claude Code

Add to your `.claude/settings.json` (project or user-level):

```json
{
  "mcpServers": {
    "lock-manager": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-lock-manager/build/index.js", "--project-root", "/absolute/path/to/your/project"]
    }
  }
}
```

The `--project-root` flag tells the server which project directory to manage locks for. If omitted, it defaults to the current working directory.

You can also set the project root via environment variable:

```json
{
  "mcpServers": {
    "lock-manager": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-lock-manager/build/index.js"],
      "env": {
        "PROJECT_ROOT": "/absolute/path/to/your/project"
      }
    }
  }
}
```

## Tools

### `lock_acquire`

Acquire exclusive locks on one or more files before editing.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `paths` | `string[]` | Yes | Project-relative file paths (use forward slashes) |
| `owner` | `string` | No | Label for this session (e.g. `"Agent A"`) |

Acquires all-or-nothing — if any file is already locked by another live session, the entire request fails with conflict details.

### `lock_release`

Release file locks when done editing.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `paths` | `string[]` | No | Paths to release. Omit to release all locks for this session. |

### `lock_list`

List all active locks with owner, PID, alive status, and timestamp. Takes no parameters.

### `lock_cleanup`

Force-remove all stale locks held by dead processes. Takes no parameters. Useful when `lock_list` shows locks with `alive: false`.

## Adding to Your Workflow

For best results, add instructions to your project's `CLAUDE.md` telling Claude to use locks:

```markdown
## File Locking

This project uses mcp-lock-manager for multi-session coordination.
Before editing any file, acquire a lock with `lock_acquire`. Release locks with `lock_release` when done.
If a lock conflict occurs, do not proceed — wait or ask the other session to release.
```

## License

MIT

TDQS

A4.5/5.0

Scored across 4 tools

Disambiguation5/5

Each tool has a distinct purpose: acquire, release, list, and cleanup locks. No two tools overlap in functionality.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern (e.g., lock_acquire, lock_list), making them highly predictable.

Tool Count5/5

Four tools cover the essential operations of a lock manager without unnecessary additions or gaps.

Completeness5/5

The set provides full lifecycle management: acquire, release (including bulk), list, and cleanup of stale locks. No obvious missing operations.

Maintenance

ActivityInactive
ResponsivenessNo issues