远程执行mcp
remote-exec-mcp 是用于运行Codex风格本地的远程第一MCP服务器 多台Linux和Windows机器上的系统工具。代理连接到一个 代理,选择一个明确的目标,并使用熟悉的工具进行命令 执行、stdin、修补、图像读取、文件传输和TCP/UDP转发。
工具界面和行为受到以下因素的影响 法典,但此存储库是单独的 代理加上每台机器的守护进程实现。
一切都在 docs/ 是历史实施细节和规划 上下文,而不是现场行为契约。目前的真相来源:
- 这
README.md AGENTS.mdconfigs/*.example.tomlskills/using-remote-exec-mcp/SKILL.md- 公共模式
crates/remote-exec-proto/src/
状态
已实施的公共MCP工具:
list_targetsexec_commandwrite_stdinapply_patchview_imagetransfer_filesforward_ports
已实施的传输和运行时间:
- 通过stdio或流式HTTP代理MCP
- 默认情况下,Rust守护进程通过双向TLS,或显式纯HTTP
- 经纪人主机
local嵌入式本地exec/patch/image工作流的目标 - 经纪人主机
local用于传输的文件系统端点 - 经纪人主机
local用于端口转发的网络侧 remote-exec用于代理配置或流式HTTP使用的CLI客户端- POSIX和Windows XP兼容主机的独立C++11守护进程
实时执行会话和实时端口转发处于内存运行时状态。经纪人 restart公开 session_id 和 forward_id 映射。守护进程重新启动 删除守护进程本地命令会话和转发套接字。
组件
remote-exec-broker:公共MCP服务器。它验证目标名称、路由
调用守护进程或代理主机本地运行时,拥有公共 session_id 和 forward_id 命名空间,并且可以通过stdio或流式HTTP为MCP提供服务。
remote-exec:从代理机箱构建的CLI客户端。它可以加载代理
进程内配置和调用处理程序,或连接到正在运行的流式HTTP 经纪人。
remote-exec-daemon:每台机器的Rust守护进程。它执行命令,管理
会话、应用补丁、读取图像、导入/导出传输档案, 检查静态路径沙盒规则,并为v4端口前向升级隧道提供服务。
remote-exec-host:共享Rust主机运行时,由Rust守护进程和
经纪人主机 local 目标。
remote-exec-daemon-cpp:具有本机的独立纯HTTP C++11守护进程
POSIX、MinGW Windows XP兼容、主机原生MSVC和MSVC v141xP兼容的构建路径。
remote-exec-proto:公共MCP模式、代理守护进程RPC模式、路径和
沙盒助手和端口转发协议类型。
remote-exec-admin:用于证书/引导工作流的管理CLI。remote-exec-pki:可重用的PKI生成和清单帮助程序。
建筑
代理人只与经纪人交谈。每个配置的目标指向一个守护进程,以及 代理执行目标验证、身份检查、路由、结果 包括数据存储、格式化和运行时ID映射。
重要不变量:
list_targets是代理本地缓存库存。它不会在以下位置探测守护进程
阅读时间。
- 仍然可以配置暂时无法访问的目标。经纪人可以开始
成功并在第一次转发呼叫之前验证该目标。
- 公共
session_id值是代理拥有的不透明令牌,而不是守护进程
ID或守护进程本地会话ID。
- 公共
forward_id值是代理拥有的不透明令牌,而不是守护进程本地令牌
隧道ID。
- 目标选择是安全边界的一部分。会话或转发已打开
因为一个目标对另一个目标无效。
- 代理守护进程RPC使用HTTP/1.1 JSON。端口转发使用守护进程专用
HTTP/1.1升级隧道。
forward_portsv4使用X-Remote-Exec-Port-Tunnel-Version: 4头球
匹配不区分大小写;协议版本为 4.
- v4帧编号20和21被保留为
ForwardRecovering和
ForwardRecovered。公共恢复状态目前通过以下方式报告 经纪人拥有 forward_ports list 领域。
配置
从以下内容开始:
configs/broker.example.tomlconfigs/daemon.example.tomlcrates/remote-exec-daemon-cpp/config/daemon-cpp.example.ini
Broker配置包括:
- MCP传输:默认情况下为stdio,或可流式传输HTTP
listen和path - 一
[targets.]每个守护进程目标条目 - 守护程序基本URL和预期的守护程序目标名称
- 双向TLS客户端证书/密钥和CA路径
https://目标 - 明确的
allow_insecure_http = true对于纯HTTP目标 - 代理到守护进程请求的可选承载身份验证
- 可选的证书固定和主机名验证覆盖
- 每个目标连接/读取/请求/启动探测超时
- 可选代理主机
[local]目标 - 可选代理主机文件系统沙箱
- 可选的结构化内容切换
- 可选传输和端口转发限制
Daemon配置包括:
- 守护进程
target名称与listen地址 - 默认工作目录
- 默认或显式TLS传输
transport = "http" - TLS服务器证书/密钥和CA路径
- 可选的代理客户端证书pin
- 可选承载身份验证
- 登录shell、PTY、默认shell和Windows POSIX根策略
- 可选静态路径沙盒
- 可选传输、屈服时间和端口转发限制
default_workdir 当经纪人存在时,必须已经存在 [local] 目标或守护进程 开始。
TLS和Bootstrap
Rust代理和Rust守护进程目标默认使用双向TLS:
- 经纪人功能
broker-tls默认启用 - 守护进程特性
tls默认启用 - 守护进程提供由配置的CA签名的服务器证书
- 代理提供由配置的CA签名的客户端证书
- 双方都信任在其配置中配置的CA
如果代理构建时没有 broker-tls,它拒绝 https:// 守护进程 目标和 https:// 代理URL。如果Rust守护进程是在没有 tls, 它只支持 transport = "http".C++守护进程的目标是纯HTTP和 必须在代理中配置 allow_insecure_http = true.
首选开发引导:
cargo run -p remote-exec-admin -- certs dev-init \
--out-dir ./remote-exec-certs \
--target builder-a \
--target builder-b重用现有CA:
cargo run -p remote-exec-admin -- certs dev-init \
--out-dir ./remote-exec-certs-next \
--target builder-c \
--reuse-ca-from-dir ./remote-exec-certs当代理通过DNS名称或非本地主机IP连接时,添加守护进程SAN:
cargo run -p remote-exec-admin -- certs dev-init \
--out-dir ./remote-exec-certs \
--target builder-a \
--san builder-a=dns:builder-a.example.com \
--san builder-a=ip:10.0.0.12该命令写道:
ca.pem和ca.keybroker.pem和broker.keydaemons/.pem和daemons/.keycerts-manifest.json
低级命令也可用:
cargo run -p remote-exec-admin -- certs init-ca --out-dir ./remote-exec-ca
cargo run -p remote-exec-admin -- certs issue-broker \
--ca-cert-pem ./remote-exec-ca/ca.pem \
--ca-key-pem ./remote-exec-ca/ca.key \
--out-dir ./remote-exec-broker-cert
cargo run -p remote-exec-admin -- certs issue-daemon \
--ca-cert-pem ./remote-exec-ca/ca.pem \
--ca-key-pem ./remote-exec-ca/ca.key \
--out-dir ./remote-exec-daemon-cert \
--target builder-a \
--san dns:builder-a.example.com \
--san ip:10.0.0.12笔记:
- 如果没有提供SAN,则生成的守护进程证书默认为
DNS:localhost和
IP:127.0.0.1.
- 生成的私钥是使用受限权限编写的:Unix
0600;
适用于当前用户、本地管理员和本地系统的Windows DACL。
expected_daemon_name应与守护进程的配置相匹配target.skip_server_name_verification = true仍然验证CA、密钥使用情况,以及
过期,但跳过URL主机到证书SAN匹配。
pinned_server_cert_pem和tls.pinned_client_cert_pem添加精确的叶子
证书引脚位于正常CA验证之上。
- 承载身份验证对请求进行身份验证,但不增加机密性或
纯HTTP上的完整性。
跑步
启动Rust守护进程:
cargo run -p remote-exec-daemon -- configs/daemon.example.toml启动代理:
cargo run -p remote-exec-broker -- configs/broker.example.toml通过流式HTTP公开代理:
[mcp]
transport = "streamable_http"
listen = "127.0.0.1:8787"
path = "/mcp"运行C++守护进程:
make -C crates/remote-exec-daemon-cpp
crates/remote-exec-daemon-cpp/build/remote-exec-daemon-cpp \
crates/remote-exec-daemon-cpp/config/daemon-cpp.example.iniCLI客户端
这 remote-exec CLI调用相同的公共代理工具。
在进程中使用代理配置:
cargo run -p remote-exec-broker --bin remote-exec -- \
--broker-config configs/broker.example.toml \
list-targets使用正在运行的流式HTTP代理:
cargo run -p remote-exec-broker --bin remote-exec -- \
--broker-url http://127.0.0.1:8787/mcp \
list-targets常见示例:
cargo run -p remote-exec-broker --bin remote-exec -- \
--broker-config configs/broker.example.toml \
exec --target builder-a --workdir /srv/project 'cargo test'
cargo run -p remote-exec-broker --bin remote-exec -- \
--broker-config configs/broker.example.toml \
transfer-files \
--source local:/tmp/source.txt \
--destination builder-a:/tmp/dest.txt \
--overwrite replace \
--create-parent
cargo run -p remote-exec-broker --bin remote-exec -- \
--broker-url http://127.0.0.1:8787/mcp \
forward-ports open \
--listen-side local \
--connect-side builder-a \
--forward tcp:127.0.0.1:15432=127.0.0.1:5432使用 --json 用于标准化JSON输出。使用 apply-patch --input-file - 和 write-stdin --chars-file - 从stdin读取有效载荷。
CLI退出代码为 0 为了成功, 2 对于使用/输入错误, 3 对于经纪人 配置加载/构建错误, 4 用于流式HTTP连接或传输 错误,以及 5 对于代理返回的MCP工具错误。
--broker-config mode为一次CLI调用构建代理状态。持久 端口转发需要一个长时间运行的代理,因此更喜欢 --broker-url 为了 forward-ports open/list/close 工作流程。
工具说明
exec_command:
- 在一个目标上运行一个命令
- 回报
session_id当仍在运行时 - 将stdout/stderr顺序合并为一个公共命令
output非TTY exec字段 - 应用守护进程或代理本地
yield_time_ms政策 - 按大致的令牌预算截断输出,其中一个令牌大约为四个
UTF-8字节
- 以文本形式报告警告,并在启用时报告结构化内容
write_stdin:
- 写入或轮询经纪人拥有的实时会话
- 可以通过以下路线
session_id独自 - 拒绝不匹配
target如果提供 - 接受
pty_size在写入或轮询之前调整实时TTY大小 - 将丢失的守护进程会话标准化为通常的未知进程错误
apply_patch:
- 在一个目标上应用Codex样式的补丁
- 保留现有
LF对CRLF更新文件的样式 - 支持文档
*** End of File标记 - 有意在多个文件操作之间实现非事务性
- 仅返回文本输出
- 在配置中启用时,可以使用实验目标编码自动检测
view_image:
- 从一个目标读取图像
- 支持
detail = "original"用于高保真读取 - Rust守护进程可以根据正常的图像处理调整大小/默认值
- C++守护进程仅支持直通PNG、JPEG和WebP
transfer_files:
- 支持
local -> remote,remote -> local,remote -> remote,以及
local -> local
- 接受其中之一
source或一个sources数组 - 需要端点本机绝对路径
- 默认为
overwrite = "merge",destination_mode = "auto",以及
symlink_mode = "preserve"
- 支持
destination_mode = "exact"和"into_directory" - 支持
symlink_mode = "preserve","follow",以及"skip" - 支持
exclude相对于每个源根的glob模式 - 跳过目录树中不受支持的特殊文件并显示警告
- 不公开公共压缩选项;压缩是代理内部的
forward_ports:
- 支持
action = "open" | "list" | "close" - 支持
tcp和udp - 打开侦听器
listen_side以及上的出站连接/数据报
connect_side
- 允许任何一方成为配置目标或
"local" - 处理裸端点
"8080"作为"127.0.0.1:8080" - 允许非环回侦听绑定,例如
"0.0.0.0:8080" - 允许
listen_endpoint港口0;读取实际绑定端口的结果 - 要求非零
connect_endpoint端口 - 报告
phase、侧面健康、生成、重新连接计数器、掉线计数器,
有效限制
- 款待
phase = "ready"作为准备;遗产status = "open"可以共存
随着 phase = "reconnecting"
- 在代理守护进程传输丢失后,可以恢复未来的监听端流量
守护进程保持活动状态,但每个对等连接器的TCP流和UDP处于活动状态 迷失
局部语义
名字 local 指代理主机。
[local]在代理配置中启用target: "local"为了exec_command,
write_stdin, apply_patch,以及 view_image.
transfer_files可以使用target: "local"用于代理主机文件系统访问
即便当 [local] 省略。
forward_ports可以使用侧面"local"甚至用于代理主机网络访问
当 [local] 省略。
- 经纪人
host_sandbox管理代理主机文件系统访问。它没有
限制 forward_ports 网络接入。
配置的远程目标可能无法命名 local.
信任模型
选择目标相当于在该机器上进行广泛访问,除非是静态访问 沙盒配置限制了相关的基于路径的操作。
没有每次呼叫的批准流程,也没有沙盒选择流程。沙盒规则 是静态允许/拒绝列表:
- 缺失
allow或allow = []意味着允许所有 deny条目细化了允许的集合exec_command仅检查已解决的启动问题cwd- 不检查命令文本是否有任意路径引用
view_image检查已解析的映像路径是否具有读取权限apply_patch检查已解决的写入目标transfer_files检查源读取权限和目标写入权限
它们各自的端点
forward_ports可以绑定非环回地址并连接到任意
可从每一侧访问的端点,受配置的转发限制的约束
安全性基于显式的目标选择和代理到守护进程的双向TLS 对于正常的Rust目标。纯HTTP需要明确的选择加入。
可靠性注意事项
- Broker启动探测同时运行,并受以下限制
timeouts.startup_probe_ms.
- 代理守护进程调用受每个目标连接/读取/请求超时的限制。
- Rust守护进程实时执行会话的上限为
max_open_sessions修剪
压力较大的课程,更喜欢已完成的课程。经纪人主机 本地运行时使用相同的默认上限。
forward_ports对于单个工具调用,open是全有或全无:失败
初始化将关闭在该调用期间创建的侦听器。
- 明确的
forward_ports如果守护进程端清理无法完成,close会报告错误
确认后,列出的状态可供重试或检查。
- 如果代理消失而没有关闭转发,则守护进程端会分离
侦听器和UDP套接字在重新连接宽限期窗口后被回收。
- Rust守护进程关闭取消挂起的隧道工作并关闭实时转发
退出前使用插座。
- C++守护进程转发边界工作器计数、隧道I/O、排队字节数、UDP
绑定、活动TCP流、保留会话/侦听器和TCP连接时间。
C++守护程序
C++守护进程有意支持比Rust守护进程更小的表面:
- 纯HTTP
- 无传输压缩
- 当主机可以分配PTY时,支持POSIX PTY
- Windows XP兼容版本被拒绝
tty = true - PNG、JPEG和WebP透传
view_image - 文件、目录和代理构建的多源传输
- POSIX符号链接保留/跟随/跳过模式
- 不可用时跳过与Windows XP兼容的符号链接保留
- v4
forward_ports隧道支护 - exec cwd的静态路径沙盒、传输读/写路径、补丁写入
目标和图像读取
在每个支持的构建路径上,C++守护进程的标准级别都是C++11。在此 存储库,“Windows XP兼容”意味着使用可以针对XP的工具链 在将守护进程编译为C++11时,例如MinGW-XP交叉构建或 元信令虚通道 v141_xp 设置。
Rust和C++守护进程共享 max_open_sessions 默认值为64。C++也是 具有守护进程本地安全旋钮,用于手写HTTP解析器和阻止 转发工作者模型: max_request_header_bytes, max_request_body_bytes, port_forward_max_worker_threads,以及 port_forward_tunnel_io_timeout_ms. 这些是专门针对C++的,而不是隐藏的Rust等价物。
构建路径:
make -C crates/remote-exec-daemon-cpp check-posix
make -C crates/remote-exec-daemon-cpp check-windows-xp
bmake -C crates/remote-exec-daemon-cpp check-posixcheck-windows-xp 运行支持Windows的C++运行时套件 WINDOWS_XP_TEST_RUNNER 当该变量被设置时,直接当它被设置时 空的。GNU默认设置为 wine 在非Windows主机上为空 窗户。
在x86 Visual Studio开发人员提示符下:
nmake /f crates\remote-exec-daemon-cpp\NMakefile check-msvc-native在x86 Visual Studio开发人员提示符下,使用 v141_xp-功能强大的C++11 工具集:
nmake /f crates\remote-exec-daemon-cpp\NMakefile check-msvc-xp更多C++守护进程详细信息请访问 crates/remote-exec-daemon-cpp/README.md.
可观测性
运行时组件日志 stderr.
- 经纪人保持
stdout为MCP stdio保留。 - 代理工具错误包括
request_id,tool,以及target当已知时;
使用该请求ID将代理日志与守护进程相关联 x-request-id 原木。
- 锈蚀部件读取
REMOTE_EXEC_LOG首先,然后RUST_LOG. - C++守护进程读取
REMOTE_EXEC_LOG首先,然后RUST_LOG. - C++守护进程接受裸级别,例如
debug,以及共享过滤器,例如
remote_exec_daemon_cpp=debug.
- 古老的
remote_exec_daemon_xp=过滤器仍被接受为别名。
示例:
REMOTE_EXEC_LOG=debug cargo run -p remote-exec-daemon -- configs/daemon.example.toml
REMOTE_EXEC_LOG=debug cargo run -p remote-exec-broker -- configs/broker.example.toml
REMOTE_EXEC_LOG='warn,remote_exec_broker=debug,remote_exec_daemon=debug,remote_exec_daemon_cpp=debug'发展
Rust MSRV是 1.85.0,第一个支持Rust 2024版本的稳定版本。
全质量门:
cargo test --workspace
cargo fmt --all --check
cargo clippy --workspace --all-targets --all-features -- -D warnings
make -C crates/remote-exec-daemon-cpp check-posix
make -C crates/remote-exec-daemon-cpp check-windows-xp
# From an x86 Visual Studio developer prompt:
nmake /f crates\remote-exec-daemon-cpp\NMakefile check-msvc-native
# From an x86 Visual Studio developer prompt with a v141_xp-capable C++11 toolset:
nmake /f crates\remote-exec-daemon-cpp\NMakefile check-msvc-xp重点命令:
cargo test -p remote-exec-broker --test multi_target -- --nocapture
cargo test -p remote-exec-broker --test mcp_cli
cargo test -p remote-exec-broker --test mcp_transfer -- --nocapture
cargo test -p remote-exec-broker --test mcp_forward_ports -- --nocapture
cargo test -p remote-exec-daemon --test transfer_rpc -- --nocapture
cargo test -p remote-exec-daemon --test port_forward_rpc -- --nocapture
make -C crates/remote-exec-daemon-cpp test-host-transfer
make -C crates/remote-exec-daemon-cpp test-host-server-runtime
make -C crates/remote-exec-daemon-cpp test-host-server-streaming
make -C crates/remote-exec-daemon-cpp test-windows-xp-server-runtime
make -C crates/remote-exec-daemon-cpp test-windows-xp-server-routes-common无默认功能检查:
cargo test -p remote-exec-broker --no-default-features --tests
cargo test -p remote-exec-daemon --no-default-features --tests
cargo test -p remote-exec-host --no-default-features --tests
cargo clippy -p remote-exec-broker --no-default-features --all-targets -- -D warnings
cargo clippy -p remote-exec-daemon --no-default-features --all-targets -- -D warnings
cargo clippy -p remote-exec-host --no-default-features --all-targets -- -D warningsCI还练习代理、守护进程和主机 --no-default-features 测试和 Ubuntu上的clippy作业 tls-disabled 和主机特征门控代码路径 故意覆盖。
CI在Linux和Windows上执行Rust代理和Rust守护进程。铁锈 代理集成测试在以下情况下使用预构建的C++守护进程二进制文件 当C++守护进程不存在时,跳过它;他们不建造 C++守护进程本身。CI在显式步骤中构建该C++守护进程二进制文件 在Rust测试作业之前。独立的C++守护进程也有自己的Linux和 Windows CI作业:在Linux上运行POSIX运行时测试,与Windows XP兼容的测试 二进制文件在Linux上的Wine下运行(如果可用),以及32位主机本机MSVC NMAKE路径运行在 windows-latest.
一个单独的定期/手动GitHub Actions工作流在内部练习BSD覆盖 GitHub托管了FreeBSD、OpenBSD、NetBSD和DragonFly BSD的BSD虚拟机。每个BSD 条目运行支持的BSD make路径 bmake -C crates/remote-exec-daemon-cpp BUILD_DIR=build/ci-bsd check-posix, 然后重用结果 remote-exec-daemon-cpp 二进制直通 REMOTE_EXEC_CPP_DAEMON 跑步时 cargo test --workspace --all-features. FreeBSD和NetBSD引导Rust rustup;OpenBSD和DragonFly BSD的使用 他们打包的Rust工具链。BSD工作流程是有意周期性的 可手动运行,而不是所需推/拉请求门的一部分。
Windows GNU仅从Linux进行编译检查:
cargo check --workspace --all-targets --all-features --target x86_64-pc-windows-gnu
cargo clippy --workspace --all-targets --all-features --target x86_64-pc-windows-gnu -- -D warnings
cargo build --workspace --all-targets --all-features --target x86_64-pc-windows-gnu参考文献
AGENTS.md:编码代理实施指南skills/using-remote-exec-mcp/SKILL.md:代理工具和CLI使用指南configs/broker.example.toml:代理配置形状configs/daemon.example.toml:Rust守护进程配置形状crates/remote-exec-daemon-cpp/README.md:C++守护进程构建/运行时指南crates/remote-exec-proto/src/public.rs:公共MCP工具架构
