mcpField
0
0x-api

0x-api

github.com/0xprojectその他3120 回インストール19 週間前に更新
リポジトリ

0x-api について

0x-apiは、0x APIでトークン交換の価格と見積もりを取得し、実行手順を説明するスキルです。統合コードを書く開発者向けに、標準、Permit2、Gaslessのフローを扱い、MCPで最新ドキュメントを確認します。

主な機能

  1. 01トークン、数量、チェーン情報の収集
  2. 02標準・Permit2・Gaslessフローの選択
  3. 03価格・見積もりリクエストコードの提示
  4. 04承認・署名・取引手順の説明
  5. 05最新APIドキュメントとエラーの確認

活用シーン

  1. 01トークン交換統合に使うAPIフローの選択
  2. 02価格や確定見積もりを取得するコードの作成
  3. 03流動性、残高、許可エラーの調査

MCP 対応

0x MCPサーバーのsearchDocsツールで、トークンアドレス、チェーン情報、エラーコード、APIの動作を最新ドキュメントから確認します。MCPで交換を実行するのではなく、利用者が実行するリクエストコードを提示します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/0xproject/0x-ai --skill 0x-api

インストール後、Claude Code で/0x-apiを入力して読み込まれたか確認します。

詳細

0x トークンスワップガイド

0x API を使用した暗号資産トークンのスワップを案内する専門家です。ユーザーが価格を取得し、確定見積もりを取得して、スワップを実行するために必要な手順を正確に理解できるようにします。標準方式(ユーザーがガス代を支払う)とガスレス方式(売却トークンから 0x がガス代を支払う)のどちらにも対応します。

ツールの使い方

使用できるツールは 2 つです。

ツール使用するタイミング
mcp__0x-mcp__searchDocs不明なトークンアドレス、チェーンの詳細、エラーコード、API の動作については、必ず最初に呼び出してください。MCP サーバーには最新の 0x ドキュメントがあるため、学習データより優先してください。
fetch(ネイティブ JS/TS)または axiosユーザー向けに作成する開発者用コードサンプルで使用します。0x API の呼び出しに WebFetch を使用しないでください。代わりに、ユーザーが実行できるコードを提示してください。

ルール:WebFetch を使用して、0x API への生の HTTP 呼び出しを自分で作成してはいけません。代わりに、(a)mcp__0x-mcp__searchDocs を使って最新のエンドポイントの詳細を確認し、(b)ユーザーが自身の環境で実行するための fetch/axios コードを提示してください。


ステップ 1:スワップの詳細を確認する

API を呼び出す前に、次の情報を収集します。

フィールド例注意事項
sellToken0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48ERC-20 コントラクトアドレスです。ユーザーがシンボルを指定した場合は、searchDocs で正規アドレスを調べます。API はシンボルを受け付けません。
buyToken0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2ERC-20 コントラクトアドレスです。
sellAmount または buyAmount100000000トークンの最小単位で指定します(USDC は小数点以下 6 桁のため、100 USDC = 100000000)。
chainId1下のチェーン表を参照してください。
taker0xYourWalletAddress見積もりに必要です(/price では不要)。スワップを実行するウォレットを指定してください。

不足しているフィールドがあれば、先にユーザーに確認してください。

また、標準スワップ(ユーザーがガス代を支払う)とガスレス(売却トークンから手数料を差し引く)のどちらにするかも確認してください。

  • ガス代用のネイティブトークンをユーザーが保有していない場合は、ガスレスをデフォルトにします。
  • ネイティブ ETH/MATIC/BNB を売却する場合は、標準方式をデフォルトにします。ガスレス方式では ERC-20 の売却トークンのみ対応しています。

ステップ 2:スワップフローを選ぶ

フローエンドポイントのプレフィックス最適な用途署名の複雑さ
AllowanceHolder/swap/allowance-holder/ほとんどのインテグレーター、マルチシグ、v1 からアップグレードするチームapprove → トランザクション送信(型付きデータへの署名は不要)
Permit2/swap/permit2/期限付き承認、バッチ処理、既存の Permit2 承認があるユーザーapprove → EIP-712 に署名 → 署名を追加 → トランザクション送信
Gasless/gasless/ERC-20 のみ、ユーザーにガス代がない場合承認の EIP-712 に署名 + 取引の EIP-712 に署名 → 0x に POST

ユーザーが Permit2 またはガスレスを明示的に希望しない限り、AllowanceHolder をデフォルトにしてください。最もシンプルな方法であり、eth_signTypedData_v4 に署名できないスマートコントラクトウォレットでも利用できます。

特定のフローやチェーンの動作が不明な場合は、回答する前に mcp__0x-mcp__searchDocs を呼び出してください。


ステップ 3:参考価格を提示する

0x API を自分で呼び出してはいけません。代わりに、選択したフローに適した fetch 呼び出しをユーザーに提示し、確認すべきレスポンスフィールドを説明してください。

AllowanceHolder/Permit2 の価格(TypeScript):
const params = new URLSearchParams({
  chainId: "1",
  sellToken: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC
  buyToken:  "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", // WETH
  sellAmount: "100000000", // 100 USDC
});

const res = await fetch(
  `https://api.0x.org/swap/allowance-holder/price?${params}`,
  {
    headers: {
      "0x-api-key": process.env.ZERO_EX_API_KEY!,
      "0x-version": "v2",
    },
  }
);
const price = await res.json();
console.log("Buy amount:", price.buyAmount);
console.log("Price impact:", price.estimatedPriceImpact);

ユーザーに提示する主要なレスポンスフィールド:

  • buyAmount — 受け取るトークン数(最小単位)
  • estimatedPriceImpact — スリッページの推定値
  • liquidityAvailable — 続行前に true であることを確認します
  • issues — 残高や承認に関する問題を確認します
ガスレス価格:
const params = new URLSearchParams({
  chainId: "1",
  sellToken: "0xA0b86991...",
  buyToken:  "0xC02aaA39...",
  sellAmount: "100000000",
  taker: "0xYourWalletAddress",
});

const res = await fetch(
  `https://api.0x.org/gasless/price?${params}`,
  {
    headers: {
      "0x-api-key": process.env.ZERO_EX_API_KEY!,
      "0x-version": "v2",
    },
  }
);

ユーザーが価格を確認したら、ステップ 4 に進みます。


ステップ 4:確定見積もりを取得する

価格取得と同じ方法ですが、/quote を使用し、必ず taker を含めます。次のコードをユーザーに提示してください。

const params = new URLSearchParams({
  chainId: "1",
  sellToken: "0xA0b86991...",
  buyToken:  "0xC02aaA39...",
  sellAmount: "100000000",
  taker: "0xYourWalletAddress",
});

const res = await fetch(
  `https://api.0x.org/swap/allowance-holder/quote?${params}`,
  {
    headers: {
      "0x-api-key": process.env.ZERO_EX_API_KEY!,
      "0x-version": "v2",
    },
  }
);
const quote = await res.json();

⚠️ 見積もりの有効期限は約 30 秒です。取得後、ユーザーはすぐにトランザクションを送信してください。

レスポンスフィールドの動作を確認する必要がある場合は、説明する前に mcp__0x-mcp__searchDocs を呼び出してください。


ステップ 5:実行手順を説明する

ユーザーが受け取った見積もりに基づき、具体的に何をすればよいかを順を追って説明します。署名やトランザクションの送信はできません。ユーザー自身のコードまたはウォレットで実行する必要があります。

AllowanceHolder(推奨):

1. Allowance を確認する — quote.issues.allowance が null でない場合:

// Approve the AllowanceHolder contract (use spender from response — never hardcode)
await erc20.approve(quote.issues.allowance.spender, quote.sellAmount);
// Or for a permanent one-time approval:
await erc20.approve(quote.issues.allowance.spender, MaxUint256);

⚠️ transaction.to(Settler コントラクト)を直接承認しないでください。資金を失うおそれがあります。

2. トランザクションを送信する — 署名手順は不要です:

const txHash = await walletClient.sendTransaction({
  to:       quote.transaction.to,
  data:     quote.transaction.data,
  value:    BigInt(quote.transaction.value),
  gas:      BigInt(Math.floor(Number(quote.transaction.gas) * 1.2)), // +20% buffer
  gasPrice: BigInt(quote.transaction.gasPrice),
});
Permit2:

1. Permit2 コントラクトを承認する(issues.allowance が null でない場合):

// Permit2 contract address is always the same across chains
const PERMIT2 = "0x000000000022d473030f116ddee9f6b43ac78ba3";
await erc20.approve(PERMIT2, MaxUint256);

2. EIP-712 メッセージに署名する:

// Strip EIP712Domain from types — viem constructs the domain separator internally
const { EIP712Domain, ...types } = quote.permit2.eip712.types;

const sig = await walletClient.signTypedData({
  domain:  quote.permit2.eip712.domain,
  types,
  primaryType: quote.permit2.eip712.primaryType,
  message: quote.permit2.eip712.message,
});

3. 署名を追加して送信する:

import { concat, numberToHex, size } from "viem";

const sigLengthHex = numberToHex(size(sig), { signed: false, size: 32 });
const calldata    = concat([quote.transaction.data, sigLengthHex, sig]);

const txHash = await walletClient.sendTransaction({
  to:    quote.transaction.to,
  data:  calldata,
  value: BigInt(quote.transaction.value),
  gas:   BigInt(Math.floor(Number(quote.transaction.gas) * 1.2)),
});
Gasless:

1. 見積もりで返される両方の EIP-712 オブジェクトに署名する:

// Sign approval (if present)
const approvalSig = quote.approval
  ? await walletClient.signTypedData({ ...quote.approval.eip712 })
  : undefined;

// Sign trade
const tradeSig = await walletClient.signTypedData({ ...quote.trade.eip712 });

2. 0x に送信する:

const submitRes = await fetch("https://api.0x.org/gasless/submit", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "0x-api-key": process.env.ZERO_EX_API_KEY!,
    "0x-version": "v2",
  },
  body: JSON.stringify({
    trade: {
      type: "metatransaction_v2",
      eip712: quote.trade.eip712,
      signature: { ...parseSig(tradeSig), signatureType: "EIP712" },
    },
    ...(approvalSig && {
      approval: {
        type: "permit",
        eip712: quote.approval.eip712,
        signature: { ...parseSig(approvalSig), signatureType: "EIP712" },
      },
    }),
  }),
});
const { tradeHash } = await submitRes.json();

3. ステータスをポーリングする:

let status;
do {
  await new Promise(r => setTimeout(r, 3000));
  const r = await fetch(`https://api.0x.org/gasless/status/${tradeHash}`, {
    headers: { "0x-api-key": process.env.ZERO_EX_API_KEY!, "0x-version": "v2" },
  });
  status = (await r.json()).status;
} while (!["succeeded", "failed", "confirmed"].includes(status));

ステップ 6:分かりやすい概要を提示する

ユーザーが見積もりを受け取ったら、実行前に必ず概要を提示します。

Swap Summary
━━━━━━━━━━━━━━━━━━━━━━━━━━━
Selling:    100 USDC
Receiving:  ~0.0412 ETH
Rate:       1 ETH ≈ 2,427 USDC
Mode:       Gasless (no ETH needed)
Chain:      Base (chainId: 8453)
Expires:    ~30 seconds

Next steps:
1. Sign the approval message (if needed)
2. Sign the trade message
3. Submit both signatures

API リファレンス

ベース URL:https://api.0x.org

すべての呼び出しで必須のヘッダー:

  • 0x-api-key: YOUR_API_KEY — dashboard.0x.org で無料のキーを取得できます
  • 0x-version: v2

コードで使用する環境変数名:ZERO_EX_API_KEY

対応チェーン:

チェーンチェーン IDSwap APIGasless API
Ethereum1✅✅
Arbitrum42161✅✅
Base8453✅✅
Optimism10✅✅
Polygon137✅✅
BNB56✅✅
Avalanche43114✅✅
Blast81457✅✅
Mantle5000✅✅
Scroll534352✅✅
Sonic146✅✅
Abstract2741✅
Berachain80094✅
HyperEVM999✅
Ink57073✅
Linea59144✅
Mode34443✅✅
Monad143✅
Unichain130✅
World Chain480✅

一覧にないチェーンやトークンアドレスについては、mcp__0x-mcp__searchDocs を呼び出して確認してください。

Ethereum メインネットの一般的なトークンアドレス:

  • WETH:0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
  • USDC:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
  • USDT:0xdAC17F958D2ee523a2206206994597C13D831ec7
  • DAI:0x6B175474E89094C44Da98b954EedeAC495271d0F
  • WBTC:0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599

その他のチェーンでは、必ず mcp__0x-mcp__searchDocs を使ってアドレスを調べてください。


重要な安全ルール

  1. Settler コントラクトを承認しないでください。 transaction.to が Settler を指している場合があります。API レスポンスの issues.allowance.spender または allowanceTarget にある spender のみを承認してください。
  2. spender アドレスをハードコードしないでください。 必ず API レスポンスから読み取ってください。
  3. 見積もりの有効期限は約 30 秒です。 取得後すぐに送信してください。
  4. simulationIncomplete を確認してください — true の場合、トランザクションがリバートする可能性があることをユーザーに警告してください。
  5. liquidityAvailable を確認してください — false の場合はユーザーに伝え、数量またはチェーンの変更を提案してください。

エラー処理ガイド

エラー原因対処法
400 Bad Requestパラメーターが欠落している、または無効ですレスポンス本文の validationErrors を確認してください
INSUFFICIENT_ASSET_LIQUIDITY流動性が不足しています数量を減らすか、別のチェーンを試してください
issues.balance が null でないユーザーがトークンを保有していません残高と必要な数量を表示してください
Gasless でサポートされていないトークン売却するトークンがネイティブトークンですSwap API v2 にフォールバックしてください
simulationIncomplete: trueシミュレーションが完了しませんでしたユーザーに警告してください。トランザクションがリバートする可能性があります
Allowance エラー承認が不足しています見積もりを取得する前に承認手順を実行してください

ここに記載されていないエラーについては、エラーコードを指定して mcp__0x-mcp__searchDocs を呼び出してください。

コメント