Skip to content
Back to EditalMD

Card snapshot

editalmd.com · 2026-10-16 13:07:40 UTC · a20844dfc2dc7e6ff37c8cf84be3525346eec512446029be0ce6e9a34408cfca

This is a frozen copy of the agent's agent-card.json as we observed it at the timestamp above. We capture a new snapshot every time the card's content hash changes. Useful for: forensic drift analysis, verifying downstream callers see the right version, reproducing routing decisions made historically.

{
  "name": "EditalMD",
  "description": "Busque licita\u00e7\u00f5es por produto, servi\u00e7o e estado. Veja prazos e documentos. Compare exig\u00eancias com sua empresa e receba alertas de novas compras.",
  "url": "https://editalmd.com",
  "provider": {
    "organization": "EditalMD",
    "url": "https://editalmd.com",
    "email": "contato@editalmd.com"
  },
  "documentationUrl": "https://editalmd.com/llms.txt",
  "protocol": "mcp",
  "protocolUrl": "https://modelcontextprotocol.io",
  "interfaces": [
    {
      "transport": "streamable-http",
      "url": "https://editalmd.com/mcp"
    }
  ],
  "capabilities": {
    "streaming": true,
    "pushNotifications": false,
    "authentication": "none"
  },
  "defaultInputModes": [
    "application/json"
  ],
  "defaultOutputModes": [
    "application/json",
    "text/markdown"
  ],
  "skills": [
    {
      "id": "evaluation_quota",
      "name": "evaluation_quota",
      "description": "Cota individual: um premium e 100 b\u00e1sicos, com validade. N\u00e3o cobra.",
      "endpoint": "GET /api/avaliacao"
    },
    {
      "id": "evaluation_premium",
      "name": "evaluation_premium",
      "description": "Use seu \u00fanico premium patrocinado em um documento de at\u00e9 50 p\u00e1ginas. Guarde evaluation.access_code como avaliacao_codigo e acompanhe por estado_geracao com agent_pass. Repetir recupera o mesmo acesso. Franquia por credencial, at\u00e9 a menor data entre os 30 dias do agente e o fim do piloto. Repeti\u00e7\u00e3o do mesmo documento n\u00e3o consome outra unidade. N\u00e3o envie pagamento. Premium: guarde evaluation.access_code e use X-Editalmd-Avaliacao junto de X-Agent-Pass nas leituras e no GET /geracao. B\u00e1sico n\u00e3o abre conte\u00fado premium. Piloto sujeito ao or\u00e7amento global; sem renova\u00e7\u00e3o autom\u00e1tica.",
      "endpoint": "POST /api/documento/:id/avaliacao/premium"
    },
    {
      "id": "evaluation_basic",
      "name": "evaluation_basic",
      "description": "Texto nativo/OCR b\u00e1sico de PDF at\u00e9 50 p\u00e1ginas/32 MiB, sem revis\u00e3o nem tabelas estruturadas. At\u00e9 100 documentos por agente. N\u00e3o libera premium. N\u00e3o cobra. Franquia por credencial, at\u00e9 a menor data entre os 30 dias do agente e o fim do piloto. Repeti\u00e7\u00e3o do mesmo documento n\u00e3o consome outra unidade. N\u00e3o envie pagamento. Premium: guarde evaluation.access_code e use X-Editalmd-Avaliacao junto de X-Agent-Pass nas leituras e no GET /geracao. B\u00e1sico n\u00e3o abre conte\u00fado premium. Piloto sujeito ao or\u00e7amento global; sem renova\u00e7\u00e3o autom\u00e1tica.",
      "endpoint": "POST /api/documento/:id/avaliacao/basico"
    },
    {
      "id": "evaluation_basic_result",
      "name": "evaluation_basic_result",
      "description": "Acompanhe a leitura b\u00e1sica ap\u00f3s retry_after_s e recupere texto por p\u00e1gina com hash da fonte. N\u00e3o cobra. Franquia por credencial, at\u00e9 a menor data entre os 30 dias do agente e o fim do piloto. Repeti\u00e7\u00e3o do mesmo documento n\u00e3o consome outra unidade. N\u00e3o envie pagamento. Premium: guarde evaluation.access_code e use X-Editalmd-Avaliacao junto de X-Agent-Pass nas leituras e no GET /geracao. B\u00e1sico n\u00e3o abre conte\u00fado premium. Piloto sujeito ao or\u00e7amento global; sem renova\u00e7\u00e3o autom\u00e1tica.",
      "endpoint": "GET /api/documento/:id/avaliacao/basico"
    },
    {
      "id": "company_documents",
      "name": "company_documents",
      "description": "Lista os PDFs privados da empresa. Downloads bin\u00e1rios usam GET HTTP autenticado /documentos/:arquivo.",
      "endpoint": "GET /api/me/empresas/:cnpj/documentos"
    },
    {
      "id": "attach_company_document",
      "name": "attach_company_document",
      "description": "Envia comprovante PDF da empresa. N\u00e3o inicia OCR. Sess\u00e3o necess\u00e1ria; prefira HTTP para arquivos grandes. 201. JSON at\u00e9 11.200.000 bytes; PDF at\u00e9 8 MiB, 20 documentos/80 MiB/50 p\u00e1ginas por empresa. Arquivo id\u00eantico \u00e9 reaproveitado. A leitura autom\u00e1tica acontece somente ao solicitar a an\u00e1lise.",
      "endpoint": "POST /api/me/empresas/:cnpj/documentos"
    },
    {
      "id": "remove_company_document",
      "name": "remove_company_document",
      "description": "Remove um comprovante da pr\u00f3pria empresa; an\u00e1lises que o usavam ficam desatualizadas.",
      "endpoint": "DELETE /api/me/empresas/:cnpj/documentos/:arquivo"
    },
    {
      "id": "analyze_participation",
      "name": "analyze_participation",
      "description": "Inicia/retoma an\u00e1lise com cadastro, anexos e edital. S\u00f3 chame por solicita\u00e7\u00e3o do usu\u00e1rio; acompanhe por consultar_participacao. 202 ap\u00f3s aceitar e preservar o pedido; 200 ao reaproveitar an\u00e1lise conclu\u00edda. Usa perfil e anexos deste dono. Pedidos interrompidos podem ser retomados; falhas informam motivo e pr\u00f3xima a\u00e7\u00e3o. POST expl\u00edcito retoma uma pausa. At\u00e9 2 mil fatos e 100 editais por empresa, sujeitos \u00e0 capacidade e ao or\u00e7amento dispon\u00edveis. N\u00e3o cobra nova compra nesta opera\u00e7\u00e3o. Acompanhamento somente por GET. A an\u00e1lise oferece triagem com evid\u00eancias, n\u00e3o decis\u00e3o definitiva de habilita\u00e7\u00e3o nem consulta jur\u00eddica externa.",
      "endpoint": "POST /api/me/empresas/:cnpj/analises/:id"
    },
    {
      "id": "get_participation",
      "name": "get_participation",
      "description": "Consulta estado, Pend\u00eancias e Atendidos com motivos, a\u00e7\u00f5es e evid\u00eancias. Nunca inicia an\u00e1lise. Pend\u00eancias re\u00fane precisa_comprovar (falta prova), divergente (evid\u00eancia incompat\u00edvel) e acompanhar (obriga\u00e7\u00e3o futura). Cadastro, anexos ou dossi\u00ea diferentes retornam outdated sem resultados atuais. A data de refer\u00eancia \u00e9 conservada na retomada; dia anterior retorna data_atual=false. Os lotes validados continuam dispon\u00edveis durante falhas/processamento com parcial=true e processados/total; nunca representam conclus\u00e3o das exig\u00eancias ainda n\u00e3o comparadas. GET n\u00e3o executa a fila nem inicia IA.",
      "endpoint": "GET /api/me/empresas/:cnpj/analises/:id"
    },
    {
      "id": "list_my_companies",
      "name": "list_my_companies",
      "description": "Empresas = organiza\u00e7\u00f5es da conta com o EditalMD; use a sess\u00e3o ou a chave de organiza\u00e7\u00e3o.",
      "endpoint": "GET /api/me/empresas"
    },
    {
      "id": "search_companies",
      "name": "search_companies",
      "description": "Busca na base cadastral por CNPJ ou raz\u00e3o social; exige conta ou convidado.",
      "endpoint": "GET /api/me/empresas/busca"
    },
    {
      "id": "add_company",
      "name": "add_company",
      "description": "Importa o CNPJ numa organiza\u00e7\u00e3o nova ou na da chave de organiza\u00e7\u00e3o. Sem X-Organization-Id, cria a organiza\u00e7\u00e3o com a raz\u00e3o social e o EditalMD ligado, ou devolve a que a pessoa tirou da lista (201). Com X-Organization-Id ou chave de organiza\u00e7\u00e3o, a ficha vai para essa organiza\u00e7\u00e3o, se quem pede a gere e ela n\u00e3o tem empresa. 200 quando o CNPJ j\u00e1 est\u00e1 numa organiza\u00e7\u00e3o de quem pede. At\u00e9 100 empresas; sem s\u00f3cios ou contatos; nenhuma an\u00e1lise \u00e9 iniciada.",
      "endpoint": "PUT /api/me/empresas/:cnpj"
    },
    {
      "id": "select_company",
      "name": "select_company",
      "description": "Seleciona empresa cadastrada; n\u00e3o executa an\u00e1lise. Escolha de cada pessoa, guardada na conta. N\u00e3o executa an\u00e1lise; repetir a escolha atual n\u00e3o grava.",
      "endpoint": "PUT /api/me/empresas/:cnpj/selecionar"
    },
    {
      "id": "remove_company",
      "name": "remove_company",
      "description": "Tira a empresa da lista (dona ou administradora); organiza\u00e7\u00e3o e PDFs ficam, e adicionar o CNPJ a devolve.",
      "endpoint": "DELETE /api/me/empresas/:cnpj"
    },
    {
      "id": "awarded_prices",
      "name": "awarded_prices",
      "description": "O pre\u00e7o que ganha para um item parecido, em resumo gr\u00e1tis: quantos pre\u00e7os, a mediana e a faixa (p25/p75) do mesmo produto do cat\u00e1logo na mesma unidade, sem os extremos, o volume comprado, o pre\u00e7o para a sua quantidade e os outros grupos que a busca achou (pe\u00e7a produto e unidade de um deles para trocar). O completo \u2014 quem vence, quem compra, por UF, por m\u00eas, por tamanho da compra e os itens \u2014 \u00e9 GET /api/precos/detalhe, pago por consulta (x402 ou cr\u00e9dito). Consulte resultados homologados por descri\u00e7\u00e3o do item. O resumo gr\u00e1tis traz `n`, a mediana e a faixa (p25/p75) dos compar\u00e1veis \u2014 o mesmo produto do cat\u00e1logo, na mesma unidade, sem os extremos (`comparacao`) \u2014, os outros grupos que a busca achou (`grupos`: pe\u00e7a `produto` e `unidade` de um deles para trocar), o volume comprado, o pre\u00e7o para a sua `quantidade` (ou a do item da `compra` aberta) e quanto a compra pequena paga a mais, `amostra` (o crit\u00e9rio: at\u00e9 2.000 itens mais parecidos pelo texto) e `detalhe`: o endere\u00e7o (do mesmo grupo), o pre\u00e7o e o tamanho do pre\u00e7o que ganha completo (`GET /api/precos/detalhe`, pago por consulta) \u2014 quem vence, quem compra, por UF, por m\u00eas, os outros n\u00fameros do resumo e os itens. Aceita tamb\u00e9m POST, PUT ou PATCH com os mesmos par\u00e2metros em JSON ou formul\u00e1rio; `query`, `termo`, `busca` e `search` valem como `q`, `estado` como `uf`, `limit` como `limite`. Todo 400 traz `exemplo` e `doc`. `Accept: text/html` abre a aba Pre\u00e7os pagos com a consulta.",
      "endpoint": "GET /api/precos"
    },
    {
      "id": "framework_agreements",
      "name": "framework_agreements",
      "description": "Atas de registro de pre\u00e7o vigentes no PNCP pelo objeto, as mais relevantes primeiro: \u00f3rg\u00e3o gerenciador, vig\u00eancia, se aceita ades\u00e3o (carona) e o link da ata. Gr\u00e1tis. Busca as atas de registro de pre\u00e7o publicadas no PNCP que ainda valem (n\u00e3o canceladas, vig\u00eancia at\u00e9 hoje ou depois), as mais relevantes para os termos primeiro: o \u00f3rg\u00e3o gerenciador, o objeto, a vig\u00eancia, se aceita ades\u00e3o (a carona) e o endere\u00e7o da ata no PNCP. `adesao=1` traz s\u00f3 as que aceitam. A ficha da compra (`/api/compra/:id`) traz as atas que ela gerou. `Accept: text/html` abre a aba Pre\u00e7os registrados com os termos.",
      "endpoint": "GET /api/atas"
    },
    {
      "id": "procurement_plans",
      "name": "procurement_plans",
      "description": "O que os \u00f3rg\u00e3os planejam comprar (planos de contrata\u00e7\u00f5es anuais do PNCP), antes de a licita\u00e7\u00e3o abrir: item, \u00f3rg\u00e3o, quantidade, valor estimado e data desejada. Gr\u00e1tis. Busca os itens dos planos de contrata\u00e7\u00f5es anuais (PCA) que os \u00f3rg\u00e3os publicam no PNCP: o que cada um pretende comprar, quanto, por quanto e para quando \u2014 a demanda antes de a licita\u00e7\u00e3o abrir. S\u00f3 a vers\u00e3o em vigor de cada plano; sem `ano`, do ano corrente em diante. Para saber quando a licita\u00e7\u00e3o abrir, crie um alerta com os mesmos termos (`/api/alertas`). `Accept: text/html` abre a aba Compras previstas com os termos.",
      "endpoint": "GET /api/planos"
    },
    {
      "id": "my_account",
      "name": "my_account",
      "description": "Identidade e contadores privados da sess\u00e3o da conta (cookie) enviada no pedido MCP. A conta global j\u00e1 \u00e9 a pessoa no EditalMD: n\u00e3o h\u00e1 ativa\u00e7\u00e3o por produto.",
      "endpoint": "GET /api/me"
    },
    {
      "id": "my_documents",
      "name": "my_documents",
      "description": "Cole\u00e7\u00e3o privada da conta. Exige a sess\u00e3o da conta (cookie + CSRF do navegador).",
      "endpoint": "GET /api/me/documentos"
    },
    {
      "id": "my_procurements",
      "name": "my_procurements",
      "description": "Cole\u00e7\u00e3o privada da conta. Exige a sess\u00e3o da conta (cookie + CSRF do navegador).",
      "endpoint": "GET /api/me/compras"
    },
    {
      "id": "documento_vincular",
      "name": "documento_vincular",
      "description": "Vincula aquisi\u00e7\u00e3o \u00e0 conta da sess\u00e3o usando a autoriza\u00e7\u00e3o privada comprada. Exige sess\u00e3o e prova privada da aquisi\u00e7\u00e3o. Grava o direito global da conta pelo recibo do pagamento: idempotente para o mesmo dono, e outro dono n\u00e3o pode reivindicar. O c\u00f3digo continua abrindo o documento sozinho.",
      "endpoint": "POST /api/documento/:id/vincular"
    },
    {
      "id": "documento_acesso",
      "name": "documento_acesso",
      "description": "Estado do acesso e c\u00f3digo privado de recupera\u00e7\u00e3o, sem nova compra.",
      "endpoint": "GET /api/documento/:id/acesso"
    },
    {
      "id": "account_tracking",
      "name": "account_tracking",
      "description": "Confere que Salvas/Alertas/Vigias s\u00e3o da conta da sess\u00e3o. As listas de um convidado edm_\u2026 passam para a conta em `POST /api/auth/claim`; o POST desta rota responde 410 com o caminho.",
      "endpoint": "GET /api/me/acompanhamento"
    },
    {
      "id": "claim_guest_tracking",
      "name": "claim_guest_tracking",
      "description": "Traz para a conta da sess\u00e3o o que o convidado edm_\u2026 criou (o claim do SDK): as Salvas, Alertas e Vigias que a conta ainda n\u00e3o tem e as compras dele. Exige bootstrap/CSRF deste navegador; a p\u00e1gina faz isso logo depois de entrar. S\u00f3 passa o que o convidado ainda tem, numa transa\u00e7\u00e3o, e o que colide com o que a conta j\u00e1 tem fica com o convidado. O que o convidado comprou passa junto. Token antigo, sem assinatura, que n\u00e3o \u00e9 dono de nada aqui \u00e9 recusado. Repetir n\u00e3o faz mal (move zero).",
      "endpoint": "POST /api/auth/claim"
    }
  ],
  "discovery": {
    "openapi": "https://editalmd.com/openapi.json",
    "llms": "https://editalmd.com/llms.txt",
    "okf": "https://editalmd.com/okf/index.md",
    "numbers": "https://editalmd.com/api/vitrine",
    "partnerships": "https://editalmd.com/api/partners",
    "api_catalog": "https://editalmd.com/.well-known/api-catalog",
    "agent_access": "https://editalmd.com/.well-known/agent-access.json",
    "x402": "https://editalmd.com/.well-known/x402",
    "pricing": "https://editalmd.com/pricing",
    "docs": "https://editalmd.com/docs"
  },
  "updated": "2026-10-16"
}