@kryptosai/mcp-observatory 1.28.2 → 1.29.1
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/CONTRIBUTORS.md +4 -1
- package/README.md +45 -9
- package/README.zh-CN.md +591 -0
- package/dist/src/adapters/http.js +13 -4
- package/dist/src/adapters/http.js.map +1 -1
- package/dist/src/checks/security.js +33 -65
- package/dist/src/checks/security.js.map +1 -1
- package/dist/src/cli.js +9 -1
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/helpers.d.ts +2 -1
- package/dist/src/commands/helpers.js +9 -1
- package/dist/src/commands/helpers.js.map +1 -1
- package/dist/src/commands/legacy.js +3 -0
- package/dist/src/commands/legacy.js.map +1 -1
- package/dist/src/commands/risk-graph.d.ts +2 -0
- package/dist/src/commands/risk-graph.js +64 -0
- package/dist/src/commands/risk-graph.js.map +1 -0
- package/dist/src/commands/score.js.map +1 -1
- package/dist/src/commands/watch.js +13 -8
- package/dist/src/commands/watch.js.map +1 -1
- package/dist/src/discovery.js +32 -26
- package/dist/src/discovery.js.map +1 -1
- package/dist/src/reporters/terminal.js +2 -1
- package/dist/src/reporters/terminal.js.map +1 -1
- package/dist/src/risk-graph.d.ts +64 -0
- package/dist/src/risk-graph.js +452 -0
- package/dist/src/risk-graph.js.map +1 -0
- package/dist/src/server.d.ts +1 -3
- package/dist/src/server.js +29 -645
- package/dist/src/server.js.map +1 -1
- package/dist/src/storage.js +13 -9
- package/dist/src/storage.js.map +1 -1
- package/dist/src/telemetry.d.ts +7 -0
- package/dist/src/telemetry.js.map +1 -1
- package/dist/src/tools/check-server.d.ts +27 -0
- package/dist/src/tools/check-server.js +46 -0
- package/dist/src/tools/check-server.js.map +1 -0
- package/dist/src/tools/ci-report.d.ts +21 -0
- package/dist/src/tools/ci-report.js +38 -0
- package/dist/src/tools/ci-report.js.map +1 -0
- package/dist/src/tools/diff-runs.d.ts +28 -0
- package/dist/src/tools/diff-runs.js +39 -0
- package/dist/src/tools/diff-runs.js.map +1 -0
- package/dist/src/tools/get-history.d.ts +21 -0
- package/dist/src/tools/get-history.js +37 -0
- package/dist/src/tools/get-history.js.map +1 -0
- package/dist/src/tools/get-last-run.d.ts +21 -0
- package/dist/src/tools/get-last-run.js +47 -0
- package/dist/src/tools/get-last-run.js.map +1 -0
- package/dist/src/tools/helpers.d.ts +8 -0
- package/dist/src/tools/helpers.js +32 -0
- package/dist/src/tools/helpers.js.map +1 -0
- package/dist/src/tools/lock-verify.d.ts +21 -0
- package/dist/src/tools/lock-verify.js +47 -0
- package/dist/src/tools/lock-verify.js.map +1 -0
- package/dist/src/tools/record.d.ts +23 -0
- package/dist/src/tools/record.js +48 -0
- package/dist/src/tools/record.js.map +1 -0
- package/dist/src/tools/replay.d.ts +21 -0
- package/dist/src/tools/replay.js +54 -0
- package/dist/src/tools/replay.js.map +1 -0
- package/dist/src/tools/scan.d.ts +18 -0
- package/dist/src/tools/scan.js +43 -0
- package/dist/src/tools/scan.js.map +1 -0
- package/dist/src/tools/score-server.d.ts +23 -0
- package/dist/src/tools/score-server.js +53 -0
- package/dist/src/tools/score-server.js.map +1 -0
- package/dist/src/tools/suggest-servers.d.ts +21 -0
- package/dist/src/tools/suggest-servers.js +114 -0
- package/dist/src/tools/suggest-servers.js.map +1 -0
- package/dist/src/tools/verify-tool.d.ts +25 -0
- package/dist/src/tools/verify-tool.js +48 -0
- package/dist/src/tools/verify-tool.js.map +1 -0
- package/dist/src/tools/watch.d.ts +23 -0
- package/dist/src/tools/watch.js +67 -0
- package/dist/src/tools/watch.js.map +1 -0
- package/dist/src/utils/security.d.ts +3 -0
- package/dist/src/utils/security.js +37 -0
- package/dist/src/utils/security.js.map +1 -0
- package/dist/src/validate.d.ts +1 -0
- package/dist/src/validate.js +119 -35
- package/dist/src/validate.js.map +1 -1
- package/docs/agent-tasks.md +1 -1
- package/docs/commercial-boundary.md +9 -1
- package/docs/contributor-recognition.md +2 -0
- package/docs/demo.svg +1 -59
- package/docs/mcp-receipts.md +9 -0
- package/docs/mcp-server-safety-index.md +19 -16
- package/docs/metrics-dashboard.md +17 -1
- package/docs/private-mcp-fleet-risk-graph.md +69 -0
- package/docs/receipt-graph.md +118 -31
- package/docs/safety-index/artifacts/chrome-devtools-mcp-server.json +1745 -0
- package/docs/safety-index/artifacts/chrome-devtools-mcp-server.md +169 -0
- package/docs/safety-index/artifacts/filesystem-mcp-server.json +786 -0
- package/docs/safety-index/artifacts/filesystem-mcp-server.md +169 -0
- package/docs/safety-index/mcp-risk-graph.html +167 -0
- package/docs/safety-index/mcp-risk-graph.json +669 -0
- package/docs/safety-index/mcp-risk-graph.md +47 -0
- package/docs/safety-index/targets.json +40 -0
- package/docs/sample-private-fleet-risk-graph.md +90 -0
- package/package.json +21 -11
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,591 @@
|
|
|
1
|
+
> 🇺🇸 English: [README.md](README.md)
|
|
2
|
+
|
|
3
|
+
# MCP Observatory
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
███╗ ███╗ ██████╗██████╗
|
|
7
|
+
████╗ ████║██╔════╝██╔══██╗
|
|
8
|
+
██╔████╔██║██║ ██████╔╝
|
|
9
|
+
██║╚██╔╝██║██║ ██╔═══╝
|
|
10
|
+
██║ ╚═╝ ██║╚██████╗██║
|
|
11
|
+
╚═╝ ╚═╝ ╚═════╝╚═╝
|
|
12
|
+
O B S E R V A T O R Y
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
[](https://github.com/KryptosAI/mcp-observatory/actions/workflows/ci.yml)
|
|
16
|
+
[](https://github.com/KryptosAI/mcp-observatory/actions/workflows/codeql.yml)
|
|
17
|
+
[](https://github.com/KryptosAI/mcp-observatory/actions/workflows/coverage.yml)
|
|
18
|
+
[](https://securityscorecards.dev/viewer/?uri=github.com/KryptosAI/mcp-observatory)
|
|
19
|
+
[](./.github/dependabot.yml)
|
|
20
|
+
[](./.github/workflows/release.yml)
|
|
21
|
+
[](https://www.npmjs.com/package/@kryptosai/mcp-observatory)
|
|
22
|
+
[](https://www.npmjs.com/package/@kryptosai/mcp-observatory)
|
|
23
|
+
[](https://github.com/KryptosAI/mcp-observatory/stargazers)
|
|
24
|
+
[](./LICENSE)
|
|
25
|
+
[](./package.json)
|
|
26
|
+
[](https://smithery.ai/server/@kryptosai/mcp-observatory)
|
|
27
|
+
[](https://glama.ai/mcp/servers/KryptosAI/mcp-observatory)
|
|
28
|
+
[](./CONTRIBUTORS.md)
|
|
29
|
+
[](https://gitee.com/williamweishuhn/mcp-observatory)
|
|
30
|
+
[](https://gitee.com/williamweishuhn/mcp-observatory)
|
|
31
|
+
[](https://registry.modelcontextprotocol.io)
|
|
32
|
+
[](https://mcpmarket.com)
|
|
33
|
+
[](https://mcp-hub.cn)
|
|
34
|
+
[](https://opentools.ai)
|
|
35
|
+
|
|
36
|
+
> 我们热烈欢迎中国开发者贡献代码、文档和新的 MCP 服务器安全索引条目。请查看 CONTRIBUTING.md 了解如何参与。
|
|
37
|
+
|
|
38
|
+
**MCP Observatory 在 AI Agent 依赖 MCP 服务器之前,绘制其风险图谱。** 帮助团队在将 MCP 服务器部署到敏感、受监管或关键任务的 AI Agent 环境之前进行验证。
|
|
39
|
+
|
|
40
|
+
Agent 不应依赖没人测试过的工具。MCP Observatory 将本地 MCP 检查转化为可移植的验证凭证、风险图谱、发布门禁证据、GitHub Code Scanning 的 SARIF、GitHub Actions 门禁、schema 漂移检测、信任状态输出、评分徽章以及 Agent 可访问的诊断信息。
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npx @kryptosai/mcp-observatory audit npx -y my-mcp-server --profile nsa-mcp --format markdown --output mcp-audit.md
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
信任输出示例:
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"target_id": "my-mcp-server",
|
|
51
|
+
"profile": "nsa-mcp",
|
|
52
|
+
"score": 87,
|
|
53
|
+
"status": "needs_review",
|
|
54
|
+
"finding_count": 2
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
`nsa-mcp` 配置文件并非官方认证。它将 MCP Observatory 的发现映射到敏感环境的实用控制领域:信任边界、工具权限、工具描述完整性、认证、密钥暴露、schema 验证、输入验证、可审计性、运行时安全性和供应链。
|
|
59
|
+
|
|
60
|
+
## 信任信号
|
|
61
|
+
|
|
62
|
+
| 信号 | 含义 |
|
|
63
|
+
|---|---|
|
|
64
|
+
| CI + 覆盖率 | 类型检查、lint、测试、构建、打包安装、制品验证、冒烟测试以及覆盖率测量均在 GitHub Actions 中运行。 |
|
|
65
|
+
| CodeQL + OpenSSF Scorecard | 静态分析和供应链态势在 GitHub 原生安全界面中可见。 |
|
|
66
|
+
| Dependabot | npm 和 GitHub Actions 依赖更新每周监控。 |
|
|
67
|
+
| npm 溯源工作流 | 发布自动化已为通过 GitHub OIDC 的 npm 溯源做好准备。 |
|
|
68
|
+
| 安全策略 | 漏洞报告通过私有披露渠道处理;详见 [SECURITY.md](./SECURITY.md)。 |
|
|
69
|
+
|
|
70
|
+
## 试用
|
|
71
|
+
|
|
72
|
+
运行公共证据循环:生成凭证、映射到风险图谱、添加 CI/SARIF,然后在服务器对生产环境至关重要时请求私有集群审查。
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
npx @kryptosai/mcp-observatory audit npx -y my-mcp-server --profile nsa-mcp --format markdown --output report.md
|
|
76
|
+
npx @kryptosai/mcp-observatory audit npx -y my-mcp-server --profile nsa-mcp --format sarif --output results.sarif
|
|
77
|
+
npx @kryptosai/mcp-observatory score npx -y my-mcp-server --profile nsa-mcp --format json
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
或者从首页演示开始:安全地模拟单个服务器的 MCP 攻击准备情况,生成操作凭证,并生成维护者可在 GitHub Code Scanning 中检查的 SARIF 证据。
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
npx @kryptosai/mcp-observatory attack-sim npx -y my-mcp-server --sarif attack-results.sarif
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
生成可移植的信任记录:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npx @kryptosai/mcp-observatory audit npx -y my-mcp-server --profile nsa-mcp --format json --output report.json --receipt receipt.json
|
|
90
|
+
npx @kryptosai/mcp-observatory receipt npx -y my-mcp-server --profile nsa-mcp --format markdown --output receipt.md
|
|
91
|
+
npx @kryptosai/mcp-observatory risk-graph --input receipt.json --json mcp-risk-graph.json --output mcp-risk-graph.md --html mcp-risk-graph.html
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
然后在 CI 中使其可重复执行:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
npx @kryptosai/mcp-observatory setup-ci --all --command "npx -y my-mcp-server" --sarif
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
参见 [政府和企业的试点简报](./docs/government-enterprise-pilot.md)、[公共指导对照表](./docs/public-guidance-crosswalk.md)、[采购一页摘要](./docs/procurement-one-pager.md)、[安全尽职调查包](./docs/security-due-diligence.md)、[NSA-MCP 审计 CI 指南](./docs/nsa-mcp-audit-ci.md)、[NSA-MCP 审计报告示例](./docs/examples/nsa-mcp-audit-report.md)、[MCP 凭证](./docs/mcp-receipts.md)、[MCP 攻击模拟器](./docs/mcp-attack-simulator.md)、[工具调用凭证](./docs/tool-call-receipts.md)、[MCP 风险图谱](./docs/receipt-graph.md)、[私有集群风险图谱试点](./docs/private-mcp-fleet-risk-graph.md)、[发布页面](./docs/launch.md)、[GitHub Code Scanning 演示](./docs/code-scanning-demo.md)、[MCP 服务器的 GitHub Code Scanning](./docs/github-code-scanning-for-mcp.md)、[安全报告示例](./docs/mcp-server-safety-index.md)和[参考评估](./docs/reference-evaluations.md)。
|
|
101
|
+
|
|
102
|
+
想要为你的 Agent 依赖的服务器获取凭证?在 [Drop an MCP server, get a receipt #146](https://github.com/KryptosAI/mcp-observatory/issues/146) 留言,或使用[结构化凭证请求表单](https://github.com/KryptosAI/mcp-observatory/issues/new?template=tool-call-receipt-request.yml)。公开请求可成为安全索引条目、增量凭证、SARIF 证据和维护者 CI 对话。
|
|
103
|
+
|
|
104
|
+
## 可检查的证据
|
|
105
|
+
|
|
106
|
+
| 证据 | 位置 |
|
|
107
|
+
|---|---|
|
|
108
|
+
| GitHub Actions 采用示例 | [`setup-ci --all`](./docs/setup-ci-doctor.md) 及生成的工作流文档 |
|
|
109
|
+
| NSA-MCP 审计示例 | [Markdown 报告](./docs/examples/nsa-mcp-audit-report.md)、[SARIF](./docs/examples/nsa-mcp-results.sarif) 和[评分 JSON](./docs/examples/nsa-mcp-score.json) |
|
|
110
|
+
| 采购和试点包 | [公共指导对照表](./docs/public-guidance-crosswalk.md)、[采购一页摘要](./docs/procurement-one-pager.md) 和[安全尽职调查](./docs/security-due-diligence.md) |
|
|
111
|
+
| 攻击模拟输出 | [MCP 攻击模拟器](./docs/mcp-attack-simulator.md) |
|
|
112
|
+
| MCP 凭证 | [可移植信任凭证](./docs/mcp-receipts.md) |
|
|
113
|
+
| 工具调用凭证 | [凭证标准](./docs/tool-call-receipts.md) — 可复现的 MCP 证据 |
|
|
114
|
+
| 风险图谱 | [服务器到证据的映射](./docs/receipt-graph.md) — Agent 工具链信任决策 |
|
|
115
|
+
| SARIF / Code Scanning 输出 | [GitHub Code Scanning 演示](./docs/code-scanning-demo.md) |
|
|
116
|
+
| 真实 MCP 服务器评估 | [MCP 服务器安全索引](./docs/mcp-server-safety-index.md) |
|
|
117
|
+
| 参考报告 | [参考评估](./docs/reference-evaluations.md) |
|
|
118
|
+
| 维护者和贡献者证明 | [MCP Observatory 贡献者](./docs/contributor-recognition.md) |
|
|
119
|
+
| 开源与商业边界 | [什么是开源 vs. 商业版](./docs/commercial-boundary.md) |
|
|
120
|
+
| 安全披露渠道 | [SECURITY.md](./SECURITY.md) |
|
|
121
|
+
|
|
122
|
+
另外两条快速路径:
|
|
123
|
+
|
|
124
|
+
已克隆此仓库?从这里开始:[`CLONED_THIS.md`](./CLONED_THIS.md)。想要贡献?向 [MCP 目标注册表](./docs/target-registry.md)添加一个服务器,使用 [Agent 任务包](./docs/agent-tasks.md),并通过 [MCP Observatory 贡献者](./docs/contributor-recognition.md)获得公开认可。
|
|
125
|
+
|
|
126
|
+
欢迎 AI 编程助手、Agentic 工作流和粗略的 PR。使用 [10x Agentic 增长冲刺](./docs/10x-agentic-growth-sprint.md)、[Agentic 贡献者外联](./docs/agentic-contributor-outreach.md),或创建一个 `Contributor quest`、`Agentic contribution idea` 或 [`Drop an MCP server, get a receipt`](./docs/drop-server-get-receipt.md) issue 来建议目标、提示词、文档修复、凭证或 `setup-ci --sarif` 集成。
|
|
127
|
+
|
|
128
|
+
一条命令添加 MCP CI 和 Code Scanning:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
npx @kryptosai/mcp-observatory setup-ci --all --command "npx -y my-mcp-server" --sarif --schedule weekly
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
修复或升级现有的采用工具包:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
npx @kryptosai/mcp-observatory setup-ci --doctor --fix
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
在 MCP 服务器项目中安装 MCP Observatory 时也会打印出准确的 CI 设置命令。项目可以通过 [`mcpObservatory.autoSetupCi`](./docs/automatic-ci-integration.md) 选择在安装时自动创建工作流。
|
|
141
|
+
|
|
142
|
+
常规的 `scan` 和 `test` 运行默认包含安全的攻击准备模拟。仅在需要旧版兼容模式时使用 `--no-attack-sim`。
|
|
143
|
+
|
|
144
|
+
当需要安全原生的发布门禁时,将标准化的 MCP 发现上传到 GitHub Code Scanning:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
npx @kryptosai/mcp-observatory setup-ci --all --command "npx -y my-mcp-server" --sarif
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
将 Observatory 添加为 Agent 可访问的 MCP 服务器:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
claude mcp add mcp-observatory -- npx -y @kryptosai/mcp-observatory serve
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
正在构建自主 Agent、类 OpenClaw 的生产力工具、MCP 网关或 bot 运行时?从 [Agent 运行时快速入门](./docs/agent-runtime-quickstart.md)开始,复制 [OpenClaw MCP 可靠性 Agent 模板](./docs/openclaw-agent-template/SOUL.md),或让 Agent 直接阅读 [`llms.txt`](./llms.txt) 和 [`AGENTS.md`](./AGENTS.md)。
|
|
157
|
+
|
|
158
|
+
或立即测试一个服务器:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
npx @kryptosai/mcp-observatory test npx -y @modelcontextprotocol/server-everything
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
可作为 CLI、GitHub Action 或 MCP 服务器使用——让你的 AI Agent 自主扫描、测试、录制、回放和验证其他 MCP 服务器。
|
|
165
|
+
|
|
166
|
+
<p align="center">
|
|
167
|
+
<img src="./docs/demo.svg" alt="MCP Observatory 扫描输出" width="820">
|
|
168
|
+
</p>
|
|
169
|
+
|
|
170
|
+
[](https://glama.ai/mcp/servers/KryptosAI/mcp-observatory)
|
|
171
|
+
|
|
172
|
+
Glama 卡片是外部 MCP 目录评分卡。将其视为目录级别的社交证明;在用作生产审批信号之前,请点击查看底层类别详情。
|
|
173
|
+
|
|
174
|
+
## 为什么选择 MCP Observatory
|
|
175
|
+
|
|
176
|
+
MCP 服务器正在成为生产依赖。如果 Agent 依赖它们,团队需要一种方法在故障到达用户之前捕获损坏的工具、不安全的 schema、schema 漂移、缓慢响应以及安全陷阱。
|
|
177
|
+
|
|
178
|
+
Observatory 为维护者和团队提供:
|
|
179
|
+
|
|
180
|
+
- **一条命令配置 CI** — `setup-ci --all`
|
|
181
|
+
- **基于配置文件的审计** — `audit --profile nsa-mcp`
|
|
182
|
+
- **MCP 凭证** — 封装目标、证据、裁决、操作和复现命令
|
|
183
|
+
- **MCP 风险图谱** — 按能力边界、凭证状态、CI 态势和建议操作对服务器分组
|
|
184
|
+
- **操作凭证** — 输出 `allow`、`gate`、`rerun`、`quarantine` 或 `escalate`
|
|
185
|
+
- **GitHub PR 评论** — 针对兼容性、漂移和安全发现
|
|
186
|
+
- **GitHub Code Scanning SARIF** — 标准化的 MCP 发现
|
|
187
|
+
- **健康评分徽章** — 公开信任信号
|
|
188
|
+
- **录制/回放/验证** — 用于回归测试的工作流
|
|
189
|
+
- **MCP 服务器模式** — Agent 可直接检查其他 MCP 服务器
|
|
190
|
+
- **生产支持路径** — 托管历史、私有仓库报告、认证、支持和集群可见性
|
|
191
|
+
|
|
192
|
+
参见[发布页面](./docs/launch.md)、[MCP 服务器的 GitHub Code Scanning](./docs/github-code-scanning-for-mcp.md)、[Code Scanning 演示](./docs/code-scanning-demo.md)、[目标图库](./docs/target-gallery.md)、[目标注册表](./docs/target-registry.md)、[目标贡献指南](./docs/target-contribution-guide.md)、[MCP Observatory 贡献者](./docs/contributor-recognition.md)、[Agent 任务包](./docs/agent-tasks.md)、[MCP 凭证](./docs/mcp-receipts.md)、[工具调用凭证](./docs/tool-call-receipts.md)、[MCP 风险图谱](./docs/receipt-graph.md)、[`setup-ci --doctor`](./docs/setup-ci-doctor.md)、[MCP 服务器安全实战指南](./docs/mcp-security-field-guide.md)、[安全方法论](./docs/methodology.md)、[MCP 服务器安全索引](./docs/mcp-server-safety-index.md)、[2026 年 6 月安全现场报告](./docs/mcp-safety-field-report-2026-06.md)、[参考评估](./docs/reference-evaluations.md)、[MCP lock 文件](./docs/mcp-lock-files.md)、[公开证明](./docs/proof.md)、[活动归因](./docs/campaign-attribution.md)、[本地指标仪表盘](./docs/metrics-dashboard.md)、[开源与商业边界](./docs/commercial-boundary.md)、[MCP 攻击模拟证据包](./docs/attack-simulation-pilot.md)、[私有 MCP 集群风险图谱](./docs/private-mcp-fleet-risk-graph.md) 和[商业支持](./COMMERCIAL.md)。
|
|
193
|
+
|
|
194
|
+
## 面向安全和平台团队
|
|
195
|
+
|
|
196
|
+
MCP 服务器正在成为 AI 软件供应链的一部分。Agent 在关键任务工作流中依赖工具之前,需要可靠、可测试、可审计的工具。
|
|
197
|
+
|
|
198
|
+
MCP Observatory 为安全和平台团队提供 MCP 服务器 CI、schema 漂移检测、安全发现、SARIF/HTML/Markdown 报告、GitHub Code Scanning 上传,以及通往认证或集群可见性的路径。本地开源使用保持免费;生产环境、私有仓库和集群使用可通过付费的 MCP 准备度审查进行。
|
|
199
|
+
|
|
200
|
+
## 生产支持
|
|
201
|
+
|
|
202
|
+
本地开源使用在 MIT 许可下保持免费。在生产环境中运行 MCP 的团队可以使用[私有 MCP 集群风险图谱](./docs/private-mcp-fleet-risk-graph.md)和[MCP 攻击模拟证据包](./docs/attack-simulation-pilot.md)进行安全模式的攻击模拟、SARIF/Code Scanning 设置、CI 发布、私有证据报告以及面向负责人的修复建议。私有集群风险图谱试点起价为 `$50,000`;攻击模拟包起价为 `$15,000`;范围较小的准备度审查起价为 `$2,500`。
|
|
203
|
+
|
|
204
|
+
开源仓库是公共证据引擎。私有遥测情报、公司/账户优先级排序、商业排名权重、托管集群工作流和买方特定证据包不在 OSS 包范围内;详见[开源与商业边界](./docs/commercial-boundary.md)。
|
|
205
|
+
|
|
206
|
+
运行 `npx @kryptosai/mcp-observatory cloud`,从 Issue 选择器发起试点请求,或参见 [COMMERCIAL.md](./COMMERCIAL.md)。另见[隐私与遥测](./PRIVACY.md)、[活动归因](./docs/campaign-attribution.md) 和[生产使用条款](./TERMS.md)。
|
|
207
|
+
|
|
208
|
+
## 快速开始
|
|
209
|
+
|
|
210
|
+
扫描 Claude 配置中的所有 MCP 服务器:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
npx @kryptosai/mcp-observatory
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
更深入 — 同时调用安全工具以验证其实际运行:
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
npx @kryptosai/mcp-observatory scan deep
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
测试特定服务器:
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
npx @kryptosai/mcp-observatory test npx -y @modelcontextprotocol/server-everything
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
将其添加到 Claude Code 作为 MCP 服务器:
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
claude mcp add mcp-observatory -- npx -y @kryptosai/mcp-observatory serve
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
或手动添加到配置:
|
|
235
|
+
|
|
236
|
+
```json
|
|
237
|
+
{
|
|
238
|
+
"mcpServers": {
|
|
239
|
+
"mcp-observatory": {
|
|
240
|
+
"command": "npx",
|
|
241
|
+
"args": ["-y", "@kryptosai/mcp-observatory", "serve"]
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## 命令
|
|
248
|
+
|
|
249
|
+
| 命令 | 功能 |
|
|
250
|
+
|---------|-------------|
|
|
251
|
+
| `scan` | 自动发现服务器、检查它们,并默认运行安全的攻击准备模拟 |
|
|
252
|
+
| `scan deep` | 扫描、运行安全攻击模拟,并调用安全工具验证其执行 |
|
|
253
|
+
| `test <cmd>` / `test --target <file>` | 通过命令或目标配置测试单个服务器并生成操作凭证 |
|
|
254
|
+
| `record <cmd>` | 将服务器会话录制到 cassette 文件以供离线回放 |
|
|
255
|
+
| `replay <cassette>` | 离线回放 cassette — 无需实时服务器 |
|
|
256
|
+
| `verify <cassette> <cmd>` | 验证实时服务器是否仍匹配录制的 cassette |
|
|
257
|
+
| `diff <base> <head>` | 比较两个运行制品,检测回归和 schema 漂移 |
|
|
258
|
+
| `watch <config>` | 监控服务器变化,在回归时发出警报 |
|
|
259
|
+
| `suggest` | 检测技术栈并从注册表中推荐 MCP 服务器 |
|
|
260
|
+
| `serve` | 作为 MCP 服务器启动,供 AI Agent 使用 |
|
|
261
|
+
| `lock` | 将 MCP 服务器 schema 快照到 lock 文件 |
|
|
262
|
+
| `lock verify` | 验证实时服务器与 lock 文件匹配 |
|
|
263
|
+
| `history` | 显示 MCP 服务器的健康评分趋势 |
|
|
264
|
+
| `setup-ci` / `init-ci` | 创建用于 MCP 兼容性/安全性检查的 GitHub Action 和徽章片段 |
|
|
265
|
+
| `setup-ci --sarif` | 生成将标准化发现上传到 GitHub Code Scanning 的工作流 |
|
|
266
|
+
| `setup-ci --doctor` | 检查仓库是否具有完整的 CI 采用工具包 |
|
|
267
|
+
| `risk-graph --input <path>` | 将凭证和运行制品合并为 JSON、Markdown 和 HTML 的 MCP 风险图谱 |
|
|
268
|
+
| `--no-attack-sim` | 在 `scan` 或 `test` 中退出默认的安全攻击模拟 |
|
|
269
|
+
| `ci-report` | 生成用于 GitHub Issue 创建的 CI 报告 |
|
|
270
|
+
| `enterprise-report` | 从运行制品生成静态的生产/安全报告 |
|
|
271
|
+
| `score <cmd>` | 评分 MCP 服务器的健康状况(0-100) |
|
|
272
|
+
| `badge <cmd>` | 生成 README 用的 SVG 健康评分徽章 |
|
|
273
|
+
| `cloud` | 显示托管报告、安全审查和企业试点选项 |
|
|
274
|
+
|
|
275
|
+
不带参数运行以进入交互菜单。
|
|
276
|
+
|
|
277
|
+
## 功能说明
|
|
278
|
+
|
|
279
|
+
**检查能力** — 连接服务器并验证工具、提示和资源是否正确响应。
|
|
280
|
+
|
|
281
|
+
**调用工具** — 超越列表。实际调用安全工具(无需参数 / readOnlyHint)并报告哪些工作正常、哪些崩溃。
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
npx @kryptosai/mcp-observatory scan deep
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
**检测 schema 漂移** — 对两次运行进行 diff,显示添加/删除的字段、类型变更和破坏性参数更改。
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
npx @kryptosai/mcp-observatory diff run-a.json run-b.json
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
**推荐服务器** — 扫描项目中的语言、框架、数据库和云提供商,然后交叉引用 [MCP 注册表](https://registry.modelcontextprotocol.io)推荐你缺少的服务器。
|
|
294
|
+
|
|
295
|
+
```bash
|
|
296
|
+
npx @kryptosai/mcp-observatory suggest
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
或在 MCP 服务器模式下询问 Agent "我应该添加哪些 MCP 服务器?"
|
|
300
|
+
|
|
301
|
+
**安全扫描** — 分析工具 schema 中的危险模式:shell 注入面、广泛的文件系统访问、缺少认证以及响应中的凭据泄露。
|
|
302
|
+
|
|
303
|
+
```bash
|
|
304
|
+
npx @kryptosai/mcp-observatory test --security npx -y my-mcp-server
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
**录制 / 回放 / 验证** — 捕获实时会话,在 CI 中离线回放,验证无变化。类似 MCP 的 [VCR](https://github.com/vcr/vcr)。
|
|
308
|
+
|
|
309
|
+
```bash
|
|
310
|
+
# 录制会话
|
|
311
|
+
npx @kryptosai/mcp-observatory record npx -y @modelcontextprotocol/server-everything
|
|
312
|
+
|
|
313
|
+
# 离线回放(无需服务器)
|
|
314
|
+
npx @kryptosai/mcp-observatory replay .mcp-observatory/cassettes/latest.cassette.json
|
|
315
|
+
|
|
316
|
+
# 验证实时服务器仍然匹配
|
|
317
|
+
npx @kryptosai/mcp-observatory verify cassette.json npx -y @modelcontextprotocol/server-everything
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
**监控回归** — 按间隔重新运行检查并在发生变化时发出警报。
|
|
321
|
+
|
|
322
|
+
```bash
|
|
323
|
+
npx @kryptosai/mcp-observatory watch target.json
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### 扫描位置
|
|
327
|
+
|
|
328
|
+
运行 `scan` 时,它会在以下位置查找 MCP 配置:
|
|
329
|
+
|
|
330
|
+
- `~/.claude.json` (Claude Code)
|
|
331
|
+
- `~/Library/Application Support/Claude/claude_desktop_config.json` (Claude Desktop, macOS)
|
|
332
|
+
- `%APPDATA%/Claude/claude_desktop_config.json` (Claude Desktop, Windows)
|
|
333
|
+
- `.claude.json` 和 `.mcp.json` (当前目录)
|
|
334
|
+
|
|
335
|
+
## CI / GitHub Action
|
|
336
|
+
|
|
337
|
+
将 Observatory 添加到 MCP 服务器的 CI 流水线:
|
|
338
|
+
|
|
339
|
+
```bash
|
|
340
|
+
npx @kryptosai/mcp-observatory setup-ci --all --command "npx -y my-mcp-server" --sarif --schedule weekly
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
检查采用工具包:
|
|
344
|
+
|
|
345
|
+
```bash
|
|
346
|
+
npx @kryptosai/mcp-observatory setup-ci --doctor
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
成功的 `test`、`run` 和单目标 `scan` 检查也会提供将通过结果转换为 CI 采用工具包的选项。该自动转换默认启用 SARIF/Code Scanning 和每周计划检查;当你只需要保守的工作流而不需要 Code Scanning 上传时,使用 `--no-ci-sarif`。
|
|
350
|
+
|
|
351
|
+
或手动创建工作流:
|
|
352
|
+
|
|
353
|
+
```yaml
|
|
354
|
+
# .github/workflows/observatory.yml
|
|
355
|
+
name: MCP Server Check
|
|
356
|
+
on: [pull_request]
|
|
357
|
+
|
|
358
|
+
permissions:
|
|
359
|
+
contents: read
|
|
360
|
+
|
|
361
|
+
jobs:
|
|
362
|
+
observatory:
|
|
363
|
+
runs-on: ubuntu-latest
|
|
364
|
+
steps:
|
|
365
|
+
- uses: actions/checkout@v4
|
|
366
|
+
- uses: KryptosAI/mcp-observatory/action@v1.28.0
|
|
367
|
+
with:
|
|
368
|
+
command: npx -y my-mcp-server
|
|
369
|
+
deep: true
|
|
370
|
+
security: true
|
|
371
|
+
comment-on-pr: false
|
|
372
|
+
set-status: false
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
Action 输入:
|
|
376
|
+
|
|
377
|
+
| 输入 | 描述 | 默认值 |
|
|
378
|
+
|-------|-------------|---------|
|
|
379
|
+
| `command` | 要测试的服务器命令 | (如果无 `target` 则必需) |
|
|
380
|
+
| `target` | 目标配置 JSON 的路径 | |
|
|
381
|
+
| `targets` | 用于多服务器矩阵扫描的 MCP 配置文件路径 | |
|
|
382
|
+
| `deep` | 同时调用安全工具 | `false` |
|
|
383
|
+
| `security` | 运行安全分析 | `false` |
|
|
384
|
+
| `fail-on-regression` | 发现问题时使 action 失败 | `true` |
|
|
385
|
+
| `fail-on-baseline-drift` | 基线验证检测到漂移时使 action 失败 | `true` |
|
|
386
|
+
| `comment-on-pr` | 以 PR 评论形式发布报告。需要 `pull-requests: write`。 | `true` |
|
|
387
|
+
| `set-status` | 在 HEAD SHA 上设置 commit 状态检查(绿色/红色)。需要 `statuses: write`。 | `true` |
|
|
388
|
+
| `github-token` | 用于 PR 评论和 commit 状态的 Token | `${{ github.token }}` |
|
|
389
|
+
|
|
390
|
+
当工作流授予写入权限时,Action 可以评论 PR 并设置 commit 状态。`setup-ci` 默认生成只读的对第三方友好的工作流,并允许维护者稍后选择加入评论/状态。`init-ci` 作为向后兼容的别名继续可用。所有选项见 [`action/README.md`](./action/README.md)。
|
|
391
|
+
|
|
392
|
+
生产团队可以添加托管 CI 历史、私有仓库报告、定期的安全报告、认证审查、支持和集群可见性。运行 `npx @kryptosai/mcp-observatory cloud`,参见 [COMMERCIAL.md](./COMMERCIAL.md),或从 Issue 选择器发起试点请求。
|
|
393
|
+
|
|
394
|
+
### Certified by MCP Observatory
|
|
395
|
+
|
|
396
|
+
MCP 服务器维护者可以将公开的兼容性/安全信号添加到其 README:
|
|
397
|
+
|
|
398
|
+
```md
|
|
399
|
+
[](https://github.com/KryptosAI/mcp-observatory)
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
或通过实时检查生成评分徽章:
|
|
403
|
+
|
|
404
|
+
```bash
|
|
405
|
+
npx @kryptosai/mcp-observatory badge npx -y my-mcp-server --output docs/mcp-health.svg
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
GitHub Action 模板、维护者 PR 正文和徽章发布手册参见[认证分发循环](./docs/certification-distribution.md)。
|
|
409
|
+
|
|
410
|
+
从本地运行制品生成可用于试点的生产/安全报告:
|
|
411
|
+
|
|
412
|
+
```bash
|
|
413
|
+
npx @kryptosai/mcp-observatory enterprise-report \
|
|
414
|
+
--account "Your Company" \
|
|
415
|
+
--format html \
|
|
416
|
+
--output observatory-enterprise-report.html
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
为了在 CI 中更清晰的内部账户归因,设置:
|
|
420
|
+
|
|
421
|
+
```bash
|
|
422
|
+
MCP_OBSERVATORY_ORG=your-company.com
|
|
423
|
+
MCP_OBSERVATORY_CONTACT=your-team-contact
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
测试飞书/Lark 集成?参见[飞书/Lark MCP 指南](./docs/feishu-lark-mcp.md)。
|
|
427
|
+
|
|
428
|
+
### Lock 文件
|
|
429
|
+
|
|
430
|
+
```bash
|
|
431
|
+
$ npx @kryptosai/mcp-observatory lock # 快照所有服务器 schema
|
|
432
|
+
$ npx @kryptosai/mcp-observatory lock verify # 验证自上次锁定以来无漂移
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
Lock 文件是 AI 工具的 package-lock:提交 MCP 合约,然后在 CI 中让每个工具、schema、提示或资源的漂移可见。参见 [MCP lock 文件](./docs/mcp-lock-files.md)。
|
|
436
|
+
|
|
437
|
+
### 趋势追踪
|
|
438
|
+
|
|
439
|
+
```bash
|
|
440
|
+
$ npx @kryptosai/mcp-observatory history # 显示一段时间内的健康趋势
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
### 夜间扫描
|
|
444
|
+
|
|
445
|
+
```bash
|
|
446
|
+
$ npx @kryptosai/mcp-observatory ci-report # 为 CI 生成回归报告
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
## MCP 服务器模式
|
|
450
|
+
|
|
451
|
+
**没有其他测试工具本身就是一个 MCP 服务器。** 将 Observatory 添加为服务器,你的 AI Agent 就可以自主测试、诊断和监控其他 MCP 服务器。
|
|
452
|
+
|
|
453
|
+
```bash
|
|
454
|
+
claude mcp add mcp-observatory -- npx -y @kryptosai/mcp-observatory serve
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
你的 Agent 获得 10 个工具:
|
|
458
|
+
|
|
459
|
+
| 工具 | 使用场景 |
|
|
460
|
+
|------|---------------|
|
|
461
|
+
| `scan` | 检查所有已配置的 MCP 服务器是否健康 |
|
|
462
|
+
| `check_server` | 安装前或更新后测试特定服务器 |
|
|
463
|
+
| `score_server` | 获取服务器的快速健康评分和等级 |
|
|
464
|
+
| `record` | 捕获正常工作的服务器基线以供未来比较 |
|
|
465
|
+
| `replay` | 针对录制的会话进行测试 — 无需实时服务器 |
|
|
466
|
+
| `verify` | 确认服务器更新未破坏任何内容 |
|
|
467
|
+
| `watch` | 检查服务器并查看自上次检查后的变化 |
|
|
468
|
+
| `diff_runs` | 在两个检查结果之间发现回归 |
|
|
469
|
+
| `get_last_run` | 检索某服务器之前的检查结果 |
|
|
470
|
+
| `suggest_servers` | 发现匹配项目技术栈的 MCP 服务器 |
|
|
471
|
+
|
|
472
|
+
一个检查其他 AI 工具的 AI 工具。它是测试工具的、为工具提供服务的工具。
|
|
473
|
+
|
|
474
|
+
### 安全性
|
|
475
|
+
|
|
476
|
+
MCP 服务器运行在 AI 主机内,其中 LLM 选择调用哪些工具。为防止提示注入攻击:
|
|
477
|
+
|
|
478
|
+
- **命令白名单:** 仅允许 `npx`、`node`、`python`、`python3`、`uvx`、`docker`、`deno`、`bun` 作为基础可执行文件。CLI 无此限制。
|
|
479
|
+
- **路径验证:** 文件读取工具被限制在 runs/cassettes 目录内。
|
|
480
|
+
- **无任意执行:** 使用 CLI 执行无限制的命令。
|
|
481
|
+
|
|
482
|
+
### CLI vs MCP:设计差异
|
|
483
|
+
|
|
484
|
+
| 功能 | CLI | MCP 服务器 | 原因 |
|
|
485
|
+
|---------|-----|------------|-----|
|
|
486
|
+
| `watch` | 轮询循环 | 单次检查 + diff | 请求/响应不支持长轮询 |
|
|
487
|
+
| 交互菜单 | 方向键导航 | 不可用 | MCP 无交互 UI |
|
|
488
|
+
| 彩色输出 | `--no-color` 标志 | 始终纯文本 | MCP 返回结构化内容 |
|
|
489
|
+
| `report` | 渲染已保存的制品 | 不可用 | Agent 直接读取制品 |
|
|
490
|
+
| `serve` | 启动 MCP 服务器 | N/A | 本身就是 MCP 服务器 |
|
|
491
|
+
| `run` | 读取目标配置文件 | 内联参数 | MCP 工具直接接受参数 |
|
|
492
|
+
| `get_last_run` | 不可用(使用 `ls` + `diff`) | 可用 | Agent 的便利功能 |
|
|
493
|
+
|
|
494
|
+
## 兼容性
|
|
495
|
+
|
|
496
|
+
支持使用标准传输协议的任何 MCP 服务器:
|
|
497
|
+
|
|
498
|
+
| 传输协议 | 示例 | 适配器 |
|
|
499
|
+
|-----------|----------|---------|
|
|
500
|
+
| **stdio**(大多数服务器) | [filesystem](https://www.npmjs.com/package/@modelcontextprotocol/server-filesystem)、[memory](https://www.npmjs.com/package/@modelcontextprotocol/server-memory)、[context7](https://www.npmjs.com/package/@upstash/context7-mcp)、[brave-search](https://www.npmjs.com/package/@modelcontextprotocol/server-brave-search)、[sentry](https://www.npmjs.com/package/@sentry/mcp-server)、[notion](https://www.npmjs.com/package/@notionhq/notion-mcp-server)、[stripe](https://www.npmjs.com/package/@stripe/mcp) | `local-process` |
|
|
501
|
+
| **HTTP/SSE**(远程) | [Cloudflare](https://developers.cloudflare.com/mcp/)、[Exa](https://exa.ai)、[Tavily](https://tavily.com) | `http` |
|
|
502
|
+
| **Docker** | 所有 `@modelcontextprotocol/server-*` 镜像 | `local-process`(通过 `docker run -i`) |
|
|
503
|
+
|
|
504
|
+
需要 API 密钥的服务器通过目标配置中的 `env` 工作。Python 服务器通过 `uvx` 工作。已测试的服务器和已知问题参见[完整兼容性矩阵](./docs/compatibility.md)。
|
|
505
|
+
|
|
506
|
+
### 目标配置文件
|
|
507
|
+
|
|
508
|
+
更多控制(环境变量、元数据、自定义超时):
|
|
509
|
+
|
|
510
|
+
```json
|
|
511
|
+
{
|
|
512
|
+
"targetId": "filesystem-server",
|
|
513
|
+
"adapter": "local-process",
|
|
514
|
+
"command": "npx",
|
|
515
|
+
"args": ["-y", "@modelcontextprotocol/server-filesystem", "."],
|
|
516
|
+
"timeoutMs": 15000,
|
|
517
|
+
"skipInvoke": false
|
|
518
|
+
}
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
```bash
|
|
522
|
+
npx @kryptosai/mcp-observatory run --target ./target.json
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
### HTTP / SSE 目标
|
|
526
|
+
|
|
527
|
+
```json
|
|
528
|
+
{
|
|
529
|
+
"targetId": "my-remote-server",
|
|
530
|
+
"adapter": "http",
|
|
531
|
+
"url": "https://mcp.example.com/mcp",
|
|
532
|
+
"authToken": "${MCP_SERVER_TOKEN}",
|
|
533
|
+
"headers": {
|
|
534
|
+
"X-Api-Key": "$MCP_SERVER_API_KEY"
|
|
535
|
+
},
|
|
536
|
+
"timeoutMs": 15000
|
|
537
|
+
}
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
目标配置支持在 `authToken`、`headers` 和 local-process 的 `env` 值中使用 `${VAR}`、`$VAR` 和 `env:VAR` 引用。
|
|
541
|
+
|
|
542
|
+
## 工具对比
|
|
543
|
+
|
|
544
|
+
| 功能 | Observatory | [mcp-recorder](https://github.com/punkpeye/mcp-recorder) | [MCPBench](https://github.com/QuantGeekDev/mcpbench) | [mcp-jest](https://github.com/nicobailon/mcp-jest) |
|
|
545
|
+
|---------|:-----------:|:----------:|:-------:|:-------:|
|
|
546
|
+
| 自动发现服务器 | ✅ | — | — | — |
|
|
547
|
+
| 检查能力 | ✅ | — | ✅ | ✅ |
|
|
548
|
+
| 调用工具 | ✅ | — | — | ✅ |
|
|
549
|
+
| Schema 漂移检测 | ✅ | — | — | — |
|
|
550
|
+
| 录制 / 回放 | ✅ | ✅ | — | — |
|
|
551
|
+
| 对比 cassette 验证 | ✅ | — | — | — |
|
|
552
|
+
| 响应快照 diff | ✅ | — | — | — |
|
|
553
|
+
| 基准测试 / 延迟 | — | — | ✅ | — |
|
|
554
|
+
| Jest 集成 | — | — | — | ✅ |
|
|
555
|
+
| **作为 MCP 服务器运行** | **✅** | — | — | — |
|
|
556
|
+
|
|
557
|
+
每个工具各有所长。Observatory 专注于回归检测和 CI 友好的工作流。mcp-recorder 擅作透明代理。MCPBench 是性能基准测试的首选。如果你已在 Jest 工作流中,mcp-jest 是理想选择。
|
|
558
|
+
|
|
559
|
+
## 灵感来源
|
|
560
|
+
|
|
561
|
+
录制/回放/验证模式受以下项目启发:
|
|
562
|
+
|
|
563
|
+
- [VCR](https://github.com/vcr/vcr) (Ruby) — 首创了基于 cassette 的 HTTP 录制/回放
|
|
564
|
+
- [Polly.js](https://github.com/Netflix/pollyjs) (Netflix) — JavaScript 的 HTTP 交互录制
|
|
565
|
+
- [mcp-recorder](https://github.com/punkpeye/mcp-recorder) — MCP 专用流量录制代理
|
|
566
|
+
- [MCPBench](https://github.com/QuantGeekDev/mcpbench) — MCP 服务器基准测试
|
|
567
|
+
- [mcp-jest](https://github.com/nicobailon/mcp-jest) — MCP 服务器的 Jest 风格测试
|
|
568
|
+
|
|
569
|
+
## 局限性
|
|
570
|
+
|
|
571
|
+
- 需要交互式 OAuth 的服务器(如 Google Drive)需要预先认证才能连接 Observatory
|
|
572
|
+
- 不支持自定义 WebSocket 传输(如 BrowserTools MCP)
|
|
573
|
+
- 少数服务器超时或在初始化前关闭 — 参见[已知问题](./docs/known-issues.md)和[兼容性](./docs/compatibility.md)
|
|
574
|
+
|
|
575
|
+
## 贡献
|
|
576
|
+
|
|
577
|
+
欢迎贡献者!本项目遵循[贡献者公约行为准则](./CODE_OF_CONDUCT.md)。最快的参与方式:
|
|
578
|
+
|
|
579
|
+
[](https://github.com/KryptosAI/mcp-observatory/issues?q=is%3Aopen+label%3A%22good+first+issue%22)
|
|
580
|
+
|
|
581
|
+
```bash
|
|
582
|
+
git clone https://github.com/KryptosAI/mcp-observatory.git && cd mcp-observatory && npm install && npm test
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
最常见的首次贡献是向安全索引添加一个 MCP 服务器(10-15 分钟)。完整的指南、代码标准和贡献者认可阶梯参见 [CONTRIBUTING.md](CONTRIBUTING.md)。
|
|
586
|
+
|
|
587
|
+
我们特别欢迎来自中国和亚洲开发者社区的贡献。如果你对 MCP 安全感兴趣,这是一个早期参与并影响项目方向的机会。
|
|
588
|
+
|
|
589
|
+
---
|
|
590
|
+
|
|
591
|
+
如果 Observatory 帮你避免了一次部署故障,不妨给它一个 [star](https://github.com/KryptosAI/mcp-observatory)。这能帮助更多人发现这个项目。
|
|
@@ -11,38 +11,47 @@ export class HttpAdapter {
|
|
|
11
11
|
if (target.authToken) {
|
|
12
12
|
headers["Authorization"] = `Bearer ${target.authToken}`;
|
|
13
13
|
}
|
|
14
|
-
const client = new Client({ name: "mcp-observatory", version: TOOL_VERSION }, { capabilities: {} });
|
|
15
14
|
const stderrLines = [];
|
|
16
15
|
const url = new URL(target.url);
|
|
17
16
|
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
18
17
|
throw new Error(`Unsupported protocol "${url.protocol}" — only http: and https: are allowed.`);
|
|
19
18
|
}
|
|
20
19
|
const timeoutMs = target.timeoutMs ?? 15_000;
|
|
20
|
+
let mcpClient;
|
|
21
21
|
let activeTransport;
|
|
22
|
+
const makeClient = () => new Client({ name: "mcp-observatory", version: TOOL_VERSION }, { capabilities: {} });
|
|
22
23
|
try {
|
|
24
|
+
mcpClient = makeClient();
|
|
23
25
|
let transport = new StreamableHTTPClientTransport(url, { requestInit: { headers } });
|
|
24
26
|
if (options?.record)
|
|
25
27
|
transport = new RecordingTransport(transport);
|
|
26
|
-
await
|
|
28
|
+
await mcpClient.connect(transport, { timeout: timeoutMs });
|
|
27
29
|
activeTransport = transport;
|
|
28
30
|
}
|
|
29
31
|
catch {
|
|
30
32
|
stderrLines.push("Streamable HTTP failed, falling back to SSE.");
|
|
33
|
+
if (mcpClient) {
|
|
34
|
+
await mcpClient.close().catch(() => undefined);
|
|
35
|
+
mcpClient = undefined;
|
|
36
|
+
}
|
|
31
37
|
}
|
|
32
38
|
if (!activeTransport) {
|
|
33
39
|
try {
|
|
40
|
+
mcpClient = makeClient();
|
|
34
41
|
let transport = new SSEClientTransport(url, { requestInit: { headers } });
|
|
35
42
|
if (options?.record)
|
|
36
43
|
transport = new RecordingTransport(transport);
|
|
37
|
-
await
|
|
44
|
+
await mcpClient.connect(transport, { timeout: timeoutMs });
|
|
38
45
|
activeTransport = transport;
|
|
39
46
|
}
|
|
40
47
|
catch (error) {
|
|
41
48
|
const rawMessage = errorMessage(error);
|
|
42
|
-
|
|
49
|
+
if (mcpClient)
|
|
50
|
+
await mcpClient.close().catch(() => undefined);
|
|
43
51
|
throw new AdapterConnectError(target, rawMessage, stderrLines);
|
|
44
52
|
}
|
|
45
53
|
}
|
|
54
|
+
const client = mcpClient;
|
|
46
55
|
const serverVersion = client.getServerVersion();
|
|
47
56
|
return {
|
|
48
57
|
client,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/adapters/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAInG,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGzD,MAAM,OAAO,WAAW;IACtB,KAAK,CAAC,OAAO,CAAC,MAAwB,EAAE,OAA+B;QACrE,MAAM,OAAO,GAA2B,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QACtE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,CAAC,SAAS,EAAE,CAAC;QAC1D,CAAC;QAED,MAAM,
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/adapters/http.ts"],"names":[],"mappings":"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"}
|