Skip to main content
Glama
ayeyouok

a207-nutrition-assessment-mcp

by ayeyouok
README.md
# a207-nutrition-assessment-mcp-nfyy(M3 · 营养评估)

儿童 CKD 营养评估 MCP。对应 PCP 契约 `nutrition_assessment` 输出位,是 Wave 2 首个交付包。

> **PRNT 目标唯一权威引擎**:M5 的目标计算工具已去重并入本包(Schofield 交叉校验 / 水肿理想体重校正 / 腹透葡萄糖供能扣减),全项目只有一把"尺子"。

> 权威标尺:**PRNT 2020**(Shaw V, et al. *Pediatr Nephrol* 35:519-531)——与用户提供的《PRNT指南:能量与蛋白质需求及营养处方实操》一致。

## 工具清单

| 工具 | 类型 | 权限 | 说明 |
|---|---|---|---|
| `calc_prnt_targets` | 读 | 全 caller | **PRNT 唯一权威引擎**。按年龄×性别分段 SDI 计算每日能量/蛋白质目标(含 CKD 分期/透析/素食/生长状态);并吸收 M5 特性:`is_edema` 水肿理想体重校正、`pd_glucose_kcal_per_day` 腹透葡萄糖供能扣减、Schofield 交叉校验 |
| `assess_intake_vs_target` | 读 | 全 caller | 对照 PRNT 目标评估 3 日饮食日记均值,给达成率、缺口、PEW 风险 |
| `upsert_food_diary` | 写 | parent_assistant / child_companion(MX-3) | 写入饮食条目并聚合 `diet_diary_3d`;条目养分由调用方经 M5 计算后填入 |
| `get_food_diary_summary` | 读 | 全 caller | 读取并聚合某患者饮食日记 |
| `assess_pew_risk` | 读 | 全 caller | 独立 PEW(蛋白质-能量消耗)风险筛查 |
| `calc_growth_zscore` | 读 | 全 caller | **增长 Z 评分(中国卫健委标准,非 WHO)**。按 WS/T 423-2022(7 岁以下 体重/身高/BMI 年龄别 SD)+ WS/T 612-2018(7-18 岁身高年龄别)计算 HAZ/WAZ/BAZ:Z=(实测-中位数)/SD,SD 由标准附录给出。HAZ 0-18 岁全覆盖;WAZ/BAZ 仅 <7 岁(7-18 体重/BMI 标准未提供则跳过并 warning)。返回 5 等级 + 营养状况分类,并给 PRNT `growth_status` 建议(failure/overweight/normal,供 `calc_prnt_targets` 输入) |
| `record_pew_risk` | 写 | 编排层(orchestrator/医生/营养) | **PEW 历史落库(ADR-007)**。每次 `assess_pew_risk` 后由编排层调用,按患者持久化一个历史点(date/score/level)。存储归属 M3,M4 仅作 facade 读取 |
| `get_pew_history` | 读 | 全 caller | **读取 PEW 历史(ADR-007)**。返回按日期升序的历史点 + 趋势(improving/worsening/stable/no_data),供 M9 报告与 M4 聚合时间线 |

> **PEW 历史归属(ADR-007)**:`assess_pew_risk` 是 M3 的产出,其历史时间线由 M3 拥有并落库(`data/pew_history_store.json`,按 patient_id 追加);M4 的 `get_pew_history` 仅作聚合 facade,从 M3 读取,**零跨包 import**。详见 `docs/decisions/ADR-007.md`。

## 关键口径(与 contracts/pcp-schema.json 一致)

- 能量 kcal、蛋白 g、体重 kg、身高 cm;无跨包调用。
- 能量初始 = SDI 100%:生长不良取上限、超重取下限、正常取中点。
- 蛋白质:目标取 SDI **上限**;绝对下限取 SDI **下限**(绝不可低于);透析额外补充(PD 0.15–0.30 / HD 0.10 g/kg/day)叠加于目标与下限;素食按倍数上调(蛋奶素 1.2 / 纯素 1.3)。
- PE 比:理想 7–12%,CKD 可接受 5.3–6.4%(需总蛋白 ≥100% 需求)。

## 验证

```bash
python -m py_compile src/a207_nutrition_assessment_mcp/*.py
python tests/test_tools.py   # 83 断言全过
```

## 运行与部署

### 本地开发(最快验证)
```bash
fastmcp dev src/a207_nutrition_assessment_mcp/server.py
```
无需打包,直接起 stdio 服务,适合本地联调。

### 发布到 PyPI(与 his / lis / calc / router 完全同流程)

本项目 5 个 MCP **全部发布到 PyPI**(维护者 NFYY)。发布后裸 `uvx <包名>` 即可拉取,
GitHub Codespace / ModelScope 部署同理。报 `uvx ... was not found in the package registry`
**唯一原因就是该版本还没发到 PyPI**——把包构建并上传即可,和其他 4 个包一模一样。

> **命名说明**:本包 PyPI 发行名是 `a207-nutrition-assessment-mcp-nfyy`(带 `-nfyy` 后缀),
> 不是 `a207-nutrition-assessment-mcp`——后者在 PyPI 上已被他人占用(极小概率撞名),故加 `-nfyy` 规避。
> **Python 导入名仍为 `a207_nutrition_assessment_mcp`(不变)**,仅发行名 / 控制台脚本名带后缀。
> 其余 4 个包名未被占用,故无后缀。

```bash
# 1. 构建 sdist + wheel(产物落 dist/)
python -m build

# 2. 校验产物可上传(应 PASSED)
python -m twine check dist/*

# 3. 上传到 PyPI(需 NFYY 凭据:环境变量 PYPI_API_TOKEN 或 ~/.pypirc)
python -m twine upload dist/*
```

### 用 uvx 运行(已发布后 —— 与另外 4 个一致)

```bash
uvx a207-nutrition-assessment-mcp-nfyy            # 裸名,和 his/lis/calc/router 一样
uvx --refresh a207-nutrition-assessment-mcp-nfyy  # 强制刷新、重拉最新版
```

### 本地 / 离线开发(不发布也能跑,仅开发用)

- 包目录内直接跑:
  ```bash
  uvx --from . a207-nutrition-assessment-mcp-nfyy
  ```
- 或装成本地工具后裸名可用:
  ```bash
  uv tool install --from . a207-nutrition-assessment-mcp-nfyy
  ```

### GitHub / ModelScope 等远程部署

远程环境用**已发布的 PyPI 包**最直接(裸 `uvx a207-nutrition-assessment-mcp-nfyy`);
若想锁定 git 源,可用:
```bash
uvx --from "git+https://github.com/<owner>/<repo>.git" a207-nutrition-assessment-mcp-nfyy
```
确保 `<repo>` 指向**本包仓库**(根目录含 `pyproject.toml`),不要指向 A207 大仓根目录。

## 已知缺口(非阻断)

- 增长 Z 评分已按**中国卫健委标准**实现(WS/T 423-2022 + WS/T 612-2018,数据资产 `data/growth_ref_cn.json` 由 PDF 抽取生成)。**未采用 WHO 2007**(用户判定偏旧)——若未来需 WHO 口径,再补 LMS 参考表。
- WAZ/BAZ 仅覆盖 7 岁以下:WS/T 423 随附 7 岁以下体重/BMI 年龄别 SD 值;7-18 岁体重/BMI 标准未提供,故 7 岁以上跳过并给出 warning(未编造数据)。
- 本机未安装 fastmcp,`server.py` 仅 `py_compile` 静态校验,未实跑 stdio 服务。

TDQS

A3.8/5.0

Scored across 5 tools

Disambiguation4/5

Each tool has a distinct primary role (target calculation, intake assessment, diary write, diary read, PEW screening), but assess_intake_vs_target and assess_pew_risk both address PEW risk, which could cause minor confusion.

Naming Consistency3/5

Names use a mix of verbs (calc, assess, upsert, get) and two tools share the 'assess' prefix, so there's no single consistent pattern, though the names remain readable and descriptive.

Tool Count5/5

Five tools is well-scoped for a nutrition assessment server, covering core calculations, assessments, and diary management without unnecessary bloat.

Completeness4/5

The tool set covers the main workflow: target calculation, intake-to-target assessment, diary input/retrieval, and independent PEW risk screening. Minor gaps like a dedicated patient-context tool or diary deletion are not critical for the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessSyncing