Claude에서의 자산 식별(Asset Resolution): 토큰 심볼에서 컨트랙트 주소까지
요약
Claude 에이전트가 DeFi 트랜잭션을 수행할 때 발생하는 토큰 식별 문제를 해결하는 방법을 다룹니다. MCP(Model Context Protocol)를 통해 WAIaaS를 연결하여 토큰 심볼을 정확한 컨트랙트 주소로 변환하고 안전한 온체인 액션을 실행하는 가이드를 제공합니다.
핵심 포인트
- LLM은 토큰 심볼과 실제 컨트랙트 주소 간의 격차로 인해 환각을 일으킬 수 있음
- 정확한 자산 식별(Asset Resolution)은 안전한 DeFi 에이전트 구축의 핵심 요소임
- WAIaaS는 MCP를 통해 Claude 에이전트에게 45개의 온체인 도구를 제공함
- Claude Desktop 설정을 통해 간단히 지갑 및 DeFi 도구 연동 가능
Claude에서의 자산 식별(Asset Resolution): 토큰 심볼에서 컨트랙트 주소까지
온체인(onchain) 액션을 위한 MCP 도구들은 매우 훌륭하게 들리지만, 당신의 Claude 에이전트가 컨트랙트 주소(contract address) 대신 토큰 심볼(token symbol)로 USDC를 보내려고 자신 있게 시도하여 시작하기도 전에 모든 것이 망가지는 상황을 마주하기 전까지는 그렇습니다. 만약 당신이 Claude의 모델 컨텍스트 프로토콜(Model Context Protocol, MCP)을 사용하여 구축 중이고, 에이전트가 실제로 DeFi 액션을 실행하기를 원한다면, 토큰 식별(token resolution)은 "Claude가 무엇을 해야 하는지 안다"와 "Claude가 실제로 그것을 할 수 있다" 사이에 놓인 조용한 문제입니다. WAIaaS가 이를 어떻게 처리하는지, 그리고 claude_desktop_config.json의 단 한 줄이 어떻게 당신의 에이전트에게 이를 올바르게 수행할 수 있는 도구를 제공하는지 알아보겠습니다.
토큰 식별이 보기보다 어려운 이유
당신이 Claude에게 "Jupiter에서 0.1 SOL을 USDC로 스왑해줘"라고 말하면, Claude는 그 의도를 완벽하게 이해합니다. 하지만 해당 스왑을 실행하려면 Solana 상의 USDC에 대한 특정 컨트랙트 주소(EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v), SOL의 래핑된 버전(wrapped version)에 대한 정확한 민트 주소(mint address), 그리고 사람이 읽을 수 있는 형태가 아닌 램포트(lamports) 단위의 정확한 양이 필요합니다. 언어 모델(language model)이 의미론적으로 이해하는 것과 블록체인 트랜잭션(blockchain transaction)이 구조적으로 필요로 하는 것 사이에는 큰 격차가 존재합니다.
대부분의 개발자들은 LLM을 온체인 액션에 직접 연결하려고 할 때 이 벽에 부딪힙니다. 모델은 주소를 환각(hallucinate)하거나, 테스트넷에서 메인넷 주소를 사용하거나, 소수점(decimals)을 잘못 계산합니다. 결국 당신은 정작 신경 써야 할 에이전트의 동작을 구축하는 것보다 주소 식별 및 검증 로직을 작성하는 데 더 많은 시간을 소비하게 됩니다.
여기서의 위험은 단순히 깨진 트랜잭션에 그치지 않습니다. DeFi 문맥에서—예를 들어 대출 포지션(lending position)이나 토큰 승인(token approval)과 같은 상황에서—토큰 주소가 잘못 식별되는 것은 단순히 호출이 실패하는 문제가 아닙니다. 이는 잠재적으로 잘못된 컨트랙트를 대상으로 트랜잭션이 실행될 수 있음을 의미합니다. 심볼, 체인 문맥(chain context), 그리고 주소 검증을 처리하는 적절한 식별 계층(resolution layer)을 구축하는 것은 진정으로 쉽지 않은 일입니다.
MCP 서버로서의 WAIaaS: 단 한 줄의 설정
WAIaaS는 AI 에이전트(AI agents)를 위해 특별히 구축된 셀프 호스팅 방식의 Wallet-as-a-Service (WaaS)입니다. 이는 Claude가 Model Context Protocol (MCP)을 통해 직접 호출할 수 있는 45개의 MCP 도구(tools)를 제공하며, 여기에는 지갑 운영, 토큰 전송, DeFi 프로토콜 작업, NFT, 그리고 x402 HTTP 결제 프로토콜이 포함됩니다.
Claude가 이 모든 것에 접근할 수 있도록 하려면, Claude Desktop 설정에 서버 블록 하나를 추가하기만 하면 됩니다:
{
"mcpServers": {
"waiaas": {
...
이 단 한 줄(좋습니다, 한 블록이죠)이 상황을 바꿉니다. 이제 Claude는 자산 식별(resolving assets), 잔액 확인, 스왑(swaps) 실행, DeFi 포지션 조회 등을 위한 도구를 갖춘 세션 인증된 지갑을 보유하게 됩니다. WAIAAS_SESSION_TOKEN은 Claude의 접근 권한을 특정 지갑으로 제한합니다. 즉, 에이전트는 세션이 허용되지 않은 작업은 무엇도 수행할 수 없습니다.
resolve-asset 및 get-tokens 도구
WAIaaS가 제공하는 45개의 MCP 도구 중, 토큰 식별(token resolution) 문제와 특히 관련이 있는 두 가지는 resolve-asset과 get-tokens입니다.
Claude가 "USDC"와 같이 사람이 읽을 수 있는 심볼(symbol)에서 Jupiter 스왑에 필요한 실제 민트 주소(mint address)로 넘어가야 할 때, resolve-asset을 호출합니다. 이 도구는 체인 컨텍스트(chain context)를 이해합니다. 즉, Solana 상의 USDC가 Ethereum 메인넷 상의 USDC와 다른 주소를 가진다는 것을 알고 있으며, 지갑에 설정된 네트워크를 기반으로 해당 모호성을 처리합니다.
get-tokens 도구는 Claude에게 현재 지갑 컨텍스트에서 사용 가능한 토큰 목록을 제공하며, 여기에는 주소, 심볼, 체인 정보가 이미 첨부되어 있습니다. 이는 Claude가 학습 데이터로부터 주소를 추측하거나 기억할 필요가 없음을 의미합니다. 대신 WAIaaS 데몬(daemon)의 실시간 설정을 조회하여 확인할 수 있습니다.
MCP 설정이 완료된 후의 실제 흐름은 다음과 같습니다:
사용자: "Jupiter에서 0.1 SOL을 USDC로 스왑해줘"
→ Claude가 Solana 상의 USDC 주소를 확인하기 위해 get-tokens 호출
...
Claude는 오케스트레이션(orchestration)을 수행합니다. WAIaaS는 식별(resolution), 정책 집행(policy enforcement), 서명(signing) 및 실행(execution)을 수행합니다. 두 부분은 깔끔하게 분리된 상태를 유지합니다.
데몬(Daemon)을 먼저 실행하기
MCP 설정이 유용한 작업을 수행하기 전에, 먼저 로컬에서 실행 중인 WAIaaS 데몬(daemon)이 필요합니다. 가장 빠른 방법은 다음과 같습니다:
npm install -g @waiaas/cli
waiaas init
waiaas start
...
quickset은 지갑(wallets)과 MCP 세션(sessions)을 한 번에 생성하며, Claude Desktop에 붙여넣어야 할 MCP 설정 JSON을 출력합니다. 또는 Docker를 선호한다면 다음과 같이 진행하세요:
git clone https://github.com/minhoyoo-iotrust/WAIaaS.git
cd WAIaaS
docker compose up -d
Docker 이미지(ghcr.io/minhoyoo-iotrust/waiaas:latest)는 기본적으로 127.0.0.1:3100에 바인딩(bind)되며, 이는 MCP 서버 설정이 가리키는 위치와 정확히 일치합니다.
첫 실행 시 마스터 비밀번호(master password)를 입력하라는 프롬프트가 뜨지 않도록 자동 프로비저닝(auto-provisioning)을 원한다면 다음과 같이 실행하세요:
docker run -d \
--name waiaas \
-p 127.0.0.1:3100:3100 \
...
마지막 명령은 자동 생성된 마스터 비밀번호를 가져옵니다. 이를 안전한 곳에 저장해 두세요.
설정 후 Claude가 실제로 할 수 있는 일
45개의 MCP 도구(tools)는 토큰 식별(token resolution)을 훨씬 뛰어넘는 여러 카테고리에 걸쳐 있습니다. 에이전트(agent)가 세션을 확보했을 때 사용할 수 있는 기능들을 실무적인 관점에서 살펴보겠습니다:
지갑 및 잔액 작업 (Wallet and balance operations):
get-balance— 네이티브 토큰 잔액get-assets— 모든 토큰 잔액get-address— 지갑 주소get-wallet-info— 전체 지갑 메타데이터 (metadata)
트랜잭션 (Transactions):
send-token— 네이티브 또는 토큰 전송send-batch— 한 번의 호출로 여러 건의 전송 수행transfer-nft— ERC-721, ERC-1155 또는 Metaplex NFT 전송simulate-transaction— 실행 전 드라이 런 (dry-run)get-transaction,list-transactions— 내역 및 상태 확인
DeFi 작업 (DeFi actions):
action-provider— 통합된 15개 DeFi 프로토콜(protocols)의 진입점get-defi-positions— 프로토콜 전반의 대출(lending) 및 스테이킹(staking) 포지션get-health-factor— Aave 및 유사 프로토콜의 대출 건전성 (health factor)hyperliquid— 무기한 선물 (perpetuals), 현물 거래 (spot trading), 서브 계정 (sub-accounts)polymarket— 예측 시장 (prediction market) 포지션
자산 식별 (Asset resolution):
resolve-asset— 체인 컨텍스트를 포함한 심볼(symbol)에서 주소(address)로의 변환get-tokens— 현재 지갑에서 사용 가능한 토큰들
온체인 검증 (Onchain verification):
erc8004-get-agent-info— 에이전트 평판 조회erc8004-get-reputation— 평판 점수erc8004-get-validation-status— 검증 상태
DeFi 커버리지는 15개의 통합 프로토콜 제공업체를 통해 제공됩니다: Aave v3, Across, D'CENT Swap, Drift, ERC-8004, Hyperliquid, Jito staking, Jupiter swap, Kamino, Lido staking, LI.FI, Pendle, Polymarket, XRPL DEX, 그리고 0x swap입니다. Claude는 세션이 수립되면 action-provider 도구를 통해 이들 중 어떤 것이든 호출할 수 있습니다.
정책(Policies)을 통한 Claude의 과잉 동작 방지
토큰 식별(Token resolution)이 정확하게 이루어지는 것은 방정식의 한 부분일 뿐입니다. 다른 한 부분은 Claude 에이전트가 허용된 범위 이상으로 동작하지 않도록 보장하는 것입니다. 특히 단 한 번의 트랜잭션으로 상당한 가치가 이동할 수 있는 DeFi 환경에서는 더욱 중요합니다.
WAIaaS는 21가지 정책 유형과 4가지 보안 티어(security tiers)인 INSTANT, NOTIFY, DELAY, APPROVAL를 갖춘 정책 엔진(policy engine)을 보유하고 있습니다. Claude를 위한 세션을 생성할 때, 해당 세션의 지갑에 정책을 설정하게 됩니다. 간단한 지출 한도 설정은 다음과 같습니다:
curl -X POST http://127.0.0.1:3100/v1/policies \
-H "Content-Type: application/json" \
-H "X-Master-Password: my-secret-password" \
...
이 설정이 적용되면, Claude는 소액 스왑($100 미만)은 즉시 실행할 수 있고, 중간 규모($500 이하)는 알림을 받으며, 더 큰 트랜잭션($2000 이하)은 실행 전 15분 동안 대기열에 머물게 됩니다. 그 이상의 금액은 사용자의 명시적인 승인이 필요합니다. Claude는 이 중 어떤 것도 제어하지 않습니다. 정책 엔진은 7단계 파이프라인을 통해 들어오는 모든 트랜잭션에 대해 서버 측에서 실행됩니다.
토큰에 대한 기본 거부(default-deny) 동작 또한 알아둘 가치가 있습니다. ALLOWED_TOKENS 정책을 설정하지 않는 한, 토큰 전송은 차단됩니다. 이는 잘못된 토큰을 식별한 설정 오류가 있는 에이전트가 실수로 토큰을 보내는 것을 방지함을 의미합니다. 정책 계층(policy layer)이 이를 먼저 잡아내기 때문입니다.
Claude가 상호작용할 DeFi 프로토콜에 대한 도메인 수준의 허용 목록(allowlist)을 원한다면, CONTRACT_WHITELIST 정책이 이를 처리합니다:
curl -X POST http://127.0.0.1:3100/v1/policies \
-H "Content-Type: application/json" \
-H "X-Master-Password: my-secret-password" \
...
별도의 에이전트 컨텍스트를 위한 멀티 지갑 설정 (Multi-Wallet Setup)
만약 여러 개의 Claude 에이전트를 실행 중이라면 — 예를 들어, 하나는 트레이딩용으로, 다른 하나는 Solana 전용 워크플로(workflow)용으로 사용한다면 — 서로 다른 지갑 세션(wallet sessions)을 가리키는 별도의 MCP 서버 인스턴스를 실행할 수 있습니다:
{
"mcpServers": {
"waiaas-trading": {
...
각 지갑은 고유한 세션, 고유한 정책, 그리고 고유한 토큰 허용 목록(token allowlists)을 가집니다. 자산 식별(asset resolution) 컨텍스트는 지갑별로 정확하게 유지됩니다. 즉, 트레이딩 지갑의 Ethereum 세션에 있는 USDC는 Solana 지갑 세션에 있는 USDC와 혼동되지 않습니다.
빠른 시작: 작동하는 설정을 위한 4단계
- CLI 설치 및 초기화:
npm install -g @waiaas/cli && waiaas init && waiaas start - 지갑 및 세션 생성:
waiaas quickset --mode mainnet(MCP 설정 JSON을 출력합니다) - 설정값 붙여넣기:
~/Library/Application Support/Claude/claude_desktop_config.json에 붙여넣습니다. - Claude Desktop 재시작: 그리고 다음과 같이 물어보세요: "내 지갑 잔액이 얼마인가요?"
문제가 발생하면, OpenAPI 명세(spec)는 http://127.0.0.1:3100/doc에서 확인할 수 있으며, 대화형 API 레퍼런스(reference)는 http://127.0.0.1:3100/reference에서 제공됩니다.
다음 단계
WAIaaS는 오픈 소스(open source)이며 셀프 호스팅(self-hosted) 방식이므로, 사용자의 지갑 키와 트랜잭션 데이터는 사용자의 인프라에 그대로 유지됩니다. GitHub 저장소(repo)에는 전체 코드베이스, Docker 설정 및 문서가 포함되어 있습니다: https://github.com/minhoyoo-iotrust/WAIaaS. 프로젝트 사이트와 추가 가이드는 https://waiaas.ai를 방문해 주세요. 만약 Claude와 온체인 액션(onchain actions)을 활용하여 무언가를 구축하고 있다면, 45개의 MCP 도구와 정책 엔진(policy engine)을 살펴보는 데 오후 시간 정도를 투자할 가치가 있습니다. "Claude가 의도를 이해한다"와 "Claude가 정확하고 안전하게 실행한다" 사이의 간극을 메우기 위해 바로 이 시스템이 설계되었습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기