sih-br-mcp 0.15.7 → 0.17.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.
package/README.md CHANGED
@@ -159,7 +159,7 @@ domínio, rate limit, autenticação opcional e medição — desenho e custos e
159
159
 
160
160
  ```bash
161
161
  npm ci && npm run build
162
- npm test # vitest: decisão de rota (puro) + envelope das 12 (caso cheio e caso magro)
162
+ npm test # vitest: decisão de rota (puro) + envelope e outputSchema das 12 (caso cheio e caso magro)
163
163
  npm run smoke:stdio # superfície das ferramentas × baselines/surface-stdio.json
164
164
  npm run smoke:http # mesma superfície e chamadas pelo transporte HTTP (dist/http.js)
165
165
  npm run golden:tools # 12 ferramentas byte a byte × baselines/golden-tools.json (fixture 2023/RR)
@@ -178,10 +178,13 @@ O CI (`.github/workflows/ci.yml`) roda tudo isso em Node 22 e 24. A fixture
178
178
  A divisão de trabalho entre as duas famílias: os scripts em `scripts/*.mjs`
179
179
  pinam VALORES (mudou um número, o baseline acusa); a suíte de `tests/*.test.ts`
180
180
  afirma INVARIANTES (qual cubo responde a pergunta; toda resposta sai com
181
- proveniência e com o texto igual à estrutura), e por isso republicar um cubo
182
- não a move. Cada ferramenta tem ali um caso CHEIO e um caso MAGRO — a resposta
183
- com os campos opcionais ausentes, que o golden, sempre com fixture cheia, não
184
- alcança.
181
+ proveniência, com o texto igual à estrutura e obedecendo ao `outputSchema` que
182
+ o `tools/list` publica — validado com o mesmo validador do SDK), e por isso
183
+ republicar um cubo não a move. Cada ferramenta tem ali um caso CHEIO e um caso
184
+ MAGRO — a resposta com os campos opcionais ausentes, que o golden, sempre com
185
+ fixture cheia, não alcança — e o caminho de erro-mole ("ano sem dado") também
186
+ é validado. Os esquemas de saída estão em `src/output-schemas.ts`, escritos à
187
+ mão a partir das formas medidas, como os de entrada.
185
188
 
186
189
  ## Documentação
187
190
 
@@ -0,0 +1,60 @@
1
+ /**
2
+ * `outputSchema` das doze ferramentas — JSON Schema escrito à mão, servido
3
+ * verbatim (como o `inputSchema` em src/tools.ts; molde do bcb-br-mcp).
4
+ *
5
+ * De onde vêm as formas. NÃO foram inventadas a partir do código: foram MEDIDAS
6
+ * em 16/09/2026 contra o servidor de verdade (`createServer`, transporte em
7
+ * memória, fixture 2023/RR) — os 36 casos do golden, os 27 casos cheio/magro
8
+ * de tests/output-contract.test.ts e mais 38 variantes de `group_by`, filtro,
9
+ * universo e ano ausente, 101 chamadas ao todo — e depois conferidas contra
10
+ * cada handler, porque a fixture não alcança tudo (raça nula em 1998–2007,
11
+ * município nulo em 1992–1997, o `catch` de cada handler). A medição de 14/09
12
+ * (decisão 37 do CONTEXT.md) já dizia o essencial: a forma NÃO varia com
13
+ * `group_by`; varia com o caminho de erro-mole.
14
+ *
15
+ * O que "honesto" quer dizer aqui, e por que importa: cliente que valida (o
16
+ * MCP Inspector valida) rejeita a resposta INTEIRA quando o `structuredContent`
17
+ * não obedece ao esquema anunciado. Um esquema que promete mais do que o
18
+ * servidor cumpre — campo obrigatório que a fonte omite, `number` onde vem
19
+ * `null` — transforma resposta certa em erro no cliente. Por isso:
20
+ *
21
+ * - campo que algum caminho omite é opcional (fora do `required`);
22
+ * - medida que vem NULA em recorte vazio (`get_hospitalizations` sem linha)
23
+ * é `["number", "null"]`;
24
+ * - coluna de agrupamento que a FONTE anula (raça antes de 2008, município
25
+ * antes de 1994, grupo CSAP das internações não sensíveis, `exclusion`) é
26
+ * anulável, mesmo que a fixture de 2023 nunca a mostre nula;
27
+ * - o CAMINHO DE ERRO-MOLE — resposta de sucesso (não `isError`) que carrega
28
+ * `error` em vez dos dados: "ano sem dado" do funil (decisão 38), grupo
29
+ * CSAP inexistente, o `catch` de cada handler, cobertura populacional — é
30
+ * um ramo do `anyOf`, ao lado do caminho feliz. Ramo do caminho feliz exige
31
+ * os campos de dados; ramo de erro-mole exige `error`. Resposta que não
32
+ * cumpre nenhum dos dois reprova — é isso que dá dente ao gate
33
+ * (tests/output-contract.test.ts).
34
+ *
35
+ * Todos os `properties` ficam declarados no topo, com descrição; o `anyOf` só
36
+ * carrega `required`. Cliente que renderiza `properties` vê tudo; validador
37
+ * aplica a exclusividade.
38
+ *
39
+ * Erros de verdade (`isError: true`, sem `structuredContent`) ficam fora: o
40
+ * SDK v2 só exige `structuredContent` em sucesso.
41
+ */
42
+ import type { JsonSchemaType } from "@modelcontextprotocol/server";
43
+ type Schema = Record<string, unknown>;
44
+ /**
45
+ * Projeção `concise` do bloco de proveniência (contrato @sbissoli/mcp-provenance
46
+ * v1.0, `ConciseBlock` em render.ts): a forma que `withProvenance` põe em
47
+ * `structuredContent`. Transcrito do PROVENANCE_BLOCK_SCHEMA do bcb-br-mcp
48
+ * (src/provenance.ts) — o pacote comum publica o esquema canônico em zod, não
49
+ * a projeção concise em JSON Schema, então cada servidor a escreve.
50
+ */
51
+ export declare const PROVENANCE_BLOCK_SCHEMA: Schema;
52
+ /**
53
+ * O `outputSchema` da ferramenta, pronto para o `tools/list`. Recebe o
54
+ * `inputSchema` porque `filters_applied` ecoa os argumentos e é descrito pelas
55
+ * mesmas propriedades. Lança para ferramenta desconhecida: ferramenta nova
56
+ * entra em src/tools.ts e reprova aqui até ganhar o seu esquema.
57
+ */
58
+ export declare function outputSchemaFor(name: string, inputSchema: JsonSchemaType): JsonSchemaType;
59
+ export {};
60
+ //# sourceMappingURL=output-schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-schemas.d.ts","sourceRoot":"","sources":["../src/output-schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAwCtC;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAWrC,CAAC;AAwrBF;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,GAAG,cAAc,CAIzF"}