Koskamo

emissaoja MCP

This MCP server allows AI assistants to issue Brazilian service invoices (NFS-e) via the Emissor Nacional platform without requiring a digital certificate. It enables agents to connect company credentials, manage taxpayers and services, issue and cancel invoices, and query CNPJ data, with explicit user confirmation required for fiscal actions.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

emissaoja MCP logo, by emissaojaVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by emissaoja
MCP endpoint (Streamable HTTP)
https://emissaoja.com.br/mcp
Vendor documentation

What you can do with it

  • Issue NFS-e service invoices via natural language
  • Connect company credentials using CNPJ and portal password
  • List, create, and cancel service invoices
  • Query CNPJ data from the Federal Revenue

Source and maintenance

Vendor evidenceRegistry 0.1.0

Protocol and capabilities

Server
emissaoja 0.1.0
MCP protocol
2025-06-18
Tools
16 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Emissão de Nota Fiscal de Serviço (NFS-e) no Emissor Nacional para MEI e empresas do Simples Nacional, com CNPJ e senha do portal, sem certificado digital. Comece por minha_empresa. Emitir e cancelar têm efeito fiscal real: confirme com a pessoa tomador, valor, descrição e motivo antes de chamar emitir_nota ou cancelar_nota, e passe sempre uma referencia única por nota. status e validar_cnpj funcionam sem conta; as demais ferramentas usam a chave de API da conta.

Tools

16 advertised

status — Status do serviço
Advertised by the server during the last successful anonymous check.
Advertised read-only

Diz se o emissaoja está no ar e como está o motor fiscal. Sem chave.

status input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
status annotations
{
  "title": "Status do serviço",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
validar_cnpj — Validar CNPJ
Advertised by the server during the last successful anonymous check.
Advertised read-only

Confere formato e dígitos verificadores de um CNPJ, sem consultar nada. Sem chave.

validar_cnpj input schema
{
  "type": "object",
  "required": [
    "cnpj"
  ],
  "properties": {
    "cnpj": {
      "type": "string",
      "maxLength": 32,
      "minLength": 1,
      "description": "CNPJ com ou sem pontuação"
    }
  },
  "additionalProperties": false
}
validar_cnpj annotations
{
  "title": "Validar CNPJ",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
consultar_cnpj — Consultar CNPJ na Receita
Advertised by the server during the last successful anonymous check.
Advertised read-only

Dados cadastrais de um CNPJ na Receita Federal (razão social, situação, CNAEs, endereço, Simples/MEI, sócios com CPF mascarado). Não cria tomador; para emitir para esse CNPJ use criar_tomador.

consultar_cnpj input schema
{
  "type": "object",
  "required": [
    "cnpj"
  ],
  "properties": {
    "cnpj": {
      "type": "string",
      "maxLength": 32,
      "minLength": 1,
      "description": "CNPJ com ou sem pontuação"
    }
  },
  "additionalProperties": false
}
consultar_cnpj annotations
{
  "title": "Consultar CNPJ",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
minha_empresa — Minha empresa
Advertised by the server during the last successful anonymous check.
Advertised read-only

A empresa da conta: CNPJ, nome, estado da credencial do Emissor Nacional (ausente, verificando, ativa, congelada), estado do onboarding (configurando, perguntas, pronto…), importação e avisos. Comece por aqui: se a credencial está ausente, a pessoa precisa conectar a empresa (configurar_credencial); se há perguntas, responda-as com responder_perguntas_fiscais.

minha_empresa input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
minha_empresa annotations
{
  "title": "Minha empresa",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
configurar_credencial — Conectar a empresa (CNPJ e senha do Emissor Nacional)
Advertised by the server during the last successful anonymous check.
Open-world

Conecta a empresa da conta ao Emissor Nacional com o CNPJ e a senha do portal (não é a conta gov.br). A senha é conferida no portal, nunca guardada nem devolvida. Depois o emissaoja lê o cadastro fiscal e traz as notas dos últimos 90 dias. Só use quando a pessoa pedir e informar a senha ela mesma; são no máximo 3 tentativas erradas por dia (regra do portal, para não bloquear a conta da empresa). Responde na hora com a tentativa; acompanhe com situacao_credencial até proximo_passo sair de "aguardar".

configurar_credencial input schema
{
  "type": "object",
  "required": [
    "cnpj",
    "senha"
  ],
  "properties": {
    "cnpj": {
      "type": "string",
      "maxLength": 32,
      "minLength": 1,
      "description": "CNPJ da empresa"
    },
    "senha": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "description": "Senha do Emissor Nacional (nfse.gov.br), informada pela pessoa"
    },
    "ciente_ultima_tentativa": {
      "type": "boolean",
      "default": false,
      "description": "true quando a pessoa confirma que é a última tentativa do dia (situacao_credencial avisa)"
    }
  },
  "additionalProperties": false
}
configurar_credencial annotations
{
  "title": "Conectar a empresa",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
situacao_credencial — Situação da credencial
Advertised by the server during the last successful anonymous check.
Advertised read-only

Estado da credencial e da última tentativa de conexão: estado (verificando, aceita, senha_recusada, portal_indisponivel, bloqueada…) e proximo_passo (aguardar, configurando, pronto, corrigir_senha, tentar_mais_tarde, redefinir_no_portal, suporte). Consulte a cada poucos segundos enquanto for "aguardar".

situacao_credencial input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
situacao_credencial annotations
{
  "title": "Situação da credencial",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
perguntas_fiscais — Perguntas fiscais pendentes
Advertised by the server during the last successful anonymous check.
Advertised read-only

Estágios do onboarding, perguntas que o cadastro fiscal não responde sozinho (alíquota do Simples, regime de apuração) e bloqueios. Responda com responder_perguntas_fiscais.

perguntas_fiscais input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
perguntas_fiscais annotations
{
  "title": "Perguntas fiscais",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
responder_perguntas_fiscais — Responder as perguntas fiscais
Advertised by the server during the last successful anonymous check.
Open-world

Grava a alíquota do Simples Nacional (percentual da última apuração, 0 < x ≤ 33) e/ou o regime de apuração (1 = competência, 2 = caixa, 3 = outro). Só com valores que a pessoa informou; nunca invente.

responder_perguntas_fiscais input schema
{
  "type": "object",
  "properties": {
    "reg_ap_trib_sn": {
      "enum": [
        1,
        2,
        3
      ],
      "type": "integer"
    },
    "aliquota_simples": {
      "type": "number",
      "description": "Percentual, ex.: 6 ou 4.5"
    }
  },
  "additionalProperties": false
}
responder_perguntas_fiscais annotations
{
  "title": "Responder perguntas fiscais",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
listar_tomadores — Listar tomadores (clientes)
Advertised by the server during the last successful anonymous check.
Advertised read-only

Lista os tomadores (clientes) da empresa, com busca por nome ou documento. Cada um tem tipo (pj/pf), id, nome e documento; o par tipo + id é o que emitir_nota usa.

listar_tomadores input schema
{
  "type": "object",
  "properties": {
    "busca": {
      "type": "string",
      "maxLength": 100,
      "description": "Parte do nome ou do documento"
    },
    "pagina": {
      "type": "integer",
      "default": 1,
      "maximum": 10000,
      "minimum": 1
    }
  },
  "additionalProperties": false
}
listar_tomadores annotations
{
  "title": "Listar tomadores",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
criar_tomador — Criar tomador (cliente)
Advertised by the server during the last successful anonymous check.
Open-world

Cadastra um cliente pelo CNPJ (nome e endereço vêm da Receita) ou pelo CPF com o nome completo. Se já existir, devolve o existente (ja_existia). Devolve tipo + id para emitir_nota.

criar_tomador input schema
{
  "type": "object",
  "required": [
    "documento"
  ],
  "properties": {
    "nome": {
      "type": "string",
      "maxLength": 150,
      "description": "Nome completo (obrigatório para CPF)"
    },
    "documento": {
      "type": "string",
      "maxLength": 32,
      "minLength": 1,
      "description": "CNPJ ou CPF, com ou sem pontuação"
    }
  },
  "additionalProperties": false
}
criar_tomador annotations
{
  "title": "Criar tomador",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
listar_servicos — Listar serviços
Advertised by the server during the last successful anonymous check.
Advertised read-only

Serviços cadastrados da empresa (descrição, código nacional de tributação, ISS, principal). emitir_nota usa o principal quando servico_id não é informado.

listar_servicos input schema
{
  "type": "object",
  "properties": {
    "ativos": {
      "enum": [
        "1",
        "0",
        "todos"
      ],
      "type": "string",
      "default": "1"
    }
  },
  "additionalProperties": false
}
listar_servicos annotations
{
  "title": "Listar serviços",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
emitir_nota — Emitir NFS-e
Advertised by the server during the last successful anonymous check.
Open-world

Emite uma nota fiscal de serviço no Emissor Nacional para um tomador já cadastrado (use listar_tomadores ou criar_tomador antes). Faz a prévia e, sem bloqueio, pede a emissão: responde com o pedido (acompanhe com acompanhar_pedido até autorizada, recusada ou incerta). Com bloqueio, devolve o que falta (bloqueios com code, mensagem e acao) em vez de emitir. Passe sempre uma referencia única por nota que a pessoa quer emitir (ex.: "pedido-123"): repetir a mesma referencia devolve o mesmo pedido e nunca emite duas vezes. Confirme com a pessoa tomador, valor e descrição antes de chamar; a nota tem efeito fiscal real.

emitir_nota input schema
{
  "type": "object",
  "required": [
    "tomador_tipo",
    "tomador_id",
    "valor"
  ],
  "properties": {
    "valor": {
      "type": "number",
      "description": "Valor do serviço em reais, até 2 casas",
      "exclusiveMinimum": 0
    },
    "descricao": {
      "type": "string",
      "maxLength": 2000,
      "description": "Discriminação do serviço na nota (omitida: a do serviço)"
    },
    "referencia": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_-]+$",
      "maxLength": 64,
      "minLength": 8,
      "description": "Identificador único desta nota no seu lado (Idempotency-Key)"
    },
    "servico_id": {
      "type": "string",
      "maxLength": 36,
      "minLength": 36,
      "description": "UUID do serviço (omitido: o principal)"
    },
    "tomador_id": {
      "type": "string",
      "maxLength": 36,
      "minLength": 36,
      "description": "UUID"
    },
    "competencia": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "AAAA-MM-DD (omitida: hoje)"
    },
    "tomador_tipo": {
      "enum": [
        "pj",
        "pf"
      ],
      "type": "string",
      "description": "pj (CNPJ) ou pf (CPF)"
    },
    "confirmo_repeticao": {
      "type": "boolean",
      "default": false,
      "description": "Quando a resposta anterior foi emissao_repetida_recente e a pessoa confirmou"
    },
    "permitir_repetida_de": {
      "type": "string",
      "maxLength": 36,
      "minLength": 36,
      "description": "Quando a resposta anterior foi possivel_duplicada e a pessoa confirmou que é outra nota: o pedido_id informado"
    }
  },
  "additionalProperties": false
}
emitir_nota annotations
{
  "title": "Emitir NFS-e",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
acompanhar_pedido — Acompanhar pedido de emissão
Advertised by the server during the last successful anonymous check.
Advertised read-only

Estado de um pedido de emissão: na_fila, emitindo, confirmando, autorizada (com numero e chave_acesso), recusada (com motivo) ou incerta. Consulte de novo depois de proxima_consulta_ms enquanto não for terminal.

acompanhar_pedido input schema
{
  "type": "object",
  "required": [
    "pedido_id"
  ],
  "properties": {
    "pedido_id": {
      "type": "string",
      "maxLength": 36,
      "minLength": 36,
      "description": "UUID"
    }
  },
  "additionalProperties": false
}
acompanhar_pedido annotations
{
  "title": "Acompanhar pedido",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
listar_notas — Listar notas emitidas
Advertised by the server during the last successful anonymous check.
Advertised read-only

Notas emitidas (locais e importadas do portal) com número, situação, data, tomador, valor e o par origem + id que cancelar_nota usa. Filtros por período (mes_atual, mes_anterior, ano_atual, 12_meses), situação (todas, emitidas, canceladas) e busca.

listar_notas input schema
{
  "type": "object",
  "properties": {
    "busca": {
      "type": "string",
      "maxLength": 100,
      "description": "Número da nota ou nome/documento do tomador"
    },
    "limite": {
      "type": "integer",
      "default": 20,
      "maximum": 50,
      "minimum": 1
    },
    "periodo": {
      "enum": [
        "mes_atual",
        "mes_anterior",
        "ano_atual",
        "12_meses"
      ],
      "type": "string",
      "default": "12_meses"
    },
    "situacao": {
      "enum": [
        "todas",
        "emitidas",
        "canceladas"
      ],
      "type": "string",
      "default": "todas"
    }
  },
  "additionalProperties": false
}
listar_notas annotations
{
  "title": "Listar notas",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
cancelar_nota — Cancelar NFS-e
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Cancela uma nota emitida, dentro do prazo do Emissor Nacional. Irreversível: confirme com a pessoa a nota (número, tomador, valor) e o motivo antes. Responde com a operação; acompanhe com acompanhar_operacao (processando → concluida ou falhou).

cancelar_nota input schema
{
  "type": "object",
  "required": [
    "origem",
    "nota_id",
    "motivo"
  ],
  "properties": {
    "motivo": {
      "enum": [
        "1",
        "2"
      ],
      "type": "string",
      "description": "1 = erro na emissão, 2 = serviço não prestado"
    },
    "origem": {
      "enum": [
        "local",
        "importada"
      ],
      "type": "string"
    },
    "nota_id": {
      "type": "string",
      "maxLength": 36,
      "minLength": 36,
      "description": "UUID"
    },
    "justificativa": {
      "type": "string",
      "maxLength": 255,
      "minLength": 15
    }
  },
  "additionalProperties": false
}
cancelar_nota annotations
{
  "title": "Cancelar NFS-e",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
acompanhar_operacao — Acompanhar operação
Advertised by the server during the last successful anonymous check.
Advertised read-only

Estado de uma operação (cancelamento): processando, concluida ou falhou (com o erro).

acompanhar_operacao input schema
{
  "type": "object",
  "required": [
    "operacao_id"
  ],
  "properties": {
    "operacao_id": {
      "type": "string",
      "maxLength": 40,
      "minLength": 10
    }
  },
  "additionalProperties": false
}
acompanhar_operacao annotations
{
  "title": "Acompanhar operação",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1846 ms
95th percentile latency
1846 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1846 ms · metadata changed · 16 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http emissaoja-mcp https://emissaoja.com.br/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add emissaoja-mcp --url https://emissaoja.com.br/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable emissaoja-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "emissaoja-mcp": {
      "url": "https://emissaoja.com.br/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "emissaoja-mcp": {
      "type": "streamableHttp",
      "url": "https://emissaoja.com.br/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start emissaoja-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "emissaoja-mcp": {
      "type": "http",
      "url": "https://emissaoja.com.br/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http emissaoja-mcp https://emissaoja.com.br/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "emissaoja-mcp": {
      "url": "https://emissaoja.com.br/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "emissaoja-mcp": {
      "serverUrl": "https://emissaoja.com.br/mcp"
    }
  }
}

Let your agent find its tools

Find servers like emissaoja MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run emissaoja MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing