Mycelio es la capa binaria que usan los agentes en lugar de HTTP+JSON. Una sola conexión persistente le da a un agente dos cosas: FETCH cualquier URL pública como Markdown limpio (~30× menos tokens que el HTML crudo), y ROUTE llamadas a manifiestos firmados de proveedores sin tocar su documentación. Cada respuesta está firmada con Ed25519 por el directorio.
myc://mycelio.prowl.world:4242
100 tests · Apache 2.0
v0 — ningún runtime de agentes importante lo habla todavía
Apunta Mycelio a cualquier URL pública. El daemon la descarga, extrae el contenido principal como Markdown localmente con trafilatura, recurre a Jina Reader para SPAs y PDFs cuando hace falta, y lo devuelve dentro de un sobre binario firmado. Sin API key. Sin SDK del lado del proveedor. En caché por 24 horas.
curl https://mycelio.prowl.world/r/<any-url># pip install "mycelio @ git+https://github.com/opcastil11/mycelio.git"
import asyncio
from mycelio import MycelioClient
ROOT_PUBKEY = bytes.fromhex(
"23f6ebbc8faddb7ee8c9dedf2ef8e81057fb7d0bbace6ba26523452ef739c20c"
)
async def main():
async with MycelioClient.connect(
"mycelio.prowl.world", 4242, root_pubkey=ROOT_PUBKEY,
) as cli:
page = await cli.fetch("https://news.ycombinator.com")
print(page.content[:400])
print(f"\n→ {len(page.affordances)} affordances extracted")
asyncio.run(main())
La respuesta trae Markdown limpio y una lista de affordances tipadas (enlaces, formularios) sobre las que el agente puede actuar — las URLs relativas ya vienen resueltas contra la página. Las SPAs y los PDFs que trafilatura no puede procesar pasan a Jina Reader de forma transparente.
Medido contra news.ycombinator.com el 2026-05-23. Las cifras varían según la página — los sitios de documentación con mucho contenido se comprimen más; las landing pages estáticas, menos. La tendencia se mantiene: el Markdown limpio es muchísimo más pequeño que el HTML del que proviene.
Todo el camino de invocación gira en torno a un solo artefacto: un pequeño archivo firmado que apunta a la API HTTP que el proveedor ya sirve. Este es un manifiesto de Mycelio representativo, decodificado a una forma legible:
# stripe-payments.myc · 412 bytes signed
service: stripe.com
title: Stripe Payments API
backend: https://api.stripe.com/v1
auth: bearer-token (Authorization header)
endpoints:
- op: charge
method: POST /charges
in: { amount: int, currency: str, source: str }
out: { id: str, status: str }
- op: refund
method: POST /refunds
in: { charge_id: str, amount: int }
out: { id: str, status: str }
signatures:
vendor: ed25519:9f8a3d...
directory: ed25519:1b4c7e...
Codificado en frames binarios pesa 412 bytes. Lo firmas con tu clave Ed25519. El directorio lo cofirma con la clave raíz. Tu backend HTTP queda intacto — Mycelio solo describe cómo llegar a él. Sin SDK, sin servidor que operar, sin integración que mantener.
Esto es v0. El daemon de referencia corre en
myc://mycelio.prowl.world:4242. El SDK de Python se instala desde GitHub (publicación en PyPI pendiente). 100 tests pasan de punta a punta. El formato de transmisión es lo bastante estable para construir sobre él.
Ya disponible: spec v0, códec de frames binarios, soporte TLS, daemon asíncrono, manifiestos de proveedor con doble firma Ed25519,
INSPECT, ROUTEy FETCH
verbos funcionando de punta a punta (FETCH con extracción de affordances + respaldo de Jina). Siguiente:
Prowl Design — genera automáticamente manifiestos firmados a partir de tu OpenAPI existente.
Pero, para ser francos, lo que esto no es todavía:
El lado FETCH esquiva el problema del huevo y la gallina — funciona con cualquier URL de la web pública desde el primer día, sin que el proveedor tenga que adoptar nada. Por eso lo lanzamos primero.
Nuestra apuesta: a medida que los agentes pasan de "tool-loop dentro de un IDE" a "autónomos, llamando a miles de APIs por sesión", el problema del huevo y la gallina se invierte. El único protocolo que puede escalar a "todos los SaaS de internet" es uno donde el proveedor no implementa nada — porque la larga cola de proveedores no va a desplegar servidores a medida para cada runtime de agentes. Si esa tesis es correcta, esta se convierte en la capa para ello.
Si la tesis es incorrecta: la API HTTP del directorio sigue funcionando, tu OpenAPI existente sigue funcionando y puedes ignorar Mycelio. Apostar por el protocolo te cuesta un archivo de manifiesto que firmas en cinco minutos y puedes revocar cuando quieras.
MCP y Mycelio operan en capas distintas y creemos que son complementarios, no competidores. MCP brilla cuando el operador del agente ya eligió tu herramienta — el usuario instaló tu servidor MCP, el agente está en un tool-loop y los parámetros son conocidos. Mycelio es para la capa anterior: descubrimiento público e invocación de servicios que el agente no conocía al arrancar.
Dicho esto, las concesiones técnicas difieren en puntos que importan:
DISCOVER)
No buscamos reemplazar a MCP para el uso de herramientas dentro de runtimes de agentes, a A2A para la mensajería entre agentes ni al function-calling de OpenAI para sintaxis de herramientas propietarias. Mycelio se ubica una capa antes: descubrimiento público e invocación anclada en firmas para backends que ya hablan HTTP.
La composición completa — descubrir servicios, obtener una página, invocar una operación — ocurre en una sola conexión TCP. Sin handshakes TLS adicionales entre verbos, una sola cadena de firmas, un solo contexto de autenticación:
async with MycelioClient.connect(
"mycelio.prowl.world", 4242, root_pubkey=ROOT_PUBKEY,
) as cli:
# 1. find payment APIs
matches = await cli.discover(query="payment", min_score=80)
# 2. read a candidate's site to evaluate it
page = await cli.fetch(f"https://{matches.results[0].name}")
if "x402" in page.content.lower():
# 3. pull the manifest and invoke it
m = await cli.inspect(matches.results[0].service_id)
resp = await cli.route(m, "charge", {"amount": 500, "currency": "usd"})
print(resp.json())
DISCOVER + FETCH + INSPECT +
ROUTE en una sola sesión. Verificación de firmas de punta a punta. Demos completas en
examples/. Spec de transmisión:
protocol-v0.md.
Hoy hay siete verbos implementados de punta a punta; cuatro están reservados en la spec para uso futuro. Reservado no significa "próximamente" — significa "el byte está asignado para que una implementación pueda crecer hacia él más adelante sin romper la compatibilidad."
Formato del manifiesto: manifest-v0.md
Mycelio es Apache 2.0. La spec de transmisión, el códec de frames, el SDK de Python y el daemon de referencia viven en el repositorio público de GitHub. Son bienvenidas las implementaciones en Go, Rust y JS.
La parte honesta: ahora mismo hay un solo directorio corriendo Mycelio en producción, y es
Prowl. El daemon en
myc://mycelio.prowl.world:4242 es de Prowl. La clave raíz Ed25519 que cofirma cada manifiesto es de Prowl. La spec no asume un único operador, pero hasta que alguien más levante uno, "Mycelio" y "el protocolo binario de Prowl" significan lo mismo en la práctica. Preferimos decirlo en voz alta antes que fingir lo contrario.
¿Te preocupa el lock-in? Tu manifiesto puede servirlo cualquier directorio futuro, tu API HTTP existente es la fuente de verdad que sobrevive a todo esto, y puedes revocarlo en cualquier momento.
cli.fetch(url) para leer la web en ~700 tokens por página en lugar de 20.000. El SDK de Python se instala desde GitHub (publicación en PyPI pendiente): pip install "mycelio @ git+https://github.com/opcastil11/mycelio.git".