Skip to main content
Glama
tomwugdgz

Happy MedBox MCP Server

by tomwugdgz

家庭用お薬管理システム(Happy MedBox)

三端ソフトウェアスキャフォールド:微信小程序端 + Node/SQLite バックエンド + MCP サーバー + A2A リマインダーエージェント。 コア全フロー:撮影認識 → データベース書き込み → 定時スキャン期限切れ → MCP データインターフェース提供 → A2A リマインダー発動 → 小程序でリマインダーとアドバイス表示。

技術選定:バックエンドと小程序はどちらもネイティブ/ゼロ外部依存で実装(Node 22 組み込み http / node:sqlite / node:test)、オフラインで node 実行とテストが可能、npm install 不要。

ディレクトリ構成

happy-medbox/
├─ prd.md / architecture.md      # 产品需求 + 系统架构(团队 SOP 产出)
├─ package.json / README.md
├─ src/                          # 后端:API + 数据库 + MCP + A2A
│  ├─ db.js          # SQLite 连接与建表(node:sqlite)
│  ├─ expiry.js      # 过期计算(纯函数,可单测)
│  ├─ ocr.js         # OCR 接口 + Mock(预留腾讯云/微信 OCR)
│  ├─ repository.js  # 数据访问层 CRUD
│  ├─ mcp-server.js  # MCP 工具 + JSON-RPC(stdio)
│  ├─ server.js      # REST API(小程序对接)
│  ├─ a2a-server.js  # 提醒代理 + 用户代理(双端口,A2A 推送)
│  ├─ seed.js        # 样例数据
│  └─ index.js       # 编排入口(启动 + 定时扫描)
├─ miniprogram/                  # 微信小程序端(原生)
│  ├─ pages/{index,capture,detail,knowledge,reminder}/
│  └─ utils/{api,ocr,format}.js
└─ test/                         # 单元测试(expiry/db/mcp/a2a)

Related MCP server: Medical MCP Server

クイックスタート

1. バックエンド + A2A 起動(デフォルトポート 3000 / 4100 / 4200)

cd happy-medbox
node src/index.js

起動後:

  • 小程序が REST に接続:http://localhost:3000

  • リマインダーエージェント(AgentCard / スキャン発動):http://localhost:4100

  • ユーザーエージェント受信箱:http://localhost:4200

環境変数:API_PORT / REMINDER_PORT / USER_PORT / WARNING_DAYS(デフォルト30) / REMINDER_INTERVAL_MS(デフォルト60000) / MEDBOX_DB(デフォルト data/medbox.db、メモリデータベースは :memory:)。

2. テスト実行(19項目、すべて合格)

node --test

3. MCP サーバーを単独起動(AI アシスタントの stdio 呼び出し用)

node src/mcp-server.js
# 支持 initialize / tools/list / tools/call
# 工具:query_medicines / recognize_medicine_image / compute_expiry /
#       get_medication_advice / add_medicine / list_expiring

4. 小程序を開く

微信开发者工具で miniprogram/ ディレクトリをインポート(appid は既に touristappid に設定されており、ゲストモードで直接プレビュー可能)。 実機デバッグ時は miniprogram/app.js 内の baseUrl をパソコンのローカルネットワーク IP(例:http://192.168.x.x:3000)に変更し、開発者ツールで「正当なドメイン名をチェックしない」にチェックを入れる。

主要フロー説明

  • 撮影認識:capture ページで wx.chooseMedia → POST /api/ocr → 現在は Mock 構造化フィールド(名称/規格/製造日/有効期限)を返却、ユーザーが確認後 POST /api/medicines でデータベースに登録。

  • カウントダウン期限切れ:バックエンド expiry.js が当日のリアルタイム計算で残り日数と状態(safe/warning/expired)を算出;小程序のトップページと詳細ページで表示。

  • 定期スキャン + A2A プッシュ:a2a-server.js のリマインダーエージェントが一定間隔で期限間近の薬をスキャン → reminders テーブルに書き込み、A2A Task にカプセル化 → HTTP でユーザーエージェントの /tasks にプッシュ(エージェント間メッセージ転送)→ 小程序の reminder ページでポーリング表示、既読マーク可能。

  • MCP データインターフェース:AI アシスタントが stdio JSON-RPC 経由で6つのツールを呼び出し、必要に応じて薬品/認識/有効期限計算/服薬アドバイスを検索。

本番環境置き換え推奨(インターフェース契約は変更なし)

  • データベース:node:sqlite → better-sqlite3(より高速、同期)。

  • MCP:src/mcp-server.js の自作 JSON-RPC → 公式 @modelcontextprotocol/sdk。

  • REST:組み込み http → Express/Fastify。

  • OCR:ocr.js の Mock 分岐 → 腾讯云汎用印刷体 OCR または微信 OCR プラグインに接続(キー/資格が必要)。

既知の制限(MVP 範囲)

  • リマインダーチャネルはまず小程序内ポーリング、微信購読メッセージはインターフェースを残す。

  • ナレッジベースは組み込みの少数サンプルのみ、管理画面は後日対応(P2)。

  • アカウントシステムなし、単一家族のローカル識別(P2 でマルチ端末クラウド同期)。

Related MCP Connectors

Related MCP Servers