@sbissoli/mcp-surface 0.2.0 → 0.3.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/CHANGELOG.md CHANGED
@@ -8,6 +8,55 @@ seguinte — cada servidor faz bump explícito).
8
8
  e, pela regra da trava, obrigaria cada servidor a subir de versão sem ter mudado nada.
9
9
  Mudança de normalização é major (ou minor em 0.x), com nota de migração.
10
10
 
11
+ ## [0.3.0] — 2026-10-04
12
+
13
+ A normalização NÃO muda: o sha256 de todo `surface.lock.json` continua o mesmo. Minor
14
+ porque a superfície publicada do pacote cresce (subpath novo); quem quiser o card faz o
15
+ bump explícito para `^0.3.0`.
16
+
17
+ ### Adicionado
18
+
19
+ - **`@sbissoli/mcp-surface/card`** — o `/.well-known/mcp/server-card.json` derivado da
20
+ mesma captura que a trava normaliza. Em 04/10/2026, 4 dos 7 servidores serviam o card
21
+ por um `card.ts` copiado e 3 respondiam 404; os quatro que serviam publicavam
22
+ `name`/`version` soltos na raiz, enquanto a forma documentada pela Smithery exige
23
+ `serverInfo: { name, version }`. `montarCard` / `capturarCard` / `capturarCardPorFetch`
24
+ montam o card com `serverInfo` do `initialize` real; `superficieDoCard` faz a volta, para
25
+ o teste do servidor provar que o card tem o MESMO sha256 da seção `declarada`;
26
+ `autenticacaoDaTrava` deriva `authentication.required` da seção `semToken`;
27
+ `cardEmCache` guarda o primeiro sucesso por isolate. Seguro para Worker, com teste que
28
+ percorre o grafo de imports do subpath.
29
+
30
+ ### Mudado (interno)
31
+
32
+ - A captura crua (`initialize` + as quatro listas) saiu de `superficie.ts` e de
33
+ `memoria.ts` para `captura.ts`, que não importa `node:crypto` nem
34
+ `node:child_process`. `capturarPor` e `capturarSuperficie` passam a normalizar essa
35
+ captura: mesma ordem de pedidos, mesmo `clientInfo`, mesmo resultado. A raiz do pacote
36
+ exporta os mesmos nomes de antes.
37
+
38
+ ## [0.2.1] — 2026-10-04
39
+
40
+ A normalização NÃO muda. Patch: a API de `/cliente` é a mesma; os controles negativos
41
+ ficam mais fortes, e os servidores herdam isso pelo caret `^0.2.0`.
42
+
43
+ ### Corrigido
44
+
45
+ - **A troca de tipo cobria UM campo só.** `quebrasDoSchema` trocava o tipo do primeiro
46
+ obrigatório tipado. No ilo-mcp-server esse campo era um objeto (`dataflow`), e os
47
+ escalares ficavam sem prova, o que obrigou a escrever `rows_count` como quebra extra à
48
+ mão. Agora a troca vale para CADA obrigatório com `type` declarado.
49
+ - **O campo anulável não era trocado.** `type: ["string", "null"]` (lista) não gerava
50
+ quebra, e é justamente a classe do defeito que o circuito existe para pegar. O valor
51
+ errado agora é o primeiro de texto, número, booleano, lista e objeto que nenhum dos tipos
52
+ declarados aceita.
53
+ - **As quebras rodam em paralelo.** Com uma troca por obrigatório, em série,
54
+ `loinc_details` do medical-terminologies-mcp passava dos 5 s do vitest sob a carga da
55
+ suíte. Cada quebra já tinha servidor e conexão próprios. A ordem dos vereditos não muda,
56
+ e a armadilha continua sendo o último.
57
+
58
+ Conferido contra os sete servidores com o build local antes de publicar: todos verdes.
59
+
11
60
  ## [0.2.0] — 2026-10-04
12
61
 
13
62
  A normalização NÃO muda: todo `surface.lock.json` continua conferindo. Minor porque a
package/README.md CHANGED
@@ -94,11 +94,48 @@ for (const v of vs) expect(v.obtido, `${v.descricao}: ${v.mensagem ?? ""}`).toBe
94
94
  isso, o `Client` (2.0 a 2.2) devolve o resultado sem validar.
95
95
  - `controlesNegativos` adultera o resultado entre servidor e cliente, com quebras
96
96
  **derivadas do schema listado**: `structuredContent` ausente, cada obrigatório ausente e
97
- o primeiro obrigatório de tipo errado. Cada quebra tem de fazer a chamada falhar. O
97
+ cada obrigatório com `type` declarado recebendo um valor que nenhum tipo dele aceita (o
98
+ anulável `["string", "null"]` recebe `0`). As quebras rodam em paralelo, cada uma com
99
+ servidor próprio. Cada quebra tem de fazer a chamada falhar. O
98
100
  último veredito é a armadilha (sem `tools/list`, a quebra passa calada); se o SDK mudar,
99
101
  ele acusa. Quebras do próprio servidor, como campo a mais onde o schema fecha o objeto,
100
102
  entram pelo 4º argumento.
101
103
 
104
+ ## Server card (`@sbissoli/mcp-surface/card`)
105
+
106
+ O `/.well-known/mcp/server-card.json` que scanners de diretório (Smithery) leem quando a
107
+ varredura do `/mcp` não completa, **derivado da mesma captura que a trava normaliza**.
108
+ Forma da Smithery: `serverInfo` (do `initialize` real, com a versão), `authentication`,
109
+ `tools`, `resources`, `prompts`, mais `protocolVersion`, `capabilities`, `instructions` e
110
+ `resourceTemplates`. Método não servido fica fora do card (não vira `[]`). Seguro para
111
+ Worker: o grafo do subpath não importa `node:crypto`, `node:child_process`, `node:fs` nem
112
+ o `Client` (há teste que confere).
113
+
114
+ ```ts
115
+ // worker/src/index.ts
116
+ import { autenticacaoDaTrava, capturarCard, cardEmCache } from "@sbissoli/mcp-surface/card";
117
+ import trava from "../../surface.lock.json";
118
+
119
+ const serverCard = cardEmCache(() => capturarCard(buildServer(), { authentication: autenticacaoDaTrava(trava) }));
120
+ // GET /.well-known/mcp/server-card.json → new Response(await serverCard(), { headers: { "Content-Type": "application/json" } })
121
+ ```
122
+
123
+ ```ts
124
+ // teste do servidor: o card não pode divergir da trava
125
+ import { normalizarSuperficie, impressaoDigital, lerTrava } from "@sbissoli/mcp-surface";
126
+ import { capturarCard, superficieDoCard } from "@sbissoli/mcp-surface/card";
127
+
128
+ const card = await capturarCard(buildServer());
129
+ expect(impressaoDigital(normalizarSuperficie(superficieDoCard(card)))).toBe(lerTrava(caminho).declarada?.sha256);
130
+ ```
131
+
132
+ - `autenticacaoDaTrava(trava)` deriva `authentication.required` da seção `semToken`:
133
+ `tools/list` em `apiKeyAusente` / `POST /mcp`. Lança se a medição não está lá.
134
+ - `capturarCardPorFetch(buscar, url)` monta o mesmo card por HTTP stateless (JSON ou SSE),
135
+ para superfície atrás de outro `fetch` (o container do sih). Lança se o `initialize`
136
+ não responde; o fallback é do servidor.
137
+ - `cardEmCache` guarda a primeira montagem que dá certo, por isolate; falha não fica.
138
+
102
139
  ## Observações
103
140
 
104
141
  - Uma atualização do SDK que mexa nas `capabilities` também acende a trava — de propósito:
@@ -0,0 +1,43 @@
1
+ /**
2
+ * A captura CRUA da superfície: `initialize` + as quatro listas, como saem do
3
+ * JSON-RPC, sem normalizar nem tirar hash.
4
+ *
5
+ * Arquivo separado de `superficie.ts` de propósito: aqui não entra
6
+ * `node:crypto` nem `node:child_process`, então o subpath `/card` (que roda
7
+ * dentro do Worker) importa só daqui e de `sonda.ts`. A trava e o card partem
8
+ * desta mesma captura — é o que permite provar que os dois não divergem.
9
+ */
10
+ import { InMemoryTransport } from "@modelcontextprotocol/server";
11
+ /** O protocolo pedido no `initialize` de toda captura — fixo, para o eco não variar. */
12
+ export declare const PROTOCOLO_DA_CAPTURA = "2025-06-18";
13
+ /** Resultados crus, como saem do JSON-RPC. Lista ausente = método não servido. */
14
+ export interface SuperficieBruta {
15
+ initialize: Record<string, unknown> | undefined;
16
+ tools: unknown[] | undefined;
17
+ resources: unknown[] | undefined;
18
+ resourceTemplates: unknown[] | undefined;
19
+ prompts: unknown[] | undefined;
20
+ }
21
+ /** Faz uma requisição JSON-RPC e devolve o `result` (ou `undefined` em erro). */
22
+ export type Pedir = (method: string, params?: Record<string, unknown>) => Promise<Record<string, unknown> | undefined>;
23
+ /** O que a captura precisa de um `McpServer`: só conectar a um transporte. */
24
+ export interface ServidorConectavel {
25
+ connect(transport: InMemoryTransport): Promise<void>;
26
+ }
27
+ /** Os parâmetros do `initialize` de toda captura. */
28
+ export declare function paramsDoInitialize(cliente: string): Record<string, unknown>;
29
+ /**
30
+ * Captura crua por qualquer transporte. `notificar`, quando o transporte tem
31
+ * sessão, manda o `notifications/initialized`.
32
+ */
33
+ export declare function capturarBrutaPor(pedir: Pedir, cliente: string, notificar?: () => void): Promise<SuperficieBruta>;
34
+ /**
35
+ * Captura crua em memória: o servidor montado pela mesma fábrica que os
36
+ * transportes usam, interrogado por JSON-RPC cru sobre o `InMemoryTransport`.
37
+ *
38
+ * JSON-RPC cru, e não o `Client` do SDK: o `Client` compila os `outputSchema`
39
+ * com Ajv (`new Function`), que o runtime da Cloudflare proíbe — o mesmo
40
+ * caminho serve teste em Node e código de Worker.
41
+ */
42
+ export declare function capturarBrutaEmMemoria(server: ServidorConectavel, cliente: string): Promise<SuperficieBruta>;
43
+ //# sourceMappingURL=captura.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captura.d.ts","sourceRoot":"","sources":["../src/captura.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,wFAAwF;AACxF,eAAO,MAAM,oBAAoB,eAAe,CAAC;AAEjD,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAChD,KAAK,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IACjC,iBAAiB,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IACzC,OAAO,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;CAChC;AAED,iFAAiF;AACjF,MAAM,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;AAEvH,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAED,qDAAqD;AACrD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAM3E;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,eAAe,CAAC,CAWtH;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA+BlH"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * A captura CRUA da superfície: `initialize` + as quatro listas, como saem do
3
+ * JSON-RPC, sem normalizar nem tirar hash.
4
+ *
5
+ * Arquivo separado de `superficie.ts` de propósito: aqui não entra
6
+ * `node:crypto` nem `node:child_process`, então o subpath `/card` (que roda
7
+ * dentro do Worker) importa só daqui e de `sonda.ts`. A trava e o card partem
8
+ * desta mesma captura — é o que permite provar que os dois não divergem.
9
+ */
10
+ import { InMemoryTransport } from "@modelcontextprotocol/server";
11
+ /** O protocolo pedido no `initialize` de toda captura — fixo, para o eco não variar. */
12
+ export const PROTOCOLO_DA_CAPTURA = "2025-06-18";
13
+ /** Os parâmetros do `initialize` de toda captura. */
14
+ export function paramsDoInitialize(cliente) {
15
+ return {
16
+ protocolVersion: PROTOCOLO_DA_CAPTURA,
17
+ capabilities: {},
18
+ clientInfo: { name: cliente, version: "1.0.0" },
19
+ };
20
+ }
21
+ /**
22
+ * Captura crua por qualquer transporte. `notificar`, quando o transporte tem
23
+ * sessão, manda o `notifications/initialized`.
24
+ */
25
+ export async function capturarBrutaPor(pedir, cliente, notificar) {
26
+ const initialize = await pedir("initialize", paramsDoInitialize(cliente));
27
+ notificar?.();
28
+ const lista = async (method, chave) => (await pedir(method, {}))?.[chave];
29
+ return {
30
+ initialize,
31
+ tools: await lista("tools/list", "tools"),
32
+ resources: await lista("resources/list", "resources"),
33
+ resourceTemplates: await lista("resources/templates/list", "resourceTemplates"),
34
+ prompts: await lista("prompts/list", "prompts"),
35
+ };
36
+ }
37
+ /**
38
+ * Captura crua em memória: o servidor montado pela mesma fábrica que os
39
+ * transportes usam, interrogado por JSON-RPC cru sobre o `InMemoryTransport`.
40
+ *
41
+ * JSON-RPC cru, e não o `Client` do SDK: o `Client` compila os `outputSchema`
42
+ * com Ajv (`new Function`), que o runtime da Cloudflare proíbe — o mesmo
43
+ * caminho serve teste em Node e código de Worker.
44
+ */
45
+ export async function capturarBrutaEmMemoria(server, cliente) {
46
+ const [lado, ladoServidor] = InMemoryTransport.createLinkedPair();
47
+ await server.connect(ladoServidor);
48
+ const pendentes = new Map();
49
+ lado.onmessage = (msg) => {
50
+ const m = msg;
51
+ if (typeof m.id === "number") {
52
+ pendentes.get(m.id)?.(m);
53
+ pendentes.delete(m.id);
54
+ }
55
+ };
56
+ await lado.start();
57
+ let proximo = 1;
58
+ const pedir = (method, params) => new Promise(resolve => {
59
+ const id = proximo++;
60
+ pendentes.set(id, msg => resolve(msg.error ? undefined : msg.result));
61
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
62
+ void lado.send({ jsonrpc: "2.0", id, method, params });
63
+ });
64
+ try {
65
+ return await capturarBrutaPor(pedir, cliente, () => {
66
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
67
+ void lado.send({ jsonrpc: "2.0", method: "notifications/initialized" });
68
+ });
69
+ }
70
+ finally {
71
+ await lado.close();
72
+ }
73
+ }
74
+ //# sourceMappingURL=captura.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captura.js","sourceRoot":"","sources":["../src/captura.ts"],"names":[],"mappings":"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"}
package/dist/card.d.ts ADDED
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Server card estático (`/.well-known/mcp/server-card.json`) para scanners de
3
+ * diretório que o leem em vez de conectar ao `/mcp` — a Smithery lê quando a
4
+ * varredura automática não completa, e um card velho NÃO se conserta
5
+ * republicando: ele é lido de novo na próxima varredura.
6
+ *
7
+ * Por que existe. Em 04/10/2026, 4 dos 7 servidores serviam o card por um
8
+ * `worker/src/card.ts` copiado entre eles, e os outros 3 respondiam 404. Os
9
+ * quatro que serviam publicavam `name`/`version` soltos na raiz, enquanto a
10
+ * forma documentada pela Smithery (smithery.ai/docs/build/publish) exige
11
+ * `serverInfo: { name, version }` — fora do formato em todos.
12
+ *
13
+ * Desenho:
14
+ * - DERIVADO da mesma captura crua que a trava normaliza (`captura.ts`), nunca
15
+ * transcrito: `serverInfo` é o do `initialize` real, versão incluída;
16
+ * `superficieDoCard` faz a volta, e o teste do servidor prova que o card
17
+ * normalizado tem o MESMO sha256 da seção `declarada` do `surface.lock.json`.
18
+ * - Método não servido fica FORA do card (não vira `[]`): "não serve" e "serve
19
+ * nada" são superfícies diferentes, e a volta precisa ser exata.
20
+ * - `authentication.required` sai da seção `semToken` da trava
21
+ * (`autenticacaoDaTrava`) — o que a borda MEDIU, não o que alguém declarou.
22
+ * - Subpath próprio (`@sbissoli/mcp-surface/card`) e seguro para Worker: só
23
+ * importa `captura.ts` e `sonda.ts` — sem `node:crypto`, sem
24
+ * `node:child_process`, sem Ajv.
25
+ */
26
+ import { type ServidorConectavel, type SuperficieBruta } from "./captura.js";
27
+ export type { ServidorConectavel, SuperficieBruta } from "./captura.js";
28
+ /** O campo `authentication` do card (forma da Smithery). */
29
+ export interface Autenticacao {
30
+ required: boolean;
31
+ schemes?: string[];
32
+ }
33
+ export interface OpcoesCard {
34
+ /** Quase sempre `autenticacaoDaTrava(trava)`; ausente = o card não fala de autenticação. */
35
+ authentication?: Autenticacao;
36
+ }
37
+ /**
38
+ * Monta o card a partir da captura crua. Recusa (lança) sem `serverInfo.name`
39
+ * e `serverInfo.version` — os dois obrigatórios da forma da Smithery: um card
40
+ * sem eles é pior que 404, porque o scanner o aceita e grava o vazio.
41
+ */
42
+ export declare function montarCard(bruta: SuperficieBruta, opcoes?: OpcoesCard): Record<string, unknown>;
43
+ /** A volta: o card como captura crua — para conferir contra a trava (`normalizarSuperficie`). */
44
+ export declare function superficieDoCard(card: Record<string, unknown>): SuperficieBruta;
45
+ /** A seção `semToken` de um `surface.lock.json` (o JSON importado ou uma `Trava`). */
46
+ interface TravaComSemToken {
47
+ semToken?: {
48
+ conteudo?: unknown;
49
+ } | undefined;
50
+ }
51
+ /**
52
+ * `authentication` derivado da trava: exige credencial se, na configuração de
53
+ * PRODUÇÃO (`apiKeyAusente`) e na rota pública (`POST /mcp`), `tools/list` NÃO
54
+ * responde sem token. Lança se a medição não está lá — card que afirma sem
55
+ * medida é o que este módulo existe para evitar.
56
+ */
57
+ export declare function autenticacaoDaTrava(trava: TravaComSemToken, config?: string, rota?: string): Autenticacao;
58
+ /** Card em memória: o servidor montado pela mesma fábrica dos transportes. */
59
+ export declare function capturarCard(server: ServidorConectavel, opcoes?: OpcoesCard): Promise<Record<string, unknown>>;
60
+ /**
61
+ * Card por HTTP stateless (JSON ou SSE) — para o servidor cuja superfície mora
62
+ * atrás de outro `fetch` (o container do sih). Um `initialize` que não responde
63
+ * faz `montarCard` lançar; o servidor decide o fallback.
64
+ */
65
+ export declare function capturarCardPorFetch(buscar: (req: Request) => Promise<Response>, url: string, opcoes?: OpcoesCard): Promise<Record<string, unknown>>;
66
+ /**
67
+ * Cache por isolate: a primeira montagem que DÁ CERTO fica; falha não é
68
+ * cacheada (lança de novo na próxima requisição). Devolve o JSON pronto.
69
+ */
70
+ export declare function cardEmCache(montar: () => Promise<Record<string, unknown>>): () => Promise<string>;
71
+ //# sourceMappingURL=card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../src/card.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAA4C,KAAK,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAGvH,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAExE,4DAA4D;AAC5D,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,4FAA4F;IAC5F,cAAc,CAAC,EAAE,YAAY,CAAC;CAC/B;AAID;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,GAAE,UAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAenG;AAED,iGAAiG;AACjG,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAU/E;AAED,sFAAsF;AACtF,UAAU,gBAAgB;IACxB,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;CAC/C;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAkB,EAAE,IAAI,SAAc,GAAG,YAAY,CAOvH;AAED,8EAA8E;AAC9E,wBAAsB,YAAY,CAAC,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAE,UAAe,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAExH;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,EAC3C,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,UAAe,GACtB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAWlC;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAGjG"}
package/dist/card.js ADDED
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Server card estático (`/.well-known/mcp/server-card.json`) para scanners de
3
+ * diretório que o leem em vez de conectar ao `/mcp` — a Smithery lê quando a
4
+ * varredura automática não completa, e um card velho NÃO se conserta
5
+ * republicando: ele é lido de novo na próxima varredura.
6
+ *
7
+ * Por que existe. Em 04/10/2026, 4 dos 7 servidores serviam o card por um
8
+ * `worker/src/card.ts` copiado entre eles, e os outros 3 respondiam 404. Os
9
+ * quatro que serviam publicavam `name`/`version` soltos na raiz, enquanto a
10
+ * forma documentada pela Smithery (smithery.ai/docs/build/publish) exige
11
+ * `serverInfo: { name, version }` — fora do formato em todos.
12
+ *
13
+ * Desenho:
14
+ * - DERIVADO da mesma captura crua que a trava normaliza (`captura.ts`), nunca
15
+ * transcrito: `serverInfo` é o do `initialize` real, versão incluída;
16
+ * `superficieDoCard` faz a volta, e o teste do servidor prova que o card
17
+ * normalizado tem o MESMO sha256 da seção `declarada` do `surface.lock.json`.
18
+ * - Método não servido fica FORA do card (não vira `[]`): "não serve" e "serve
19
+ * nada" são superfícies diferentes, e a volta precisa ser exata.
20
+ * - `authentication.required` sai da seção `semToken` da trava
21
+ * (`autenticacaoDaTrava`) — o que a borda MEDIU, não o que alguém declarou.
22
+ * - Subpath próprio (`@sbissoli/mcp-surface/card`) e seguro para Worker: só
23
+ * importa `captura.ts` e `sonda.ts` — sem `node:crypto`, sem
24
+ * `node:child_process`, sem Ajv.
25
+ */
26
+ import { capturarBrutaEmMemoria, capturarBrutaPor } from "./captura.js";
27
+ import { CABECALHOS_MCP, corpoDoPedido, lerCorpoJsonRpc } from "./sonda.js";
28
+ const LISTAS = ["tools", "resources", "resourceTemplates", "prompts"];
29
+ /**
30
+ * Monta o card a partir da captura crua. Recusa (lança) sem `serverInfo.name`
31
+ * e `serverInfo.version` — os dois obrigatórios da forma da Smithery: um card
32
+ * sem eles é pior que 404, porque o scanner o aceita e grava o vazio.
33
+ */
34
+ export function montarCard(bruta, opcoes = {}) {
35
+ const init = bruta.initialize;
36
+ const serverInfo = init?.["serverInfo"];
37
+ if (typeof serverInfo?.["name"] !== "string" || typeof serverInfo["version"] !== "string") {
38
+ throw new Error("server card: initialize sem serverInfo.name/serverInfo.version");
39
+ }
40
+ const card = {
41
+ serverInfo,
42
+ protocolVersion: init["protocolVersion"],
43
+ capabilities: init["capabilities"],
44
+ instructions: init["instructions"],
45
+ };
46
+ if (opcoes.authentication)
47
+ card["authentication"] = opcoes.authentication;
48
+ for (const chave of LISTAS)
49
+ if (bruta[chave])
50
+ card[chave] = bruta[chave];
51
+ return card;
52
+ }
53
+ /** A volta: o card como captura crua — para conferir contra a trava (`normalizarSuperficie`). */
54
+ export function superficieDoCard(card) {
55
+ const { serverInfo, protocolVersion, capabilities, instructions } = card;
56
+ const lista = (chave) => card[chave];
57
+ return {
58
+ initialize: { serverInfo, protocolVersion, capabilities, instructions },
59
+ tools: lista("tools"),
60
+ resources: lista("resources"),
61
+ resourceTemplates: lista("resourceTemplates"),
62
+ prompts: lista("prompts"),
63
+ };
64
+ }
65
+ /**
66
+ * `authentication` derivado da trava: exige credencial se, na configuração de
67
+ * PRODUÇÃO (`apiKeyAusente`) e na rota pública (`POST /mcp`), `tools/list` NÃO
68
+ * responde sem token. Lança se a medição não está lá — card que afirma sem
69
+ * medida é o que este módulo existe para evitar.
70
+ */
71
+ export function autenticacaoDaTrava(trava, config = "apiKeyAusente", rota = "POST /mcp") {
72
+ const conteudo = trava.semToken?.conteudo;
73
+ const medido = conteudo?.[config]?.[rota]?.["tools/list"];
74
+ if (typeof medido !== "boolean") {
75
+ throw new Error(`server card: trava sem semToken.conteudo["${config}"]["${rota}"]["tools/list"]`);
76
+ }
77
+ return { required: !medido };
78
+ }
79
+ /** Card em memória: o servidor montado pela mesma fábrica dos transportes. */
80
+ export async function capturarCard(server, opcoes = {}) {
81
+ return montarCard(await capturarBrutaEmMemoria(server, "server-card"), opcoes);
82
+ }
83
+ /**
84
+ * Card por HTTP stateless (JSON ou SSE) — para o servidor cuja superfície mora
85
+ * atrás de outro `fetch` (o container do sih). Um `initialize` que não responde
86
+ * faz `montarCard` lançar; o servidor decide o fallback.
87
+ */
88
+ export async function capturarCardPorFetch(buscar, url, opcoes = {}) {
89
+ let id = 1;
90
+ const bruta = await capturarBrutaPor(async (method, params) => {
91
+ const pedido = params ? { method, params } : { method };
92
+ const res = await buscar(new Request(url, { method: "POST", headers: { ...CABECALHOS_MCP }, body: corpoDoPedido(pedido, id++) }));
93
+ const corpo = lerCorpoJsonRpc(await res.text());
94
+ return corpo?.error ? undefined : corpo?.result;
95
+ }, "server-card");
96
+ return montarCard(bruta, opcoes);
97
+ }
98
+ /**
99
+ * Cache por isolate: a primeira montagem que DÁ CERTO fica; falha não é
100
+ * cacheada (lança de novo na próxima requisição). Devolve o JSON pronto.
101
+ */
102
+ export function cardEmCache(montar) {
103
+ let pronto;
104
+ return async () => (pronto ??= JSON.stringify(await montar()));
105
+ }
106
+ //# sourceMappingURL=card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.js","sourceRoot":"","sources":["../src/card.ts"],"names":[],"mappings":"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"}
package/dist/cliente.d.ts CHANGED
@@ -146,8 +146,10 @@ export interface Quebra {
146
146
  }
147
147
  /**
148
148
  * As quebras genéricas, DERIVADAS do schema listado (não de nomes escritos à
149
- * mão): `structuredContent` ausente, cada campo obrigatório ausente, o primeiro
150
- * obrigatório com tipo declarado trocado de tipo.
149
+ * mão): `structuredContent` ausente, cada campo obrigatório ausente, e cada
150
+ * obrigatório com tipo declarado trocado de tipo. Cada um, não o primeiro: até a
151
+ * 0.2.0 só o primeiro tipado era trocado, e no ilo esse caía num objeto
152
+ * (`dataflow`) e deixava os escalares sem prova.
151
153
  */
152
154
  export declare function quebrasDoSchema(outputSchema: Record<string, unknown>): Quebra[];
153
155
  export interface Veredito {
@@ -1 +1 @@
1
- {"version":3,"file":"cliente.d.ts","sourceRoot":"","sources":["../src/cliente.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAGtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,6EAA6E;AAC7E,MAAM,MAAM,cAAc,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1H,MAAM,WAAW,aAAa;IAC5B,sFAAsF;IACtF,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;CACzC;AAID,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAYjH;AAWD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAOvG;AAED,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;CACxC;AASD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAoB/E;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,+FAA+F;IAC/F,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC;IAC9B,4EAA4E;IAC5E,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,EAC/D,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAClC,MAAM,GAAE,MAAM,EAAO,GACpB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAoCrB"}
1
+ {"version":3,"file":"cliente.d.ts","sourceRoot":"","sources":["../src/cliente.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAGtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,6EAA6E;AAC7E,MAAM,MAAM,cAAc,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1H,MAAM,WAAW,aAAa;IAC5B,sFAAsF;IACtF,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;CACzC;AAID,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAYjH;AAWD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAOvG;AAED,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;CACxC;AAsBD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAqB/E;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,+FAA+F;IAC/F,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC;IAC9B,4EAA4E;IAC5E,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,EAC/D,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAClC,MAAM,GAAE,MAAM,EAAO,GACpB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAuCrB"}
package/dist/cliente.js CHANGED
@@ -57,18 +57,31 @@ export async function chamarComoCliente(client, nome, args = {}) {
57
57
  }
58
58
  return r;
59
59
  }
60
- /** Um valor do tipo errado para o tipo JSON Schema declarado. */
60
+ /** Candidatos a valor errado, com os tipos JSON Schema que cada um satisfaz. */
61
+ const CANDIDATOS = [
62
+ ["valor-de-tipo-errado", ["string"]],
63
+ [0, ["number", "integer"]],
64
+ [true, ["boolean"]],
65
+ [[], ["array"]],
66
+ [{}, ["object"]],
67
+ ];
68
+ /**
69
+ * Um valor que NENHUM dos tipos declarados aceita — `type` simples ou lista
70
+ * (`["string", "null"]`, o campo anulável, que é onde o defeito mora). Sem
71
+ * `type` declarado não há o que trocar: `undefined`.
72
+ */
61
73
  function tipoErrado(tipo) {
62
- if (tipo === "string")
63
- return 0;
64
- if (typeof tipo === "string")
65
- return "valor-de-tipo-errado";
66
- return undefined;
74
+ const tipos = typeof tipo === "string" ? [tipo] : Array.isArray(tipo) ? tipo : [];
75
+ if (tipos.length === 0)
76
+ return undefined;
77
+ return CANDIDATOS.find(([, aceitos]) => !aceitos.some(t => tipos.includes(t)))?.[0];
67
78
  }
68
79
  /**
69
80
  * As quebras genéricas, DERIVADAS do schema listado (não de nomes escritos à
70
- * mão): `structuredContent` ausente, cada campo obrigatório ausente, o primeiro
71
- * obrigatório com tipo declarado trocado de tipo.
81
+ * mão): `structuredContent` ausente, cada campo obrigatório ausente, e cada
82
+ * obrigatório com tipo declarado trocado de tipo. Cada um, não o primeiro: até a
83
+ * 0.2.0 só o primeiro tipado era trocado, e no ilo esse caía num objeto
84
+ * (`dataflow`) e deixava os escalares sem prova.
72
85
  */
73
86
  export function quebrasDoSchema(outputSchema) {
74
87
  const obrigatorios = Array.isArray(outputSchema.required) ? outputSchema.required : [];
@@ -80,13 +93,15 @@ export function quebrasDoSchema(outputSchema) {
80
93
  adulterar: (r) => void delete r.structuredContent?.[campo],
81
94
  })),
82
95
  ];
83
- const tipado = obrigatorios.find(c => tipoErrado(props[c]?.type) !== undefined);
84
- if (tipado) {
96
+ for (const campo of obrigatorios) {
97
+ const errado = tipoErrado(props[campo]?.type);
98
+ if (errado === undefined)
99
+ continue;
85
100
  quebras.push({
86
- descricao: `campo de tipo errado (${tipado})`,
101
+ descricao: `campo de tipo errado (${campo})`,
87
102
  adulterar: r => {
88
103
  if (r.structuredContent)
89
- r.structuredContent[tipado] = tipoErrado(props[tipado]?.type);
104
+ r.structuredContent[campo] = structuredClone(errado);
90
105
  },
91
106
  });
92
107
  }
@@ -133,15 +148,17 @@ export async function controlesNegativos(fabrica, nome, args = {}, extras = [])
133
148
  await client.close();
134
149
  }
135
150
  };
136
- const vereditos = [];
137
- for (const q of quebras)
138
- vereditos.push({ descricao: q.descricao, esperado: "reprova", ...(await rodar(q, true)) });
151
+ // Em paralelo: cada quebra tem servidor e conexão próprios. Desde a 0.2.1 há
152
+ // uma troca de tipo por obrigatório, e em série o medical (`loinc_details`,
153
+ // muitos obrigatórios) passava dos 5 s do vitest sob a carga da suíte.
139
154
  const armadilha = quebras[1] ?? quebras[0];
140
- vereditos.push({
141
- descricao: `a armadilha: sem tools/list antes, "${armadilha.descricao}" passa calada`,
142
- esperado: "passa",
143
- ...(await rodar(armadilha, false)),
144
- });
145
- return vereditos;
155
+ return Promise.all([
156
+ ...quebras.map(async (q) => ({ descricao: q.descricao, esperado: "reprova", ...(await rodar(q, true)) })),
157
+ rodar(armadilha, false).then(r => ({
158
+ descricao: `a armadilha: sem tools/list antes, "${armadilha.descricao}" passa calada`,
159
+ esperado: "passa",
160
+ ...r,
161
+ })),
162
+ ]);
146
163
  }
147
164
  //# sourceMappingURL=cliente.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cliente.js","sourceRoot":"","sources":["../src/cliente.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cliente.js","sourceRoot":"","sources":["../src/cliente.ts"],"names":[],"mappings":"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"}
package/dist/memoria.d.ts CHANGED
@@ -1,15 +1,8 @@
1
1
  /**
2
- * Captura em memória: o servidor montado pela mesma fábrica que os transportes
3
- * usam, interrogado por JSON-RPC cru sobre o `InMemoryTransport` do SDK v2.
4
- *
5
- * JSON-RPC cru, e não o `Client` do SDK: o `Client` compila os `outputSchema`
6
- * com Ajv (`new Function`), que o runtime da Cloudflare proíbe — o mesmo
7
- * caminho serve teste em Node e código de Worker.
2
+ * Captura em memória, normalizada: a captura crua de `captura.ts` passada pela
3
+ * mesma normalização dos caminhos HTTP e stdio.
8
4
  */
9
- import { InMemoryTransport } from "@modelcontextprotocol/server";
10
- /** O que a captura precisa de um `McpServer`: só conectar a um transporte. */
11
- export interface ServidorConectavel {
12
- connect(transport: InMemoryTransport): Promise<void>;
13
- }
5
+ import { type ServidorConectavel } from "./captura.js";
6
+ export type { ServidorConectavel } from "./captura.js";
14
7
  export declare function capturarSuperficie(server: ServidorConectavel): Promise<Record<string, unknown>>;
15
8
  //# sourceMappingURL=memoria.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memoria.d.ts","sourceRoot":"","sources":["../src/memoria.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAIjE,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA+BrG"}
1
+ {"version":3,"file":"memoria.d.ts","sourceRoot":"","sources":["../src/memoria.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAG/E,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAErG"}
package/dist/memoria.js CHANGED
@@ -1,40 +1,10 @@
1
1
  /**
2
- * Captura em memória: o servidor montado pela mesma fábrica que os transportes
3
- * usam, interrogado por JSON-RPC cru sobre o `InMemoryTransport` do SDK v2.
4
- *
5
- * JSON-RPC cru, e não o `Client` do SDK: o `Client` compila os `outputSchema`
6
- * com Ajv (`new Function`), que o runtime da Cloudflare proíbe — o mesmo
7
- * caminho serve teste em Node e código de Worker.
2
+ * Captura em memória, normalizada: a captura crua de `captura.ts` passada pela
3
+ * mesma normalização dos caminhos HTTP e stdio.
8
4
  */
9
- import { InMemoryTransport } from "@modelcontextprotocol/server";
10
- import { capturarPor } from "./superficie.js";
5
+ import { capturarBrutaEmMemoria } from "./captura.js";
6
+ import { normalizarSuperficie } from "./superficie.js";
11
7
  export async function capturarSuperficie(server) {
12
- const [cliente, lado] = InMemoryTransport.createLinkedPair();
13
- await server.connect(lado);
14
- const pendentes = new Map();
15
- cliente.onmessage = (msg) => {
16
- const m = msg;
17
- if (typeof m.id === "number") {
18
- pendentes.get(m.id)?.(m);
19
- pendentes.delete(m.id);
20
- }
21
- };
22
- await cliente.start();
23
- let proximo = 1;
24
- const pedir = (method, params) => new Promise(resolve => {
25
- const id = proximo++;
26
- pendentes.set(id, msg => resolve(msg.error ? undefined : msg.result));
27
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
- void cliente.send({ jsonrpc: "2.0", id, method, params });
29
- });
30
- try {
31
- return await capturarPor(pedir, "surface-lock", () => {
32
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
- void cliente.send({ jsonrpc: "2.0", method: "notifications/initialized" });
34
- });
35
- }
36
- finally {
37
- await cliente.close();
38
- }
8
+ return normalizarSuperficie(await capturarBrutaEmMemoria(server, "surface-lock"));
39
9
  }
40
10
  //# sourceMappingURL=memoria.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"memoria.js","sourceRoot":"","sources":["../src/memoria.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAO9C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAA0B;IACjE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,iBAAiB,CAAC,gBAAgB,EAAE,CAAC;IAC7D,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAgF,CAAC;IAC1G,OAAO,CAAC,SAAS,GAAG,CAAC,GAAY,EAAE,EAAE;QACnC,MAAM,CAAC,GAAG,GAA0E,CAAC;QACrF,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;YAC7B,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACzB,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IAEtB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,KAAK,GAAG,CAAC,MAAc,EAAE,MAAgC,EAAE,EAAE,CACjE,IAAI,OAAO,CAAsC,OAAO,CAAC,EAAE;QACzD,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QACtE,8DAA8D;QAC9D,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAS,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEL,IAAI,CAAC;QACH,OAAO,MAAM,WAAW,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE;YACnD,8DAA8D;YAC9D,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,EAAS,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"memoria.js","sourceRoot":"","sources":["../src/memoria.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,sBAAsB,EAA2B,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAIvD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAA0B;IACjE,OAAO,oBAAoB,CAAC,MAAM,sBAAsB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;AACpF,CAAC"}
package/dist/sonda.js CHANGED
@@ -5,7 +5,7 @@
5
5
  * declarada mudasse. Só a borda HTTP sabe medir isso, então a medição recebe
6
6
  * do servidor um `responder` que monta a requisição do jeito da borda dele.
7
7
  */
8
- import { paramsDoInitialize } from "./superficie.js";
8
+ import { paramsDoInitialize } from "./captura.js";
9
9
  /**
10
10
  * Os métodos que um cliente sem credencial pode tentar. `tools/call` entra só
11
11
  * com uma tool que não vai à rede — a sonda mede a borda, não o humor da fonte.
package/dist/sonda.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sonda.js","sourceRoot":"","sources":["../src/sonda.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sonda.js","sourceRoot":"","sources":["../src/sonda.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAalD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,OAAsB;IAClD,MAAM,KAAK,GAAa;QACtB,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,kBAAkB,CAAC,cAAc,CAAC,EAAE;QACpE,EAAE,MAAM,EAAE,MAAM,EAAE;QAClB,EAAE,MAAM,EAAE,YAAY,EAAE;QACxB,EAAE,MAAM,EAAE,gBAAgB,EAAE;QAC5B,EAAE,MAAM,EAAE,0BAA0B,EAAE;QACtC,EAAE,MAAM,EAAE,cAAc,EAAE;KAC3B,CAAC;IACF,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAChH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACvB,IAAI,CAAC;QACH,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,CAAC;aACZ,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;aAClC,GAAG,EAAE,CAAC;QACT,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAa;IAC3C,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IACrC,OAAO,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,KAAK,SAAS,CAAC;AACjE,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,EAAE,GAAG,CAAC;IAClD,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9F,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAqC;IAC9D,cAAc,EAAE,kBAAkB;IAClC,MAAM,EAAE,qCAAqC;CAC9C,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,aAAgC,EAChC,KAAwB,EACxB,KAAwB,EACxB,SAA8E;IAE9E,MAAM,KAAK,GAA4D,EAAE,CAAC;IAC1E,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,OAAO,GAA4C,EAAE,CAAC;QAC5D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,SAAS,GAA4B,EAAE,CAAC;YAC9C,KAAK,MAAM,MAAM,IAAI,KAAK;gBAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,MAAM,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YAC9G,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;IAC1B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,OAAgB,EAAE,IAAY;IACpD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1B,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE;QACxB,GAAG,CAAC,IAAI,EAAE,IAAI;YACZ,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,OAAO,CAAC;YACvC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAC5C,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAChE,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,GAAG,CAAC,CAAC;AACX;;;;GAIG;AACH,MAAM,UAAU,SAAS;IACvB,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACpB,OAAO,WAAW,EAAE,EAAE,CAAC;AACzB,CAAC"}
@@ -15,16 +15,8 @@
15
15
  * nasceu no bcb-br-mcp (1.15.1) e foi trazida para cá sem mudar um byte: o
16
16
  * sha256 travado lá continua valendo aqui.
17
17
  */
18
- /** O protocolo pedido no `initialize` de toda captura — fixo, para o eco não variar. */
19
- export declare const PROTOCOLO_DA_CAPTURA = "2025-06-18";
20
- /** Resultados crus, como saem do JSON-RPC. Lista ausente = método não servido. */
21
- export interface SuperficieBruta {
22
- initialize: Record<string, unknown> | undefined;
23
- tools: unknown[] | undefined;
24
- resources: unknown[] | undefined;
25
- resourceTemplates: unknown[] | undefined;
26
- prompts: unknown[] | undefined;
27
- }
18
+ import { type Pedir, type SuperficieBruta } from "./captura.js";
19
+ export { PROTOCOLO_DA_CAPTURA, paramsDoInitialize, type SuperficieBruta } from "./captura.js";
28
20
  /**
29
21
  * Forma canônica da superfície. A versão do servidor sai — ela muda a cada
30
22
  * release e é justamente o que se compara contra a superfície. O resto do
@@ -36,12 +28,10 @@ export interface SuperficieBruta {
36
28
  export declare function normalizarSuperficie(bruta: SuperficieBruta): Record<string, unknown>;
37
29
  /** sha256 do JSON canônico (chaves ordenadas) — a impressão digital. */
38
30
  export declare function impressaoDigital(valor: unknown): string;
39
- /** Os parâmetros do `initialize` de toda captura. */
40
- export declare function paramsDoInitialize(cliente: string): Record<string, unknown>;
41
31
  /**
42
32
  * Captura a superfície por qualquer transporte: `pedir` faz uma requisição
43
33
  * JSON-RPC e devolve o `result` (ou `undefined` em erro). `notificar`, quando
44
34
  * o transporte tem sessão, manda o `notifications/initialized`.
45
35
  */
46
- export declare function capturarPor(pedir: (method: string, params?: Record<string, unknown>) => Promise<Record<string, unknown> | undefined>, cliente: string, notificar?: () => void): Promise<Record<string, unknown>>;
36
+ export declare function capturarPor(pedir: Pedir, cliente: string, notificar?: () => void): Promise<Record<string, unknown>>;
47
37
  //# sourceMappingURL=superficie.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"superficie.d.ts","sourceRoot":"","sources":["../src/superficie.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,wFAAwF;AACxF,eAAO,MAAM,oBAAoB,eAAe,CAAC;AAEjD,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAChD,KAAK,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IACjC,iBAAiB,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IACzC,OAAO,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;CAChC;AAqBD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAepF;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEvD;AAED,qDAAqD;AACrD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAM3E;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,EACzG,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,IAAI,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAWlC"}
1
+ {"version":3,"file":"superficie.d.ts","sourceRoot":"","sources":["../src/superficie.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAAoB,KAAK,KAAK,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAElF,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAqB9F;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAepF;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEvD;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAEzH"}
@@ -16,8 +16,8 @@
16
16
  * sha256 travado lá continua valendo aqui.
17
17
  */
18
18
  import { createHash } from "node:crypto";
19
- /** O protocolo pedido no `initialize` de toda captura — fixo, para o eco não variar. */
20
- export const PROTOCOLO_DA_CAPTURA = "2025-06-18";
19
+ import { capturarBrutaPor } from "./captura.js";
20
+ export { PROTOCOLO_DA_CAPTURA, paramsDoInitialize } from "./captura.js";
21
21
  function ordenarChaves(valor) {
22
22
  if (Array.isArray(valor))
23
23
  return valor.map(ordenarChaves);
@@ -61,29 +61,12 @@ export function normalizarSuperficie(bruta) {
61
61
  export function impressaoDigital(valor) {
62
62
  return createHash("sha256").update(JSON.stringify(ordenarChaves(valor))).digest("hex");
63
63
  }
64
- /** Os parâmetros do `initialize` de toda captura. */
65
- export function paramsDoInitialize(cliente) {
66
- return {
67
- protocolVersion: PROTOCOLO_DA_CAPTURA,
68
- capabilities: {},
69
- clientInfo: { name: cliente, version: "1.0.0" },
70
- };
71
- }
72
64
  /**
73
65
  * Captura a superfície por qualquer transporte: `pedir` faz uma requisição
74
66
  * JSON-RPC e devolve o `result` (ou `undefined` em erro). `notificar`, quando
75
67
  * o transporte tem sessão, manda o `notifications/initialized`.
76
68
  */
77
69
  export async function capturarPor(pedir, cliente, notificar) {
78
- const initialize = await pedir("initialize", paramsDoInitialize(cliente));
79
- notificar?.();
80
- const lista = async (method, chave) => (await pedir(method, {}))?.[chave];
81
- return normalizarSuperficie({
82
- initialize,
83
- tools: await lista("tools/list", "tools"),
84
- resources: await lista("resources/list", "resources"),
85
- resourceTemplates: await lista("resources/templates/list", "resourceTemplates"),
86
- prompts: await lista("prompts/list", "prompts"),
87
- });
70
+ return normalizarSuperficie(await capturarBrutaPor(pedir, cliente, notificar));
88
71
  }
89
72
  //# sourceMappingURL=superficie.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"superficie.js","sourceRoot":"","sources":["../src/superficie.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,wFAAwF;AACxF,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC;AAWjD,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC1D,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;aACf,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,CAAE,KAAiC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACvE,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAA4B,EAAE,KAAa;IAC3D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC9B,MAAM,CAAE,CAA6B,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAE,CAA6B,CAAC,KAAK,CAAC,CAAC,CAAC,CAC3G,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAsB;IACzD,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;IACpC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAA4B,CAAC;IAClG,OAAO,aAAa,CAAC;QACnB,UAAU,EAAE;YACV,eAAe,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,IAAI;YAChD,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI;YAC1C,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI;YAC1C,UAAU;SACX;QACD,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC;QACpC,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC;QAC3C,iBAAiB,EAAE,QAAQ,CAAC,KAAK,CAAC,iBAAiB,EAAE,aAAa,CAAC;QACnE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC;KACzC,CAA4B,CAAC;AAChC,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzF,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,OAAO;QACL,eAAe,EAAE,oBAAoB;QACrC,YAAY,EAAE,EAAE;QAChB,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;KAChD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAyG,EACzG,OAAe,EACf,SAAsB;IAEtB,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1E,SAAS,EAAE,EAAE,CAAC;IACd,MAAM,KAAK,GAAG,KAAK,EAAE,MAAc,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAA0B,CAAC;IACnH,OAAO,oBAAoB,CAAC;QAC1B,UAAU;QACV,KAAK,EAAE,MAAM,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC;QACzC,SAAS,EAAE,MAAM,KAAK,CAAC,gBAAgB,EAAE,WAAW,CAAC;QACrD,iBAAiB,EAAE,MAAM,KAAK,CAAC,0BAA0B,EAAE,mBAAmB,CAAC;QAC/E,OAAO,EAAE,MAAM,KAAK,CAAC,cAAc,EAAE,SAAS,CAAC;KAChD,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"superficie.js","sourceRoot":"","sources":["../src/superficie.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAoC,MAAM,cAAc,CAAC;AAElF,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAwB,MAAM,cAAc,CAAC;AAE9F,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC1D,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;aACf,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,CAAE,KAAiC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACvE,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAA4B,EAAE,KAAa;IAC3D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC9B,MAAM,CAAE,CAA6B,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAE,CAA6B,CAAC,KAAK,CAAC,CAAC,CAAC,CAC3G,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAsB;IACzD,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;IACpC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAA4B,CAAC;IAClG,OAAO,aAAa,CAAC;QACnB,UAAU,EAAE;YACV,eAAe,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,IAAI;YAChD,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI;YAC1C,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI;YAC1C,UAAU;SACX;QACD,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC;QACpC,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC;QAC3C,iBAAiB,EAAE,QAAQ,CAAC,KAAK,CAAC,iBAAiB,EAAE,aAAa,CAAC;QACnE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC;KACzC,CAA4B,CAAC;AAChC,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzF,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAY,EAAE,OAAe,EAAE,SAAsB;IACrF,OAAO,oBAAoB,CAAC,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;AACjF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sbissoli/mcp-surface",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Impressão digital da superfície de um servidor MCP: initialize (instructions + capabilities) + tools/resources/prompts + quem responde sem token, travados ao lado da versão — mudou sem subir a versão = build vermelho e deploy recusado; mais a conferência do endpoint no ar e o replay das versões publicadas",
5
5
  "repository": {
6
6
  "type": "git",
@@ -21,6 +21,10 @@
21
21
  "./cliente": {
22
22
  "types": "./dist/cliente.d.ts",
23
23
  "default": "./dist/cliente.js"
24
+ },
25
+ "./card": {
26
+ "types": "./dist/card.d.ts",
27
+ "default": "./dist/card.js"
24
28
  }
25
29
  },
26
30
  "bin": {