Files
mcp-server-demo/docs/erp/MCP工具说明文档.md

14 KiB
Raw Permalink Blame History

MCP for ERP — 工具说明文档

服务对象:汽车零部件(小型阀体外壳)智能报价智能体 服务定位:ERP 侧核价基础数据与成本计算引擎(只读 + 计算,不写库) 版本:v1.1(2026-08-09)


1 服务概览

项 值
服务名 mcp-for-erp-auto
框架 MCPServer(mcp 2.0.0 内置高级框架),@app.tool() 装饰器注册
传输协议 Streamable HTTP(JSON-RPC 2.0)
远程端点 https://erp-data.dongsk.top/mcp
本地端点 http://0.0.0.0:8001/mcp(cd src && python3 server.py)
数据库 PostgreSQL 15+,库 smart_quotation_auto(仅服务层内部经 db.py 连接池访问)
工具数 5 个(全部只读/计算)

工具一览

# 工具 功能 报价环节
1 query_material_master 查询物料主数据(体积/密度/吨位/后处理) 基础数据
2 match_material_grade 客户牌号 → 内部等效牌号对照 材质确认
3 get_die_casting_params 压铸参数:铝水重量、节拍、铸造成本 压铸成本
4 get_machining_estimate 机加工工时估算(固化工装节拍) 机加工成本
5 calculate_part_cost 汇总核价,输出最终单价 最终报价

2 调用约定

2.1 客户端注册(mcpServers)

{
  "mcpServers": {
    "erp": { "url": "https://erp-data.dongsk.top/mcp" }
  }
}

2.2 JSON-RPC 调用流程

  1. initialize(握手,获取 Mcp-Session-Id)
  2. notifications/initialized(通知,无响应体)
  3. tools/list(可选,列出工具)
  4. tools/call(调用工具,params: {name, arguments})

2.3 兜底命令行客户端(纯标准库)

python3 scripts/mcp_http_client.py erp <工具名> '<JSON参数>'
# 示例
python3 scripts/mcp_http_client.py erp calculate_part_cost '{"material_code":"VHB-AT-001","annual_qty":300000}'

2.4 返回通用约定

  • 所有工具返回 JSON 字符串(ensure_ascii=False,中文不转义)。
  • 查询类工具返回 {"total": N, "<集合名>": [...]};操作/计算类工具返回 {"success": true|false, ...}。
  • 失败统一形态:{"success": false, "message": "<原因>"}(查询类失败以 total: 0 空集表达)。
  • 金额/重量:浮点数,成本保留 2 位小数,重量保留 3 位小数;日期 YYYY-MM-DD,月份 YYYY-MM。

3 工具详解

3.1 query_material_master — 查询物料主数据

功能:按物料编码精确查询,或按零件类别、材质牌号、压铸吨位组合过滤。返回物料档案(含体积、密度、净重、吨位、表面处理),是核价的起点数据。

入参(全部可选;全部不传 = 返回全表):

参数 类型 必填 默认 说明
material_code string 否 — 物料编码,精确匹配,如 VHB-AT-001
part_category string 否 — 零件类别,精确匹配,如 阀体外壳
material_grade string 否 — 客户材质牌号,精确匹配,如 ADC12
die_casting_ton int 否 — 压铸机吨位,精确匹配,如 400

返回字段:

字段 类型 说明
total int 命中条数
materials[] array 物料行列表
materials[].material_code string 物料编码(内部主键)
materials[].part_name string 零件名称
materials[].part_category string 零件类别
materials[].material_grade string 客户材质牌号
materials[].density decimal 密度 g/cm³(JSON 中为字符串)
materials[].volume_cc decimal 零件体积 cm³(算铝水重量的依据)
materials[].net_weight_kg decimal 净重 kg(算后处理成本的依据)
materials[].die_casting_ton int 压铸机吨位
materials[].surface_treatment string 表面处理(阳极氧化/钝化/无等)
materials[].unit string 计量单位
materials[].created_at string 建档时间

返回示例:

{
  "total": 1,
  "materials": [
    {
      "material_code": "VHB-AT-001",
      "part_name": "变速箱阀体外壳",
      "part_category": "阀体外壳",
      "material_grade": "ADC12",
      "density": "2.700",
      "volume_cc": "444.44",
      "net_weight_kg": "1.200",
      "die_casting_ton": 400,
      "surface_treatment": "阳极氧化",
      "unit": "件",
      "created_at": "2026-08-07 12:18:51.484993"
    }
  ]
}

3.2 match_material_grade — 材质牌号对照

功能:把客户指定牌号(GB/ASTM/JIS/EN/ISO 任一体系或内部码)对照为企业内部等效牌号,返回密度与铝锭参考价。支持模糊匹配与热处理后缀自动剥离(如 A356-T6 → A356,最多剥 2 段)。

入参:

参数 类型 必填 默认 说明
customer_grade string 是 — 客户牌号,大小写不敏感,模糊匹配六大码系
standard string 否 — 标准体系提示(当前实现未参与过滤,保留参数)

返回字段(命中时):

字段 类型 说明
matched bool 是否命中
customer_grade string 原客户牌号
internal_code string 内部等效牌号,如 AL-ADC12
density float 密度 g/cm³
price_per_kg float 铝锭参考价 ¥/kg(兜底价,核价优先取月度价)
all_mappings[] array 全部命中行(含 gb/astm/jis/en/iso/internal 六码、grade_group 材质族)

未命中返回:

{ "matched": false, "message": "未找到材质 AD12" }

返回示例(ADC12):

{
  "matched": true,
  "customer_grade": "ADC12",
  "internal_code": "AL-ADC12",
  "density": 2.7,
  "price_per_kg": 18.5,
  "all_mappings": [
    {
      "grade_group": "铝合金",
      "gb_code": "ZAlSi10Cu(ADC12)",
      "astm_code": "A380",
      "jis_code": "ADC12",
      "en_code": "EN AC-4600",
      "iso_code": "AlSi9Cu3",
      "internal_code": "AL-ADC12",
      "density": "2.700",
      "price_per_kg": "18.50"
    }
  ]
}

业务规则:未命中时 Skill 层应回退默认铝价并产生 warning(TC-06 场景),不应中断报价。


3.3 get_die_casting_params — 获取压铸参数

功能:按物料编码取压铸参数。核心输出:铝水重量(体积×密度×1.05 损耗)、压铸机吨位、模次节拍、单件压铸成本。体现 MVP 原则「靠体积算铝水重量、压铸机吨位固定工时」。

入参:

参数 类型 必填 默认 说明
material_code string 是 — 物料编码
volume_cc float 否 物料档案体积 覆盖体积(图纸实测体积优先于档案默认值)

返回字段:

字段 类型 说明
success bool 成功标记
material_code string 物料编码
volume_cc float 采用体积 cm³
density float 密度 g/cm³
aluminum_weight_kg float 铝水重量 = 体积×密度/1000×1.05,3 位小数
die_casting_ton int 压铸机吨位
cycle_time_sec float 模次节拍(秒/模,按吨位固化)
machine_rate float 机台费率 ¥/小时
mold_cavities int 模穴数
casting_cost_per_part float 单件压铸成本 = (节拍/3600)×费率/模穴数,2 位小数

失败返回:{"success": false, "message": "未找到物料 XXX"} 或 {"success": false, "message": "未找到 400T 压铸机参数"}

返回示例(VHB-AT-001,444.44cc,400T):

{
  "success": true,
  "material_code": "VHB-AT-001",
  "volume_cc": 444.44,
  "density": 2.7,
  "aluminum_weight_kg": 1.26,
  "die_casting_ton": 400,
  "cycle_time_sec": 30.0,
  "machine_rate": 260.0,
  "mold_cavities": 1,
  "casting_cost_per_part": 2.17
}

3.4 get_machining_estimate — 机加工工时估算

功能:按孔清单(钻孔/攻丝/铰孔)与铣面数量估算机加工总工时与刀具成本。所有规格节拍来自固化表 machining_cycle(工装节拍),逐项累加。

入参:

参数 类型 必填 默认 说明
material_code string 是 — 物料编码(回显用)
drill_holes array[object] 否 [] 钻孔清单,元素 {"spec": "Φ6", "count": 2}
tap_holes array[object] 否 [] 攻丝清单,元素 {"spec": "M6×1.0", "count": 2}
ream_holes array[object] 否 [] 铰孔清单,元素 {"spec": "Φ8H7", "count": 1}
mill_faces int 否 0 铣面数量

孔元素字段:spec(规格字符串,缺省 Φ8 / M8×1.25 / Φ8H7)、count(数量,缺省 1)。

返回字段:

字段 类型 说明
success bool 成功标记
material_code string 物料编码
total_time_sec float 总工时(秒),2 位小数
total_time_hours float 总工时(小时),4 位小数
total_tool_cost float 刀具成本合计 ¥
details[] array 逐项明细:operation(drill/tap/ream/mill)、spec、count、total_time_sec

返回示例(钻 Φ6×2 + 攻 M6×1.0×2 + 铣面×1):

{
  "success": true,
  "material_code": "VHB-AT-001",
  "total_time_sec": 26.0,
  "total_time_hours": 0.0072,
  "total_tool_cost": 1.5,
  "details": [
    { "operation": "drill", "spec": "Φ6", "count": 2, "total_time_sec": 6.0 },
    { "operation": "tap", "spec": "M6×1.0", "count": 2, "total_time_sec": 8.0 },
    { "operation": "mill", "spec": "face", "count": 1, "total_time_sec": 12.0 }
  ]
}

注意:固化表中不存在的规格静默跳过(不计工时也不报错);毛坯件(无孔无面)返回总工时 0,Skill 层应产生 warning(TC-07 场景)。


3.5 calculate_part_cost — 汇总核价(最终单价)

功能:一站式核价。材料成本(铝水重量×当月铝价)+ 压铸成本 + 机加工成本 + 后处理成本 → 小计 × (1+管理费率) × (1+利润率) = 最终单价。铝价优先取 material_price_history 最新月度价并留痕月份;机加工费率按材质族(铝合金 60 / 灰铁 75 / 球铁 80 ¥/h)取 machining_rate。

入参:

参数 类型 必填 默认 说明
material_code string 是 — 物料编码
annual_qty int 是 — 年用量(件/年)
drill_holes array[object] 否 [] 同 3.4
tap_holes array[object] 否 [] 同 3.4
ream_holes array[object] 否 [] 同 3.4
mill_faces int 否 0 铣面数量
overhead_rate float 否 0.12 管理费率
profit_rate float 否 0.15 利润率

返回字段:

字段 类型 说明
success bool 成功标记
material_code / part_name string 物料编码 / 零件名称
cost_breakdown.material_cost float 材料成本 = 铝水重量×铝价
cost_breakdown.aluminum_weight_kg float 铝水重量(含 1.05 损耗)
cost_breakdown.aluminum_price_per_kg float 采用铝价 ¥/kg
cost_breakdown.price_basis_month string 铝价月份 YYYY-MM(留痕;无月度价时为 null)
cost_breakdown.internal_code string 内部牌号
cost_breakdown.grade_group string 材质族(决定机加工费率)
cost_breakdown.casting_cost float 单件压铸成本
cost_breakdown.die_casting_ton int 压铸机吨位
cost_breakdown.machining_cost float 机加工成本 = 工时×费率
cost_breakdown.machining_hours float 机加工总工时(小时)
cost_breakdown.machining_rate_per_hour float 机加工费率 ¥/h
cost_breakdown.post_process_cost float 后处理成本 = 净重×工艺费率
cost_breakdown.surface_treatment string 表面处理工艺
total_cost float 四项成本小计
overhead_rate / overhead float 管理费率 / 管理费额
profit_rate float 利润率
unit_price float 最终单价 = (total_cost+overhead)×(1+profit_rate)
currency string 固定 CNY

返回示例(VHB-AT-001,30 万件/年,钻 Φ6×2/攻 M6×1.0×2/铰 Φ8H7×1/铣面×1):

{
  "success": true,
  "material_code": "VHB-AT-001",
  "part_name": "变速箱阀体外壳",
  "cost_breakdown": {
    "material_cost": 23.31,
    "aluminum_weight_kg": 1.26,
    "aluminum_price_per_kg": 18.5,
    "price_basis_month": "2026-08",
    "internal_code": "AL-ADC12",
    "grade_group": "铝合金",
    "casting_cost": 2.17,
    "die_casting_ton": 400,
    "machining_cost": 0.53,
    "machining_hours": 0.0089,
    "machining_rate_per_hour": 60.0,
    "post_process_cost": 6.0,
    "surface_treatment": "阳极氧化"
  },
  "total_cost": 32.01,
  "overhead_rate": 0.12,
  "overhead": 3.84,
  "profit_rate": 0.15,
  "unit_price": 41.23,
  "currency": "CNY"
}

失败返回:{"success": false, "message": "未找到物料 XXX"}


4 附录

4.1 核心公式

铝水重量(kg)   = 体积(cm³) × 密度(g/cm³) / 1000 × 1.05(损耗系数)
材料成本       = 铝水重量 × 铝锭单价(当月月度价,缺省 18.5)
压铸成本       = (节拍秒 / 3600) × 机台费率 / 模穴数          ← 吨位固化节拍
机加工成本     = Σ(工序固化节拍×数量) / 3600 × 材质族费率
后处理成本     = 净重(kg) × 表面处理费率
单价           = (四项成本小计 × (1+管理费率)) × (1+利润率)

4.2 依赖数据表

表 用途
material_master 物料主数据(体积/密度/吨位/后处理)
material_grade_mapping 五标准体系牌号对照 + 材质族 + 参考铝价
material_price_history 月度铝价留痕(核价取最新月)
die_casting_params 吨位 → 节拍/费率/模穴数
machining_cycle 工序规格固化节拍与刀具费率
machining_rate 材质族机加工费率(60/75/80 ¥/h)
post_process_rate 表面处理费率(¥/kg)

4.3 与 CRM 服务的协作

ERP 服务只读不写。报价存档链路(create_inquiry → save_quotation → update_opportunity)由 mcp-for-crm 承担,见《MCP for CRM — 工具说明文档》。