{
  "name": "Meta Agent Tools",
  "description": "Registro comunitário de MCP, Agent Skills e plugins. Like reversível, comentário, visita no hop. Fila no envio da comunidade. Catálogo MCP entra via sync do Official Registry, Smithery e Casdoor — não somos nenhum deles.",
  "auth": {
    "credito": "Token de crédito em `Authorization: Bearer cred_…` (ou header `X-Credito`). Não é conta: é portador de saldo.",
    "none": "Público, sem credencial.",
    "guest": "Guest token (`POST /api/guest`) em `X-Guest-Token: mr_…` ou `Authorization: Bearer mr_…`. Sessão `sess_…` também serve.",
    "session": "Sessão: `Authorization: Bearer sess_…` (OTP e-mail).",
    "session_ou_x402": "Duas portas para a MESMA ação: humano com sessão `sess_…` (grátis, dentro da cota) ou agente pagando x402 (`X-PAYMENT`). Guest token não é exigido nem impede o caminho pago.",
    "token": "Token de operador `ADMIN_TOKEN` ou `METRICS_TOKEN` em Bearer. As rotas de carga também aceitam a credencial do enriquecedor, que é de menor privilégio — ver cada endpoint."
  },
  "docs": {
    "llms": "https://agentalog.com/llms.txt",
    "llms_full": "https://agentalog.com/llms-full.txt",
    "openapi": "https://agentalog.com/openapi.json",
    "mcp": "https://agentalog.com/mcp",
    "human_ui": "https://agentalog.com/"
  },
  "endpoints": [
    {
      "method": "GET",
      "path": "/okf/:arquivo",
      "auth": "none",
      "summary": "Bundle OKF (Open Knowledge Format v0.1): markdown com frontmatter para o agente ler o produto inteiro sem parsear HTML.",
      "grupo": "Descoberta",
      "params": {
        "arquivo": {
          "desc": "`index.md`, `sobre.md`, `api.md` ou `faq.md`.",
          "exemplo": "index.md"
        }
      },
      "retorno": {
        "_texto": "`text/markdown`. Comece por `/okf/index.md`, que lista o bundle."
      },
      "erros": {
        "404": "Arquivo fora do bundle."
      },
      "exemplo": "curl -s $ORIGIN/okf/index.md",
      "returns": "`text/markdown`. Comece por `/okf/index.md`, que lista o bundle.",
      "url": "https://agentalog.com/okf/:arquivo",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/.well-known/:arquivo",
      "auth": "none",
      "summary": "Descoberta de máquina antes da home: `api-catalog` (RFC 9727, linkset com a API e o MCP), `security.txt` (RFC 9116) e `mcp-registry-auth` (chave do registro oficial de MCP).",
      "grupo": "Descoberta",
      "params": {
        "arquivo": {
          "desc": "`api-catalog`, `security.txt`, `mcp-registry-auth` ou `apis.json`.",
          "exemplo": "api-catalog"
        }
      },
      "retorno": {
        "_texto": "`application/linkset+json` no api-catalog; `text/plain` nos outros dois."
      },
      "erros": {
        "404": "Nome fora dos quatro publicados."
      },
      "exemplo": "curl -s $ORIGIN/.well-known/api-catalog",
      "returns": "`application/linkset+json` no api-catalog; `text/plain` nos outros dois.",
      "url": "https://agentalog.com/.well-known/:arquivo",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/apis.json",
      "auth": "none",
      "summary": "APIs.json (apisjson.org, 0.19): o índice que o APIs.io colhe — a API, o MCP, OpenAPI, guia e bundle OKF num arquivo só. Também em `/.well-known/apis.json`.",
      "grupo": "Descoberta",
      "retorno": {
        "_texto": "`application/json` no formato APIs.json 0.19: `apis[]` com `baseURL`, `humanURL` e `properties[]`."
      },
      "exemplo": "curl -s $ORIGIN/apis.json",
      "returns": "`application/json` no formato APIs.json 0.19: `apis[]` com `baseURL`, `humanURL` e `properties[]`.",
      "url": "https://agentalog.com/apis.json",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/feed.xml",
      "auth": "none",
      "summary": "RSS 2.0 dos registros publicados mais recentemente.",
      "grupo": "Descoberta",
      "retorno": {
        "_texto": "`application/rss+xml`."
      },
      "exemplo": "curl -s $ORIGIN/feed.xml",
      "returns": "`application/rss+xml`.",
      "url": "https://agentalog.com/feed.xml",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/feed.json",
      "auth": "none",
      "summary": "JSON Feed 1.1 dos registros publicados mais recentemente — o mesmo stream do RSS.",
      "grupo": "Descoberta",
      "retorno": {
        "_texto": "`application/feed+json`."
      },
      "exemplo": "curl -s $ORIGIN/feed.json",
      "returns": "`application/feed+json`.",
      "url": "https://agentalog.com/feed.json",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/api/",
      "auth": "none",
      "summary": "Índice auto-descrito: toda a superfície da API, com cota e quickstart.",
      "grupo": "Descoberta",
      "retorno": {
        "name": {
          "tipo": "string",
          "desc": "Nome do produto."
        },
        "description": {
          "tipo": "string",
          "desc": "O que o registro é e o que ele não é."
        },
        "auth": {
          "tipo": "object",
          "desc": "Cada modo de autenticação e como obtê-lo."
        },
        "docs": {
          "tipo": "object",
          "desc": "Links para llms.txt, llms-full.txt, openapi.json, MCP e a UI."
        },
        "endpoints": {
          "tipo": "object[]",
          "desc": "Todo endpoint com método, caminho, auth, URL absoluta e o que devolve."
        },
        "quota": {
          "tipo": "object",
          "desc": "O que é grátis, o que custa e como pagar — antes de você gastar chamada."
        },
        "mcp": {
          "tipo": "object",
          "desc": "Endereço e transporte do servidor MCP."
        },
        "quickstart": {
          "tipo": "string[]",
          "desc": "As chamadas que levam do zero ao primeiro registro publicado."
        }
      },
      "returns": "{ name, description, auth, docs, endpoints, quota, mcp, quickstart }",
      "url": "https://agentalog.com/api/",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/api/health",
      "auth": "none",
      "summary": "Liveness e o commit publicado agora — é como o smoke espera o próprio deploy.",
      "grupo": "Descoberta",
      "retorno": {
        "ok": {
          "tipo": "bool",
          "desc": "Sempre `true` quando o Worker responde."
        },
        "app": {
          "tipo": "string",
          "desc": "Nome do produto."
        },
        "build": {
          "tipo": "string",
          "desc": "Commit publicado; o CI passa o SHA curto no deploy."
        },
        "ts": {
          "tipo": "string",
          "desc": "Momento da resposta (UTC, ISO-8601)."
        }
      },
      "returns": "{ ok, app, build, ts }",
      "url": "https://agentalog.com/api/health",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "POST",
      "path": "/mcp",
      "auth": "none",
      "summary": "Servidor MCP por HTTP (Streamable HTTP, JSON-RPC 2.0) — pluga no cliente sem instalar nada.",
      "grupo": "Descoberta",
      "desc": "As tools são as operações deste mesmo catálogo; o MCP não tem backend próprio. `GET /mcp` devolve o cartão do servidor.",
      "retorno": {
        "_texto": "Resposta JSON-RPC 2.0 (`initialize`, `tools/list` ou `tools/call`)."
      },
      "notes": [
        "Credencial vai nos headers de sempre (X-Guest-Token, Authorization, X-PAYMENT) e é repassada à API.",
        "Cota estourada chega como 402 com accepts[] dentro do resultado da tool — pague e repita."
      ],
      "exemplo": "curl -s -XPOST $ORIGIN/mcp -H 'content-type: application/json' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\"}'",
      "returns": "Resposta JSON-RPC 2.0 (`initialize`, `tools/list` ou `tools/call`).",
      "url": "https://agentalog.com/mcp",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "POST",
      "path": "/api/guest",
      "auth": "none",
      "summary": "Cria um convidado `mr_…` — é a identidade que curte, comenta e visita.",
      "grupo": "Identidade",
      "desc": "Não pede e-mail. Publicar registro é que exige conta (ou pagamento).",
      "retorno": {
        "token": {
          "tipo": "string",
          "desc": "O convidado, prefixo `mr_`. Mande em `X-Guest-Token` ou como Bearer."
        }
      },
      "exemplo": "curl -s -XPOST $ORIGIN/api/guest",
      "returns": "{ token }",
      "url": "https://agentalog.com/api/guest",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/api/listings",
      "auth": "none",
      "summary": "O mosaico público: busca paginada dos registros live do catálogo.",
      "grupo": "Catálogo",
      "desc": "Só `live` no mosaico. Com `q`, `low_count` diz quantos `low` (poucas estrelas ou sem licença clara) batem no termo — LIKE com teto 200. `low=1` inclui essa cauda; sem `q` o parâmetro é ignorado.",
      "query": {
        "q": {
          "tipo": "string",
          "desc": "Texto livre no nome, na tagline e na descrição.",
          "exemplo": "postgres"
        },
        "kind": {
          "tipo": "string",
          "desc": "Que tipo de recurso trazer.",
          "valores": [
            "mcp",
            "skill",
            "plugin"
          ]
        },
        "category": {
          "tipo": "string",
          "desc": "Categoria declarada por quem publicou."
        },
        "sort": {
          "tipo": "string",
          "desc": "Ordem do resultado.",
          "valores": [
            "recent",
            "likes",
            "visits"
          ],
          "padrao": "recent"
        },
        "low": {
          "tipo": "string",
          "desc": "`1` inclui registros `low` no resultado. Só vale junto com `q`.",
          "valores": [
            "1"
          ]
        },
        "limit": {
          "tipo": "int",
          "desc": "Registros por página.",
          "padrao": 24
        },
        "offset": {
          "tipo": "int",
          "desc": "Quantos registros pular. Use `next_offset` da resposta anterior.",
          "padrao": 0
        }
      },
      "retorno": "PaginaDeAnuncios",
      "exemplo": "curl -s '$ORIGIN/api/listings?kind=mcp&sort=likes&limit=5'",
      "returns": "{ items[{id,kind,category,name,tagline,body,url,status,origin,origin_id,install,source,transporte,ns,versao,oficial_status,repo_host,topico,stars,forks,prs_abertos,pushed_at,repo_estado,likes,comments,visits,created_at,updated_at,mine,api,go,comments_api}], limit, offset, next_offset, low_count, low_capped, low_included, api }",
      "url": "https://agentalog.com/api/listings",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/api/facets",
      "auth": "none",
      "summary": "As contagens do catálogo inteiro por tipo, procedência, categoria e estado do repositório.",
      "grupo": "Catálogo",
      "desc": "Existe para montar filtro sem varrer os registros: são dezenas de milhares, e pedir a lista só para contar sairia caro. Traz também `topico_inferido`, deduzido dos repositórios.",
      "retorno": "Facetas",
      "exemplo": "curl -s $ORIGIN/api/facets",
      "returns": "{ total, facetas, topico_inferido, api }",
      "url": "https://agentalog.com/api/facets",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/v0.1/servers",
      "auth": "none",
      "summary": "Subregistry MCP no formato do Official Registry (spec v0.1), paginado por cursor.",
      "grupo": "Catálogo",
      "desc": "Só `kind=mcp` e só `live`. É a rota que um cliente MCP genérico sabe ler sem conhecer este produto. `GET /v0/servers` é alias do mesmo recurso, mantido para quem já apontava para lá — a URL canônica é esta.",
      "query": {
        "search": {
          "tipo": "string",
          "desc": "Texto livre no nome e na descrição do servidor."
        },
        "cursor": {
          "tipo": "string",
          "desc": "Cursor opaco da página seguinte, vindo de `metadata.next_cursor`."
        },
        "limit": {
          "tipo": "int",
          "desc": "Servidores por página.",
          "padrao": 30
        }
      },
      "retorno": "PaginaV01",
      "exemplo": "curl -s '$ORIGIN/v0.1/servers?search=postgres&limit=5'",
      "returns": "{ servers[{name,description,version,repository,remotes,packages}], metadata }",
      "url": "https://agentalog.com/v0.1/servers",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/api/listings/:id",
      "auth": "none",
      "summary": "Ficha de um registro. O dono vê a própria mesmo pendente ou escondida.",
      "grupo": "Catálogo",
      "params": {
        "id": {
          "desc": "ID do registro, vindo de `Anuncio.id`."
        }
      },
      "retorno": "Anuncio",
      "erros": {
        "404": "Registro não existe, ou não é seu e não está live/low."
      },
      "exemplo": "curl -s $ORIGIN/api/listings/ID",
      "returns": "{ id, kind, category, name, tagline, body, url, status, origin, origin_id, install, source, transporte, ns, versao, oficial_status, repo_host, topico, stars, forks, prs_abertos, pushed_at, repo_estado, likes, comments, visits, created_at, updated_at, mine, api, go, comments_api }",
      "url": "https://agentalog.com/api/listings/:id",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/api/go/:id",
      "auth": "none",
      "summary": "Hop para a URL do registro: redireciona e conta a visita.",
      "grupo": "Catálogo",
      "desc": "Conta no máximo 1 visita por dono por dia. O header `X-Visit-Counted` diz se esta chamada contou — é como o cliente sabe sem contar duas vezes.",
      "params": {
        "id": {
          "desc": "ID do registro a visitar."
        }
      },
      "retorno": {
        "_texto": "`302` com `Location` para a URL do registro, e o header `X-Visit-Counted`."
      },
      "erros": {
        "404": "Registro não existe ou não está live/low."
      },
      "returns": "`302` com `Location` para a URL do registro, e o header `X-Visit-Counted`.",
      "url": "https://agentalog.com/api/go/:id",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/api/listings/:id/comments",
      "auth": "none",
      "summary": "Comentários públicos de um registro live.",
      "grupo": "Comunidade",
      "desc": "Com credencial na chamada, cada comentário seu vem com `mine: true`.",
      "params": {
        "id": {
          "desc": "ID do registro."
        }
      },
      "retorno": {
        "items": {
          "tipo": "Comentario[]",
          "desc": "Os comentários, do mais novo para o mais antigo."
        },
        "total": {
          "tipo": "int",
          "desc": "Quantos comentários o registro tem."
        }
      },
      "erros": {
        "404": "Registro não existe ou não está live."
      },
      "exemplo": "curl -s $ORIGIN/api/listings/ID/comments",
      "returns": "{ items[{id,body,author,created_at,mine}], total }",
      "url": "https://agentalog.com/api/listings/:id/comments",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "POST",
      "path": "/api/listings/:id/comments",
      "auth": "guest",
      "summary": "Escreve um comentário no registro. Teto de 20 por hora por dono.",
      "grupo": "Comunidade",
      "params": {
        "id": {
          "desc": "ID do registro a comentar."
        }
      },
      "corpo": {
        "body": {
          "tipo": "string",
          "desc": "O texto do comentário.",
          "obrigatorio": true
        }
      },
      "body": {
        "body": "texto"
      },
      "retorno": {
        "ok": {
          "tipo": "bool",
          "desc": "Sempre `true` quando o comentário entrou."
        },
        "id": {
          "tipo": "string",
          "desc": "ID do comentário criado."
        },
        "body": {
          "tipo": "string",
          "desc": "O texto gravado."
        }
      },
      "erros": {
        "400": "Texto vazio ou longo demais.",
        "401": null,
        "404": "Registro não existe.",
        "429": "Passou de 20 comentários na hora."
      },
      "exemplo": "curl -s -XPOST $ORIGIN/api/listings/ID/comments -H \"X-Guest-Token: $MR\" -H 'content-type: application/json' -d '{\"body\":\"funciona bem com o Claude Code\"}'",
      "returns": "{ ok, id, body }",
      "url": "https://agentalog.com/api/listings/:id/comments",
      "auth_detail": "Guest token (`POST /api/guest`) em `X-Guest-Token: mr_…` ou `Authorization: Bearer mr_…`. Sessão `sess_…` também serve."
    },
    {
      "method": "DELETE",
      "path": "/api/comments/:id",
      "auth": "guest",
      "summary": "Apaga um comentário seu. Comentário alheio responde 404, não 403.",
      "grupo": "Comunidade",
      "desc": "O 404 é de propósito: a API não confirma que existe um comentário com aquele id se ele não é seu.",
      "params": {
        "id": {
          "desc": "ID do comentário, vindo de `Comentario.id`."
        }
      },
      "retorno": {
        "ok": {
          "tipo": "bool",
          "desc": "Sempre `true`."
        },
        "id": {
          "tipo": "string",
          "desc": "O id que saiu."
        }
      },
      "erros": [
        401,
        404
      ],
      "exemplo": "curl -s -XDELETE $ORIGIN/api/comments/CMT_ID -H \"X-Guest-Token: $MR\"",
      "returns": "{ ok, id }",
      "url": "https://agentalog.com/api/comments/:id",
      "auth_detail": "Guest token (`POST /api/guest`) em `X-Guest-Token: mr_…` ou `Authorization: Bearer mr_…`. Sessão `sess_…` também serve."
    },
    {
      "method": "POST",
      "path": "/api/listings/:id/like",
      "auth": "guest",
      "summary": "Curte o registro. Chamar de novo não soma: o contador conta pessoas.",
      "grupo": "Comunidade",
      "params": {
        "id": {
          "desc": "ID do registro a curtir."
        }
      },
      "retorno": "Like",
      "erros": [
        401,
        404
      ],
      "exemplo": "curl -s -XPOST $ORIGIN/api/listings/ID/like -H \"X-Guest-Token: $MR\"",
      "returns": "{ ok, liked, likes }",
      "url": "https://agentalog.com/api/listings/:id/like",
      "auth_detail": "Guest token (`POST /api/guest`) em `X-Guest-Token: mr_…` ou `Authorization: Bearer mr_…`. Sessão `sess_…` também serve."
    },
    {
      "method": "DELETE",
      "path": "/api/listings/:id/like",
      "auth": "guest",
      "summary": "Descurte e devolve o ponto ao contador público.",
      "grupo": "Comunidade",
      "params": {
        "id": {
          "desc": "ID do registro a descurtir."
        }
      },
      "retorno": "Like",
      "erros": [
        401,
        404
      ],
      "exemplo": "curl -s -XDELETE $ORIGIN/api/listings/ID/like -H \"X-Guest-Token: $MR\"",
      "returns": "{ ok, liked, likes }",
      "url": "https://agentalog.com/api/listings/:id/like",
      "auth_detail": "Guest token (`POST /api/guest`) em `X-Guest-Token: mr_…` ou `Authorization: Bearer mr_…`. Sessão `sess_…` também serve."
    },
    {
      "method": "POST",
      "path": "/api/listings",
      "auth": "session_ou_x402",
      "summary": "Registra um MCP, uma skill ou um plugin no catálogo. Entra como `pending`.",
      "grupo": "Publicar",
      "desc": "Duas portas para a mesma ação. Humano com sessão: grátis, 1 por dia, no máximo 3 na fila. Agente (com ou sem convidado): **402 com `accepts[]`**, $0.10 — pague e repita. Para skill, a URL do `SKILL.md` basta; o resto é apurado. **Valida antes de cobrar:** corpo recusado (400) e cota estourada (429) vêm ANTES do 402, então nenhum pagamento liquida por um registro que já se sabe que não entra. Corpo válido sem pagamento continua recebendo o 402 com o preço.",
      "corpo": {
        "kind": {
          "tipo": "string",
          "desc": "O que está sendo registrado.",
          "valores": [
            "mcp",
            "skill",
            "plugin"
          ],
          "obrigatorio": true
        },
        "url": {
          "tipo": "string",
          "desc": "Endpoint MCP, URL do SKILL.md ou repositório do plugin.",
          "obrigatorio": true
        },
        "name": {
          "tipo": "string",
          "desc": "Nome de exibição; sem ele, sai da fonte."
        },
        "tagline": {
          "tipo": "string",
          "desc": "Uma linha dizendo para que serve."
        },
        "body": {
          "tipo": "string",
          "desc": "Descrição longa, opcional."
        },
        "category": {
          "tipo": "string",
          "desc": "Categoria para o registro aparecer no filtro certo."
        }
      },
      "body": {
        "kind": "mcp",
        "category": "ferramentas",
        "name": "Nome",
        "tagline": "Uma linha",
        "url": "https://exemplo.com/mcp"
      },
      "retorno": {
        "ok": {
          "tipo": "bool",
          "desc": "Sempre `true` quando o pedido entrou."
        },
        "id": {
          "tipo": "string",
          "desc": "ID do registro criado."
        },
        "status": {
          "tipo": "string",
          "desc": "Sempre `pending`: tudo passa pela fila antes de virar live."
        }
      },
      "erros": {
        "400": "`kind` ou `url` ausentes, URL inválida, URL que não responde ou campo recusado.",
        "402": null,
        "429": "1 por dia, máximo 3 pendentes — vale para as duas portas, e é conferido antes de cobrar.",
        "502": "O pagamento liquidou e a gravação falhou. O corpo traz `transaction`: guarde e fale com o suporte."
      },
      "exemplo": "curl -s -XPOST $ORIGIN/api/listings -H \"X-PAYMENT: $PAGAMENTO\" -H 'content-type: application/json' -d '{\"kind\":\"mcp\",\"url\":\"https://exemplo.com/mcp\",\"name\":\"Meu MCP\"}'",
      "returns": "{ ok, id, status }",
      "url": "https://agentalog.com/api/listings",
      "auth_detail": "Duas portas para a MESMA ação: humano com sessão `sess_…` (grátis, dentro da cota) ou agente pagando x402 (`X-PAYMENT`). Guest token não é exigido nem impede o caminho pago."
    },
    {
      "method": "PATCH",
      "path": "/api/listings/:id",
      "auth": "session",
      "summary": "Edita um registro seu. Mudar a URL faz ele voltar para a fila.",
      "grupo": "Publicar",
      "desc": "A URL é o que a moderação olha; trocá-la depois de aprovado seria burlar a fila, então o registro volta a `pending`.",
      "params": {
        "id": {
          "desc": "ID do registro a editar."
        }
      },
      "corpo": {
        "name": {
          "tipo": "string",
          "desc": "Novo nome de exibição."
        },
        "tagline": {
          "tipo": "string",
          "desc": "Nova linha de resumo."
        },
        "body": {
          "tipo": "string",
          "desc": "Nova descrição longa."
        },
        "category": {
          "tipo": "string",
          "desc": "Nova categoria."
        },
        "url": {
          "tipo": "string",
          "desc": "Nova URL — trocar isto devolve o registro para `pending`."
        }
      },
      "body": {
        "tagline": "…"
      },
      "retorno": {
        "ok": {
          "tipo": "bool",
          "desc": "Sempre `true`."
        },
        "id": {
          "tipo": "string",
          "desc": "ID do registro editado."
        },
        "status": {
          "tipo": "string",
          "desc": "Estado depois da edição; volta a `pending` se a URL mudou."
        }
      },
      "erros": {
        "400": "Campo inválido no corpo.",
        "401": null,
        "404": "O registro não é seu ou não existe."
      },
      "exemplo": "curl -s -XPATCH $ORIGIN/api/listings/ID -H \"Authorization: Bearer $SESS\" -H 'content-type: application/json' -d '{\"tagline\":\"agora com suporte a SSE\"}'",
      "returns": "{ ok, id, status }",
      "url": "https://agentalog.com/api/listings/:id",
      "auth_detail": "Sessão: `Authorization: Bearer sess_…` (OTP e-mail)."
    },
    {
      "method": "GET",
      "path": "/api/me/listings",
      "auth": "session",
      "summary": "Os registros do dono em qualquer estado, inclusive pendente e escondido.",
      "grupo": "Publicar",
      "desc": "É a única rota que mostra o que ainda não é live — o mosaico público nunca mostra.",
      "retorno": {
        "items": {
          "tipo": "Anuncio[]",
          "desc": "Os registros da conta, de qualquer estado."
        }
      },
      "erros": [
        401
      ],
      "exemplo": "curl -s $ORIGIN/api/me/listings -H \"Authorization: Bearer $SESS\"",
      "returns": "{ items[{id,kind,category,name,tagline,body,url,status,origin,origin_id,install,source,transporte,ns,versao,oficial_status,repo_host,topico,stars,forks,prs_abertos,pushed_at,repo_estado,likes,comments,visits,created_at,updated_at,mine,api,go,comments_api}] }",
      "url": "https://agentalog.com/api/me/listings",
      "auth_detail": "Sessão: `Authorization: Bearer sess_…` (OTP e-mail)."
    },
    {
      "method": "GET",
      "path": "/api/me",
      "auth": "session",
      "summary": "A conta da sessão e, para o admin, o estado da carga.",
      "grupo": "Conta",
      "retorno": {
        "user": {
          "tipo": "Conta",
          "desc": "A pessoa dona da sessão."
        },
        "admin": {
          "tipo": "bool",
          "desc": "Se esta conta é o `ADMIN_EMAIL`."
        },
        "carga": {
          "tipo": "Carga",
          "desc": "Estado das fontes de carga; só para o admin.",
          "opcional": true
        }
      },
      "erros": [
        401
      ],
      "exemplo": "curl -s $ORIGIN/api/me -H \"Authorization: Bearer $SESS\"",
      "returns": "{ user{id,email}, admin, carga?{fontes,falhas,runs} }",
      "url": "https://agentalog.com/api/me",
      "auth_detail": "Sessão: `Authorization: Bearer sess_…` (OTP e-mail)."
    },
    {
      "method": "GET",
      "path": "/api/me/ui",
      "auth": "session",
      "summary": "As preferências de tela do dono: busca, filtro, ordenação e tema.",
      "grupo": "Conta",
      "desc": "Existe para o que a pessoa arrumou sobreviver a um F5 e a reabrir o app em outro aparelho. Refresh não é tela nova — ver AGENTS-UI.md. Convidado não tem: sem conta não há a quem devolver o dado depois, então o guest fica só no `localStorage` do navegador.",
      "retorno": "PreferenciasUi",
      "erros": [
        401
      ],
      "exemplo": "curl -s $ORIGIN/api/me/ui -H \"Authorization: Bearer $SESS\"",
      "returns": "{ prefs, api }",
      "url": "https://agentalog.com/api/me/ui",
      "auth_detail": "Sessão: `Authorization: Bearer sess_…` (OTP e-mail)."
    },
    {
      "method": "PUT",
      "path": "/api/me/ui",
      "auth": "session",
      "summary": "Grava as preferências de tela do dono, substituindo as anteriores.",
      "grupo": "Conta",
      "desc": "É PUT e não PATCH de propósito: o cliente manda o estado inteiro da tela, não um delta. Teto de 8 KB — isto é preferência de tela, não depósito de blob.",
      "corpo": {
        "prefs": {
          "tipo": "object",
          "desc": "O estado da interface a guardar. Opaco para o servidor: qualquer JSON dentro do teto serve.",
          "obrigatorio": true
        }
      },
      "body": {
        "prefs": {
          "q": "postgres",
          "kind": "mcp",
          "sort": "likes",
          "tema": "escuro"
        }
      },
      "retorno": "Ok",
      "erros": {
        "400": "Corpo que não é JSON (`bad_json`) ou sem a chave `prefs` (`prefs`).",
        "401": null,
        "405": "Método diferente de GET ou PUT nesta rota.",
        "413": "Preferências acima do teto de 8 KB (`grande`)."
      },
      "exemplo": "curl -s -XPUT $ORIGIN/api/me/ui -H \"Authorization: Bearer $SESS\" -H 'content-type: application/json' -d '{\"prefs\":{\"sort\":\"likes\"}}'",
      "returns": "{ ok }",
      "url": "https://agentalog.com/api/me/ui",
      "auth_detail": "Sessão: `Authorization: Bearer sess_…` (OTP e-mail)."
    },
    {
      "method": "POST",
      "path": "/api/auth/start",
      "auth": "none",
      "summary": "Envia o código de 6 dígitos por e-mail para criar a conta ou entrar nela.",
      "grupo": "Conta",
      "corpo": {
        "email": {
          "tipo": "string",
          "desc": "E-mail que vai receber o código.",
          "obrigatorio": true
        }
      },
      "body": {
        "email": "voce@exemplo.com"
      },
      "retorno": "Ok",
      "erros": {
        "400": "E-mail ausente ou malformado.",
        "429": "Pedidos demais para o mesmo e-mail."
      },
      "exemplo": "curl -s -XPOST $ORIGIN/api/auth/start -H 'content-type: application/json' -d '{\"email\":\"voce@exemplo.com\"}'",
      "returns": "{ ok }",
      "url": "https://agentalog.com/api/auth/start",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "POST",
      "path": "/api/auth/verify",
      "auth": "none",
      "summary": "Troca o código por uma sessão `sess_…`.",
      "grupo": "Conta",
      "corpo": {
        "email": {
          "tipo": "string",
          "desc": "O mesmo e-mail do `/api/auth/start`.",
          "obrigatorio": true
        },
        "code": {
          "tipo": "string",
          "desc": "Os 6 dígitos que chegaram por e-mail.",
          "obrigatorio": true
        }
      },
      "body": {
        "email": "voce@exemplo.com",
        "code": "123456"
      },
      "retorno": {
        "ok": {
          "tipo": "bool",
          "desc": "Sempre `true` quando o código conferiu."
        },
        "token": {
          "tipo": "string",
          "desc": "Sessão `sess_…` para usar em `Authorization: Bearer`."
        },
        "user": {
          "tipo": "Conta",
          "desc": "A pessoa que acabou de entrar."
        }
      },
      "erros": {
        "400": "Código errado ou expirado.",
        "429": "Tentativas demais."
      },
      "exemplo": "curl -s -XPOST $ORIGIN/api/auth/verify -H 'content-type: application/json' -d '{\"email\":\"voce@exemplo.com\",\"code\":\"123456\"}'",
      "returns": "{ ok, token, user{id,email} }",
      "url": "https://agentalog.com/api/auth/verify",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "POST",
      "path": "/api/auth/claim",
      "auth": "session",
      "summary": "Amarra um convidado à conta: likes e comentários dele passam a ser dela.",
      "grupo": "Conta",
      "corpo": {
        "guest_token": {
          "tipo": "string",
          "desc": "Convidado `mr_…` a ligar na conta.",
          "obrigatorio": true
        }
      },
      "body": {
        "guest_token": "mr_…"
      },
      "retorno": {
        "ok": {
          "tipo": "bool",
          "desc": "Sempre `true`."
        },
        "claimed": {
          "tipo": "int",
          "desc": "Quantos registros mudaram de dono."
        }
      },
      "erros": {
        "400": "`guest_token` ausente.",
        "401": null
      },
      "exemplo": "curl -s -XPOST $ORIGIN/api/auth/claim -H \"Authorization: Bearer $SESS\" -H 'content-type: application/json' -d '{\"guest_token\":\"mr_…\"}'",
      "returns": "{ ok, claimed }",
      "url": "https://agentalog.com/api/auth/claim",
      "auth_detail": "Sessão: `Authorization: Bearer sess_…` (OTP e-mail)."
    },
    {
      "method": "POST",
      "path": "/api/auth/logout",
      "auth": "session",
      "summary": "Invalida a sessão em curso.",
      "grupo": "Conta",
      "retorno": "Ok",
      "erros": [
        401
      ],
      "exemplo": "curl -s -XPOST $ORIGIN/api/auth/logout -H \"Authorization: Bearer $SESS\"",
      "returns": "{ ok }",
      "url": "https://agentalog.com/api/auth/logout",
      "auth_detail": "Sessão: `Authorization: Bearer sess_…` (OTP e-mail)."
    },
    {
      "method": "GET",
      "path": "/api/billing",
      "auth": "none",
      "summary": "Configuração x402 em vigor e os preços de contato e de publicação por agente.",
      "grupo": "Cobrança",
      "retorno": "Billing",
      "exemplo": "curl -s $ORIGIN/api/billing",
      "returns": "{ provider, mode, network, chain_id, pay_to, homolog, dev, dev_gate, facilitator, asset, asset_address, faucet, wallets, product, prices{contact_agent_usd,listing_agent_usd} }",
      "url": "https://agentalog.com/api/billing",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "POST",
      "path": "/api/contact",
      "auth": "none",
      "summary": "Fala com o suporte: humano resolve Turnstile, agente paga $0.10 em x402.",
      "grupo": "Cobrança",
      "desc": "O primeiro envio de agente é livre; depois o backoff é 60s dobrando até o teto de 1 hora, informado em `Retry-After`.",
      "corpo": {
        "name": {
          "tipo": "string",
          "desc": "Como chamar quem escreveu.",
          "obrigatorio": true
        },
        "email": {
          "tipo": "string",
          "desc": "Para onde responder.",
          "obrigatorio": true
        },
        "message": {
          "tipo": "string",
          "desc": "O que você quer dizer.",
          "obrigatorio": true
        },
        "form_ts": {
          "tipo": "int",
          "desc": "Momento em que o formulário abriu; é anti-robô do caminho humano."
        }
      },
      "body": {
        "name": "…",
        "email": "a@example.com",
        "message": "…",
        "form_ts": 0
      },
      "retorno": "Ok",
      "erros": {
        "400": "Campo obrigatório faltando.",
        "402": null,
        "429": "Backoff de agente: espere o `Retry-After`."
      },
      "exemplo": "curl -s -XPOST $ORIGIN/api/contact -H \"X-PAYMENT: $PAGAMENTO\" -H 'content-type: application/json' -d '{\"name\":\"Agente\",\"email\":\"a@example.com\",\"message\":\"Olá\"}'",
      "returns": "{ ok }",
      "url": "https://agentalog.com/api/contact",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "POST",
      "path": "/api/visit",
      "auth": "none",
      "summary": "Ping da interface que incrementa a visita do dia. Agente não precisa chamar.",
      "grupo": "Cobrança",
      "desc": "Smoke não conta: `X-MM-Smoke`, User-Agent `mm-smoke` ou `smoke: true` no corpo entram como `counted: false`.",
      "corpo": {
        "p": {
          "tipo": "string",
          "desc": "Caminho da página visitada."
        },
        "smoke": {
          "tipo": "bool",
          "desc": "`true` marca a chamada como teste e ela não entra na contagem."
        }
      },
      "body": {
        "p": "/"
      },
      "retorno": {
        "ok": {
          "tipo": "bool",
          "desc": "Sempre `true`."
        },
        "counted": {
          "tipo": "bool",
          "desc": "Se a visita entrou na contagem do dia."
        },
        "reason": {
          "tipo": "string",
          "desc": "Por que não contou, quando `counted` é `false`.",
          "opcional": true
        }
      },
      "exemplo": "curl -s -XPOST $ORIGIN/api/visit -H 'content-type: application/json' -d '{\"p\":\"/\",\"smoke\":true}'",
      "returns": "{ ok, counted, reason? }",
      "url": "https://agentalog.com/api/visit",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/api/metrics",
      "auth": "none",
      "summary": "Métricas dos últimos 7 dias. Com o token do operador, inclui os pagamentos.",
      "grupo": "Cobrança",
      "desc": "Sem credencial devolve visitas, uso e contas. Com `METRICS_TOKEN` em Bearer acrescenta `payments` — e só em Base mainnet, porque número de homologação em painel financeiro engana.",
      "headers": {
        "Authorization": {
          "tipo": "string",
          "desc": "`Bearer <METRICS_TOKEN>` para incluir o bloco financeiro.",
          "obrigatorio": false
        }
      },
      "retorno": "Metricas",
      "exemplo": "curl -s $ORIGIN/api/metrics -H \"Authorization: Bearer $METRICS_TOKEN\"",
      "returns": "{ app, today, today_visits, today_contacts?, days, usage, accounts, financeiro?, payments? }",
      "url": "https://agentalog.com/api/metrics",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/api/fila",
      "auth": "none",
      "summary": "O retrato público da fila de enriquecimento: quanto do catálogo já foi apurado.",
      "grupo": "Operação",
      "desc": "É público porque é sobre a saúde do catálogo, não sobre ninguém: só números agregados, nenhum registro identificável.",
      "retorno": "EstadoFila",
      "exemplo": "curl -s $ORIGIN/api/fila",
      "returns": "{ ok, fila{total,concluidos,vencidos,com_falha,processados,estados,motivos} }",
      "url": "https://agentalog.com/api/fila",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "POST",
      "path": "/api/admin/fila",
      "auth": "token",
      "summary": "O robô de enriquecimento empurra aqui o retrato da própria fila.",
      "grupo": "Operação",
      "desc": "Só a credencial do robô: isto não escreve no catálogo, então não há motivo para aceitar admin.",
      "corpo": {
        "fila": {
          "tipo": "object",
          "desc": "O retrato da fila: totais, estados e motivos.",
          "obrigatorio": true
        }
      },
      "body": {
        "fila": {
          "total": 20182,
          "concluidos": 11675
        }
      },
      "retorno": "Ok",
      "erros": {
        "400": "Corpo sem `fila`.",
        "401": null
      },
      "exemplo": "curl -s -XPOST $ORIGIN/api/admin/fila -H \"Authorization: Bearer $TOKEN_ROBO\" -H 'content-type: application/json' -d '{\"fila\":{}}'",
      "returns": "{ ok }",
      "url": "https://agentalog.com/api/admin/fila",
      "auth_detail": "Token de operador `ADMIN_TOKEN` ou `METRICS_TOKEN` em Bearer. As rotas de carga também aceitam a credencial do enriquecedor, que é de menor privilégio — ver cada endpoint."
    },
    {
      "method": "POST",
      "path": "/api/admin/repos",
      "auth": "token",
      "summary": "O enriquecedor grava aqui o que apurou de um repositório: estrelas, forks, estado.",
      "grupo": "Operação",
      "desc": "Aceita a credencial do enriquecedor OU a de admin — o robô tem a dele, de menor privilégio, e o admin entra para poder operar na mão sem depender do robô. O Worker não coleta nada: só grava o que já foi apurado fora dele.",
      "corpo": {
        "repos": {
          "tipo": "object[]",
          "desc": "Um item por repositório apurado, com estrelas, forks, PRs, `pushed_at` e estado.",
          "obrigatorio": true
        }
      },
      "body": {
        "repos": [
          {
            "url": "https://github.com/x/y",
            "stars": 120,
            "repo_estado": "ativo"
          }
        ]
      },
      "retorno": "Ok",
      "erros": {
        "400": "Corpo sem `repos` ou item malformado.",
        "401": "Nem credencial do enriquecedor nem de admin."
      },
      "exemplo": "curl -s -XPOST $ORIGIN/api/admin/repos -H \"Authorization: Bearer $TOKEN_ROBO\" -H 'content-type: application/json' -d '{\"repos\":[]}'",
      "returns": "{ ok }",
      "url": "https://agentalog.com/api/admin/repos",
      "auth_detail": "Token de operador `ADMIN_TOKEN` ou `METRICS_TOKEN` em Bearer. As rotas de carga também aceitam a credencial do enriquecedor, que é de menor privilégio — ver cada endpoint."
    },
    {
      "method": "GET",
      "path": "/api/admin/listings",
      "auth": "token",
      "summary": "A fila de moderação. Sem filtro, traz o que está pendente.",
      "grupo": "Operação",
      "desc": "Aceita `ADMIN_TOKEN` em Bearer ou a sessão do `ADMIN_EMAIL`.",
      "query": {
        "status": {
          "tipo": "string",
          "desc": "Qual estado listar.",
          "valores": [
            "pending",
            "live",
            "hidden",
            "blocked"
          ],
          "padrao": "pending"
        }
      },
      "retorno": {
        "items": {
          "tipo": "Anuncio[]",
          "desc": "Os registros naquele estado."
        }
      },
      "erros": [
        401
      ],
      "exemplo": "curl -s '$ORIGIN/api/admin/listings?status=pending' -H \"Authorization: Bearer $ADMIN_TOKEN\"",
      "returns": "{ items[{id,kind,category,name,tagline,body,url,status,origin,origin_id,install,source,transporte,ns,versao,oficial_status,repo_host,topico,stars,forks,prs_abertos,pushed_at,repo_estado,likes,comments,visits,created_at,updated_at,mine,api,go,comments_api}] }",
      "url": "https://agentalog.com/api/admin/listings",
      "auth_detail": "Token de operador `ADMIN_TOKEN` ou `METRICS_TOKEN` em Bearer. As rotas de carga também aceitam a credencial do enriquecedor, que é de menor privilégio — ver cada endpoint."
    },
    {
      "method": "POST",
      "path": "/api/admin/listings/:id",
      "auth": "token",
      "summary": "Decide o destino de um registro na fila: aprovar, esconder ou bloquear.",
      "grupo": "Operação",
      "params": {
        "id": {
          "desc": "ID do registro a moderar."
        }
      },
      "corpo": {
        "action": {
          "tipo": "string",
          "desc": "O que fazer com o registro.",
          "valores": [
            "approve",
            "hide",
            "block"
          ],
          "obrigatorio": true
        }
      },
      "body": {
        "action": "approve"
      },
      "retorno": {
        "ok": {
          "tipo": "bool",
          "desc": "Sempre `true`."
        },
        "status": {
          "tipo": "string",
          "desc": "O estado em que o registro ficou."
        }
      },
      "erros": {
        "400": "`action` fora da lista.",
        "401": null,
        "404": null
      },
      "exemplo": "curl -s -XPOST $ORIGIN/api/admin/listings/ID -H \"Authorization: Bearer $ADMIN_TOKEN\" -H 'content-type: application/json' -d '{\"action\":\"approve\"}'",
      "returns": "{ ok, status }",
      "url": "https://agentalog.com/api/admin/listings/:id",
      "auth_detail": "Token de operador `ADMIN_TOKEN` ou `METRICS_TOKEN` em Bearer. As rotas de carga também aceitam a credencial do enriquecedor, que é de menor privilégio — ver cada endpoint."
    },
    {
      "method": "GET",
      "path": "/api/admin/carga",
      "auth": "token",
      "summary": "Estado das fontes de carga do catálogo: último lote, contagem e falhas.",
      "grupo": "Operação",
      "desc": "Aceita `ADMIN_TOKEN` em Bearer ou a sessão do `ADMIN_EMAIL`.",
      "query": {
        "fonte": {
          "tipo": "string",
          "desc": "Restringe a uma fonte, ex. `official_mcp`."
        }
      },
      "retorno": "Carga",
      "erros": [
        401
      ],
      "exemplo": "curl -s $ORIGIN/api/admin/carga -H \"Authorization: Bearer $ADMIN_TOKEN\"",
      "returns": "{ fontes, falhas, runs }",
      "url": "https://agentalog.com/api/admin/carga",
      "auth_detail": "Token de operador `ADMIN_TOKEN` ou `METRICS_TOKEN` em Bearer. As rotas de carga também aceitam a credencial do enriquecedor, que é de menor privilégio — ver cada endpoint."
    },
    {
      "method": "POST",
      "path": "/api/admin/carga",
      "auth": "token",
      "summary": "Dispara um lote de carga ou marca um alerta de falha como visto.",
      "grupo": "Operação",
      "corpo": {
        "action": {
          "tipo": "string",
          "desc": "O que fazer.",
          "valores": [
            "run",
            "visto"
          ],
          "obrigatorio": true
        },
        "fonte": {
          "tipo": "string",
          "desc": "Qual fonte carregar ou marcar, ex. `official_mcp`."
        }
      },
      "body": {
        "action": "run",
        "fonte": "official_mcp"
      },
      "retorno": "Ok",
      "erros": {
        "400": "`action` fora da lista ou fonte desconhecida.",
        "401": null
      },
      "exemplo": "curl -s -XPOST $ORIGIN/api/admin/carga -H \"Authorization: Bearer $ADMIN_TOKEN\" -H 'content-type: application/json' -d '{\"action\":\"run\",\"fonte\":\"official_mcp\"}'",
      "returns": "{ ok }",
      "url": "https://agentalog.com/api/admin/carga",
      "auth_detail": "Token de operador `ADMIN_TOKEN` ou `METRICS_TOKEN` em Bearer. As rotas de carga também aceitam a credencial do enriquecedor, que é de menor privilégio — ver cada endpoint."
    },
    {
      "method": "POST",
      "path": "/api/credito",
      "auth": "none",
      "summary": "Recarrega crédito pré-pago: paga uma vez com x402 e recebe o token que desconta em qualquer API da casa.",
      "grupo": "Crédito",
      "query": {
        "usd": {
          "tipo": "int",
          "desc": "Pacote: 1, 5, 10 ou 25 dólares.",
          "obrigatorio": true
        }
      },
      "retorno": {
        "token": {
          "tipo": "string",
          "desc": "Token portador do saldo (`cred_…`). Mostrado UMA vez — não há como recuperá-lo."
        },
        "saldo_usd": {
          "tipo": "string",
          "desc": "Saldo creditado."
        },
        "guarde": {
          "tipo": "string",
          "desc": "Aviso de que o token é o portador do crédito."
        },
        "usar": {
          "tipo": "string",
          "desc": "Como apresentar o token nas rotas pagas."
        },
        "saldo_em": {
          "tipo": "string",
          "desc": "Onde consultar saldo e extrato."
        }
      },
      "erros": {
        "400": "Pacote fora da lista (1, 5, 10 ou 25).",
        "402": "Sem pagamento — o corpo traz `accepts[]` do x402."
      },
      "exemplo": "curl -s -XPOST '$ORIGIN/api/credito?usd=10'",
      "returns": "{ token, saldo_usd, guarde, usar, saldo_em }",
      "url": "https://agentalog.com/api/credito",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/api/credito",
      "auth": "credito",
      "summary": "Saldo e extrato do crédito — as últimas movimentações, sem devolver o token.",
      "grupo": "Crédito",
      "retorno": {
        "saldo_micros": {
          "tipo": "int",
          "desc": "Saldo em micro-dólares (1e-6 USD)."
        },
        "saldo_usd": {
          "tipo": "string",
          "desc": "Saldo formatado."
        },
        "criado_em": {
          "tipo": "string",
          "desc": "Quando o crédito foi aberto."
        },
        "movimentos": {
          "tipo": "object[]",
          "desc": "Entradas e saídas recentes, com produto e recurso."
        }
      },
      "erros": {
        "401": "Sem token ou token desconhecido."
      },
      "exemplo": "curl -s $ORIGIN/api/credito -H 'Authorization: Bearer cred_…'",
      "returns": "{ saldo_micros, saldo_usd, criado_em, movimentos }",
      "url": "https://agentalog.com/api/credito",
      "auth_detail": "Token de crédito em `Authorization: Bearer cred_…` (ou header `X-Credito`). Não é conta: é portador de saldo."
    }
  ],
  "quota": {
    "free": [
      {
        "o_que": "mosaico, ficha e comentários (`GET /api/listings`)",
        "limite": "sem cota",
        "janela": null
      },
      {
        "o_que": "like, comentário e hop com guest token",
        "limite": "sem cota",
        "janela": null
      },
      {
        "o_que": "registrar com conta de e-mail",
        "limite": "1 por dia, máx. 3 na fila",
        "janela": null
      }
    ],
    "paid": [
      {
        "o_que": "registrar como agente (com ou sem guest token)",
        "price_usd": 0.1
      },
      {
        "o_que": "contato de agente",
        "price_usd": 0.1
      }
    ],
    "how_to_pay": "Publicar sem sessão de e-mail responde **402** com `accepts[]` (x402, USDC na Base). Pague e repita a mesma chamada com `X-PAYMENT`. Guest token NÃO tira a opção de pagar.",
    "live": "https://agentalog.com/api/billing"
  },
  "mcp": {
    "endpoint": "https://agentalog.com/mcp",
    "transport": "streamable-http",
    "tools": 12,
    "note": "Pluga direto no cliente MCP; sem instalar nada. Tools = as operações abaixo."
  },
  "quickstart": [
    "GET https://agentalog.com/api/listings — mosaico live (cada item traz a URL de destino)",
    "GET https://agentalog.com/v0.1/servers — subregistry MCP (spec oficial)",
    "POST https://agentalog.com/api/guest — token mr_… para like/comentário",
    "POST https://agentalog.com/api/listings com sessão (humano) ou x402 $0.10 (agente, com ou sem guest)",
    "POST https://agentalog.com/mcp — as mesmas operações como tools MCP, sem instalar nada"
  ]
}