@sbissoli/mcp-surface 0.3.0 → 0.4.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,29 @@ 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.4.0] — 2026-10-04
12
+
13
+ A normalização NÃO muda. Minor porque a superfície publicada cresce (subpath novo); o
14
+ `/card` da 0.3.0 continua com a mesma API, então quem já o usa não precisa mudar nada.
15
+
16
+ ### Adicionado
17
+
18
+ - **`@sbissoli/mcp-surface/card/http`** — tudo do `/card` MENOS `capturarCard`, sem o SDK
19
+ em valor no grafo de imports. Medido em 04/10/2026 na adoção pelo sih-br-mcp, cuja borda
20
+ só captura por HTTP o container: o `/card` puxava o `InMemoryTransport` e, com ele, o SDK
21
+ inteiro (zod, core, `@cfworker/json-schema`), e a borda foi de 31 para 156 KiB gzip.
22
+ `sideEffects: false` não resolve, porque o próprio SDK não o declara. Com `/card/http`
23
+ (e o `semToken` importado por nome), a mesma borda fica em 32 KiB gzip. Nos servidores
24
+ que montam o `McpServer` no Worker o SDK já está no bundle, e o `/card` não custa nada.
25
+
26
+ ### Mudado (interno)
27
+
28
+ - A captura em memória saiu de `captura.ts` para `captura-memoria.ts` (o único módulo da
29
+ captura com o SDK em valor); `captura.ts` só importa o TIPO do transporte. `card.ts`
30
+ passa a reexportar `card-http.ts` e acrescentar `capturarCard`. Teste novo confere que o
31
+ grafo de `/card/http` não importa o SDK em valor, com controle negativo no grafo de
32
+ `/card`.
33
+
11
34
  ## [0.3.0] — 2026-10-04
12
35
 
13
36
  A normalização NÃO muda: o sha256 de todo `surface.lock.json` continua o mesmo. Minor
package/README.md CHANGED
@@ -114,9 +114,11 @@ o `Client` (há teste que confere).
114
114
  ```ts
115
115
  // worker/src/index.ts
116
116
  import { autenticacaoDaTrava, capturarCard, cardEmCache } from "@sbissoli/mcp-surface/card";
117
- import trava from "../../surface.lock.json";
117
+ // Import nomeado (moduleResolution Bundler): o esbuild deixa o resto da trava fora do bundle.
118
+ // Em NodeNext não há import nomeado de JSON: `import trava from "…" with { type: "json" }`.
119
+ import { semToken } from "../../surface.lock.json";
118
120
 
119
- const serverCard = cardEmCache(() => capturarCard(buildServer(), { authentication: autenticacaoDaTrava(trava) }));
121
+ const serverCard = cardEmCache(() => capturarCard(buildServer(), { authentication: autenticacaoDaTrava({ semToken }) }));
120
122
  // GET /.well-known/mcp/server-card.json → new Response(await serverCard(), { headers: { "Content-Type": "application/json" } })
121
123
  ```
122
124
 
@@ -133,7 +135,9 @@ expect(impressaoDigital(normalizarSuperficie(superficieDoCard(card)))).toBe(lerT
133
135
  `tools/list` em `apiKeyAusente` / `POST /mcp`. Lança se a medição não está lá.
134
136
  - `capturarCardPorFetch(buscar, url)` monta o mesmo card por HTTP stateless (JSON ou SSE),
135
137
  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.
138
+ não responde; o fallback é do servidor. Quem SÓ usa esse caminho importa de
139
+ **`@sbissoli/mcp-surface/card/http`**: tudo do `/card` menos `capturarCard`, sem o SDK
140
+ em valor no grafo — na borda do sih, 156 → 32 KiB gzip.
137
141
  - `cardEmCache` guarda a primeira montagem que dá certo, por isolate; falha não fica.
138
142
 
139
143
  ## Observações
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Captura crua em memória: o servidor montado pela mesma fábrica que os
3
+ * transportes usam, interrogado por JSON-RPC cru sobre o `InMemoryTransport`.
4
+ *
5
+ * Arquivo separado de `captura.ts` porque é o ÚNICO ponto da captura que
6
+ * importa o SDK em valor. Quem só captura por HTTP (`/card/http`, a borda do
7
+ * sih na frente do container) não importa daqui, e o bundle não carrega o SDK.
8
+ * Medido em 04/10/2026: com o import no caminho, a borda do sih foi de 31 para
9
+ * 156 KiB gzip; `sideEffects: false` não resolve, porque o SDK não o declara.
10
+ *
11
+ * JSON-RPC cru, e não o `Client` do SDK: o `Client` compila os `outputSchema`
12
+ * com Ajv (`new Function`), que o runtime da Cloudflare proíbe — o mesmo
13
+ * caminho serve teste em Node e código de Worker.
14
+ */
15
+ import { type ServidorConectavel, type SuperficieBruta } from "./captura.js";
16
+ export declare function capturarBrutaEmMemoria(server: ServidorConectavel, cliente: string): Promise<SuperficieBruta>;
17
+ //# sourceMappingURL=captura-memoria.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captura-memoria.d.ts","sourceRoot":"","sources":["../src/captura-memoria.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,EAAgC,KAAK,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAE3G,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA+BlH"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Captura crua em memória: o servidor montado pela mesma fábrica que os
3
+ * transportes usam, interrogado por JSON-RPC cru sobre o `InMemoryTransport`.
4
+ *
5
+ * Arquivo separado de `captura.ts` porque é o ÚNICO ponto da captura que
6
+ * importa o SDK em valor. Quem só captura por HTTP (`/card/http`, a borda do
7
+ * sih na frente do container) não importa daqui, e o bundle não carrega o SDK.
8
+ * Medido em 04/10/2026: com o import no caminho, a borda do sih foi de 31 para
9
+ * 156 KiB gzip; `sideEffects: false` não resolve, porque o SDK não o declara.
10
+ *
11
+ * JSON-RPC cru, e não o `Client` do SDK: o `Client` compila os `outputSchema`
12
+ * com Ajv (`new Function`), que o runtime da Cloudflare proíbe — o mesmo
13
+ * caminho serve teste em Node e código de Worker.
14
+ */
15
+ import { InMemoryTransport } from "@modelcontextprotocol/server";
16
+ import { capturarBrutaPor } from "./captura.js";
17
+ export async function capturarBrutaEmMemoria(server, cliente) {
18
+ const [lado, ladoServidor] = InMemoryTransport.createLinkedPair();
19
+ await server.connect(ladoServidor);
20
+ const pendentes = new Map();
21
+ lado.onmessage = (msg) => {
22
+ const m = msg;
23
+ if (typeof m.id === "number") {
24
+ pendentes.get(m.id)?.(m);
25
+ pendentes.delete(m.id);
26
+ }
27
+ };
28
+ await lado.start();
29
+ let proximo = 1;
30
+ const pedir = (method, params) => new Promise(resolve => {
31
+ const id = proximo++;
32
+ pendentes.set(id, msg => resolve(msg.error ? undefined : msg.result));
33
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
34
+ void lado.send({ jsonrpc: "2.0", id, method, params });
35
+ });
36
+ try {
37
+ return await capturarBrutaPor(pedir, cliente, () => {
38
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
39
+ void lado.send({ jsonrpc: "2.0", method: "notifications/initialized" });
40
+ });
41
+ }
42
+ finally {
43
+ await lado.close();
44
+ }
45
+ }
46
+ //# sourceMappingURL=captura-memoria.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captura-memoria.js","sourceRoot":"","sources":["../src/captura-memoria.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAA6D,MAAM,cAAc,CAAC;AAE3G,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,MAA0B,EAAE,OAAe;IACtF,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,GAAG,iBAAiB,CAAC,gBAAgB,EAAE,CAAC;IAClE,MAAM,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAEnC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAgF,CAAC;IAC1G,IAAI,CAAC,SAAS,GAAG,CAAC,GAAY,EAAE,EAAE;QAChC,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,IAAI,CAAC,KAAK,EAAE,CAAC;IAEnB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,KAAK,GAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CACtC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QACpB,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,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAS,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEL,IAAI,CAAC;QACH,OAAO,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE;YACjD,8DAA8D;YAC9D,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,EAAS,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC"}
package/dist/captura.d.ts CHANGED
@@ -3,11 +3,13 @@
3
3
  * JSON-RPC, sem normalizar nem tirar hash.
4
4
  *
5
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.
6
+ * `node:crypto` nem `node:child_process`, e nem o SDK em valor (só o tipo do
7
+ * transporte), então o subpath `/card/http` importa daqui sem levar o SDK ao
8
+ * bundle. A captura em memória, que precisa do SDK, mora em
9
+ * `captura-memoria.ts`. A trava e o card partem desta mesma captura — é o que
10
+ * permite provar que os dois não divergem.
9
11
  */
10
- import { InMemoryTransport } from "@modelcontextprotocol/server";
12
+ import type { InMemoryTransport } from "@modelcontextprotocol/server";
11
13
  /** O protocolo pedido no `initialize` de toda captura — fixo, para o eco não variar. */
12
14
  export declare const PROTOCOLO_DA_CAPTURA = "2025-06-18";
13
15
  /** Resultados crus, como saem do JSON-RPC. Lista ausente = método não servido. */
@@ -31,13 +33,4 @@ export declare function paramsDoInitialize(cliente: string): Record<string, unkn
31
33
  * sessão, manda o `notifications/initialized`.
32
34
  */
33
35
  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
36
  //# sourceMappingURL=captura.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"captura.d.ts","sourceRoot":"","sources":["../src/captura.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEtE,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"}
package/dist/captura.js CHANGED
@@ -3,11 +3,12 @@
3
3
  * JSON-RPC, sem normalizar nem tirar hash.
4
4
  *
5
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.
6
+ * `node:crypto` nem `node:child_process`, e nem o SDK em valor (só o tipo do
7
+ * transporte), então o subpath `/card/http` importa daqui sem levar o SDK ao
8
+ * bundle. A captura em memória, que precisa do SDK, mora em
9
+ * `captura-memoria.ts`. A trava e o card partem desta mesma captura — é o que
10
+ * permite provar que os dois não divergem.
9
11
  */
10
- import { InMemoryTransport } from "@modelcontextprotocol/server";
11
12
  /** O protocolo pedido no `initialize` de toda captura — fixo, para o eco não variar. */
12
13
  export const PROTOCOLO_DA_CAPTURA = "2025-06-18";
13
14
  /** Os parâmetros do `initialize` de toda captura. */
@@ -34,41 +35,4 @@ export async function capturarBrutaPor(pedir, cliente, notificar) {
34
35
  prompts: await lista("prompts/list", "prompts"),
35
36
  };
36
37
  }
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
38
  //# sourceMappingURL=captura.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"captura.js","sourceRoot":"","sources":["../src/captura.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"captura.js","sourceRoot":"","sources":["../src/captura.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,wFAAwF;AACxF,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC;AAmBjD,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;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAY,EAAE,OAAe,EAAE,SAAsB;IAC1F,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;QACL,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;AACJ,CAAC"}
@@ -0,0 +1,73 @@
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
+ *
23
+ * Este módulo é o subpath `@sbissoli/mcp-surface/card/http`: tudo do card
24
+ * MENOS a captura em memória, e por isso sem o SDK em valor. É o que importa
25
+ * quem captura por HTTP (a borda do sih, na frente do container) — o bundle
26
+ * não carrega o SDK que a borda não usa. `@sbissoli/mcp-surface/card`
27
+ * reexporta tudo daqui e acrescenta `capturarCard`. Os dois são seguros para
28
+ * Worker: sem `node:crypto`, sem `node:child_process`, sem Ajv.
29
+ */
30
+ import { type SuperficieBruta } from "./captura.js";
31
+ export type { ServidorConectavel, SuperficieBruta } from "./captura.js";
32
+ /** O campo `authentication` do card (forma da Smithery). */
33
+ export interface Autenticacao {
34
+ required: boolean;
35
+ schemes?: string[];
36
+ }
37
+ export interface OpcoesCard {
38
+ /** Quase sempre `autenticacaoDaTrava(trava)`; ausente = o card não fala de autenticação. */
39
+ authentication?: Autenticacao;
40
+ }
41
+ /**
42
+ * Monta o card a partir da captura crua. Recusa (lança) sem `serverInfo.name`
43
+ * e `serverInfo.version` — os dois obrigatórios da forma da Smithery: um card
44
+ * sem eles é pior que 404, porque o scanner o aceita e grava o vazio.
45
+ */
46
+ export declare function montarCard(bruta: SuperficieBruta, opcoes?: OpcoesCard): Record<string, unknown>;
47
+ /** A volta: o card como captura crua — para conferir contra a trava (`normalizarSuperficie`). */
48
+ export declare function superficieDoCard(card: Record<string, unknown>): SuperficieBruta;
49
+ /** A seção `semToken` de um `surface.lock.json` (o JSON importado ou uma `Trava`). */
50
+ interface TravaComSemToken {
51
+ semToken?: {
52
+ conteudo?: unknown;
53
+ } | undefined;
54
+ }
55
+ /**
56
+ * `authentication` derivado da trava: exige credencial se, na configuração de
57
+ * PRODUÇÃO (`apiKeyAusente`) e na rota pública (`POST /mcp`), `tools/list` NÃO
58
+ * responde sem token. Lança se a medição não está lá — card que afirma sem
59
+ * medida é o que este módulo existe para evitar.
60
+ */
61
+ export declare function autenticacaoDaTrava(trava: TravaComSemToken, config?: string, rota?: string): Autenticacao;
62
+ /**
63
+ * Card por HTTP stateless (JSON ou SSE) — para o servidor cuja superfície mora
64
+ * atrás de outro `fetch` (o container do sih). Um `initialize` que não responde
65
+ * faz `montarCard` lançar; o servidor decide o fallback.
66
+ */
67
+ export declare function capturarCardPorFetch(buscar: (req: Request) => Promise<Response>, url: string, opcoes?: OpcoesCard): Promise<Record<string, unknown>>;
68
+ /**
69
+ * Cache por isolate: a primeira montagem que DÁ CERTO fica; falha não é
70
+ * cacheada (lança de novo na próxima requisição). Devolve o JSON pronto.
71
+ */
72
+ export declare function cardEmCache(montar: () => Promise<Record<string, unknown>>): () => Promise<string>;
73
+ //# sourceMappingURL=card-http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-http.d.ts","sourceRoot":"","sources":["../src/card-http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAGtE,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;;;;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"}
@@ -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
+ *
23
+ * Este módulo é o subpath `@sbissoli/mcp-surface/card/http`: tudo do card
24
+ * MENOS a captura em memória, e por isso sem o SDK em valor. É o que importa
25
+ * quem captura por HTTP (a borda do sih, na frente do container) — o bundle
26
+ * não carrega o SDK que a borda não usa. `@sbissoli/mcp-surface/card`
27
+ * reexporta tudo daqui e acrescenta `capturarCard`. Os dois são seguros para
28
+ * Worker: sem `node:crypto`, sem `node:child_process`, sem Ajv.
29
+ */
30
+ import { capturarBrutaPor } from "./captura.js";
31
+ import { CABECALHOS_MCP, corpoDoPedido, lerCorpoJsonRpc } from "./sonda.js";
32
+ const LISTAS = ["tools", "resources", "resourceTemplates", "prompts"];
33
+ /**
34
+ * Monta o card a partir da captura crua. Recusa (lança) sem `serverInfo.name`
35
+ * e `serverInfo.version` — os dois obrigatórios da forma da Smithery: um card
36
+ * sem eles é pior que 404, porque o scanner o aceita e grava o vazio.
37
+ */
38
+ export function montarCard(bruta, opcoes = {}) {
39
+ const init = bruta.initialize;
40
+ const serverInfo = init?.["serverInfo"];
41
+ if (typeof serverInfo?.["name"] !== "string" || typeof serverInfo["version"] !== "string") {
42
+ throw new Error("server card: initialize sem serverInfo.name/serverInfo.version");
43
+ }
44
+ const card = {
45
+ serverInfo,
46
+ protocolVersion: init["protocolVersion"],
47
+ capabilities: init["capabilities"],
48
+ instructions: init["instructions"],
49
+ };
50
+ if (opcoes.authentication)
51
+ card["authentication"] = opcoes.authentication;
52
+ for (const chave of LISTAS)
53
+ if (bruta[chave])
54
+ card[chave] = bruta[chave];
55
+ return card;
56
+ }
57
+ /** A volta: o card como captura crua — para conferir contra a trava (`normalizarSuperficie`). */
58
+ export function superficieDoCard(card) {
59
+ const { serverInfo, protocolVersion, capabilities, instructions } = card;
60
+ const lista = (chave) => card[chave];
61
+ return {
62
+ initialize: { serverInfo, protocolVersion, capabilities, instructions },
63
+ tools: lista("tools"),
64
+ resources: lista("resources"),
65
+ resourceTemplates: lista("resourceTemplates"),
66
+ prompts: lista("prompts"),
67
+ };
68
+ }
69
+ /**
70
+ * `authentication` derivado da trava: exige credencial se, na configuração de
71
+ * PRODUÇÃO (`apiKeyAusente`) e na rota pública (`POST /mcp`), `tools/list` NÃO
72
+ * responde sem token. Lança se a medição não está lá — card que afirma sem
73
+ * medida é o que este módulo existe para evitar.
74
+ */
75
+ export function autenticacaoDaTrava(trava, config = "apiKeyAusente", rota = "POST /mcp") {
76
+ const conteudo = trava.semToken?.conteudo;
77
+ const medido = conteudo?.[config]?.[rota]?.["tools/list"];
78
+ if (typeof medido !== "boolean") {
79
+ throw new Error(`server card: trava sem semToken.conteudo["${config}"]["${rota}"]["tools/list"]`);
80
+ }
81
+ return { required: !medido };
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-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-http.js","sourceRoot":"","sources":["../src/card-http.ts"],"names":[],"mappings":"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"}
package/dist/card.d.ts CHANGED
@@ -1,71 +1,12 @@
1
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;
2
+ * `@sbissoli/mcp-surface/card`: o card inteiro — tudo de `/card/http` mais a
3
+ * captura em memória (`capturarCard`), que é o caminho dos servidores cujo
4
+ * Worker monta o próprio `McpServer` e, portanto, já carrega o SDK. O desenho
5
+ * e o porquê estão em `card-http.ts`.
6
+ */
7
+ import type { ServidorConectavel } from "./captura.js";
8
+ import { type OpcoesCard } from "./card-http.js";
9
+ export * from "./card-http.js";
58
10
  /** Card em memória: o servidor montado pela mesma fábrica dos transportes. */
59
11
  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
12
  //# sourceMappingURL=card.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../src/card.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE7D,cAAc,gBAAgB,CAAC;AAE/B,8EAA8E;AAC9E,wBAAsB,YAAY,CAAC,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAE,UAAe,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAExH"}
package/dist/card.js CHANGED
@@ -1,106 +1,14 @@
1
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
- }
2
+ * `@sbissoli/mcp-surface/card`: o card inteiro — tudo de `/card/http` mais a
3
+ * captura em memória (`capturarCard`), que é o caminho dos servidores cujo
4
+ * Worker monta o próprio `McpServer` e, portanto, já carrega o SDK. O desenho
5
+ * e o porquê estão em `card-http.ts`.
6
+ */
7
+ import { capturarBrutaEmMemoria } from "./captura-memoria.js";
8
+ import { montarCard } from "./card-http.js";
9
+ export * from "./card-http.js";
79
10
  /** Card em memória: o servidor montado pela mesma fábrica dos transportes. */
80
11
  export async function capturarCard(server, opcoes = {}) {
81
12
  return montarCard(await capturarBrutaEmMemoria(server, "server-card"), opcoes);
82
13
  }
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
14
  //# sourceMappingURL=card.js.map
package/dist/card.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"card.js","sourceRoot":"","sources":["../src/card.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"card.js","sourceRoot":"","sources":["../src/card.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAmB,MAAM,gBAAgB,CAAC;AAE7D,cAAc,gBAAgB,CAAC;AAE/B,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAA0B,EAAE,MAAM,GAAe,EAAE;IACpF,OAAO,UAAU,CAAC,MAAM,sBAAsB,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;AACjF,CAAC"}
package/dist/memoria.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * Captura em memória, normalizada: a captura crua de `captura.ts` passada pela
3
3
  * mesma normalização dos caminhos HTTP e stdio.
4
4
  */
5
- import { type ServidorConectavel } from "./captura.js";
5
+ import type { ServidorConectavel } from "./captura.js";
6
6
  export type { ServidorConectavel } from "./captura.js";
7
7
  export declare function capturarSuperficie(server: ServidorConectavel): Promise<Record<string, unknown>>;
8
8
  //# sourceMappingURL=memoria.d.ts.map
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"memoria.d.ts","sourceRoot":"","sources":["../src/memoria.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAIvD,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
@@ -2,7 +2,7 @@
2
2
  * Captura em memória, normalizada: a captura crua de `captura.ts` passada pela
3
3
  * mesma normalização dos caminhos HTTP e stdio.
4
4
  */
5
- import { capturarBrutaEmMemoria } from "./captura.js";
5
+ import { capturarBrutaEmMemoria } from "./captura-memoria.js";
6
6
  import { normalizarSuperficie } from "./superficie.js";
7
7
  export async function capturarSuperficie(server) {
8
8
  return normalizarSuperficie(await capturarBrutaEmMemoria(server, "surface-lock"));
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"memoria.js","sourceRoot":"","sources":["../src/memoria.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sbissoli/mcp-surface",
3
- "version": "0.3.0",
3
+ "version": "0.4.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",
@@ -25,6 +25,10 @@
25
25
  "./card": {
26
26
  "types": "./dist/card.d.ts",
27
27
  "default": "./dist/card.js"
28
+ },
29
+ "./card/http": {
30
+ "types": "./dist/card-http.d.ts",
31
+ "default": "./dist/card-http.js"
28
32
  }
29
33
  },
30
34
  "bin": {