Dùng RPC blockchain trong Agent LangChain với BlockVectra

Cấp cho Agent LangChain dữ liệu blockchain trực tiếp bằng một tool trên endpoint công khai không cần key của BlockVectra, rồi thêm máy chủ MCP tài liệu và API key cho các phương thức cần key.

Một Agent LangChain đọc dữ liệu blockchain trực tiếp qua một tool gửi POST JSON-RPC tới https://api.blockvectra.com/v1/eth_mainnet/public. Endpoint đó không cần API key hay đăng ký cho các phương thức trong public.methods của từng chuỗi. API key bổ sung phần còn lại, và Gói miễn phí cung cấp 30,000,000 CU cho mỗi cửa sổ 30 ngày. Kiểm tra ngày .

import httpx
from langchain.agents import create_agent
from langchain.tools import tool

RPC = "https://api.blockvectra.com/v1/eth_mainnet/public"

@tool
def eth_block_number() -> str:
    """Return the latest Ethereum mainnet block number as a hex string."""
    body = {"jsonrpc": "2.0", "id": 1, "method": "eth_blockNumber", "params": []}
    return httpx.post(RPC, json=body, timeout=10).json()["result"]

agent = create_agent("claude-sonnet-5", tools=[eth_block_number])
result = agent.invoke({"messages": [{"role": "user", "content": "What is the latest block?"}]})
print(result["messages"][-1].content)

Cài đặt bằng pip install langchain httpx; chuỗi tên model và key của nhà cung cấp đi theo hướng dẫn nhanh LangChain. Tool dùng decorator @tool của LangChain và create_agent.

Cùng tool đó trong TypeScript

import * as z from "zod";
import { createAgent, tool } from "langchain";

const ethBlockNumber = tool(
  async () => {
    const res = await fetch("https://api.blockvectra.com/v1/eth_mainnet/public", {
      method: "POST",
      headers: { "content-type": "application/json" },
      body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "eth_blockNumber", params: [] }),
    });
    return (await res.json()).result as string;
  },
  { name: "eth_block_number", description: "Latest Ethereum mainnet block number (hex).", schema: z.object({}) },
);

const agent = createAgent({ model: "claude-sonnet-5", tools: [ethBlockNumber] });

Xem hướng dẫn tools của LangChain JS để biết chữ ký của tool().

Gọi mọi phương thức bằng API key

Các phương thức ngoài public.methods, như eth_getLogs, cần key. Đọc key từ biến môi trường và gửi trong header x-api-key; chain slug (eth_mainnet, base_mainnet, v.v.) lấy từ GET /v1/chains:

import os
import httpx
from langchain.tools import tool

@tool
def rpc_call(chain: str, method: str, params: list) -> dict:
    """Call a JSON-RPC method on a BlockVectra chain slug such as base_mainnet."""
    headers = {"x-api-key": os.environ["BLOCKVECTRA_API_KEY"]}
    body = {"jsonrpc": "2.0", "id": 1, "method": method, "params": params}
    return httpx.post(f"https://api.blockvectra.com/v1/{chain}", json=body, headers=headers, timeout=15).json()

Trả về toàn bộ phản hồi JSON-RPC cho phép model đọc đối tượng error và thay đổi lệnh gọi tiếp theo. Để tạo key mà không cần trình duyệt, chạy quy trình bốn bước trong hướng dẫn đăng ký bằng chương trình: challenge, chữ ký, đăng nhập, rồi POST /keys. Nhà phát triển cũng có thể tạo key trong console.

Thêm máy chủ MCP tài liệu

Agent LangChain kết nối tới máy chủ MCP qua MCPAdapter. Trỏ nó tới https://docs.blockvectra.com/mcp để cấp cho Agent list_chains, get_status, rpc_call, read_doc và các công cụ khác được liệt kê trên trang máy chủ MCP. Kết nối không cần key.

from langchain.agents import create_agent
from langchain.mcp import MCPAdapter

async def main():
    async with MCPAdapter("https://docs.blockvectra.com/mcp") as adapter:
        tools = await adapter.list_tools()
        agent = create_agent("claude-sonnet-5", tools)
        return await agent.ainvoke({"messages": [{"role": "user", "content": "List the supported chains."}]})

Cài đặt bằng pip install "langchain[mcp]" (langchain>=1.4.0, đang ở bản beta). Để dùng các công cụ cần key, truyền key dưới dạng bearer token: MCPAdapter(Client(url, auth=os.environ["BLOCKVECTRA_API_KEY"])) với from fastmcp.client import Client, như trong hướng dẫn xác thực MCP của LangChain.

Trong TypeScript, cài @langchain/mcp-adapters@^2.0.0 và truyền một map header:

import { MCPAdapter } from "@langchain/mcp-adapters";
import { createAgent } from "langchain";

const adapter = new MCPAdapter({
  servers: {
    blockvectra: {
      url: "https://docs.blockvectra.com/mcp",
      headers: { "x-api-key": process.env.BLOCKVECTRA_API_KEY! },
    },
  },
});

try {
  const agent = createAgent({ model: "claude-sonnet-5", tools: await adapter.listTools() });
  // agent.invoke(...)
} finally {
  await adapter.close();
}

Bỏ dòng headers để kết nối không cần key. Tài liệu tham khảo chính thức: LangChain MCP (Python) và LangChain MCP (JavaScript).

Các lỗi tool của bạn sẽ gặp

Phản hồiÝ nghĩaAgent nên làm
HTTP 401, -32024, missing_api_keyURL dùng key được gọi mà không có keyGửi key trong x-api-key hoặc đường dẫn
HTTP 401, -32024, invalid_api_keyKey không tồn tại, đã bị vô hiệu hóa hoặc đã bị thu hồiKiểm tra key trong console; key mới cần vài giây để kích hoạt
-32601, method_not_publicPhương thức không nằm trong public.methods của chuỗiDùng URL có key thay cho /public
-32601, method not availablePhương thức chưa được bật trên chuỗi đóKiểm tra methods.allow trong GET /v1/chains

Mỗi lỗi có data.reason và docs_url; danh sách đầy đủ nằm trên trang lỗi.

Câu hỏi thường gặp

Endpoint công khai có dùng được cho eth_getLogs không? Không. Nó chỉ phục vụ các phương thức trong public.methods của chuỗi; eth_getLogs và Data API cần API key.

Agent có thể truyền API key làm tham số của tool không? Không. Giữ key trong biến môi trường hoặc header của MCP client; máy chủ MCP từ chối key nằm trong tham số của công cụ.

Tool có thể nhắm tới chuỗi khác không? Có. Thay eth_mainnet bằng bất kỳ chain slug nào có public.url trong GET /v1/chains.

Bước tiếp theo

Cập nhật lần cuối:

Trên trang này