Skip to main content
Glama
nexon33

Electron Terminal MCP Server

by nexon33
README.md
# Electron Terminal MCP Server

In an ideal world vendors would provide their own MCP integration for the terminal, but in the meantime this project provides a Model Context Protocol (MCP) server that allows clients to interact with a system terminal running within an Electron application. It enables executing commands, managing terminal sessions, and retrieving output programmatically.

<a href="https://glama.ai/mcp/servers/@nexon33/console-terminal-mcp-server">
  <img width="380" height="200" src="https://glama.ai/mcp/servers/@nexon33/console-terminal-mcp-server/badge" alt="Electron Terminal Server MCP server" />
</a>

The system consists of two main parts:

*   **MCP Server (`index.js`):** A Node.js script that listens for MCP requests via standard input/output (stdio). It uses the `@modelcontextprotocol/sdk` and acts as a bridge to the Electron backend. It automatically starts the Electron backend if it's not already running. It requires [`mcp-package.json`](mcp-package.json:1) to specify `"type": "module"`.
*   **Electron Backend (`main.js`):** The main process for the Electron application. It runs an Express HTTP server (defaulting to port 3000) that the MCP server (`index.js`) communicates with for health checks and API calls. This backend manages the actual terminal processes using `node-pty` within hidden `BrowserWindow` instances loading [`terminal.html`](terminal.html:0).

## 2. Screenshots

Here's how the terminal interaction looks within a client like Claude Desktop:

**Claude Desktop Window with Terminal Output:**
![Claude Desktop Window with Terminal Output](claude-desktop-window.png)

**Individual Electron Terminal Window:**
![Electron Terminal Window](terminal-window.png)

## 3. Installation

1.  **Prerequisites:** Ensure you have Node.js and npm installed.
2.  **Clone:** Clone the repository if you haven't already.
    ```bash
    git clone <your-repository-url>
    cd command-terminal-electron # Or your repository directory name
    ```
3.  **Install Dependencies:** Install Node modules for both the MCP server and the Electron app.
    ```bash
    npm install
    ```
4.  **Rebuild Native Modules:** Rebuild native modules (like `node-pty`) for Electron.
    ```bash
    node rebuild.js
    ```
    *(See [`rebuild.js`](rebuild.js:1) for details)*

## 3. Usage

1.  **Start the MCP Server:**
    Run the `index.js` script using Node.js. This will listen for MCP commands on stdio and automatically attempt to start the Electron backend process (`main.js`) if it's not already running and listening on the expected HTTP port.
    ```bash
    node index.js
    ```
    *Note: The Electron process runs hidden in the background and automatically gets (re)started whenever its needed and will always be reused if possible.*

2.  **Interacting via MCP:**
    Clients connect to the `node index.js` process via stdio and use the `use_mcp_tool` command. The server name is defined in [`index.js`](index.js:182) as "Electron Terminal".

    **Available Tools:**

    *   **`terminal_start`**: Creates a new terminal session and executes an initial command.
        *   **Input:** `{ "command": "string" }`
        *   **Output:** `{ "content": [...], "sessionId": "string" }`
        ```xml
        <use_mcp_tool>
          <server_name>Electron Terminal</server_name>
          <tool_name>terminal_start</tool_name>
          <arguments>
          {
            "command": "ls -l"
          }
          </arguments>
        </use_mcp_tool>
        ```

    *   **`terminal_execute`**: Executes a command in an existing session.
        *   **Input:** `{ "command": "string", "sessionId": "string" }`
        *   **Output:** `{ "content": [...] }` (Session ID is included in the text content)
        ```xml
        <use_mcp_tool>
          <server_name>Electron Terminal</server_name>
          <tool_name>terminal_execute</tool_name>
          <arguments>
          {
            "sessionId": "session_id_from_start",
            "command": "pwd"
          }
          </arguments>
        </use_mcp_tool>
        ```

    *   **`terminal_get_output`**: Retrieves the accumulated output for a session.
        *   **Input:** `{ "sessionId": "string" }`
        *   **Output:** `{ "content": [...] }`
        ```xml
        <use_mcp_tool>
          <server_name>Electron Terminal</server_name>
          <tool_name>terminal_get_output</tool_name>
          <arguments>
          {
            "sessionId": "session_id_from_start"
          }
          </arguments>
        </use_mcp_tool>
        ```

    *   **`terminal_stop`**: Terminates a specific terminal session process.
        *   **Input:** `{ "sessionId": "string" }`
        *   **Output:** `{ "content": [...] }`
        ```xml
        <use_mcp_tool>
          <server_name>Electron Terminal</server_name>
          <tool_name>terminal_stop</tool_name>
          <arguments>
          {
            "sessionId": "session_id_from_start"
          }
          </arguments>
        </use_mcp_tool>
        ```

    *   **`terminal_get_sessions`**: Lists all currently active sessions managed by the Electron backend.
        *   **Input:** `{}`
        *   **Output:** `{ "content": [...] }` (Content contains a JSON string of active sessions)
        ```xml
        <use_mcp_tool>
          <server_name>Electron Terminal</server_name>
          <tool_name>terminal_get_sessions</tool_name>
          <arguments>
          {}
          </arguments>
        </use_mcp_tool>
        ```

## 5. Synergy with Filesystem MCP Server

This Electron Terminal MCP server works very effectively in conjunction with the [Filesystem MCP Server](https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem). You can use the Filesystem server to browse directories, read/write files, and then use this terminal server to execute commands within those directories or related to those files, providing a comprehensive remote development and interaction experience that works seamlessly together with for example the internet search function built into claude desktop.

## 6. Requirements

*   Node.js (v20 or later recommended, I use node 22)
*   npm
*   Operating System compatible with Electron (Windows, macOS, Linux)

## 7. Configuration

### Claude Desktop MCP Server Configuration

#### Location

The `claude_desktop_config.json` file should be placed in your user's AppData directory:

- **Windows:**
  `C:\Users\<username>\AppData\Roaming\Claude\claude_desktop_config.json`

This file is used by Claude Desktop to discover and configure external MCP servers.

#### Purpose and Structure

The configuration file defines MCP servers that Claude Desktop can launch and connect to. Each server entry specifies how to start the server process.

- **`mcpServers`**:
  An object where each key is a server name and the value is its launch configuration.

- **Server Configuration Example (`command-terminal`)**:
  - **`command`**: The executable to run (e.g., `node` for Node.js servers).
  - **`args`**: An array of arguments passed to the command (e.g., the path to your MCP server script).

#### Example

```json
{
  "mcpServers": {
    "command-terminal": {
      "command": "node",
      "args": [
        "C:\\Path\\to\\index.js"
      ]
    }
  }
}
```

#### Field Explanations

- **`mcpServers`**:
  Top-level object mapping server names to their configurations.

- **`command-terminal`**:
  Example server name. You can define multiple servers in this object.

- **`command`**:
  The executable used to launch the MCP server.

- **`args`**:
  Arguments passed to the command, such as the path to your server script.

## 8. License

This project is licensed under the MIT License. See the LICENSE file for details.

TDQS

C2.2/5.0

Scored across 5 tools

Disambiguation5/5

Each tool name maps to a distinct lifecycle action: start, execute, get output, stop, and list sessions. Even without descriptions, the boundaries are clear and unlikely to cause misselection.

Naming Consistency5/5

All tool names follow the same terminal_verb pattern using snake_case. The convention is uniform and predictable across the entire set.

Tool Count5/5

Five tools is a well-scoped size for a terminal management server. Each tool covers a necessary operation without redundancy or bloat.

Completeness5/5

The set covers the full terminal session lifecycle: create, interact, read output, stop, and enumerate sessions. There are no obvious dead ends or missing core operations.

Maintenance

ActivityInactive
ResponsivenessNo issues