get_protocol_info
Retrieve comprehensive DeFi protocol data including TVL, vault counts, versions, auditors, and security incidents for risk assessment and due diligence.
Instructions
Get detailed information about a DeFi protocol including TVL, vault count, versions, auditors, and security incidents.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| protocolId | Yes | Protocol ID (e.g. morpho, aave-v3, yearn-v3, beefy) |
Implementation Reference
- src/tools/get-protocol-info.ts:6-19 (handler)Main registration and handler for get_protocol_info tool. Defines the tool with Zod schema (protocolId parameter), executes API call to fetch protocol data, formats the response using formatProtocolInfo helper, and returns formatted text content.
export function registerGetProtocolInfo(server: McpServer) { server.tool( 'get_protocol_info', 'Get detailed information about a DeFi protocol including TVL, vault count, versions, auditors, and security incidents.', { protocolId: z.string().describe('Protocol ID (e.g. morpho, aave-v3, yearn-v3, beefy)'), }, async (params) => { const result = await apiGet<{ data: any }>(`/v1/protocols/${params.protocolId}`); const text = formatProtocolInfo(result.data); return { content: [{ type: 'text' as const, text }] }; } ); } - src/server.ts:36-36 (registration)Tool registration call in createServer function that registers get_protocol_info with the MCP server instance.
registerGetProtocolInfo(server); - src/tools/get-protocol-info.ts:10-12 (schema)Input validation schema using Zod that defines the protocolId parameter as a required string with description for protocol IDs like 'morpho', 'aave-v3', etc.
{ protocolId: z.string().describe('Protocol ID (e.g. morpho, aave-v3, yearn-v3, beefy)'), }, - src/lib/formatters.ts:111-143 (helper)formatProtocolInfo helper function that takes API response data (protocol, vaults, versions, incidents) and formats it into a readable markdown string with sections for protocol details, versions, and security incidents.
export function formatProtocolInfo(data: any): string { const { protocol, vaults, versions, incidents } = data; const sections = [ `## ${protocol.name}`, protocol.description ? `\n${protocol.description}` : '', `\n**TVL:** $${formatNumber(protocol.tvl_total)} | **Vaults:** ${protocol.vault_count}`, protocol.mainnet_launch_date ? `**Launch Date:** ${protocol.mainnet_launch_date}` : '', protocol.primary_auditors?.length ? `**Auditors:** ${protocol.primary_auditors.join(', ')}` : '', protocol.bug_bounty_url ? `**Bug Bounty:** ${protocol.bug_bounty_url}` : '', ].filter(Boolean); if (versions?.length) { sections.push('\n### Versions'); for (const v of versions) { sections.push( `- **${v.display_name || v.version}**: ${v.vault_count} vaults, $${formatNumber(v.tvl)} TVL` ); } } if (incidents?.length) { sections.push('\n### Security Incidents'); for (const i of incidents) { sections.push( `- **${i.title}** (${i.incident_severity || 'N/A'}) — ${new Date(i.occurred_at).toLocaleDateString()}` ); } } return sections.join('\n'); } - src/api-client.ts:3-19 (helper)apiGet utility function used by the handler to make authenticated API requests to the Philidor API endpoint for fetching protocol information.
export async function apiGet<T = any>(path: string): Promise<T> { const res = await fetch(`${API_BASE}${path}`, { headers: { Accept: 'application/json' }, }); if (!res.ok) { let message: string; try { const json = (await res.json()) as Record<string, any>; message = json?.error?.message || json?.message || JSON.stringify(json); } catch { message = res.statusText || `HTTP ${res.status}`; } throw new Error(`API ${res.status}: ${message}`); } const json = await res.json(); return json as T; }