beacon-mfg-mcp 1.12.1 → 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.
Files changed (3) hide show
  1. package/README.md +2 -1
  2. package/package.json +3 -2
  3. package/server.py +121 -26
package/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
  > 只记「怎么绕开」,不评数据对错;repo 模式存 `<repo>/mcp/notes/` 由操作员托管,
11
11
  > 联网模式存本机 `~/.beacon-mfg/notes/` 不上传云端)。
12
12
 
13
- ## 提供的 tool(8 个只读 + 1 个身份自助 + 1 个入驻入口 + 踩坑留言区读写)
13
+ ## 提供的 tool(共 12 个:8 个只读检索 + 1 个身份自助 + 1 个入驻入口 + 2 个留言区读写)
14
14
 
15
15
  | tool | 用途 | 关键参数 |
16
16
  |------|------|----------|
@@ -23,6 +23,7 @@
23
23
  | `answer_sourcing` | 续接澄清轮次:写回客户答案,返回下一轮澄清问题或初选供应商列表 | `session_id`(必填) `answers` |
24
24
  | `refine_sourcing` | 推荐轮次交互:`details`(看详情与 RFQ 入口) / `more`(看更多) / `best`(看最匹配一家) | `session_id`(必填) `action` `value` |
25
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) |
26
27
  | `read_notes` | 读踩坑留言区:其他 agent 踩过的坑与绕行(429 语义、无区级过滤、批量取数姿势…)。检索前先读一眼省试错成本 | `topic`(默认 mcp) |
27
28
  | `report_note` | 写踩坑留言区:把自己**实测踩到**的坑(现象 + 绕行)回写给后来的 agent。必须真实踩到才写,不当反馈箱/评分区用 | `issue`(必填) `workaround` `agent` `topic` |
28
29
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "beacon-mfg-mcp",
3
- "version": "1.12.1",
3
+ "version": "1.12.2",
4
4
  "mcpName": "io.github.eiry16/beacon-mfg-mcp",
5
5
  "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).",
6
6
  "keywords": [
@@ -43,7 +43,8 @@
43
43
  "README.md"
44
44
  ],
45
45
  "scripts": {
46
- "prepack": "node copy-rfk.js"
46
+ "prepack": "node copy-rfk.js",
47
+ "prepublishOnly": "node -e \"const{execSync}=require('child_process');const py=process.platform==='win32'?'python':'python3';execSync(py+' check_release.py',{stdio:'inherit'})\""
47
48
  },
48
49
  "engines": {
49
50
  "node": ">=16"
package/server.py CHANGED
@@ -341,7 +341,7 @@ def _recall_for_sourcing(text: str, top_k: int = 200, pack_id: str | None = None
341
341
  # 都对齐到这个值,`scripts/check_version.py` 在发布前校验它们没有漂移。
342
342
  # 读不到 package.json 时的兜底值 —— 改版本时**必须**和 package.json 一起改,
343
343
  # 否则 check_version.py 会报错(这就是它的用途)。
344
- VERSION_FALLBACK = "1.12.0"
344
+ VERSION_FALLBACK = "1.12.2"
345
345
 
346
346
 
347
347
  def _pkg_version() -> str:
@@ -5665,15 +5665,19 @@ TOOLS = [
5665
5665
  "在自己的浏览器里输入 —— 让他把验证码念给你,等于把「证明他是这家企业」"
5666
5666
  "的凭证交给第三方,还会进入对话上下文与日志。"
5667
5667
  "⚠ 不要替用户编造企业信息,不要承诺审核结果或时效,"
5668
- "也不要把未认领的企业说成「已经属于你」。",
5668
+ "也不要把未认领的企业说成「已经属于你」。\n"
5669
+ "返回体另带 agent_channel(契约 v3.0):一条**非手机 App** 的 HTTP/JSON 自助通道,"
5670
+ "供供应商自己的 Agent 认领并上传资料(intent=agent 看完整说明)。"
5671
+ "该通道必须手机验证码登录,且认领前还要求「登录手机号 = 工商登记法人手机号」"
5672
+ "一致性核查通过。本工具仍然只读指路,不发任何写请求、不持有密钥。",
5669
5673
  "inputSchema": {
5670
5674
  "type": "object",
5671
5675
  "properties": {
5672
5676
  "supplier_id": {"type": "string",
5673
5677
  "description": "可选。已在检索结果里拿到的企业 ID(如 CN-MFG-0020317),用于生成直达深链,省得用户再搜一遍公司名"},
5674
5678
  "company": {"type": "string", "description": "可选。企业名称,用于把步骤说得更具体"},
5675
- "intent": {"type": "string", "enum": ["claim", "register", "status"],
5676
- "description": "claim=认领库里已收录的企业(默认);register=库里没有、要新建档;status=查自己申请的审核进度"},
5679
+ "intent": {"type": "string", "enum": ["claim", "register", "status", "agent"],
5680
+ "description": "claim=认领库里已收录的企业(默认);register=库里没有、要新建档;status=查自己申请的审核进度;agent=看非 App 的 Agent HTTP 自助通道(端点契约 + 用法)"},
5677
5681
  },
5678
5682
  },
5679
5683
  },
@@ -5716,21 +5720,33 @@ TOOLS = [
5716
5720
 
5717
5721
 
5718
5722
  CONSOLE_BASE = "https://beacon-mfg.pages.dev/console/"
5723
+ AGENT_API_BASE = "https://beacon-mfg.pages.dev/api"
5724
+ AGENT_CONTRACT_URL = "https://beacon-mfg.pages.dev/agent-onboard.json"
5719
5725
 
5720
5726
 
5721
5727
  def vendor_onboarding(supplier_id: str = "", company: str = "",
5722
5728
  intent: str = "claim") -> Dict[str, Any]:
5723
- """给供应商一个**能自己走完**的入驻入口。
5729
+ """给供应商两个**能自己走完**的入驻入口:浏览器控制台,以及非 App 的 Agent HTTP 通道。
5724
5730
 
5725
- 为什么 MCP 只做到「给链接」为止
5731
+ 为什么 MCP 本身只做到「指路」
5726
5732
  ------------------------------
5727
- Agent 拿得到 HTML 也没用(它不会填表单)。但更要紧的是**凭证不能进对话**:
5728
- 认领要过短信验证码与法人手机核验,让用户把验证码念给 Agent,等于把
5729
- 「证明我是这家企业」的东西交给第三方,还顺带落进 LLM 上下文与日志。
5730
- 所以这里只返回链接 + 步骤 + 明确的边界,由用户在浏览器里自己完成。
5731
-
5732
- 同源红线:即便将来 Agent 能代填字段,也必须企业自己确认过才算「企业自述」——
5733
- 否则就是拿平台推断冒充企业说的话。
5733
+ 公开 MCP 包是只读的(文件头红线):任何匿名 Agent 都能调用检索工具,
5734
+ 在里面塞写工具等于让检索方顺手改别人的企业档案。所以写能力放在**独立
5735
+ HTTP 通道**,由企业自己的 Agent 持「手机验证码登录签发的用户 JWT」调用,
5736
+ 且认领一律以 pending 申请结束,交人工复核。
5737
+
5738
+ 认领的两段身份证明(v3.0)
5739
+ --------------------------
5740
+ ① 手机验证码登录(腾讯云短信)→ JWT,证明「持有这个手机号」;
5741
+ ② 该手机号必须与「平台已核验的工商登记法人手机号基准」一致,
5742
+ 证明「这个号是这家企业工商登记的法人手机号」。
5743
+ 两者都成立才允许提交认领。工商登记法人手机号不是公开可查数据,
5744
+ 基准由平台依据营业执照/工商档案人工核实后登记,可信级别
5745
+ platform_manual_verified,不冒充政府接口核验。
5746
+
5747
+ 凭证边界仍然成立:短信验证码这类「证明我是这家企业」的东西由企业本人
5748
+ 在浏览器输入,Agent 不得索取、转述或编造;USCC 由企业自己提供,
5749
+ 且它只是公开信息,不足以单独构成认领依据。
5734
5750
  """
5735
5751
  from urllib.parse import quote as _q
5736
5752
 
@@ -5753,25 +5769,94 @@ def vendor_onboarding(supplier_id: str = "", company: str = "",
5753
5769
  url = CONSOLE_BASE + ("?id=" + _q(sid, safe="") if sid else "")
5754
5770
  intent = (intent or "claim").strip().lower()
5755
5771
 
5756
- if intent == "register":
5772
+ # 非手机 App 的写入通道。只描述契约,不代发请求、不持有任何密钥。
5773
+ agent_channel = {
5774
+ "kind": "http-json",
5775
+ "no_app_required": True,
5776
+ "auth_required": True,
5777
+ "contract_url": AGENT_CONTRACT_URL,
5778
+ "api_base": AGENT_API_BASE,
5779
+ "docs": "契约 JSON 本身即完整文档;平台本地工作副本另有 docs/AGENT_ONBOARD.md"
5780
+ "(非分发面,不在公开 GitHub 仓库)",
5781
+ "client": "按契约用任意 HTTP 客户端 / curl 实现即可;平台工作副本另有 scripts/agent_onboard.py "
5782
+ "CLI(同样不在公开仓库)",
5783
+ "contract_version": "3.1",
5784
+ "auth": {
5785
+ "login": "POST /auth/sms/send → /auth/sms/verify(腾讯云短信真实下发,"
5786
+ "验证码由企业本人输入)→ 用户 JWT(30 天)",
5787
+ "required": "所有 /agent/* 端点必须带 Authorization: Bearer <JWT>;匿名与伪造 token 均 401,"
5788
+ "后端 get_current_user 真校验,Worker 层再做一次前置拒绝",
5789
+ "operator": "仅平台人工复核使用 BEACON_OPERATOR_TOKEN,外部 Agent 不持有",
5790
+ },
5791
+ "legal_phone_gate": {
5792
+ "rule": "提交认领前,登录手机号必须等于该企业工商登记法人手机号;"
5793
+ "不一致 / 无基准 / 未登录一律拒绝且不落申请",
5794
+ "why": "短信验证码只证明持有号码;平台已核验的法人手机号基准才证明该号属于这家企业",
5795
+ "data_source": "工商登记法人手机号不是公开可查数据(公示系统只公开法人姓名);"
5796
+ "基准由 operator 依据营业执照/工商档案人工核实后登记,"
5797
+ "只存 HMAC 哈希,可信级别 platform_manual_verified",
5798
+ "check": "GET /agent/legal-phone/check?supplier_id=... → status: match 才放行",
5799
+ "bootstrap": "no_baseline 时 POST /agent/legal-phone/request 发起核验申请;"
5800
+ "平台建立基准后用同一手机号登录即可通过",
5801
+ "denials": "LOGIN_REQUIRED / LEGAL_PHONE_NOT_VERIFIED / LEGAL_PHONE_MISMATCH / TOO_MANY_CHECKS",
5802
+ "also_applies_to": "/claim/confirm(App 三步认领链路,后端同一道闸门)",
5803
+ },
5804
+ "flows": {
5805
+ "identity_check": "GET /agent/me(确认这次连接确实带着登录过的账号)",
5806
+ "legal_phone_check": "GET /agent/legal-phone/check(认领前必做,须返回 match)",
5807
+ "legal_phone_request": "POST /agent/legal-phone/request(基准为空时的冷启动)",
5808
+ "claim": "POST /agent/claim(supplier_id 必填;USCC 可选资料;先过 legal_phone_gate)→ pending 申请",
5809
+ "profile_upload": "POST /agent/profile(结构化资料一次提交)→ pending 申请",
5810
+ "self_register": "POST /agent/register(公司名 / 地址 / 门类)→ pending 申请;"
5811
+ "人审通过后由 operator 分配 supplier_id 并建档",
5812
+ "status": "GET /agent/applications(只按 JWT 的 user_id 查自己提交的)",
5813
+ },
5814
+ "not_for_agents": "/claim/verify-start、/claim/submit-uscc 与 /v1/collect/* 是手机 App 内部链路;"
5815
+ "/claim/confirm 现已要求用户 JWT 并走同一道法人手机号闸门。"
5816
+ "外部 Agent 一律走 /agent/*。",
5817
+ "result": "所有提交只落 vendor_application(status=pending, channel=agent),"
5818
+ "带登录账号 user_id;只有 operator 批准后才写 claimed / 上架",
5819
+ "boundary": "本工具只读指路。短信验证码由企业本人在自己设备上输入,"
5820
+ "Agent 不得索取、转述或代填;USCC 由企业自己提供,且只是资料字段、不是身份凭证。"
5821
+ "不要对外宣称「政府接口实时核验法人手机号」。",
5822
+ }
5823
+
5824
+ if intent == "agent":
5825
+ steps = [
5826
+ f"取契约:GET {AGENT_CONTRACT_URL}(v3.0,含 legal_phone_gate)",
5827
+ f"写接口基址固定为 {AGENT_API_BASE};**这条通道需要身份认证,不是免身份的**",
5828
+ "先登录:POST /auth/sms/send {phone} → /auth/sms/verify {phone, code} 换用户 JWT。"
5829
+ "腾讯云短信真实下发;验证码须由企业本人在自己设备上读取并输入,Agent 不得索取或转述",
5830
+ "身份自检:GET /agent/me,带 Authorization: Bearer <JWT>;200 才继续",
5831
+ "**认领前必做**:GET /agent/legal-phone/check?supplier_id=... 须返回 status=match"
5832
+ "(登录手机号 = 工商登记法人手机号)。no_baseline 走 /agent/legal-phone/request,"
5833
+ "mismatch 改用工商登记法人手机号重新登录",
5834
+ "认领 POST /agent/claim | 上传资料 POST /agent/profile | 新建档 POST /agent/register | "
5835
+ "查进度 GET /agent/applications,全部带同一个 JWT",
5836
+ "⚠ 所有提交只落 pending,人审批准后才生效;基准是平台人工核验结果,"
5837
+ "不要对外宣称「政府接口实时核验」",
5838
+ ]
5839
+ elif intent == "register":
5757
5840
  steps = [
5758
- "打开链接,用手机号收验证码登录(同一个号在 App 与网页是同一账号,草稿也共享)",
5841
+ "打开控制台链接,用手机号收验证码登录(同一个号在 App 与网页是同一账号)",
5759
5842
  "在「找到我的企业」里搜公司名;搜不到就走「新建档」",
5760
5843
  "填主体 / 联系 / 产能 / 质量 / 服务与产品条目(单价可不填,对外显示「面议」)",
5761
5844
  "提交后进入人工审核;不通过会带**逐字段理由**退回,改完可重新提交",
5845
+ "若让 Agent 代办新建档:同样先手机验证码登录,再 POST /agent/register "
5846
+ "(company / claimed_address / gate),人审通过后由平台分配正式 ID",
5762
5847
  ]
5763
5848
  elif intent == "status":
5764
5849
  steps = [
5765
- "打开链接,用提交时那个手机号登录",
5850
+ "打开控制台链接,用提交时那个手机号登录",
5766
5851
  "页面会列出「我的申请」:待审核 / 已通过 / 已驳回(驳回带理由)",
5767
5852
  ]
5768
5853
  else:
5769
5854
  steps = [
5770
- "打开链接,用手机号收验证码登录",
5855
+ "打开控制台链接,用手机号收验证码登录(或让企业自己的 Agent 走 agent_channel HTTP 通道)",
5771
5856
  "搜到自己的企业并选中(已在库里的话,公开信息会自动带成底稿,不用重填)",
5772
- "第一步:填 18 位统一社会信用代码(按 GB 32100-2015 校验位当场验)",
5773
- "第二步:填工商登记的法人手机号并收码",
5774
- "提交认领申请 → **人工复核通过后**才算认领成功",
5857
+ "填 18 位统一社会信用代码(按 GB 32100-2015 校验位当场验);USCC 是公开信息,只是资料字段",
5858
+ "登录手机号还须与该企业工商登记法人手机号一致(平台已核验基准)才可提交认领",
5859
+ "提交认领申请 → 状态 pending,**人工复核通过后**才算认领成功",
5775
5860
  ]
5776
5861
 
5777
5862
  return {
@@ -5780,17 +5865,27 @@ def vendor_onboarding(supplier_id: str = "", company: str = "",
5780
5865
  "supplier_id": sid or None,
5781
5866
  "intent": intent,
5782
5867
  "steps": steps,
5783
- "boundary": "验证码、法人手机号这类凭证只能由用户在本页面自己输入。"
5784
- "**不要让用户把它们告诉你**,也不要替他填写。",
5868
+ "agent_channel": agent_channel,
5869
+ "boundary": "两条路径都需要身份认证:浏览器控制台与 Agent HTTP 通道都以手机验证码登录为前提,"
5870
+ "且认领还要求登录手机号与工商登记法人手机号一致,没有匿名写入。"
5871
+ "**不要让用户把验证码念给你**,Agent 不得索取、转述或代填;"
5872
+ "USCC 由企业自己提供,Agent 不编造、不代替企业确认。",
5785
5873
  "what_not_to_do": [
5786
- "不要代替用户完成认领或注册",
5874
+ "不要代替用户完成认领或注册(本工具不发写请求)",
5787
5875
  "不要索取、转述或回显任何验证码",
5788
5876
  "不要承诺审核结果或时效",
5789
5877
  "不要把未认领的企业说成「已经属于该用户」",
5878
+ "不要把 claim_token 贴进公开日志或对话记录",
5879
+ "不要宣称「政府接口实时核验法人手机号」;基准是平台人工核验结果",
5880
+ "不要在 legal-phone/check 返回 no_baseline 或 mismatch 时继续提交认领",
5790
5881
  ],
5791
- "why_not_here": "USCC 是企业公开信息,单凭它认领等于把企业送人。"
5792
- "所以我们不用「填个代码就算认领」的做法,而是提交后人工复核。",
5793
- "next": "把 url 原样给用户,让他在浏览器里走完;完成后可以回来让你查他企业的能力卡。",
5882
+ "why_not_here": "USCC 是企业公开信息,单凭它认领等于把企业送人;"
5883
+ "能收短信也不等于代表这家公司。所以 Agent 通道要过"
5884
+ "「手机验证码登录 + 法人手机号一致性」两道证明,"
5885
+ "认领提交后只落 pending、由人工复核批准;公开 MCP 包保持只读。",
5886
+ "next": ("把 url 原样给用户,让他在浏览器里走完;"
5887
+ "若他是让 Agent 代办,把 agent_channel.contract_url 与 api_base 交给他的 Agent。"
5888
+ "完成后可以回来让你查他企业的能力卡。"),
5794
5889
  }
5795
5890
 
5796
5891