@sbissoli/mcp-surface 0.1.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 +29 -0
- package/README.md +79 -0
- package/dist/cli.d.ts +23 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +101 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/memoria.d.ts +15 -0
- package/dist/memoria.d.ts.map +1 -0
- package/dist/memoria.js +40 -0
- package/dist/memoria.js.map +1 -0
- package/dist/remoto.d.ts +17 -0
- package/dist/remoto.d.ts.map +1 -0
- package/dist/remoto.js +65 -0
- package/dist/remoto.js.map +1 -0
- package/dist/replay.d.ts +48 -0
- package/dist/replay.d.ts.map +1 -0
- package/dist/replay.js +220 -0
- package/dist/replay.js.map +1 -0
- package/dist/sonda.d.ts +53 -0
- package/dist/sonda.d.ts.map +1 -0
- package/dist/sonda.js +105 -0
- package/dist/sonda.js.map +1 -0
- package/dist/superficie.d.ts +47 -0
- package/dist/superficie.d.ts.map +1 -0
- package/dist/superficie.js +89 -0
- package/dist/superficie.js.map +1 -0
- package/dist/trava.d.ts +38 -0
- package/dist/trava.d.ts.map +1 -0
- package/dist/trava.js +75 -0
- package/dist/trava.js.map +1 -0
- package/dist/verificar.d.ts +21 -0
- package/dist/verificar.d.ts.map +1 -0
- package/dist/verificar.js +47 -0
- package/dist/verificar.js.map +1 -0
- package/package.json +52 -0
package/dist/trava.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A regra do `surface.lock.json`.
|
|
3
|
+
*
|
|
4
|
+
* Cada seção (`declarada`, `semToken`) guarda a versão do `package.json` em que
|
|
5
|
+
* foi travada e o sha256 do conteúdo. Se o medido diverge do travado:
|
|
6
|
+
* - versão igual à da trava → FALHA: a superfície mudou sem subir a versão;
|
|
7
|
+
* - versão diferente → FALHA pedindo para regravar (`mcp-surface travar`).
|
|
8
|
+
* O modo de escrita (`SURFACE_LOCK_ESCREVER=1`, posto pelo `mcp-surface
|
|
9
|
+
* travar`) obedece à mesma regra: ele se RECUSA a travar superfície nova sob a
|
|
10
|
+
* versão antiga. É isso que transforma a disciplina da receita de release em
|
|
11
|
+
* teste. O sha gravado também denuncia edição à mão do conteúdo.
|
|
12
|
+
*/
|
|
13
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
14
|
+
import { impressaoDigital } from "./superficie.js";
|
|
15
|
+
/** Variável de ambiente do modo de escrita. */
|
|
16
|
+
export const VAR_ESCRITA = "SURFACE_LOCK_ESCREVER";
|
|
17
|
+
const COMENTARIO = "Impressão digital da superfície (@sbissoli/mcp-surface). Não editar à mão: `npm run surface:lock` regrava, e só aceita superfície nova sob versão nova.";
|
|
18
|
+
export function lerTrava(caminho) {
|
|
19
|
+
try {
|
|
20
|
+
return JSON.parse(readFileSync(caminho, "utf8"));
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** O modo de escrita está ligado neste processo? */
|
|
27
|
+
export function modoEscrita() {
|
|
28
|
+
return process.env[VAR_ESCRITA] === "1";
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Confere (e, em modo de escrita, regrava) UMA seção da trava contra o medido.
|
|
32
|
+
* Devolve o veredito em vez de lançar, para o teste mostrar a mensagem inteira:
|
|
33
|
+
* `expect(v.ok, v.mensagem).toBe(true)`.
|
|
34
|
+
*/
|
|
35
|
+
export function conferirSecao(caminhoDaTrava, secao, medido, versaoDoPacote, escrever = modoEscrita()) {
|
|
36
|
+
const trava = lerTrava(caminhoDaTrava);
|
|
37
|
+
const atual = trava[secao];
|
|
38
|
+
const sha = impressaoDigital(medido);
|
|
39
|
+
if (atual && impressaoDigital(atual.conteudo) !== atual.sha256) {
|
|
40
|
+
return {
|
|
41
|
+
ok: false,
|
|
42
|
+
mensagem: `surface.lock.json: a seção "${secao}" foi editada à mão (o sha256 gravado não é o do conteúdo). Restaure o arquivo e rode \`npm run surface:lock\`.`,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
if (atual && atual.sha256 === sha) {
|
|
46
|
+
return { ok: true, mensagem: `seção "${secao}" confere (${sha.slice(0, 12)}, travada em ${atual.versao})` };
|
|
47
|
+
}
|
|
48
|
+
if (atual && atual.versao === versaoDoPacote) {
|
|
49
|
+
return {
|
|
50
|
+
ok: false,
|
|
51
|
+
mensagem: `A superfície "${secao}" MUDOU e a versão continua ${versaoDoPacote} ` +
|
|
52
|
+
`(travada ${atual.sha256.slice(0, 12)}, medida ${sha.slice(0, 12)}). ` +
|
|
53
|
+
"Quem compara o registro com o servidor só enxerga a versão: suba-a " +
|
|
54
|
+
"(`npm version <patch|minor|major> --no-git-tag-version`) e rode `npm run surface:lock`.",
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (!escrever) {
|
|
58
|
+
return {
|
|
59
|
+
ok: false,
|
|
60
|
+
mensagem: atual
|
|
61
|
+
? `A superfície "${secao}" mudou junto com a versão (${atual.versao} → ${versaoDoPacote}): rode \`npm run surface:lock\` e commite o surface.lock.json.`
|
|
62
|
+
: `surface.lock.json não tem a seção "${secao}": rode \`npm run surface:lock\`.`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
trava[secao] = { versao: versaoDoPacote, sha256: sha, conteudo: medido };
|
|
66
|
+
const saida = { $comentario: COMENTARIO };
|
|
67
|
+
for (const nome of ["declarada", "semToken"]) {
|
|
68
|
+
const s = trava[nome];
|
|
69
|
+
if (s)
|
|
70
|
+
saida[nome] = s;
|
|
71
|
+
}
|
|
72
|
+
writeFileSync(caminhoDaTrava, `${JSON.stringify(saida, null, 2)}\n`);
|
|
73
|
+
return { ok: true, mensagem: `seção "${secao}" travada em ${versaoDoPacote} (${sha.slice(0, 12)})` };
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=trava.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trava.js","sourceRoot":"","sources":["../src/trava.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* O que está NO AR é o que foi travado? Os testes provam que o CÓDIGO bate com
|
|
3
|
+
* o `surface.lock.json`; isto prova que o ENDPOINT bate. Roda no fim do deploy.
|
|
4
|
+
*/
|
|
5
|
+
import { type ChamadaLocal } from "./sonda.js";
|
|
6
|
+
export interface OpcoesVerificar {
|
|
7
|
+
url: string;
|
|
8
|
+
caminhoDaTrava: string;
|
|
9
|
+
/** Configuração da trava que vale em produção. Padrão: `apiKeyAusente` (acesso aberto). */
|
|
10
|
+
config?: string;
|
|
11
|
+
/** Rota da seção `semToken` que corresponde a `url`. Padrão: `POST /mcp`. */
|
|
12
|
+
rota?: string;
|
|
13
|
+
/** A mesma tool local que a trava sondou; sem ela, `tools/call` não é conferido. */
|
|
14
|
+
chamada?: ChamadaLocal;
|
|
15
|
+
tentativas?: number;
|
|
16
|
+
esperaMs?: number;
|
|
17
|
+
log?: (linha: string) => void;
|
|
18
|
+
}
|
|
19
|
+
/** Devolve `null` quando confere; senão, a divergência da última tentativa. */
|
|
20
|
+
export declare function verificarNoAr(o: OpcoesVerificar): Promise<string | null>;
|
|
21
|
+
//# sourceMappingURL=verificar.d.ts.map
|
|
@@ -0,0 +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,CAqC9E"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* O que está NO AR é o que foi travado? Os testes provam que o CÓDIGO bate com
|
|
3
|
+
* o `surface.lock.json`; isto prova que o ENDPOINT bate. Roda no fim do deploy.
|
|
4
|
+
*/
|
|
5
|
+
import { capturarHttp, pedirHttp } from "./remoto.js";
|
|
6
|
+
import { sondaSemToken } from "./sonda.js";
|
|
7
|
+
import { impressaoDigital } from "./superficie.js";
|
|
8
|
+
import { lerTrava } from "./trava.js";
|
|
9
|
+
/** Devolve `null` quando confere; senão, a divergência da última tentativa. */
|
|
10
|
+
export async function verificarNoAr(o) {
|
|
11
|
+
const config = o.config ?? "apiKeyAusente";
|
|
12
|
+
const rota = o.rota ?? "POST /mcp";
|
|
13
|
+
const log = o.log ?? (() => { });
|
|
14
|
+
const trava = lerTrava(o.caminhoDaTrava);
|
|
15
|
+
const declarada = trava.declarada;
|
|
16
|
+
const semToken = trava.semToken?.conteudo?.[config]?.[rota];
|
|
17
|
+
if (!declarada || !semToken) {
|
|
18
|
+
return `surface.lock.json incompleto: falta a seção declarada ou semToken["${config}"]["${rota}"].`;
|
|
19
|
+
}
|
|
20
|
+
const sonda = sondaSemToken(o.chamada).filter(p => p.method in semToken);
|
|
21
|
+
const tentativas = o.tentativas ?? 6;
|
|
22
|
+
let ultimo = "";
|
|
23
|
+
for (let t = 1; t <= tentativas; t++) {
|
|
24
|
+
const sha = impressaoDigital(await capturarHttp(o.url));
|
|
25
|
+
const divergentes = [];
|
|
26
|
+
for (const pedido of sonda) {
|
|
27
|
+
const r = await pedirHttp(o.url, pedido);
|
|
28
|
+
const responde = r.status === 200 && r.result !== undefined;
|
|
29
|
+
if (responde !== semToken[pedido.method])
|
|
30
|
+
divergentes.push(`${pedido.method} (no ar ${responde})`);
|
|
31
|
+
}
|
|
32
|
+
if (sha === declarada.sha256 && divergentes.length === 0) {
|
|
33
|
+
log(`no ar = trava: declarada ${sha.slice(0, 12)} (travada em ${declarada.versao}); ` +
|
|
34
|
+
`sem token: ${config}/${rota} confere em ${sonda.length} métodos.`);
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
ultimo =
|
|
38
|
+
(sha !== declarada.sha256 ? `declarada no ar ${sha.slice(0, 12)} ≠ trava ${declarada.sha256.slice(0, 12)}. ` : "") +
|
|
39
|
+
(divergentes.length ? `sem token diverge em: ${divergentes.join(", ")}.` : "");
|
|
40
|
+
log(`tentativa ${t}: ${ultimo}`);
|
|
41
|
+
// A Cloudflare serve isolates mistos por alguns segundos logo após o deploy.
|
|
42
|
+
if (t < tentativas)
|
|
43
|
+
await new Promise(r => setTimeout(r, o.esperaMs ?? 10_000));
|
|
44
|
+
}
|
|
45
|
+
return ultimo;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=verificar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verificar.js","sourceRoot":"","sources":["../src/verificar.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sbissoli/mcp-surface",
|
|
3
|
+
"version": "0.1.0",
|
|
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
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/SidneyBissoli/mcp-br-commons.git",
|
|
8
|
+
"directory": "packages/mcp-surface"
|
|
9
|
+
},
|
|
10
|
+
"type": "module",
|
|
11
|
+
"engines": {
|
|
12
|
+
"node": ">=22"
|
|
13
|
+
},
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"default": "./dist/index.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"bin": {
|
|
23
|
+
"mcp-surface": "./dist/cli.js"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"README.md",
|
|
28
|
+
"CHANGELOG.md"
|
|
29
|
+
],
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc -p tsconfig.build.json",
|
|
32
|
+
"typecheck": "tsc --noEmit",
|
|
33
|
+
"test": "vitest run"
|
|
34
|
+
},
|
|
35
|
+
"peerDependencies": {
|
|
36
|
+
"@modelcontextprotocol/server": "^2.0.0"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@modelcontextprotocol/server": "^2.1.0"
|
|
40
|
+
},
|
|
41
|
+
"keywords": [
|
|
42
|
+
"mcp",
|
|
43
|
+
"model-context-protocol",
|
|
44
|
+
"surface",
|
|
45
|
+
"fingerprint",
|
|
46
|
+
"versioning",
|
|
47
|
+
"ci",
|
|
48
|
+
"mcp-registry"
|
|
49
|
+
],
|
|
50
|
+
"author": "Sidney Bissoli <sbissoli76@gmail.com>",
|
|
51
|
+
"license": "MIT"
|
|
52
|
+
}
|