用途
Hashlock MCP 是 Hashlock Markets 的规范 Model Context Protocol (MCP) 服务端,面向 AI 代理(Claude、Cursor、Windsurf 等任何 MCP 客户端)和机构 OTC 交易台,提供非托管、跨链的场外交易能力。其核心是将密封报价 RFQ(sealed RFQ)、价格协商与 HTLC 原子结算融合为一个操作,用于代理经济中的原子结算层。
主要能力
代理可通过该服务端完成完整的 OTC 交易闭环:浏览资产注册表和公共 RFQ 板;发布公共 RFQ 或私有固定价格订单(可分享链接);对请求给出报价并进行还价、接受或拒绝的协商;双方接受后创建 HTLC 交换;跟踪结算状态(谁已出资、时间锁、交易哈希),并管理收款/退款地址。
结算的签名(出资与领取 HTLC)始终由用户自己的钱包完成,服务端从不持有密钥或资金。交换秘密在本地机器生成,只有其 sha256 哈希锁会发送出去,需要领取时可用 get_deal_secret 取回。
使用方式
两种运行方式:
- 本地(stdio):通过 npm 包在用户机器上运行,使用自己的密钥,可按需配置 HASHLOCK_*_KEY 实现自主结算(SIWE 登录 + 链上签名)。配置示例如下(Claude Desktop / Cursor / Windsurf 的 mcpServers 配置):
npx @hashlock-tech/mcp
必需环境变量:HASHLOCK_API_URL(API 基地址,例如 https://hashlock.markets/api ,无默认值)。其他可选变量:HASHLOCK_APP_URL(分享链接,默认自动派生)、HASHLOCK_EVM_RPC(默认公共以太坊主网 RPC;其他 EVM 链使用 HASHLOCK_EVM_RPC_<CHAIN>,如 HASHLOCK_EVM_RPC_BASE)、HASHLOCK_TRON_HOST(默认 TronGrid 主网)、HASHLOCK_TRON_API_KEY(TronGrid API 密钥,缺少会被限流)、HASHLOCK_SECRETS_PATH(默认 ~/.hashlock/mcp-secrets.json,权限 0600)。
认证方面:代理拥有自己的密钥,服务端自行完成登录(nonce → 签名 → JWT,过期自动刷新)。第一个配置的密钥(优先级 EVM → TRON → BTC → Solana)会铸造会话,每个密钥也为其所在链的结算签名。HASHLOCK_SOLANA_KEY 为 base58 格式(钱包导出的 64 字节或裸 32 字节种子)。未设置任何密钥时,只读工具(list_assets、list_open_rfqs、get_rfq)仍可使用。建议使用仅含拟交易资金的专用密钥。
- 远程(托管,Streamable HTTP):公共 URL https://hashlock.markets/mcp ,任何 MCP 客户端均可通过 URL 添加,一键 OAuth,无需安装。这是多租户、严格非托管的接口:浏览、发布 RFQ、协商,并获取未签名的出资/领取/退款交易,由用户自己的钱包签名(无自主环境密钥签名,也无服务端秘密存储;用户自行提供哈希锁并保管 preimage)。客户端连接时只需添加服务端 URL,客户端会发现需要授权,引导用户到 Hashlock 登录并批准,然后获得自己的密钥。批准需要钱包签名,仅登录会话本身不授予任何权限。授权会出现在 Developers 中作为普通 API 密钥:90 天后过期,创建时(若已绑定 Telegram)会通过 Telegram 通知,可随时撤销。不支持 OAuth 的客户端仍可发送自行创建的密钥作为 Authorization: Bearer hk_…。
无浏览器的代理:持有钱包密钥的代理可自行铸造 hk_ 密钥——GET https://hashlock.markets/api/v1/keys/nonce ,对 "Hashlock Markets — create an API key." 加 Address: 和 Nonce: 行签名(可选 Key name: 和 Scopes:),然后 POST /api/v1/keys,携带 { rail, address, message, signature }。密钥属于该钱包登录的账户,首次使用时创建。仅钱包账户持有一个密钥——再次签名会替换它,这也是恢复丢失密钥的方式;通过 /developers 用邮箱、Google 或 Telegram 注册可最多持有 10 个密钥。详见 /api/v1/docs。
使用标准 OAuth 2.1,任何合规 MCP 客户端均可无人值守运行:授权码一次性且 60 秒过期;重定向 URI 有允许列表,回环地址按 RFC 8252 允许。签发的 token 本身就是 API 密钥,因此授权可在与其他密钥相同的列表中撤销。
可在哪些链上「给出」资产:给出资产的订单需要用户在该链上证明过的钱包,而密钥初始仅含其所有者登录时使用的地址——whoami 会列出两者。要添加其他地址,调用 wallet_proof_message 获取确切文本,用该钱包签名(EVM personal_sign · TRON signMessageV2 · Solana signMessage · Bitcoin BIP-322)并传给 prove_wallet。证明仅扩大可交易范围,不会成为账户的收款地址(收款地址只能由钱包会话设置),remove_wallet_proof 可撤回。
自行运行托管服务:环境变量 HASHLOCK_V1_URL(开发者 API 基地址,默认 https://api.hashlock.markets/v1 )和 PORT(默认 8080 )。将服务置于反向代理后的 /mcp 路径;GET /health 为存活探针。
金额为人类可读的十进制字符串("0.5");价格为报价资产的总额,而非单价。错误返回结构化信封 { error: { code, is_retryable, recovery_hint } },代理可据此分支处理。
适用场景
- AI 代理自主场外交易:为每条涉及的链设置密钥后,代理可端到端无人运行:create_rfq / respond_to_rfq → 协商(accept)→ set_settlement_address(两条链)→ fund_leg → claim_leg。出资/领取在本地用代理密钥签名;交换秘密在本地生成并存储,只有哈希锁离开机器。
- 机构 OTC 交易台:通过 MCP 原生接口进行密封报价与协商。
- 需要跨链原子结算且不愿依赖跨链桥或托管人的场景。
限制与注意事项
- 建议使用仅含拟交易资金的专用密钥。
- Solana 是唯一不由本包构建交易的链:托管地址是约定条款的哈希,因此服务端负责组装每笔交易,代理签署收到的字节。在出资前需将该代理的 Solana 地址(whoami 以 localSigners.addresses.solana 返回)用 set_settlement_address 设为结算地址。
- 托管远程服务为多租户、严格非托管:无自主环境密钥签名,也无服务端秘密存储。
- 认证:授权码一次性且 60 秒过期;API 密钥 90 天过期。
- 发布流程:需同时更新 package.json(及 server.json 的 packages[0].version)和 server.json 顶层版本号,否则注册表会拒绝重复版本;然后打标签触发工作流。
- 运行要求 Node ≥ 20,许可证 MIT。
原子结算原理
双方将资金锁定在绑定同一 sha256(secret) 哈希锁的 HTLC 中——比特币使用 P2WSH 脚本,EVM/TRON 使用合约。发起方先出资长时锁腿(非对称时间锁,避免任一方获得免费期权)。领取其中一腿会在链上暴露秘密,从而解锁另一腿。要么两腿都结算,要么两腿在各自时间锁后都退款。每条腿的接收方在出资时即固定——暴露秘密无法改变资金流向。
(文档:docs.hashlock.markets —— 概念、快速开始、指南和 API 参考。面向代理:llms.txt 索引、llms-full.txt 完整单文件、任意页面加 .md 转为 Markdown、文档搜索 MCP 服务端位于 https://docs.hashlock.markets/mcp 。)