@aimarket/warden 0.4.0 → 0.5.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 +8 -0
- package/README-es.md +75 -10
- package/README-fr.md +75 -10
- package/README-ru.md +75 -10
- package/README-zh.md +72 -9
- package/README.md +84 -13
- package/dist/mcp-rpc.d.ts +40 -0
- package/dist/mcp-rpc.d.ts.map +1 -0
- package/dist/mcp-rpc.js +117 -0
- package/dist/mcp-rpc.js.map +1 -0
- package/dist/mcp-server.d.ts +10 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +89 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp-tools.d.ts +42 -0
- package/dist/mcp-tools.d.ts.map +1 -0
- package/dist/mcp-tools.js +652 -0
- package/dist/mcp-tools.js.map +1 -0
- package/package.json +9 -3
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `@aimarket/warden`.
|
|
4
4
|
|
|
5
|
+
## 0.5.0 — 2026-09-03
|
|
6
|
+
|
|
7
|
+
stdio MCP server for Glama / Claude Desktop / Cursor (`warden-mcp` / `node dist/mcp-server.js`).
|
|
8
|
+
Six tools with TDQS-oriented definitions (title, when-to-use / when-not naming siblings, MCP
|
|
9
|
+
annotations, per-parameter descriptions, `outputSchema`). Dockerfile + `glama.json`. No secrets,
|
|
10
|
+
no npm runtime dependencies. The process inspects a `tools/list` dump; it does not launch the
|
|
11
|
+
server under scan.
|
|
12
|
+
|
|
5
13
|
## 0.4.0 — 2026-08-24
|
|
6
14
|
|
|
7
15
|
Calibrated against the ecosystem, not against fixtures. WARDEN was pointed at every public MCP
|
package/README-es.md
CHANGED
|
@@ -1,23 +1,42 @@
|
|
|
1
|
-
# WARDEN —
|
|
1
|
+
# WARDEN — servidor MCP
|
|
2
|
+
|
|
3
|
+
<!-- mcp-name: io.github.alexar76/warden -->
|
|
2
4
|
|
|
3
5
|
<!-- aicom-readme-badges -->
|
|
4
6
|
<p align="center">
|
|
5
7
|
<a href="https://github.com/alexar76/warden/actions/workflows/ci.yml"><img src="docs/badges/ci.svg" alt="CI" /></a>
|
|
6
|
-
<a href="https://
|
|
8
|
+
<a href="https://glama.ai/mcp/servers/alexar76/warden"><img src="https://glama.ai/mcp/servers/alexar76/warden/badges/score.svg" alt="warden MCP server" /></a>
|
|
9
|
+
<a href="https://warden.modelmarket.dev/"><img src="https://img.shields.io/npm/v/@aimarket/warden?color=cb3837&label=npm" alt="npm version" /></a>
|
|
7
10
|
<img src="docs/badges/deps.svg" alt="Cero dependencias de ejecución" />
|
|
8
|
-
<img src="docs/badges/tests.svg" alt="
|
|
11
|
+
<img src="docs/badges/tests.svg" alt="166 pruebas en verde" />
|
|
9
12
|
<img src="docs/badges/node.svg" alt="Node >= 20" />
|
|
10
13
|
<a href="LICENSE"><img src="docs/badges/license.svg" alt="Licencia: MIT" /></a>
|
|
11
14
|
</p>
|
|
12
15
|
<!-- /aicom-readme-badges -->
|
|
13
16
|
|
|
14
17
|
<p align="center">
|
|
15
|
-
<
|
|
18
|
+
<a href="https://warden.modelmarket.dev/">
|
|
19
|
+
<img src="docs/screenshots/readme/hero-3d.png" alt="WARDEN — cadena 3D de puertas: tools/list por static-scan, threat-feed, origin y pinning hasta un veredicto registrado" width="100%" />
|
|
20
|
+
</a>
|
|
16
21
|
</p>
|
|
17
22
|
|
|
18
23
|
|
|
19
24
|
> 🌐 [English](README.md) · [Русский](README-ru.md) · **Español** · [Français](README-fr.md) · [中文](README-zh.md) · [Glosario](https://github.com/alexar76/aicom/blob/main/docs/localization-glossary.md)
|
|
20
25
|
|
|
26
|
+
**Un servidor MCP. Cortafuegos de las definiciones de herramienta anunciadas. Biblioteca incluida.**
|
|
27
|
+
|
|
28
|
+
Transporte: **stdio** (`npx -y @aimarket/warden` / `node dist/mcp-server.js`). Hosts compatibles:
|
|
29
|
+
Claude Desktop, Cursor, Glama y cualquier cliente MCP con stdio. Sin claves.
|
|
30
|
+
|
|
31
|
+
| | |
|
|
32
|
+
|------|----------|
|
|
33
|
+
| Entrada MCP (stdio) | `warden-mcp` → [`src/mcp-server.ts`](src/mcp-server.ts) |
|
|
34
|
+
| Herramientas | `vet_mcp_server`, `static_scan_tools`, `classify_sensitive_tools`, `check_egress_url`, `canonicalize_json`, `list_scan_rules` |
|
|
35
|
+
| Biblioteca | `import { Warden } from "@aimarket/warden"` |
|
|
36
|
+
| Glama / Docker (stdio) | [`Dockerfile`](Dockerfile), [`glama.json`](glama.json) |
|
|
37
|
+
| Official MCP Registry | [`server.json`](server.json) → `io.github.alexar76/warden` |
|
|
38
|
+
| Smithery | [`smithery.yaml`](smithery.yaml) |
|
|
39
|
+
|
|
21
40
|
Un servidor MCP le dice a tu agente qué hacen sus herramientas. El agente se lo cree — y esa frase
|
|
22
41
|
es la superficie de ataque. La descripción de una herramienta es texto de prompt que un tercero
|
|
23
42
|
entrega directamente al contexto de tu modelo, y un campo de esquema llamado `api_key` es una
|
|
@@ -27,15 +46,56 @@ WARDEN examina un servidor **antes de que ninguna de sus herramientas llegue al
|
|
|
27
46
|
un veredicto que puedes registrar: permitir/bloquear, una puntuación 0..1, los hallazgos que la
|
|
28
47
|
produjeron, una partición por herramienta y la tabla de reglas exacta que estaba en vigor.
|
|
29
48
|
|
|
49
|
+
**Cero dependencias npm de ejecución.** El único import de la biblioteca es `node:crypto`. El
|
|
50
|
+
servidor MCP stdio añade otros builtins `node:` (`fs`, `path`, `process`) y sigue sin traer paquetes.
|
|
51
|
+
Es el cortafuegos de [ARGUS](https://github.com/alexar76/argus), extraído para que puedas ponerlo
|
|
52
|
+
delante de tu propio host MCP sin adoptar un agente.
|
|
53
|
+
|
|
54
|
+
## Ejecutar como servidor MCP (stdio)
|
|
55
|
+
|
|
30
56
|
```bash
|
|
31
|
-
|
|
57
|
+
npx -y @aimarket/warden
|
|
58
|
+
npm run build && node dist/mcp-server.js
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Claude Desktop / Cursor (`mcpServers`):
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"mcpServers": {
|
|
66
|
+
"warden": {
|
|
67
|
+
"command": "npx",
|
|
68
|
+
"args": ["-y", "@aimarket/warden"]
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
32
72
|
```
|
|
33
73
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
74
|
+
El proceso **no** arranca, no hace de proxy ni aísla otro servidor MCP: pasas un dump de
|
|
75
|
+
`tools/list` y recibes un veredicto.
|
|
76
|
+
|
|
77
|
+
| Herramienta | Cuándo usarla |
|
|
78
|
+
|---|---|
|
|
79
|
+
| `vet_mcp_server` | Cadena completa de puertas |
|
|
80
|
+
| `static_scan_tools` | Solo el escaneo estático |
|
|
81
|
+
| `classify_sensitive_tools` | Partición por globs del operador |
|
|
82
|
+
| `check_egress_url` | Allowlist de hosts (lista vacía = denegar todos) |
|
|
83
|
+
| `canonicalize_json` | Bytes RFC 8785 |
|
|
84
|
+
| `list_scan_rules` | Tabla de reglas publicada |
|
|
85
|
+
|
|
86
|
+
### Publicar en Glama
|
|
87
|
+
|
|
88
|
+
Listado: **[glama.ai/mcp/servers/alexar76/warden](https://glama.ai/mcp/servers/alexar76/warden)**
|
|
37
89
|
|
|
38
|
-
|
|
90
|
+
El mismo patrón que [ARGUS](https://github.com/alexar76/argus) y
|
|
91
|
+
[aimarket-mcp](https://github.com/alexar76/aimarket-mcp): [`glama.json`](glama.json) +
|
|
92
|
+
[`Dockerfile`](Dockerfile) + `node dist/mcp-server.js`. Formulario: [`docs/GLAMA.md`](docs/GLAMA.md).
|
|
93
|
+
|
|
94
|
+
## Biblioteca (incrustar en tu host)
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
npm install @aimarket/warden
|
|
98
|
+
```
|
|
39
99
|
|
|
40
100
|
```ts
|
|
41
101
|
import { Warden, ThreatFeed, silentLogger } from "@aimarket/warden";
|
|
@@ -159,6 +219,9 @@ degradar a ninguna protección:
|
|
|
159
219
|
| [El threat feed firmado](docs/threat-feed.es.md) | El contrato en el cable, las tres comprobaciones y cómo publicar un feed que WARDEN acepte |
|
|
160
220
|
| [Guía de integración](docs/integration.es.md) | Cómo conectar WARDEN a tu propio host MCP, elecciones de política y qué registrar |
|
|
161
221
|
| [Estudio de campo: 1 108 servidores MCP públicos](docs/mcp-survey.es.md) | Qué decidió WARDEN sobre definiciones de herramienta reales de terceros — 50 servidores bloqueados, 4 sustentados, y las seis formas en que el resto se equivocó |
|
|
222
|
+
| [Glama / Docker](docs/GLAMA.md) | MCP stdio, health check, Build steps / CMD |
|
|
223
|
+
| [Security](SECURITY.md) | Cómo informar de un bypass del cortafuegos |
|
|
224
|
+
| [Contributing](CONTRIBUTING.md) | Regla de cero dependencias, PRs de la tabla de reglas |
|
|
162
225
|
|
|
163
226
|
## Lo que esto no es
|
|
164
227
|
|
|
@@ -173,11 +236,13 @@ degradar a ninguna protección:
|
|
|
173
236
|
`test/no-phantom-gate.test.ts` falla si alguna puerta vuelve a declarar inalcanzabilidad.
|
|
174
237
|
- **No sustituye a leer las definiciones de herramientas.** 11 registros integrados de amenazas son
|
|
175
238
|
un suelo, no un catálogo.
|
|
239
|
+
- **No es un proxy.** La entrada MCP stdio inspecciona las definiciones que le pasas. No se conecta
|
|
240
|
+
al servidor bajo examen, no lo descarga ni lo ejecuta.
|
|
176
241
|
|
|
177
242
|
## Desarrollo
|
|
178
243
|
|
|
179
244
|
```bash
|
|
180
|
-
npm install && npm run build && npm test #
|
|
245
|
+
npm install && npm run build && npm test # 166 pruebas
|
|
181
246
|
```
|
|
182
247
|
|
|
183
248
|
`test/packaging.test.ts` es lo que mantiene honesto el titular: falla si aparece una dependencia de
|
package/README-fr.md
CHANGED
|
@@ -1,23 +1,42 @@
|
|
|
1
|
-
# WARDEN —
|
|
1
|
+
# WARDEN — serveur MCP
|
|
2
|
+
|
|
3
|
+
<!-- mcp-name: io.github.alexar76/warden -->
|
|
2
4
|
|
|
3
5
|
<!-- aicom-readme-badges -->
|
|
4
6
|
<p align="center">
|
|
5
7
|
<a href="https://github.com/alexar76/warden/actions/workflows/ci.yml"><img src="docs/badges/ci.svg" alt="CI" /></a>
|
|
6
|
-
<a href="https://
|
|
8
|
+
<a href="https://glama.ai/mcp/servers/alexar76/warden"><img src="https://glama.ai/mcp/servers/alexar76/warden/badges/score.svg" alt="warden MCP server" /></a>
|
|
9
|
+
<a href="https://warden.modelmarket.dev/"><img src="https://img.shields.io/npm/v/@aimarket/warden?color=cb3837&label=npm" alt="version npm" /></a>
|
|
7
10
|
<img src="docs/badges/deps.svg" alt="Zéro dépendance d'exécution" />
|
|
8
|
-
<img src="docs/badges/tests.svg" alt="
|
|
11
|
+
<img src="docs/badges/tests.svg" alt="166 tests au vert" />
|
|
9
12
|
<img src="docs/badges/node.svg" alt="Node >= 20" />
|
|
10
13
|
<a href="LICENSE"><img src="docs/badges/license.svg" alt="Licence : MIT" /></a>
|
|
11
14
|
</p>
|
|
12
15
|
<!-- /aicom-readme-badges -->
|
|
13
16
|
|
|
14
17
|
<p align="center">
|
|
15
|
-
<
|
|
18
|
+
<a href="https://warden.modelmarket.dev/">
|
|
19
|
+
<img src="docs/screenshots/readme/hero-3d.png" alt="WARDEN — chaîne 3D de portes : tools/list via static-scan, threat-feed, origin et pinning jusqu’à un verdict enregistré" width="100%" />
|
|
20
|
+
</a>
|
|
16
21
|
</p>
|
|
17
22
|
|
|
18
23
|
|
|
19
24
|
> 🌐 [English](README.md) · [Русский](README-ru.md) · [Español](README-es.md) · **Français** · [中文](README-zh.md) · [Glossaire](https://github.com/alexar76/aicom/blob/main/docs/localization-glossary.md)
|
|
20
25
|
|
|
26
|
+
**Un serveur MCP. Pare-feu des définitions d'outils annoncées. Bibliothèque incluse.**
|
|
27
|
+
|
|
28
|
+
Transport : **stdio** (`npx -y @aimarket/warden` / `node dist/mcp-server.js`). Hôtes compatibles :
|
|
29
|
+
Claude Desktop, Cursor, Glama et tout client MCP en stdio. Aucune clé.
|
|
30
|
+
|
|
31
|
+
| | |
|
|
32
|
+
|------|----------|
|
|
33
|
+
| Entrée MCP (stdio) | `warden-mcp` → [`src/mcp-server.ts`](src/mcp-server.ts) |
|
|
34
|
+
| Outils | `vet_mcp_server`, `static_scan_tools`, `classify_sensitive_tools`, `check_egress_url`, `canonicalize_json`, `list_scan_rules` |
|
|
35
|
+
| Bibliothèque | `import { Warden } from "@aimarket/warden"` |
|
|
36
|
+
| Glama / Docker (stdio) | [`Dockerfile`](Dockerfile), [`glama.json`](glama.json) |
|
|
37
|
+
| Official MCP Registry | [`server.json`](server.json) → `io.github.alexar76/warden` |
|
|
38
|
+
| Smithery | [`smithery.yaml`](smithery.yaml) |
|
|
39
|
+
|
|
21
40
|
Un serveur MCP indique lui-même à votre agent ce que font ses outils. L'agent le croit — et cette
|
|
22
41
|
phrase est la surface d'attaque. La description d'un outil est du texte de prompt qu'un tiers livre
|
|
23
42
|
directement dans le contexte de votre modèle, et un champ de schéma nommé `api_key` est une demande
|
|
@@ -27,15 +46,56 @@ WARDEN examine un serveur **avant qu'aucun de ses outils n'atteigne le modèle**
|
|
|
27
46
|
que vous pouvez consigner : autoriser/bloquer, un score 0..1, les constats qui l'ont produit, une
|
|
28
47
|
partition par outil et la table de règles exacte qui était en vigueur.
|
|
29
48
|
|
|
49
|
+
**Zéro dépendance npm d'exécution.** Le seul import de la bibliothèque est `node:crypto`. Le serveur
|
|
50
|
+
MCP stdio ajoute d'autres builtins `node:` (`fs`, `path`, `process`) et ne tire toujours aucun paquet.
|
|
51
|
+
C'est le pare-feu d'[ARGUS](https://github.com/alexar76/argus), extrait pour que vous puissiez le
|
|
52
|
+
placer devant votre propre hôte MCP sans adopter d'agent.
|
|
53
|
+
|
|
54
|
+
## Lancer comme serveur MCP (stdio)
|
|
55
|
+
|
|
30
56
|
```bash
|
|
31
|
-
|
|
57
|
+
npx -y @aimarket/warden
|
|
58
|
+
npm run build && node dist/mcp-server.js
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Claude Desktop / Cursor (`mcpServers`) :
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"mcpServers": {
|
|
66
|
+
"warden": {
|
|
67
|
+
"command": "npx",
|
|
68
|
+
"args": ["-y", "@aimarket/warden"]
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
32
72
|
```
|
|
33
73
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
74
|
+
Le processus ne démarre, ne proxifie ni n'isole un autre serveur MCP : vous passez un dump
|
|
75
|
+
`tools/list`, vous récupérez un verdict.
|
|
76
|
+
|
|
77
|
+
| Outil | Quand l'appeler |
|
|
78
|
+
|---|---|
|
|
79
|
+
| `vet_mcp_server` | Chaîne complète de portes |
|
|
80
|
+
| `static_scan_tools` | Scan statique uniquement |
|
|
81
|
+
| `classify_sensitive_tools` | Partition par globs opérateur |
|
|
82
|
+
| `check_egress_url` | Allowlist d'hôtes (liste vide = tout refuser) |
|
|
83
|
+
| `canonicalize_json` | Octets RFC 8785 |
|
|
84
|
+
| `list_scan_rules` | Table de règles publiée |
|
|
85
|
+
|
|
86
|
+
### Publier sur Glama
|
|
87
|
+
|
|
88
|
+
Listing : **[glama.ai/mcp/servers/alexar76/warden](https://glama.ai/mcp/servers/alexar76/warden)**
|
|
37
89
|
|
|
38
|
-
|
|
90
|
+
Même modèle que [ARGUS](https://github.com/alexar76/argus) et
|
|
91
|
+
[aimarket-mcp](https://github.com/alexar76/aimarket-mcp) : [`glama.json`](glama.json) +
|
|
92
|
+
[`Dockerfile`](Dockerfile) + `node dist/mcp-server.js`. Formulaire : [`docs/GLAMA.md`](docs/GLAMA.md).
|
|
93
|
+
|
|
94
|
+
## Bibliothèque (embarquer dans votre hôte)
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
npm install @aimarket/warden
|
|
98
|
+
```
|
|
39
99
|
|
|
40
100
|
```ts
|
|
41
101
|
import { Warden, ThreatFeed, silentLogger } from "@aimarket/warden";
|
|
@@ -159,6 +219,9 @@ une absence de protection :
|
|
|
159
219
|
| [Le threat feed signé](docs/threat-feed.fr.md) | Le contrat sur le fil, les trois vérifications, et comment publier un feed que WARDEN acceptera |
|
|
160
220
|
| [Guide d'intégration](docs/integration.fr.md) | Brancher WARDEN sur votre propre hôte MCP, choix de politique, et quoi consigner |
|
|
161
221
|
| [Étude de terrain : 1 108 serveurs MCP publics](docs/mcp-survey.fr.md) | Ce que WARDEN a décidé sur de vraies définitions d'outil tierces — 50 serveurs bloqués, 4 étayés, et les six façons dont le reste était faux |
|
|
222
|
+
| [Glama / Docker](docs/GLAMA.md) | MCP stdio, health check, Build steps / CMD |
|
|
223
|
+
| [Security](SECURITY.md) | Signaler un contournement du pare-feu |
|
|
224
|
+
| [Contributing](CONTRIBUTING.md) | Règle zéro dépendance, PRs de table de règles |
|
|
162
225
|
|
|
163
226
|
## Ce que ce n'est pas
|
|
164
227
|
|
|
@@ -173,11 +236,13 @@ une absence de protection :
|
|
|
173
236
|
`test/no-phantom-gate.test.ts` échoue si une porte déclare de nouveau une injoignabilité.
|
|
174
237
|
- **Pas un substitut à la lecture des définitions d'outils.** 11 enregistrements de menaces intégrés
|
|
175
238
|
sont un socle, pas un catalogue.
|
|
239
|
+
- **Pas un proxy.** L'entrée MCP stdio inspecte les définitions que vous lui passez. Elle ne se
|
|
240
|
+
connecte pas au serveur examiné, ne le télécharge pas et ne l'exécute pas.
|
|
176
241
|
|
|
177
242
|
## Développement
|
|
178
243
|
|
|
179
244
|
```bash
|
|
180
|
-
npm install && npm run build && npm test #
|
|
245
|
+
npm install && npm run build && npm test # 166 tests
|
|
181
246
|
```
|
|
182
247
|
|
|
183
248
|
`test/packaging.test.ts` est ce qui tient l'accroche honnête : il échoue si une dépendance d'exécution
|
package/README-ru.md
CHANGED
|
@@ -1,23 +1,42 @@
|
|
|
1
|
-
# WARDEN —
|
|
1
|
+
# WARDEN — MCP-сервер
|
|
2
|
+
|
|
3
|
+
<!-- mcp-name: io.github.alexar76/warden -->
|
|
2
4
|
|
|
3
5
|
<!-- aicom-readme-badges -->
|
|
4
6
|
<p align="center">
|
|
5
7
|
<a href="https://github.com/alexar76/warden/actions/workflows/ci.yml"><img src="docs/badges/ci.svg" alt="CI" /></a>
|
|
6
|
-
<a href="https://
|
|
8
|
+
<a href="https://glama.ai/mcp/servers/alexar76/warden"><img src="https://glama.ai/mcp/servers/alexar76/warden/badges/score.svg" alt="warden MCP server" /></a>
|
|
9
|
+
<a href="https://warden.modelmarket.dev/"><img src="https://img.shields.io/npm/v/@aimarket/warden?color=cb3837&label=npm" alt="npm version" /></a>
|
|
7
10
|
<img src="docs/badges/deps.svg" alt="Zero runtime dependencies" />
|
|
8
|
-
<img src="docs/badges/tests.svg" alt="
|
|
11
|
+
<img src="docs/badges/tests.svg" alt="166 tests passing" />
|
|
9
12
|
<img src="docs/badges/node.svg" alt="Node >= 20" />
|
|
10
13
|
<a href="LICENSE"><img src="docs/badges/license.svg" alt="License: MIT" /></a>
|
|
11
14
|
</p>
|
|
12
15
|
<!-- /aicom-readme-badges -->
|
|
13
16
|
|
|
14
17
|
<p align="center">
|
|
15
|
-
<
|
|
18
|
+
<a href="https://warden.modelmarket.dev/">
|
|
19
|
+
<img src="docs/screenshots/readme/hero-3d.png" alt="WARDEN — 3D-цепочка гейтов: tools/list через static-scan, threat-feed, origin и pinning к записанному вердикту" width="100%" />
|
|
20
|
+
</a>
|
|
16
21
|
</p>
|
|
17
22
|
|
|
18
23
|
|
|
19
24
|
> 🌐 [English](README.md) · **Русский** · [Español](README-es.md) · [Français](README-fr.md) · [中文](README-zh.md) · [Глоссарий](https://github.com/alexar76/aicom/blob/main/docs/localization-glossary.md)
|
|
20
25
|
|
|
26
|
+
**Один MCP-сервер. Файрвол для объявленных определений инструментов. Библиотека в комплекте.**
|
|
27
|
+
|
|
28
|
+
Транспорт: **stdio** (`npx -y @aimarket/warden` / `node dist/mcp-server.js`). Совместимые хосты:
|
|
29
|
+
Claude Desktop, Cursor, Glama и любой MCP-клиент со stdio. Ключи не нужны.
|
|
30
|
+
|
|
31
|
+
| | |
|
|
32
|
+
|------|----------|
|
|
33
|
+
| Точка входа MCP (stdio) | `warden-mcp` → [`src/mcp-server.ts`](src/mcp-server.ts) |
|
|
34
|
+
| Инструменты | `vet_mcp_server`, `static_scan_tools`, `classify_sensitive_tools`, `check_egress_url`, `canonicalize_json`, `list_scan_rules` |
|
|
35
|
+
| Библиотека | `import { Warden } from "@aimarket/warden"` |
|
|
36
|
+
| Glama / Docker (stdio) | [`Dockerfile`](Dockerfile), [`glama.json`](glama.json) |
|
|
37
|
+
| Official MCP Registry | [`server.json`](server.json) → `io.github.alexar76/warden` |
|
|
38
|
+
| Smithery | [`smithery.yaml`](smithery.yaml) |
|
|
39
|
+
|
|
21
40
|
MCP-сервер сам сообщает вашему агенту, что делают его инструменты. Агент этому верит — и вот эта
|
|
22
41
|
фраза и есть поверхность атаки. Описание инструмента — это текст промпта, который третья сторона
|
|
23
42
|
доставляет прямо в контекст модели, а поле схемы с именем `api_key` — это запрос ваших секретов,
|
|
@@ -27,15 +46,56 @@ WARDEN проверяет сервер **до того, как его инстр
|
|
|
27
46
|
который можно записать: allow/block, оценку 0..1, найденные проблемы, разбиение по инструментам и
|
|
28
47
|
точную таблицу правил, которая действовала в момент проверки.
|
|
29
48
|
|
|
49
|
+
**Ноль npm-зависимостей в рантайме.** В библиотеке единственный импорт — `node:crypto`. stdio
|
|
50
|
+
MCP-сервер добавляет другие `node:` builtins (`fs`, `path`, `process`) и по-прежнему не тянет пакеты.
|
|
51
|
+
Это файрвол из [ARGUS](https://github.com/alexar76/argus), вынесенный отдельно, чтобы его можно было
|
|
52
|
+
поставить перед своим MCP-хостом, не переезжая на агента.
|
|
53
|
+
|
|
54
|
+
## Запуск как MCP-сервер (stdio)
|
|
55
|
+
|
|
30
56
|
```bash
|
|
31
|
-
|
|
57
|
+
npx -y @aimarket/warden
|
|
58
|
+
npm run build && node dist/mcp-server.js
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Claude Desktop / Cursor (`mcpServers`):
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"mcpServers": {
|
|
66
|
+
"warden": {
|
|
67
|
+
"command": "npx",
|
|
68
|
+
"args": ["-y", "@aimarket/warden"]
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
32
72
|
```
|
|
33
73
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
74
|
+
Процесс **не** запускает, не проксирует и не изолирует чужой MCP-сервер: вы передаёте дамп
|
|
75
|
+
`tools/list`, получаете вердикт.
|
|
76
|
+
|
|
77
|
+
| Инструмент | Когда вызывать |
|
|
78
|
+
|---|---|
|
|
79
|
+
| `vet_mcp_server` | Полная цепочка гейтов |
|
|
80
|
+
| `static_scan_tools` | Только static-scan |
|
|
81
|
+
| `classify_sensitive_tools` | Glob-разбиение оператора |
|
|
82
|
+
| `check_egress_url` | Allowlist хостов (пустой список — отказ всем) |
|
|
83
|
+
| `canonicalize_json` | Байты RFC 8785 |
|
|
84
|
+
| `list_scan_rules` | Опубликованная таблица правил |
|
|
85
|
+
|
|
86
|
+
### Публикация на Glama
|
|
87
|
+
|
|
88
|
+
Листинг: **[glama.ai/mcp/servers/alexar76/warden](https://glama.ai/mcp/servers/alexar76/warden)**
|
|
37
89
|
|
|
38
|
-
|
|
90
|
+
Тот же шаблон, что у [ARGUS](https://github.com/alexar76/argus) и
|
|
91
|
+
[aimarket-mcp](https://github.com/alexar76/aimarket-mcp): [`glama.json`](glama.json) +
|
|
92
|
+
[`Dockerfile`](Dockerfile) + `node dist/mcp-server.js`. Форма: [`docs/GLAMA.md`](docs/GLAMA.md).
|
|
93
|
+
|
|
94
|
+
## Библиотека (встроить в свой хост)
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
npm install @aimarket/warden
|
|
98
|
+
```
|
|
39
99
|
|
|
40
100
|
```ts
|
|
41
101
|
import { Warden, ThreatFeed, silentLogger } from "@aimarket/warden";
|
|
@@ -158,6 +218,9 @@ GET <ваш feed url>
|
|
|
158
218
|
| [Подписанный threat feed](docs/threat-feed.ru.md) | Контракт на проводе, три проверки и как публиковать feed, который WARDEN примет |
|
|
159
219
|
| [Руководство по интеграции](docs/integration.ru.md) | Как встроить WARDEN в свой MCP-хост, выбор политики и что записывать |
|
|
160
220
|
| [Полевой обзор: 1 108 публичных MCP-серверов](docs/mcp-survey.ru.md) | Что WARDEN решил на настоящих чужих определениях инструментов — 50 серверов заблокировано, 4 подтверждено, и шесть способов, которыми остальные оказались ошибкой |
|
|
221
|
+
| [Glama / Docker](docs/GLAMA.md) | stdio MCP, health check, Build steps / CMD |
|
|
222
|
+
| [Security](SECURITY.md) | Как сообщать об обходе файрвола |
|
|
223
|
+
| [Contributing](CONTRIBUTING.md) | Правило нулевых зависимостей, PR на таблицу правил |
|
|
161
224
|
|
|
162
225
|
## Чем это не является
|
|
163
226
|
|
|
@@ -172,11 +235,13 @@ GET <ваш feed url>
|
|
|
172
235
|
снова заявит о недоступности.
|
|
173
236
|
- **Не замена чтению определений инструментов.** 11 встроенных записей об угрозах — это минимум, а не
|
|
174
237
|
каталог.
|
|
238
|
+
- **Не прокси.** stdio MCP-вход смотрит на определения, которые вы ему передали. Он не
|
|
239
|
+
подключается к проверяемому серверу, не качает его и не исполняет.
|
|
175
240
|
|
|
176
241
|
## Разработка
|
|
177
242
|
|
|
178
243
|
```bash
|
|
179
|
-
npm install && npm run build && npm test #
|
|
244
|
+
npm install && npm run build && npm test # 166 тестов
|
|
180
245
|
```
|
|
181
246
|
|
|
182
247
|
`test/packaging.test.ts` — то, что удерживает заголовок честным: он падает, если появляется
|
package/README-zh.md
CHANGED
|
@@ -1,37 +1,96 @@
|
|
|
1
|
-
# WARDEN — MCP
|
|
1
|
+
# WARDEN — MCP 服务器
|
|
2
|
+
|
|
3
|
+
<!-- mcp-name: io.github.alexar76/warden -->
|
|
2
4
|
|
|
3
5
|
<!-- aicom-readme-badges -->
|
|
4
6
|
<p align="center">
|
|
5
7
|
<a href="https://github.com/alexar76/warden/actions/workflows/ci.yml"><img src="docs/badges/ci.svg" alt="CI" /></a>
|
|
6
|
-
<a href="https://
|
|
8
|
+
<a href="https://glama.ai/mcp/servers/alexar76/warden"><img src="https://glama.ai/mcp/servers/alexar76/warden/badges/score.svg" alt="warden MCP server" /></a>
|
|
9
|
+
<a href="https://warden.modelmarket.dev/"><img src="https://img.shields.io/npm/v/@aimarket/warden?color=cb3837&label=npm" alt="npm 版本" /></a>
|
|
7
10
|
<img src="docs/badges/deps.svg" alt="零运行时依赖" />
|
|
8
|
-
<img src="docs/badges/tests.svg" alt="
|
|
11
|
+
<img src="docs/badges/tests.svg" alt="166 项测试通过" />
|
|
9
12
|
<img src="docs/badges/node.svg" alt="Node >= 20" />
|
|
10
13
|
<a href="LICENSE"><img src="docs/badges/license.svg" alt="许可证:MIT" /></a>
|
|
11
14
|
</p>
|
|
12
15
|
<!-- /aicom-readme-badges -->
|
|
13
16
|
|
|
14
17
|
<p align="center">
|
|
15
|
-
<
|
|
18
|
+
<a href="https://warden.modelmarket.dev/">
|
|
19
|
+
<img src="docs/screenshots/readme/hero-3d.png" alt="WARDEN — 3D 门链:tools/list 经 static-scan、threat-feed、origin、pinning 到可记录的裁定" width="100%" />
|
|
20
|
+
</a>
|
|
16
21
|
</p>
|
|
17
22
|
|
|
18
23
|
|
|
19
24
|
> 🌐 [English](README.md) · [Русский](README-ru.md) · [Español](README-es.md) · [Français](README-fr.md) · **中文** · [术语表](https://github.com/alexar76/aicom/blob/main/docs/localization-glossary.md)
|
|
20
25
|
|
|
26
|
+
**一个 MCP 服务器。针对已广告工具定义的安全防火墙。附带库。**
|
|
27
|
+
|
|
28
|
+
传输:**stdio**(`npx -y @aimarket/warden` / `node dist/mcp-server.js`)。兼容主机:Claude Desktop、
|
|
29
|
+
Cursor、Glama,以及任何支持 stdio 的 MCP 客户端。不需要密钥。
|
|
30
|
+
|
|
31
|
+
| | |
|
|
32
|
+
|------|----------|
|
|
33
|
+
| MCP 入口(stdio) | `warden-mcp` → [`src/mcp-server.ts`](src/mcp-server.ts) |
|
|
34
|
+
| 工具 | `vet_mcp_server`、`static_scan_tools`、`classify_sensitive_tools`、`check_egress_url`、`canonicalize_json`、`list_scan_rules` |
|
|
35
|
+
| 库 | `import { Warden } from "@aimarket/warden"` |
|
|
36
|
+
| Glama / Docker(stdio) | [`Dockerfile`](Dockerfile)、[`glama.json`](glama.json) |
|
|
37
|
+
| Official MCP Registry | [`server.json`](server.json) → `io.github.alexar76/warden` |
|
|
38
|
+
| Smithery | [`smithery.yaml`](smithery.yaml) |
|
|
39
|
+
|
|
21
40
|
MCP 服务器自己告诉你的智能体,它的工具是做什么的。智能体就信了——而这句话正是攻击面。工具描述就是第三方直接
|
|
22
41
|
投递进模型上下文的提示词文本;而一个名叫 `api_key` 的 schema 字段,就是以 API 形式写出来的索要密钥的请求。
|
|
23
42
|
|
|
24
43
|
WARDEN 在**该服务器的任何工具到达模型之前**审查它,并返回一份可以留档的裁定:允许/阻止、0..1 的评分、导致该
|
|
25
44
|
评分的各项发现、按工具的划分,以及当时生效的确切规则表。
|
|
26
45
|
|
|
46
|
+
**零 npm 运行时依赖。** 库本身唯一的 import 是 `node:crypto`。stdio MCP 服务器会再用到其他 `node:`
|
|
47
|
+
内建模块(`fs`、`path`、`process`),仍然不拉任何包。它就是 [ARGUS](https://github.com/alexar76/argus)
|
|
48
|
+
里的那个防火墙,被单独抽出来,好让你把它放在自己的 MCP 宿主前面,而不必换用一个智能体。
|
|
49
|
+
|
|
50
|
+
## 作为 MCP 服务器运行(stdio)
|
|
51
|
+
|
|
27
52
|
```bash
|
|
28
|
-
|
|
53
|
+
npx -y @aimarket/warden
|
|
54
|
+
npm run build && node dist/mcp-server.js
|
|
29
55
|
```
|
|
30
56
|
|
|
31
|
-
|
|
32
|
-
|
|
57
|
+
Claude Desktop / Cursor(`mcpServers`):
|
|
58
|
+
|
|
59
|
+
```json
|
|
60
|
+
{
|
|
61
|
+
"mcpServers": {
|
|
62
|
+
"warden": {
|
|
63
|
+
"command": "npx",
|
|
64
|
+
"args": ["-y", "@aimarket/warden"]
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
进程**不会**启动、代理或沙箱化另一个 MCP 服务器:你传入 `tools/list` 转储,得到一份裁决。
|
|
71
|
+
|
|
72
|
+
| 工具 | 何时使用 |
|
|
73
|
+
|---|---|
|
|
74
|
+
| `vet_mcp_server` | 完整门控链 |
|
|
75
|
+
| `static_scan_tools` | 仅静态扫描 |
|
|
76
|
+
| `classify_sensitive_tools` | 运营方 glob 分类 |
|
|
77
|
+
| `check_egress_url` | 主机 allowlist(空列表拒绝全部) |
|
|
78
|
+
| `canonicalize_json` | RFC 8785 字节 |
|
|
79
|
+
| `list_scan_rules` | 已发布的规则表 |
|
|
80
|
+
|
|
81
|
+
### 发布到 Glama
|
|
33
82
|
|
|
34
|
-
|
|
83
|
+
列表页:**[glama.ai/mcp/servers/alexar76/warden](https://glama.ai/mcp/servers/alexar76/warden)**
|
|
84
|
+
|
|
85
|
+
与 [ARGUS](https://github.com/alexar76/argus)、[aimarket-mcp](https://github.com/alexar76/aimarket-mcp)
|
|
86
|
+
相同:[`glama.json`](glama.json) + [`Dockerfile`](Dockerfile) + `node dist/mcp-server.js`。
|
|
87
|
+
表单:[`docs/GLAMA.md`](docs/GLAMA.md)。
|
|
88
|
+
|
|
89
|
+
## 库(嵌入你的宿主)
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
npm install @aimarket/warden
|
|
93
|
+
```
|
|
35
94
|
|
|
36
95
|
```ts
|
|
37
96
|
import { Warden, ThreatFeed, silentLogger } from "@aimarket/warden";
|
|
@@ -146,6 +205,9 @@ GET <你的 feed url>
|
|
|
146
205
|
| [已签名的威胁情报 feed](docs/threat-feed.zh.md) | 线上契约、三项检查,以及如何发布一个 WARDEN 会接受的 feed |
|
|
147
206
|
| [集成指南](docs/integration.zh.md) | 如何把 WARDEN 接入自己的 MCP 宿主、策略取舍,以及应当留档什么 |
|
|
148
207
|
| [实地普查:1 108 个公开 MCP 服务器](docs/mcp-survey.zh.md) | WARDEN 在真实的第三方工具定义上判了什么——拦截 50 个服务器,4 项成立,其余判错的六种方式 |
|
|
208
|
+
| [Glama / Docker](docs/GLAMA.md) | stdio MCP、健康检查、Build steps / CMD |
|
|
209
|
+
| [Security](SECURITY.md) | 如何报告防火墙绕过 |
|
|
210
|
+
| [Contributing](CONTRIBUTING.md) | 零依赖规则、规则表 PR |
|
|
149
211
|
|
|
150
212
|
## 它不是什么
|
|
151
213
|
|
|
@@ -157,11 +219,12 @@ GET <你的 feed url>
|
|
|
157
219
|
没发出的情况下报告预言机不可达。该门控已被移除,并且只要有任何门控再次声称不可达,
|
|
158
220
|
`test/no-phantom-gate.test.ts` 就会失败。
|
|
159
221
|
- **不能替代你亲自读工具定义。** 11 条内置威胁记录是底线,不是目录。
|
|
222
|
+
- **不是代理。** stdio MCP 入口检查的是你传入的定义。它不会连接、下载或执行被扫描的服务器。
|
|
160
223
|
|
|
161
224
|
## 开发
|
|
162
225
|
|
|
163
226
|
```bash
|
|
164
|
-
npm install && npm run build && npm test #
|
|
227
|
+
npm install && npm run build && npm test # 166 项测试
|
|
165
228
|
```
|
|
166
229
|
|
|
167
230
|
`test/packaging.test.ts` 正是让标题保持诚实的东西:一旦出现运行时依赖、任何源文件从包外 import、或者入口点不
|