Skip to main content
Glama

Lifesign — Сервер телеметрии статуса пользователя и здоровья

Легковесный HTTP-сервис: принимает статус устройства + данные о здоровье, отправленные с мобильного телефона, и предоставляет их AI-агентам через MCP (Model Context Protocol). Один процесс, один порт.

✨ Особенности

  • 📱 Отправка с телефона: iOS Shortcuts отправляют снимки заряда батареи, местоположения, сети и здоровья через POST /ingest

  • 🤖 MCP-шлюз: тот же процесс монтирует /mcp, AI-агенты (Hermes и др.) читают напрямую

  • 🏗️ Один порт, один процесс: загрузка + запрос + MCP — всё на порту 8764, без дополнительных HTTP-переходов

  • 🐳 Готов к Docker: GitHub Actions автоматически собирает образ, 1Panel развёртывает одной командой Compose

Related MCP server: Rouse Context

🏗️ Архитектура

手机 (iOS 快捷指令)
   │ POST https://<your-domain>/user-status/ingest   ← 仅上传经反代
   ▼
1Panel OpenResty (反向代理)
   │ proxy_pass → <host-ip>:8764/ingest
   ▼
┌──────────────────────────────┐
│ FastAPI + FastMCP 同一进程    │
│  (单端口 8764)               │
│                              │
│  POST /ingest   手机上传      │
│  GET  /query_all  agent读取  │
│  /mcp  MCP 网关 (同进程)      │
└──────┬───────────────────────┘
       │ 本机回环 http://127.0.0.1:8764/mcp
       ▼
   Hermes Agent (AI)
  • Загрузка с телефона: HTTPS через публичную сеть через обратный прокси → 8764/ingest

  • Чтение AI: прямое подключение через loopback к 8764/mcp (без публичной сети)

  • Общая память: инструменты MCP читают app.store напрямую, без сериализации/дополнительных запросов

🔌 Конечные точки

Метод

Путь

Аутентификация

Описание

POST

/ingest

Bearer ключ телефона

Отправка последнего статуса с телефона

GET

/query_all

Bearer ключ агента

Возвращает полный снимок

GET

/health

Нет

Проверка здоровья (для Docker HEALTHCHECK)

POST

/mcp

Нет (локальный loopback)

Конечная точка MCP streamable-http

🔑 Идентификация и конфигурация

Всего два общих ключа для идентификации (идентификаторы, не авторизация на уровне полей), оба могут быть переопределены переменными окружения:

Назначение

Переменная окружения

Значение по умолчанию (только для разработки)

Конечная точка

ключ телефона

USER_STATUS_PHONE_KEY

phone-secret-key-001

POST /ingest

ключ агента

USER_STATUS_AGENT_KEY

agent-read-secret-key-001

GET /query_all

порт прослушивания

USER_STATUS_PORT

8764

— (используется run.sh)

⚠️ В производственной среде необходимо переопределить ключи по умолчанию через переменные окружения, не используйте значения по умолчанию из репозитория.

🚀 Быстрый старт

Локальный запуск

python3 -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
./run.sh start      # 后台启动 :8764
./run.sh status
./run.sh stop

Запуск в Docker

# 本地构建
docker build -t lifesign:local .
docker run -d --name lifesign -p 8764:8764 \
  -e USER_STATUS_PHONE_KEY='<phone-key>' \
  -e USER_STATUS_AGENT_KEY='<agent-key>' \
  lifesign:local

Развёртывание через 1Panel Compose (рекомендуется)

  1. В 1Panel → Контейнеры → Оркестрация создайте новую оркестрацию и вставьте docker-compose.yml;

  2. Образ автоматически собирается GitHub Actions и отправляется в GHCR, при развёртывании просто загружается;

  3. Нужно открыть только один порт 8764, остальное обрабатывается обратным прокси.

Отправка данных с телефона

# 经公网反代(手机端快捷指令用这个)
curl -s -X POST https://<your-domain>/user-status/ingest \
  -H "Authorization: Bearer <phone-key>" \
  -H "Content-Type: application/json" \
  -d '{"deviceStage":{"battery":{"percentage":87,"is_charging":true}}}'

# 或内网直连
curl -s -X POST http://<host-ip>:8764/ingest \
  -H "Authorization: Bearer <phone-key>" \
  -H "Content-Type: application/json" \
  -d '{"deviceStage":{"battery":{"percentage":87,"is_charging":true}}}'

Конфигурация Hermes MCP (config.yaml)

mcp_servers:
  user-status:
    type: streamable-http
    url: http://127.0.0.1:8764/mcp   # 本机回环,不走公网
    connect_timeout: 10
    timeout: 30

Проверка: hermes mcp test user-status; после перезапуска Hermes инструменты регистрируются как mcp_user_status_*.

🐳 Сборка Docker-образа (GitHub Actions)

В репозитории встроен .github/workflows/docker-build.yml:

  • Триггеры: push в main / ручной workflow_dispatch / создание тега

  • Артефакты: двойные теги ghcr.io/<owner>/lifesign:latest и :<git-sha>

  • Платформы: linux/amd64, linux/arm64

  • Примечание: образ приватный (приватный репозиторий → приватный пакет GHCR), при развёртывании в 1Panel необходимо добавить учётные данные GHCR в конфигурацию Docker (имя пользователя ghcr.io + PAT).

✅ Тестирование

. .venv/bin/activate
python -m pytest tests/ -v

🗂️ Структура проекта

lifesign/
├── app/
│   ├── main.py            # FastAPI 入口(挂载 MCP 网关)
│   ├── mcp_server.py      # FastMCP 工具定义(get_status/get_battery/...)
│   ├── store.py           # 线程安全内存存储
│   ├── models/status.py   # Pydantic 数据模型
│   └── routers/           # /ingest 与 /query_all 路由
├── config/clients.example.yaml   # 身份配置模板(真实文件勿提交)
├── panel_api.py           # 1Panel API 签名请求辅助脚本
├── docker-compose.yml     # 1Panel Compose 部署编排
├── Dockerfile
├── run.sh                 # 本机后台启停
└── tests/

📜 Лицензия

MIT

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    A real-time system diagnostics MCP server that gives AI agents live access to CPU, RAM, disk, network, processes, and hardware health metrics, with zero cloud dependency.
    7
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Turn your Android phone into an MCP server. AI assistants connect on demand, query your health data, notifications, app usage, and take actions on your device — all end-to-end encrypted, no cloud sync.
    5
    Apache 2.0