beacon-mfg-mcp 1.10.0 → 1.11.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 +7 -30
- package/http_server.py +1 -1
- package/package.json +2 -3
- package/rfq-kernel/README.md +79 -79
- package/server.py +410 -104
- package/RELEASE.md +0 -150
- package/rfq-kernel/demo_out.txt +0 -166
package/README.md
CHANGED
|
@@ -43,21 +43,12 @@ npx beacon-mfg-mcp logout # 解绑本机令牌
|
|
|
43
43
|
|
|
44
44
|
## 搜索语义
|
|
45
45
|
|
|
46
|
-
**`query`
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
2. **剔填充词** —— 的 / 找 / 一下 / 企业 / 有没有 …;
|
|
50
|
-
3. **认词条** —— 国标别名 / 国标类名 / **能力词**(如 AI·人工智能·机器学习·大模型)→ 走定向召回;
|
|
51
|
-
4. 剩下的部分才作为通用关键词做 **AND** 匹配。
|
|
52
|
-
|
|
53
|
-
返回体用 `query_parsed` 回显解析结果(抽走了哪个城市、剔了哪些词、认出了哪些词条),
|
|
54
|
-
便于调用方判断「命中少」到底是没这类企业、还是这句话没被读懂。
|
|
55
|
-
|
|
56
|
-
**结果顺序**:`results` 先按**召回来源**分档(`via=text` 字面命中 → `via=cap_text` 只撞能力词面
|
|
57
|
-
→ `via=alias` 别名定向 → `via=cap` 能力定向),**同一档内**再按「关键词在**厂名**里成片出现」优先。
|
|
46
|
+
**`query` 直接传用户原话即可**,不必自己拆词。服务端会自动抽城市、剔填充词,
|
|
47
|
+
并识别国标别名 / 类名 / 能力词。返回体的 `query_parsed` 回显解析结果,
|
|
48
|
+
`suggested_gb`(或 `hint`)给出候选国标码。
|
|
58
49
|
|
|
59
50
|
> `score` 是**能力画像分**(有已发布能力卡才有分,无卡为 0),**不是相关度**,不要拿它反推排序;
|
|
60
|
-
>
|
|
51
|
+
> 排序口径见返回体里的 `order_note`。
|
|
61
52
|
|
|
62
53
|
**遇到生词(命中很少)怎么办**:`query` 是字面子串匹配,而名录按国标小类归档 ——
|
|
63
54
|
客户说「机加工」,库里写的是「机械零部件加工」,字面不通。
|
|
@@ -112,21 +103,7 @@ npm i -g beacon-mfg-mcp
|
|
|
112
103
|
|
|
113
104
|
不填 `BEACON_REPO` 时默认走 `https://beacon-mfg.pages.dev`,即开即用。
|
|
114
105
|
|
|
115
|
-
### 方式二 ·
|
|
116
|
-
|
|
117
|
-
```jsonc
|
|
118
|
-
{
|
|
119
|
-
"mcpServers": {
|
|
120
|
-
"beacon-mfg": {
|
|
121
|
-
"command": "python",
|
|
122
|
-
"args": ["/绝对路径/到/beacon-mfg/mcp/server.py"],
|
|
123
|
-
"env": { "BEACON_REPO": "/绝对路径/到/beacon-mfg" }
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
### 方式三 · 远程 HTTP 端点(Streamable HTTP)
|
|
106
|
+
### 方式二 · 远程 HTTP 端点(Streamable HTTP)
|
|
130
107
|
|
|
131
108
|
`server.py` 本体是 stdio;`http_server.py` 是它的 HTTP 传输适配层(同一套业务逻辑)。
|
|
132
109
|
|
|
@@ -142,7 +119,7 @@ MCP_PORT=8787 python http_server.py # 默认 0.0.0.0:8787,端点 /mcp,
|
|
|
142
119
|
|
|
143
120
|
| 变量 | 作用 |
|
|
144
121
|
|---|---|
|
|
145
|
-
| `BEACON_REPO` |
|
|
122
|
+
| `BEACON_REPO` | 指定含 `data/` 的本地目录,改走本地只读模式(维护者用,分发仓库不含数据) |
|
|
146
123
|
| `BEACON_SOURCE` | 覆盖默认数据源基址(HTTP 模式) |
|
|
147
124
|
| `BEACON_MIRRORS` | 追加备用基址(逗号分隔),主源不可达时自动回退 |
|
|
148
125
|
| `BEACON_MASK_PHONE` | 置 `1` 时对手机号隐私处理输出 |
|
|
@@ -154,4 +131,4 @@ MCP_PORT=8787 python http_server.py # 默认 0.0.0.0:8787,端点 /mcp,
|
|
|
154
131
|
- **npm**:`beacon-mfg-mcp`(<https://www.npmjs.com/package/beacon-mfg-mcp>)
|
|
155
132
|
- **GitHub Release**:<https://github.com/eiry16/beacon-mfg/releases>(`mcp-v*` 标签)
|
|
156
133
|
|
|
157
|
-
|
|
134
|
+
版本变更见 GitHub Releases 页面。
|
package/http_server.py
CHANGED
|
@@ -36,7 +36,7 @@ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
|
36
36
|
import server as S # noqa: E402
|
|
37
37
|
|
|
38
38
|
PROTOCOL_VERSION = "2024-11-05"
|
|
39
|
-
SERVER_INFO = {"name": "beacon-mfg-readonly", "version":
|
|
39
|
+
SERVER_INFO = {"name": "beacon-mfg-readonly", "version": S.VERSION}
|
|
40
40
|
MCP_PATH = os.environ.get("MCP_PATH", "/mcp")
|
|
41
41
|
|
|
42
42
|
_sessions = set()
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "beacon-mfg-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.1",
|
|
4
4
|
"description": "Read-only MCP server exposing the BeaconMFG灯塔 directory of business entities across ALL GB/T 4754 industry divisions (manufacturing, services, retail, logistics, catering, IT, and more) to any MCP-compatible agent. No signup and no API key: an anonymous identity is generated on first run, phone binding is optional (only needed for L2 capability cards).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|
|
@@ -36,8 +36,7 @@
|
|
|
36
36
|
"bin/",
|
|
37
37
|
"rfq-kernel/",
|
|
38
38
|
"copy-rfk.js",
|
|
39
|
-
"README.md"
|
|
40
|
-
"RELEASE.md"
|
|
39
|
+
"README.md"
|
|
41
40
|
],
|
|
42
41
|
"scripts": {
|
|
43
42
|
"prepack": "node copy-rfk.js"
|
package/rfq-kernel/README.md
CHANGED
|
@@ -1,79 +1,79 @@
|
|
|
1
|
-
# 寻源内核(需求侧接客引擎)
|
|
2
|
-
|
|
3
|
-
BeaconMFG 的**需求侧接客引擎**:把客户的自然语言采购需求,归一成一份标准询价单(RFQ),
|
|
4
|
-
再拿它去匹配 BeaconMFG 的供应商能力卡。协议版本 `rfq/v1`。
|
|
5
|
-
|
|
6
|
-
它是供给数据(能力卡)的**下游消费者**,不替代能力卡。
|
|
7
|
-
|
|
8
|
-
## 目录
|
|
9
|
-
|
|
10
|
-
```
|
|
11
|
-
skills
|
|
12
|
-
SKILL.md # agent 侧 skill 说明,含与能力卡的关系
|
|
13
|
-
demo.py # 端到端演示(示例场景 + 认证强校验 + 真实卡接入)
|
|
14
|
-
schema/
|
|
15
|
-
rfq.schema.json # 标准询价单 RFQ
|
|
16
|
-
envelope.schema.json # 工厂响应统一信封
|
|
17
|
-
supplier_card.schema.json # 标准化供应商卡(含认证对象强校验)
|
|
18
|
-
industry/ # 行业 pack(11 个):drinkware / mattress / sheet_metal /
|
|
19
|
-
# machining / injection / die_casting / electronics /
|
|
20
|
-
# surface_treatment / fasteners / raw_material /
|
|
21
|
-
# material_handling(输送/物流搬运)
|
|
22
|
-
audience/ # 客户视图:intl_buyer / domestic_downstream
|
|
23
|
-
suppliers/ # 示例供应商卡
|
|
24
|
-
src/
|
|
25
|
-
kernel.py # 协议内核 + cert_satisfied
|
|
26
|
-
intake.py # 需求侧流程(解析/召回/澄清/精筛/投影)
|
|
27
|
-
beacon_adapter.py # beacon-mfg L1 能力卡 → 标准供应商卡(单向)
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## 三个设计要点
|
|
31
|
-
|
|
32
|
-
1. **宽召回 → 分布驱动澄清 → 精筛 → 标准 RFQ**
|
|
33
|
-
先松后紧;澄清选项来自**真实供给分布**,绝不预设空枚举。
|
|
34
|
-
|
|
35
|
-
2. **认证必须可验证**
|
|
36
|
-
`certifications` 为对象 `{code, cert_no, issuer, valid_until, verified}`。
|
|
37
|
-
`cert_satisfied()` 的判定是——**只有 `verified=true` 且 `cert_no` 非空才「作数」**。
|
|
38
|
-
ISO9001 这类认证需要上传证书号并被核验才算数,裸声称等同没有
|
|
39
|
-
(见 demo 的「认证强校验单元」)。
|
|
40
|
-
|
|
41
|
-
3. **它和能力卡不是一回事,不能直接替代**
|
|
42
|
-
- beacon-mfg 能力卡 = **供给数据**(工厂能做什么),由采集/认领流水线生成。
|
|
43
|
-
- 寻源内核 = **需求解析 + 匹配引擎**,能力卡是它的输入。
|
|
44
|
-
- 两者互为上下游,经 `src/beacon_adapter.py` 单向对接:真实卡转成标准供应商卡后,
|
|
45
|
-
内核零改动即可匹配(新增 `sheet_metal` pack 验证)。
|
|
46
|
-
- 能力卡 `limits` 为空时**匹配优雅降级**——交期/认证标「需向工厂确认」,
|
|
47
|
-
而非编造数字。这就是「静态优先、动态降级」的设计。
|
|
48
|
-
|
|
49
|
-
## 验证
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
cd skills
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
预期:示例场景 3 家可承接 / 2 家结构化拒单;认证强校验三档(满足/未核验/缺失);
|
|
56
|
-
真实卡经适配器接入后工艺匹配但硬指标全空 → 降级不中断;
|
|
57
|
-
跨行业 mattress 复用同一内核。
|
|
58
|
-
|
|
59
|
-
## 双源分离(以 mattress 为例)
|
|
60
|
-
|
|
61
|
-
同一件事不要在两个地方各写一份真相。床垫 pack 的划分:
|
|
62
|
-
|
|
63
|
-
- `fire_retardant` —— **物理阻燃特性**(`有阻燃处理` / `无阻燃处理` / `未指定`,`late` 档),
|
|
64
|
-
不含标准码。
|
|
65
|
-
- 标准合规(`BS5852` / `CA TB117` / `GB8624` / `CertiPUR` / `OEKO-TEX`)—— 只留在
|
|
66
|
-
`certifications`,作为可验证的合规真相源。
|
|
67
|
-
|
|
68
|
-
示例卡 `suppliers/SUP-MT-001.json` 的 `industry_ext.fire_retardant` 为 `["有阻燃处理"]`。
|
|
69
|
-
|
|
70
|
-
## 企业怎么建立自己的供给信息
|
|
71
|
-
|
|
72
|
-
- **不用建空 skill**:框架就是能力卡本身。自动采集的卡 `claim.status=unclaimed`、
|
|
73
|
-
`limits` 全 null,正是爬来企业的现状——再写空 skill 只是重复现状。
|
|
74
|
-
- **正确做法 = 认领后自填**:企业认领自己的卡后,在卡上补全 `limits` / `materials` /
|
|
75
|
-
`quality.certifications` / `rfq` 块即可。
|
|
76
|
-
- **RFQ 可达性 = 能力卡上的 `rfq` 块**(`{schema:"rfq/v1", protocol, endpoint}`)。
|
|
77
|
-
只有带这个块的企业才能接收结构化询价。
|
|
78
|
-
- `schema/supplier.schema.json` 的 `agent.capabilities`(含 `rfq`)是 L0 记录上的预留字段,
|
|
79
|
-
当前未启用;**生效的 RFQ 能力位是能力卡上的 `rfq` 块**。
|
|
1
|
+
# 寻源内核(需求侧接客引擎)
|
|
2
|
+
|
|
3
|
+
BeaconMFG 的**需求侧接客引擎**:把客户的自然语言采购需求,归一成一份标准询价单(RFQ),
|
|
4
|
+
再拿它去匹配 BeaconMFG 的供应商能力卡。协议版本 `rfq/v1`。
|
|
5
|
+
|
|
6
|
+
它是供给数据(能力卡)的**下游消费者**,不替代能力卡。
|
|
7
|
+
|
|
8
|
+
## 目录
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
skills/rfq-kernel/
|
|
12
|
+
SKILL.md # agent 侧 skill 说明,含与能力卡的关系
|
|
13
|
+
demo.py # 端到端演示(示例场景 + 认证强校验 + 真实卡接入)
|
|
14
|
+
schema/
|
|
15
|
+
rfq.schema.json # 标准询价单 RFQ
|
|
16
|
+
envelope.schema.json # 工厂响应统一信封
|
|
17
|
+
supplier_card.schema.json # 标准化供应商卡(含认证对象强校验)
|
|
18
|
+
industry/ # 行业 pack(11 个):drinkware / mattress / sheet_metal /
|
|
19
|
+
# machining / injection / die_casting / electronics /
|
|
20
|
+
# surface_treatment / fasteners / raw_material /
|
|
21
|
+
# material_handling(输送/物流搬运)
|
|
22
|
+
audience/ # 客户视图:intl_buyer / domestic_downstream
|
|
23
|
+
suppliers/ # 示例供应商卡
|
|
24
|
+
src/
|
|
25
|
+
kernel.py # 协议内核 + cert_satisfied
|
|
26
|
+
intake.py # 需求侧流程(解析/召回/澄清/精筛/投影)
|
|
27
|
+
beacon_adapter.py # beacon-mfg L1 能力卡 → 标准供应商卡(单向)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## 三个设计要点
|
|
31
|
+
|
|
32
|
+
1. **宽召回 → 分布驱动澄清 → 精筛 → 标准 RFQ**
|
|
33
|
+
先松后紧;澄清选项来自**真实供给分布**,绝不预设空枚举。
|
|
34
|
+
|
|
35
|
+
2. **认证必须可验证**
|
|
36
|
+
`certifications` 为对象 `{code, cert_no, issuer, valid_until, verified}`。
|
|
37
|
+
`cert_satisfied()` 的判定是——**只有 `verified=true` 且 `cert_no` 非空才「作数」**。
|
|
38
|
+
ISO9001 这类认证需要上传证书号并被核验才算数,裸声称等同没有
|
|
39
|
+
(见 demo 的「认证强校验单元」)。
|
|
40
|
+
|
|
41
|
+
3. **它和能力卡不是一回事,不能直接替代**
|
|
42
|
+
- beacon-mfg 能力卡 = **供给数据**(工厂能做什么),由采集/认领流水线生成。
|
|
43
|
+
- 寻源内核 = **需求解析 + 匹配引擎**,能力卡是它的输入。
|
|
44
|
+
- 两者互为上下游,经 `src/beacon_adapter.py` 单向对接:真实卡转成标准供应商卡后,
|
|
45
|
+
内核零改动即可匹配(新增 `sheet_metal` pack 验证)。
|
|
46
|
+
- 能力卡 `limits` 为空时**匹配优雅降级**——交期/认证标「需向工厂确认」,
|
|
47
|
+
而非编造数字。这就是「静态优先、动态降级」的设计。
|
|
48
|
+
|
|
49
|
+
## 验证
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
cd skills/rfq-kernel && PYTHONIOENCODING=utf-8 python demo.py
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
预期:示例场景 3 家可承接 / 2 家结构化拒单;认证强校验三档(满足/未核验/缺失);
|
|
56
|
+
真实卡经适配器接入后工艺匹配但硬指标全空 → 降级不中断;
|
|
57
|
+
跨行业 mattress 复用同一内核。
|
|
58
|
+
|
|
59
|
+
## 双源分离(以 mattress 为例)
|
|
60
|
+
|
|
61
|
+
同一件事不要在两个地方各写一份真相。床垫 pack 的划分:
|
|
62
|
+
|
|
63
|
+
- `fire_retardant` —— **物理阻燃特性**(`有阻燃处理` / `无阻燃处理` / `未指定`,`late` 档),
|
|
64
|
+
不含标准码。
|
|
65
|
+
- 标准合规(`BS5852` / `CA TB117` / `GB8624` / `CertiPUR` / `OEKO-TEX`)—— 只留在
|
|
66
|
+
`certifications`,作为可验证的合规真相源。
|
|
67
|
+
|
|
68
|
+
示例卡 `suppliers/SUP-MT-001.json` 的 `industry_ext.fire_retardant` 为 `["有阻燃处理"]`。
|
|
69
|
+
|
|
70
|
+
## 企业怎么建立自己的供给信息
|
|
71
|
+
|
|
72
|
+
- **不用建空 skill**:框架就是能力卡本身。自动采集的卡 `claim.status=unclaimed`、
|
|
73
|
+
`limits` 全 null,正是爬来企业的现状——再写空 skill 只是重复现状。
|
|
74
|
+
- **正确做法 = 认领后自填**:企业认领自己的卡后,在卡上补全 `limits` / `materials` /
|
|
75
|
+
`quality.certifications` / `rfq` 块即可。
|
|
76
|
+
- **RFQ 可达性 = 能力卡上的 `rfq` 块**(`{schema:"rfq/v1", protocol, endpoint}`)。
|
|
77
|
+
只有带这个块的企业才能接收结构化询价。
|
|
78
|
+
- `schema/supplier.schema.json` 的 `agent.capabilities`(含 `rfq`)是 L0 记录上的预留字段,
|
|
79
|
+
当前未启用;**生效的 RFQ 能力位是能力卡上的 `rfq` 块**。
|