beacon-mfg-mcp 1.12.0 → 1.12.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/README.md +3 -1
- package/bin/beacon-mfg-mcp.js +57 -57
- package/identity.py +576 -576
- package/package.json +52 -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 +6218 -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
|
|
|
@@ -153,7 +155,7 @@ MCP_PORT=8787 python http_server.py # 默认 0.0.0.0:8787,端点 /mcp,
|
|
|
153
155
|
|
|
154
156
|
| 变量 | 作用 |
|
|
155
157
|
|---|---|
|
|
156
|
-
| `BEACON_REPO` | 指定含 `data/`
|
|
158
|
+
| `BEACON_REPO` | 指定含 `data/` 的本地目录,改走本地只读模式(默认走线上服务) |
|
|
157
159
|
| `BEACON_SOURCE` | 覆盖默认数据源基址(HTTP 模式) |
|
|
158
160
|
| `BEACON_MIRRORS` | 追加备用基址(逗号分隔),主源不可达时自动回退 |
|
|
159
161
|
| `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);
|