SQD Portal
Consulta datos en cadena a través de EVM, Solana, Bitcoin, Substrate y Hyperliquid mediante la API de SQD Portal, disponible como endpoint remoto alojado o servidor local stdio.
Documentación
Servidor MCP de SQD Portal
Un servidor MCP que responde preguntas sobre blockchain a partir de los datos de SQD Portal: transacciones, registros, trazas, transferencias de tokens, carteras, análisis, series temporales y velas en redes EVM, Solana, Bitcoin, Substrate, Hyperliquid y Tron, con un Explorador opcional integrado en el host.
El servidor no indexa cadenas por sí mismo. Valida la entrada, planifica consultas acotadas al Portal y devuelve resultados con metadatos de cobertura, frescura, paginación y evidencia para que un asistente pueda decir exactamente lo que vio. No se requiere cuenta de SQD, clave de API ni credencial de cliente.
Habla el protocolo MCP sin estado 2026-07-28 a través de HTTP y stdio, y mantiene la ruta de negociación heredada gestionada por el SDK para clientes que aún están implementando esa revisión. Las notas de versión están en CHANGELOG.md. Consulta CONTRIBUTING.md para trabajar en el código y SECURITY.md para reportar una vulnerabilidad.
Superficie pública actual
28herramientas públicas3herramientas avanzadas/de depuración- los parámetros públicos usan
network - los filtros de descubrimiento usan
vm - sin alias de herramientas heredados en
v0.8.x
Las herramientas de consulta sin procesar devuelven respuestas compactas por defecto. Solicita response_format: "full" solo cuando necesites el payload más grande.
Las preguntas sobre entidades pueden usar portal_resolve_entity primero. Resuelve símbolos/direcciones de tokens EVM, alias de contratos EVM, identificadores de pools, nombres de protocolos y nombres de monedas de Hyperliquid en filtros listos para consulta, manteniendo explícitas las coincidencias ambiguas.
La resolución de símbolos de tokens y los metadatos de tokens provienen de datos abiertos de listas de tokens, no de constantes de direcciones de tokens integradas. Las respuestas incluyen avisos explícitos cuando los datos de la lista de tokens no están disponibles, están desactualizados o no son compatibles con una red.
Las preguntas sobre carteras deben comenzar con portal_get_wallet_summary. Devuelve fund_flow por defecto, incluyendo movimientos entrantes/salientes, flujos de activos, contrapartes, movimientos más grandes observados y siguientes pivotes de evidencia antes del análisis detallado con herramientas sin procesar.
Grupos de herramientas
Descubrimiento:
portal_list_networksportal_get_network_infoportal_get_headportal_resolve_entity
Conveniencia entre cadenas:
portal_get_recent_activityportal_get_wallet_summaryportal_get_time_series
EVM:
portal_evm_query_transactionsportal_evm_query_logsportal_evm_query_tracesportal_evm_query_token_transfersportal_evm_get_contract_deploymentportal_evm_get_contract_activityportal_evm_get_analyticsportal_evm_get_ohlc
Solana:
portal_solana_query_transactionsportal_solana_query_instructionsportal_solana_get_analytics
Bitcoin:
portal_bitcoin_query_transactionsportal_bitcoin_get_analytics
Substrate:
portal_substrate_query_eventsportal_substrate_query_callsportal_substrate_get_analytics
Hyperliquid:
portal_hyperliquid_query_fillsportal_hyperliquid_get_analyticsportal_hyperliquid_get_ohlc
Tron:
portal_tron_query_transactionsportal_tron_query_logs
Avanzadas/depuración:
portal_debug_query_blocksportal_debug_resolve_time_to_blockportal_debug_hyperliquid_query_replica_commands
Estos grupos también son los conjuntos de herramientas (discovery, convenience, evm, solana, bitcoin, substrate, hyperliquid, tron, debug). Un despliegue puede recortar el catálogo con MCP_TOOLSETS o MCP_TOOLS, y una conexión HTTP puede reducirlo aún más con ?toolsets= o un encabezado X-MCP-Toolsets; consulta las notas de despliegue HTTP. Sin configuración, se sirve la superficie completa de 31 herramientas, y el endpoint alojado mantiene ese valor por defecto.
Datos compatibles
- Redes EVM indexadas por Portal, incluyendo Base, Ethereum, Optimism, Arbitrum, Monad, Hyperliquid EVM y muchas otras
- Transacciones nativas de Tron (transferencias TRX, transferencias TRC-10, llamadas a contratos con registros en línea y transacciones internas) y registros de eventos TVM como transferencias TRC-20, con direcciones Base58 o hex, montos exactos de TRX y el hash de la transacción padre en cada registro; la habilidad del plugin SQD incluido documenta la API Stream sin procesar para cualquier cosa más allá de eso
- Mainnet de Solana
- Mainnet de Bitcoin
- Rellenos de Hyperliquid y comandos de réplica
- Redes Substrate indexadas por Portal
El soporte de Substrate es actualmente solo histórico. No tiene cola en tiempo real.
Forma de la respuesta
La mayoría de las herramientas devuelven el mismo sobre en MCP structuredContent y en un respaldo de texto JSON compacto para clientes más antiguos. El sobre contiene un cuerpo de resultado normal más metadatos compartidos como:
answerdisplaynext_stepsinvestigation_freshness_coverage_pagination_ordering
investigation es una guía de evidencia compacta para agentes: identifica la ruta de resultado principal, la ventana acotada, campos pivote útiles como direcciones o hashes de transacciones, filtros de seguimiento y limitaciones antes de que un resultado se trate como completo. Los resultados materiales exitosos también llevan un recibo _evidence con argumentos canónicos, un resumen determinista, reconciliación de filas, ventanas de origen y semántica de reproducción exacta o semántica. Los recibos exactos fijan su ventana de evidencia. Los recibos semánticos revelan que volver a ejecutar una ventana relativa móvil puede devolver una instantánea más reciente.
Cuando una respuesta usa datos estimados, parciales, muestreados, limitados o paginados, la respuesta de nivel superior y los metadatos lo revelan. _pagination.has_more es verdadero exactamente cuando next_cursor está presente, y _coverage indica si la ventana solicitada se leyó por completo (window_complete) y si la respuesta contiene todas las filas coincidentes (result_complete). Los seguimientos de paginación seguros incluyen metadatos de llamada a herramienta ejecutables con argumentos de cursor explícitos; las sugerencias que no se pueden reconstruir de forma segura se marcan como no ejecutables.
Las herramientas orientadas a gráficos también devuelven descriptores de gráficos y tablas para que los clientes MCP o LLMs puedan renderizarlos sin ingeniería inversa del payload.
Explorador SQD (beta)
SQD Explorer es una aplicación MCP que renderiza resultados de herramientas dentro de hosts que admiten aplicaciones MCP. Está en beta y desactivado por defecto. Un despliegue por defecto responde con structuredContent y solo texto JSON compacto, y ningún resultado de herramienta pide a un host que abra una interfaz de usuario. Hay dos formas de optar por participar:
- Una conexión: agrega
?app=1al endpoint, por ejemplohttps://portal.sqd.dev/mcp?app=1. Usa esto para probar la beta sin cambiar nada para otros usuarios. - Despliegue completo: establece
MCP_APP_ENABLED=true. Una conexión aún puede anularlo en cualquier dirección, por lo que?app=0excluye a un solo cliente.
El recurso de la aplicación permanece registrado de cualquier manera, por lo que un host puede leerlo directamente sin que nadie opte por participar.
Cuando está habilitado, los hosts compatibles reciben una tarjeta en línea ajustada a su contenido y un espacio de trabajo de pantalla completa para 21 herramientas de datos: métricas lideradas por el número principal, gráficos de múltiples series y valores firmados, velas de precios con volumen vinculado y una lectura fija, paneles clasificados y de línea de tiempo que muestran diez filas con un control Mostrar todo, tablas de evidencia que paginan diez filas con búsqueda en cada fila, enlaces de explorador para direcciones, hashes y bloques, logotipos y nombres de cadenas de los metadatos de red de SQD, controles de continuación, historial de la sesión actual y exportación JSON o CSV a través del host. La inspección con puntero y teclado expone los valores trazados exactos. Los buckets faltantes permanecen visibles como espacios, los identificadores no se acortan y cualquier límite local de filas es separado de la completitud del servidor. Los seguimientos fallidos mantienen el último resultado bueno bajo el error. La aplicación es autónoma y no usa almacenamiento persistente del navegador; sus únicas solicitudes del lado del navegador son imágenes de logotipos de cadenas de cdn.subsquid.io y sqd.dev, los dos orígenes declarados en el CSP del recurso. Los hosts sin soporte de aplicaciones MCP reciben el mismo structuredContent y respaldo de texto JSON compacto, por lo que la respuesta subyacente nunca depende de la interfaz de usuario. docs/explorer-design.md registra las reglas de diseño que sigue la aplicación.
Tres prompts MCP proporcionan puntos de partida reproducibles sin agregar herramientas:
investigate-walletinvestigate-contractinvestigate-market
Para una demostración centrada en gráficos, pregunta: Show BTC price action and trading volume on Hyperliquid for the past hour, using five-minute candles. Explain whether the final candle is closed. El resultado abre el Explorador SQD con un gráfico de velas, volumen, una tabla de evidencia, límites de tiempo solicitados e indexados y un recibo. Reproduce los requested_window_start_timestamp y requested_window_end_exclusive devueltos como entradas fijas from_timestamp y to_timestamp cuando necesites una ejecución de verificación estable.
Pruébalo en Claude
El endpoint alojado tiene el Explorador desactivado, por lo que un nuevo usuario opta por su propia conexión:
- En claude.ai o Claude Desktop, abre Configuración → Conectores → Agregar conector personalizado, ingresa
https://portal.sqd.dev/mcp?app=1y elige sin autenticación. El?app=1activa la beta solo para esta conexión. En Claude Desktop puedes instalarsqd.mcpbdesde la última versión y activar su configuración "SQD Explorer (beta)". - Inicia un nuevo chat y habilita el conector SQD para él.
- Haz una pregunta de datos. Cualquiera de estas llega a una herramienta que lleva el Explorador:
What has this wallet been doing on Base lately?con una dirección (resumen de cartera)Show me recent activity on Ethereum(actividad reciente)Chart hourly transaction counts on Base for the last day(serie temporal)
El resultado se renderiza como una tarjeta en línea en lugar de un bloque de texto; abre la tarjeta para el espacio de trabajo de pantalla completa. Solo las 21 herramientas de datos llevan el Explorador. Una pregunta de catálogo como Which networks do you support? llama a portal_list_networks y responde en texto plano, lo cual es esperado en lugar de un fallo.
Instalación
npm install
npm run build
Ejecución
stdio:
npm start
HTTP:
npm run start:http
Descubrimiento para desarrolladores
El servidor expone una guía estructurada de selección de herramientas para constructores de clientes:
- El recurso MCP
sqd://toolsdevuelve metadatos de herramientas agrupados, ejemplos, puntos de partida y notas de integración. - El recurso MCP
sqd://tools/{name}devuelve la entrada de la guía para una herramienta, por ejemplosqd://tools/portal_get_time_series.
El descubrimiento de herramientas y recursos permanece en el propio protocolo MCP. El servidor no mantiene un catálogo HTTP duplicado.
Plugin de Codex
El envoltorio del plugin de Codex vive en plugins/portal y usa por defecto el endpoint MCP alojado en https://portal.sqd.dev/mcp.
Instálalo desde este marketplace local del repositorio:
codex plugin marketplace add .
codex plugin add portal@sqd
Abre un nuevo hilo de Codex después de instalar. Los prompts de primer uso incluyen rellenos de BTC perpetuo de Hyperliquid, volumen reciente de transacciones en Base y las últimas transferencias de USDC en Base.
Plugin de Claude Code
El plugin de Claude Code usa el mismo endpoint MCP alojado y el mismo selector público:
claude plugin marketplace add subsquid-labs/portal-mcp-server
claude plugin install portal@sqd
Abre una nueva sesión de Claude Code después de instalar para que las herramientas MCP de SQD se carguen.
Grok
El chat de Grok puede usar SQD como conector personalizado:
- Abre
grok.com/connectors. - Elige Nuevo conector, luego Personalizado.
- Ingresa
https://portal.sqd.dev/mcpcomo la URL del servidor MCP. - Deja la autenticación sin configurar.
Grok Build lee los plugins de Claude Code directamente, por lo que usa el mismo paquete:
grok plugin install --trust subsquid-labs/portal-mcp-server#plugins/portal
ChatGPT
En un espacio de trabajo con aplicaciones MCP personalizadas habilitadas, abre Configuración → Aplicaciones → Crear, ingresa https://portal.sqd.dev/mcp, elige sin autenticación, escanea las herramientas y crea el borrador de la aplicación. El servidor es de solo lectura y no requiere credenciales de usuario.
Claude Desktop
Descarga sqd.mcpb de la última versión y ábrelo: Claude Desktop instala el paquete con un clic y lista las 31 herramientas. El paquete incluye el servidor, sus dependencias de producción y una configuración opcional, "SQD Explorer (beta)", que está desactivada por defecto. Necesita Node 22 o más reciente en la máquina.
Respaldo manual, desde un clon local después de npm run build, agrega una entrada como esta a claude_desktop_config.json:
{
"mcpServers": {
"SQD": {
"command": "node",
"args": ["/absolute/path/to/sqd-portal-mcp-server/dist/index.js"]
}
}
}
Notas de uso
- Si no conoces el nombre exacto de la red, comienza con
portal_list_networks. - Si necesitas estado indexado reciente, usa
portal_get_network_infooportal_get_headprimero. - Si la pregunta es amplia, comienza con
portal_get_recent_activity,portal_get_wallet_summaryoportal_get_time_seriesantes de pasar a consultas sin procesar. - Las ventanas de tiempo aceptan redacción compacta y natural como
30m,past 30 minutes,in the past 1h,in last 38 mins,last houro30 minutes ago. - Usa
portal_evm_get_ohlcyportal_hyperliquid_get_ohlcsolo cuando realmente necesites salida en forma de velas. - Para consultas grandes o exploratorias, prefiere
response_format: "compact"a menos que necesites la forma completa del registro.
Notas de despliegue HTTP
El modo HTTP expone MCP en / y /mcp, el liveness en /health y el readiness en /ready. El servicio alojado expone la misma respuesta de salud versionada en https://portal.sqd.dev/mcp/health.
- Los endpoints de MCP y salud no requieren autenticación.
- El descubrimiento de herramientas y recursos utiliza el protocolo MCP; las rutas retiradas
/toolsy/tools.jsondevuelven404. - Establezca
MCP_CURSOR_SECRETen cualquier despliegue que ejecute más de un proceso, para que un cursor emitido por una instancia sea aceptado por la siguiente. Si no se establece, cada proceso firma con su propia clave aleatoria y un cursor deja de funcionar tras un reinicio o un salto de balanceo de carga. /healthinforma deversionycommit, el commit de git desde el que se construyó la imagen, y cada resultado de herramienta repite ambos en_server. Etiquetas de Docker Hub:latest,X.Y.ZyX.Yprovienen solo de una etiqueta de lanzamientov*;edgeysha-<commit>provienen de cada push amain. Fije una etiqueta de versión en producción./readyes200solo después de que el catálogo de conjuntos de datos se haya cargado una vez y la última sonda de Portal haya tenido éxito dentro deMCP_READY_MAX_AGE_MS; de lo contrario, es503con unreasonyRetry-After. Apunte las comprobaciones de readiness del orquestador a/readyy las de liveness a/health. ElHEALTHCHECKde la imagen Docker utiliza/ready.- El servidor se vincula a
127.0.0.1a menos queMCP_BINDindique lo contrario, y cada ruta comprueba el encabezadoHost(yOrigin, cuando un navegador envía uno) contra una lista de permitidos, de modo que una página de rebote de DNS no pueda alcanzar una instancia local. Los hosts y orígenes de bucle local siempre pasan; las solicitudes sinOriginsiempre pasan la comprobación de origen. Un enlace que no sea de bucle local debe establecerMCP_ALLOWED_HOSTSyMCP_ALLOWED_ORIGINS; si falta alguno, el servidor registra un error de inicio y sirve sin esa comprobación. La imagen Docker estableceMCP_BIND=0.0.0.0, así que establezca ambas variables en el despliegue, o*detrás de un proxy que ya las valide. - Cada solicitud está limitada: encabezados dentro de
MCP_HEADERS_TIMEOUT_MS, toda la solicitud dentro deMCP_REQUEST_TIMEOUT_MS, keep-alive inactivo dentro deMCP_KEEP_ALIVE_TIMEOUT_MS, y los cuerpos MCP por encima deMCP_MAX_BODY_BYTESse rechazan con413antes del análisis (411para un cuerpo fragmentado sin longitud).
Variables de entorno útiles:
MCP_CURSOR_SECRETla clave con la que se firman los cursores de paginación. Establézcala en cualquier despliegue que ejecute más de un proceso. Si no se establece, cada proceso firma con su propia clave aleatoria, por lo que un cursor emitido por una instancia es rechazado por la siguiente y los clientes pierden su lugar tras un reinicio o un salto de balanceo de carga. También es lo que impide que un llamador acuñe un cursor para una ventana que la herramienta nunca habría ofrecido.MCP_TOOLSETSconjuntos de herramientas separados por comas para servir (discovery,convenience,evm,solana,bitcoin,substrate,hyperliquid,tron,debug;allodefaultpara todo). Los nombres desconocidos se ignoran con un error de inicio. Gana sobreMCP_TOOLS. Predeterminado: los nueve, el catálogo completo de 31 herramientas.MCP_TOOLSnombres exactos de herramientas separados por comas para servir cuandoMCP_TOOLSETSno está establecido.- Por conexión,
?toolsets=evmen la URL del endpoint o un encabezadoX-MCP-Toolsets: evmreduce el conjunto del despliegue solo para esa conexión; nunca puede agregar un conjunto de herramientas. Los prompts que hacen referencia a una herramienta fuera del conjunto activo no se ofrecen. El conjunto activo es una etiqueta limitada (all, un nombre de conjunto de herramientas ocustom) enmcp_tool_client_calls_total. MCP_BINDinterfaz en la que escuchar, predeterminado127.0.0.1(0.0.0.0en la imagen Docker)MCP_ALLOWED_HOSTSnombres de host separados por comas aceptados enHost(se ignora el puerto) además del bucle local;*desactiva la comprobación. Requerido para un enlace que no sea de bucle local.MCP_ALLOWED_ORIGINSnombres de host separados por comas aceptados enOriginademás del bucle local;*desactiva la comprobación. Requerido para un enlace que no sea de bucle local.MCP_REQUEST_TIMEOUT_MS,MCP_HEADERS_TIMEOUT_MS,MCP_KEEP_ALIVE_TIMEOUT_MSlímites de tiempo de solicitud, predeterminados120000,30000,65000MCP_MAX_BODY_BYTESlímite del cuerpo de solicitud MCP, predeterminado1048576MCP_READY_PROBE_INTERVAL_MSyMCP_READY_MAX_AGE_MScadencia y frescura de la sonda de readiness, predeterminados30000y90000MCP_APP_ENABLEDpara ofrecer el SQD Explorer beta a hosts compatibles, predeterminado desactivado. Aceptatrueo1. Los?app=1y?app=0por conexión lo anulan.MCP_TOOL_WEIGHT_BUDGETpara limitar el costo combinado de llamadas de herramienta activas, predeterminado32. Los perfiles medidos permiten hasta 32 búsquedas, 4 llamadas raw o summary, o 2 llamadas de análisis a la vez mientras el trabajo en cola permanece consciente de la cancelación.MCP_TOOL_MAX_QUEUEpara limitar las llamadas de herramienta en cola, predeterminado64MCP_TOOL_QUEUE_TIMEOUT_MSpara limitar el tiempo de espera de admisión de herramientas, predeterminado5000MCP_TOOL_CLIENT_WEIGHT_SHAREporcentaje del presupuesto de peso que un llamador (una conexión, identificada por una dirección con hash) puede mantener a la vez, predeterminado50; nunca por debajo de la herramienta individual más pesada para que cada herramienta siga siendo programable.MCP_TOOL_CLIENT_MAX_QUEUElimita las llamadas en cola de un llamador, predeterminado16. Un llamador que supere su parte obtiene el resultado reintentableoverloadedconreason: client_sharemientras otros siguen fluyendo.MCP_TRUST_PROXYestablecido en1(o en el número de proxies frente al servidor) para basar la equidad en la dirección que esos proxies observaron en lugar de la dirección del socket. El encabezado se lee solo cuando el par inmediato es en sí mismo un proxy de confianza, y el salto se cuenta desde la derecha deX-Forwarded-For, porque un llamador puede escribir cualquier cosa a la izquierda de él. La dirección se somete a hash y nunca se almacena ni etiqueta.MCP_TRUSTED_PROXY_PREFIXESuna lista separada por comas de prefijos de dirección que cuentan como sus proxies, comparados con el inicio de la dirección del par (por ejemplo203.0.113.o2606:4700:). Establecerlo reemplaza el predeterminado en lugar de agregarlo, así que incluya el bucle local o su rango privado si un proxy co-ubicado también alcanza el servidor. Sin establecer, se confía en el bucle local y los rangos privados, que es donde se encuentra un proxy co-ubicado; en una red privada compartida eso significa que cualquier host en esa red puede presentar una dirección reenviada, así que nombre sus proxies explícitamente allí.MCP_SLOW_REQUEST_MSumbral para una línea JSON en stderr por llamada de herramienta lenta con tiempos de espera de admisión y ejecución y la familia de cliente limitada, predeterminado5000.
Salvaguardas de costo
Cada límite de escaneo en el servidor está compilado y establecido por herramienta: un escaneo de trazas filtrado se detiene en 5,000 bloques, una búsqueda de despliegue de contratos en 1,000,000. Las salvaguardas agregan un segundo techo por encima de esos que un despliegue establece desde el entorno, de modo que un endpoint bajo carga pueda reducirse sin una nueva imagen.
MCP_GUARDRAIL_MODEuno deoff(predeterminado),shadowoenforce.MCP_GUARDRAIL_<CLASS>_<LIMIT>establece un techo, donde<CLASS>esLOOKUP,RAW_QUERY,SUMMARYoANALYTICS, y<LIMIT>esMAX_SCAN_BLOCKS,MAX_WINDOW_SECONDSoMAX_UPSTREAM_BYTES. Por ejemploMCP_GUARDRAIL_RAW_QUERY_MAX_SCAN_BLOCKS=50000.
No hay predeterminados numéricos. Una clase sin nada establecido no tiene techo adicional, por lo que off y enforce sin nada configurado son el mismo servidor. La única forma en que una salvaguarda cambia el comportamiento es si establece un número.
shadow evalúa cada techo y registra lo que la aplicación habría hecho, sin cambiar una sola respuesta. enforce actúa:
- Un escaneo sobre su techo se detiene en el techo e informa lo que cubrió a través del mismo camino de cobertura parcial que un escaneo que alcanza su límite compilado ya usa, por lo que
_coverage.result_completese convierte enfalsey la respuesta nombra los bloques que buscó. Nunca afirma una respuesta completa que no obtuvo. - Una ventana de consulta sobre su techo se rechaza antes de obtener cualquier cosa, con el límite nombrado en el error y los siguientes pasos, porque no hay resultado parcial que devolver para una solicitud a la que nunca se le permitió comenzar.
Cuatro contadores, todos con etiquetas limitadas: mcp_guardrail_admitted_total{class}, mcp_guardrail_would_block_total{class,limit}, mcp_guardrail_blocked_total{class,limit} y mcp_guardrail_fail_open_total{reason}.
Despliegue recomendado. Establezca los techos que está considerando y ejecute shadow durante una semana. Lea mcp_guardrail_would_block_total: es exactamente el conjunto de solicitudes reales que el techo habría cortado. Si ese conjunto es más grande de lo esperado, el techo está mal, no el tráfico. Cambie a enforce una vez que tenga el tamaño que pretendía.
Trazas
Las métricas dicen con qué frecuencia y durante cuánto tiempo; una traza dice dónde se fue el tiempo dentro de una llamada. Las trazas están desactivadas a menos que establezca OTEL_EXPORTER_OTLP_ENDPOINT. Sin establecer, nada aquí se importa, asigna o envía, y los paquetes de OpenTelemetry no necesitan instalarse en absoluto.
El SDK no es una dependencia de este paquete. Él y su exportador arrastran alrededor de 74 paquetes contra un tarball publicado de aproximadamente 3.4MB, y casi nadie que ejecute esto sobre stdio quiere algo de eso, por lo que se declaran como pares opcionales. Para activar las trazas, instálelos junto al servidor y apúntelo a su colector:
npm i @opentelemetry/sdk-node @opentelemetry/exporter-trace-otlp-http
OTEL_EXPORTER_OTLP_ENDPOINT=http://collector:4318
Una llamada de herramienta es un árbol:
mcp.request (HTTP only: method, transport)
└─ tools/call portal_evm_query_logs
├─ mcp.admission (the wait for a slot)
├─ portal.fetch (one per attempt: dataset, status, bytes, resend count)
├─ portal.fetch
└─ mcp.format_result (hashing the answer for the evidence receipt)
Las variables OTEL_* son leídas por el propio SDK de OpenTelemetry, por lo que el muestreo, los encabezados, el procesamiento por lotes y el protocolo se configuran de la manera estándar. El resto:
- Un
traceparenten la solicitud HTTP, o en el_metade la llamada de herramienta, hace que la llamada sea parte de la traza del llamador en lugar de comenzar una nueva. El valor_metagana, porque es la afirmación más específica sobre a qué turno pertenece esta llamada. - Cada solicitud de Portal lleva un
traceparentque nombra su propio span de fetch, de modo que una traza del lado de Portal pueda unirse a esta. No se agrega nada cuando las trazas están desactivadas. - Las líneas de registro JSON llevan
trace_idyspan_idmientras las trazas están activadas, de modo que un evento de registro y su span puedan buscarse entre sí. /healthinforma si las trazas están configuradas, si comenzaron y si la captura de argumentos está activada.
Los atributos de span no llevan argumentos, direcciones, hashes, cursores ni texto libre. Son el nombre de la herramienta, su clase de trabajo, el conjunto de datos, conteos limitados y un resultado limitado. Un span sale del proceso hacia un colector al que la consulta en sí nunca llega, por lo que la regla es la que siguen las etiquetas de métricas, y más estricta que los registros, que al menos permanecen en su propio stderr. MCP_OTEL_INCLUDE_ARGS=1 agrega los argumentos de herramienta sin procesar al span de herramienta. Está desactivado por predeterminado y no es seguro para producción: un argumento de herramienta es rutinariamente una dirección de billetera, y a menudo las propias palabras de un usuario.
Pruebas
npm run test:offline compila, ejecuta lint, verifica tipos, ejecuta las pruebas unitarias y ejecuta cada suite que no necesita acceso a Portal. npm run test:live ejecuta las suites respaldadas por Portal. RELEASE_ASSURANCE.md resume lo que verifica un lanzamiento, y scripts/README.md enumera cada suite.