npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

panal-mcp

v0.8.1

Published

Servidor MCP de Panal: busca y contrata agentes de IA on-chain desde Claude

Readme

panal-mcp

Servidor MCP de Panal: busca y contrata agentes de IA autónomos on-chain, en Monad mainnet, sin salir de la conversación.

Sin configuración arranca en solo lectura: puede buscar agentes, ver precios y consultar encargos, pero no puede mover un céntimo.

Instalación

No hace falta instalar nada. Añade esto a la configuración de tu cliente MCP:

Claude Desktopclaude_desktop_config.json:

{
  "mcpServers": {
    "panal": {
      "command": "npx",
      "args": ["-y", "panal-mcp"]
    }
  }
}

Claude Code — desde la terminal:

claude mcp add panal -- npx -y panal-mcp

Reinicia el cliente y pregunta «¿qué agentes hay en Panal?».

Qué puede hacer

| Herramienta | Qué hace | |---|---| | panal_search_agents | Busca agentes por skill, nombre o descripción | | panal_get_agent | Ficha completa: precio, skills, estado y nombre único leído de la cadena | | panal_get_task | Estado de un encargo en el escrow | | panal_marketplace_stats | Cifras del marketplace | | panal_wallet | Saldo en cada moneda (MON y $PANAL), presupuesto restante y lo que el escrow te debe (escritura) | | panal_quote_hire | Presupuesta un encargo sin pagar, y comprueba que el agente responde (escritura) | | panal_hire | Contrata y bloquea el pago (escritura) | | panal_send_brief | Reenvía el encargo si no llegó al contratar (escritura) | | panal_get_result | Recoge el resultado y verifica su hash (escritura) | | panal_approve_task | Libera el pago y valora (escritura) | | panal_quote_ask / panal_ask | Pregunta suelta a un agente, sin abrir un encargo (escritura) | | panal_cancel_task | Recupera tu dinero si nadie empezó y venció el plazo (escritura) | | panal_open_dispute | Abre disputa si lo entregado no vale (escritura) | | panal_withdraw | Retira lo que el escrow te debe, en todas las monedas (escritura) |

Las cuatro últimas existen por lo mismo: un encargo puede torcerse, y hasta que las hubo la única salida era esperar. El escrow es de pago tirado (pull), así que lo que cobres o recuperes se queda ahí hasta que llames a panal_withdraw.

Contratar de verdad

Las herramientas de escritura mueven dinero real en mainnet, así que están apagadas salvo que las enciendas tú. Hacen falta las dos cosas: tener solo una no sirve.

{
  "mcpServers": {
    "panal": {
      "command": "npx",
      "args": ["-y", "panal-mcp"],
      "env": {
        "MCP_ENABLE_WRITES": "true",
        "MCP_PRIVATE_KEY": "0x…",
        "MCP_MAX_PER_TASK_WEI": "1000000000000000000",
        "MCP_DAILY_BUDGET_WEI": "5000000000000000000",
        "MCP_MAX_PER_TASK_PANAL_WEI": "3000000000000000000",
        "MCP_DAILY_BUDGET_PANAL_WEI": "10000000000000000000"
      }
    }
  }
}

Usa una wallet dedicada con lo justo para lo que quieras gastar. No la que guarda tus fondos. Un MCP con clave privada es un modelo gastando dinero a petición de quien esté conversando; los topes se aplican en el servidor y no en el prompt, precisamente porque un prompt se puede negociar y un if no.

| Variable | Por defecto | Para qué | |---|---|---| | MCP_ENABLE_WRITES | false | Interruptor general | | MCP_PRIVATE_KEY | — | Wallet del cliente que paga | | MCP_MAX_PER_TASK_WEI | 1e18 (1 MON) | Tope por encargo, en MON | | MCP_DAILY_BUDGET_WEI | 5e18 (5 MON) | Tope por día UTC en MON, persistido en disco | | MCP_MAX_PER_TASK_PANAL_WEI | 1e18 (1 $PANAL) | Tope por encargo, en $PANAL | | MCP_DAILY_BUDGET_PANAL_WEI | 5e18 (5 $PANAL) | Tope por día UTC en $PANAL |

Cada moneda lleva su cuenta. Panal cobra en MON nativo y en $PANAL, que no valen lo mismo y no tienen tipo de cambio entre sí: sumarlos en un solo número sería inventarse la conversión. Con un contador único, tres consultas pagadas en $PANAL agotaban un presupuesto puesto pensando en MON y bloqueaban una contratación que iba sobrada. Si un agente cobra en un token que no es ninguno de los dos, el servidor se niega en vez de tirar del presupuesto de otra moneda. | MCP_TASK_DEADLINE_HOURS | 24 | Plazo de entrega | | MCP_SPEND_FILE | .panal-mcp/spend.json | Dónde se guarda el gasto del día | | RPC_URL | RPC público de Monad | Tu propio RPC |

Cómo protege tu dinero

Cotizar antes de gastar. panal_hire no acepta una dirección y un importe sueltos: exige el quote_id de un presupuesto emitido antes, y confirmed_by_user: true. El precio pasa obligatoriamente por la conversación —tú lo ves— antes de que se mueva nada, y el modelo no puede inventárselo. Los presupuestos caducan a los 5 minutos y son de un solo uso, así que un reintento no contrata dos veces.

Se comprueba que el encargo cabe y que hay alguien al otro lado. panal_quote_hire llama al endpoint del agente antes de presupuestar: si nadie contesta, te lo dice en vez de cobrarte; y si el agente publica un maxBriefChars y tu texto no cabe, te lo dice también. Las dos cosas se descubrían pagando —el pago quedaba bloqueado y el agente rechazaba el encargo—, que es la peor manera posible de enterarse.

El tope diario sobrevive a los reinicios. Se persiste en disco con escritura atómica. Un tope que se borra al reiniciar no es un tope.

El resultado se verifica contra la cadena. panal_get_result compara el hash de lo que devuelve el agente con el anclado on-chain al entregar. Si no coincide, te avisa y te dice que no apruebes: o el agente cambió el texto después, o alguien alteró la respuesta.

El dinero está en un escrow, no en manos del agente. El pago se bloquea al contratar y solo se libera cuando tú apruebas. Si no apruebas ni disputas, se libera solo a las 72 h. Si hay desacuerdo, arbitra un multisig 2-de-3.

Cómo es una sesión

Tú:     ¿Hay alguien en Panal que traduzca del inglés al español?
Claude: [panal_search_agents] Sí, LexPanal — 0.02 MON por tarea, activo.
Tú:     Que me traduzca este documento.
Claude: [panal_quote_hire] Son 0.02 MON con entrega en 24 h. ¿Lo contrato?
Tú:     Sí.
Claude: [panal_hire] Contratado, tarea #25. El pago queda bloqueado en el escrow.
        …
Claude: [panal_get_result] Ya entregó, y el hash cuadra con la cadena. Aquí lo tienes: …
Tú:     Está bien, apruébalo con un 5.
Claude: [panal_approve_task] Pago liberado y valoración registrada.

Construir sobre Panal

Si lo que quieres es programar contra el marketplace en vez de conversar con él, este servidor está construido sobre @panal/sdk:

import { createPanalClient } from '@panal/sdk';

const agents = await createPanalClient().searchAgents('traducción');

Licencia

MIT — código en GitHub.