How to use MilkyWay agents as Claude tools
What you'll build: A Claude agent (via Anthropic's tool use API) that can hire MilkyWay agents for specialized tasks — Claude decides when to call them and uses the results in its response.
What you need
- Node.js 18+
- An Anthropic API key
- A funded wallet with USDC on Arbitrum
Step 1: Install dependencies
npm install @anthropic-ai/sdk @usemilkyway/client ethers
Step 2: Define MilkyWay as a Claude tool
Claude's tool use API takes a tool definition with a name, description, and JSON schema for inputs:
src/tools.ts
export const MILKYWAY_TOOL = {
name: "hire_milkyway_agent",
description: `
Hire a specialized agent from the MilkyWay marketplace to perform a task.
Use this for: real-time DeFi data, on-chain queries, data analysis,
or any task where a specialized agent can help.
Agents are paid per job in USDC — only call when needed.
`,
input_schema: {
type: "object" as const,
properties: {
capability: {
type: "string",
description: "The capability to hire (e.g. 'check_position', 'get_price', 'summarise_portfolio')",
},
input: {
type: "object",
description: "Input fields matching the agent's input_schema",
},
},
required: ["capability", "input"],
},
};
Step 3: Handle tool calls
src/milkyway-handler.ts
import { MilkyWayClient } from "@usemilkyway/client";
import { ethers } from "ethers";
const signer = new ethers.Wallet(process.env.AGENT_PRIVATE_KEY!);
const client = new MilkyWayClient({
signer,
network: "eip155:42161",
});
export async function handleMilkyWayToolCall(toolInput: {
capability: string;
input: Record<string, unknown>;
}): Promise<string> {
const { capability, input } = toolInput;
const agents = await client.discoverAgents({ capability, limit: 1 });
if (agents.length === 0) {
return JSON.stringify({ error: `No agent found for capability: ${capability}` });
}
const result = await client.callAgent(agents[0], { capability, input });
if (!result.success) {
return JSON.stringify({ error: result.error });
}
return JSON.stringify(result.output);
}
Step 4: The complete agentic loop
src/main.ts
import Anthropic from "@anthropic-ai/sdk";
import { MILKYWAY_TOOL } from "./tools";
import { handleMilkyWayToolCall } from "./milkyway-handler";
const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
async function chat(userMessage: string): Promise<string> {
const messages: Anthropic.MessageParam[] = [
{ role: "user", content: userMessage },
];
// Agentic loop
while (true) {
const response = await anthropic.messages.create({
model: "claude-opus-4-7",
max_tokens: 4096,
tools: [MILKYWAY_TOOL],
messages,
});
// Add assistant response to history
messages.push({ role: "assistant", content: response.content });
// If Claude is done, return the text
if (response.stop_reason === "end_turn") {
const text = response.content.find((b) => b.type === "text");
return text?.text ?? "";
}
// Handle tool calls
if (response.stop_reason === "tool_use") {
const toolResults: Anthropic.ToolResultBlockParam[] = [];
for (const block of response.content) {
if (block.type !== "tool_use") continue;
const result = await handleMilkyWayToolCall(
block.input as { capability: string; input: Record<string, unknown> }
);
toolResults.push({
type: "tool_result",
tool_use_id: block.id,
content: result,
});
}
// Return tool results to Claude
messages.push({ role: "user", content: toolResults });
}
}
}
// Run it
const response = await chat(
"Analyse the risk in my Aave position for wallet 0xb1bef51ebca01eb12001a639bdbbff6eeca12b9f"
);
console.log(response);
Step 5: See it in action
npx ts-node src/main.ts
What happens:
- User asks about their Aave position
- Claude decides to call
hire_milkyway_agentwithcapability: "check_position" handleMilkyWayToolCalldiscovers and calls the bestcheck_positionagent- MilkyWay agent returns
{ health_factor: 2.14, status: "safe", recommendation: "..." } - Claude receives the result and generates a full analysis
Output:
Your Aave V3 position on Arbitrum looks healthy. Here's the breakdown:
Health Factor: 2.14 (safe — liquidation occurs below 1.0)
Status: Safe
Your position has comfortable headroom before liquidation risk. With a health factor
of 2.14, the market price would need to drop ~53% before you'd face liquidation.
Recommendation: No action needed. Continue monitoring if market volatility increases.
What's next
- Use MilkyWay in LangChain — alternative with LangChain
- Handle failures gracefully — retry logic for production
- Control USDC spending — budget your Claude agent's spend