Technology

実験場だからこそ、
妥協しない。

F1 で試された技術が、時間をかけて市販車に降りてくる。Manta はカルテの実験場です。UI と AI では最先端を試し、医療データを預かる土台は、枯れて堅い技術で固める。その線引きと理由を、全部公開しています。

FastAPI + PostgreSQL 16 ・ React 18 + TypeScript ・ FHIR 対応

8枚の半透明レイヤーが整然と積み上がった抽象アート。1枚だけが明るく光る

Stack

地味でも、枯れていて速い構成。

派手さより、医療データを扱う土台としての堅牢さを優先しました。型と非同期に強く、コードが読めること。それがこのスタックの選定基準です。

領域採用技術
フロントエンドReact 18 ・ TypeScript ・ Vite ・ Tailwind CSS v4 ・ Radix UI ・ Lucide。設計基盤は StyleSeed(Apple HIG skin / ADR 0003
バックエンドPython ・ FastAPI ・ SQLAlchemy 2 ・ Alembic ・ PostgreSQL 16。認証は JWT + Argon2(自前実装、本番でデフォルト鍵なら起動拒否)
相互運用FHIR R4B / JP Core(fhir.resources)・ ORCA 日レセ API アダプタ ・ MCP(計画 / ADR 0007
設計の規律import-linter によるレイヤー機械強制 ・ ADR による意思決定記録 ・ Conventional Commits + DCO
開発・実行Docker Compose ・ uv(Python)・ Biome(JS/TS lint / format)・ GitHub Actions CI

なぜ、Rust ではなく Python か。

個人的に使いたかったのは Rust です。それでも最初は Python にしました。このプロジェクトは、多くの人が入ってくれないと成り立たないからです。コーディングエージェントの時代、臨床医もコードに参加できる。読みやすさは、そのまま入りやすさになります。だからいまは Python で速く、広く作ります。Rust への移行は、いつか作者自身かそのチームが引き受ける計画です。

なぜ、Web か。

Web だから、インストールは要らないし、どの端末でも同じ画面が動く。マルチプラットフォームは勝手についてきます。Java が夢見たマルチプラットフォームの世界を、今度は Web で実現します。フロントエンドが TypeScript なのは、もう選ぶ余地のない決定です。

Architecture

モノレポ + モジュラーモノリス

マイクロサービスにはしません。早すぎる物理分割は MVP を殺すからです。代わりに 8 モジュールの依存方向を「上から下への一方向」に制限し、逆流は CI が検出してビルドを落とします。境界を守るのは、レビュアーの善意ではなく機械です。

依存の向きは上 → 下のみ。下位が上位を import したら import-linter の契約違反として CI が落ちます(契約は backend/pyproject.toml)。必要が実際に来た時点で切り出せる状態を、いまのうちに保証しておくための設計です。

Manta のシステム全体図。ブラウザ(React 18)から REST + JWT で FastAPI のモジュラーモノリスへ。内部に auth、karte / inpatient / rececon、admin / master_data、gateway(FHIR / ORCA / MCP)。データは PostgreSQL 16 が正本で、外部システムへは gateway が変換だけを担う
システム全体図。ブラウザから REST + JWT で FastAPI を呼び、外部連携は gateway に隔離します。正本は PostgreSQL 16 です。

Gateway

FHIR は「データモデル」ではなく、
ゲートウェイ。

FHIR をそのまま DB スキーマにすると、日々の臨床ロジックが FHIR リソースの抽象度に引きずられて重くなります。だから真実の源はドメイン固有の ORM に置き、外部フォーマットは境界の内側に入れません。内側は素直なドメインモデルのまま、外に向けては標準規格で話します。

gateway/fhir

FHIR マッパー

ドメインの ORM と FHIR を、必要なときだけ相互変換します。対応しているのは FHIR の R4B 版と、日本向けプロファイルの JP Core です。現在 9 リソースの読み取りと 5 リソースの書き込みができます(要認証)。

gateway/orca

ORCA アダプタ

日レセ API への変換と送受信、ORCA 固有エラーの正規化を、このアダプタの中に閉じ込めています。カルテやレセコンの本体は ORCA の仕様を知らずに済みます。現状は mock で、実送信はこれからです。

gateway/mcp(計画)

MCP サーバー

AI エージェントのための 3 つめの入口です。システム連携は FHIR、エージェント操作は MCP という役割分担で、カルテの全機能をエージェントからも使えるように開いていきます。

アダプタを足せば、他社レセコンや病院 HIS にも広げられます。ORCA の CLAIM 通信は 2026 年 3 月末で廃止されたため、連携は日レセ API 前提で設計しています(ADR 0004)。

Data Flow

カルテが正本、会計は派生

会計とレセプトは、カルテとオーダと病名から導かれる派生データです。医師の入力 UI を、請求の都合に侵食させないための順番です。

AI は候補を生成するだけで、確定しません。会計送信とレセプト請求の確定は、必ず人間が行います。

奥へ続く、整然と並んだ無数のガラスタイルのアーカイブ壁

Master Data

保険診療の現実から
逃げない

カルテだけなら、もっと早く作れます。Manta があえて重い道を選んでいるのは、日本の保険診療の現実を正面から飲み込むと決めたからです。マスタの取り込みと改定対応は地味で、運用負荷も高い。でも、ここを避けたら現場で会計に流れず、価値が半分になる。

  • MEDIS-DC 標準病名マスター(ICD10 対応)・診療報酬点数表
  • 医薬品マスタ(YJ / HOT コード)・PMDA 電子添文と相互作用
  • レセプトコメントマスタ・施設別ルール DSL

Monorepo

1 リポジトリに、全部あります

フロントもバックも設計文書も、同じ場所で版管理しています。docker compose up 一発で、DB と API と Web が立ち上がります。

manta/
manta/
├─ frontend/      React 18 + Vite + Tailwind v4 + Radix
├─ backend/       FastAPI + SQLAlchemy 2 + Alembic
│   └─ app/modules/
│       ├─ karte/ inpatient/ rececon/
│       ├─ gateway/  fhir / orca / (mcp)
│       └─ auth/ master_data/ admin/ common/
├─ docs/          設計ドキュメント・ADR
└─ compose.yaml   db + api + web を一発起動