mcpField
B
Ble Hrm Server

Ble Hrm Server

本地服务
github.com/ThinkInAI-Hackathon健康医疗271 周前更新

关于 Ble Hrm Server

ble-hrm-server 是用于连接蓝牙心率监测设备的 Python MCP 服务,为通过 MCP 客户端使用的应用提供心率监测、测量、汇总和图表生成。

主要功能

  1. 01发现带 HRM 配置的设备
  2. 02按指定时长监测心率
  3. 03计算近期读数的平均值
  4. 04评估最高心率
  5. 05提供分桶读数和图表

适用场景

  1. 01运动期间监测心率
  2. 02查看近期平均心率
  3. 03运动后检查峰值心率
  4. 04生成近期读数图表

MCP 相关

它向 MCP 客户端提供 HRM 设备发现资源,以及监测、获取、评估和绘制心率读数的工具。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"ble-hrm-server": {
"command": "uvx",
"args": [
"ble-hrm-server"
]
}
}
}
启动命令uvx ble-hrm-server

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypible-hrm-server

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

ble-hrm-server

一个用作 BLE Heart Rate Monitoring(心率监测)的 MCP 服务,用于连接 HRM 设备。

构建状态

CI

安装

我们建议使用虚拟环境和 uv 管理依赖项。

本项目使用 pyproject.toml 管理依赖项。

# Create and activate a virtual environment
python3 -m venv .venv
source .venv/bin/activate  # On Windows use `.venv\Scripts\activate`

# Install uv if not already installed
pip install uv

# Install dependencies
uv sync

环境配置

本项目支持通过 .env 文件进行配置。你可以使用提供的 .env.sample 作为模板。

cp .env.sample .env

以下环境变量会用到:

  • QINIU_ACCESS_KEY:你的七牛访问密钥。
  • QINIU_SECRET_KEY:你的七牛密钥。
  • QINIU_BUCKET_NAME:七牛存储桶的名称。
  • QINIU_BUCKET_DOMAIN:与七牛存储桶关联的域名。

使用方法

运行服务

uv run src/hrm/server.py

从 PyPI 安装后,你可以直接使用以下命令运行服务:

uvx ble-hrm-server

运行测试

uv run pytest

运行测试并统计覆盖率

uv run coverage run -m pytest
uv run coverage html

MCP 定义

资源

蓝牙 HRM 基于蓝牙协议,因此我们应使用 bleak 来发现设备并连接。

  • 发现蓝牙设备并按 HRM 配置文件(心率服务 0x180D)筛选
  • 资源:discover://hrm

工具

  • 工具:监测心率 monitoring_heart_rate

    • 摘要:在指定时长内开始监测设备心率,默认时长为 30 分钟(1800 秒)。监测将在后台进行。
    • 输入:
      • device_id:str,要监测的设备 UUID
      • duration:int,监测时长,默认值为 1800 秒(30 分钟)
    • 输出:无
  • 工具:获取心率 get_heart_rate

    • 摘要:获取当前心率,使用最近 10 秒的数据并返回平均心率
    • 输入:无(假设已有基线读数)
    • 输出:当前心率(int),例如 {"avg_hr": 60}
  • 工具:评估运动心率 evaluate_active_heart_rate

    • 摘要:评估最近 60 秒内的最高心率,并将本次运动期间观测到的最高值记录为运动心率。
    • 输入:无(假设已有基线读数)
    • 输出:最高心率(int),例如 {"max_hr": 100}
  • 工具:获取心率分桶 get_heart_rate_bucket

    • 摘要:获取最近 10 秒的心率分桶数据,分桶大小为 1 秒。
    • 输入:
      • since_from:float,监测开始时间,默认为 10 秒前
      • bucket_size:float,分桶大小,默认为 1 秒
    • 输出:心率分桶:list[dict],例如 [{"time": 1715904000, "value": 60}, {"time": 1715904001, "value": 61}]
  • 工具:构建心率图表 build_heart_rate_chart

    • 摘要:构建最近 600 秒的心率图表,分桶大小为动态值,默认大小为 1 秒。分桶数量上限为 60;如果分桶数量超过 60,分桶大小将增加为 duration / 60 秒。
    • 输入:
      • since_from:float,监测开始时间,默认为 600 秒前
    • 输出:心率图表 PNG URL:str,例如 https://example.com/chart.png

MCP 设置

以下是此服务的 MCP 设置:

{
  "mcpServers": {
    "blue-hrm": {
      "command": "uvx",
      "args": [
        "ble-hrm-server"
      ]
    }
  }
}

以下是 DeepSeek V3.1 测试用的 LLM 提示词示例:

你是一位健康专家,通过心率来检测测试者的心脏健康程度,现在测试者携带了蓝牙的心率带,

以下为检测步骤
- 你通过发现来获取的设备ID,通过rssi获取最接近的设备,再以此设备开始监控。
- 获取当前测试者的静息心率。
- 当测试结束后,提示测试者开始中高强度运动,比如波比跳,当测试者完成运动后,回复后,立刻测试其最高运动心率。
- 之后提示测试者计时休息2分钟,得到确认后,再次获取当前心率,并与最高心率的差额作为恢复心率。 

最后通过恢复心率的值和以下列表评估测试者的心脏健康程度,并用健康专家的口吻给测试者一些关于心脏健康方面的建议。
------
- <22: 身体年龄略大于 真实年龄
- 22~52: 身体年龄= 真实年龄 
- 53~58: 身体年龄略小于真实年龄 
- 59~65: 身体年龄比真实年龄小 
- >=66: 身体年龄比真实年龄小很多

代码覆盖率

名称语句数未覆盖覆盖率
src/hrm/__init__.py00100%
src/hrm/bt_client.py139596%
src/hrm/ts_db.py41198%
总计180697%

赞助商

特别感谢七牛云提供存储服务。七牛还提供 LLM 推理服务。

七牛 Logo

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。