Mycelio é a camada binária que os agentes usam no lugar de HTTP+JSON. Uma conexão persistente dá ao agente duas coisas: FETCH qualquer URL pública como Markdown limpo (~30× menos tokens que HTML bruto), e ROUTE chamadas para manifestos assinados de fornecedores sem precisar ler a documentação deles. Toda resposta é assinada com Ed25519 pelo diretório.
myc://mycelio.prowl.world:4242
100 testes · Apache 2.0
v0 — nenhum grande runtime de agentes fala este protocolo ainda
Aponte o Mycelio para qualquer URL pública. O daemon busca a página, extrai o conteúdo principal como Markdown localmente com trafilatura, recorre ao Jina Reader para SPAs e PDFs quando necessário e devolve tudo dentro de um envelope binário assinado. Sem chave de API. Sem SDK do lado do fornecedor. Cache de 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())
A resposta traz Markdown limpo e uma lista de affordances tipadas (links, formulários) sobre as quais o agente pode agir — URLs relativas já vêm resolvidas em relação à página. SPAs e PDFs que o trafilatura não consegue processar passam para o Jina Reader de forma transparente.
Medido contra news.ycombinator.com em 23/05/2026. Os números variam por página — sites de documentação com muito conteúdo comprimem mais; landing pages estáticas comprimem menos. O padrão se mantém: Markdown limpo é drasticamente menor que o HTML de origem.
Todo o caminho de invocação gira em torno de um único artefato: um pequeno arquivo assinado que aponta para a API HTTP que o fornecedor já oferece. Aqui está um manifesto Mycelio representativo, decodificado em formato legível:
# 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 em frames binários, ele tem 412 bytes. Você o assina com sua chave Ed25519. O diretório o coassina com a chave raiz. Seu backend HTTP continua intacto — o Mycelio apenas descreve como acessá-lo. Sem SDK, sem servidor para rodar, sem integração para manter.
Isto é a v0. O daemon de referência roda em
myc://mycelio.prowl.world:4242. O SDK Python é instalado a partir do GitHub (lançamento no PyPI pendente). 100 testes passam de ponta a ponta. O formato de transmissão é estável o suficiente para construir em cima.
Entregue: spec v0, codec de frames binários, suporte a TLS, daemon assíncrono, manifestos de fornecedores com dupla assinatura Ed25519,
INSPECT, ROUTEe FETCH
verbos funcionando de ponta a ponta (FETCH com extração de affordances + fallback para Jina). Próximo:
Prowl Design — gere automaticamente manifestos assinados a partir do seu OpenAPI existente.
Mas, sendo franco, o que isto não é ainda:
O lado FETCH escapa do problema do ovo e da galinha — funciona com qualquer URL da web pública desde o primeiro dia, sem exigir adoção por fornecedores. Por isso o lançamos primeiro.
Nossa aposta: à medida que os agentes passam de "tool-loop dentro de uma IDE" para "autônomos, chamando milhares de APIs por sessão", o problema do ovo e da galinha se inverte. O único protocolo capaz de escalar para "todo SaaS da internet" é aquele em que o fornecedor não implementa nada — porque a cauda longa de fornecedores não vai implantar servidores sob medida para cada runtime de agentes. Se essa tese estiver certa, esta se torna a camada para isso.
Se a tese estiver errada: a API HTTP do diretório continua funcionando, seu OpenAPI existente continua funcionando e você pode ignorar o Mycelio. Apostar no protocolo custa um arquivo de manifesto que você assina em cinco minutos e revoga quando quiser.
MCP e Mycelio operam em camadas diferentes e achamos que são complementares, não concorrentes. O MCP brilha quando o operador do agente já escolheu sua ferramenta — o usuário instalou seu servidor MCP, o agente está em um tool-loop, os parâmetros são conhecidos. O Mycelio é para a camada anterior a isso: descoberta pública e invocação de serviços que o agente não conhecia ao iniciar.
Dito isso, os trade-offs técnicos diferem em pontos que importam:
DISCOVER)
Não estamos tentando substituir o MCP para uso de ferramentas dentro de runtimes de agentes, o A2A para mensagens entre agentes, nem o function-calling da OpenAI para sintaxe proprietária de ferramentas. O Mycelio fica uma camada antes: descoberta pública e invocação ancorada em assinaturas para backends que já falam HTTP.
A composição completa — descobrir serviços, buscar uma página, invocar uma operação — acontece em uma conexão TCP. Sem handshakes TLS extras entre verbos, uma cadeia de assinaturas, um contexto de autenticação:
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 em uma sessão. Verificação de assinatura de ponta a ponta. Demos completas em
examples/. Spec de transmissão:
protocol-v0.md.
Sete verbos estão implementados de ponta a ponta hoje; quatro estão reservados na spec para uso futuro. Reservado não significa "em breve" — significa "o byte está alocado para que uma implementação possa adotá-lo depois sem quebrar a compatibilidade."
Formato do manifesto: manifest-v0.md
O Mycelio é Apache 2.0. A spec de transmissão, o codec de frames, o SDK Python e o daemon de referência estão todos no repositório público no GitHub. Implementações em Go, Rust e JS são bem-vindas.
A parte honesta: hoje existe apenas um diretório rodando Mycelio em produção, e é o
Prowl. O daemon em
myc://mycelio.prowl.world:4242 é do Prowl. A chave raiz Ed25519 que coassina todos os manifestos é do Prowl. A spec não pressupõe um único operador, mas até que alguém suba outro, "Mycelio" e "o protocolo binário do Prowl" significam a mesma coisa na prática. Preferimos dizer isso abertamente a fingir o contrário.
Preocupado com lock-in? Seu manifesto pode ser servido por qualquer diretório futuro, sua API HTTP existente é a fonte da verdade que sobrevive a tudo isso, e você pode revogar a qualquer momento.
cli.fetch(url) para ler a web com ~700 tokens por página em vez de 20.000. O SDK Python é instalado a partir do GitHub (lançamento no PyPI pendente): pip install "mycelio @ git+https://github.com/opcastil11/mycelio.git".