Skip to main content
Glama
benyue1978

sublime_mcp_server

by benyue1978
README.md
# MCPServer

`MCPServer` is a Sublime Text package that exposes MCP tools over local HTTP from inside Sublime's Python runtime.

Today it ships with MCP tools for unsaved buffers:
- `list_open_buffers`
- `read_buffer`
- `close_buffer`

## Use Cases

- Read temporary scratch notes or prompts directly from open unsaved tabs.
- Summarize or refine a draft in an AI client, then send the result to another MCP such as Notion.
- Clean up working tabs by closing consumed scratch buffers via `close_buffer`.
- Build lightweight editor automations without saving throwaway notes to disk.

The architecture is fully in-process. By default it starts:
- Sublime bridge on `127.0.0.1:6123`
- MCP endpoint on `127.0.0.1:6124/mcp`

No separate Node or TypeScript MCP server is required.

## Requirements

- Sublime Text 4 build `4171` or newer
- Python 3.8 compatibility for the plugin package
- Python 3.11+ if you want to run the repo tests locally
- A local MCP client that can talk to a streamable HTTP MCP endpoint

## Project Layout

- `sublime_mcp_server/`: bridge logic and in-process MCP HTTP server
- `sublime_mcp_server_plugin.py`: Sublime Text plugin entrypoint
- `messages.json` and `messages/*.txt`: Package Control install and upgrade messages
- `python_tests/`: pytest coverage for bridge and MCP behavior

## Install The Sublime Plugin

For normal usage, install the packaged artifact into Sublime's `Installed Packages` folder.

On macOS:

```bash
mkdir -p "$HOME/Library/Application Support/Sublime Text/Installed Packages"
cp dist/MCPServer.sublime-package \
  "$HOME/Library/Application Support/Sublime Text/Installed Packages/MCPServer.sublime-package"
```

If you previously installed an unpacked development copy, remove it first so Sublime does not load the package twice:

```bash
rm -rf "$HOME/Library/Application Support/Sublime Text/Packages/MCPServer"
```

Restart Sublime Text after copying the files.

The packaged release includes the repository's tracked [.python-version](/Users/song.yue/git/sublime-mcp/.python-version) file at the package root so Sublime can select the correct Python runtime when loading the archive.

For local development, you can still use an unpacked checkout under `Packages/MCPServer`, but that is now a development-only workflow instead of the recommended installation method.

## Port Configuration

The package reads its host and port configuration from [MCPServer.sublime-settings](/Users/song.yue/git/sublime-mcp/MCPServer.sublime-settings).

Default values:

```json
{
  "bridge_host": "127.0.0.1",
  "bridge_port": 6123,
  "mcp_host": "127.0.0.1",
  "mcp_port": 6124
}
```

To override them in Sublime Text:

1. Open the command palette.
2. Run `Preferences: MCPServer Settings`.
3. Put your overrides in the right-hand user settings pane.
4. Restart Sublime Text.

Example:

```json
{
  "bridge_port": 7001,
  "mcp_port": 7002
}
```

The bridge and MCP ports must be different when using the same host.

## Package And Release

There are two common release paths for Sublime Text packages:

- Package Control default channel: publish this repo on GitHub, create a semantic version tag such as `0.2.5`, and submit the repository to Package Control once. After approval, future semver tags are how users receive updates.
- Custom distribution: build a `.sublime-package` archive and host your own `packages.json` channel if you do not want to use Package Control's default channel.

This repo now includes release-facing metadata:

- central package display name, MCP server name, version, and description in [sublime_mcp_server/__init__.py](/Users/song.yue/git/sublime-mcp/sublime_mcp_server/__init__.py)
- Package Control install and upgrade messages in [messages.json](/Users/song.yue/git/sublime-mcp/messages.json)
- release notes for `0.2.5` in [messages/0.2.5.txt](/Users/song.yue/git/sublime-mcp/messages/0.2.5.txt)

Suggested release checklist:

1. Update the version in [pyproject.toml](/Users/song.yue/git/sublime-mcp/pyproject.toml) and [sublime_mcp_server/__init__.py](/Users/song.yue/git/sublime-mcp/sublime_mcp_server/__init__.py).
2. Add a matching upgrade note under `messages/`.
3. Build a `.sublime-package` artifact from the repo root:

```bash
python3 scripts/build_release.py
```

4. Run `pytest` and `python3 -m py_compile sublime_mcp_server_plugin.py sublime_mcp_server/*.py`.
5. Commit the release changes.
6. Create and push a semver tag such as `0.2.5`.
7. If this is the first public release, submit the GitHub repository URL to Package Control.

For manual installs, use the generated `dist/MCPServer.sublime-package` file. The stable filename keeps the package name clean in Sublime, and the builder injects `package-metadata.json` so the description and version are visible in package UIs.

## Verify The Plugin Is Running

Once Sublime restarts, the plugin should start two localhost services:

- `GET http://127.0.0.1:6123/buffers`
- `POST http://127.0.0.1:6124/mcp`

Check the bridge:

```bash
curl -sf http://127.0.0.1:6123/buffers | python3 -m json.tool
```

Check the MCP endpoint:

```bash
curl -sf \
  -X POST http://127.0.0.1:6124/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"1.0.0"}}}' \
  | python3 -m json.tool
```

You should see `serverInfo.name` set to `sublime_mcp_server`.

If you changed the ports in settings, use those values instead of `6123` and `6124`.

## MCP Client Setup

This project serves MCP over HTTP from inside Sublime, so your MCP client only needs to connect to the plugin's endpoint.

Recommended MCP client configuration:

```json
{
  "mcpServers": {
    "sublime_mcp_server": {
      "type": "http",
      "url": "http://127.0.0.1:6124/mcp"
    }
  }
}
```

## Available Tools

### `list_open_buffers`

Lists unsaved open Sublime buffers. Each buffer descriptor includes:

- `buffer_id`
- `title`
- `window_id`
- `is_dirty`
- `syntax`
- `preview`

### `read_buffer`

Reads the current live text and metadata for one unsaved Sublime buffer.

Input:

```json
{
  "buffer_id": "38"
}
```

### `close_buffer`

Force-closes an unsaved Sublime buffer and discards its current contents.

Input:

```json
{
  "buffer_id": "38"
}
```

## Manual End-To-End Check

1. Open Sublime Text.
2. Create one or more new unsaved tabs.
3. Add some test text.
4. Verify the buffer list:

```bash
curl -sf http://127.0.0.1:6123/buffers | python3 -m json.tool
```

5. Use an MCP client or direct JSON-RPC request to list tools and read a buffer.

Direct JSON-RPC example:

```bash
curl -sf \
  -X POST http://127.0.0.1:6124/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' \
  | python3 -m json.tool
```

```bash
curl -sf \
  -X POST http://127.0.0.1:6124/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"read_buffer","arguments":{"buffer_id":"38"}}}' \
  | python3 -m json.tool
```

```bash
curl -sf \
  -X POST http://127.0.0.1:6124/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"close_buffer","arguments":{"buffer_id":"38"}}}' \
  | python3 -m json.tool
```

## Development

Run tests:

```bash
pytest
```

Check syntax:

```bash
python3 -m py_compile sublime_mcp_server_plugin.py sublime_mcp_server/*.py
```