Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

MCP 서버로 결제하기

이 가이드에서는 x402가 활성화된 API를 MCP 도구에 연결하여 AI 클라이언트가 자연어 프롬프트를 통해 API를 호출하고 비용을 지불하는 방법을 보여줍니다. 이 가이드는 종량제 API 구축의 서버를 기반으로 합니다.

무엇을 구축할 것인가

x402 유료 API를 도구로 래핑하는 MCP 서버를 구축합니다. AI 클라이언트가 자연어 프롬프트를 입력하면 각 도구 호출이 유료 x402 요청을 트리거하고, 정산은 Stablescan에서 확인할 수 있습니다. 사용자는 지갑 프롬프트를 볼 필요가 없습니다.

데모

1단계. Claude의 사용자: "ACME Corp의 재무 데이터를 가져와 신용 위험을 평가해 줘."

2단계. 클라이언트가 get_company_financials("ACME")를 호출합니다.
        → MCP 핸들러: fetchWithPayment("/financials?ticker=ACME")
        → 402 결제 필요 → ERC-3009 서명 → 다시 시도
        → Facilitator가 $0.01 USDT0를 온체인에서 정산합니다.
        → tx: 0x8f3a...aaaa
        → 200 OK { revenue, debt_ratio, cash_flow }

3단계. 클라이언트가 assess_credit_risk(financials)를 호출합니다.
        → MCP 핸들러: fetchWithPayment("/credit-risk", POST)
        → Facilitator가 $0.05 USDT0를 온체인에서 정산합니다.
        → tx: 0x9bc4...bbbb
        → 200 OK { score: 72, rating: "moderate" }

4단계. Claude가 응답합니다.
        "ACME Corp의 신용 위험 점수는 72점(보통)입니다. 매출은 안정적이지만,
        부채-자본 비율은 1.8배로 높습니다..."

tx 값 모두 https://stablescan.xyz에서 확인할 수 있습니다.

개요

MCP 서버:
// --- MCP 서버 ---
// x402 지원 API를 MCP 도구에 연결합니다.
tools = {
  "get_company_financials": {
    handler: (ticker) =>
      fetchWithPayment("https://api.example.com/financials?ticker=" + ticker),
  },
  "assess_credit_risk": {
    handler: (financials) =>
      fetchWithPayment("https://api.example.com/credit-risk", {
        method: "POST",
        body: JSON.stringify({ financials }),
      }),
  },
}
사용자 (AI 클라이언트를 통해):
─── AI 클라이언트 ───────────────────────────────────────
사용자: "ACME Corp의 재무 데이터를 가져와 신용 위험을 평가해 줘."

클라이언트가 get_company_financials 도구를 호출합니다.
  → MCP 서버가 x402 유료 요청을 보냅니다.
  → Facilitator가 USDT0를 온체인에서 정산합니다.
  → API가 재무 데이터를 반환합니다.

클라이언트가 결과와 함께 assess_credit_risk 도구를 호출합니다.
  → MCP 서버가 x402 유료 요청을 보냅니다.
  → Facilitator가 USDT0를 온체인에서 정산합니다.
  → API가 위험 평가를 반환합니다.
  → 클라이언트가 결합된 결과로 응답합니다.

전제 조건

  • 실행 중인 x402 서버 ( 종량제 API 구축 참조).
  • MCP 호환 AI 클라이언트 (Claude Desktop, Claude Code 등).

1단계: MCP 서버 생성

MCP 서버는 AI 클라이언트와 x402 지원 API 간의 다리 역할을 합니다. 각 도구는 x402 클라이언트 SDK를 사용하여 유료 요청을 하고 결과를 반환합니다.

npm install @modelcontextprotocol/sdk @x402/fetch @x402/evm @tetherto/wdk-wallet-evm
// mcp-server.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import WalletManagerEvm from "@tetherto/wdk-wallet-evm";
import { x402Client, wrapFetchWithPayment } from "@x402/fetch";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { z } from "zod";
 
// --- 지갑 및 x402 클라이언트 ---
const account = await new WalletManagerEvm(process.env.SEED_PHRASE!, {
  provider: "https://rpc.stable.xyz",
}).getAccount(0);
 
const client = new x402Client();
registerExactEvmScheme(client, { signer: account });
const fetchWithPayment = wrapFetchWithPayment(fetch, client);
 
// --- x402 API 기본 URL ---
const API_BASE = process.env.API_BASE || "http://localhost:4021";
 
// --- MCP 서버 ---
const server = new McpServer({
  name: "x402-payments",
  version: "1.0.0",
});
 
server.tool(
  "get_company_financials",
  "티커로 회사 재무 데이터 가져오기 (유료 엔드포인트, 호출당 $0.01)",
  { ticker: z.string().describe("회사 티커 심볼 (예: ACME)") },
  async ({ ticker }) => {
    const response = await fetchWithPayment(`${API_BASE}/financials?ticker=${ticker}`);
    const data = await response.json();
    return { content: [{ type: "text", text: JSON.stringify(data) }] };
  },
);
 
server.tool(
  "assess_credit_risk",
  "재무 데이터로 신용 위험 평가 (유료 엔드포인트, 호출당 $0.05)",
  { financials: z.string().describe("회사 재무 데이터의 JSON 문자열") },
  async ({ financials }) => {
    const response = await fetchWithPayment(`${API_BASE}/credit-risk`, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: financials,
    });
    const data = await response.json();
    return { content: [{ type: "text", text: JSON.stringify(data) }] };
  },
);
 
server.tool(
  "check_balance",
  "결제 지갑의 USDT0 잔액 확인",
  {},
  async () => {
    const USDT0_STABLE = "0x779Ded0c9e1022225f8E0630b35a9b54bE713736";
    const balance = await account.getTokenBalance(USDT0_STABLE);
    const formatted = (Number(balance) / 1e6).toFixed(2);
    return {
      content: [{ type: "text", text: `지갑 잔액: ${formatted} USDT0` }],
    };
  },
);
 
// --- 시작 ---
const transport = new StdioServerTransport();
await server.connect(transport);

각 도구 핸들러는 fetchWithPayment를 호출하며, 이는 전체 x402 결제 주기를 자동으로 처리합니다. AI 클라이언트는 도구 이름, 설명 및 매개변수만 볼 수 있습니다.

2단계: AI 클라이언트 구성

MCP 서버를 AI 클라이언트 구성에 추가합니다.

Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "x402-payments": {
      "command": "npx",
      "args": ["tsx", "/path/to/mcp-server.ts"],
      "env": {
        "SEED_PHRASE": "여기에 시드 문구 입력",
        "API_BASE": "https://api.example.com"
      }
    }
  }
}
Claude Code:
claude mcp add x402-payments -- npx tsx /path/to/mcp-server.ts

설정 후 AI 클라이언트를 다시 시작하십시오. 도구는 사용 가능한 도구 목록에 나타나야 합니다.

3단계: 프롬프트 입력 및 사용

구성되면 AI 클라이언트는 사용자의 프롬프트를 통해 유료 API를 호출할 수 있습니다.

사용자: "ACME Corp의 재무 데이터를 가져와 신용 위험을 평가해 줘."

  1. 클라이언트가 get_company_financials("ACME")를 호출합니다: x402를 통해 $0.01 지불. 수익, 부채 비율, 현금 흐름 등을 반환합니다.
  2. 클라이언트가 assess_credit_risk(financials)를 호출합니다: x402를 통해 $0.05 지불. 위험 점수, 등급, 주요 요인을 반환합니다.
  3. 클라이언트가 응답합니다: "ACME Corp의 신용 위험 점수는 72점(보통)입니다. 매출은 안정적이지만, 부채-자본 비율은 1.8배로 높습니다..."

개별 도구도 자체적으로 작동합니다.

  • "ACME Corp의 재무 데이터를 가져와"는 get_company_financials($0.01)를 호출합니다.
  • "이 데이터에 대한 신용 위험을 평가해 줘"는 assess_credit_risk($0.05)를 호출합니다.
  • "USDT0 잔액이 얼마나 남았나요?"는 check_balance를 호출합니다.

사용자는 지갑, 서명 또는 결제 흐름과 상호 작용하지 않습니다. MCP 서버는 각 도구 호출에 대한 결제를 투명하게 처리합니다.

지출 통제

예기치 않은 지출을 방지하려면 MCP 서버에 통제 기능을 추가하는 것을 고려하십시오.

const MAX_PER_CALL = 100_000;   // 기본 단위로 $0.10
const MAX_PER_SESSION = 5_000_000; // 기본 단위로 $5.00
let sessionSpent = 0n;
 
function checkSpendingLimit(amount: bigint) {
  if (amount > BigInt(MAX_PER_CALL)) {
    throw new Error(`금액이 호출당 제한인 ${MAX_PER_CALL / 1e6}을 초과합니다.`);
  }
  if (sessionSpent + amount > BigInt(MAX_PER_SESSION)) {
    throw new Error(`세션 지출 한도인 ${MAX_PER_SESSION / 1e6}에 도달했습니다.`);
  }
  sessionSpent += amount;
}

이러한 제한은 서버 측에서 실행됩니다. AI 클라이언트는 이를 수정하거나 우회할 수 없습니다.

다음 권장 사항

  • 종량제 API 구축: 이 MCP 서버가 연결하는 x402 서버를 설정합니다.
  • x402 개념: 이러한 결제 뒤에 있는 정산 프로토콜을 검토합니다.
  • AI로 개발: Stable의 Docs 및 Runtime MCP 서버를 동일한 AI 클라이언트에 연결합니다.