Agentes de IA
O Emitti é desenhado para ser operado por agentes de IA. Como a API é JSON limpa e os erros são traduzidos, um LLM consegue montar o payload e emitir uma nota com confiança — via tool calling ou via um servidor MCP pronto.
/llms.txt na raiz para que agentes descubram esta documentação automaticamente.Tool calling (function calling)
Exponha o Emitti como uma ferramenta para o seu modelo. A definição abaixo segue o formato de tool da API da Anthropic (name, description, input_schema):
{
"name": "emitir_nfse",
"description": "Emite uma Nota Fiscal de Serviço (NFS-e) no Brasil. Use quando o usuário pedir para emitir/gerar uma nota de serviço.",
"input_schema": {
"type": "object",
"properties": {
"prestador": {
"type": "object",
"properties": {
"cnpj": { "type": "string" },
"inscricao_municipal": { "type": "string" }
},
"required": ["cnpj", "inscricao_municipal"]
},
"tomador": {
"type": "object",
"properties": {
"razao_social": { "type": "string" },
"cnpj": { "type": "string" },
"cpf": { "type": "string" }
}
},
"servico": {
"type": "object",
"properties": {
"codigo_municipio": { "type": "string" },
"codigo_servico": { "type": "string" },
"discriminacao": { "type": "string" },
"valor_servicos": { "type": "number" },
"aliquota_iss": { "type": "number" }
},
"required": ["codigo_municipio", "codigo_servico", "discriminacao", "valor_servicos", "aliquota_iss"]
}
},
"required": ["prestador", "tomador", "servico"]
}
}Loop com Claude (Node.js)
O modelo monta o JSON da nota a partir do pedido em linguagem natural; seu código apenas executa o POST /v1/nfse e devolve o resultado:
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
const tools = [/* a definição de emitir_nfse acima */];
let messages = [{
role: "user",
content: "Emita uma NFS-e de R$ 499,90 (assinatura SaaS) do meu CNPJ 12345678000190 / IM 1122334 para o Cliente X (CNPJ 98765432000110), em São Paulo, código de serviço 01.05, ISS 2%.",
}];
while (true) {
const res = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 16000,
tools,
messages,
});
if (res.stop_reason !== "tool_use") { console.log(res.content); break; }
messages.push({ role: "assistant", content: res.content });
const results = [];
for (const block of res.content) {
if (block.type !== "tool_use") continue;
// Claude montou o payload; você só executa a chamada ao Emitti
const r = await fetch("https://api.emitti.com.br/v1/nfse", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.EMITTI_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify(block.input),
});
results.push({ type: "tool_result", tool_use_id: block.id, content: await r.text() });
}
messages.push({ role: "user", content: results });
}claude-opus-4-8). A nota é assíncrona: o 202 traz o emissao_id; confirme o resultado por webhook ou GET /v1/nfse/{id}.MCP (Model Context Protocol)
Para assistentes que falam MCP (Claude Desktop, Claude Code), o Emitti oferece um servidor MCP que expõe as tools emitir_nfse e consultar_nfse. O assistente passa a emitir notas em linguagem natural, sem você escrever o loop de tool calling.
Servidor de referência
Código aberto e pronto para rodar em examples/mcp-emitti (TypeScript, stdio). Build:
cd examples/mcp-emitti
npm install && npm run buildConfigurar no Claude Desktop
No claude_desktop_config.json:
{
"mcpServers": {
"emitti": {
"command": "node",
"args": ["/caminho/para/emitti-mcp/dist/index.js"],
"env": { "EMITTI_API_KEY": "sk_live_..." }
}
}
}Configurar no Claude Code
# Claude Code — adicionar o servidor MCP do Emitti
claude mcp add emitti --env EMITTI_API_KEY=sk_live_... \
-- node /caminho/para/emitti-mcp/dist/index.jsEMITTI_API_KEY), do lado do cliente — nunca no prompt nem no histórico do modelo.Veja também a referência completa da API.