Блокчейн RPC в агентах LangChain с BlockVectra
Дайте агенту LangChain живые блокчейн-данные через один инструмент поверх публичного эндпоинта BlockVectra без ключа, затем добавьте MCP-сервер документации и API key для методов, которым он нужен.
Агент LangChain читает живые блокчейн-данные через один инструмент, который отправляет JSON-RPC POST-запросом на https://api.blockvectra.com/v1/eth_mainnet/public. Для методов из public.methods каждой сети этому эндпоинту не нужны ни API key, ни регистрация. Ключ открывает остальные методы, а Free Plan дает 30,000,000 CU за каждое окно в 30 дн. Проверено .
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)Установите зависимости командой pip install langchain httpx; строка модели и ключ ее провайдера описаны в кратком руководстве LangChain. Инструмент использует декоратор @tool и create_agent из LangChain.
Тот же инструмент на 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] });Сигнатуру tool() см. в руководстве по инструментам LangChain JS.
Вызов любого метода с API key
Методам вне public.methods, например eth_getLogs, нужен ключ. Читайте его из окружения и передавайте в заголовке x-api-key; идентификатор сети (eth_mainnet, base_mainnet и так далее) берется из 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()Если вернуть весь ответ JSON-RPC целиком, модель сможет прочитать объект error и изменить следующий вызов. Чтобы создать ключ без браузера, пройдите четыре шага из руководства по программной регистрации: challenge, подпись, login, затем POST /keys. Разработчики также могут создать ключ в консоли.
Добавьте MCP-сервер документации
Агенты LangChain подключаются к MCP-серверам через MCPAdapter. Укажите в нем https://docs.blockvectra.com/mcp, чтобы агент получил list_chains, get_status, rpc_call, read_doc и другие инструменты, перечисленные на странице MCP-сервера. Для подключения ключ не нужен.
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."}]})Установите командой pip install "langchain[mcp]" (langchain>=1.4.0, в бета-версии). Чтобы использовать инструменты, требующие ключ, передайте его как bearer-токен: MCPAdapter(Client(url, auth=os.environ["BLOCKVECTRA_API_KEY"])) с from fastmcp.client import Client, как в руководстве LangChain по аутентификации MCP.
В TypeScript установите @langchain/mcp-adapters@^2.0.0 и передайте словарь заголовков:
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();
}Уберите строку headers, чтобы подключаться без ключа. Официальные материалы: LangChain MCP (Python) и LangChain MCP (JavaScript).
Ошибки, которые увидит ваш инструмент
| Ответ | Значение | Что должен сделать агент |
|---|---|---|
HTTP 401, -32024, missing_api_key | URL с ключом вызван без ключа | Передать ключ в x-api-key или в пути |
HTTP 401, -32024, invalid_api_key | Ключ неизвестен, отключен или отозван | Проверить ключ в консоли; новый ключ активируется за несколько секунд |
-32601, method_not_public | Метода нет в public.methods сети | Использовать URL с ключом вместо /public |
-32601, method not available | Метод не включен в этой сети | Проверить methods.allow в GET /v1/chains |
Каждая ошибка содержит data.reason и docs_url; полный список приведен на странице ошибок.
Частые вопросы
Работает ли публичный эндпоинт для eth_getLogs? Нет. Он обслуживает только методы из public.methods сети; для eth_getLogs и Data API нужен API key.
Может ли агент передавать API key как аргумент инструмента? Нет. Храните его в окружении или в заголовках MCP-клиента; MCP-сервер отклоняет ключи в аргументах инструментов.
Может ли инструмент работать с другой сетью? Да. Замените eth_mainnet на любой идентификатор сети, у которой есть public.url в GET /v1/chains.
Дальнейшие шаги
- Обзор фреймворков для агентов: ElizaOS, viem, wagmi и Coinbase AgentKit.
- Подключение ИИ-агента: поиск эндпоинтов через MCP, llms.txt и OpenAPI.
- Правила тарификации: учет CU, лимиты запросов и ошибки, которые не тарифицируются.
Последнее обновление:
Сравнение с Infura
Используйте цикловые кредиты BlockVectra для концентрированных задач чтения, платите по методам без ежемесячной RPC-подписки и автоматизируйте создание аккаунтов и пополнение стейблкоинами.
Логи против Transfers API
Выбирайте eth_getLogs для журналов событий контрактов или Token Transfers API для индексированной истории переводов ERC-20. Сравнение диапазонов блоков, пагинации, покрытия и финализации.