使用说明
Forge
Terminal MCP server for AI coding agents. Spawn, manage, and monitor real PTY sessions via the Model Context Protocol.
为什么
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构建)
许可证
麻省理工学院
