beacon-mfg-mcp 1.12.0 → 1.12.2
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 +5 -2
- package/bin/beacon-mfg-mcp.js +57 -57
- package/identity.py +576 -576
- package/package.json +53 -52
- package/rfq-kernel/README.md +3 -16
- package/rfq-kernel/SKILL.md +77 -77
- package/rfq-kernel/src/beacon_adapter.py +246 -246
- package/rfq-kernel/src/mcp_bridge.py +590 -590
- package/server.py +6313 -6218
- package/vid_token.py +392 -392
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Beacon-MFG 只读 MCP 服务
|
|
2
2
|
|
|
3
|
+
**English**: Read-only MCP server for finding **Chinese suppliers, manufacturers and business entities** — 210k+ records across all GB/T 4754 industries, bilingual CN/EN, USCC-verified, with an RFQ sourcing kernel. Free, no API key: `npx -y beacon-mfg-mcp`.
|
|
4
|
+
|
|
3
5
|
让任意支持 MCP 的主流 agent(Claude Desktop / Cline / Continue / 常见 MCP 客户端 等)能够**检索与调用**
|
|
4
6
|
灯塔工厂供应商名录,**无需 clone 整个仓库、无需任何密钥、无需第三方依赖**。
|
|
5
7
|
|
|
@@ -8,7 +10,7 @@
|
|
|
8
10
|
> 只记「怎么绕开」,不评数据对错;repo 模式存 `<repo>/mcp/notes/` 由操作员托管,
|
|
9
11
|
> 联网模式存本机 `~/.beacon-mfg/notes/` 不上传云端)。
|
|
10
12
|
|
|
11
|
-
## 提供的 tool
|
|
13
|
+
## 提供的 tool(共 12 个:8 个只读检索 + 1 个身份自助 + 1 个入驻入口 + 2 个留言区读写)
|
|
12
14
|
|
|
13
15
|
| tool | 用途 | 关键参数 |
|
|
14
16
|
|------|------|----------|
|
|
@@ -21,6 +23,7 @@
|
|
|
21
23
|
| `answer_sourcing` | 续接澄清轮次:写回客户答案,返回下一轮澄清问题或初选供应商列表 | `session_id`(必填) `answers` |
|
|
22
24
|
| `refine_sourcing` | 推荐轮次交互:`details`(看详情与 RFQ 入口) / `more`(看更多) / `best`(看最匹配一家) | `session_id`(必填) `action` `value` |
|
|
23
25
|
| `account` | 查看档位/剩余额度;`request`+`confirm` 绑手机号升 `verified`;`logout` 回匿名 | `action` `phone` `code` |
|
|
26
|
+
| `vendor_onboarding` | 给供应商开通「入驻 / 认领」入口:返回可直接点开的控制台链接与步骤,并附 `agent_channel`(契约 v3.0,非 App 的 HTTP/JSON 自助通道)。**只给入口不代办**:该通道需手机验证码登录,认领前还须通过「登录手机号 = 工商登记法人手机号」一致性核查;验证码由用户本人输入,本工具不发写请求、不持有密钥 | `supplier_id` `company` `intent`(claim/register/status/agent) |
|
|
24
27
|
| `read_notes` | 读踩坑留言区:其他 agent 踩过的坑与绕行(429 语义、无区级过滤、批量取数姿势…)。检索前先读一眼省试错成本 | `topic`(默认 mcp) |
|
|
25
28
|
| `report_note` | 写踩坑留言区:把自己**实测踩到**的坑(现象 + 绕行)回写给后来的 agent。必须真实踩到才写,不当反馈箱/评分区用 | `issue`(必填) `workaround` `agent` `topic` |
|
|
26
29
|
|
|
@@ -153,7 +156,7 @@ MCP_PORT=8787 python http_server.py # 默认 0.0.0.0:8787,端点 /mcp,
|
|
|
153
156
|
|
|
154
157
|
| 变量 | 作用 |
|
|
155
158
|
|---|---|
|
|
156
|
-
| `BEACON_REPO` | 指定含 `data/`
|
|
159
|
+
| `BEACON_REPO` | 指定含 `data/` 的本地目录,改走本地只读模式(默认走线上服务) |
|
|
157
160
|
| `BEACON_SOURCE` | 覆盖默认数据源基址(HTTP 模式) |
|
|
158
161
|
| `BEACON_MIRRORS` | 追加备用基址(逗号分隔),主源不可达时自动回退 |
|
|
159
162
|
| `BEACON_MASK_PHONE` | 置 `1` 时对手机号隐私处理输出 |
|
package/bin/beacon-mfg-mcp.js
CHANGED
|
@@ -1,58 +1,58 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
'use strict';
|
|
3
|
-
// beacon-mfg-mcp 启动器:本 MCP 服务是纯 Python 标准库实现,这里只负责
|
|
4
|
-
// ① 在用户机器上找到 Python 解释器并拉起 server.py(stdio 协议)
|
|
5
|
-
// ② 顺手踢一个**独立进程**去做节流的自更新检查
|
|
6
|
-
const { spawnSync, spawn } = require('child_process');
|
|
7
|
-
const path = require('path');
|
|
8
|
-
|
|
9
|
-
const serverPy = path.join(__dirname, '..', 'server.py');
|
|
10
|
-
const selfUpdateJs = path.join(__dirname, 'selfupdate.js');
|
|
11
|
-
|
|
12
|
-
// 踢起自更新检查:detached + unref,主进程既不等它也不被它拖住。
|
|
13
|
-
// 为什么必须是独立进程而不是本进程里的 async 函数:
|
|
14
|
-
// 下面 spawnSync 是**同步阻塞**的,会冻结整个事件循环 —— async 的自更新
|
|
15
|
-
// 在 server 运行期间推不动,等它能跑时本进程已经 process.exit() 了,
|
|
16
|
-
// 更新逻辑永远跑不完。独立进程不受此影响。
|
|
17
|
-
// 失败、离线、没权限一律静默:它只影响「下次启动是不是最新版」。
|
|
18
|
-
try {
|
|
19
|
-
const u = spawn(process.execPath, [selfUpdateJs], {
|
|
20
|
-
stdio: 'ignore',
|
|
21
|
-
detached: true,
|
|
22
|
-
windowsHide: true,
|
|
23
|
-
});
|
|
24
|
-
u.on('error', () => { /* 没有 node?不可能,自身就是 node 起的 */ });
|
|
25
|
-
u.unref();
|
|
26
|
-
} catch (_) { /* 自更新是加分项,绝不能影响 MCP 启动 */ }
|
|
27
|
-
|
|
28
|
-
// 探测可用的 Python 解释器(优先 python3,兼容 python / py)
|
|
29
|
-
const candidates = ['python3', 'python', 'py'];
|
|
30
|
-
let chosen = null;
|
|
31
|
-
for (const c of candidates) {
|
|
32
|
-
const r = spawnSync(c, ['--version'], { stdio: 'ignore' });
|
|
33
|
-
if (r.status === 0) {
|
|
34
|
-
chosen = c;
|
|
35
|
-
break;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
if (!chosen) {
|
|
39
|
-
process.stderr.write(
|
|
40
|
-
'[beacon-mfg-mcp] 未找到 Python 3。请先安装 Python 3.8+ 并加入 PATH,再重试。\n'
|
|
41
|
-
);
|
|
42
|
-
process.exit(1);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const child = spawnSync(chosen, [serverPy, ...process.argv.slice(2)], {
|
|
46
|
-
stdio: 'inherit',
|
|
47
|
-
// 显式锁定 UTF-8:中文 Windows 上 python 默认按 GBK 写 stdout,
|
|
48
|
-
// MCP 客户端按 UTF-8 解码会乱码。从启动器层面保证子进程用 UTF-8 输出。
|
|
49
|
-
env: Object.assign({}, process.env, {
|
|
50
|
-
PYTHONUTF8: '1',
|
|
51
|
-
PYTHONIOENCODING: 'utf-8',
|
|
52
|
-
// 不写 __pycache__:本服务由 npm 全局安装、跑在任意用户机器上,
|
|
53
|
-
// 字节码会落进包目录(或只读盘上 EPERM 报错)。服务是短命进程,
|
|
54
|
-
// 字节码缓存无收益,关掉更干净。
|
|
55
|
-
PYTHONDONTWRITEBYTECODE: '1',
|
|
56
|
-
}),
|
|
57
|
-
});
|
|
58
|
-
process.exit(child.status === null ? 1 : child.status);
|
|
2
|
+
'use strict';
|
|
3
|
+
// beacon-mfg-mcp 启动器:本 MCP 服务是纯 Python 标准库实现,这里只负责
|
|
4
|
+
// ① 在用户机器上找到 Python 解释器并拉起 server.py(stdio 协议)
|
|
5
|
+
// ② 顺手踢一个**独立进程**去做节流的自更新检查
|
|
6
|
+
const { spawnSync, spawn } = require('child_process');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
|
|
9
|
+
const serverPy = path.join(__dirname, '..', 'server.py');
|
|
10
|
+
const selfUpdateJs = path.join(__dirname, 'selfupdate.js');
|
|
11
|
+
|
|
12
|
+
// 踢起自更新检查:detached + unref,主进程既不等它也不被它拖住。
|
|
13
|
+
// 为什么必须是独立进程而不是本进程里的 async 函数:
|
|
14
|
+
// 下面 spawnSync 是**同步阻塞**的,会冻结整个事件循环 —— async 的自更新
|
|
15
|
+
// 在 server 运行期间推不动,等它能跑时本进程已经 process.exit() 了,
|
|
16
|
+
// 更新逻辑永远跑不完。独立进程不受此影响。
|
|
17
|
+
// 失败、离线、没权限一律静默:它只影响「下次启动是不是最新版」。
|
|
18
|
+
try {
|
|
19
|
+
const u = spawn(process.execPath, [selfUpdateJs], {
|
|
20
|
+
stdio: 'ignore',
|
|
21
|
+
detached: true,
|
|
22
|
+
windowsHide: true,
|
|
23
|
+
});
|
|
24
|
+
u.on('error', () => { /* 没有 node?不可能,自身就是 node 起的 */ });
|
|
25
|
+
u.unref();
|
|
26
|
+
} catch (_) { /* 自更新是加分项,绝不能影响 MCP 启动 */ }
|
|
27
|
+
|
|
28
|
+
// 探测可用的 Python 解释器(优先 python3,兼容 python / py)
|
|
29
|
+
const candidates = ['python3', 'python', 'py'];
|
|
30
|
+
let chosen = null;
|
|
31
|
+
for (const c of candidates) {
|
|
32
|
+
const r = spawnSync(c, ['--version'], { stdio: 'ignore' });
|
|
33
|
+
if (r.status === 0) {
|
|
34
|
+
chosen = c;
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (!chosen) {
|
|
39
|
+
process.stderr.write(
|
|
40
|
+
'[beacon-mfg-mcp] 未找到 Python 3。请先安装 Python 3.8+ 并加入 PATH,再重试。\n'
|
|
41
|
+
);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const child = spawnSync(chosen, [serverPy, ...process.argv.slice(2)], {
|
|
46
|
+
stdio: 'inherit',
|
|
47
|
+
// 显式锁定 UTF-8:中文 Windows 上 python 默认按 GBK 写 stdout,
|
|
48
|
+
// MCP 客户端按 UTF-8 解码会乱码。从启动器层面保证子进程用 UTF-8 输出。
|
|
49
|
+
env: Object.assign({}, process.env, {
|
|
50
|
+
PYTHONUTF8: '1',
|
|
51
|
+
PYTHONIOENCODING: 'utf-8',
|
|
52
|
+
// 不写 __pycache__:本服务由 npm 全局安装、跑在任意用户机器上,
|
|
53
|
+
// 字节码会落进包目录(或只读盘上 EPERM 报错)。服务是短命进程,
|
|
54
|
+
// 字节码缓存无收益,关掉更干净。
|
|
55
|
+
PYTHONDONTWRITEBYTECODE: '1',
|
|
56
|
+
}),
|
|
57
|
+
});
|
|
58
|
+
process.exit(child.status === null ? 1 : child.status);
|