在 LangChain Agent 中用 BlockVectra 调用区块链 RPC

用一个工具经 BlockVectra 免 key 公共端点为 LangChain Agent 提供实时链上数据,再接入文档 MCP 服务,并按需配置 API key 访问需要 key 的方法。

LangChain Agent 通过一个工具向 https://api.blockvectra.com/v1/eth_mainnet/public 发送 JSON-RPC 请求即可读取实时链上数据。该端点对各链 public.methods 中的方法无需 API key 或注册;加上 key 可使用其余方法,免费套餐每个 30 天窗口含 30,000,000 CU,核对于 。

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 安装;模型字符串及其服务商 key 按 LangChain 快速开始配置。工具使用 LangChain 的 @tool 装饰器与 create_agent。

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)需要 key。从环境变量读取 key,放在 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 对象并调整下一次调用。无需浏览器创建 key,按程序化开户指南的四步操作:challenge、签名、login,再 POST /keys。开发者也可以在控制台创建 key。

接入文档 MCP 服务

LangChain Agent 通过 MCPAdapter 连接 MCP 服务。把它指向 https://docs.blockvectra.com/mcp,Agent 即可使用 list_chains、get_status、rpc_call、read_doc 等 MCP 服务页列出的工具。连接无需 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."}]})

用 pip install "langchain[mcp]" 安装(需要 langchain>=1.4.0,处于 beta)。要使用带 key 的工具,把 key 作为 bearer token 传入:MCPAdapter(Client(url, auth=os.environ["BLOCKVECTRA_API_KEY"])),其中 from fastmcp.client import Client,写法见 LangChain 的 MCP 鉴权指南。

TypeScript 中安装 @langchain/mcp-adapters@^2.0.0,并传入 headers:

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 一行即为免 key 连接。官方参考:LangChain MCP(Python)与 LangChain MCP(JavaScript)。

工具会遇到的错误

响应含义Agent 应怎么做
HTTP 401,-32024,missing_api_key调用带 key 的地址时没带 key把 key 放进 x-api-key 或路径
HTTP 401,-32024,invalid_api_keykey 不存在、已停用或已撤销在控制台核对 key;新 key 需要几秒钟生效
-32601,method_not_public该方法不在该链的 public.methods 中改用带 key 的地址,不再用 /public
-32601,method not available该链未开放此方法查看 GET /v1/chains 的 methods.allow

每个错误都带有 data.reason 与 docs_url;完整列表见错误码页。

常见问题

公共端点能调用 eth_getLogs 吗? 不能。它只提供该链 public.methods 中的方法;eth_getLogs 与 Data API 需要 API key。

Agent 可以把 API key 当作工具参数传入吗? 不可以。把 key 放在环境变量或 MCP 客户端请求头中;MCP 服务会拒绝工具参数里的 key。

工具能指向其他链吗? 可以。把 eth_mainnet 换成 GET /v1/chains 中带 public.url 的任意链标识。

下一步

最后更新:

本页目录