@sbissoli/mcp-surface 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -0
- package/README.md +29 -0
- package/dist/cli.d.ts +4 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +5 -2
- package/dist/cli.js.map +1 -1
- package/dist/cliente.d.ts +173 -0
- package/dist/cliente.d.ts.map +1 -0
- package/dist/cliente.js +147 -0
- package/dist/cliente.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/replay.d.ts +7 -0
- package/dist/replay.d.ts.map +1 -1
- package/dist/replay.js +35 -6
- package/dist/replay.js.map +1 -1
- package/dist/verificar.d.ts +5 -0
- package/dist/verificar.d.ts.map +1 -1
- package/dist/verificar.js +10 -3
- package/dist/verificar.js.map +1 -1
- package/package.json +13 -2
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,43 @@ 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.2.0] — 2026-10-04
|
|
12
|
+
|
|
13
|
+
A normalização NÃO muda: todo `surface.lock.json` continua conferindo. Minor porque a
|
|
14
|
+
superfície publicada do pacote cresce (subpath novo).
|
|
15
|
+
|
|
16
|
+
### Adicionado
|
|
17
|
+
|
|
18
|
+
- **`@sbissoli/mcp-surface/cliente`**: o teste com forma de cliente, que nasceu no
|
|
19
|
+
ilo-mcp-server 1.3.0 (ideia de leitor, https://dev.to/arhancanli/comment/3g4i4).
|
|
20
|
+
`conectarComoCliente` (transporte em memória com JSON no fio), `chamarComoCliente`
|
|
21
|
+
(`tools/list` antes do `tools/call`, lança se o `Client` reprovar ou vier `isError`),
|
|
22
|
+
`controlesNegativos` (quebras derivadas do `outputSchema` listado, mais a armadilha do
|
|
23
|
+
`tools/list` ausente) e `quebrasDoSchema`. `@modelcontextprotocol/client` entra como peer
|
|
24
|
+
OPCIONAL; a raiz do pacote continua sem o `Client`, que o Worker não pode carregar.
|
|
25
|
+
|
|
26
|
+
## [0.1.1] — 2026-10-02
|
|
27
|
+
|
|
28
|
+
Achados da adoção nos irmãos, no mesmo dia. A normalização NÃO muda: todo
|
|
29
|
+
`surface.lock.json` travado com a 0.1.0 continua conferindo.
|
|
30
|
+
|
|
31
|
+
### Adicionado
|
|
32
|
+
|
|
33
|
+
- `verificar --perfil <chave>` (`OpcoesVerificar.perfil`): servidor com uma superfície por
|
|
34
|
+
rota (senado-br-mcp: `full` em `/mcp`, `openai-app` em `/mcp/openai-app-v2`) trava a
|
|
35
|
+
`declarada` como mapa `{ perfil: superfície }`, e o endpoint é conferido contra a chave
|
|
36
|
+
que ele serve.
|
|
37
|
+
- `linhaDeCompatibilidade(versao)`.
|
|
38
|
+
|
|
39
|
+
### Corrigido
|
|
40
|
+
|
|
41
|
+
- **O replay acusava como quebra fora de major uma mudança incompatível em minor de 0.x**,
|
|
42
|
+
que o semver permite (ilo-mcp-server 0.5.0 → 0.6.0, `filters` passou a obrigatório).
|
|
43
|
+
Em 0.x a linha de compatibilidade é o minor.
|
|
44
|
+
- O replay chamava `npm` com argumentos em array e `shell: true` no Windows — o DEP0190 do
|
|
45
|
+
Node 24 (argumentos concatenados sem escape). Agora a linha vai montada e citada.
|
|
46
|
+
- `bin` sem o `./`, que o npm corrigia sozinho a cada publicação com aviso.
|
|
47
|
+
|
|
11
48
|
## [0.1.0] — 2026-10-02
|
|
12
49
|
|
|
13
50
|
Primeira versão, extraída do molde no bcb-br-mcp (PR #49, 1.15.1). A normalização é a do
|
package/README.md
CHANGED
|
@@ -70,6 +70,35 @@ travar superfície nova sob a versão antiga.
|
|
|
70
70
|
Fluxo de quem muda a superfície: `npm version <nível> --no-git-tag-version` →
|
|
71
71
|
`npm run surface:lock` → commitar o lock junto.
|
|
72
72
|
|
|
73
|
+
## Teste com forma de cliente (`@sbissoli/mcp-surface/cliente`)
|
|
74
|
+
|
|
75
|
+
O servidor interrogado pelo `Client` do SDK, que reprova o resultado de `tools/call`
|
|
76
|
+
contra o `outputSchema` **listado**. Assim o teste falha como a sessão do usuário falharia,
|
|
77
|
+
sem um validador escolhido por nós. É subpath à parte porque o `Client` compila schemas
|
|
78
|
+
com Ajv (`new Function`), que o Worker proíbe: só se importa em teste Node, e o
|
|
79
|
+
`@modelcontextprotocol/client` é peer opcional.
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
import { chamarComoCliente, conectarComoCliente, controlesNegativos } from "@sbissoli/mcp-surface/cliente";
|
|
83
|
+
|
|
84
|
+
const client = await conectarComoCliente(buildServer(env));
|
|
85
|
+
const r = await chamarComoCliente(client, "minha_tool", { x: 1 }); // lança se o Client reprovar ou se vier isError
|
|
86
|
+
|
|
87
|
+
const vs = await controlesNegativos(() => buildServer(env), "minha_tool", { x: 1 });
|
|
88
|
+
for (const v of vs) expect(v.obtido, `${v.descricao}: ${v.mensagem ?? ""}`).toBe(v.esperado);
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
- `conectarComoCliente` passa toda mensagem do servidor por JSON antes de entregá-la: o
|
|
92
|
+
transporte em memória não serializa, e chave `undefined` só some no fio.
|
|
93
|
+
- `chamarComoCliente` faz `tools/list` antes do primeiro `tools/call` da conexão. Sem
|
|
94
|
+
isso, o `Client` (2.0 a 2.2) devolve o resultado sem validar.
|
|
95
|
+
- `controlesNegativos` adultera o resultado entre servidor e cliente, com quebras
|
|
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
|
|
98
|
+
último veredito é a armadilha (sem `tools/list`, a quebra passa calada); se o SDK mudar,
|
|
99
|
+
ele acusa. Quebras do próprio servidor, como campo a mais onde o schema fecha o objeto,
|
|
100
|
+
entram pelo 4º argumento.
|
|
101
|
+
|
|
73
102
|
## Observações
|
|
74
103
|
|
|
75
104
|
- Uma atualização do SDK que mexa nas `capabilities` também acende a trava — de propósito:
|
package/dist/cli.d.ts
CHANGED
|
@@ -9,9 +9,11 @@
|
|
|
9
9
|
* "surface:lock": "npm run build && mcp-surface travar --cmd \"vitest run tests/surface-lock.test.ts\""
|
|
10
10
|
*
|
|
11
11
|
* mcp-surface verificar <endpoint> [--trava surface.lock.json] [--config apiKeyAusente]
|
|
12
|
-
* [--rota "POST /mcp"] [--tool <nome>] [--args '<json>']
|
|
12
|
+
* [--rota "POST /mcp"] [--perfil <chave>] [--tool <nome>] [--args '<json>']
|
|
13
13
|
* Confere o endpoint no ar contra a trava (superfície declarada + quem
|
|
14
|
-
* responde sem token). Fim do deploy. Sai com 1 se divergir.
|
|
14
|
+
* responde sem token). Fim do deploy. Sai com 1 se divergir. `--perfil`:
|
|
15
|
+
* servidor com uma superfície por rota trava a `declarada` como mapa, e
|
|
16
|
+
* esta é a chave que o endpoint serve.
|
|
15
17
|
*
|
|
16
18
|
* mcp-surface replay [--pacote <nome npm>] [--registro <nome no MCP Registry>]
|
|
17
19
|
* [--url <endpoint>] [--saida baselines]
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;GAqBG"}
|
package/dist/cli.js
CHANGED
|
@@ -9,9 +9,11 @@
|
|
|
9
9
|
* "surface:lock": "npm run build && mcp-surface travar --cmd \"vitest run tests/surface-lock.test.ts\""
|
|
10
10
|
*
|
|
11
11
|
* mcp-surface verificar <endpoint> [--trava surface.lock.json] [--config apiKeyAusente]
|
|
12
|
-
* [--rota "POST /mcp"] [--tool <nome>] [--args '<json>']
|
|
12
|
+
* [--rota "POST /mcp"] [--perfil <chave>] [--tool <nome>] [--args '<json>']
|
|
13
13
|
* Confere o endpoint no ar contra a trava (superfície declarada + quem
|
|
14
|
-
* responde sem token). Fim do deploy. Sai com 1 se divergir.
|
|
14
|
+
* responde sem token). Fim do deploy. Sai com 1 se divergir. `--perfil`:
|
|
15
|
+
* servidor com uma superfície por rota trava a `declarada` como mapa, e
|
|
16
|
+
* esta é a chave que o endpoint serve.
|
|
15
17
|
*
|
|
16
18
|
* mcp-surface replay [--pacote <nome npm>] [--registro <nome no MCP Registry>]
|
|
17
19
|
* [--url <endpoint>] [--saida baselines]
|
|
@@ -63,6 +65,7 @@ async function main() {
|
|
|
63
65
|
caminhoDaTrava: opcao("trava") ?? "surface.lock.json",
|
|
64
66
|
...(opcao("config") ? { config: opcao("config") } : {}),
|
|
65
67
|
...(opcao("rota") ? { rota: opcao("rota") } : {}),
|
|
68
|
+
...(opcao("perfil") ? { perfil: opcao("perfil") } : {}),
|
|
66
69
|
...(tool ? { chamada: { name: tool, arguments: JSON.parse(opcao("args") ?? "{}") } } : {}),
|
|
67
70
|
log: linha => console.log(linha),
|
|
68
71
|
});
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Teste com forma de cliente: o servidor interrogado pelo `Client` do SDK, que
|
|
3
|
+
* reprova o resultado de `tools/call` contra o `outputSchema` LISTADO — o teste
|
|
4
|
+
* falha como a sessão do usuário falharia, sem validador escolhido por nós.
|
|
5
|
+
*
|
|
6
|
+
* Ideia de leitor (https://dev.to/arhancanli/comment/3g4i4); o circuito nasceu
|
|
7
|
+
* no ilo-mcp-server 1.3.0 e mora aqui para os sete servidores o usarem igual.
|
|
8
|
+
*
|
|
9
|
+
* Subpath próprio (`@sbissoli/mcp-surface/cliente`), fora da raiz do pacote: o
|
|
10
|
+
* `Client` compila os schemas com Ajv (`new Function`), que o runtime da
|
|
11
|
+
* Cloudflare proíbe. Importar daqui é coisa de teste em Node, nunca de Worker.
|
|
12
|
+
*
|
|
13
|
+
* Duas armadilhas que este módulo fecha, medidas no ilo:
|
|
14
|
+
* - o `Client` só valida contra o schema que tem em cache do `tools/list` —
|
|
15
|
+
* sem `listTools` antes, `callTool` devolve o que recebeu sem validar;
|
|
16
|
+
* - o `InMemoryTransport` não serializa: chave `undefined` sobrevive em memória
|
|
17
|
+
* e some no fio (`JSON.stringify`). Aqui toda mensagem do servidor passa por
|
|
18
|
+
* JSON antes de chegar ao cliente, como passaria pela rede.
|
|
19
|
+
*/
|
|
20
|
+
import { Client } from "@modelcontextprotocol/client";
|
|
21
|
+
import type { ServidorConectavel } from "./memoria.js";
|
|
22
|
+
/** Resultado de `tools/call` como viaja no fio (o que uma quebra recebe). */
|
|
23
|
+
export type ResultadoNoFio = {
|
|
24
|
+
content?: unknown;
|
|
25
|
+
structuredContent?: Record<string, unknown>;
|
|
26
|
+
} & Record<string, unknown>;
|
|
27
|
+
export interface OpcoesConexao {
|
|
28
|
+
/** Mexe no resultado de `tools/call` entre servidor e cliente (controle negativo). */
|
|
29
|
+
adulterar?: (r: ResultadoNoFio) => void;
|
|
30
|
+
}
|
|
31
|
+
export declare function conectarComoCliente(server: ServidorConectavel, opcoes?: OpcoesConexao): Promise<Client>;
|
|
32
|
+
/**
|
|
33
|
+
* Chamada que TEM de dar certo, no percurso do cliente. Lança quando o `Client`
|
|
34
|
+
* reprova o resultado e também quando a tool responde `isError` — o servidor do
|
|
35
|
+
* SDK v2 valida a própria saída e, se ela não obedece, devolve o erro em
|
|
36
|
+
* `isError` ("Output validation error"), não em exceção. Para afirmar uma
|
|
37
|
+
* recusa de propósito (parâmetro inválido), use `client.callTool` direto.
|
|
38
|
+
*/
|
|
39
|
+
export declare function chamarComoCliente(client: Client, nome: string, args?: Record<string, unknown>): Promise<{
|
|
40
|
+
[x: string]: unknown;
|
|
41
|
+
_meta?: {
|
|
42
|
+
[x: string]: unknown;
|
|
43
|
+
"io.modelcontextprotocol/serverInfo"?: {
|
|
44
|
+
version: string;
|
|
45
|
+
websiteUrl?: string | undefined;
|
|
46
|
+
description?: string | undefined;
|
|
47
|
+
icons?: {
|
|
48
|
+
src: string;
|
|
49
|
+
mimeType?: string | undefined;
|
|
50
|
+
sizes?: string[] | undefined;
|
|
51
|
+
theme?: "dark" | "light" | undefined;
|
|
52
|
+
}[] | undefined;
|
|
53
|
+
name: string;
|
|
54
|
+
title?: string | undefined;
|
|
55
|
+
} | undefined;
|
|
56
|
+
} | undefined;
|
|
57
|
+
content: ({
|
|
58
|
+
type: "text";
|
|
59
|
+
text: string;
|
|
60
|
+
annotations?: {
|
|
61
|
+
audience?: ("assistant" | "user")[] | undefined;
|
|
62
|
+
priority?: number | undefined;
|
|
63
|
+
lastModified?: string | undefined;
|
|
64
|
+
} | undefined;
|
|
65
|
+
_meta?: {
|
|
66
|
+
[x: string]: unknown;
|
|
67
|
+
} | undefined;
|
|
68
|
+
} | {
|
|
69
|
+
type: "image";
|
|
70
|
+
data: string;
|
|
71
|
+
mimeType: string;
|
|
72
|
+
annotations?: {
|
|
73
|
+
audience?: ("assistant" | "user")[] | undefined;
|
|
74
|
+
priority?: number | undefined;
|
|
75
|
+
lastModified?: string | undefined;
|
|
76
|
+
} | undefined;
|
|
77
|
+
_meta?: {
|
|
78
|
+
[x: string]: unknown;
|
|
79
|
+
} | undefined;
|
|
80
|
+
} | {
|
|
81
|
+
type: "audio";
|
|
82
|
+
data: string;
|
|
83
|
+
mimeType: string;
|
|
84
|
+
annotations?: {
|
|
85
|
+
audience?: ("assistant" | "user")[] | undefined;
|
|
86
|
+
priority?: number | undefined;
|
|
87
|
+
lastModified?: string | undefined;
|
|
88
|
+
} | undefined;
|
|
89
|
+
_meta?: {
|
|
90
|
+
[x: string]: unknown;
|
|
91
|
+
} | undefined;
|
|
92
|
+
} | {
|
|
93
|
+
uri: string;
|
|
94
|
+
description?: string | undefined;
|
|
95
|
+
mimeType?: string | undefined;
|
|
96
|
+
size?: number | undefined;
|
|
97
|
+
annotations?: {
|
|
98
|
+
audience?: ("assistant" | "user")[] | undefined;
|
|
99
|
+
priority?: number | undefined;
|
|
100
|
+
lastModified?: string | undefined;
|
|
101
|
+
} | undefined;
|
|
102
|
+
_meta?: {
|
|
103
|
+
[x: string]: unknown;
|
|
104
|
+
} | undefined;
|
|
105
|
+
icons?: {
|
|
106
|
+
src: string;
|
|
107
|
+
mimeType?: string | undefined;
|
|
108
|
+
sizes?: string[] | undefined;
|
|
109
|
+
theme?: "dark" | "light" | undefined;
|
|
110
|
+
}[] | undefined;
|
|
111
|
+
name: string;
|
|
112
|
+
title?: string | undefined;
|
|
113
|
+
type: "resource_link";
|
|
114
|
+
} | {
|
|
115
|
+
type: "resource";
|
|
116
|
+
resource: {
|
|
117
|
+
uri: string;
|
|
118
|
+
mimeType?: string | undefined;
|
|
119
|
+
_meta?: {
|
|
120
|
+
[x: string]: unknown;
|
|
121
|
+
} | undefined;
|
|
122
|
+
text: string;
|
|
123
|
+
} | {
|
|
124
|
+
uri: string;
|
|
125
|
+
mimeType?: string | undefined;
|
|
126
|
+
_meta?: {
|
|
127
|
+
[x: string]: unknown;
|
|
128
|
+
} | undefined;
|
|
129
|
+
blob: string;
|
|
130
|
+
};
|
|
131
|
+
annotations?: {
|
|
132
|
+
audience?: ("assistant" | "user")[] | undefined;
|
|
133
|
+
priority?: number | undefined;
|
|
134
|
+
lastModified?: string | undefined;
|
|
135
|
+
} | undefined;
|
|
136
|
+
_meta?: {
|
|
137
|
+
[x: string]: unknown;
|
|
138
|
+
} | undefined;
|
|
139
|
+
})[];
|
|
140
|
+
structuredContent?: unknown;
|
|
141
|
+
isError?: boolean | undefined;
|
|
142
|
+
}>;
|
|
143
|
+
export interface Quebra {
|
|
144
|
+
descricao: string;
|
|
145
|
+
adulterar: (r: ResultadoNoFio) => void;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
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.
|
|
151
|
+
*/
|
|
152
|
+
export declare function quebrasDoSchema(outputSchema: Record<string, unknown>): Quebra[];
|
|
153
|
+
export interface Veredito {
|
|
154
|
+
descricao: string;
|
|
155
|
+
/** O que o circuito exige: o cliente reprovar a quebra (ou, na armadilha, deixá-la passar). */
|
|
156
|
+
esperado: "reprova" | "passa";
|
|
157
|
+
/** `isError`: a chamada-base falhou como tool — o caso está mal montado. */
|
|
158
|
+
obtido: "reprova" | "passa" | "isError";
|
|
159
|
+
mensagem?: string;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Controle negativo pelo lado do resultado: o servidor responde certo, o que
|
|
163
|
+
* chega ao cliente está quebrado, e a chamada TEM de falhar. Um servidor novo
|
|
164
|
+
* por quebra (`fabrica`), porque cada conexão leva a sua adulteração.
|
|
165
|
+
*
|
|
166
|
+
* Inclui a armadilha como veredito esperado "passa": sem `tools/list` antes, a
|
|
167
|
+
* primeira quebra passa calada. Se um dia o SDK passar a validar sem a lista,
|
|
168
|
+
* esse veredito acusa — e a regra do `listTools` pode ser revista.
|
|
169
|
+
*
|
|
170
|
+
* O teste afirma `obtido === esperado` em cada veredito; a `descricao` diz qual.
|
|
171
|
+
*/
|
|
172
|
+
export declare function controlesNegativos(fabrica: () => ServidorConectavel | Promise<ServidorConectavel>, nome: string, args?: Record<string, unknown>, extras?: Quebra[]): Promise<Veredito[]>;
|
|
173
|
+
//# sourceMappingURL=cliente.d.ts.map
|
|
@@ -0,0 +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"}
|
package/dist/cliente.js
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Teste com forma de cliente: o servidor interrogado pelo `Client` do SDK, que
|
|
3
|
+
* reprova o resultado de `tools/call` contra o `outputSchema` LISTADO — o teste
|
|
4
|
+
* falha como a sessão do usuário falharia, sem validador escolhido por nós.
|
|
5
|
+
*
|
|
6
|
+
* Ideia de leitor (https://dev.to/arhancanli/comment/3g4i4); o circuito nasceu
|
|
7
|
+
* no ilo-mcp-server 1.3.0 e mora aqui para os sete servidores o usarem igual.
|
|
8
|
+
*
|
|
9
|
+
* Subpath próprio (`@sbissoli/mcp-surface/cliente`), fora da raiz do pacote: o
|
|
10
|
+
* `Client` compila os schemas com Ajv (`new Function`), que o runtime da
|
|
11
|
+
* Cloudflare proíbe. Importar daqui é coisa de teste em Node, nunca de Worker.
|
|
12
|
+
*
|
|
13
|
+
* Duas armadilhas que este módulo fecha, medidas no ilo:
|
|
14
|
+
* - o `Client` só valida contra o schema que tem em cache do `tools/list` —
|
|
15
|
+
* sem `listTools` antes, `callTool` devolve o que recebeu sem validar;
|
|
16
|
+
* - o `InMemoryTransport` não serializa: chave `undefined` sobrevive em memória
|
|
17
|
+
* e some no fio (`JSON.stringify`). Aqui toda mensagem do servidor passa por
|
|
18
|
+
* JSON antes de chegar ao cliente, como passaria pela rede.
|
|
19
|
+
*/
|
|
20
|
+
import { Client } from "@modelcontextprotocol/client";
|
|
21
|
+
import { InMemoryTransport } from "@modelcontextprotocol/server";
|
|
22
|
+
const listados = new WeakSet();
|
|
23
|
+
export async function conectarComoCliente(server, opcoes = {}) {
|
|
24
|
+
const [lado, ladoServidor] = InMemoryTransport.createLinkedPair();
|
|
25
|
+
const enviar = ladoServidor.send.bind(ladoServidor);
|
|
26
|
+
ladoServidor.send = async (mensagem, extra) => {
|
|
27
|
+
const noFio = JSON.parse(JSON.stringify(mensagem));
|
|
28
|
+
const r = noFio.result;
|
|
29
|
+
if (opcoes.adulterar && r && "content" in r)
|
|
30
|
+
opcoes.adulterar(r);
|
|
31
|
+
return enviar(noFio, extra);
|
|
32
|
+
};
|
|
33
|
+
const client = new Client({ name: "mcp-surface/cliente", version: "0.0.0" });
|
|
34
|
+
await Promise.all([server.connect(ladoServidor), client.connect(lado)]);
|
|
35
|
+
return client;
|
|
36
|
+
}
|
|
37
|
+
/** O percurso do cliente: `tools/list` (uma vez por conexão) → `tools/call`. */
|
|
38
|
+
async function percorrer(client, nome, args) {
|
|
39
|
+
if (!listados.has(client)) {
|
|
40
|
+
await client.listTools();
|
|
41
|
+
listados.add(client);
|
|
42
|
+
}
|
|
43
|
+
return client.callTool({ name: nome, arguments: args });
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Chamada que TEM de dar certo, no percurso do cliente. Lança quando o `Client`
|
|
47
|
+
* reprova o resultado e também quando a tool responde `isError` — o servidor do
|
|
48
|
+
* SDK v2 valida a própria saída e, se ela não obedece, devolve o erro em
|
|
49
|
+
* `isError` ("Output validation error"), não em exceção. Para afirmar uma
|
|
50
|
+
* recusa de propósito (parâmetro inválido), use `client.callTool` direto.
|
|
51
|
+
*/
|
|
52
|
+
export async function chamarComoCliente(client, nome, args = {}) {
|
|
53
|
+
const r = await percorrer(client, nome, args);
|
|
54
|
+
if (r.isError) {
|
|
55
|
+
const texto = Array.isArray(r.content) ? r.content.map(c => ("text" in c ? c.text : "")).join(" ") : "";
|
|
56
|
+
throw new Error(`${nome} respondeu isError: ${texto}`);
|
|
57
|
+
}
|
|
58
|
+
return r;
|
|
59
|
+
}
|
|
60
|
+
/** Um valor do tipo errado para o tipo JSON Schema declarado. */
|
|
61
|
+
function tipoErrado(tipo) {
|
|
62
|
+
if (tipo === "string")
|
|
63
|
+
return 0;
|
|
64
|
+
if (typeof tipo === "string")
|
|
65
|
+
return "valor-de-tipo-errado";
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 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.
|
|
72
|
+
*/
|
|
73
|
+
export function quebrasDoSchema(outputSchema) {
|
|
74
|
+
const obrigatorios = Array.isArray(outputSchema.required) ? outputSchema.required : [];
|
|
75
|
+
const props = (outputSchema.properties ?? {});
|
|
76
|
+
const quebras = [
|
|
77
|
+
{ descricao: "structuredContent ausente", adulterar: r => void delete r.structuredContent },
|
|
78
|
+
...obrigatorios.map(campo => ({
|
|
79
|
+
descricao: `campo obrigatório ausente (${campo})`,
|
|
80
|
+
adulterar: (r) => void delete r.structuredContent?.[campo],
|
|
81
|
+
})),
|
|
82
|
+
];
|
|
83
|
+
const tipado = obrigatorios.find(c => tipoErrado(props[c]?.type) !== undefined);
|
|
84
|
+
if (tipado) {
|
|
85
|
+
quebras.push({
|
|
86
|
+
descricao: `campo de tipo errado (${tipado})`,
|
|
87
|
+
adulterar: r => {
|
|
88
|
+
if (r.structuredContent)
|
|
89
|
+
r.structuredContent[tipado] = tipoErrado(props[tipado]?.type);
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return quebras;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Controle negativo pelo lado do resultado: o servidor responde certo, o que
|
|
97
|
+
* chega ao cliente está quebrado, e a chamada TEM de falhar. Um servidor novo
|
|
98
|
+
* por quebra (`fabrica`), porque cada conexão leva a sua adulteração.
|
|
99
|
+
*
|
|
100
|
+
* Inclui a armadilha como veredito esperado "passa": sem `tools/list` antes, a
|
|
101
|
+
* primeira quebra passa calada. Se um dia o SDK passar a validar sem a lista,
|
|
102
|
+
* esse veredito acusa — e a regra do `listTools` pode ser revista.
|
|
103
|
+
*
|
|
104
|
+
* O teste afirma `obtido === esperado` em cada veredito; a `descricao` diz qual.
|
|
105
|
+
*/
|
|
106
|
+
export async function controlesNegativos(fabrica, nome, args = {}, extras = []) {
|
|
107
|
+
const sonda = await conectarComoCliente(await fabrica());
|
|
108
|
+
let schema;
|
|
109
|
+
try {
|
|
110
|
+
const { tools } = await sonda.listTools();
|
|
111
|
+
schema = tools.find(t => t.name === nome)?.outputSchema;
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
await sonda.close();
|
|
115
|
+
}
|
|
116
|
+
if (!schema)
|
|
117
|
+
throw new Error(`${nome}: sem outputSchema no tools/list — não há contrato a provar`);
|
|
118
|
+
const quebras = [...quebrasDoSchema(schema), ...extras];
|
|
119
|
+
const rodar = async (q, listar) => {
|
|
120
|
+
const client = await conectarComoCliente(await fabrica(), { adulterar: q.adulterar });
|
|
121
|
+
try {
|
|
122
|
+
const r = listar ? await percorrer(client, nome, args) : await client.callTool({ name: nome, arguments: args });
|
|
123
|
+
// Erro de tool NÃO é reprovação do validador: a chamada-base tem de dar
|
|
124
|
+
// certo, ou o controle não prova nada — veredito que nunca confere.
|
|
125
|
+
if (r.isError)
|
|
126
|
+
return { obtido: "isError", mensagem: JSON.stringify(r.content) };
|
|
127
|
+
return { obtido: "passa" };
|
|
128
|
+
}
|
|
129
|
+
catch (e) {
|
|
130
|
+
return { obtido: "reprova", mensagem: e instanceof Error ? e.message : String(e) };
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
await client.close();
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
const vereditos = [];
|
|
137
|
+
for (const q of quebras)
|
|
138
|
+
vereditos.push({ descricao: q.descricao, esperado: "reprova", ...(await rodar(q, true)) });
|
|
139
|
+
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;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=cliente.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliente.js","sourceRoot":"","sources":["../src/cliente.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,5 +4,5 @@ export { CABECALHOS_MCP, comHost, corpoDoPedido, ipDaSonda, lerCorpoJsonRpc, med
|
|
|
4
4
|
export { VAR_ESCRITA, conferirSecao, lerTrava, modoEscrita, type NomeDaSecao, type Trava, type Veredito } from "./trava.js";
|
|
5
5
|
export { capturarHttp, capturarStdio, pedirHttp } from "./remoto.js";
|
|
6
6
|
export { verificarNoAr, type OpcoesVerificar } from "./verificar.js";
|
|
7
|
-
export { diferenca, replay, type OpcoesReplay } from "./replay.js";
|
|
7
|
+
export { diferenca, linhaDeCompatibilidade, replay, type OpcoesReplay } from "./replay.js";
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EACL,cAAc,EACd,OAAO,EACP,aAAa,EACb,SAAS,EACT,eAAe,EACf,aAAa,EACb,SAAS,EACT,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,MAAM,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,KAAK,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC5H,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EACL,cAAc,EACd,OAAO,EACP,aAAa,EACb,SAAS,EACT,eAAe,EACf,aAAa,EACb,SAAS,EACT,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,MAAM,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,KAAK,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC5H,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,5 +4,5 @@ export { CABECALHOS_MCP, comHost, corpoDoPedido, ipDaSonda, lerCorpoJsonRpc, med
|
|
|
4
4
|
export { VAR_ESCRITA, conferirSecao, lerTrava, modoEscrita } from "./trava.js";
|
|
5
5
|
export { capturarHttp, capturarStdio, pedirHttp } from "./remoto.js";
|
|
6
6
|
export { verificarNoAr } from "./verificar.js";
|
|
7
|
-
export { diferenca, replay } from "./replay.js";
|
|
7
|
+
export { diferenca, linhaDeCompatibilidade, replay } from "./replay.js";
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,GAEnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAA2B,MAAM,cAAc,CAAC;AAC3E,OAAO,EACL,cAAc,EACd,OAAO,EACP,aAAa,EACb,SAAS,EACT,eAAe,EACf,aAAa,EACb,SAAS,EACT,aAAa,GAGd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAA+C,MAAM,YAAY,CAAC;AAC5H,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,aAAa,EAAwB,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAqB,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,GAEnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAA2B,MAAM,cAAc,CAAC;AAC3E,OAAO,EACL,cAAc,EACd,OAAO,EACP,aAAa,EACb,SAAS,EACT,eAAe,EACf,aAAa,EACb,SAAS,EACT,aAAa,GAGd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAA+C,MAAM,YAAY,CAAC;AAC5H,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,aAAa,EAAwB,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,EAAqB,MAAM,aAAa,CAAC"}
|
package/dist/replay.d.ts
CHANGED
|
@@ -40,6 +40,13 @@ export declare function diferenca(antes: Item, depois: Item): {
|
|
|
40
40
|
capabilities: boolean;
|
|
41
41
|
identidade: boolean;
|
|
42
42
|
};
|
|
43
|
+
/**
|
|
44
|
+
* A linha de compatibilidade da versão: o major — e, em 0.x, o minor, porque
|
|
45
|
+
* no semver de série 0 mudança incompatível em minor é permitida. Medido no
|
|
46
|
+
* replay do ilo-mcp-server (0.5.0 → 0.6.0 tornou `filters` obrigatório): a
|
|
47
|
+
* 0.1.0 do pacote listava isso como quebra fora de major.
|
|
48
|
+
*/
|
|
49
|
+
export declare function linhaDeCompatibilidade(v: string): string;
|
|
43
50
|
export declare function replay(o: OpcoesReplay): Promise<{
|
|
44
51
|
markdown: string;
|
|
45
52
|
json: unknown;
|
package/dist/replay.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAqBH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAWD,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAYpC,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI;;QAEtC,IAAI,EAAQ,MAAM,EAAE;QAAE,KAAK,EAAQ,MAAM,EAAE;QAAE,KAAK,EAAQ,MAAM,EAAE;;;QAC9D,IAAI,EAAQ,MAAM,EAAE;QAAE,KAAK,EAAQ,MAAM,EAAE;;;QAC7C,IAAI,EAAQ,MAAM,EAAE;QAAE,KAAK,EAAQ,MAAM,EAAE;;aACvC,MAAM,EAAE;;;;EA2C1B;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED,wBAAsB,MAAM,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAoJ1F"}
|
package/dist/replay.js
CHANGED
|
@@ -15,9 +15,19 @@ import { tmpdir } from "node:os";
|
|
|
15
15
|
import { join } from "node:path";
|
|
16
16
|
import { capturarHttp, capturarStdio } from "./remoto.js";
|
|
17
17
|
import { impressaoDigital } from "./superficie.js";
|
|
18
|
-
|
|
18
|
+
/**
|
|
19
|
+
* `npm` como processo filho. No Windows o executável é `npm.cmd`, que o Node
|
|
20
|
+
* só roda com `shell: true` — e com shell os argumentos têm de ir JÁ numa
|
|
21
|
+
* linha de comando (passá-los em array é o DEP0190 do Node 24).
|
|
22
|
+
*/
|
|
23
|
+
function rodarNpm(argv) {
|
|
24
|
+
if (process.platform !== "win32")
|
|
25
|
+
return spawnSync("npm", argv, { encoding: "utf8" });
|
|
26
|
+
const linha = ["npm", ...argv.map(a => (/[\s"&|<>^]/.test(a) ? `"${a.replaceAll('"', '\\"')}"` : a))].join(" ");
|
|
27
|
+
return spawnSync(linha, { encoding: "utf8", shell: true });
|
|
28
|
+
}
|
|
19
29
|
function npmJson(...argv) {
|
|
20
|
-
const r =
|
|
30
|
+
const r = rodarNpm(argv);
|
|
21
31
|
if (r.status !== 0)
|
|
22
32
|
throw new Error(`npm ${argv.join(" ")}: ${r.stderr}`);
|
|
23
33
|
return JSON.parse(r.stdout);
|
|
@@ -82,7 +92,16 @@ export function diferenca(antes, depois) {
|
|
|
82
92
|
r.identidade = impressaoDigital(init(antes)["serverInfo"]) !== impressaoDigital(init(depois)["serverInfo"]);
|
|
83
93
|
return r;
|
|
84
94
|
}
|
|
85
|
-
|
|
95
|
+
/**
|
|
96
|
+
* A linha de compatibilidade da versão: o major — e, em 0.x, o minor, porque
|
|
97
|
+
* no semver de série 0 mudança incompatível em minor é permitida. Medido no
|
|
98
|
+
* replay do ilo-mcp-server (0.5.0 → 0.6.0 tornou `filters` obrigatório): a
|
|
99
|
+
* 0.1.0 do pacote listava isso como quebra fora de major.
|
|
100
|
+
*/
|
|
101
|
+
export function linhaDeCompatibilidade(v) {
|
|
102
|
+
const [maior, menor] = v.split(".");
|
|
103
|
+
return maior === "0" ? `0.${menor}` : String(maior);
|
|
104
|
+
}
|
|
86
105
|
export async function replay(o) {
|
|
87
106
|
const log = o.log ?? (() => { });
|
|
88
107
|
const versoes = npmJson("view", o.pacote, "versions", "--json");
|
|
@@ -103,7 +122,17 @@ export async function replay(o) {
|
|
|
103
122
|
const base = { versao: v, data: datas[v]?.slice(0, 10), noRegistro: registro.has(v) };
|
|
104
123
|
const dir = mkdtempSync(join(tmpdir(), "mcp-surface-replay-"));
|
|
105
124
|
try {
|
|
106
|
-
const inst =
|
|
125
|
+
const inst = rodarNpm([
|
|
126
|
+
"install",
|
|
127
|
+
`${o.pacote}@${v}`,
|
|
128
|
+
"--prefix",
|
|
129
|
+
dir,
|
|
130
|
+
"--omit=dev",
|
|
131
|
+
"--ignore-scripts",
|
|
132
|
+
"--no-audit",
|
|
133
|
+
"--no-fund",
|
|
134
|
+
"--loglevel=error",
|
|
135
|
+
]);
|
|
107
136
|
if (inst.status !== 0)
|
|
108
137
|
throw new Error(inst.stderr.trim().split("\n").pop());
|
|
109
138
|
const pasta = join(dir, "node_modules", ...o.pacote.split("/"));
|
|
@@ -182,7 +211,7 @@ export async function replay(o) {
|
|
|
182
211
|
if (d.identidade)
|
|
183
212
|
partes.push("identidade");
|
|
184
213
|
mudou = l.sha256 === anterior.sha256 ? "nada" : partes.join("; ") || "detalhe de normalização";
|
|
185
|
-
if (d.quebras.length &&
|
|
214
|
+
if (d.quebras.length && linhaDeCompatibilidade(l.versao) === linhaDeCompatibilidade(anterior.versao)) {
|
|
186
215
|
quebras.push({ de: anterior.versao, para: l.versao, itens: d.quebras });
|
|
187
216
|
}
|
|
188
217
|
}
|
|
@@ -190,7 +219,7 @@ export async function replay(o) {
|
|
|
190
219
|
anterior = l;
|
|
191
220
|
}
|
|
192
221
|
md.push("", "## Remoções fora de versão major", "");
|
|
193
|
-
md.push("Tool, resource ou prompt removido, parâmetro removido ou parâmetro que passou a obrigatório quebra o cliente que dependia dele; pela convenção de versão isso pede major. Listado sem julgamento — cada caso pode ter tido razão registrada no CHANGELOG.", "");
|
|
222
|
+
md.push("Tool, resource ou prompt removido, parâmetro removido ou parâmetro que passou a obrigatório quebra o cliente que dependia dele; pela convenção de versão isso pede major (em 0.x, minor). Listado sem julgamento — cada caso pode ter tido razão registrada no CHANGELOG.", "");
|
|
194
223
|
if (!quebras.length)
|
|
195
224
|
md.push("Nenhuma.");
|
|
196
225
|
for (const q of quebras)
|
package/dist/replay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"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"}
|
package/dist/verificar.d.ts
CHANGED
|
@@ -10,6 +10,11 @@ export interface OpcoesVerificar {
|
|
|
10
10
|
config?: string;
|
|
11
11
|
/** Rota da seção `semToken` que corresponde a `url`. Padrão: `POST /mcp`. */
|
|
12
12
|
rota?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Servidor com mais de uma superfície (perfis por rota): a `declarada` é um
|
|
15
|
+
* mapa `{ perfil: superfície }` e esta é a chave que `url` serve.
|
|
16
|
+
*/
|
|
17
|
+
perfil?: string;
|
|
13
18
|
/** A mesma tool local que a trava sondou; sem ela, `tools/call` não é conferido. */
|
|
14
19
|
chamada?: ChamadaLocal;
|
|
15
20
|
tentativas?: number;
|
package/dist/verificar.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verificar.d.ts","sourceRoot":"","sources":["../src/verificar.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI9D,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,2FAA2F;IAC3F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oFAAoF;IACpF,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED,+EAA+E;AAC/E,wBAAsB,aAAa,CAAC,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"verificar.d.ts","sourceRoot":"","sources":["../src/verificar.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI9D,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,2FAA2F;IAC3F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oFAAoF;IACpF,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED,+EAA+E;AAC/E,wBAAsB,aAAa,CAAC,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2C9E"}
|
package/dist/verificar.js
CHANGED
|
@@ -18,6 +18,13 @@ export async function verificarNoAr(o) {
|
|
|
18
18
|
return `surface.lock.json incompleto: falta a seção declarada ou semToken["${config}"]["${rota}"].`;
|
|
19
19
|
}
|
|
20
20
|
const sonda = sondaSemToken(o.chamada).filter(p => p.method in semToken);
|
|
21
|
+
let esperado = declarada.sha256;
|
|
22
|
+
if (o.perfil !== undefined) {
|
|
23
|
+
const porPerfil = declarada.conteudo?.[o.perfil];
|
|
24
|
+
if (porPerfil === undefined)
|
|
25
|
+
return `surface.lock.json: a seção declarada não tem o perfil "${o.perfil}".`;
|
|
26
|
+
esperado = impressaoDigital(porPerfil);
|
|
27
|
+
}
|
|
21
28
|
const tentativas = o.tentativas ?? 6;
|
|
22
29
|
let ultimo = "";
|
|
23
30
|
for (let t = 1; t <= tentativas; t++) {
|
|
@@ -29,13 +36,13 @@ export async function verificarNoAr(o) {
|
|
|
29
36
|
if (responde !== semToken[pedido.method])
|
|
30
37
|
divergentes.push(`${pedido.method} (no ar ${responde})`);
|
|
31
38
|
}
|
|
32
|
-
if (sha ===
|
|
33
|
-
log(`no ar = trava: declarada ${sha.slice(0, 12)} (travada em ${declarada.versao}); ` +
|
|
39
|
+
if (sha === esperado && divergentes.length === 0) {
|
|
40
|
+
log(`no ar = trava: declarada${o.perfil !== undefined ? ` [${o.perfil}]` : ""} ${sha.slice(0, 12)} (travada em ${declarada.versao}); ` +
|
|
34
41
|
`sem token: ${config}/${rota} confere em ${sonda.length} métodos.`);
|
|
35
42
|
return null;
|
|
36
43
|
}
|
|
37
44
|
ultimo =
|
|
38
|
-
(sha !==
|
|
45
|
+
(sha !== esperado ? `declarada no ar ${sha.slice(0, 12)} ≠ trava ${esperado.slice(0, 12)}. ` : "") +
|
|
39
46
|
(divergentes.length ? `sem token diverge em: ${divergentes.join(", ")}.` : "");
|
|
40
47
|
log(`tentativa ${t}: ${ultimo}`);
|
|
41
48
|
// A Cloudflare serve isolates mistos por alguns segundos logo após o deploy.
|
package/dist/verificar.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verificar.js","sourceRoot":"","sources":["../src/verificar.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,aAAa,EAAqB,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"verificar.js","sourceRoot":"","sources":["../src/verificar.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,aAAa,EAAqB,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAqBtC,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,CAAkB;IACpD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,eAAe,CAAC;IAC3C,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,WAAW,CAAC;IACnC,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IAClC,MAAM,QAAQ,GAAI,KAAK,CAAC,QAAQ,EAAE,QAAgF,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IACrI,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,OAAO,sEAAsE,MAAM,OAAO,IAAI,KAAK,CAAC;IACtG,CAAC;IACD,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC;IACzE,IAAI,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC;IAChC,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAI,SAAS,CAAC,QAA2C,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACrF,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,0DAA0D,CAAC,CAAC,MAAM,IAAI,CAAC;QAC3G,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;IACrC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACzC,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;YAC5D,IAAI,QAAQ,KAAK,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;gBAAE,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,WAAW,QAAQ,GAAG,CAAC,CAAC;QACrG,CAAC;QACD,IAAI,GAAG,KAAK,QAAQ,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjD,GAAG,CACD,2BAA2B,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,SAAS,CAAC,MAAM,KAAK;gBAChI,cAAc,MAAM,IAAI,IAAI,eAAe,KAAK,CAAC,MAAM,WAAW,CACrE,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM;YACJ,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,yBAAyB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjF,GAAG,CAAC,aAAa,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;QACjC,6EAA6E;QAC7E,IAAI,CAAC,GAAG,UAAU;YAAE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sbissoli/mcp-surface",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.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",
|
|
@@ -17,10 +17,14 @@
|
|
|
17
17
|
".": {
|
|
18
18
|
"types": "./dist/index.d.ts",
|
|
19
19
|
"default": "./dist/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./cliente": {
|
|
22
|
+
"types": "./dist/cliente.d.ts",
|
|
23
|
+
"default": "./dist/cliente.js"
|
|
20
24
|
}
|
|
21
25
|
},
|
|
22
26
|
"bin": {
|
|
23
|
-
"mcp-surface": "
|
|
27
|
+
"mcp-surface": "dist/cli.js"
|
|
24
28
|
},
|
|
25
29
|
"files": [
|
|
26
30
|
"dist",
|
|
@@ -33,9 +37,16 @@
|
|
|
33
37
|
"test": "vitest run"
|
|
34
38
|
},
|
|
35
39
|
"peerDependencies": {
|
|
40
|
+
"@modelcontextprotocol/client": "^2.0.0",
|
|
36
41
|
"@modelcontextprotocol/server": "^2.0.0"
|
|
37
42
|
},
|
|
43
|
+
"peerDependenciesMeta": {
|
|
44
|
+
"@modelcontextprotocol/client": {
|
|
45
|
+
"optional": true
|
|
46
|
+
}
|
|
47
|
+
},
|
|
38
48
|
"devDependencies": {
|
|
49
|
+
"@modelcontextprotocol/client": "^2.1.0",
|
|
39
50
|
"@modelcontextprotocol/server": "^2.1.0"
|
|
40
51
|
},
|
|
41
52
|
"keywords": [
|