zapper-mcp
zapper-mcp
Zapper DeFiポートフォリオAPIを、LLMクライアント向けに考え抜かれたツールインターフェースとして公開するMCPサーバーです。Claude DesktopやMCP互換ホストに接続し、あらゆるウォレットについて自然言語で質問できます。「このウォレットの価値は?」「Aaveのポジションはある?」「Base上の主要な保有銘柄を見せて」など。
21日間のAIエンジニアリングスプリントの9日目に構築。10日目には、このサーバーをMastraエージェントに組み込みます。
ツールインターフェース
各プリミティブの設計根拠は DESIGN.md にあります。要約は以下の通りです。
プリミティブ | 名前 | 配置の理由 |
Tool |
| モデル呼び出し用。アドレスごとに動的。トークンとDeFiの全内訳を返す |
Tool |
| スポットトークンの質問に特化したツール。トークン保有量のみが必要な場合に、モデルがポートフォリオ全体を解析するのを避ける |
Tool |
| DeFiの質問に特化したツール。 |
Resource |
| 静的なネットワークリスト。プロンプト構築時にホストが環境コンテキストとして注入するため、モデルはツール呼び出しの回数を消費せずに有効なネットワーク名を知ることができる |
Prompt |
| ユーザー呼び出し型のワークフロー。アナリストのペルソナ、ツールインベントリ、ウォレットアドレスを用いて、複数ターンのポートフォリオ分析会話を事前準備する |
なぜ「すべてを取得する」大きなツールを1つにしないのか? ツールを統合すると、モデルは質問のたびに(焦点を絞った質問であっても)混合スキーマの大きなレスポンスを受け取り、解析することを強制されます。ツールの境界はスコープの宣言です。適切なツールは、推論ステップが必要とするものを正確に返します。
なぜAPIキーはツール引数ではなくサーバー設定にあるのか? 認証情報はホスト層(プロセス起動時に注入される環境変数)に属するものであり、MCPプロトコル内ではありません。もし api_key がツールパラメータであれば、LLMの推論フローを通り、会話履歴に残ってしまいます。マルチテナント展開における適切なメカニズムは、トランスポート層認証(Streamable HTTP上のBearerトークン)またはユーザーごとのOAuthですが、これらは本プロジェクトの範囲外です。既知の制限を参照してください。
Related MCP server: Ankr API MCP Server
要件
Node.js 20以上
pnpm
インストール
git clone https://github.com/mehdi-loup/zapper-mcp
cd zapper-mcp
pnpm install
pnpm build設定
.env.example を .env にコピーし、キーを追加します:
cp .env.example .env
# edit .env and set ZAPPER_API_KEY=your_key_hereZAPPER_API_KEY が欠落している場合、サーバーは起動時に即座に失敗します。最初のツール呼び出し時ではなく、すぐにエラーを確認できます。
実行
スタンドアロンの動作確認(Claude Desktopなしで動作することを確認):
ZAPPER_API_KEY=your_key pnpm client出力:ツール/リソース/プロンプトをリストアップし、vitalik.eth に対して各ツールを呼び出します。
サーバーの直接起動:
ZAPPER_API_KEY=your_key pnpm startClaude Desktopへの組み込み
~/Library/Application Support/Claude/claude_desktop_config.json に追加します:
{
"mcpServers": {
"zapper-mcp": {
"command": "node",
"args": ["/absolute/path/to/zapper-mcp/build/server.js"],
"env": {
"ZAPPER_API_KEY": "your_key_here"
}
}
}
}Claude Desktopを再起動します。3つのツール、zapper://supported-networks リソース、および analyze-wallet プロンプトが利用可能になります。
ログ(サーバーの読み込みに失敗した場合):
~/Library/Logs/Claude/mcp-server-zapper-mcp.logMastra統合(10日目)
MastraのMCPクライアントを介してこのサーバーをMastraエージェントに組み込むには:
サーバーを起動:
node /path/to/build/server.jsMastra MCPクライアントをstdioトランスポート、サーバー名
zapper-mcpで設定エージェントはMCPを通じてのみZapperデータを消費します。エージェントリポジトリ内の
lib/zapper.tsは使用されなくなります
すべてのツールをMastraエージェントに公開する必要はありません。これは10日目の設計判断となります。
ツールリファレンス
get_portfolio(address, networks?)
ポートフォリオの完全な内訳:合計USD、全トークン保有量、全DeFiポジション。
address — wallet address or ENS name
networks — optional array: ["ethereum", "base", "arbitrum", ...]get_token_balances(address, networks?)
スポットトークン残高のみ(DeFiポジションは含まれません)。
get_app_positions(address, networks?, app_slug?)
DeFiアプリのポジションのみ(Aave、Uniswap、Sablierなど)。
app_slug — optional filter: "aave-v3", "uniswap-v3", ...リソース:zapper://supported-networks
インデックス化された全ネットワークの { name, chainId } のJSON配列。コンテキスト構築時にホストによって読み取られます。
プロンプト:analyze-wallet
ポートフォリオ分析の会話を事前準備します。address 引数を取ります。
エラーハンドリング
各ツールは、以下の場合にモデルが対処可能なメッセージと共に isError: true を返します:
HTTP 401 / 無効なAPIキー
HTTP 429 / レート制限超過
HTTP 5xx / Zapperサーバーエラー
ネットワークタイムアウト(15秒)
不正なレスポンス
空のウォレット(totalUSD: 0, tokens: [])は isError: false を返します。空であることはエラーではありません。
既知の制限
シングルキー信頼モデル:サーバーは1つの
ZAPPER_API_KEYを保持し、1人の所有者にサービスを提供します。マルチテナント展開には、ユーザーごとのOAuthまたはトランスポート層認証(Bearerトークン付きのStreamable HTTP)が必要です。キャッシュなし:すべてのツール呼び出しがZapper APIにヒットします。本番サーバーでは、短いTTLキャッシュ(ポジションの変化は緩やかであるため)を追加し、レート制限を積極的に遵守する必要があります。
resources/subscribeなし:zapper://supported-networksは静的なリストです。ライブ更新には、サーバーがサブスクライブ機能をアドバタイズし、notifications/resources/updatedを発行する必要があります。stdioトランスポートのみ:Streamable HTTPトランスポートは将来のイテレーションに延期されました。
ページネーションの上限:ツールはリクエストごとに最大50個のトークンと20個のアプリポジションを返します。
今後の予定
10日目:MastraのMCPクライアントを介して、このサーバーを ../day1-wallet-agent/ のMastraウォレットエージェントに組み込みます。エージェントはMCPを通じてのみZapperデータを消費し、ツールインターフェースがエージェントフレームワークから機能を実際に分離できることを検証します。
Available Tools
3 toolsget_app_positionsA
DeFi app positions only (Aave lending, Uniswap LP, staking, etc.). Use when the question is about protocol exposure: 'any leveraged positions?', 'Aave borrows?', 'LP positions on Uniswap?'. Optionally filter by app slug.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Wallet address or ENS name | |
| networks | No | Networks to filter by. Supported: ethereum, base, optimism, arbitrum, polygon, bnb, avalanche, zora. Omit for all networks. | |
| app_slug | No | Filter to a specific app slug, e.g. 'aave-v3', 'uniswap-v3' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but does not disclose behavioral traits such as read-only nature, data freshness, or performance characteristics. The description only mentions filtering capabilities, which is adequate but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: first defines scope, second provides usage context and optional filter. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does not explain return values. However, given the tool's simplicity (3 params, 1 required) and clear purpose, the description is largely complete. Minor gap in output expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% coverage with descriptions for each parameter. The description does not add semantic value beyond the schema, simply restating the optional app_slug filter. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'DeFi app positions only' and lists examples (Aave, Uniswap, staking), clearly distinguishing it from sibling tools like get_portfolio and get_token_balances.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description directly tells when to use the tool ('when the question is about protocol exposure') and provides example queries ('any leveraged positions?', 'Aave borrows?', 'LP positions on Uniswap?'), effectively guiding the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_portfolioA
Full portfolio breakdown for a wallet: total USD value, all token holdings, and all DeFi app positions across networks. Use this when the user wants a complete picture of what a wallet holds.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Wallet address or ENS name | |
| networks | No | Networks to filter by. Supported: ethereum, base, optimism, arbitrum, polygon, bnb, avalanche, zora. Omit for all networks. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Discloses output (breakdown) but no information about side effects, permissions, rate limits, or data freshness. Lacks behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences. First describes output, second specifies usage context. No wasted words, front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, so description must compensate. It explains return includes USD value, tokens, DeFi positions, but lacks detail on structure (e.g., token amounts, symbols). Adequate but not thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description adds little beyond schema: repeats networks list and 'Omit for all networks' which is already in the schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool provides a full portfolio breakdown including total USD value, token holdings, and DeFi positions. It distinguishes itself from siblings (get_app_positions, get_token_balances) which are subsets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use when user wants a complete picture of wallet holdings. Does not list when to avoid using or mention alternatives, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_token_balancesA
Spot token balances only (no DeFi positions). Use when the question is specifically about token holdings: 'does this wallet hold ETH?', 'how much USDC is on Base?'
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Wallet address or ENS name | |
| networks | No | Networks to filter by. Supported: ethereum, base, optimism, arbitrum, polygon, bnb, avalanche, zora. Omit for all networks. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses the scope (spot tokens only) but does not mention any other behavioral traits such as rate limits, authentication requirements, or response format. Acceptable but could be more comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with no redundant information. Every word contributes to clarity and utility.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has only two parameters and no output schema, the description is reasonably complete: it states scope, use cases, and exclusions. It could briefly hint at output structure, but that is not critical for this simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds minor value by providing usage examples but does not elaborate on parameter semantics beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns 'spot token balances only' and explicitly excludes DeFi positions, distinguishing it from siblings like get_app_positions. It also provides specific example queries, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use when the question is specifically about token holdings' and gives concrete examples. It implies when not to use (DeFi positions) but does not directly name alternative tools for that case. Still, the guidance is clear and helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct aspect of wallet data: token balances, DeFi positions, or full portfolio. Descriptions clearly differentiate them, leaving no ambiguity for an agent.
All tools follow a consistent 'get_<descriptive_noun>' pattern (get_app_positions, get_portfolio, get_token_balances), making naming predictable and readable.
Three tools is well-scoped for a wallet data server, covering the core needs without excess or deficiency.
The set covers token balances, DeFi positions, and a combined portfolio, which forms a complete picture for most wallet queries. Missing advanced features like transaction history are acceptable for the scope.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server giving AI agents one-connection access to crypto & DeFi data: DeFi protocol TVL, stableco
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
MCP server connecting AI agents to non-custodial staking data across 130+ networks.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server that enables LLMs to perform blockchain operations on the Base network through natural language commands, including wallet management, balance checking, and transaction execution.4273MIT
- AlicenseBqualityCmaintenanceAn MCP server that fetches on-chain blockchain data via the Ankr API, allowing LLMs to retrieve token balances for wallet addresses on specific networks.1253MIT
- AlicenseAqualityDmaintenanceAn MCP server that empowers AI agents to inspect any wallet’s balance and onchain activity across major EVM chains and Solana chain.39MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that provides live crypto portfolio data, token info, gas prices, swap offers, and Bitcoin balance via Zerion and Blockstream APIs.3MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mehdi-loup/zapper-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server