mpq-quote
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
原料报价系统
原料价格管理与原料核价的黑盒服务 —— 采购在后台改价,业务员填参数拿报价; 所有核价口径、原料单价、计算过程锁在服务端,AI 只能传参数进来、拿一个价格出去。
这份代码里没有任何公司的真实数据(先看这段)
这是一个通用模板:结构、机制、工程约定全部保留, 但任何公司的真实数字都不在里面 —— 这既是公开发布的前提, 也正好让它可以安全地被改造成你自己的系统。
你需要自己填的
在哪填
加工费、损耗率、关键词上浮、利润率
app/pricing/rules.py(模板已备好,见第七节)原料价格表源表 xlsx
放自己的表进
price-tables/,再python -m app.seed域名、服务器、部署路径
换成你自己的
填口径之前服务起不来:
rules.py里IS_DEMO = True时,服务拒绝启动 (fail-closed),必须显式设MPQ_ALLOW_DEMO_RULES=true才放行。 理由:「示例值能算出一个报价」和「示例值是对的」之间差着一个真实的商业决策 —— 宁可启动失败,也不要拿示例数字当真报价发出去。
Related MCP server: Electronics RFQ Agent
一、为什么要做这个系统
把核价放在 AI 对话里完成的旧做法有两个结构性问题:
价格表是 Excel——采购改价必须靠人肉上传,AI 每次现读现查,改价无留痕、无版本。
核价在 AI 对话里完成——排版脚本只负责排版,公式是 AI 现场算的: 同一个面料两次算可能不一样,算错了没人查得出来,而且 AI 会把加工费、损耗率、原料单价全说出来。
这个系统把核价变成确定性黑盒服务:
层 | 谁能访问 | 能看到什么 |
MCP / AI 接口 | 任意 AI 客户端 | 只有最终报价 元/kg + MOQ 状态 + 需人工核实的提示。无任何原料单价,无任何计算步骤,无任何内部系数。 |
业务员 Web | 内部业务员 | 最终价 + 原料 AA 单价/等级/匹配情况(沿用现有报价单口径),仍不含加工费、损耗率、利润率、成本。 |
审计明细 | 管理员本地 | 完整逐步计算过程( |
黑盒的实现方式(app/pricing/public.py):
MCP 的工具清单里不存在任何能返回价格表/规则的工具(没有
get_material_price、没有list_materials);所有对外返回体走字段白名单序列化,
assert_no_internal()递归拦截内部字段,命中即抛错;错误信息同样过滤,不带内部数字;
MCP 令牌不对返回 403 而不是 401——401 会被部分 AI 客户端误判成"需要 OAuth 授权"而卡死。
二、快速开始
cd material-price-quote-system
./run.sh # 首次会自动建 venv、装依赖、导入价格表、建账号
# 打开 http://<服务器IP>:8000或手动:
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python -m app.seed # 导入 price-tables/ 里的价格表 + 建账号
.venv/bin/python -m uvicorn app.main:app --host 0.0.0.0 --port 8000⚠️ 第一次启动会被拒绝,这是故意的
app/pricing/rules.py里还是示例核价口径(IS_DEMO = True),服务会直接抛错退出:app/pricing/rules.py 里仍是示例核价口径(IS_DEMO=True),已拒绝启动。两条出路,选一条:
(推荐)填自己的口径 —— 把
rules.py里的LOSS_RATE/BASE_FEE/ 关键词上浮金额 /PROFIT_RATE/MOQ_UPLIFT换成你的数字, 再把IS_DEMO改成False。见第七节。(仅本地试玩)显式放行 ——
export MPQ_ALLOW_DEMO_RULES=true。为什么要这么较真:「示例值能算出一个报价」和「示例值是对的」之间, 差着一个真实的商业决策。宁可启动失败,也不要拿示例数字当真报价发出去。
想先空跑一遍看看?
python ops/make_demo_price_table.py会生成一份演示价格表 (编出来的假价格)放到price-tables/,再python -m app.seed就能起一个有数据的实例。 但别拿它当真报价 —— 里面的加工费/损耗率/利润率也还是示例值。
初始账号
账号 | 角色 | 能做什么 |
| 管理员 | 全部 + 审计明细( |
| 采购 | 改价格、导入价格表、处理补价清单 |
| 业务员 | 报价;看不到原料单价、看不到审计口径、不能改价 |
口令不写死在代码里,用环境变量给:
# .env
MPQ_ADMIN_PASSWORD=...
MPQ_PURCHASER_PASSWORD=...
MPQ_SALES_PASSWORD=...
# 生效(会重置已有账号的口令)
docker compose exec mpq python -m app.seed --users-only --reset-passwords线上已用随机强口令,不再是
admin123/sales123这类默认值。 同时记得改MPQ_SECRET_KEY与两个 MCP 令牌。
三、数据从哪来
Excel 原料价格表是公司机密,不随包分发,也不放在 AI 工作目录里
(AI 随手就能读源表 = 黑盒失效)。它应该只待在核价机能碰到的目录里,
线上服务器 <部署目录>/price-tables/ 放一份。
安装到新机器时:把表拷进 material-price-quote-system/price-tables/,或用
MPQ_PRICE_TABLE_DIR 指向任意目录,然后 python -m app.seed。
导入器会扫目录里所有 .xlsx —— 不写死文件名(各家厂的表名都不一样,
写死就等于把供应商名单写进代码)。
已处理的三个数据坑:
单位不一致:有的表是元/吨,有的是元/kg。导入器按价格列表头自动判断 (
价格(元/吨)→ ÷1000);表头没写单位时,按文件名里的「吨」字兜底。同键重复行:同一张表里可能有重复行(纤维+规格+说明+类别+工艺+等级 全同, 通常是旧表没删干净、新价追加在后面)。导入时保留最后一行, 所有变动写进
price_history,导入报告会明确列出,可人工复核。空价格:留空的行 = 待补价,会直接出现在"补价清单"里。
想先空跑一遍:python ops/make_demo_price_table.py 会生成一份演示价格表
(编出来的假价格)。
四、闭环:采购更新价格 → 业务员拿到报价
采购改价/导入Excel → materials 表(带 price_history 留痕)
↓
业务员填成分/规格/织机/数量 → 匹配器找价格行
↓
匹配到 → 核价引擎算 → 返回元/kg
匹配不到 → 自动登记到补价清单(price_requests)
↓
采购在"补价清单"里填价 → 写回 materials → 业务员立刻能用匹配规则(app/pricing/matcher.py,对应原 pricing-rules.md 第 7 节):
纤维与类别必须相同——纤维不同(棉 vs 涤)直接判不匹配,必须人工问价;
工艺尽量相同(带同义词:
精梳紧赛↔紧赛↔紧密赛络纺);支数/D 数最接近;
距离相同时取价高的一档,避免低报;
裸纤维查询(如业务员只说"涤纶")会锁定主流品种——数据驱动:同核心纤维下行数 ≥ 第二名 2 倍即认定为主流 (涤纶半光 80 行 vs 涤纶消光 30 行 → 半光)。这条规则避免"涤纶 75D DTY"被匹配到
涤纶H400(30.0 元/kg)而不是涤纶半光(10.0 元/kg)——差 3 倍,会直接亏钱;同一规格有多个版本(国产/兰精LF、兰精/博拉、原棉/高配)且业务没指定 → 标记为近似匹配并写明取了哪一档。
规格缺失 / 规格表里没有 时的兜底(2026-10-22 线上事故后加的,见下):
第 4 条「距离相同时取价高」的前提是有距离可比。下面两种情况没有距离可言, 硬套第 4 条会直接落到该纤维最贵的一行,系统性高报:
场景 | 旧行为 | 现在 |
没给支数(AI 只传了 | 棉 → 60S 30.0 → 40.0(正确 32.0,高报 25%) | 锁该纤维最常用规格(棉 40S)核价,标注"未指定规格,此价须人工核实" |
给了支数但价格表里没有(99S) | 棉 → 60S 30.0 → 42.0(高报 31%) | 同样锁主流规格,标注"价格表里没有 99S 这一档支数/D数" |
兜底时不再叠「取价高」(估算值再放大一次高报),而是取最接近该组中位价的那一行。 兜底单子不进补价清单(缺的是规格信息不是价格,采购也不知道该补哪一档), 改为在 MCP 返回的「提示」里明确写出按哪一档估的,必须由采购/核价员核对后才能对外报价。
另外两条防坑:
规格回填:AI 常把支数写在面料名里("32S全棉精梳汗布")却没填
spec字段。 系统会从面料名/需求原话里把支数捞回来再匹配(只有一种原料时才回填,避免把棉的 40S 套到氨纶 40D 上)。 实测:回填后那张单从 40.0 变回 32.0。参数不完整 ≠ 价格缺失:没给纤维、类别填反这类错误会明确报「参数不完整」, 不会登记进补价清单、不会编一个价格。类别填反时系统会自动纠正并告知(棉被当长丝类 → 纠正为短纤类)。
五、管理后台(采购 / 老板)
https://quote.example.com/admin.html —— 只有采购和管理员能进,
业务员访问会被挡下(接口层同样 403,不是只在前端藏)。
标签页 | 给谁 | 干什么 |
概览 | 老板 | 原料总数/有价/待补价/待处理补价单/报价单数/近 7 天改价数/价格表更新至 + 分类别待补价占比 + 最近一次改价 |
原料更新 | 采购 | 改价(改过的行标黄,可一次批量提交)、清空价格转待补价、改价格日期、导入 Excel |
补价流程 | 采购 | 待补价 → 填价生效 / 忽略 / 重新打开;价格表空价行也一并列出 |
变更记录 | 采购 / 老板 | 价格变更流水:谁、何时、哪个原料、旧价 → 新价、涨跌幅、来源文件。这就是"流程更新"的留痕 |
报价记录 | 老板 | 所有经系统核价的报价留档(单号/客户/布名/织机/数量/报价/是否低于 MOQ/业务员/时间) |
核价口径 | 仅管理员 | 等级系数、损耗率、各织机加工费、关键词上浮、工艺别名、MOQ 与上浮规则 —— 机密,仅老板可见 |
新增接口(都在 app/api/admin.py):
方法 | 路径 | 权限 |
GET |
| 采购 / 管理员 |
GET |
| 采购 / 管理员 |
POST |
| 采购 / 管理员 |
PATCH |
| 采购 / 管理员 |
GET |
| 仅管理员 |
批量改价与单条改价一样,每一行都写
price_history留痕。 「核价口径」里的加工费/损耗率/利润系数只在这个页出现,绝不进任何对外返回体。
六、接给 AI 用(MCP)
端点
https://quote.example.com/mcp
Authorization: Bearer <令牌>支持 Streamable HTTP(Accio Work 等填 URL 的客户端)与 stdio(Claude Desktop 等本地客户端)。
两种令牌:管理员 / 业务员
令牌与角色一一对应,可以单独吊销,互不影响。
令牌 | 环境变量 | 角色 | 能拿到什么 |
管理员 |
|
| 默认黑盒;可显式传 |
业务员 |
|
| 只有最终报价。传 |
业务员令牌永远拿不到原料单价,无论怎么构造参数。 令牌不对一律返回 403(不是 401 —— 401 会让部分 AI 客户端误判为"需要 OAuth 授权"而卡死)。
换令牌只要改服务器 .env 再 docker compose restart:
# 重新生成业务员令牌
python3 -c "import secrets;print(secrets.token_urlsafe(32))"
# 写进 .env 后
docker compose up -d工具清单
工具 | 作用 | 返回 |
| 核价 | 只有最终报价 + 提示 |
| 可选织机与常用布种 | 织机名、常用布种(无费用) |
| 原料规格词表 | 纤维/规格/工艺(无价格) |
list_material_options 返回的条目字段名与 quote_material_price 的 materials 入参完全一致
(fiber / spec / process / desc / alias),AI 可以原样照抄进 materials 数组。
早期版本返回中文键(纤维 / 支数或D数 / …),而工具入参是英文键,
Pydantic 默认 extra="ignore" 会静默丢弃中文键 → materials 项全空 → 核价直接失败
(线上真实事故:AI 照抄词表后报错,业务被误导去"采购补价",而价格表里明明有)。
现在词表输出英文键,同时 MaterialInput 也接受中文键别名,两边怎么写都能用。
list_material_options 可以在环境变量里关掉(MPQ_MCP_EXPOSE_SPEC_VOCABULARY=false),
关掉后 AI 只能凭业务员的说法尝试匹配,命中率会下降。
调用示例
{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {
"name": "quote_material_price",
"arguments": {
"raw_requirement": "32S全棉精梳汗布,3000公斤",
"materials": [
{"fiber": "全棉", "category": "短纤类", "spec": "32S", "desc": "精梳", "grade": "AA", "ratio": 1.0}
],
"machine": "单面圆纬机",
"quantity_value": 3000, "quantity_unit": "kg",
"fabric_name": "全棉汗布", "customer": "XX客户"
}
}
}
raw_requirement务必原样传入业务员的原话 —— 系统据此判断品质等级/工艺这些参数 是业务员明确说的,还是 AI 自己补的(补的会在"提示"里要求人工确认)。
返回:
{
"报价单号": "MQ20261022-0001",
"初步报价_元每kg": 30.0,
"报价口径": "人民币元/kg,含税;不含运费、包装费;面料价(不含染色印花等后整理)",
"报价基准": "按 MOQ 报价",
"提示": [],
"折算重量_kg": 3000.0,
"原料价格更新至": "2026-10-17"
}匹配不到价格时返回 {"成功": false, "错误": "...已登记到补价清单..."},不会编一个价格出来。
参数不全(例如没给支数/D数)时返回"请补充规格后再报价",不会登记进补价清单 ——
参数没给全是业务员的事,不是采购的补价待办。
客户端配置
Accio Work(填 URL + 请求头):
URL: https://quote.example.com/mcp
Header: Authorization: Bearer <MPQ_MCP_TOKEN_SALES>Claude Desktop(claude_desktop_config.json):
{
"mcpServers": {
"mpq-quote": {
"command": "/绝对路径/material-price-quote-system/.venv/bin/python",
"args": ["-m", "app.mcp_server"],
"cwd": "/绝对路径/material-price-quote-system",
"env": { "MPQ_MCP_TRANSPORT": "stdio" }
}
}
}七、核价口径(内部,勿外传)
以下内容属于公司内部定价机密,不通过任何对外接口返回。本文档仅供系统维护者查阅。
⚠️ 下面给的是示例值(对应
app/pricing/rules.py里的IS_DEMO = True)。 必须换成你自己的数字 —— 加工费、损耗率、上浮金额、利润率都是商业机密, 开源版只能给结构和占位数字。
公式(每 kg,人民币,含税):
等级调整后单价 P = AA单价 × 等级系数 A=0.95 AA=1.00 AAA=1.05 AAAA=1.10
原料成本 = Σ(占比 × P)
织造损耗 = Σ(占比 × P × 损耗率) 短纤类 5% 长丝类 3% ← 示例值
加工费 = 基础加工费(织机, 场景) + Σ关键词上浮 ← 示例值
报价成本 = 原料成本 + 织造损耗 + 加工费
MOQ 报价 = 报价成本 × 1.10,向上进位到 1 位小数 ← 示例值
低于 MOQ = MOQ 报价 × 1.02,再向上进位 (MOQ = 2000kg) ← 示例值场景:含任意短纤类原料 → "带短纤"加工费表与关键词表;全部长丝 → "全长丝"表。
加工费、损耗率、关键词上浮金额、利润率:禁止出现在任何对外返回体。
数量为米/码时必须给全幅(cm)与 GSM;1 码 = 0.9144 米;
每kg米数 = 1000 ÷ (GSM × 全幅米)。数量不明按 MOQ 报价。
对外统一说法必须和算法一致:示例是「MOQ 2000kg,低于 2000kg 在 MOQ 报价基础上上调 2%」—— 业务员嘴上说的和系统算出来的如果不是一回事,扯皮的就是你。
改口径的四处(都在 app/pricing/rules.py):
LOSS_RATE / BASE_FEE / SPUN_KW·FIL_KW 里的金额 / PROFIT_RATE·MOQ_UPLIFT。
改完把 IS_DEMO 改成 False,服务才会正常启动。
这套口径有两套独立实现互相对照:tests/test_engine.py 里另写了一份按公式重推的参考实现,
逐项和 engine.compute_quote() 比对(覆盖短纤/长丝/低于MOQ/米码换算/关键词叠加/等级调整/数量未知/面料名命中),
两边不一致就红。
八、REST API
方法 | 路径 | 说明 | 权限 |
POST |
| 登录态 | — |
GET |
| 价格表(分页/筛选) | 登录 |
PATCH |
| 改价格(留痕) | 采购/管理员 |
GET |
| 原料价格表 | 登录(业务员看不到 |
POST |
| 导入 Excel | 采购/管理员 |
GET |
| 规格词表(无价格) | 登录 |
GET |
| 补价清单(业务员看不到 | 登录 |
POST |
| 补价 | 采购/管理员 |
POST |
| 试算( | 登录 |
POST |
| 报价并存档 | 登录 |
GET |
| 报价历史 | 登录 |
view=ai 的返回与 MCP 完全一致;view=audit 含完整计算过程,仅管理员可见
(业务员伪造 view=audit 直接 403)。
业务员默认看不到任何单价(MPQ_SALES_CAN_SEE_PRICE=true 可打开)。
价格表里凡是自由文本(匹配说明、补价备注、错误信息)在返回给业务员前都会过一遍
scrub_prices() 清洗,防止价格数字混在说明文字里漏出去。
交互式文档:http://<服务器IP>:8000/api/docs
九、部署
示例部署:Docker Compose + Nginx 反代 + Let's Encrypt 证书。下面是一套可直接照抄的骨架, 路径和域名请换成你自己的。
服务器上的目录结构
/opt/material-price-quote-system/ 应用目录
├── app/ web/ tests/ price-tables/
├── .env 权限 600,密钥在服务器本地生成
├── data/mpq.db SQLite(volume 挂载到容器 /app/data)
├── Dockerfile docker-compose.yml
/etc/letsencrypt/live/<你的域名>/ 证书(certbot 自动续期)
/etc/nginx/conf.d/<你的域名>.conf nginx vhost
/var/www/<你的域名>/.well-known/acme-challenge/ 证书签发 webroot(权限必须 755,否则 403)
price-tables/里的源表不进镜像(.dockerignore已排除),运行时只读 bind mount 挂进容器。 验证方法见AGENTS.md「机密源表怎么验证它真的没进镜像」。
常用操作
cd /opt/material-price-quote-system
docker compose ps # 状态
docker compose logs -f --tail 100 # 日志
docker compose restart # 重启
docker compose up -d --build # 改完代码后重新部署
docker compose exec mpq python -m app.seed --users-only # 只建账号
docker compose exec mpq python -m app.seed # 重导价格表 + 建账号为什么用 Docker
本项目需要 Python 3.10+(X | None 注解 + pydantic 2 + MCP SDK 2),很多机器的系统 Python 还停在 3.8,
所以用 python:3.12-slim 容器。国内拉不动 Docker Hub 时把基础镜像换成国内加速前缀,
pip 也换成国内源(见 Dockerfile,那里已写成标准源 + 注释说明怎么换)。
容器内存限制 400MB(mem_limit + memswap_limit):这台机器上往往还跑着别的东西
(比如数据库常驻几百 MB),不给容器设上限,它被挤爆时会连坐把整台机的内存吃光。
超了只杀自己,不拖累邻居。
实测过的一个坑:宿主机 1.9G 内存 + mysqld 常驻 470M,容器不限内存时跑着跑着 整机被 OOM killer 干掉,MySQL 先死。容器一定要设内存上限。
换到其他服务器
# 1. 上传代码
cd /opt/material-price-quote-system
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
# 2. 配 .env(密钥自己生成,别用示例值)
cat > .env <<'EOF'
MPQ_DB_URL=sqlite:////app/data/mpq.db
MPQ_SECRET_KEY=<随机长串>
MPQ_MCP_TOKEN=<随机长串>
MPQ_MCP_ENABLED=true
MPQ_MCP_EXPOSE_SPEC_VOCABULARY=true
MPQ_PRICE_TABLE_DIR=/opt/material-price-quote-system/price-tables
EOF
chmod 600 .env
# 3. 初始化并启动
.venv/bin/python -m app.seed
docker compose up -d --build
# 4. nginx + 证书
mkdir -p /var/www/<你的域名>/.well-known/acme-challenge
chmod 755 /var/www/<你的域名> /var/www/<你的域名>/.well-known
chown -R www-data:www-data /var/www/<你的域名>
# 先写一个只监听 80 的 vhost,certbot --webroot 签完再换成 HTTPS
certbot certonly --webroot -w /var/www/<你的域名> -d <你的域名> \
--register-unsafely-without-email --agree-tos --non-interactivenginx vhost 见 deploy/quote.example.com.conf(本仓库内),要点:
/反代到127.0.0.1:8010;/mcp必须单独一个 location:proxy_buffering off+proxy_read_timeout 3600s, 否则 SSE 响应会被缓冲,AI 客户端会卡住;容器只绑
127.0.0.1,对外只暴露 443,避免绕过 TLS。
换成 MySQL
.venv/bin/pip install pymysql
# .env 里改成
MPQ_DB_URL=mysql+pymysql://mpq:密码@127.0.0.1:3306/mpq?charset=utf8mb4宿主机上已有 mysqld(3306)时,不要给本系统单独起一个 MySQL 容器 —— 两个 MySQL 抢内存是最容易把自己搞挂的方式。
已做的安全收口
项 | 做法 |
OpenAPI 文档 | 默认关闭( |
登录爆破 | 同 IP 10 分钟内失败 8 次即 429 |
账号枚举 | 用户不存在与密码错误返回同一个提示 |
MCP 令牌不对 | 返回 403(不是 401),避免 AI 客户端误判为需要 OAuth |
令牌分级 | 管理员 / 业务员两个独立令牌,业务员令牌永远拿不到单价,可单独吊销 |
REST 审计口径 |
|
价格表读取 | 业务员拉全量价格表拿不到 |
自由文本 | 说明/备注/错误信息返回给业务员前过 |
管理后台 |
|
核价口径 | 加工费/损耗率/利润系数只在 |
静态文件 |
|
业务接口 | 未登录一律 401 |
证书 | Let's Encrypt,certbot 自动续期,续期后自动 reload nginx(见 |
容器 |
|
十、测试
测试分两层:零依赖的(全新克隆就能跑)和需要自建环境的。
第一层:零依赖,开箱即跑
.venv/bin/python -m tests.test_engine # 引擎口径 vs 测试内的独立参考实现,逐项比对 + 黑盒泄露检测
.venv/bin/python -m tests.test_matcher # 匹配器回归:合成价格表 + 业务问法钉死命中行第二层:需要先起服务 / 需要凭据
.venv/bin/python -m uvicorn app.main:app --host 127.0.0.1 --port 8077 &
.venv/bin/python -m tests.test_e2e # REST + MCP 端到端(含泄露检测、权限边界)这一层会连真实服务、可能改数据,口令和令牌必须用环境变量传
(MPQ_ADMIN_PASSWORD / MPQ_MCP_TOKEN / E2E_BASE_URL …),
完整清单见 AGENTS.md 的「测试」一节。
十一、目录结构
material-price-quote-system/
├── app/
│ ├── main.py # 单进程:REST + Web + MCP(含示例口径 fail-closed 护栏)
│ ├── mcp_server.py # MCP 工具定义(对外唯一出口)
│ ├── config.py db.py models.py security.py
│ ├── pricing/
│ │ ├── rules.py # ★机密:加工费/损耗/上浮/利润率(模板,默认是示例值)
│ │ ├── engine.py # 核价引擎
│ │ ├── matcher.py # 原料价格匹配器
│ │ └── public.py # ★黑盒网关:三种可见级别的白名单输出
│ ├── services/
│ │ ├── importer.py # Excel 导入(单位换算 + 去重 + 留痕)
│ │ └── quote_service.py # 报价编排 + 补价登记
│ └── api/ # auth / materials / quotes / admin(管理后台)
├── web/ # 零依赖原生 JS,不引 CDN
│ ├── index.html # 报价计算器
│ ├── materials.html # 价格表管理 + 补价清单
│ ├── admin.html # 管理后台(采购/老板):原料更新·补价流程·变更记录·报价记录·核价口径
│ ├── common.js app.css
├── price-tables/ # 放你自己的原料价格表(不随包分发,见第三节)
├── ops/ # 备份 / 令牌取用 / 权限收口 / 演示价格表生成器
├── deploy/ # nginx vhost 示例 + 证书续期 hook
├── tests/ # 见第十节
├── data/mpq.db # SQLite(生产换 MySQL)
├── run.sh requirements.txt .env.exampleThis server cannot be deployed
Maintenance
Related MCP Connectors
Quoting, pricing, production and part data for contract manufacturers (3D printing, CNC).
Read-only ChinaAPI model catalogue, price snapshot, cost estimates and request recipes.
Find manufacturers worldwide, match a part spec to suppliers, estimate cost, request quotes.
Real 3D-print slicing, quoting, DFM, orientation & material/settings advisors. Free personal tier.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceIntelligently generates cost estimates and lead times for manufacturing RFPs by parsing requests, matching against historical quotes, and calculating activity-based costs with confidence scoring and human approval workflows.MIT
- AlicenseNot gradedqualityAmaintenanceAI quoting agent for electronics distributors. RFQ in, quote out via MCP tools.31 PyPIMIT
- FlicenseAqualityBmaintenanceParametric price benchmarking for engineering and procurement trade-offs. Agentic first, runs on your data, stays on your machine.1228 PyPI2-
- AlicenseNot gradedqualityBmaintenanceEnables AI clients to compute auditable vehicle export quotes with consistent decimal rules, including request normalization, funder screening, validation, comparison, and MOSS export.MIT