HashLock OTC について
HashLock OTCは、AIエージェント向けにクロスチェーンOTCの注文、価格交渉、決済追跡を提供するMCPサーバーです。HTLCアトミックスワップを使い、署名と資産管理は取引者自身のウォレットに委ねます。
主な機能
- 01資産と公開RFQの閲覧
- 02公開RFQまたは非公開注文の作成
- 03取引価格への応答と交渉
- 04HTLC決済と返金の追跡
- 05取引者自身のウォレットで署名
活用シーン
- 01クロスチェーンOTC取引の相手探し
- 02スワップ作成前の価格交渉
- 03資金ロック、請求、タイムロックの監視
- 04ローカルキーによる自律的な取引フローの実行
MCP 対応
ローカルstdioまたはホスト型Streamable HTTPでHashLock Marketsの取引ツールを公開します。ホスト型サービスはクライアントが自身のウォレットで署名する未署名トランザクションを返し、ローカルモードでは設定キーによる自律署名が可能です。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://hashlock.markets/mcpclaude mcp add --transport http hashlock https://hashlock.markets/mcp{"mcpServers":{"hashlock":{"type":"http","url":"https://hashlock.markets/mcp"}}}Cursor で開く{"servers":{"hashlock":{"type":"http","url":"https://hashlock.markets/mcp"}}}VS Code で開く{"mcpServers":{"hashlock":{"type":"http","url":"https://hashlock.markets/mcp"}}}{"mcpServers":{"hashlock":{"serverUrl":"https://hashlock.markets/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
https://hashlock.markets/mcp認証が必要ツール
17このツールにパラメーターはありません。
詳細
@hashlock-tech/mcp
Hashlock Markets — エージェント経済の決済レイヤーを、MCP ツールとして提供します。ノンカストディアルなクロスチェーン OTC:封印型 RFQ +価格交渉+HTLC によるアトミック決済 — 両方の取引が決済されるか、両方が返金されます。ブリッジもカストディアンも、取引相手のリスクもありません。BTC ↔ EVM / TRON / Solana。
メインネットで稼働中:Bitcoin、Ethereum、Base、Robinhood Chain、TRON、Solana。取引に使用する予定の資金だけを入れた専用キーを使用してください。
📖 ドキュメント: docs.hashlock.markets — 概念、クイックスタート、ガイド、API リファレンスをご覧いただけます。エージェント向け:
llms.txt(索引)、llms-full.txt(すべてを 1 つのファイルに収録)、URL の末尾に.mdを付けると任意のページを Markdown で表示できます。また、ドキュメント検索用 MCP サーバーはhttps://docs.hashlock.markets/mcpです。
これは何ですか?
Hashlock Markets の公式 Model Context Protocol サーバーです。AI エージェント(Claude、Cursor、Windsurf、あらゆる MCP クライアント)に、OTC 取引の一連の機能を提供します。
- アセットレジストリと公開 RFQ ボードを閲覧する
- 公開 RFQ または非公開の固定価格注文(共有可能なリンク)を投稿する
- 価格を提示してリクエストに応答し、取引スレッドで交渉する(対案を提示/承諾/辞退)
- 合意する — 相手の価格を受け入れると HTLC スワップが作成されます(自分で提示した価格または対案を相手が受け入れた場合も、自分の承諾として扱われます)
- 決済状況(誰が資金を入金したか、タイムロック、トランザクションハッシュ)を追跡し、受取アドレスと返金アドレスを管理する
決済の署名(HTLC への資金提供と請求)は、ご自身のウォレットで行います。サーバーがキーや資金を預かることはありません。スワップの秘密値はローカルでマシン上に生成され、sha256 ハッシュロックのみが送信されます。請求時には get_deal_secret で秘密値を取得してください。
2 つの実行方法
- ローカル(stdio) — 以下の npm パッケージを使用します。ご自身のマシンでご自身のキーを使って実行し、
自律的に決済できます(SIWE ログイン +
HASHLOCK_*_KEYを使ったオンチェーン署名)。すべての管理を自分で行えます。 - リモート(ホスト型、Streamable HTTP) — 公開 URL(
https://hashlock.markets/mcp)を Claude/ChatGPT/任意の MCP クライアントから追加できます。ワンクリック OAuth、インストール不要です。マルチテナントのため、厳格な ノンカストディアル方式です。決済では、ご自身のウォレットで署名する未署名のトランザクションが返されます。サーバーがキーやスワップのプリイメージを預かることはありません。詳しくは以下のリモート(ホスト型)をご覧ください。
インストール
HASHLOCK_API_URL=https://hashlock.markets/api npx -y @hashlock-tech/mcp
最小限の設定(読み取り専用 — アセットと RFQ ボードを閲覧できます。キーは不要です):
{
"mcpServers": {
"hashlock": {
"command": "npx",
"args": ["-y", "@hashlock-tech/mcp"],
"env": { "HASHLOCK_API_URL": "https://hashlock.markets/api" }
}
}
}
取引するには、エージェント自身のキーを追加してください — npx を使ったローカル stdio(Claude Desktop/Cursor/Windsurf の mcpServers 設定):
{
"mcpServers": {
"hashlock": {
"command": "npx",
"args": ["-y", "@hashlock-tech/mcp"],
"env": {
"HASHLOCK_API_URL": "https://hashlock.markets/api",
"HASHLOCK_EVM_KEY": "0x<agent EVM key>",
"HASHLOCK_TRON_KEY": "<agent TRON key, 64-hex (optional)>",
"HASHLOCK_BTC_KEY": "<agent BTC WIF (optional)>",
"HASHLOCK_SOLANA_KEY": "<agent Solana key, base58 (optional)>"
}
}
}
}
認証 — チェーンごとに自律的
エージェントが自分のキーを管理し、サーバーがログイン処理を行います(nonce → 署名 → JWT。有効期限が切れると更新されます)。 最初に設定されたキー(EVM → TRON → BTC → Solana)でセッションを発行し、各キーはそれぞれのチェーンでの決済にも署名します。
| 環境変数 | チェーン | ログイン |
|---|---|---|
HASHLOCK_EVM_KEY | EVM | SIWE personal_sign |
HASHLOCK_TRON_KEY | TRON | signMessageV2 |
HASHLOCK_BTC_KEY | Bitcoin | BIP-322 |
HASHLOCK_SOLANA_KEY | Solana | ed25519 signMessage |
HASHLOCK_TOKEN | — | 有効なJWT(キーの代替) |
HASHLOCK_SOLANA_KEY はbase58形式です。ウォレットからエクスポートした64バイトの値、または32バイトのシードをそのまま指定します。これだけが設定されている場合はセッションを発行し、それ以外の場合は上記の優先順位で他のキーの後に使われます。いずれの場合も、エージェントが初めて投稿、見積もり、承諾、または whoami を呼び出したときに、ウォレットの所有権を証明します(署名付きnonceを含むメッセージを /me/link-solana に送信します)。Solanaが支払い側の注文は、この証明がないと拒否されます。また、ウォレットを対象とした非公開注文のフィードにエージェントを表示するためにも必要です。アカウントがすでに別のSolanaウォレットにリンクされている場合、そのリンクは変更されません。それ以外の処理はブロックされず、その状態は whoami.solanaLink に示されます。また、Solanaは、このパッケージがトランザクションを構築しない唯一のチェーンです。エスクローのADDRESSは合意された条件のハッシュであるため、サーバーが各トランザクションを作成し、エージェントは渡されたバイト列に署名します。エージェントのSolanaアドレス(whoami は localSigners.addresses.solana として返します)を、資金を入金する前に set_settlement_address で決済アドレスとして設定してください。
何も設定されていない場合でも、読み取り専用ツール(list_assets、list_open_rfqs、get_rfq)は引き続き利用できます。取引に使う資金だけを入れた専用キーを使用してください。
必須:HASHLOCK_API_URL — APIのベースURL。例:https://hashlock.markets/api。デフォルト値はありません。その他の環境変数:HASHLOCK_APP_URL(共有リンク用。デフォルトは自動導出)、HASHLOCK_EVM_RPC(デフォルトは公開EthereumメインネットRPC。他のEVMチェーンでは HASHLOCK_EVM_RPC_<CHAIN> を使用します。例:HASHLOCK_EVM_RPC_BASE)、HASHLOCK_TRON_HOST(デフォルトはTronGridメインネット)、HASHLOCK_TRON_API_KEY(TronGrid APIキー。キーがないとTronGridはリクエストを制限します)、HASHLOCK_SECRETS_PATH(デフォルトは ~/.hashlock/mcp-secrets.json、パーミッションは0600)。
リモート(ホスト型)
同じサーバーは、Streamable HTTP 経由のリモート MCPとしても動作するため、URL を使って誰でも接続できます。インストールは不要です。これはマルチテナントの非カストディアルな環境です。閲覧、RFQ、交渉を行い、自分のウォレットで署名する未署名の資金移動/請求/返金トランザクションを取得できます(環境変数にキーを設定して自動署名することはなく、サーバー側で秘密情報を保管することもありません。hashlock は自分で用意し、プリイメージも自分で管理します)。
クライアントから接続する場合: サーバー URL を追加してください。それ以外は何も必要ありません。クライアントが認証が必要なことを検出し、Hashlock に移動してサインインと承認を促し、クライアント専用のキーを取得します。
URL: https://hashlock.markets/mcp
承認にはウォレットの署名が必要です。サインイン済みのセッションだけでは何も許可されません。許可されたキーは、通常の 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: も追加)、{ rail, address, message, signature } を指定して POST /api/v1/keys を呼び出します。キーは、そのウォレットでサインインするアカウントに紐づき、初回使用時に作成されます。ウォレットのみのアカウントが保持できるキーは 1 つです。再度署名するとキーが置き換わるため、紛失したキーの復旧にも使えます。メール、Google、Telegram を使って /developers で登録すると、最大 10 個まで保持できます。/api/v1/docs を参照してください。
OAuth フローの仕組み
標準の OAuth 2.1 を使用しているため、準拠する MCP クライアントであれば、ユーザーの操作なしにフローを実行できます。
| 手順 | エンドポイント |
|---|---|
| 未認証の呼び出しでメタデータを示す | 401 + WWW-Authenticate: … resource_metadata=…(RFC 9728) |
| クライアントがリソースとサーバーのメタデータを読み取る | /.well-known/oauth-protected-resource、/.well-known/oauth-authorization-server(RFC 8414) |
| クライアントが自身を登録する | POST /oauth/register(RFC 7591) |
| ブラウザーでサインインし、ウォレット署名で承認する | /oauth/authorize |
| クライアントが認可コードをキーと交換する | POST /oauth/token — PKCE S256 が必須(RFC 7636) |
認可コードは 1 回のみ使用でき、有効期限は 60 秒です。リダイレクト URI は許可リストで管理され、RFC 8252 に従ってループバックが許可されます。発行されるトークンは API キーそのものなので、ほかのすべてのキーと同じ一覧から認可を取り消せます。
取引に使用できるチェーン。 資産を渡す注文には、そのチェーン上で所有を証明したウォレットが必要です。キーには、所有者がサインインに使ったアドレスだけが最初から登録されます。whoami で両方を確認できます。別のウォレットを追加するには、wallet_proof_message を呼び出して正確なメッセージを取得し、そのウォレットで署名して(EVM personal_sign · TRON
signMessageV2 · Solana signMessage · Bitcoin BIP-322)、その署名を prove_wallet に渡します。証明によって広がるのは取引可能な範囲だけです。アカウントの受取アドレスになることはありません。受取アドレスはウォレットセッションからのみ設定でき、remove_wallet_proof で証明を取り消せます。
ホスト型サービスを自分で実行する場合:
docker build -t hashlock-mcp-http .
docker run -p 8080:8080 -e HASHLOCK_V1_URL=https://api.hashlock.markets/v1 hashlock-mcp-http
# or, from source:
pnpm build && HASHLOCK_V1_URL=https://api.hashlock.markets/v1 PORT=8080 pnpm start:http
環境変数:HASHLOCK_V1_URL(開発者 API のベース URL。デフォルトは https://api.hashlock.markets/v1)· PORT(デフォルトは
8080)。リバースプロキシの背後で /mcp に配置してください。GET /health は稼働状態の確認用エンドポイントです。
ツール(17)
| ツール | 機能 |
|---|---|
list_assets | 資産レジストリ(SYMBOL@chain 形式の参照、桁数) |
list_open_rfqs | 公開 RFQ ボード。フィルター可能 |
get_rfq | 1 件の RFQ/非公開注文 |
create_rfq | 公開 RFQ または非公開の固定価格注文を投稿 |
cancel_rfq | 自分のリクエストをキャンセル |
respond_to_rfq | 価格を提示して応答 → 取引スレッドを開始 |
negotiate | message / propose / accept_proposal / accept / reject — 承諾時には読み取った価格を指定し、その価格が変動していれば拒否されます。自分の見積もりや対案は自分の承諾として扱われるため、相手側の価格のみを承諾してください。accept_proposal は相手の対案を受け入れ、1 ステップで取引に合意します |
my_rfqs, my_deals | 自分のリクエストと取引スレッド |
deal_status | スレッド+交渉履歴+HTLC スワップの状態 |
set_settlement_address | チェーンごとの受取/返金アドレス |
get_deal_secret | ローカルに保存されたスワップのプリイメージ(両方のレッグへの資金拠出が完了した場合に取得可能) |
reveal_claim | チェーン外で行った請求(シークレット+トランザクション)を報告し、もう一方のレッグを決済 |
whoami | 認証済みのアカウント |
fund_leg | 自律型: エージェント自身のキーを使って、オンチェーンでスワップの自分側に資金を拠出(EVM/TRON/BTC/Solana) |
claim_leg | 自律型: プリイメージを使って受取レッグを請求(オンチェーンでシークレットを公開) |
refund_leg | 自律型: タイムロックの期限が過ぎ、誰も請求していない場合に、拠出済みの自分のレッグを取り戻す |
金額は人間向けの小数文字列(「0.5」)です。価格は合計の見積もり資産額であり、単位あたりの金額ではありません。エラーは、エージェントが分岐処理できる構造化エンベロープ { error: { code, is_retryable, recovery_hint } } を返します。
完全自律型のループ
スワップに関係する各チェーンのキーを設定すれば、エージェントは人間の介入なしに最初から最後まで実行できます。
create_rfq/respond_to_rfq → negotiate(承諾)→ set_settlement_address(両方のチェーン)→
fund_leg → claim_leg。資金拠出/請求はエージェントのキーを使ってローカルで署名されます。スワップのシークレットはローカルで生成・保存され、そのハッシュロックだけがマシンの外に出ます。取引に使う予定の資金だけを保有する専用キーを使用してください。
アトミック決済の仕組み
両者は同じ sha256(secret) ハッシュロックに紐付けられた HTLC に資金をロックします。BTC では P2WSH スクリプト、EVM/TRON ではコントラクトを使用します。開始者はまず、タイムロック期間の長いレッグに資金を拠出します(タイムロックを非対称にすることで、一方だけが無償で選択権を得るのを防ぎます)。一方のレッグを請求すると、オンチェーンでシークレットが公開され、もう一方のレッグが解除されます。両方のレッグが決済されるか、タイムロックの期限後に両方が返金されます。各レッグの受取人は資金拠出時に確定するため、シークレットを公開しても資金の送付先を変更することはできません。
開発
pnpm install
pnpm run build # tsup → dist/
pnpm run lint # tsc --noEmit
pnpm test # vitest
リリース時には2 つのバージョン番号を更新する必要がありますが、同じ番号ではありません。package.json(および一致する必要がある server.json の packages[0].version)は npm パッケージのバージョンです。一方、server.json 自身のトップレベルの version は MCP Registry のエントリーのバージョンです。後者を更新し忘れると、npm への公開は問題なく行われますが、レジストリは cannot publish duplicate version と応答します。その後、タグを付けます。git tag v0.8.1 && git push origin v0.8.1 を実行すると、両方のワークフローが実行されます。
Node ≥ 20。MIT。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。