beacon-mfg-mcp 1.5.6 → 1.5.7
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/README.md +138 -294
- package/RELEASE.md +41 -451
- package/bin/beacon-mfg-mcp.js +1 -1
- package/bin/selfupdate.js +2 -2
- package/http_server.py +3 -3
- package/mcp_adapter.py +7 -20
- package/package.json +2 -2
- package/rfq-kernel/README.md +79 -98
- package/rfq-kernel/SKILL.md +77 -80
- package/rfq-kernel/src/beacon_adapter.py +246 -247
- package/rfq-kernel/src/mcp_bridge.py +590 -590
- package/server.py +3261 -3311
package/README.md
CHANGED
|
@@ -1,294 +1,138 @@
|
|
|
1
|
-
# Beacon-MFG 只读 MCP 服务
|
|
2
|
-
|
|
3
|
-
让任意支持 MCP 的主流 agent(Claude Desktop / Cline / Continue /
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
>
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
|
13
|
-
|
|
14
|
-
| `
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
"
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
}
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
```jsonc
|
|
140
|
-
// Claude Desktop / 其它 MCP 客户端配置
|
|
141
|
-
{
|
|
142
|
-
"mcpServers": {
|
|
143
|
-
"beacon-mfg": {
|
|
144
|
-
"command": "python",
|
|
145
|
-
"args": ["/绝对路径/到/beacon-mfg/mcp/server.py"],
|
|
146
|
-
"env": { "BEACON_REPO": "/绝对路径/到/beacon-mfg" }
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
本地模式通过 `git show HEAD:<path>` 读取已提交内容——这是掩码态手机号(138\*\*\*\*0000),
|
|
153
|
-
且不会触发 `maskphone` 的 smudge、不会碰 git index 锁。
|
|
154
|
-
|
|
155
|
-
> **闭合检索缺口(v1.3.0 新增)**:默认 `BEACON_WORKTREE=1`,本地模式会**优先读工作树文件**
|
|
156
|
-
> (含尚未提交 / 刚修改的数据),只在文件缺失或单对象 JSON 解析失败(cron 写入中途的半成品)时
|
|
157
|
-
> 退回 `git show HEAD` 已提交快照,再否则走 HTTP。这样 cron 刚写入、尚未 `git commit` 的记录也能被
|
|
158
|
-
> `get_vendor` / `search_vendors` 检索到。设 `BEACON_WORKTREE=0` 可恢复「只读已提交快照」的严格行为
|
|
159
|
-
> (仍不触发 smudge / 不碰 index 锁)。
|
|
160
|
-
|
|
161
|
-
**方式 B — Cloudflare Pages 公开端点(最省事,需联网)**
|
|
162
|
-
|
|
163
|
-
不设置 `BEACON_REPO` 即可,默认基址 `https://beacon-mfg.pages.dev`。可改:
|
|
164
|
-
|
|
165
|
-
```jsonc
|
|
166
|
-
{ "env": { "BEACON_SOURCE": "https://你的自定义域名/" } }
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
HTTP 模式带正确 `User-Agent` 与 `ETag` 304 缓存(与 App 同款策略),并落盘 `~/.cache/beacon-mcp-cache`,
|
|
170
|
-
重复查询零传输。CF 部署版手机号可能是全号——隐私敏感场景请用方式 A。
|
|
171
|
-
|
|
172
|
-
> **CDN 兜底镜像(v1.3.2 新增)**:默认源 `beacon-mfg.pages.dev` 不可达(抖动/被墙)时,
|
|
173
|
-
> MCP 会**自动回退**到 GitHub 兜底镜像拉 `manifest.json` 与分片——`cdn.jsdelivr.net/gh/eiry16/beacon-mfg@main`
|
|
174
|
-
> 与 `raw.githubusercontent.com/eiry16/beacon-mfg/main`(与 Android App 同策略)。因此「免 clone 检索」
|
|
175
|
-
> 在单一 CDN 失效时仍可工作。如需自定义/追加镜像,设 `BEACON_MIRRORS`(逗号分隔的基址列表)。
|
|
176
|
-
> 注意:能力卡(`get_capability_card`)不在 git 内、仅存于 CF/R2,镜像兜底覆盖的是 manifest + 分片 + 档案这类主数据;
|
|
177
|
-
> 在中国大陆等直连 GitHub 困难的网络,给 MCP 进程设 `HTTPS_PROXY=http://127.0.0.1:7890`(或你的代理)可让镜像链路走代理。
|
|
178
|
-
|
|
179
|
-
## 远程 HTTP 端点(Streamable HTTP)
|
|
180
|
-
|
|
181
|
-
`server.py` 本体是 **stdio**;`http_server.py` 是它的 **HTTP 传输适配层**(复用同一份 `_dispatch`/`TOOLS`,
|
|
182
|
-
业务逻辑一行没动,所以 stdio 与 HTTP 两条链路不会分叉)。
|
|
183
|
-
|
|
184
|
-
```bash
|
|
185
|
-
MCP_PORT=8787 python http_server.py # 默认 0.0.0.0:8787,端点 /mcp,健康检查 /health
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
客户端配置(`type: http` 即 Streamable HTTP):
|
|
189
|
-
|
|
190
|
-
```jsonc
|
|
191
|
-
{ "mcpServers": { "beacon-mfg": { "type": "http", "url": "https://<你的地址>/mcp" } } }
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
**先用隧道验证**(零成本、今天即可验证协议,但 PC 关机即失效):
|
|
195
|
-
|
|
196
|
-
```bash
|
|
197
|
-
cloudflared tunnel --url http://localhost:8787 # 拿到 https://xxx.trycloudflare.com
|
|
198
|
-
# 客户端填 https://xxx.trycloudflare.com/mcp
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
> ⚠️ **现状说明**:`*.trycloudflare.com` 是本机隧道,**不是 7×24**。
|
|
202
|
-
> 若要做成真正常驻的远程端点,需要一台常驻 Python 宿主(云主机 / 容器 PaaS)。
|
|
203
|
-
> 注意 `server.py` 用了 `ThreadPoolExecutor` 并行拉分片,因此**不适合** Cloudflare Python Workers(beta,线程受限)。
|
|
204
|
-
|
|
205
|
-
### 已实测(本地 HTTP 全流程)
|
|
206
|
-
|
|
207
|
-
`GET /health` 200 → `POST /mcp initialize` 200 并下发 `Mcp-Session-Id` →
|
|
208
|
-
`notifications/initialized` **202 空体** → `tools/list` 6 个 tool →
|
|
209
|
-
`tools/call search_vendors{city:苏州, query:"精密 加工"}` 返回 **3742 条命中**(`via_index: true`)。
|
|
210
|
-
|
|
211
|
-
实现要点:`initialize` 响应 `protocolVersion: 2024-11-05`;本服务**不提供** server→client 的 SSE
|
|
212
|
-
主动推送(只读检索不需要),故 `GET /mcp` 返回 405 —— 这是 MCP 规范允许的(MAY NOT)。
|
|
213
|
-
|
|
214
|
-
## 影响评估(对现有系统为零影响)
|
|
215
|
-
|
|
216
|
-
### 1) 对 Android App(Beacon-MFG)— 无影响
|
|
217
|
-
- App 是**纯只读 HTTP 客户端**:运行时只从 `beacon-mfg.pages.dev`(主源)+ jsDelivr / raw.githubusercontent
|
|
218
|
-
(兜底镜像)拉 `manifest.json` → 分片,用 ETag/304 增量更新。它**不调用 MCP、不共享进程/内存/文件**,
|
|
219
|
-
MCP 是 agent 侧独立进程(stdio 拉起),App 根本感知不到它存在。
|
|
220
|
-
- 唯一共享的外部资源是 Cloudflare CDN。只要 MCP 遵守两条(发正确 UA + 复用 ETag 缓存,重活走本地 git),
|
|
221
|
-
就不会触发 Cloudflare Bot Fight Mode(error 1010)——而那正是 App 更新能否成功的前提。服务已内置 UA 与缓存。
|
|
222
|
-
|
|
223
|
-
### 2) 对 cron / GUI 流水线 — 无影响(前提:遵守两条硬规则)
|
|
224
|
-
cron / GUI 是**写方**:`fetch_batch` / `postfetch` 改写 `data/gb`、`data/en`、`data/phone-index.jsonl`
|
|
225
|
-
(经 maskphone clean 过滤脱敏),再发布到 R2 / Pages / GitHub(`fetch_batch` 还持有仓库级 PID 锁
|
|
226
|
-
`.fetch_batch.lock`)。MCP 是**只读**且不调用任何后端脚本,因此:
|
|
227
|
-
|
|
228
|
-
- **硬规则 1 — 默认只读已提交快照,工作树读取受控**:MCP 只从「CF 公开端点」或「`git show HEAD:` 已提交内容」
|
|
229
|
-
读取;`BEACON_WORKTREE=1`(默认)时额外优先读工作树文件以闭合检索缺口,但**仅直接 `open()` 工作树、
|
|
230
|
-
不触发 `git checkout`/smudge、不碰 index 锁**,因此不会重掩码手机号,也只在单对象 JSON 解析失败
|
|
231
|
-
(半成品)时退回 HEAD,避免读到损坏内容。`BEACON_WORKTREE=0` 则恢复纯「只读已提交快照」。
|
|
232
|
-
- **硬规则 2 — 绝不 `git checkout` / `git restore` 本仓库**:这是历史「42578 个手机号被无声掩码」事故的
|
|
233
|
-
根因——smudge 过滤器会把 index 里的脱敏内容写回工作树,且 `git status` 仍显干净。本服务**只**用
|
|
234
|
-
`git show HEAD:`(不触发 smudge、不碰 index 锁),从根上避开。
|
|
235
|
-
- 端口/进程:MCP 走 stdio(无监听端口),与后端 FastAPI(认领/RFQ)端口、cron 的 PID 锁互不冲突。
|
|
236
|
-
- GitHub 推送 / R2 / Pages:`step_git` 用 L0 白名单 + 脱敏安全闸门,MCP 的存在不改变任何发布行为。
|
|
237
|
-
|
|
238
|
-
**结论**:在两条硬规则下,MCP 对 App、cron、GUI 全部零影响;这两条已写进 `server.py` 的实现与注释,
|
|
239
|
-
无法被误用成写操作。
|
|
240
|
-
|
|
241
|
-
## 数据源映射(与 App 完全一致)
|
|
242
|
-
|
|
243
|
-
| 数据 | 路径(相对仓库根) | 说明 |
|
|
244
|
-
|------|-------------------|------|
|
|
245
|
-
| 分片清单 | `data/manifest.json` | App 增量更新的指针,已为「免 clone 检索」设计 |
|
|
246
|
-
| 指纹分片(fp) | `skills/registry/fingerprint/gb/{门}/{码}.jsonl` | 精简记录,供 `search_vendors` |
|
|
247
|
-
| 中文全量(zh) | `data/gb/{门}/{码前2}/{码}.json` | 完整档案,供 `get_vendor` |
|
|
248
|
-
| 能力卡 | `skills/registry/capability/{id}.json` | 不进 git,经 R2 按需提供,供 `get_capability_card` |
|
|
249
|
-
|
|
250
|
-
## 分发 / 版本发布
|
|
251
|
-
|
|
252
|
-
MCP 服务有两种发布渠道(详见 `mcp/RELEASE.md`):
|
|
253
|
-
|
|
254
|
-
- **GitHub Release(已配 CI)**:推送 `mcp-v*` 标签即由 `.github/workflows/mcp-release.yml`
|
|
255
|
-
自动打包 `mcp/` 目录为 `beacon-mfg-mcp-mcp-vX.Y.Z.tar.gz` 并创建 Release。
|
|
256
|
-
- **npm 包(已发布 ✅)**:`beacon-mfg-mcp` 已发布到 npm 公共仓库,当前版本 **`1.3.2`**
|
|
257
|
-
(<https://www.npmjs.com/package/beacon-mfg-mcp>)。第三方可直接 `npm i -g beacon-mfg-mcp`
|
|
258
|
-
或 `npx beacon-mfg-mcp`,客户端配置 `"command": "beacon-mfg-mcp"` 即可,无需 clone、无需填路径。
|
|
259
|
-
**1.3.0 起 npm 包自带 rfq-kernel**,安装 → MCP 握手 → `tools/list` 暴露 6 个 tool 且全部可用
|
|
260
|
-
(含 `start/answer/refine_sourcing` 三个寻源 tool;更早版本不含该桥接,那 3 个 tool 会降级)。
|
|
261
|
-
|
|
262
|
-
### 发布到 npm 的步骤(需要 Access Token,不是 2FA 种子)
|
|
263
|
-
|
|
264
|
-
> ⚠️ **常见误区**:npm 启用 2FA 后给的「密钥 / TOTP 种子」(64 位十六进制串)是给认证器 App 生成动态码用的,
|
|
265
|
-
> **它本身不能用于发布**——直接拿它当 token 会返回 `401 Unauthorized`。
|
|
266
|
-
> 发布必须用 npm 网站生成的 **Granular Access Token**(形如 `npm_...`)。
|
|
267
|
-
|
|
268
|
-
1. 登录 <https://www.npmjs.com> → 右上角头像 → **Access Tokens** → **Generate New Token**
|
|
269
|
-
→ 选 **Granular Access Token**。
|
|
270
|
-
2. 权限选 **Read and write**;如需 CI 自动发布,勾选 **Bypass two-factor authentication**。
|
|
271
|
-
3. 生成后立刻复制(只显示一次),写入仓库根 `.env`:
|
|
272
|
-
```
|
|
273
|
-
NPM_TOKEN=npm_xxxxxxxxxxxxxxxxxxxxxxxxxx
|
|
274
|
-
```
|
|
275
|
-
4. 本地发布(在 `mcp/` 目录):
|
|
276
|
-
```bash
|
|
277
|
-
npm config set //registry.npmjs.org/:_authToken "$NPM_TOKEN"
|
|
278
|
-
npm publish --dry-run # 先预览将要上传的文件
|
|
279
|
-
npm publish
|
|
280
|
-
```
|
|
281
|
-
5. CI 自动发布:把该 token 配进仓库 Secrets 的 `NPM_TOKEN`,之后手动触发
|
|
282
|
-
`.github/workflows/npm-publish.yml` 即可(该工作流已就位)。
|
|
283
|
-
|
|
284
|
-
### 客户端接入速查
|
|
285
|
-
|
|
286
|
-
```jsonc
|
|
287
|
-
// 方式一:GitHub Release / 源码 —— 直接指向 server.py(当前可用)
|
|
288
|
-
{ "mcpServers": { "beacon-mfg": { "command": "python",
|
|
289
|
-
"args": ["/路径/beacon-mfg/mcp/server.py"],
|
|
290
|
-
"env": { "BEACON_REPO": "/路径/beacon-mfg" } } } }
|
|
291
|
-
|
|
292
|
-
// 方式二:npm 安装(推荐,无需 clone、无需填路径)
|
|
293
|
-
{ "mcpServers": { "beacon-mfg": { "command": "beacon-mfg-mcp", "args": [] } } }
|
|
294
|
-
```
|
|
1
|
+
# Beacon-MFG 只读 MCP 服务
|
|
2
|
+
|
|
3
|
+
让任意支持 MCP 的主流 agent(Claude Desktop / Cline / Continue / 常见 MCP 客户端 等)能够**检索与调用**
|
|
4
|
+
灯塔工厂供应商名录,**无需 clone 整个仓库、无需任何密钥、无需第三方依赖**。
|
|
5
|
+
|
|
6
|
+
> **边界**:本服务只做**只读检索**,不参与交易、不写任何数据、不持有任何密钥。
|
|
7
|
+
|
|
8
|
+
## 提供的 tool(8 个,全部只读)
|
|
9
|
+
|
|
10
|
+
| tool | 用途 | 关键参数 |
|
|
11
|
+
|------|------|----------|
|
|
12
|
+
| `search_vendors` | 按 关键词 / 城市 / 国标码 检索,返回精简档案 | `query` `city` `gb` `limit` `offset` |
|
|
13
|
+
| `get_vendor` | 按 id(+国标码)取完整中文档案 | `id`(必填) `gb`(可选,自动反查) |
|
|
14
|
+
| `get_capability_card` | 按 id 取能力卡(工艺/设备/产能/认证等) | `id`(必填) |
|
|
15
|
+
| `suggest_filters` | **把用户原话映射成候选国标小类码**,供改用 `gb=` | `query`(必填) `city` `limit` |
|
|
16
|
+
| `list_industries` | **国标小类货架**(只列有数据的类,附企业条数),供按语义自己挑码 | `keyword` `parent` `limit` `offset` |
|
|
17
|
+
| `start_sourcing` | 【客户 agent 自动触发】识别找厂/代工/采购/询价意图 → 品类识别→宽召回→需求解析→生成 1~2 轮澄清问题,返回 `session_id` | `demand_text`(必填) `audience_id` |
|
|
18
|
+
| `answer_sourcing` | 续接澄清轮次:写回客户答案,返回下一轮澄清问题或初选供应商列表 | `session_id`(必填) `answers` |
|
|
19
|
+
| `refine_sourcing` | 推荐轮次交互:`details`(看详情与 RFQ 入口) / `more`(看更多) / `best`(看最匹配一家) | `session_id`(必填) `action` `value` |
|
|
20
|
+
|
|
21
|
+
后三个构成「采购寻源」多轮会话链路 `start_sourcing → answer_sourcing → refine_sourcing`,同样只读。
|
|
22
|
+
|
|
23
|
+
所有返回都是 JSON 文本。找不到时返回 `{ "error": ... }` 或 `has_card:false`,不会抛协议错。
|
|
24
|
+
|
|
25
|
+
## 搜索语义
|
|
26
|
+
|
|
27
|
+
**`query` 直接传用户原话即可**,不必自己拆词。服务端会先归一化:
|
|
28
|
+
|
|
29
|
+
1. **抽城市** —— 「找一下**苏州**做AI的企业」→ `city=苏州`,城市词不再参与关键词匹配;
|
|
30
|
+
2. **剔填充词** —— 的 / 找 / 一下 / 企业 / 有没有 …;
|
|
31
|
+
3. **认词条** —— 国标别名 / 国标类名 / **能力词**(如 AI·人工智能·机器学习·大模型)→ 走定向召回;
|
|
32
|
+
4. 剩下的部分才作为通用关键词做 **AND** 匹配。
|
|
33
|
+
|
|
34
|
+
返回体用 `query_parsed` 回显解析结果(抽走了哪个城市、剔了哪些词、认出了哪些词条),
|
|
35
|
+
便于调用方判断「命中少」到底是没这类企业、还是这句话没被读懂。
|
|
36
|
+
|
|
37
|
+
**结果顺序**:`results` 先按**召回来源**分档(`via=text` 字面命中 → `via=cap_text` 只撞能力词面
|
|
38
|
+
→ `via=alias` 别名定向 → `via=cap` 能力定向),**同一档内**再按「关键词在**厂名**里成片出现」优先。
|
|
39
|
+
|
|
40
|
+
> `score` 是**能力画像分**(有已发布能力卡才有分,无卡为 0),**不是相关度**,不要拿它反推排序;
|
|
41
|
+
> 返回体的 `order_note` 里写死了这个口径。
|
|
42
|
+
|
|
43
|
+
**遇到生词(命中很少)怎么办**:`query` 是字面子串匹配,而名录按国标小类归档 ——
|
|
44
|
+
客户说「机加工」,库里写的是「机械零部件加工」,字面不通。
|
|
45
|
+
|
|
46
|
+
1. 先正常检索:`search_vendors(query=<用户原话>, city=<城市>)`。
|
|
47
|
+
2. **命中 < 5 条(含 0)就换码**:返回体里的 `suggested_gb`(或 `hint`)已给出候选码;
|
|
48
|
+
不够味就调 `suggest_filters(query, city)` 拿更多候选。
|
|
49
|
+
3. 用 `search_vendors(gb=<码>, city=...)` 重试。**连候选都没有**(如「手机壳」)→
|
|
50
|
+
调 `list_industries` 看货架自己挑 1~3 个码。
|
|
51
|
+
|
|
52
|
+
> 可直接放进 agent 系统提示词:*检索灯塔工厂名录时,若命中数少于 5 条,说明用户说的是口语/采购词:
|
|
53
|
+
> 先看返回的 `suggested_gb`,或调 `suggest_filters` 拿候选国标小类码,再用 `gb=` 重试;
|
|
54
|
+
> 仍无候选则调 `list_industries` 按语义挑码。**不要因为命中少就回答「没有这类企业」**。*
|
|
55
|
+
|
|
56
|
+
## 安装 / 接入
|
|
57
|
+
|
|
58
|
+
服务是**零第三方依赖**的单文件(`server.py`,仅用 Python 标准库),只需 Python 3.8+。
|
|
59
|
+
|
|
60
|
+
### 方式一 · npm 安装(推荐:无需 clone、无需填路径)
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
npm i -g beacon-mfg-mcp
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**macOS / Linux**:
|
|
67
|
+
|
|
68
|
+
```jsonc
|
|
69
|
+
{
|
|
70
|
+
"mcpServers": {
|
|
71
|
+
"beacon-mfg": { "command": "beacon-mfg-mcp", "args": [] }
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Windows(必须走 `cmd /c`)**:
|
|
77
|
+
|
|
78
|
+
```jsonc
|
|
79
|
+
{
|
|
80
|
+
"mcpServers": {
|
|
81
|
+
"beacon-mfg": { "command": "cmd", "args": ["/c", "beacon-mfg-mcp"] }
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
> ⚠️ **Windows 上写 `"command": "beacon-mfg-mcp"` 会 ENOENT**:npm 全局装出来的是
|
|
87
|
+
> `beacon-mfg-mcp.cmd`(`.cmd` 包装器),不经过 shell 的进程启动方式解析不了它,
|
|
88
|
+
> 客户端只会表现成「连不上 / 工具不出现」。`npx -y beacon-mfg-mcp` 同理(`npx` 自身也是 `.cmd`)。
|
|
89
|
+
> 用上表的 `cmd /c` 写法即可。
|
|
90
|
+
|
|
91
|
+
> 中文 Windows 无需额外设置编码:启动器已为 Python 子进程注入 UTF-8,`server.py` 另有兜底,
|
|
92
|
+
> 即使宿主没带任何环境变量也不会乱码或崩。
|
|
93
|
+
|
|
94
|
+
不填 `BEACON_REPO` 时默认走 `https://beacon-mfg.pages.dev`,即开即用。
|
|
95
|
+
|
|
96
|
+
### 方式二 · 本地 git 仓库(离线可用)
|
|
97
|
+
|
|
98
|
+
```jsonc
|
|
99
|
+
{
|
|
100
|
+
"mcpServers": {
|
|
101
|
+
"beacon-mfg": {
|
|
102
|
+
"command": "python",
|
|
103
|
+
"args": ["/绝对路径/到/beacon-mfg/mcp/server.py"],
|
|
104
|
+
"env": { "BEACON_REPO": "/绝对路径/到/beacon-mfg" }
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### 方式三 · 远程 HTTP 端点(Streamable HTTP)
|
|
111
|
+
|
|
112
|
+
`server.py` 本体是 stdio;`http_server.py` 是它的 HTTP 传输适配层(同一套业务逻辑)。
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
MCP_PORT=8787 python http_server.py # 默认 0.0.0.0:8787,端点 /mcp,健康检查 /health
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
```jsonc
|
|
119
|
+
{ "mcpServers": { "beacon-mfg": { "type": "http", "url": "https://<你的地址>/mcp" } } }
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## 环境变量
|
|
123
|
+
|
|
124
|
+
| 变量 | 作用 |
|
|
125
|
+
|---|---|
|
|
126
|
+
| `BEACON_REPO` | 指定本地仓库根,改走本地只读模式(离线可用) |
|
|
127
|
+
| `BEACON_SOURCE` | 覆盖默认数据源基址(HTTP 模式) |
|
|
128
|
+
| `BEACON_MIRRORS` | 追加备用基址(逗号分隔),主源不可达时自动回退 |
|
|
129
|
+
| `BEACON_MASK_PHONE` | 置 `1` 时对手机号隐私处理输出 |
|
|
130
|
+
|
|
131
|
+
## 分发与版本
|
|
132
|
+
|
|
133
|
+
两种发布渠道,版本号一致:
|
|
134
|
+
|
|
135
|
+
- **npm**:`beacon-mfg-mcp`(<https://www.npmjs.com/package/beacon-mfg-mcp>)
|
|
136
|
+
- **GitHub Release**:<https://github.com/eiry16/beacon-mfg/releases>(`mcp-v*` 标签)
|
|
137
|
+
|
|
138
|
+
变更说明见本目录 `RELEASE.md`。
|