架构
系统架构概述,展示代理进程/守护进程设计以及从 MCP 宿主到链层的组件流程。
Seashail 使用代理-守护进程架构,允许多个智能体进程共享单一密钥存储和策略状态。这种设计在支持并发智能体访问的同时,确保了一致的安全边界。
系统概述
Seashail 将 MCP stdio 接口(代理)与核心状态管理(守护进程)分离。这允许多个智能体(Claude Desktop、Cursor 等)同时连接,而不会产生密钥存储冲突或重复提示密码短语。
┌─────────────────┐
│ MCP 宿主 │ (智能体:Claude Desktop、Cursor 等)
│ (stdio 客户端) │
└────────┬────────┘
│ stdio(换行符分隔的 JSON 上的 JSON-RPC)
▼
┌─────────────────┐
│ seashail mcp │ 轻量级 stdio 代理
│ (代理) │ - 注入网络覆盖参数
└────────┬────────┘ - 守护进程未运行时自动启动
│ Unix 套接字 / 命名管道 / TCP 回环
▼
┌─────────────────┐
│ seashail daemon │ 单例进程
│ │ - 持有独占密钥存储锁
│ │ - 管理密码短语会话
└────────┬────────┘ - 协调所有 MCP 客户端
│
▼
┌─────────────────┐
│ MCP 服务器 │ 工具调度 + 交互确认
│ (在守护进程中)│ - 策略评估
└────────┬────────┘ - 密钥解密 + 签名
│ - 交易广播
▼
┌─────────────────┐
│ 策略引擎 │ 拦截每个写操作
│ │ - 分级审批(自动/确认/拦截)
└────────┬────────┘ - 美元上限、滑点、白名单
│
▼
┌─────────────────┐
│ 链层 │ 链特定适配器
│ (EVM/Solana/ │ - RPC 通信
│ Bitcoin) │ - 交易构建
└─────────────────┘ - 广播架构层次
MCP 宿主
MCP 宿主是通过 stdio 与 Seashail 通信的智能体或编辑器(Claude Desktop、Cursor、Windsurf、VSCode)。智能体发送 JSON-RPC 工具调用并接收工具响应。
关键特性:
- 通过 stdin/stdout 上的换行符分隔 JSON 进行通信
- 在初始化时接收工具描述和模式
- 永远不会看到原始私钥或密码短语(通过 MCP 交互确认处理)
- 可以运行多个实例连接到同一守护进程
代理(seashail mcp)
代理是由智能体启动的轻量级 stdio 进程。它将 stdio 转换为守护进程的套接字协议,并注入会话特定参数。
职责:
- 接受来自 MCP 宿主的 stdio JSON-RPC
- 如果指定了
--network,将其覆盖注入工具调用 - 如果守护进程尚未运行,自动启动它
- 通过 Unix 套接字(或 Windows 上的命名管道)将工具调用转发给守护进程
- 将守护进程响应转发回 stdio
与守护进程分离的原因:
- 每个智能体都需要自己的 stdio 进程(与智能体生命周期绑定)
- 网络覆盖是会话特定的(不同智能体可以使用不同网络)
- 轻量级进程,无状态或锁
守护进程(seashail daemon)
守护进程是持有所有状态并协调所有 MCP 客户端的单例进程。每个用户只运行一个守护进程。
职责:
- 持有独占文件系统锁(
data_dir/seashail-daemon.lock)以防止脑裂 - 管理密钥存储(加密私钥、沙米尔密钥分片)
- 缓存密码短语会话(基于 TTL,跨客户端共享)
- 协调来自多个代理的并发工具调用
- 无客户端连接时空闲退出(可选)
单例的原因:
- 单一密钥存储锁防止并发写入导致损坏
- 密码短语会话在智能体间共享(解锁一次,处处使用)
- 策略状态一致性(所有智能体相同的限额、白名单、开关)
MCP 服务器
MCP 服务器在守护进程内运行,实现模型上下文协议。它将工具调用分派给处理程序并管理交互确认提示。
职责:
- 工具注册和模式生成
- 工具调用分派(解析参数、验证、路由到处理程序)
- 密码短语和确认的交互确认
- 工具响应序列化
关键工具:
- 钱包工具(创建、导入、列表、充值信息)
- 网络工具(余额、价格、交易历史)
- 写入工具(发送、兑换、跨链桥接、DeFi、NFT)
- 策略工具(获取/设置策略字段)
策略引擎
策略引擎在签名前评估每个写操作(发送、兑换、跨链桥接、DeFi、NFT)。它应用分级审批规则并执行美元上限、滑点限制和白名单。
审批级别:
- 自动批准 — 静默执行(低风险,在限额内)
- 用户确认 — MCP 交互确认提示(超过自动批准阈值)
- 硬性阻止 — 拒绝(超过硬性上限或违反策略)
策略控制:
- 每笔交易和每日美元上限
- 滑点限制(兑换、跨链桥接、DeFi)
- 杠杆限制(永续合约)
- 白名单(地址、合约、代币)
- 操作开关(启用/禁用整个类别)
- 内部转账豁免
有关所有策略字段,请参阅策略工具参考;有关使用示例,请参阅策略与审批指南。
链层
链层是构建和广播交易的链特定适配器。每个链族(EVM、Solana、Bitcoin)都有自己的适配器。
职责:
- RPC 通信(余额查询、交易模拟、广播)
- 交易构建(从工具参数构建未签名交易)
- 燃料/手续费估算
- 链特定签名(EVM 的 EIP-1559、Solana 的版本化交易)
- 交易市场适配器(NFT 的 Blur、Magic Eden、OpenSea、Tensor)
支持的链:
- EVM: Ethereum、Base、Optimism、Arbitrum、Polygon(主网 + 测试网)
- Solana: 主网 + Devnet
- Bitcoin: 主网 + 测试网(BIP-84 原生 SegWit)
为什么使用代理 + 守护进程?
代理进程/守护进程分离解决了三个问题:
1. 多智能体共享状态
没有守护进程,每个智能体都需要自己的密钥存储副本。这会产生同步问题:
- 在 Claude Desktop 中创建的钱包不会出现在 Cursor 中
- 在 Cursor 中输入的密码短语不会解锁 Windsurf
- 在一个智能体中的策略更改不会应用于其他智能体
守护进程提供了单一的事实来源。
2. 并发访问安全
多个进程写入同一密钥存储文件可能导致损坏。守护进程持有独占文件系统锁,确保一次只有一个进程修改密钥存储状态。
3. 密码短语会话缓存
没有会话缓存,每个需要密钥访问的工具调用都会提示输入密码短语。守护进程以 TTL 缓存解密密钥(默认 15 分钟),因此解锁一次即可处处使用。
数据流
请求路径
智能体输入消息
→ 智能体调用工具(stdio JSON-RPC)
→ 代理接收工具调用
→ 代理注入网络覆盖(如果设置了 --network 标志)
→ 代理通过套接字转发给守护进程
→ 守护进程接收工具调用
→ MCP 服务器验证参数
→ 策略引擎评估(对于写操作)
→ 如果需要密码短语:MCP 交互确认提示
→ 如果需要用户确认:MCP 交互确认提示
→ 链适配器构建交易
→ 密钥存储签名交易
→ 链适配器广播交易
→ MCP 服务器返回响应
→ 守护进程通过代理发送响应
→ 代理通过 stdio 发送响应给智能体
→ 智能体接收工具结果响应路径
响应通过相同的层次反向流回:
链广播结果
→ 链适配器打包响应
→ MCP 服务器序列化
→ 守护进程发送给代理
→ 代理发送给智能体
→ 智能体显示给用户