@useinvio/nfse-sdk 3.1.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/CHANGELOG.md +176 -0
  2. package/README.en.md +146 -0
  3. package/README.md +76 -576
  4. package/dist/agent.d.ts +46 -1
  5. package/dist/agent.js +320 -4
  6. package/dist/agent.js.map +1 -1
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.js +520 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/cliBin.d.ts +2 -0
  11. package/dist/cliBin.js +6 -0
  12. package/dist/cliBin.js.map +1 -0
  13. package/dist/cliExample.d.ts +6 -0
  14. package/dist/cliExample.js +29 -0
  15. package/dist/cliExample.js.map +1 -0
  16. package/dist/client.d.ts +47 -2
  17. package/dist/client.js +36 -6
  18. package/dist/client.js.map +1 -1
  19. package/dist/config.d.ts +3 -0
  20. package/dist/config.js +8 -0
  21. package/dist/config.js.map +1 -1
  22. package/dist/consultas.d.ts +34 -0
  23. package/dist/consultas.js +61 -0
  24. package/dist/consultas.js.map +1 -0
  25. package/dist/dpsJson.js +1 -41
  26. package/dist/dpsJson.js.map +1 -1
  27. package/dist/emissaoNota.d.ts +8 -3
  28. package/dist/emissaoNota.js +6 -3
  29. package/dist/emissaoNota.js.map +1 -1
  30. package/dist/eventoJson.d.ts +76 -0
  31. package/dist/eventoJson.js +128 -0
  32. package/dist/eventoJson.js.map +1 -0
  33. package/dist/eventosNfse.d.ts +38 -0
  34. package/dist/eventosNfse.js +73 -0
  35. package/dist/eventosNfse.js.map +1 -0
  36. package/dist/gzipB64.d.ts +5 -0
  37. package/dist/gzipB64.js +12 -0
  38. package/dist/gzipB64.js.map +1 -1
  39. package/dist/index.d.ts +17 -7
  40. package/dist/index.js +9 -4
  41. package/dist/index.js.map +1 -1
  42. package/dist/mcpCli.d.ts +2 -0
  43. package/dist/mcpCli.js +7 -0
  44. package/dist/mcpCli.js.map +1 -0
  45. package/dist/mcpServer.d.ts +49 -0
  46. package/dist/mcpServer.js +159 -0
  47. package/dist/mcpServer.js.map +1 -0
  48. package/dist/nfseXml.d.ts +48 -0
  49. package/dist/nfseXml.js +86 -0
  50. package/dist/nfseXml.js.map +1 -0
  51. package/dist/rejeicoes.d.ts +50 -0
  52. package/dist/rejeicoes.js +62 -0
  53. package/dist/rejeicoes.js.map +1 -0
  54. package/dist/rejeicoesCatalog.d.ts +10 -0
  55. package/dist/rejeicoesCatalog.js +4449 -0
  56. package/dist/rejeicoesCatalog.js.map +1 -0
  57. package/dist/sefinClient.d.ts +100 -6
  58. package/dist/sefinClient.js +211 -19
  59. package/dist/sefinClient.js.map +1 -1
  60. package/dist/signXml.js +9 -1
  61. package/dist/signXml.js.map +1 -1
  62. package/dist/testing.d.ts +80 -0
  63. package/dist/testing.js +285 -0
  64. package/dist/testing.js.map +1 -0
  65. package/dist/xmlBuild.d.ts +11 -0
  66. package/dist/xmlBuild.js +44 -0
  67. package/dist/xmlBuild.js.map +1 -0
  68. package/dist/xmlInspection.d.ts +1 -1
  69. package/dist/xmlInspection.js.map +1 -1
  70. package/dist/xsdValidation.d.ts +7 -0
  71. package/dist/xsdValidation.js +37 -15
  72. package/dist/xsdValidation.js.map +1 -1
  73. package/docs/README.md +47 -0
  74. package/docs/REGRAS_NEGOCIO_EMISSAO.md +8 -8
  75. package/docs/conceitos/como-funciona.md +87 -0
  76. package/docs/guias/adn.md +51 -0
  77. package/docs/guias/agentes-ia.md +111 -0
  78. package/docs/guias/cancelar.md +70 -0
  79. package/docs/guias/certificado.md +88 -0
  80. package/docs/guias/cli.md +68 -0
  81. package/docs/guias/consultar.md +54 -0
  82. package/docs/guias/emitir.md +172 -0
  83. package/docs/guias/recuperar-emissao.md +33 -0
  84. package/docs/guias/rejeicoes.md +70 -0
  85. package/docs/guias/testes.md +79 -0
  86. package/docs/guias/timeouts.md +33 -0
  87. package/docs/referencia/ambientes.md +35 -0
  88. package/docs/referencia/api.md +137 -0
  89. package/docs/referencia/erros.md +55 -0
  90. package/docs/tutoriais/primeira-nfse.md +130 -0
  91. package/examples/README.md +2 -0
  92. package/examples/cancel-nfse.ts +29 -0
  93. package/examples/recover-emission.ts +29 -0
  94. package/llms.txt +97 -92
  95. package/package.json +23 -3
@@ -0,0 +1,128 @@
1
+ import { DEFAULT_AMBIENTE, TP_AMB } from './config.js';
2
+ import { el, nowSaoPauloOffset, onlyDigits, requiredTextEl, textEl } from './xmlBuild.js';
3
+ const NS = 'http://www.sped.fazenda.gov.br/nfse';
4
+ const VERSAO = '1.01';
5
+ const VER_APLIC = 'UseInvio';
6
+ /** Event types the builder supports (pedRegEvento layout v1.01). */
7
+ export const TP_EVENTO = {
8
+ cancelamento: '101101',
9
+ cancelamentoPorSubstituicao: '105102',
10
+ };
11
+ /** Justificativas do cancelamento (TSCodJustCanc). */
12
+ export const MOTIVO_CANCELAMENTO = {
13
+ erroNaEmissao: '1',
14
+ servicoNaoPrestado: '2',
15
+ outros: '9',
16
+ };
17
+ /** Justificativas do cancelamento por substituicao (TSCodJustSubst). */
18
+ export const MOTIVO_SUBSTITUICAO = {
19
+ desenquadramentoSimplesNacional: '01',
20
+ enquadramentoSimplesNacional: '02',
21
+ inclusaoRetroativaImunidadeIsencao: '03',
22
+ exclusaoRetroativaImunidadeIsencao: '04',
23
+ rejeicaoPeloTomadorOuIntermediario: '05',
24
+ outros: '99',
25
+ };
26
+ /** The event input is invalid; raised before signing or any network I/O. */
27
+ export class EventoInvalidoError extends Error {
28
+ field;
29
+ code = 'EVENTO_INVALID';
30
+ constructor(field, message) {
31
+ super(message);
32
+ this.field = field;
33
+ this.name = 'EventoInvalidoError';
34
+ }
35
+ }
36
+ function requireChave(value, field) {
37
+ if (typeof value !== 'string' || !/^\d{50}$/.test(value)) {
38
+ throw new EventoInvalidoError(field, `${field} deve ter exatamente 50 digitos numericos.`);
39
+ }
40
+ return value;
41
+ }
42
+ function requireMotivo(value, field) {
43
+ if (typeof value !== 'string' || value.trim() !== value || value.length < 15 || value.length > 255) {
44
+ throw new EventoInvalidoError(field, `${field} deve ter entre 15 e 255 caracteres, sem espacos nas pontas.`);
45
+ }
46
+ return value;
47
+ }
48
+ function buildAutor(autor) {
49
+ const hasCnpj = autor?.CNPJ != null && autor.CNPJ !== '';
50
+ const hasCpf = autor?.CPF != null && autor.CPF !== '';
51
+ if (hasCnpj === hasCpf) {
52
+ throw new EventoInvalidoError('autor', 'autor deve informar exatamente um de: CNPJ, CPF.');
53
+ }
54
+ if (hasCnpj) {
55
+ const cnpj = onlyDigits(autor.CNPJ);
56
+ if (cnpj.length !== 14)
57
+ throw new EventoInvalidoError('autor.CNPJ', `autor.CNPJ deve ter 14 digitos (recebido ${cnpj.length}).`);
58
+ return textEl('CNPJAutor', cnpj);
59
+ }
60
+ const cpf = onlyDigits(autor.CPF);
61
+ if (cpf.length !== 11)
62
+ throw new EventoInvalidoError('autor.CPF', `autor.CPF deve ter 11 digitos (recebido ${cpf.length}).`);
63
+ return textEl('CPFAutor', cpf);
64
+ }
65
+ /**
66
+ * Id do pedido de registro de evento (TSIdPedRegEvt):
67
+ * "PRE" + chave de acesso (50) + tipo do evento (6) = PRE[0-9]{56}.
68
+ */
69
+ export function buildPedRegEventoId(chaveAcesso, tpEvento) {
70
+ const chave = requireChave(chaveAcesso, 'chaveAcesso');
71
+ if (!/^\d{6}$/.test(String(tpEvento))) {
72
+ throw new EventoInvalidoError('tpEvento', 'tpEvento deve ter 6 digitos (ex.: 101101).');
73
+ }
74
+ return `PRE${chave}${tpEvento}`;
75
+ }
76
+ function buildPedRegEvento(base, tpEvento, eventoXml) {
77
+ const ambiente = base.ambiente ?? DEFAULT_AMBIENTE;
78
+ if (!(ambiente in TP_AMB))
79
+ throw new EventoInvalidoError('ambiente', 'ambiente deve ser "restrita" ou "producao".');
80
+ const chave = requireChave(base.chaveAcesso, 'chaveAcesso');
81
+ const id = buildPedRegEventoId(chave, tpEvento);
82
+ const infPedReg = el('infPedReg', [
83
+ requiredTextEl('tpAmb', TP_AMB[ambiente]),
84
+ requiredTextEl('verAplic', base.verAplic ?? VER_APLIC),
85
+ requiredTextEl('dhEvento', base.dhEvento ?? nowSaoPauloOffset()),
86
+ buildAutor(base.autor),
87
+ requiredTextEl('chNFSe', chave),
88
+ eventoXml,
89
+ ].join(''), { Id: id });
90
+ return {
91
+ id,
92
+ xml: el('pedRegEvento', infPedReg, { versao: VERSAO, xmlns: NS }),
93
+ tpEvento,
94
+ chaveAcesso: chave,
95
+ ambiente,
96
+ };
97
+ }
98
+ /** Monta o pedido de registro do evento e101101 (Cancelamento de NFS-e). Nao assina. */
99
+ export function buildCancelamentoFromJson(input) {
100
+ if (!Object.values(MOTIVO_CANCELAMENTO).includes(input.cMotivo)) {
101
+ throw new EventoInvalidoError('cMotivo', 'cMotivo do cancelamento deve ser 1 (Erro na Emissao), 2 (Servico nao Prestado) ou 9 (Outros).');
102
+ }
103
+ const evento = el('e101101', [
104
+ requiredTextEl('xDesc', 'Cancelamento de NFS-e'),
105
+ requiredTextEl('cMotivo', input.cMotivo),
106
+ requiredTextEl('xMotivo', requireMotivo(input.xMotivo, 'xMotivo')),
107
+ ].join(''));
108
+ return buildPedRegEvento(input, TP_EVENTO.cancelamento, evento);
109
+ }
110
+ /** Monta o pedido de registro do evento e105102 (Cancelamento de NFS-e por Substituicao). Nao assina. */
111
+ export function buildCancelamentoPorSubstituicaoFromJson(input) {
112
+ if (!Object.values(MOTIVO_SUBSTITUICAO).includes(input.cMotivo)) {
113
+ throw new EventoInvalidoError('cMotivo', 'cMotivo do cancelamento por substituicao deve ser 01, 02, 03, 04, 05 ou 99.');
114
+ }
115
+ const chave = requireChave(input.chaveAcesso, 'chaveAcesso');
116
+ const substituta = requireChave(input.chaveSubstituta, 'chaveSubstituta');
117
+ if (substituta === chave) {
118
+ throw new EventoInvalidoError('chaveSubstituta', 'chaveSubstituta deve ser diferente da chave da NFS-e cancelada.');
119
+ }
120
+ const evento = el('e105102', [
121
+ requiredTextEl('xDesc', 'Cancelamento de NFS-e por Substituição'),
122
+ requiredTextEl('cMotivo', input.cMotivo),
123
+ input.xMotivo != null ? textEl('xMotivo', requireMotivo(input.xMotivo, 'xMotivo')) : '',
124
+ requiredTextEl('chSubstituta', substituta),
125
+ ].join(''));
126
+ return buildPedRegEvento(input, TP_EVENTO.cancelamentoPorSubstituicao, evento);
127
+ }
128
+ //# sourceMappingURL=eventoJson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventoJson.js","sourceRoot":"","sources":["../eventoJson.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type CertificateInput } from './certificate.js';
2
+ import type { AutorEvento, BuiltPedRegEvento, CancelamentoNfseInput, CancelamentoPorSubstituicaoInput } from './eventoJson.js';
3
+ import type { SefinErro, SefinRequestOptions } from './sefinClient.js';
4
+ /** Event request options. Events are POSTs and are never retried automatically. */
5
+ export type RegistrarEventoOptions = Omit<SefinRequestOptions, 'retries'>;
6
+ export interface ResultadoEvento {
7
+ pedRegEventoId: string;
8
+ tpEvento: string;
9
+ chaveAcesso: string;
10
+ /** Signed pedRegEvento that was sent. Persist it with the result. */
11
+ pedRegEventoXml: string;
12
+ /** XML do evento registrado, quando devolvido pela SEFIN. */
13
+ eventoXml?: string;
14
+ status: number;
15
+ body: any;
16
+ }
17
+ export declare class RegistrarEventoError extends Error {
18
+ readonly status: number;
19
+ readonly erros: SefinErro[];
20
+ readonly pedRegEventoId: string;
21
+ readonly body: any;
22
+ constructor(message: string, status: number, erros: SefinErro[], pedRegEventoId: string, body: any);
23
+ }
24
+ /** Input for the high-level helpers: `autor` defaults to the certificate holder's CNPJ/CPF. */
25
+ export type ComAutorOpcional<T extends {
26
+ autor: AutorEvento;
27
+ }> = Omit<T, 'autor'> & {
28
+ autor?: AutorEvento;
29
+ };
30
+ /**
31
+ * Validates the pedRegEvento against the official XSD, signs `infPedReg`,
32
+ * compresses and sends it to POST /nfse/{chave}/eventos, normalizing rejections.
33
+ */
34
+ export declare function registrarEvento(built: BuiltPedRegEvento, certificate: CertificateInput, options?: RegistrarEventoOptions): Promise<ResultadoEvento>;
35
+ /** Cancela uma NFS-e (evento e101101): monta, valida, assina, compacta e envia o pedido. */
36
+ export declare function cancelarNfse(input: ComAutorOpcional<CancelamentoNfseInput>, certificate: CertificateInput, options?: RegistrarEventoOptions): Promise<ResultadoEvento>;
37
+ /** Cancela uma NFS-e por substituicao (evento e105102). A NFS-e substituta deve ter sido emitida antes. */
38
+ export declare function cancelarNfsePorSubstituicao(input: ComAutorOpcional<CancelamentoPorSubstituicaoInput>, certificate: CertificateInput, options?: RegistrarEventoOptions): Promise<ResultadoEvento>;
@@ -0,0 +1,73 @@
1
+ import { assertCertificateValidity } from './certificateValidation.js';
2
+ import { NfseCertificate } from './certificate.js';
3
+ import { buildCancelamentoFromJson, buildCancelamentoPorSubstituicaoFromJson, EventoInvalidoError, } from './eventoJson.js';
4
+ import { gunzipBase64Flexivel, gzipBase64 } from './gzipB64.js';
5
+ import { enviarEvento, extrairErros } from './sefinClient.js';
6
+ import { signEnveloped } from './signXml.js';
7
+ import { validatePedRegEventoXmlAgainstXsd } from './xsdValidation.js';
8
+ export class RegistrarEventoError extends Error {
9
+ status;
10
+ erros;
11
+ pedRegEventoId;
12
+ body;
13
+ constructor(message, status, erros, pedRegEventoId, body) {
14
+ super(message);
15
+ this.status = status;
16
+ this.erros = erros;
17
+ this.pedRegEventoId = pedRegEventoId;
18
+ this.body = body;
19
+ this.name = 'RegistrarEventoError';
20
+ }
21
+ }
22
+ function autorDoCertificado(certificate) {
23
+ if (certificate instanceof NfseCertificate) {
24
+ if (certificate.cnpj)
25
+ return { CNPJ: certificate.cnpj };
26
+ if (certificate.cpf)
27
+ return { CPF: certificate.cpf };
28
+ }
29
+ throw new EventoInvalidoError('autor', 'Informe autor.CNPJ ou autor.CPF: o certificado nao expoe o documento do titular.');
30
+ }
31
+ /**
32
+ * Validates the pedRegEvento against the official XSD, signs `infPedReg`,
33
+ * compresses and sends it to POST /nfse/{chave}/eventos, normalizing rejections.
34
+ */
35
+ export async function registrarEvento(built, certificate, options) {
36
+ validatePedRegEventoXmlAgainstXsd(built.xml);
37
+ assertCertificateValidity(certificate);
38
+ const pedRegEventoXml = signEnveloped(built.xml, built.id, 'infPedReg', certificate);
39
+ const { status, body } = await enviarEvento(gzipBase64(pedRegEventoXml), certificate, built.chaveAcesso, built.ambiente, { ...options, retries: 0 });
40
+ if (status >= 200 && status < 300) {
41
+ const eventoB64 = body?.eventoXmlGZipB64 ?? body?.EventoXmlGZipB64;
42
+ let eventoXml;
43
+ if (typeof eventoB64 === 'string' && eventoB64) {
44
+ try {
45
+ eventoXml = gunzipBase64Flexivel(eventoB64);
46
+ }
47
+ catch {
48
+ // Unexpected payload: the raw body stays available to the caller.
49
+ }
50
+ }
51
+ return {
52
+ pedRegEventoId: built.id,
53
+ tpEvento: built.tpEvento,
54
+ chaveAcesso: built.chaveAcesso,
55
+ pedRegEventoXml,
56
+ eventoXml,
57
+ status,
58
+ body,
59
+ };
60
+ }
61
+ throw new RegistrarEventoError(`Registro de evento rejeitado (HTTP ${status})`, status, extrairErros(body), built.id, body);
62
+ }
63
+ /** Cancela uma NFS-e (evento e101101): monta, valida, assina, compacta e envia o pedido. */
64
+ export async function cancelarNfse(input, certificate, options) {
65
+ const built = buildCancelamentoFromJson({ ...input, autor: input.autor ?? autorDoCertificado(certificate) });
66
+ return registrarEvento(built, certificate, options);
67
+ }
68
+ /** Cancela uma NFS-e por substituicao (evento e105102). A NFS-e substituta deve ter sido emitida antes. */
69
+ export async function cancelarNfsePorSubstituicao(input, certificate, options) {
70
+ const built = buildCancelamentoPorSubstituicaoFromJson({ ...input, autor: input.autor ?? autorDoCertificado(certificate) });
71
+ return registrarEvento(built, certificate, options);
72
+ }
73
+ //# sourceMappingURL=eventosNfse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventosNfse.js","sourceRoot":"","sources":["../eventosNfse.ts"],"names":[],"mappings":"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"}
package/dist/gzipB64.d.ts CHANGED
@@ -2,3 +2,8 @@
2
2
  export declare function gzipBase64(xml: string): string;
3
3
  /** Inverso: decodifica Base64 e descompacta GZip (resposta nfseXmlGZipB64). */
4
4
  export declare function gunzipBase64(b64: string): string;
5
+ /**
6
+ * Decodes documents returned by event queries and ADN distribution, which arrive
7
+ * either as Base64(GZip) or as Base64(Base64(GZip)).
8
+ */
9
+ export declare function gunzipBase64Flexivel(b64: string): string;
package/dist/gzipB64.js CHANGED
@@ -10,4 +10,16 @@ export function gzipBase64(xml) {
10
10
  export function gunzipBase64(b64) {
11
11
  return gunzipSync(Buffer.from(b64, 'base64'), { maxOutputLength: MAX_GUNZIP_OUTPUT_BYTES }).toString('utf-8');
12
12
  }
13
+ /**
14
+ * Decodes documents returned by event queries and ADN distribution, which arrive
15
+ * either as Base64(GZip) or as Base64(Base64(GZip)).
16
+ */
17
+ export function gunzipBase64Flexivel(b64) {
18
+ try {
19
+ return gunzipBase64(b64);
20
+ }
21
+ catch {
22
+ return gunzipBase64(Buffer.from(b64, 'base64').toString('utf-8'));
23
+ }
24
+ }
13
25
  //# sourceMappingURL=gzipB64.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gzipB64.js","sourceRoot":"","sources":["../gzipB64.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEjD,+EAA+E;AAC/E,qFAAqF;AACrF,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjD,gFAAgF;AAChF,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAChE,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,eAAe,EAAE,uBAAuB,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAChH,CAAC"}
1
+ {"version":3,"file":"gzipB64.js","sourceRoot":"","sources":["../gzipB64.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEjD,+EAA+E;AAC/E,qFAAqF;AACrF,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjD,gFAAgF;AAChF,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAChE,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,eAAe,EAAE,uBAAuB,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAChH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACpE,CAAC;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -4,10 +4,10 @@
4
4
  * Handles the protocol layer only: mTLS, signing, gzip/base64, send, consult, events.
5
5
  * No database, no tenants, no business rules.
6
6
  */
7
- export { SEFIN_BASE_URL, TP_AMB, DEFAULT_AMBIENTE, resolveSefinBaseUrl } from './config.js';
7
+ export { ADN_BASE_URL, SEFIN_BASE_URL, TP_AMB, DEFAULT_AMBIENTE, resolveAdnBaseUrl, resolveSefinBaseUrl } from './config.js';
8
8
  export type { Ambiente } from './config.js';
9
- export { ChaveAcessoInvalidaError, consultarNfse, createSefinLatencyTracker, enviarEvento, extrairErros, getSefinRequestObserver, isSefinLatencyMetricsEnabled, SEFIN_LATENCY_METRICS_ENV, setSefinRequestObserver, } from './sefinClient.js';
10
- export type { SefinErro, SefinLatencySeriesSnapshot, SefinLatencySnapshot, SefinLatencyTracker, SefinLatencyTrackerOptions, SefinOperation, SefinRequestMetric, SefinRequestObserver, SefinResposta, } from './sefinClient.js';
9
+ export { assertChaveAcesso, assertDpsId, baixarDanfse, ChaveAcessoInvalidaError, consultarAliquota, consultarBeneficio, consultarConvenio, consultarDps, consultarEvento, consultarEventosPorChaveAdn, consultarHistoricoAliquotas, consultarNfse, consultarRegimesEspeciais, consultarRetencoes, createSefinLatencyTracker, distribuirDfePorNsu, enviarEvento, SefinParametroInvalidoError, transmitirDpsCompactada, extrairErros, getSefinRequestObserver, isSefinLatencyMetricsEnabled, SEFIN_LATENCY_METRICS_ENV, setSefinRequestObserver, } from './sefinClient.js';
10
+ export type { ConsultarEventoOptions, DanfseResposta, DistribuicaoNsuOptions, SefinErro, SefinRequestOptions, SefinLatencySeriesSnapshot, SefinLatencySnapshot, SefinLatencyTracker, SefinLatencyTrackerOptions, SefinOperation, SefinRequestMetric, SefinRequestObserver, SefinResposta, } from './sefinClient.js';
11
11
  export { buildDpsFromJson, buildDpsId } from './dpsJson.js';
12
12
  export type { BuiltDps, ComExt, DpsJsonInput, DpsJsonRequest, EventoServico, Intermediario, Obra, PrestadorProfile, ServicoProfile, Tomador, TotTrib, TribFed, TribMun, TribNac, Valores, } from './dpsJson.js';
13
13
  export { DPS_JSON_REQUEST_SCHEMA } from './dpsJsonSchema.js';
@@ -15,12 +15,22 @@ export type { JsonSchema } from './dpsJsonSchema.js';
15
15
  export { DPS_SCHEMA_VERSION, DpsFiscalValidationError, assertValidDpsJsonRequest, validateDpsJsonRequest, validationIssueFromMessage, } from './fiscalValidation.js';
16
16
  export type { DpsValidationIssue, DpsValidationReport, ValidationSeverity, ValidationSource, } from './fiscalValidation.js';
17
17
  export { EmitirNotaError, emitirNfse, prepararNota, transmitirNotaPreparada } from './emissaoNota.js';
18
- export type { EmitirNotaOptions, NotaInput, NotaPreparada, ResultadoEmissaoNota } from './emissaoNota.js';
18
+ export type { EmitirNotaOptions, NotaInput, NotaPreparada, ResultadoEmissaoNota, TransmissaoOptions } from './emissaoNota.js';
19
+ export { ConsultaNfseError, decodificarRespostaNfse, obterNfse, recuperarNfsePorDps } from './consultas.js';
20
+ export type { NfseConsultada } from './consultas.js';
21
+ export { lerNfse } from './nfseXml.js';
22
+ export { buscarRejeicao, explicarErros, explicarRejeicao, listarRejeicoes, REJEICOES_FONTES } from './rejeicoes.js';
23
+ export type { ExplicacaoRejeicao, RejeicaoOficial } from './rejeicoes.js';
24
+ export type { NfsePessoaResumo, NfseResumo } from './nfseXml.js';
25
+ export { buildCancelamentoFromJson, buildCancelamentoPorSubstituicaoFromJson, buildPedRegEventoId, EventoInvalidoError, MOTIVO_CANCELAMENTO, MOTIVO_SUBSTITUICAO, TP_EVENTO, } from './eventoJson.js';
26
+ export type { AutorEvento, BuiltPedRegEvento, CancelamentoNfseInput, CancelamentoPorSubstituicaoInput, MotivoCancelamento, MotivoSubstituicao, PedRegEventoBase, TpEvento, } from './eventoJson.js';
27
+ export { cancelarNfse, cancelarNfsePorSubstituicao, registrarEvento, RegistrarEventoError } from './eventosNfse.js';
28
+ export type { ComAutorOpcional, RegistrarEventoOptions, ResultadoEvento } from './eventosNfse.js';
19
29
  export { NfseClient } from './client.js';
20
- export type { CreateInvoiceInput, GetInvoiceOptions, InvoiceResource, NfseCertificateInput, NfseClientDpsDefaults, NfseClientOptions, NfseEnvironment, } from './client.js';
21
- export { gzipBase64, gunzipBase64 } from './gzipB64.js';
30
+ export type { CancelBySubstitutionInput, CancelInvoiceInput, CreateInvoiceInput, DistributionResource, EventResource, GetInvoiceOptions, InvoiceResource, MunicipalParametersResource, NfseCertificateInput, NfseClientDpsDefaults, NfseClientOptions, NfseEnvironment, } from './client.js';
31
+ export { gzipBase64, gunzipBase64, gunzipBase64Flexivel } from './gzipB64.js';
22
32
  export { signDps, signEnveloped, verifyDps, withUtf8XmlDeclaration } from './signXml.js';
23
- export { DpsXsdValidationError, XmllintUnavailableError, XsdEngineUnavailableError, validateDpsXmlAgainstXsd } from './xsdValidation.js';
33
+ export { DpsXsdValidationError, PedRegEventoXsdValidationError, validateDpsXmlAgainstXsd, validatePedRegEventoXmlAgainstXsd, XmllintUnavailableError, XsdEngineUnavailableError, } from './xsdValidation.js';
24
34
  export { loadPfxFromBuffer, loadPfx } from './loadPfx.js';
25
35
  export type { PfxMaterial } from './loadPfx.js';
26
36
  export { assertCertificateValidity, assertCertificateForProvider, CertificateValidationError } from './certificateValidation.js';
package/dist/index.js CHANGED
@@ -4,16 +4,21 @@
4
4
  * Handles the protocol layer only: mTLS, signing, gzip/base64, send, consult, events.
5
5
  * No database, no tenants, no business rules.
6
6
  */
7
- export { SEFIN_BASE_URL, TP_AMB, DEFAULT_AMBIENTE, resolveSefinBaseUrl } from './config.js';
8
- export { ChaveAcessoInvalidaError, consultarNfse, createSefinLatencyTracker, enviarEvento, extrairErros, getSefinRequestObserver, isSefinLatencyMetricsEnabled, SEFIN_LATENCY_METRICS_ENV, setSefinRequestObserver, } from './sefinClient.js';
7
+ export { ADN_BASE_URL, SEFIN_BASE_URL, TP_AMB, DEFAULT_AMBIENTE, resolveAdnBaseUrl, resolveSefinBaseUrl } from './config.js';
8
+ export { assertChaveAcesso, assertDpsId, baixarDanfse, ChaveAcessoInvalidaError, consultarAliquota, consultarBeneficio, consultarConvenio, consultarDps, consultarEvento, consultarEventosPorChaveAdn, consultarHistoricoAliquotas, consultarNfse, consultarRegimesEspeciais, consultarRetencoes, createSefinLatencyTracker, distribuirDfePorNsu, enviarEvento, SefinParametroInvalidoError, transmitirDpsCompactada, extrairErros, getSefinRequestObserver, isSefinLatencyMetricsEnabled, SEFIN_LATENCY_METRICS_ENV, setSefinRequestObserver, } from './sefinClient.js';
9
9
  export { buildDpsFromJson, buildDpsId } from './dpsJson.js';
10
10
  export { DPS_JSON_REQUEST_SCHEMA } from './dpsJsonSchema.js';
11
11
  export { DPS_SCHEMA_VERSION, DpsFiscalValidationError, assertValidDpsJsonRequest, validateDpsJsonRequest, validationIssueFromMessage, } from './fiscalValidation.js';
12
12
  export { EmitirNotaError, emitirNfse, prepararNota, transmitirNotaPreparada } from './emissaoNota.js';
13
+ export { ConsultaNfseError, decodificarRespostaNfse, obterNfse, recuperarNfsePorDps } from './consultas.js';
14
+ export { lerNfse } from './nfseXml.js';
15
+ export { buscarRejeicao, explicarErros, explicarRejeicao, listarRejeicoes, REJEICOES_FONTES } from './rejeicoes.js';
16
+ export { buildCancelamentoFromJson, buildCancelamentoPorSubstituicaoFromJson, buildPedRegEventoId, EventoInvalidoError, MOTIVO_CANCELAMENTO, MOTIVO_SUBSTITUICAO, TP_EVENTO, } from './eventoJson.js';
17
+ export { cancelarNfse, cancelarNfsePorSubstituicao, registrarEvento, RegistrarEventoError } from './eventosNfse.js';
13
18
  export { NfseClient } from './client.js';
14
- export { gzipBase64, gunzipBase64 } from './gzipB64.js';
19
+ export { gzipBase64, gunzipBase64, gunzipBase64Flexivel } from './gzipB64.js';
15
20
  export { signDps, signEnveloped, verifyDps, withUtf8XmlDeclaration } from './signXml.js';
16
- export { DpsXsdValidationError, XmllintUnavailableError, XsdEngineUnavailableError, validateDpsXmlAgainstXsd } from './xsdValidation.js';
21
+ export { DpsXsdValidationError, PedRegEventoXsdValidationError, validateDpsXmlAgainstXsd, validatePedRegEventoXmlAgainstXsd, XmllintUnavailableError, XsdEngineUnavailableError, } from './xsdValidation.js';
17
22
  export { loadPfxFromBuffer, loadPfx } from './loadPfx.js';
18
23
  export { assertCertificateValidity, assertCertificateForProvider, CertificateValidationError } from './certificateValidation.js';
19
24
  export { NfseCertificate, NFSE_CERT_ENV } from './certificate.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAG5F,OAAO,EACL,wBAAwB,EACxB,aAAa,EACb,yBAAyB,EACzB,YAAY,EACZ,YAAY,EACZ,uBAAuB,EACvB,4BAA4B,EAC5B,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAa1B,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAmB5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAQ/B,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAGtG,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAWzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEzF,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAEzI,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG1D,OAAO,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAGjI,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAG7H,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,2BAA2B,EAC3B,2BAA2B,EAC3B,aAAa,EACb,yBAAyB,EACzB,kBAAkB,EAClB,yBAAyB,EACzB,mBAAmB,EACnB,YAAY,EACZ,2BAA2B,EAC3B,uBAAuB,EACvB,YAAY,EACZ,uBAAuB,EACvB,4BAA4B,EAC5B,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAiB1B,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAmB5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAQ/B,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAGtG,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE5G,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIpH,OAAO,EACL,yBAAyB,EACzB,wCAAwC,EACxC,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,SAAS,GACV,MAAM,iBAAiB,CAAC;AAWzB,OAAO,EAAE,YAAY,EAAE,2BAA2B,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGpH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAgBzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAE9E,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEzF,OAAO,EACL,qBAAqB,EACrB,8BAA8B,EAC9B,wBAAwB,EACxB,iCAAiC,EACjC,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG1D,OAAO,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAGjI,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/mcpCli.js ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import { runNfseMcpStdio } from './mcpServer.js';
3
+ runNfseMcpStdio().catch((error) => {
4
+ process.stderr.write(`[nfse-mcp] ${error instanceof Error ? error.message : String(error)}\n`);
5
+ process.exit(1);
6
+ });
7
+ //# sourceMappingURL=mcpCli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpCli.js","sourceRoot":"","sources":["../mcpCli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { type NfseAgentContext, type NfseAgentTool } from './agent.js';
2
+ import { type CertificateInput } from './certificate.js';
3
+ import type { Ambiente } from './config.js';
4
+ export declare const NFSE_MCP_ENV: {
5
+ readonly ambiente: "NFSE_AMBIENTE";
6
+ readonly allowWrite: "NFSE_MCP_ALLOW_WRITE";
7
+ readonly mock: "NFSE_MCP_MOCK";
8
+ };
9
+ export interface NfseMcpServerOptions {
10
+ certificate?: CertificateInput;
11
+ ambiente?: Ambiente;
12
+ allowWrite?: boolean;
13
+ /** Written to stderr by the stdio runner; defaults to no logging. */
14
+ log?: (message: string) => void;
15
+ }
16
+ interface JsonRpcRequest {
17
+ jsonrpc: '2.0';
18
+ id?: string | number | null;
19
+ method: string;
20
+ params?: Record<string, any>;
21
+ }
22
+ type JsonRpcResponse = {
23
+ jsonrpc: '2.0';
24
+ id: string | number | null;
25
+ result: unknown;
26
+ } | {
27
+ jsonrpc: '2.0';
28
+ id: string | number | null;
29
+ error: {
30
+ code: number;
31
+ message: string;
32
+ };
33
+ };
34
+ /**
35
+ * Transport-independent MCP server. `handle` takes one parsed JSON-RPC message
36
+ * and returns the response, or `undefined` for notifications.
37
+ */
38
+ export declare function createNfseMcpServer(options?: NfseMcpServerOptions): {
39
+ handle: (message: JsonRpcRequest) => Promise<JsonRpcResponse | undefined>;
40
+ tools: readonly NfseAgentTool<any, any>[];
41
+ context: NfseAgentContext;
42
+ };
43
+ /** Reads server options from environment variables; see the module comment. */
44
+ export declare function nfseMcpOptionsFromEnv(env?: NodeJS.ProcessEnv): Promise<NfseMcpServerOptions & {
45
+ mock: boolean;
46
+ }>;
47
+ /** Runs the server on stdin/stdout until stdin closes. Logs go to stderr only. */
48
+ export declare function runNfseMcpStdio(options?: NfseMcpServerOptions): Promise<void>;
49
+ export {};
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Model Context Protocol server for the NFS-e Nacional, over stdio.
3
+ *
4
+ * A tools-only MCP server needs nothing beyond JSON-RPC 2.0 over newline-delimited
5
+ * stdin/stdout, so this module has no dependencies besides the SDK itself.
6
+ * Run it with `npx -y @useinvio/nfse-mcp` (or `npx -y -p @useinvio/nfse-sdk nfse-mcp`).
7
+ *
8
+ * Configuration comes from the host environment, never from the model:
9
+ * NFSE_CERT_PATH / NFSE_CERT_BASE64 + NFSE_CERT_PASSWORD / NFSE_CERT_PASSWORD_FILE
10
+ * NFSE_AMBIENTE=restrita|producao (default: restrita)
11
+ * NFSE_MCP_ALLOW_WRITE=1 (enables prepare/confirm emission and cancellation)
12
+ * NFSE_MCP_MOCK=1 (in-process mock SEFIN and a test certificate; no real calls)
13
+ */
14
+ import { createInterface } from 'node:readline';
15
+ import { createNfseAgentToolkit } from './agent.js';
16
+ import { NfseCertificate } from './certificate.js';
17
+ export const NFSE_MCP_ENV = {
18
+ ambiente: 'NFSE_AMBIENTE',
19
+ allowWrite: 'NFSE_MCP_ALLOW_WRITE',
20
+ mock: 'NFSE_MCP_MOCK',
21
+ };
22
+ const SUPPORTED_PROTOCOL_VERSIONS = ['2025-11-25', '2025-06-18', '2025-03-26', '2024-11-05'];
23
+ const SERVER_INFO = { name: 'nfse-nacional', title: 'NFS-e Nacional (SEFIN)', version: '0.1.0' };
24
+ const INSTRUCTIONS = [
25
+ 'Ferramentas para a NFS-e Nacional (SEFIN). O ambiente e o certificado sao definidos pelo host.',
26
+ 'Antes de emitir, use validate_dps ate valid=true. Nao invente codigos fiscais (cTribNac, regime, tributacao): pergunte ao usuario.',
27
+ 'Emissao e cancelamento tem duas etapas: prepare_* devolve um resumo; mostre-o e so chame confirm_* apos aprovacao explicita do usuario.',
28
+ 'Depois de uma rejeicao, use explain_rejection com os codigos para explicar a regra oficial ao usuario.',
29
+ 'Depois de timeout na emissao, nunca prepare uma nova DPS: repita confirm_nfse_emission ou use recover_nfse_by_dps.',
30
+ ].join('\n');
31
+ function toolDescriptor(tool, protocolVersion) {
32
+ const modern = protocolVersion >= '2025-06-18';
33
+ return {
34
+ name: tool.name,
35
+ ...(modern ? { title: tool.title } : {}),
36
+ description: tool.description,
37
+ inputSchema: tool.inputSchema,
38
+ ...(modern ? { outputSchema: tool.outputSchema } : {}),
39
+ annotations: { title: tool.title, ...tool.annotations },
40
+ };
41
+ }
42
+ /**
43
+ * Transport-independent MCP server. `handle` takes one parsed JSON-RPC message
44
+ * and returns the response, or `undefined` for notifications.
45
+ */
46
+ export function createNfseMcpServer(options = {}) {
47
+ const { tools } = createNfseAgentToolkit({ allowWrite: options.allowWrite });
48
+ const context = { pfx: options.certificate, ambiente: options.ambiente ?? 'restrita' };
49
+ let protocolVersion = SUPPORTED_PROTOCOL_VERSIONS[0];
50
+ async function callTool(params) {
51
+ const tool = tools.find((t) => t.name === params?.name);
52
+ if (!tool) {
53
+ return { content: [{ type: 'text', text: `Ferramenta desconhecida: ${String(params?.name)}` }], isError: true };
54
+ }
55
+ try {
56
+ const output = await tool.run(params?.arguments ?? {}, context);
57
+ const failed = output?.ok === false;
58
+ return {
59
+ content: [{ type: 'text', text: JSON.stringify(output, null, 2) }],
60
+ ...(protocolVersion >= '2025-06-18' ? { structuredContent: output } : {}),
61
+ ...(failed ? { isError: true } : {}),
62
+ };
63
+ }
64
+ catch (error) {
65
+ options.log?.(`tool ${tool.name} failed: ${error instanceof Error ? error.stack ?? error.message : String(error)}`);
66
+ return {
67
+ content: [{ type: 'text', text: `Falha de infraestrutura em ${tool.name}: ${error instanceof Error ? error.message : String(error)}` }],
68
+ isError: true,
69
+ };
70
+ }
71
+ }
72
+ async function handle(message) {
73
+ const isRequest = message.id !== undefined && message.id !== null;
74
+ const reply = (result) => ({ jsonrpc: '2.0', id: message.id ?? null, result });
75
+ const fail = (code, text) => ({ jsonrpc: '2.0', id: message.id ?? null, error: { code, message: text } });
76
+ switch (message.method) {
77
+ case 'initialize': {
78
+ const requested = String(message.params?.protocolVersion ?? '');
79
+ protocolVersion = SUPPORTED_PROTOCOL_VERSIONS.includes(requested) ? requested : SUPPORTED_PROTOCOL_VERSIONS[0];
80
+ return reply({
81
+ protocolVersion,
82
+ capabilities: { tools: { listChanged: false } },
83
+ serverInfo: SERVER_INFO,
84
+ instructions: INSTRUCTIONS,
85
+ });
86
+ }
87
+ case 'ping':
88
+ return reply({});
89
+ case 'tools/list':
90
+ return reply({ tools: tools.map((tool) => toolDescriptor(tool, protocolVersion)) });
91
+ case 'tools/call':
92
+ return reply(await callTool(message.params));
93
+ default:
94
+ if (!isRequest)
95
+ return undefined; // notifications/initialized, notifications/cancelled, ...
96
+ return fail(-32601, `Method not found: ${message.method}`);
97
+ }
98
+ }
99
+ return { handle, tools, context };
100
+ }
101
+ function truthy(value) {
102
+ return ['1', 'true', 'yes', 'on'].includes(String(value ?? '').trim().toLowerCase());
103
+ }
104
+ /** Reads server options from environment variables; see the module comment. */
105
+ export async function nfseMcpOptionsFromEnv(env = process.env) {
106
+ const mock = truthy(env[NFSE_MCP_ENV.mock]);
107
+ const ambiente = (env[NFSE_MCP_ENV.ambiente] ?? 'restrita').trim().toLowerCase();
108
+ if (ambiente !== 'restrita' && ambiente !== 'producao') {
109
+ throw new Error(`${NFSE_MCP_ENV.ambiente} deve ser "restrita" ou "producao" (recebido "${ambiente}").`);
110
+ }
111
+ if (mock && ambiente === 'producao')
112
+ throw new Error(`${NFSE_MCP_ENV.mock}=1 nao pode ser usado com ${NFSE_MCP_ENV.ambiente}=producao.`);
113
+ const hasCertificate = Boolean(env.NFSE_CERT_PATH || env.NFSE_CERT_BASE64);
114
+ let certificate = hasCertificate ? NfseCertificate.fromEnv(env) : undefined;
115
+ if (mock) {
116
+ const { createTestCertificate, installMockSefin } = await import('./testing.js');
117
+ installMockSefin();
118
+ certificate ??= createTestCertificate().certificate;
119
+ }
120
+ return { certificate, ambiente, allowWrite: truthy(env[NFSE_MCP_ENV.allowWrite]), mock };
121
+ }
122
+ /** Runs the server on stdin/stdout until stdin closes. Logs go to stderr only. */
123
+ export async function runNfseMcpStdio(options) {
124
+ const log = (message) => process.stderr.write(`[nfse-mcp] ${message}\n`);
125
+ const resolved = options ?? await nfseMcpOptionsFromEnv();
126
+ const server = createNfseMcpServer({ ...resolved, log });
127
+ const certificate = resolved.certificate instanceof NfseCertificate ? resolved.certificate : undefined;
128
+ log(`ambiente=${resolved.ambiente ?? 'restrita'} escrita=${resolved.allowWrite ? 'habilitada' : 'desabilitada'} `
129
+ + `certificado=${certificate ? `${certificate.cnpj ?? certificate.cpf ?? 'sem documento'} (vence ${certificate.notAfter.toISOString().slice(0, 10)})` : resolved.certificate ? 'legado' : 'ausente'}`
130
+ + `${resolved.mock ? ' mock=SEFIN simulada' : ''}`);
131
+ const write = (response) => process.stdout.write(`${JSON.stringify(response)}\n`);
132
+ const lines = createInterface({ input: process.stdin, crlfDelay: Infinity });
133
+ const inflight = new Set();
134
+ for await (const line of lines) {
135
+ if (!line.trim())
136
+ continue;
137
+ let message;
138
+ try {
139
+ message = JSON.parse(line);
140
+ }
141
+ catch {
142
+ write({ jsonrpc: '2.0', id: null, error: { code: -32700, message: 'Parse error' } });
143
+ continue;
144
+ }
145
+ for (const item of Array.isArray(message) ? message : [message]) {
146
+ if (!item || typeof item.method !== 'string')
147
+ continue; // responses from the client are not expected
148
+ const task = server.handle(item).then((response) => { if (response)
149
+ write(response); }, (error) => {
150
+ log(`request failed: ${error instanceof Error ? error.message : String(error)}`);
151
+ if (item.id !== undefined && item.id !== null)
152
+ write({ jsonrpc: '2.0', id: item.id, error: { code: -32603, message: 'Internal error' } });
153
+ }).finally(() => inflight.delete(task));
154
+ inflight.add(task);
155
+ }
156
+ }
157
+ await Promise.all(inflight);
158
+ }
159
+ //# sourceMappingURL=mcpServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpServer.js","sourceRoot":"","sources":["../mcpServer.ts"],"names":[],"mappings":"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"}