内容
<div align="center">
<img src=".github/assets/healthclaw-logo.png" alt="HealthClaw — AI-Powered Healthcare Intelligence" width="440">
# HealthClaw 护栏
### 连接 AI 代理与临床数据之间的开源安全层。
*FHIR 标准化了健康数据的结构。MCP 标准化了 AI 如何连接到工具。*
***没有人能标准化其间的护栏。本项目做到了。***
<br/>
<!-- Project -->
[](https://github.com/aks129/HealthClawGuardrails/releases)
[](LICENSE)
[](https://github.com/aks129/HealthClawGuardrails/actions/workflows/ci.yml)
[](https://github.com/aks129/HealthClawGuardrails)
<!-- Community metrics -->
[](https://github.com/aks129/HealthClawGuardrails/stargazers)
[](https://github.com/aks129/HealthClawGuardrails/network/members)
[](https://github.com/aks129/HealthClawGuardrails/issues)
[](https://github.com/aks129/HealthClawGuardrails/graphs/contributors)
[](https://github.com/aks129/HealthClawGuardrails/commits/main)
<!-- Stack & scope -->
[](#testing)
[](#mcp-tools-24)
[](#fhir-version-support)
[](pyproject.toml)
[](#docker)
<br/>
**[快速开始](#quick-start)** · **[MCP 工具](#mcp-tools-24)** · **[示例](docs/recipes/)** · **[Claude 插件](#install-as-a-claude-plugin)** · **[架构](#what-it-does)** · **[healthclaw.io](https://healthclaw.io)** · **[贡献](CONTRIBUTING.md)**
</div>
---
> **是什么:** 一个 FHIR × MCP 护栏层的开源参考实现 — PHI 匿名处理、
> 不变审计、逐步授权和租户隔离 — 位于 *任何* AI 代理和 *任何* FHIR
> 服务器之间。作为社区项目开放构建,MIT 许可。不是产品,不推销:若模式有用,请采用;若有问题,请告知或修复。
**这是一个社区努力。** 当实施者、临床医生和标准专家发现问题时,它最有价值。欢迎提出问题、PR 和 "您在 SDC 提取方面做错了" 的批评 — 从 **[CONTRIBUTING.md](CONTRIBUTING.md)** 和 **[行为准则](CODE_OF_CONDUCT.md)** 开始。
**概览:** v1.6.0 · 840+ Python + 76 Node 测试 · 24 MCP 工具 · FHIR R4 US Core v9 + R6 v6.0.0-ballot3 · HL7 SDC 表单 (`$populate`/`$extract`) · NQF 0018 质量衡量 · 实验室解释器 (`$interpret`) · Fasten TEFCA · HealthEx · HBO · Flexpa · Epic · MEDENT · Open Wearables · 现实世界操作(调用/SMS)· SMART Health Links · Claude 代码插件 · OpenAI/Gemini 适配器
## 版本亮点
完整说明见 **[发布](https://github.com/aks129/HealthClawGuardrails/releases)**。
| 版本 | 亮点 |
| --- | --- |
| **v1.6.0** | 实验室参考范围解释器 (`Observation/$interpret`) · NQF 0018 质量衡量 (`Measure/$evaluate-measure`) · [任意代理框架适配器](docs/recipes/any-agent-framework.md) (OpenAI/Gemini) · [Medplum 前置示例](docs/recipes/healthclaw-in-front-of-medplum.md) · 2025 AHA/ACC SMBP 分级 · ruff lint 门控 · 所有依赖顾问已修复 |
| v1.5.0 | 读取认证强化(租户读取认证,而不仅仅是范围限定)· HL7 SDC 表单 — `$populate` / `$extract` |
| v1.4.0 | 六个健康数据连接器(Fasten TEFCA、HealthEx、Health Bank One、Flexpa、Epic、MEDENT)位于一个护栏堆栈后面 |
| v1.3.0 | 可穿戴设备 → FHIR 观察(8 个提供者,LOINC/UCUM 映射,设备来源) |
| v1.2.0 | 编译真实性 — 当前状态 + 仅追加证据轨迹每个资源 |
## 它做什么
这是一个**与供应商无关的护栏代理**,位于任意 AI 代理和任意 FHIR 服务器之间。每个请求都经过:
- **PHI 匿名处理** — 名称缩短为首字母,标识符掩码,地址剥离,出生日期缩短为年
- **不可变审计轨迹** — 每个读取/写入都记录租户、代理、时间戳
- **逐步授权** — 写入需要 HMAC-SHA256令牌
- **人工介入** — 临床写入在人类确认之前被阻止(HTTP 428)
- **租户隔离** — 每个查询都限定在租户内,阻止跨租户访问
- **医疗声明** — 在所有临床资源读取中注入
- **编译真实性** — 当前状态 + 每个资源的仅追加证据轨迹
```text
AI 代理 ──▶ MCP 服务器 ──▶ 护栏代理 ──▶ 任意 FHIR 服务器
↓ (HAPI,Epic,
PHI 匿名处理 Medplum 等)
审计轨迹
逐步授权
人工介入
```
## 作为 Claude 插件安装
HealthClaw 作为 Claude 代码插件市场提供。提供了两个插件:
```bash
# 添加市场
claude plugin marketplace add aks129/HealthClawGuardrails
# 安装 FHIR 护栏插件(此仓库)
claude plugin install healthclaw-guardrails@healthclaw-marketplace
# 安装个人健康伴侣插件(SmartHealthConnect)
claude plugin install smarthealthconnect@healthclaw-marketplace
```
| 插件 | 技能 | 来源 |
| --- | --- | --- |
| `healthclaw-guardrails` | curatr, fasten-connect, fhir-r6-guardrails, fhir-upstream-proxy, healthex-export, phi-redaction | [aks129/HealthClawGuardrails](https://github.com/aks129/HealthClawGuardrails) |
| `smarthealthconnect` | care-completion, diet-exercise, healthy-habits, kids-health, medication-refills, research-monitor | [aks129/SmartHealthConnect](https://github.com/aks129/SmartHealthConnect) |
每个技能都是自动可发现的 — Claude 在您的提示与技能的触发短语匹配时加载它(例如“检查我的护理差距”,“匿名此包”,“在我的条件下运行 Curatr”)。
**不在 Claude/MCP 上?** 相同的 24 个护栏工具在 OpenAI、Gemini、LangChain 或普通 HTTP 上运行,通过 [`adapters/`](adapters/) 中的框架中立桥 — 参见 [示例:在任意代理框架上运行 HealthClaw 工具](docs/recipes/any-agent-framework.md)。护栏位于服务器端,因此没有框架可以绕过它们。
## 快速开始
```bash
# 安装依赖
uv sync
# 运行(本地模式,SQLite)
STEP_UP_SECRET=your-secret python main.py
# 使用上游 FHIR 服务器运行
FHIR_UPSTREAM_URL=https://hapi.fhir.org/baseR4 STEP_UP_SECRET=your-secret python main.py
# 打开浏览器
open http://localhost:5000 # 带有实时演示的登陆页面
open http://localhost:5000/r6-dashboard # 交互式仪表板
```
### Docker
```bash
docker-compose up -d --build
# 服务:
# - fhir-mcp-guardrails(Flask,端口 5000)
# - agent-orchestrator(MCP 服务器,端口 3001)
# - redis(端口 6379)
```
## MCP 工具(24 个)
工具名称使用下划线(不是点)以兼容 Claude Desktop / MCP 客户端。
**读取工具**(公共租户不需要逐步授权):
| 工具 | 描述 |
| --- | --- |
| `context_get` | 检索预建的上下文信封 |
| `fhir_read` | 读取 FHIR 资源(匿名) |
| `fhir_search` | 搜索患者、代码、状态、日期过滤器 |
| `fhir_validate` | 结构验证 |
| `fhir_stats` | 观察统计(计数/最小/最大/均值) |
| `fhir_lastn` | 每个代码的最近 N 个观察 |
| `fhir_interpret_labs` | 实验室参考范围解释(`$interpret`)— 决策支持,不是诊断 |
| `fhir_permission_evaluate` | R6 权限访问控制评估 |
| `fhir_subscription_topics` | 列出可用的订阅主题 |
| `questionnaire_populate` | SDC `$populate` — 为主题预填充问卷 |
| `curatr_evaluate` | 评估 FHIR 资源的数据质量问题 |
| `action_status` | 轮询现实世界操作(调用/SMS) |
**写入工具**(需要逐步授权):
| 工具 | 描述 |
| --- | --- |
| `fhir_propose_write` | 验证 + 预览而不提交 |
| `fhir_commit_write` | 提交逐步授权 + 人工干预 |
| `questionnaire_extract` | SDC `$extract` — 从完成的问卷响应中提取资源 |
| `curatr_apply_fix` | 应用患者批准的修复并跟踪来源 |
| `action_propose` / `action_commit` | 提出 / 提交现实世界的电话或 SMS |
| `shl_generate` | 生成加密的 SMART Health Link(二维码) |
**实用工具:
| 工具 | 描述 |
| --- | --- |
| `fhir_get_token` | 发出 5 分钟逐步授权令牌(调用写入前) |
| `fhir_seed` | 用演示患者 + 观察 + 病症播种租户 |
| `fhir_compiled_truth` | 当前状态 + 来源证据时间线 |
所有工具都添加 `_mcp_summary`,包含推理、临床上下文和限制。
## 护栏演示
`/r6/fhir/demo/agent-loop` 处的 6 步演示显示完整的护栏序列:
1. **PHI 匿名处理** — 代理读取患者,接收匿名数据
2. **$validate 门控** — 代理提出观察,验证后写入
3. **权限拒绝** — 不存在权限规则,拒绝访问并提供推理
4. **权限允许** — 创建允许规则,重新评估成功
5. **逐步授权 + 人工干预** — 写入需要令牌和人工确认
6. **提交 + 审计** — 写入成功,生成完整审计轨迹
## 比较
| 功能 | 本项目 | AWS HealthLake MCP | Medplum MCP | 原始 FHIR API |
| --- | --- | --- | --- | --- |
| 与任何 FHIR 服务器配合使用 | 是 | 仅限 HealthLake | 仅限 Medplum | 不适用 |
| 读取时的 PHI 匿名处理 | 是 | 否 | 否 | 否 |
| 不变审计轨迹 | 是 | CloudTrail(单独) | 部分 | 否 |
| 写入的逐步授权 | 是 | IAM(单独) | Medplum 授权 | 否 |
| 人工干预 | 是 | 否 | 否 | 否 |
| 权限 `$evaluate`(R6) | 是 | 否 | 否 | 否 |
| 设置时间 | 10 秒 | 30+ 分钟 | 15+ 分钟 | 变化 |
## FHIR 版本支持
| 版本 | 配置文件 | 状态 | 资源 |
| --- | --- | --- | --- |
| R4 | US Core v9 | **稳定** | Patient, Condition, AllergyIntolerance, Immunization, MedicationRequest, Procedure, DiagnosticReport, CarePlan, CareTeam, Goal, DocumentReference, Coverage, ServiceRequest, Location, Organization, Practitioner, PractitionerRole, RelatedPerson, Specimen, FamilyMemberHistory |
| R6 | v6.0.0-ballot3 | 实验性 | Permission, SubscriptionTopic, DeviceAlert, NutritionIntake, DeviceAssociation, NutritionProduct, Requirements, ActorDefinition |
两个 R4 和 R6 资源流经相同的护栏堆栈(PHI 匿名处理,审计,逐步授权,租户隔离)。R6 资源可能会在最终发布前更改。
## 测试
```bash
# Python 测试(840+,跨 40+ 文件;包括 SDC、质量和实验室套件)
uv run python -m pytest tests/ -v
uv run python -m pytest tests/test_r6_routes.py::test_name -v # 单个测试
# MCP 服务器测试
cd services/agent-orchestrator && npm ci && npm test
# Playwright 端到端测试(UI + API,需要 Flask on :5000)
cd e2e && npm ci && npx playwright install --with-deps chromium && npm test
cd e2e && npm run test:headed # 带头浏览器
cd e2e && npm run test:ui # 交互式 UI 模式
```
## API 端点
| 端点 | 方法 | 描述 |
| --- | --- | --- |
| `/r6/fhir/metadata` | GET | 能力声明 |
| `/r6/fhir/health` | GET | 活动探针(报告上游状态) |
| `/r6/fhir/{type}` | POST | 创建资源(需要逐步授权) |
| `/r6/fhir/{type}` | GET | 搜索资源 |
| `/r6/fhir/{type}/{id}` | GET | 读取资源(匿名) |
| `/r6/fhir/{type}/{id}` | PUT | 更新资源(需要逐步授权 + ETag) |
| `/r6/fhir/{type}/$validate` | POST | 验证资源 |
| `/r6/fhir/Questionnaire[/{id}]/$populate` | POST | SDC — 预填充问卷响应 |
| `/r6/fhir/QuestionnaireResponse/$extract` | POST | SDC — 从完成的问卷响应中提取交易包 |
| `/r6/fhir/{type}/{id}/$deidentify` | GET | HIPAA 安全港匿名处理 |
| `/r6/fhir/Observation/$stats` | GET | 观察统计 |
| `/r6/fhir/Observation/$lastn` | GET | 最近的观察 |
| `/r6/fhir/Permission/$evaluate` | POST | R6 访问控制评估 |
| `/r6/fhir/SubscriptionTopic/$list` | GET | 订阅主题发现 |
| `/r6/fhir/Bundle/$ingest-context` | POST | 包摄取 + 上下文信封 |
| `/r6/fhir/context/{id}` | GET | 检索上下文信封 |
| `/r6/fhir/AuditEvent` | GET | 搜索审计事件 |
| `/r6/fhir/AuditEvent/$export` | GET | 导出审计轨迹(NDJSON/Bundle) |
| `/r6/fhir/demo/agent-loop` | POST | 6 步护栏演示 |
| `/r6/fhir/oauth/*` | * | OAuth 2.1 + PKCE + SMART 发现 |
| `/r6/fhir/{type}/{id}/$curatr-evaluate` | GET | 评估资源数据质量(Curatr) |
| `/r6/fhir/{type}/{id}/$curatr-apply-fix` | POST | 应用患者批准的修复并创建来源 |
## 上游代理
与真实的 FHIR 服务器连接,同时保持所有护栏激活:
```bash
FHIR_UPSTREAM_URL=https://hapi.fhir.org/baseR4 python main.py
```
- **读取**:从上游获取,匿名处理 + 审计 + 声明 + 匿名处理
- **搜索**:转发所有查询参数,结果按条目匿名处理
- **写入**:本地验证,转发逐步授权检查
- **URL 重写**:上游 URL 永远不会泄露给客户端
已测试:HAPI FHIR R4/R5,SMART Health IT,Epic Sandbox。
**将护栏放在 FHIR 服务器前面** — 在 **Medplum** 前运行削减 + 审计 + 逐步授权 + 人工干预堆栈的示例(相同的模式适用于 Aidbox,Google Cloud Healthcare 或任何 FHIR R4 服务器):[示例:在 Medplum 前部署 HealthClaw](docs/recipes/healthclaw-in-front-of-medplum.md)。一个可重复的集成测试(`tests/test_medplum_in_front.py`)证明了一个 Medplum 返回的患者经过削减,审计和逐步授权后到达 Medplum。
## Curatr — 患者拥有的数据质量
Curatr 是一个面向患者的医疗数据质量技能,评估 FHIR 健康记录的编码问题,并让患者决定如何解决这些问题。
```text
1. 患者连接数据 → HealthClaw 护栏匿名处理并加载数据
2. OpenClaw 调用 curatr.evaluate → 检查代码是否与实时术语 API 一致
3. 以通俗语言呈现问题,并提供影响和修复建议
4. 患者批准修复 → curatr.apply_fix 更新资源 + 创建来源
5. 可选:生成结构化修正请求,供源提供者使用
```
**检查 Condition 时,Curatr 检查的内容:
| 检查 | 服务 | 示例 |
| --- | --- | --- |
| 弃用代码系统 | 本地查找(无网络) | ICD-9-CM → 临界 |
| ICD-10-CM 代码有效性 | NLM 临床表格 API | 无效代码 → 警告 |
| SNOMED CT / LOINC 有效性 | tx.fhir.org(HL7 公共) | 未知代码 → 警告 |
| RxNorm 药品代码 | RXNAV API(NLM) | 缺失 RXCUI → 警告 |
| 显示名称准确性 | 与规范术语交叉检查 | 不匹配 → 建议 |
| 缺失必填字段 | 结构 | 无临床状态 → 警告 |
每个修复都会创建一个链接的 **来源** 资源,记录患者意图,字段更改和代理属性。所有更改都记录在不可变的轨迹中。
**OpenClaw 技能:** `skills/curatr/SKILL.md`
## SMART Health Links(消除剪贴板)
患者控制的加密记录共享,通过二维码实现,使用 **jmandel/kill-the-clipboard-skill**(MIT,固定 `fa0020d`)— 感谢 Josh Mandel。HealthClaw 控制进入包的内容(逐步授权,配置文件,护栏,审计轨迹);KTC 控制共享(零知识服务器端存储,SHL STU 1 协议,撤销,浏览器内查看器)。
**功能:** `shl_generate` MCP 工具(写入组,需要逐步授权)获取患者的护栏 FHIR 包,客户端加密,上传密文,并返回:
- `shlink` — 编码到二维码的 `shlink:/` URI(加密指针,非数据)
- `viewer_link` — 诊所工作人员的浏览器 URL
- `manage_link` — 患者专属撤销 + 访问日志 URL
**安全性:** 二维码仅编码加密指针。PHI 从未出现在二维码图像中。SHL 服务器仅存储密文 + `sha256(auth_token)`。人员硬规则:参见 `skills/share-health-qr/SKILL.md` — 永远不要直接编码 PHI 到二维码图像(事件 2026-06-12)。
### 快速开始(本地)
```bash
# 启动 SHL 存储服务器(配置文件 `shl`)
docker-compose --profile shl up -d
# 告诉 MCP 服务器 SHL 服务器的位置
# 添加到 services/agent-orchestrator/.env 或导出:
export SHL_SERVER_URL=http://localhost:8000
```
如果没有 `SHL_SERVER_URL`,`shl_generate` 返回一个显式模拟存根(`simulated: true`) — 从不生成假链接。
### Railway 部署
```bash
# ...
```
# 1. 添加 SHL 服务
railway add --service shl-server
# 2. 附加持久化卷(SQLite 存储在此)
railway service shl-server && railway volume add --mount-path /data
# 3. 配置 SHL 服务器
railway variables --service shl-server \
--set BASE_URL=<shl-server 公网地址> \
--set DB_PATH=/data/db.sqlite
# 4. 暴露公网域名
railway domain --service shl-server
# 5. 部署 — 必须从 shl-server 目录运行
cd services/shl-server && railway up --service shl-server
# 6. 将 MCP 服务器连接到 SHL 服务器
railway variables --service mcp-server \
--set SHL_SERVER_URL=<shl-server 公网地址>
```
> **注意事项 1 — 从正确目录部署:** 仓库根目录的 `railway.toml` 指向 Flask Dockerfile。如果您从仓库根目录运行 `railway up --service shl-server`,Railway 使用错误的 Dockerfile,部署失败。请始终先 `cd services/shl-server` — 该目录有自己的 `railway.toml`,指向正确的镜像。
>
> **注意事项 2 — 监视模式跳过:** 从根配置继承了 `watchPatterns` 的服务可能会静默跳过仅 Dockerfile 的部署(未检测到源文件更改)。`services/shl-server/` 中的每个服务 `railway.toml` 在首次成功构建后覆盖此设置。如果部署被跳过,请从 shl-server 目录强制执行一次 `railway up --service shl-server`。
>
> **注意事项 3 — 模拟模式:** 如果 MCP 服务器上没有设置 `SHL_SERVER_URL`,`shl_generate` 返回 `{ simulated: true, note: "SHL_SERVER_URL 未配置 — 返回存根。" }`。Persona 原样显示此说明,并且永远不会即兴创作替代方案。
**OpenClaw 技能:** `skills/share-health-qr/SKILL.md`
## R6 特定资源(实验性)
这些资源是 FHIR R6 ballot3 规范的一部分,可能会在最终发布前更改。
| 资源 | R6 新增内容 |
| --- | --- |
| Permission | 访问控制(与 Consent 分开), `$evaluate` 操作 |
| SubscriptionTopic | 重构的发布/订阅(R5 引入,R6 成熟) |
| DeviceAlert | ISO/IEEE 11073 设备报警 |
| NutritionIntake | 饮食消费跟踪 |
| DeviceAssociation | 设备-患者关系 |
| NutritionProduct | 营养产品定义 |
| Requirements | 功能需求跟踪 |
| ActorDefinition | 演员角色定义 |
## 美国核心 v9 R4 资源(稳定)
符合 US Core 实现指南 v9 的标准 FHIR R4 资源。这些资源在美国医疗保健领域广泛部署,稳定且可用于生产。
AllergyIntolerance, Immunization, MedicationRequest, Medication, MedicationDispense,
Procedure, DiagnosticReport, CarePlan, CareTeam, Goal, DocumentReference,
Location, Organization, Practitioner, PractitionerRole, RelatedPerson,
Coverage, ServiceRequest, Specimen, FamilyMemberHistory
## 环境变量
| 变量 | 是否必填 | 默认值 | 描述 |
| --- | --- | --- | --- |
| `STEP_UP_SECRET` | 生产环境 | — | HMAC-SHA256 签名密钥 |
| `FHIR_UPSTREAM_URL` | 否 | — | 上游 FHIR 服务器(启用代理模式) |
| `SQLALCHEMY_DATABASE_URI` | 生产环境 | `sqlite:///mcp_server.db` | 数据库连接 |
| `SESSION_SECRET` | 否 | (开发密钥) | Flask 会话密钥 |
| `FHIR_UPSTREAM_TIMEOUT` | 否 | 15 | 上游请求超时(秒) |
| `FHIR_LOCAL_BASE_URL` | 否 | — | 响应 URL 重写的本地 URL |
## 项目结构
```text
main.py Flask 应用入口
app.py Web UI 路由(landing, dashboard)
r6/
routes.py R6 FHIR REST Blueprint(1732 行)
models.py R6Resource, ContextEnvelope, AuditEventRecord
validator.py FHIR R6 结构验证
redaction.py PHI 删减(姓名,标识符,地址,出生日期,通信)
audit.py 不可变 AuditEvent 记录
stepup.py HMAC-SHA256 步进令牌管理
oauth.py OAuth 2.1 + PKCE + SMART-on-FHIR 发现
health_compliance.py 声明,HITL,HIPAA 安全港,审计导出
context_builder.py 包摄入 + 上下文信封
rate_limit.py 每租户速率限制
fhir_proxy.py 上游 FHIR 服务器代理,URL 重写
curatr.py Curatr 数据质量引擎(术语查找 + 应用程序修复)
services/agent-orchestrator/
src/index.ts MCP 服务器(Streamable HTTP + SSE)
src/tools.ts 12 种工具定义 + 执行器(包括 curatr.evaluate, curatr.apply_fix)
e2e/ Playwright 端到端测试
templates/ Jinja2(landing 页面,dashboard)
static/ 交互式 dashboard 的 CSS + JS
skills/curatr/ Curatr OpenClaw 技能定义
tests/ 266 pytest 测试(8 个文件,包括 test_us_core_r4.py)
```
## 个人 FHIR 数据存储 — 患者导入流程
本指南展示了如何从原始 HealthEx 导出并通过 Claude Code 的 MCP 工具查询您自己的记录。
### 1. 启动堆栈
```bash
uv sync
uv run python main.py # Flask 在 :5000
cd services/agent-orchestrator && npm ci && npm start # MCP 在 :3001
```
### 2. 导入您的 HealthEx / Flexpa / 通用 FHIR 包
```bash
# dry-run 首先预览而无需写入
python scripts/import_healthex.py \
--bundle-file ~/Downloads/my-records.json \
--dry-run
# 真实导入 — 成功后打印 context_id
python scripts/import_healthex.py \
--bundle-file ~/Downloads/my-records.json \
--tenant-id my-patient \
--step-up-secret "$STEP_UP_SECRET"
```
### 3. 通过 MCP 连接 Claude Code
此仓库中的 `.mcp.json` 在您打开项目时自动配置 Claude Code。请更新 `X-Tenant-ID` 以匹配您的 `--tenant-id`:
```json
{
"mcpServers": {
"healthclaw-local": {
"type": "http",
"url": "http://localhost:3001/mcp",
"headers": { "X-Tenant-ID": "my-patient" }
}
}
}
```
然后在 Claude Code 中:
```text
使用 fhir_search 查找所有我的病况
使用 context_get 和 context_id <ctx-id> 获取我的完整上下文信封
对 Condition/<id> 使用 curatr_evaluate 检查数据质量
```
### 4. 设置 Fasten Connect(可选)
```bash
# .env 添加
FASTEN_PUBLIC_KEY=<key>
FASTEN_PRIVATE_KEY=<key>
FASTEN_WEBHOOK_SECRET=<secret>
FASTEN_CURATR_SCAN=true # 每次导入后自动运行 Curatr
```
记录通过 webhook 到达 `/r6/fasten/webhook`,并存储在患者的规范租户 ID 下。
### 5. 匿名处理以便共享
```bash
# HIPAA 安全港
curl -H "X-Tenant-ID: my-patient" \
http://localhost:5000/r6/fhir/Patient/pt-1/\$deidentify
# 患者控制(保留出生日期,剥离机构标识符)
curl -H "X-Tenant-ID: my-patient" \
"http://localhost:5000/r6/fhir/Patient/pt-1/\$deidentify?mode=patient-controlled&patient_id=my-patient"
```
### 6. Telegram 机器人(可选)
```bash
TELEGRAM_BOT_TOKEN=<token> TENANT_ID=my-patient \
FHIR_BASE_URL=http://localhost:5000/r6/fhir \
python openclaw/bot.py
```
命令: `/health`, `/conditions`, `/labs`, `/curatr`, `/curatr fix`, `/approve`.
或使用 Docker Compose:
```bash
docker-compose --profile openclaw up -d
```
### 7. 使用 Medplum 作为 FHIR 存储(可选)
在 `.env` 中设置(留空 `FHIR_UPSTREAM_URL`):
```bash
MEDPLUM_BASE_URL=https://api.medplum.com/fhir/R4
MEDPLUM_CLIENT_ID=<id>
MEDPLUM_CLIENT_SECRET=<secret>
```
所有防护措施均适用于 Medplum 响应,与本地 SQLite 模式相同。访问令牌缓存在 Redis 中(键 `medplum:access_token`;当 Redis 不可用时,降级为进程内缓存)。
---
## 已知限制
- 本地模式:JSON 大数据块存储,表扫描搜索(无索引字段)
- 仅结构验证(无 StructureDefinition 一致性或术语绑定)
- SubscriptionTopic 已存储,但未分发通知
- 人在环中是一个头部标志(`X-Human-Confirmed`),不是加密确认 — 一个补偿控制用于演示,而不是证明人类行为
- OAuth 端点用于发现/SMART 广告;路由强制通过逐步升级 + 读取身份验证令牌,自动批准授权流程仅限于公共/演示租户(无用户同意屏幕)
- 无历史版本控制(version_id 递增但旧版本不可检索)
- 上游代理:无响应缓存,无跨版本转换
- **安全性依赖于配置 — 生产环境需要** `READ_AUTH_ENABLED=true`(验证非公共读取),`INTERNAL_TOKEN_MINT_SECRET`(门控令牌铸造/种子用于非公共租户;生产环境中未设置时关闭),`PUBLIC_TENANTS` 仅限于综合演示租户,真正的 `SESSION_SECRET`/`STEP_UP_SECRET`,以及仅 HTTPS 的上游
- 步进令牌在 5 分钟 TTL 内对多个写入有效(非单次使用);不可逆操作依赖于状态机幂等性(受保护的 `WHERE status='proposed'` 声明)而不是非消耗计数
## 贡献 — 这是一个社区努力
HealthClaw Guardrails 作为一个共享参考开发,而不是商业产品。人工智能代理和临床数据之间的防护层只有在许多具有不同视角的人测试和施加压力时才能变得值得信赖。我们尤其欢迎:
- **实施者** 构建 FHIR × MCP 集成 — 告诉我们现实世界中模式在哪里中断。
- **临床医生和合规人员** — 挑战删减配置文件,审计模型和记录的 HIPAA 状态。
- **标准人士** (HL7 / SDC / SMART)— 告诉我们我们在哪里偏离了规范,特别是 `$populate`/`$extract`。
- **任何人** — 打开一个问题,提交“你做错了”或发送 PR。
从这里开始: **[CONTRIBUTING.md](CONTRIBUTING.md)** · **[行为准则](CODE_OF_CONDUCT.md)** · **[更新日志](CHANGELOG.md)** · **[安全策略](SECURITY.md)**
好的第一份贡献在问题跟踪器中被标记。无 CLA,无把关 — 只有下面的 MIT 许可证。
## 许可证
MIT — 免费使用,fork 和构建。见 [LICENSE](LICENSE)。
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器