Utiliser le RPC blockchain dans les agents LangChain avec BlockVectra

Donnez à un agent LangChain des données blockchain en direct avec un seul outil sur le point de terminaison public sans clé de BlockVectra, puis ajoutez le serveur MCP de documentation et une API key pour les méthodes qui en exigent une.

Un agent LangChain lit des données blockchain en direct grâce à un seul outil qui envoie du JSON-RPC en POST à https://api.blockvectra.com/v1/eth_mainnet/public. Ce point de terminaison ne nécessite ni API key ni inscription pour les méthodes de public.methods de chaque chaîne. Une clé ajoute les autres, et le forfait gratuit offre 30,000,000 CU par fenêtre de 30 jours. Vérifié le .

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)

Installez avec pip install langchain httpx ; la chaîne du modèle et la clé de son fournisseur suivent le démarrage rapide de LangChain. L'outil utilise le décorateur @tool de LangChain et create_agent.

Le même outil en 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] });

Consultez le guide des outils de LangChain JS pour la signature de tool().

Appeler n'importe quelle méthode avec une API key

Les méthodes absentes de public.methods, comme eth_getLogs, nécessitent une clé. Lisez-la depuis l'environnement et envoyez-la dans l'en-tête x-api-key ; le slug de la chaîne (eth_mainnet, base_mainnet, etc.) provient de 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()

Renvoyer toute la réponse JSON-RPC permet au modèle de lire un objet error et de modifier son appel suivant. Pour créer la clé sans navigateur, suivez le flux en quatre étapes du guide d'inscription programmatique : challenge, signature, connexion, puis POST /keys. Les développeurs peuvent aussi créer une clé dans la console.

Ajouter le serveur MCP de documentation

Les agents LangChain se connectent aux serveurs MCP via MCPAdapter. Pointez-le vers https://docs.blockvectra.com/mcp pour donner à l'agent list_chains, get_status, rpc_call, read_doc et les autres outils listés sur la page du serveur MCP. La connexion ne nécessite aucune clé.

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."}]})

Installez avec pip install "langchain[mcp]" (langchain>=1.4.0, en bêta). Pour utiliser les outils avec clé, transmettez la clé comme jeton bearer : MCPAdapter(Client(url, auth=os.environ["BLOCKVECTRA_API_KEY"])) avec from fastmcp.client import Client, comme dans le guide d'authentification MCP de LangChain.

En TypeScript, installez @langchain/mcp-adapters@^2.0.0 et transmettez une table d'en-têtes :

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();
}

Supprimez la ligne headers pour vous connecter sans clé. Références officielles : LangChain MCP (Python) et LangChain MCP (JavaScript).

Erreurs que votre outil rencontrera

RéponseSignificationCe que l'agent doit faire
HTTP 401, -32024, missing_api_keyURL avec clé appelée sans cléEnvoyer la clé dans x-api-key ou dans le chemin
HTTP 401, -32024, invalid_api_keyClé inconnue, désactivée ou révoquéeVérifier la clé dans la console ; une nouvelle clé met quelques secondes à s'activer
-32601, method_not_publicLa méthode ne figure pas dans public.methods de la chaîneUtiliser une URL avec clé au lieu de /public
-32601, méthode non disponibleLa méthode n'est pas activée sur cette chaîneVérifier methods.allow dans GET /v1/chains

Chaque erreur comporte data.reason et un docs_url ; la liste complète se trouve sur la page des erreurs.

Questions fréquentes

Le point de terminaison public fonctionne-t-il pour eth_getLogs ? Non. Il ne sert que les méthodes de public.methods de la chaîne ; eth_getLogs et la Data API nécessitent une API key.

L'agent peut-il transmettre l'API key comme argument d'outil ? Non. Conservez-la dans l'environnement ou dans les en-têtes du client MCP ; le serveur MCP rejette les clés placées dans les arguments d'outils.

L'outil peut-il cibler une autre chaîne ? Oui. Remplacez eth_mainnet par n'importe quel slug de chaîne disposant d'une public.url dans GET /v1/chains.

Prochaines étapes

Dernière mise à jour :

Sur cette page