终端MCP服务器

Forge是一款用于AI编码代理的终端MCP服务器,支持通过模型上下文协议生成、管理和监控真实的PTY会话。

  • by ferodrigop
  • TypeScript
  • 本地部署
  • 27 星标
  • 更新于
在 GitHub 查看 ferodrigop/forge

使用说明

Forge

Terminal MCP server for AI coding agents. Spawn, manage, and monitor real PTY sessions via the Model Context Protocol.

forgemcp.dev


为什么

AI编码代理(Claude Code、Codex等)通常一次运行一个命令。Forge为他们提供了持久的终端——并行运行React前端、Java API和Postgres迁移,监控这三个迁移,只读取更改的内容。全栈工作没有瓶颈。

适用于 任何兼容MCP的客户端 --Claude Code、Codex、Gemini CLI或您自己的代理。

主要差异化因素:

  • 真正的PTY 通过 node-pty (与VS Code终端相同的库)——交互式程序、颜色、TUI应用程序都可以工作
  • 增量读取 --带有每个消费者游标的环形缓冲区意味着每个 read_terminal 仅返回NEW输出,保存上下文窗口令牌
  • 清洁屏幕读数 — @xterm/headless 将终端呈现在服务器端,因此 read_screen 返回人类会看到的内容(没有ANSI转义码)
  • 多代理编排 --生成Claude、Codex和Gemini子代理、会话组、输出多路复用、事件订阅和用于管理多个并发会话的模板
  • Web仪表板 --基于Preact的实时浏览器用户界面,用于查看您的代理在所有终端上的活动,浏览过去的聊天会话,并监控活动
  • 零配置 --单身 npx 命令或HTTP MCP端点

安装

# bun (recommended)
bun install -g forge-terminal-mcp

# npm (requires Node.js ≥ 18)
npm install -g forge-terminal-mcp

# Or standalone binary (no Node.js required)
curl -fsSL https://forgemcp.dev/install.sh | sh

安装后 forge 命令在全局可用:

forge start              # Start the server
forge start -d           # Start as background daemon
forge start -d --dashboard --port 3141   # With web dashboard

更新

# bun
bun update -g forge-terminal-mcp

# npm
npm update -g forge-terminal-mcp

# Standalone binary — re-run the install script
curl -fsSL https://forgemcp.dev/install.sh | sh

# Desktop app updates automatically on restart

快速开始

1.添加到您的代理

Claude Code
# Recommended: auto-starts daemon and registers HTTP transport
forge setup --agent claude-code

# Or manually:
forge start -d                  # Start daemon in background
claude mcp add --transport http forge http://127.0.0.1:3141/mcp

注: 始终使用HTTP传输,以便Claude Code连接到正在运行的守护进程。这确保了会话出现在仪表板中,并避免了来自孤立进程的冲突。

Codex
# Add Forge as HTTP MCP server
codex mcp add forge --url http://127.0.0.1:3141/mcp

# Verify
codex mcp list
codex mcp get forge

Codex将其存储在 ~/.codex/config.toml:

[mcp_servers.forge]
url = "http://127.0.0.1:3141/mcp"
Gemini CLI
# Start Forge daemon first
npx forge-terminal-mcp start -d --dashboard --port 3141

# Add Forge as HTTP MCP server
gemini mcp add --transport http forge http://127.0.0.1:3141/mcp
HTTP MCP (any client)

启动守护进程(选择一种启动模式),然后将任何MCP客户端指向HTTP端点:

# If forge is on PATH (global install or npm link)
forge start -d

# From this repo (local clone)
node dist/cli.js start -d

# Without install (published package)
npx forge-terminal-mcp start -d
{
  "mcpServers": {
    "forge": {
      "type": "http",
      "url": "http://127.0.0.1:3141/mcp"
    }
  }
}

重新启动代理,Forge工具可用。

重要提示:Claude Code、Codex和Gemini CLI在进程启动时加载MCP服务器。如果添加/删除服务器,请重新启动当前代理会话。

2.烟雾测试(60秒)

# Codex MCP registration
codex mcp list
codex mcp get forge

# Forge daemon status
node dist/cli.js status

预期:

  • codex mcp list 显示 forge 已启用
  • node dist/cli.js status 报告运行和 http://127.0.0.1:3141

故障排除

症状 修复
forge: command not found 使用 node dist/cli.js ... 从回购根目录,或 npx forge-terminal-mcp ....
No MCP servers configured yet 在Codex 运行 codex mcp add forge --url http://127.0.0.1:3141/mcp,然后重新启动Codex。
listen EPERM ... 127.0.0.1:3141 在允许本地端口绑定的环境中运行Forge,或使用其他端口 --port 并更新MCP URL以匹配。
消息显示为已键入,但代理未应答 输入可能已排队;按 Enter (或使用 submit=true 当以编程方式编写时)。
MCP服务器已配置,但工具未显示 重新启动当前代理会话,以便MCP服务器重新加载。

3.使用它

您的代理现在可以访问7个类别的23个工具:

会话生命周期

create_terminal      → Spawn a PTY session with optional name, tags, buffer size
create_from_template → Spawn from a built-in template (shell, next-dev, vite-dev, etc.)
spawn_claude         → Launch a Claude Code sub-agent in a dedicated session
spawn_codex          → Launch a Codex sub-agent in a dedicated session
spawn_gemini         → Launch a Gemini CLI sub-agent in a dedicated session
close_terminal       → Kill a session and free resources
close_group          → Close all sessions matching a tag
list_terminals       → List sessions, optionally filtered by tag
list_templates       → Show available session templates

输入/输出

write_terminal       → Send input (appends newline by default)
read_terminal        → Read NEW output since last read (incremental)
read_screen          → Get rendered viewport as clean text (no ANSI)
read_multiple        → Batch read from up to 20 sessions at once
send_control         → Send Ctrl+C, arrow keys, Tab, Enter, etc.
resize_terminal      → Change terminal dimensions

搜索并等待

grep_terminal        → Regex search across a session's output buffer
wait_for             → Block until output matches a pattern or process exits

执行

run_command          → Run a command to completion, return output, auto-cleanup

事件

subscribe_events     → Get notified when a session exits or matches a pattern
unsubscribe_events   → Cancel an event subscription

代理委托

delegate_task        → Delegate a task to another agent — oneshot or interactive multi-turn

运维

health_check         → Server version, uptime, session count, memory usage
get_session_history  → Tool call history for agent sessions
clear_history        → Clear persisted stale session entries

对话示例

你: 启动Next.js开发服务器并并行运行测试套件

代理人: (使用 create_from_template 使用“下一个开发”, wait_for “就绪”,然后为创建第二个会话 npm test,使用 read_multiple 对两者进行投票)

你: 启动3个子代理来研究代码库的不同部分

代理人: (使用 spawn_claude 三次带有标签“research”,监视器带有 list_terminals 按标签过滤,用 close_group)

你: 构建和测试,把结果给我

代理人: (使用 run_command 随着 npm run build && npm test --创建终端,等待退出,返回输出,自动清理)

最佳实践

run_command 对比 create_terminal

使用 run_command 当你想要一个结果,之后不需要会话时:

  • 构建步骤(npm run build, cargo build)
  • 试运行(npm test, pytest)
  • 安装命令(npm install, pip install)
  • 干净退出的一次性脚本

使用 create_terminal 当你需要一个正在进行的会话时:

  • 开发服务器(npm run dev, vite, next dev)
  • 观察者(npm run watch, tsc --watch)
  • REPL或交互式流程
  • 您将轮询的长时间运行的流程 read_terminal
# Good — build is a one-shot task
run_command({ command: "npm run build && npm test" })

# Good — dev server needs to stay alive
create_terminal({ command: "npm run dev", name: "dev-server" })
wait_for({ id, pattern: "ready on" })

waitForExit vs模式匹配

使用 模式匹配 (默认)打印信号后进程保持活动状态时:

wait_for({ id, pattern: "Server running on port 3000" })
# returns as soon as the line appears — process keeps running

使用 waitForExit: true 当流程自然退出并且您想要所有输出时:

wait_for({ id, pattern: ".", waitForExit: true })
# waits for the process to finish, returns everything

fromSession 对于子代理

生成子代理以处理同一项目时,请使用 fromSession 而不是硬编码路径:

# Instead of this (brittle):
spawn_claude({ prompt: "...", cwd: "/Users/me/projects/my-app" })

# Do this (inherits cwd from current session):
spawn_claude({ prompt: "...", fromSession: currentSessionId })

这确保了即使在跨不同机器或工作树使用Forge时,子代理也能在正确的目录中工作。

并行代理的工作树

在同一代码库上运行多个代理时,请使用 worktree: true 隔离更改:

spawn_claude({ prompt: "Add auth", worktree: true, branch: "feature/auth" })
spawn_claude({ prompt: "Add payments", worktree: true, branch: "feature/payments" })
# Both agents work in parallel without stepping on each other

工具参考

create_terminal

参数 类型 默认值 说明
command string 用户的 $SHELL 运行命令
args string[] [] 命令参数
cwd string 进程cwd 工作目录
env 对象 {} 其他env变量(与进程env合并)
cols 编号 120 端子宽度
rows number 24 端子高度
name string -- 人类可读的会话名称
tags string[] -- 筛选/分组标签(最多10个)
bufferSize number 服务器默认值 环形缓冲区大小(以字节为单位)(1 KB–10 MB)

返回会话信息,包括 id 被所有其他工具使用。

create_from_template

参数 类型 默认值 说明
template 字符串 必需的 模板名称(请参见 list_templates)
cwd string -- 工作目录覆盖
env object -- 其他环境变量
name string 模板名称 会话名称覆盖

内置模板:

模板 命令 标签 等待
shell $SHELL shell --
next-dev npx next dev dev服务器,下一个 “就绪”
vite-dev npx vite dev服务器,vite “本地:”
docker-compose docker compose up docker --
npm-test npm test 测试 --
npm-test-watch npm run test:watch 测试,观看 --

模板与 waitFor 自动阻止,直到图案出现(30秒超时)。

spawn_claude

参数 类型 默认值 说明
prompt 字符串 必需的 提示发送给Claude
cwd string -- 工作目录(显式路径)
fromSession string -- 复制 cwd 从现有会话ID(设置的替代方案 cwd 手动)
model string -- 模型(例如,“十四行诗”、“小品”)
name string 提示自动 会话名称
tags string[] ["claude-agent"] 标签(始终包括克劳德代理)
maxBudget number -- 最大预算(美元)
bufferSize number 服务器默认值 环形缓冲区大小
worktree 布尔值 false 创建git工作树(隔离文件更改)
branch string -- 工作树的分支名称(当工作树为true时需要)
oneShot 布尔值 false 跑进去 --print 模式(进程提示和退出)

run_command

参数 类型 默认值 说明
command 字符串 必需的 运行命令(支持 && 链接)
cwd string -- 工作目录
timeout number 300000 超时(毫秒)(最多5分钟)

创建一个终端,等待进程退出,返回所有输出,并自动清理会话。非常适合构建/测试/安装命令。

write_terminal

参数 类型 默认值 说明
id 字符串 必需的 会话ID
input 字符串 必需的 要发送的文本
newline 布尔值 true 附录 \n 输入后

read_terminal

参数 类型 默认值 说明
id 字符串 必需的 会话ID

退货 { status, data, bytes, droppedBytes? }.仅返回自上次读取以来产生的输出。如果 droppedBytes > 0,由于环形缓冲区被包裹,一些输出丢失。

read_screen

参数 类型 默认值 说明
id 字符串 必需的 会话ID

以纯文本形式返回当前终端视口——通过无头xterm实例呈现。无ANSI规范。适用于TUI应用程序,如 htop, vim,或交互式提示。

read_multiple

参数 类型 默认值 说明
ids string[] 必需的 会话ID(1-20)
mode 字符串 "incremental" "incremental" 或 "screen"

返回一个包含每个会话结果的JSON数组。出现错误(例如,未找到)的会话包含内联 error 字段——该工具作为一个整体永远不会失败,因此总是返回部分结果。

grep_terminal

参数 类型 默认值 说明
id 字符串 必需的 会话ID
pattern 字符串 必需的 正则表达式模式
context number 0 每场比赛的上下文行数(0-10)

退货 { matches: [{ lineNumber, text, context? }], totalMatches }.

wait_for

参数 类型 默认值 说明
id 字符串 必需的 会话ID
pattern string -- 要等待的正则表达式模式
timeout number 30000 超时(毫秒)(100–300000)
waitForExit 布尔值 false 等待进程退出,而不是模式匹配

首先检查现有缓冲区(如果模式已经出现,则立即匹配),然后观察新的输出。退货 { matched, data?, reason?, elapsed }.

subscribe_events

参数 类型 默认值 说明
id 字符串 必需的 会话ID
events string[] 必需的 ["exit"] 和 ["pattern_match"]
pattern string -- 正则表达式(如果是必需的 pattern_match 在事件中)

通知以带有JSON有效载荷的MCP日志消息的形式传递。模式匹配订阅在第一次匹配后自动取消订阅。

unsubscribe_events

参数 类型 默认值 说明
subscriptionId 字符串 必需的 订阅ID来自 subscribe_events

list_terminals

参数 类型 默认值 说明
tag string -- 按标记筛选会话

返回所有会话 id, pid, command, cwd, status, cols, rows, createdAt, lastActivityAt, name, tags.

close_terminal

参数 类型 默认值 说明
id 字符串 必需的 会话ID

close_group

参数 类型 默认值 说明
tag 字符串 必需的 标签匹配

关闭具有匹配标记的所有活动会话。返回已关闭的计数。

send_control

参数 类型 默认值 说明
id 字符串 必需的 会话ID
key 字符串 必需的 控制密钥名称

可用密钥: ctrl+c, ctrl+d, ctrl+z, ctrl+\, ctrl+l, ctrl+a, ctrl+e, ctrl+k, ctrl+u, ctrl+w, ctrl+r, ctrl+p, ctrl+n, up, down, right, left, home, end, tab, enter, escape, backspace, delete, pageup, pagedown

resize_terminal

参数 类型 默认值 说明
id 字符串 必需的 会话ID
cols 编号 必需的 新宽度(1–500)
rows 编号 必需的 新高度(1-200)

health_check

没有参数。退货 { version, uptime, sessions: { active, max }, memory: { rss, heapUsed, heapTotal } }.

get_session_history

参数 类型 默认值 说明
id 字符串 必需的 会话ID

返回代理会话(Claude、Codex)的带时间戳的工具调用历史记录。

clear_history

没有参数。从以前的服务器运行中清除持久的过时会话条目。

MCP资源

会话也作为MCP资源公开在 terminal://sessions/{sessionId},返回会话元数据和渲染的屏幕内容。创建或关闭会话时,资源列表会自动更新。

网络仪表盘

启用实时web仪表板从浏览器监视所有终端:

{
  "mcpServers": {
    "forge": {
      "command": "npx",
      "args": ["forge-terminal-mcp", "--dashboard", "--port", "3141"]
    }
  }
}

打开 http://localhost:3141 查看:

  • 实时终端会话 通过WebSocket实时输出
  • 会话分组 --按工作目录组织的终端
  • 活动日志 --代理会话的工具调用和事件
  • 状态栏 --工作目录、会话ID、运行/退出状态
  • 聊天历史浏览器 --搜索、浏览并继续按项目分组的Claude Code和Codex对话
  • 会话管理 --创建、关闭和切换终端
  • 自动跟随模式 --自动切换到新创建的会话
  • 内存监控 --每个会话和总RAM使用率

如果 --auth-token 启用后,使用打开仪表板 ?token=YOUR_TOKEN 因此浏览器API/WebSocket调用被授权。

仪表板使用Preact+htm+Preact Signals构建,从CDN加载,构建步骤为零。所有UI代码都作为字符串常量捆绑在服务器二进制文件中。

桌面应用程序(macOS)

备注:预构建的macOS应用程序目前无法进行常规下载。macOS要求应用程序使用Apple Developer证书(99美元/年)进行代码签名,然后才能在没有安全警告的情况下打开。我们正在进行此设置——与此同时,您可以从源代码运行桌面应用程序(见下文),也可以通过以下方式使用CLI npx forge-terminal-mcp.

Forge包括一个基于Electron的macOS桌面应用程序,具有原生窗口管理、系统托盘和通知功能。

在发展中奔跑

npm run build                    # Build forge core
cd desktop && npm install        # Install Electron deps
npx @electron/rebuild            # Rebuild node-pty for Electron
npm run dev                      # Launch the desktop app

或者从repo根目录: npm run desktop:dev

特性

  • 集成交通灯的原生macOS标题栏
  • 带有会话计数的系统托盘,新终端,从登录切换开始
  • 靠近托盘(窗口关闭时应用程序仍在运行)
  • 会话创建/退出时的本地通知
  • 重启后的窗口状态持久性
  • 自动检测现有的CLI守护进程--连接到它或在进程内启动
  • 通过GitHub Release自动更新(静默下载,重启时安装)
  • 安全强化:沙盒渲染器、导航锁、CSP、拒绝所有权限

包装

cd desktop
npm run package          # Build DMG + ZIP

生成签名 Forge.app 在 desktop/release/。需要Apple Developer证书进行公证(请参阅 desktop/forge.entitlements.plist).

配置

所有设置都遵循优先级: CLI标志>环境变量>默认值.

标志 环境变量 默认值 描述
--max-sessions FORGE_MAX_SESSIONS 10 最大并发PTY会话数
--idle-timeout FORGE_IDLE_TIMEOUT 1800000 会话空闲超时(毫秒)(30分钟)
--buffer-size FORGE_BUFFER_SIZE 1048576 每个会话的环形缓冲区大小(1 MB)
--shell SHELL /bin/bash 默认shell create_terminal
--claude-path FORGE_CLAUDE_PATH claude Claude CLI二进制文件的路径
--auth-token FORGE_AUTH_TOKEN unset 需要Bearer令牌 /mcp, /api,以及 /ws
--dashboard FORGE_DASHBOARD 关闭 启用web仪表板
--port FORGE_DASHBOARD_PORT 3141 仪表板端口
--verbose -- off 启用stderr的调试日志记录

自定义配置示例:

{
  "mcpServers": {
    "forge": {
      "command": "npx",
      "args": ["forge-terminal-mcp", "--max-sessions", "20", "--idle-timeout", "3600000", "--dashboard"]
    }
  }
}

建筑

MCP Client   <--HTTP-->  MCP Server (23 tools + 1 resource)
(Claude Code,
 Codex, etc)
                              |
                         SessionManager
                         (lifecycle, groups, persistence)
                              |
                    +---------+---------+
                    v         v         v
               TerminalSession    TerminalSession    ...
               +---------------+
               |   node-pty     |  <-- real PTY (colors, signals, TUI)
               |  RingBuffer    |  <-- 1 MB circular, per-consumer cursors
               | @xterm/headless|  <-- server-side rendering
               +---------------+
                              |
              +---------------+---------------+
              v               v               v
         MCP Client      Dashboard WS    Event Subs
         (incremental)   (live stream)   (notifications)
  • 单个Node.js进程 --MCP服务器通过HTTP进行通信(可流式传输)
  • 所有日志记录到stderr --stdout是为MCP协议保留的
  • 每个会话的环形缓冲区 --1 MB循环缓冲区,支持基于光标的读取。当缓冲区填满时,旧数据将被覆盖 droppedBytes 告诉消费者损失了多少
  • 每节课无头xterm --全终端仿真服务器端。 read_screen 返回渲染的视口,正确处理光标定位、交替屏幕、换行
  • 空闲超时 --会话在30分钟不活动后自动关闭(可配置)
  • 会话保持 --会话元数据已保存到 ~/.forge/sessions.json,重新启动时作为过时条目重新加载
  • 事件系统 --订阅会话退出或模式匹配事件,作为MCP日志消息传递
  • 代理环境剥离 --生成的终端具有特定于代理的环境变量(例如。, CLAUDECODE)删除以防止嵌套错误

发展

git clone https://github.com/ferodrigop/forge-terminal-mcp.git
cd forge-terminal-mcp
npm install
npm run build       # Compile with tsup
npm test            # 161 tests (unit + integration)
npm run typecheck   # TypeScript strict mode
npm run lint        # ESLint
npm run dev         # Watch mode

项目结构

src/
  cli.ts                        # Entry point, arg parsing, daemon management
  server.ts                     # McpServer + 22 tool registrations + resources
  core/
    types.ts                    # ForgeConfig, SessionInfo, defaults
    ring-buffer.ts              # Circular buffer with multi-consumer cursors
    terminal-session.ts         # PTY + headless xterm + ring buffer
    session-manager.ts          # CRUD, max sessions, groups, persistence
    state-store.ts              # ~/.forge/sessions.json persistence
    templates.ts                # Built-in session templates
    claude-chats.ts             # Claude Code chat session discovery
    command-history.ts          # Tool call history tracking
  dashboard/
    dashboard-server.ts         # HTTP + WebSocket + MCP transport server
    dashboard-html.ts           # HTML assembler (imports frontend parts)
    ws-handler.ts               # WebSocket message handling
    frontend/
      styles.ts                 # CSS styles (Tokyo Night theme)
      state.ts                  # Preact Signals + WebSocket + chat API
      utils.ts                  # timeAgo, formatSize, formatToolBlock
      app.ts                    # Root App component + JS concatenation
      assets.ts                 # Base64-embedded favicon + logo
      components/
        sidebar.ts              # Session list, chat browser, connection status
        terminal-view.ts        # XTerm container, activity log, status bar
        chat-view.ts            # Chat message viewer with bubbles
        modals.ts               # New terminal + delete chat modals
  utils/
    logger.ts                   # stderr-only JSON logger
    config.ts                   # CLI flags > env vars > defaults
    control-chars.ts            # Named key -> escape sequence map
    daemon.ts                   # Daemon lifecycle (PID, port, lock files)
desktop/
  main/
    index.ts                    # Electron main process entry
    daemon.ts                   # Forge server lifecycle (start/detect existing)
    window.ts                   # BrowserWindow + state persistence
    preload.ts                  # Context bridge (forgeDesktop API)
    tray.ts                     # System tray + context menu
    menu.ts                     # macOS application menu
    notifications.ts            # Native notification bridge
    auto-launch.ts              # Login item registration
    html-server.ts              # Lightweight HTTP server for desktop HTML
    daemon-bridge.ts            # WebSocket relay to existing daemon
    updater.ts                  # Auto-update via GitHub Releases
  electron-builder.yml          # Build config (DMG, universal binary)
  forge.entitlements.plist      # macOS entitlements
test/
  unit/                         # ring-buffer, config, control-chars, state-store, templates
  integration/                  # terminal-session, session-manager, mcp-tools E2E

测试覆盖率

套件 测试 封面
环形缓冲区 13 循环写入、多消费者、环绕、丢弃字节
Config 10 CLI解析、环境变量、默认值、优先级、codex路径
控制字符 6 密钥解析,不区分大小写,未知密钥
State Store 4 加载/保存往返,损坏处理
模板 3 查找,未知模板,列出所有模板
流JSON解析器 11 Claude事件解析,工具使用提取
终端会话 8 PTY生成、读/写、屏幕渲染、调整大小、退出
会话管理器 7 CRUD,最大限制,关闭所有过时条目
MCP工具E2E 51 所有23个工具通过MCP客户端端到端
Forge 0.7功能 28 Codex派生、工作树、仪表板API、聊天历史
命令历史 6 事件跟踪、检索、清理
Claude Chats 14 会话发现、消息解析、搜索
总计 161

需求

  • Node.js>=18
  • macOS、Linux或Windows(任何地方 node-pty 构建)

许可证

麻省理工学院