ofw-mcp について
ofw-mcpはClaudeをOurFamilyWizardアカウントに接続し、共同養育に関するメッセージ、カレンダー、費用、日誌を扱います。読み取り・書き込みツールを備え、書き込みモードや確認で操作を制御します。実装は人による監査を受けていないと明記されています。
主な機能
- 01メッセージ、予定、費用、日誌を読み取り
- 02下書き、予定、費用、日誌項目を作成・管理
- 03メッセージをキャッシュし鮮度を報告
- 04メッセージ添付をダウンロードしファイルをアップロード
- 05書き込みモードと確認で操作を制御
活用シーン
- 01最近の共同養育メッセージと未読数を確認
- 02今後の家族カレンダーの予定を確認
- 03費用と返金状況をまとめる
- 04返信を下書きするか日誌を記録
MCP 対応
ofw-mcpは、OurFamilyWizardのアカウント情報と操作をClaudeに公開するMCPサーバーです。読み取りと書き込みでは承認方法が異なり、一部の操作にはサーバー側の確認があります。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y ofw-mcpOFW_USERNAMEYour OurFamilyWizard login email address. Optional — if omitted, the server falls back to the fetchproxy browser extension (requires being signed in to ourfamilywizard.com).OFW_PASSWORDシークレットYour OurFamilyWizard password. Optional — see OFW_USERNAME.OFW_WRITE_MODEWrite-tool gate: "none" registers no write tools; "drafts" registers draft-level writes only (save/delete drafts, upload attachments); "all" registers everything (default). Unrecognized values fail closed to "none".OFW_CALENDAR_WRITESSet to "true" to register calendar write tools (create/update/delete event) in "drafts" write mode. Events have no draft stage but are reversible. Never overrides "none".OFW_ALLOW_MARK_READDefault "true". Set "false" to forbid any tool from marking a message read on OurFamilyWizard - reading a body for the first time stamps a co-parent-visible "First Viewed" time that cannot be undone. A ceiling: no per-call argument can raise it.OFW_FETCH_UNREAD_BODIESDefault "false". Whether ofw_sync_messages fetches unread inbox bodies by default (each fetch stamps a First Viewed time). Capped by OFW_ALLOW_MARK_READ.OFW_READ_DAYSAllow list of days message content may be read, e.g. "mon,thu" (weekdays, YYYY-MM-DD, or YYYY-MM-DD..YYYY-MM-DD, in DISPLAY_TZ). Other days: subjects only, nothing marked read. Unset = every day.OFW_NO_READ_DAYSDeny list of days message content may NOT be read (same format as OFW_READ_DAYS; wins over it). Unset = none.OFW_SESSION_CACHESet to false to disable the on-disk session cache and re-authenticate on every process start. Defaults to enabled.OFW_SESSION_FILEAbsolute path for the session cache file. Defaults to $MCP_DATA_DIR/.ofw-mcp/session.json.OFW_EXPENSE_ONLYSet true to register only healthcheck plus expense tools. All profile/dashboard, message, calendar, and journal tools are structurally absent.OFW_EXPENSE_UPLOAD_ONLYSet true for strict reimbursement upload mode: only healthcheck, ofw_upload_expense_pdf, ofw_create_expense, and ofw_update_expense register. Excludes ofw_mark_expense_reimbursed. Implies OFW_EXPENSE_ONLY.OFW_INLINE_ATTACHMENTSSet "true" to return attachments as MCP content blocks by default (images render directly; other files come back as embedded resources) instead of writing to disk. Callers can still override per call via the tool's `inline` argument.OFW_ATTACHMENTS_DIRWhere ofw_download_attachment writes (default ~/Downloads/ofw-mcp). Every disk write is confined to it: a saveTo outside it (after resolving symlinks) is refused, and an existing file is replaced only with force:true.OFW_UPLOAD_DIRThe only directory ofw_upload_attachment may read from (default: OFW_ATTACHMENTS_DIR). Paths outside it after resolving symlinks, hidden files/dirs, and files over 25 MiB are refused.OFW_CACHE_IDENTITYExplicit cache-key label; overrides OFW_USERNAME for fetchproxy-only multi-account setups. If you have multiple OFW accounts and want them to use separate caches, set it to a label per profile.OFW_CACHE_DIROverrides the message cache directory (default ~/.cache/ofw-mcp).OFW_DISABLE_FETCHPROXYSkip the fetchproxy fallback, so missing credentials become a hard error (useful in headless CI).OFW_AUTO_REFRESHWhen a cached read comes back EMPTY from a non-fresh cache, the read tools sync the backing folders and answer from the refreshed cache instead of refusing with UNVERIFIED_EMPTY (default off, i.e. refuse). Per-call autoRefresh overrides it. A refresh that does not make the read verifiable still refuses.OFW_FRESHNESS_TTL_SECONDSHow long a verified-against-OFW folder stays labelled `fresh` in read tools' `freshness` block (default 300). Unusable values fall back to the default — a typo must never widen the window in which stale data reads as current.OFW_SYNC_MAX_REQUESTSPer-call OFW-request budget for ofw_sync_messages: a positive integer caps how many OFW requests one sync call may make before pausing; the next call resumes where it left off. Unset means unbounded (local installs walk fully in one call).OFW_REQUEST_TIMEOUT_MSPer-request timeout for OFW API calls, in milliseconds (default 30000). Each retry gets its own fresh window.OFW_DEBUG_LOGLog every OFW request/response to stderr (Authorization redacted). Diagnostic only.DISPLAY_TZIANA zone (e.g. America/New_York, the default) for every `<field>Display` value, and the zone a NAIVE source timestamp is assumed to be wall-clock in. OFW's API reports naive local times in the account's own zone, so this must match it. Unrecognized values fall back to the default.FETCHPROXY_WS_PORTLocalhost port of the fetchproxy concentrator the ContextMint Bridge extension connects to (default 37149). Every MCP on one machine shares it, so move it for all of them or not at all.FETCHPROXY_WS_HOSTBind interface for the fetchproxy concentrator, a literal IP only (default 127.0.0.1). Keep on loopback; it exists for hosted deployments that run each MCP in its own network namespace.FETCHPROXY_IDENTITY_DIRAbsolute path where the fetchproxy long-term identity keypair is stored (default ~/.fetchproxy/identity/).ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
28掲載時のツール一覧 · 今日に更新
このツールにパラメーターはありません。
詳細
翻訳後に原文が更新されています。最新の内容は原文をご確認ください。
OurFamilyWizard MCP
Claude を OurFamilyWizard に接続し、共同養育に関するメッセージ、カレンダー、費用、日誌に自然言語でアクセスできるようにする Model Context Protocol サーバーです。
警告
AI が開発したプロジェクトです。 このコードベースはすべて Claude Sonnet 4.6 によって構築され、現在も積極的に保守されています。実装を監査した人間はいません。使用する前に、すべてのコードとツールの権限を確認してください。
できること
Claude に次のような質問ができます。
- 「最近の OFW メッセージを見せて」
- 「来週、子どもたちのカレンダーには何がある?」
- 「最近の費用を一覧にして、私が支払うべき額を教えて」
- 「今日のお迎えについて日誌のエントリーを追加して」
- 「共同養育者からの最後のメッセージへの返信を下書きして」
必要条件
- Claude Desktop
- Node.js 22.5 以降(キャッシュバックエンドとして
node:sqliteを使用) - 有効な OurFamilyWizard アカウント
利用規約への同意
この MCP サーバーを使用することで、以下に同意したものとみなされます。
1. このサーバーは、ご自身の OurFamilyWizard アカウントにアクセスします。 認証にはご自身の認証情報を使用します。共同養育者、お子様、その他の誰かのアカウントにはアクセスしませんし、アクセスすることもできません。
2. OurFamilyWizard の利用規約は、このサーバーの使用にも適用されます。 OFW を直接使用する場合と同様です。スクレイピングを明示的に禁止する条項はありませんが、適用される規定はより広範です。
ユーザーは、意図的に提供されていない手段によって、いかなる資料または情報も取得してはならず、取得を試みてもなりません。
認証情報については、次のように記載されています。「お客様は、(1)割り当てられた認証方法の厳格な機密性を維持すること、(2)割り当てられた認証方法を共有する相手(「承認ユーザー」)に対し、他者にその認証方法を使用させないよう指示することについて、単独で責任を負います。」 OFW は「承認ユーザー」やサードパーティによる連携を想定していますが、アカウント所有者が引き続き責任を負います。
このサーバーのツールを呼び出すたびに、保守担当者が 2026-05-23 に確認したこれらの規約に同意することになります。
3. 個人および家族での使用に限ります。 このプロジェクトは OurFamilyWizard, LLC またはその親会社とは無関係であり、推奨、後援、提携を受けていません。これは、記名されたアカウント所有者のための個人用自動化ツールです。共同養育者の同意なしにその人に代わって使用したり、認証情報を誰かと共有したり、他の家族のデータを一括抽出したりしないでください。
4. OFW は法的記録として扱われるプラットフォームです。 OFW 上のメッセージ、費用、カレンダーのエントリー、日誌のエントリーは、監護権、離婚、育児計画の変更に関する訴訟を含め、法的手続きで提出される可能性があります。このサーバーが OFW に書き込む内容(保存する下書き、作成する予定、記録する費用)は、あなた自身が入力した場合と同じ法的効力を持ちます。ご自身が読み、承認していないメッセージの送信、予定の作成、費用の記録を、この MCP に行わせないでください。 確定する前に、書き込み操作をすべて確認してください。
5. 技術的な結果(アカウントへの警告や停止)と法的な結果(OFW がアカウントの活動について記録する内容)の両方について、全責任を負うことに同意するものとします。 MCP の作成者は弁護士ではありません。係争中の法的問題に関連して OFW を使用している場合は、何かを自動化する前に、実際の担当弁護士に相談してください。
このセクションは、規約について保守担当者が誠意をもってまとめたものです。法的助言ではなく、OurFamilyWizard の実際の利用規約を変更または置き換えるものでもありません。
インストール
1. クローンしてビルド
git clone https://github.com/chrischall/ofw-mcp.git
cd ofw-mcp
npm install
npm run build
2. Claude Desktop に追加
Claude Desktop の設定ファイルを編集します。
- Mac:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
"mcpServers" 内に ofw エントリーを追加します(キーが存在しない場合は作成してください)。
{
"mcpServers": {
"ofw": {
"command": "node",
"args": ["/absolute/path/to/ofw-mcp/dist/index.js"],
"env": {
"OFW_USERNAME": "[email protected]",
"OFW_PASSWORD": "your-ofw-password"
}
}
}
}
/absolute/path/to/ofw-mcp を、リポジトリをクローンした実際のパスに置き換えてください。Mac では、クローンしたディレクトリ内で pwd を実行すると確認できます。
3. Claude Desktop を再起動
完全に終了して(Mac ではウィンドウを閉じるだけでなく、Cmd+Q を押して)再度起動します。
4. 確認
Claude に 「OFW のダッシュボードには何が表示されていますか?」 と尋ねます。未読メッセージ数、今後の予定、未精算の費用が表示されます。
認証
ofw-mcp は、3 つの認証方法を順番に試し、最初に成功した方法を使用します。既存の設定は変更せずに引き続き使用できます。
- 環境変数による認証情報(従来方式、Claude Desktop で推奨)。
OFW_USERNAMEとOFW_PASSWORDを設定すると、サーバーは OFW のフォームエンドポイント経由でログインします。これは上記の Claude Desktop 設定で示した方法です。 - fetchproxy フォールバック(環境変数は不要)。 認証情報がない場合、サーバーは起動時に一度だけ、ContextMint Bridge ブラウザー拡張機能(fetchproxy をベースに構築)を介して、すでにサインイン済みの
ourfamilywizard.comタブからlocalStorage["auth"]を読み取ります。その後、OFW API の呼び出しはすべて Node から直接行われます。リクエスト処理中に拡張機能が介在することはありません。ContextMint Bridge はリリースページからインストールします(Chrome の場合は Chrome 用の zip をダウンロードして解凍し、デベロッパーモードをオンにしてchrome://extensionsでパッケージ化されていない拡張機能を読み込みます。Safari はまだ利用できません。一般公開されていない ContextMint アプリに同梱される予定のため、現時点では Chrome をご利用ください)。一度 OurFamilyWizard にサインインすれば、MCP をそのまま使用できます。ContextMint Bridge は、同じメンテナーが新しい名前で提供する fetchproxy ブラウザー拡張機能です。fetchproxy の README(https://github.com/chrischall/fetchproxy#extension)からも案内されています。ソースは https://github.com/nullnet-app/contextmint-bridge で公開されています。自分でビルドするか、リリース zip を同じ場所に公開されている.sha256ファイルと照合してください(shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256)。複数の OFW アカウントを使い、アカウントごとにキャッシュを分けたい場合は、プロファイルごとに異なるラベルをOFW_CACHE_IDENTITYに設定してください。 - エラー。 どちらの方法も利用できない場合、サーバーは適用すべき修正方法を正確に知らせます。
OFW_DISABLE_FETCHPROXY=1を設定すると、fetchproxy のフォールバックを完全にスキップできます(認証情報がない場合にハードエラーになります。ヘッドレス CI で役立ちます)。
認証情報の設定方法(環境変数方式)
方法 A — Claude Desktop 設定の env ブロック(上記参照、推奨):
"env": {
"OFW_USERNAME": "[email protected]",
"OFW_PASSWORD": "your-ofw-password"
}
方法 B — プロジェクトディレクトリ内の .env ファイル:
cp .env.example .env
# edit .env and fill in your credentials
環境変数は常に .env ファイルより優先されます。コマンドラインから直接渡すこともできます。
[email protected] OFW_PASSWORD=yourpass node dist/index.js
利用可能なツール
読み取り専用のツールは自動的に実行されます。共同親権者または裁判所から閲覧可能な記録に反映される書き込み(以下の Confirm (server))は、送信前にサーバー自身が確認します(サーバー側の確認を参照)。その他の書き込みは、MCP ホスト独自の承認プロンプト(Confirm)を使用します。書き込みモード列には、ツールを利用可能にするために必要な OFW_WRITE_MODE の最小値が示されています。以下の書き込み保護を参照してください。
| ツール | 機能 | 権限 | 書き込みモード |
|---|---|---|---|
ofw_get_profile | あなたのプロフィールと共同親権者の情報 | 自動 | 任意 |
ofw_get_notifications | ダッシュボードの件数(未読メッセージ、近日開催のイベント、未精算の費用)。共同親権者から見える最終確認ステータスが更新されるため、読み取り専用とは見なされません | 確認 | 任意 |
ofw_list_message_folders | 未読件数を含むフォルダー — メッセージを一覧表示する前に、ここでフォルダー ID を取得してください | 自動 | 任意 |
ofw_list_messages | フォルダー内のメッセージ | 自動 | 任意 |
ofw_get_message | 1 件のメッセージの全内容 | 自動 | 任意 |
ofw_sync_messages | メッセージをローカルキャッシュに同期します(開封通知を避けるため、未読メッセージの本文は取得しません) | 自動 | 任意 |
ofw_get_unread_sent | 受信者がまだ読んでいない送信済みメッセージ(ローカルキャッシュから取得) | 自動 | 任意 |
ofw_check_freshness | キャッシュが OFW と一致しているかを確認する、負荷の小さいライブチェックです — 全件同期せず、ID ごとに現在も draft なのか、sent/deleted になったのかを確認します | 自動 | 任意 |
ofw_status | 「現在の状況は?」を確認する 1 回のライブ呼び出し — 検証済みの下書き一覧全体と、各 ID または下書きキーの現在の状態 | 自動 | 任意 |
ofw_download_attachment | メッセージの添付ファイルをディスクにダウンロードするか、抽出したコンテンツ/バイト列としてインラインで取得します | 自動 | 任意 |
ofw_send_message | メッセージを送信します | 確認(サーバー) | all |
ofw_list_drafts | 下書きメッセージ | 自動 | 任意 |
ofw_save_draft | 下書きを作成または更新します | 確認 | drafts |
ofw_delete_draft | 下書きを削除します | 確認 | drafts |
ofw_upload_attachment | アップロードディレクトリ(OFW_UPLOAD_DIR、デフォルトは ~/Downloads/ofw-mcp)からローカルファイルを My Files にアップロードします。ofw_send_message/ofw_save_draft で添付するための fileId を返します。共有(shareClass: SHARED)にはモード all が必要です | 自動(PRIVATE)/確認(サーバー)(SHARED) | drafts |
ofw_list_events | 指定した期間のカレンダーイベント | 自動 | 任意 |
ofw_create_event | カレンダーイベントを作成します | 非公開の場合を除き、確認(サーバー) | all(または drafts + OFW_CALENDAR_WRITES) |
ofw_update_event | カレンダーイベントを更新します | 共有の場合、確認(サーバー) | all(または drafts + OFW_CALENDAR_WRITES) |
ofw_delete_event | カレンダーイベントを削除します | 共有の場合、確認(サーバー) | all(または drafts + OFW_CALENDAR_WRITES) |
ofw_get_expense_totals | 費用の合計概要 | 自動 | 任意 |
ofw_list_expenses | 費用の履歴 | 自動 | 任意 |
ofw_list_expense_categories | 費用カテゴリ ID と分割メタデータ | 自動 | 任意 |
ofw_upload_expense_pdf | 費用の領収書 PDF を My Files にアップロードします(SHARED — 非公開の費用でも、共同親権者はすぐに My Files で確認できます) | 確認(サーバー) | all |
ofw_create_expense | 新しい費用を記録します。非公開の記録と領収書 PDF 1 件に対応しています | 確認(サーバー) | all |
ofw_update_expense | 費用を変更します(例:非公開の費用を公開する)。変更するフィールドのみを渡してください。まず費用を読み込むため、その他の内容は保持されます | 確認(サーバー) | all |
ofw_list_journal_entries | 日誌の記録 | 自動 | 任意 |
ofw_create_journal_entry | 日誌の記録を作成します | 確認 | all |
データの鮮度(OFW_FRESHNESS_TTL_SECONDS)
メッセージと下書きの読み取りにはローカルキャッシュが使われるため、結果が正確そうに見えても、実際には数分から数か月前の情報である可能性があります。また、キャッシュだけでは検出できない変更もあります。OFW のウェブアプリで下書きを編集してもタイムスタンプは更新されないため、サーバーがどちらの状況かを示さない限り、「何も変わっていない」のか「確認していない」のかを区別できません。
そのため、すべての読み取りツール(ofw_list_messages、ofw_list_drafts、ofw_get_message、ofw_list_message_folders、ofw_sync_messages)は、データとともにfreshnessブロックを返します。
"freshness": {
"source": "cache",
"asOf": "2026-07-20T12:40:00.000Z",
"ageSeconds": 5231,
"staleness": "unverified",
"lastServerSyncAt": "2026-07-20T13:59:00.000Z",
"syncComplete": false,
"historyComplete": true,
"warning": "Served from cache last verified 87 min ago; the last sync did not finish checking drafts. Re-read before asserting current state — call ofw_check_freshness for a cheap live confirmation, or ofw_sync_messages to refresh."
}
stalenessがfreshになるのは、その呼び出しでデータをライブ取得した場合、または対象のフォルダーまで実際に到達した同期によって、しきい値以内であることが確認された場合のみです。データがしきい値を超えて古くなった場合や、同期でフォルダーがスキップされた場合はunverifiedに低下し、そのフォルダーが一度も確認されていない場合はstaleになります。fresh以外の場合は必ず、経過時間と理由を示す、人が読めるwarningが付与されます。この判定は意図的に一方向へ慎重にしています。誤ってunverifiedと判定しても、余分な呼び出しが1回必要になるだけですが、誤ってfreshと判定すると、記憶された状態を現在の事実として伝えてしまいます。
下書きにはさらに、アイテムごとのcacheStatus、asOf、**serverConfirmed**が含まれます。serverConfirmedがtrueになるのは、下書きの走査が完了し、しきい値以内で下書きが確認された場合のみです。serverConfirmed: falseは、下書きの存在と未送信状態が記憶されているだけで、確認済みではないことを意味します。ofw_check_freshnessを先に呼び出さずに、現在の事実として述べてはいけません。
ofw_check_freshnessは、再確認を低コストで行う方法です。フォルダーの件数比較に1回、メッセージIDごとに1回リクエストするだけで、本文の取得や全件同期は行いません。前述の理由から、下書きIDはタイムスタンプではなくコンテンツのリビジョンで比較されます。下書き、送信済みメッセージ、または既読の受信トレイメッセージとしてキャッシュされているIDは、何も変更されないため、自由に確認できます。それ以外のIDを確認すると、OurFamilyWizardで未読の受信トレイメッセージが既読になります。これは裁判所から見える記録に対する取り消せない変更であるため、allowMarkRead: trueを渡さない限りスキップされます。
OFW_FRESHNESS_TTL_SECONDSを設定すると、しきい値を調整できます(デフォルトは300、つまり5分です)。使用できない値が指定された場合、期間が広がらないよう、デフォルト値に戻ります。
それは今も想定どおりの状態ですか?(ofw_status)
鮮度が答えるのは、このデータがどれくらい古いかです。このエンティティが今も想定どおりの状態かには答えません。これは別の問題です。送信済みの下書きもサーバーには存在するため、最も重要なケースで「このIDは存在するか」と尋ねても、trueが返ってきます。
ステータスの概要を示す際は、ofw_statusの呼び出しを基準にしてください。
{
"checkedAt": "2026-07-28T09:12:00.000Z",
"requested": [
{ "id": 538279699, "state": "sent", "sentAt": "2026-07-27T23:31:09", "inSync": false },
{ "id": 538086428, "state": "draft", "inSync": true }
],
"complete": true
}
stateは、OFWからライブで取得したdraft、sent、received、deleted、またはunknownです。unknownは、問いに答えられなかったことを意味し、「問題なし」の同義語ではありません。- 引数を指定しない場合、OFWとの照合を先に行ったうえで、下書きの全件を返します。
complete: trueは、スナップショットのすべての部分がライブで確認されたことを意味します。falseの場合は、incompleteReasonsに未確認の内容が示されます。このペイロードを件数の根拠として使用することはできません。
下書きキー。 下書きを編集するたびに、新しいOFW IDが発行されます(OFWのインプレース更新エンドポイントは何もせずに終了するため、ofw_save_draftは作成してから削除する方式で置き換えます)。そのため、ofw_save_draftは、すべての編集を通じて変わらず、メッセージが「送信済み」に移っても引き継がれるdraftKeyも返します。ofw_status(draftKeys: ["dk_…"])を使うと、現在のIDと状態に解決できます。これにはsentMessageIdを伴うstate: "sent"も含まれるため、「作業中だった下書きはどうなったか」を、現在のIDを推測せずに1回の呼び出しで確認できます。
古いキャッシュから不在と判断することはありません
キャッシュからの読み取り結果が空の場合、検証済みの「該当なし」と同じ形で返されます。そのため、ofw_list_messages、ofw_list_drafts、ofw_get_unread_sent は、結果が空で、かつバックエンドのキャッシュがfreshでない場合、回答せずに拒否します。
{
"result": "UNVERIFIED_EMPTY",
"reason": "No drafts were found, but the backing cache is \"unverified\" — it was last verified 207 min ago. Refusing to report absence from unverified data…",
"remedy": "Call ofw_sync_messages(folders:[\"drafts\"]) and retry, re-call with autoRefresh:true, or use ofw_status(includeDraftInventory:true) for a single live answer.",
"complete": false
}
誤った否定(「いいえ、それは一度も送信されていません」)は、確定的な回答のように受け取られるため、拒否するよりも危険です。空でない結果は、決して保留されません。古いキャッシュで何かが見つかった場合は、その古さを従来どおり示したうえで、存在する証拠として返されます。拒否せずにツールに同期させて回答させるには、autoRefresh: trueを渡すか、OFW_AUTO_REFRESH=trueを設定してください。更新後も読み取りを検証できない場合は、やはり拒否されます。
すべてのリスト読み取りには、結果セットを示す明示的なブール値completeも含まれます。これは「asOf時点でOurFamilyWizard上にある、条件に一致するすべての項目」を意味します。completeがfalseの場合は、不足している項目を示すcompleteNoteが付与されます。件数を伝える前に確認してください。
サーバー側の確認(MCP_CONFIRM_MODE)
上記で**確認(サーバー)**と表示されている書き込み(メッセージの送信、経費の記録、共有カレンダーイベントの作成・更新・削除、SHAREDとしてのファイルのアップロード)は、ホストに委ねず、このサーバーで確認されます。確認プロンプトを表示できるクライアント(Claude Code)では、MCP_CONFIRM_ELICITATION=offでない限り、実行内容を正確に示すプレビュー付きの確認プロンプトが表示されます。表示できないクライアント(claude.ai、Claude Desktop)では、2段階の手順になります。最初の呼び出しでは何も書き込まず、プレビューとconfirmTokenを返します。同じ引数とそのトークンを使って再度呼び出した場合にのみ、処理が進みます。
プレビューには、承認対象の内容が示されます。宛先の名前、件名と本文全体、返信先、添付ファイル名、経費の金額と説明、イベントのタイトル、日付、時刻、公開範囲、および(更新の場合)変更前と変更後の内容です。トークンはこれらの内容に厳密に紐付けられます。本文、金額、宛先が異なる場合は拒否されます。また、プレビュー後にOurFamilyWizard上で下書きやイベントが変更された場合(たとえば、共同養育者がイベントを編集した場合)も、force: trueであっても拒否されます。トークンは一度だけ使用でき、有効期限があります。
| 変数 | デフォルト | |
|---|---|---|
MCP_CONFIRM_MODE | ask-user | 確認プロンプトを表示できないクライアントで、確認が必要な書き込みをどのように処理するかを指定します。ask-user:2段階で処理し、トークンを使う前にチャットでモデルに承認を与える必要があります。auto:2段階で処理しますが、モデルはプレビューを確認した後にトークンを使えます。refuse:そのような書き込みは拒否されます(ourfamilywizard.comで実行してください)。認識されない値はrefuseとして扱われます。 |
MCP_CONFIRM_ELICITATION | on | offにすると確認プロンプトは表示されず、すべてのクライアントでMCP_CONFIRM_MODEの手順が使われます。プロンプトに対応していると称しながら表示しないクライアントで設定してください(確認が必要な書き込みが停止します — opencode 2.0.x)。それ以外の値ではonのままとなり、stderrに警告が出力されます。 |
MCP_CONFIRM_TTL_SECONDS | 600 | トークンの有効期間です。 |
MCP_CONFIRM_SECRET | プロセスごとにランダム | 署名キーです。サーバー再起動後もトークンを有効にする必要がある場合に限り設定してください。mcp-hostでは、ホストが子プロセスごとの安定したキー(MCP_HOST_CONFIRM_SECRET)を提供し、使用済みトークンはMCP_DATA_DIRに記録されるため、アイドル状態からの再起動後も承認が保持されます。 |
共同養育者に表示されない非公開イベントとPRIVATEアップロードには、確認は必要ありません。以下のOFW_WRITE_MODEは、引き続きその下位の構造的な制御層として機能します。書き込みモードで除外されているツールは、そもそも存在しません。
タイムアウトした書き込みは、失敗した書き込みとは限りません。 ofw_send_message、ofw_create_expense、ofw_create_event、ofw_create_journal_entryが接続を失うか、OFWから確定的な回答を得られないままタイムアウトした場合、結果はSEND_UNCONFIRMED/EXPENSE_UNCONFIRMED/EVENT_UNCONFIRMED/JOURNAL_UNCONFIRMEDになります。書き込みが反映されている可能性があります。再試行する前に、対応するリストツールまたはourfamilywizard.comで確認してください。そうしないと、共同養育者に二重で表示される可能性があります。
書き込み保護(OFW_WRITE_MODE)
上記のホストの「確認」権限は、MCP ホストへのヒントにすぎません。ツールを自動承認するよう設定されたホストや、一度「常に許可」をクリックしたユーザーの場合、モデルの出力と送信メッセージの間には何の障壁もありません。OurFamilyWizard は裁判記録となるプラットフォームであるため、このサーバーは構造的な制限もサポートしています。サーバーの env ブロックで OFW_WRITE_MODE を設定すると、選択したレベルを超えるツールは登録されません。そのため、ホストの設定やプロンプトに挿入された指示によって、それらのツールが呼び出されることはありません。
OFW_WRITE_MODE | 利用できる機能 |
|---|---|
none | 読み取り/同期/検索のみです。書き込みツールはありません。 |
drafts | 下書きレベルの書き込み機能が追加されます:ofw_save_draft、ofw_delete_draft、ofw_upload_attachment(PRIVATE のみ)。裁判記録として表示される内容には反映されません。AI が準備し、OFW のウェブ UI にサインインした人間だけが送信できます。 |
all | すべて(デフォルト — 完全な後方互換性があります)。 |
認識されない値は警告を stderr に出力して none に制限されるため、入力ミスによって書き込みアクセスが暗黙に許可されることはありません。
経費専用のデプロイ
経費の払い戻し専用の連携では、無関係な OFW 機能を構造的に取り除くこともできます。
| 設定 | 登録される機能 |
|---|---|
OFW_EXPENSE_ONLY=true | ofw_healthcheck と経費ツールのみです。プロフィール/ダッシュボード、メッセージ、カレンダー、日誌のツールはありません。 |
OFW_EXPENSE_UPLOAD_ONLY=true | 最も厳格なモードです。ofw_healthcheck、ofw_upload_expense_pdf、ofw_create_expense、ofw_update_expense のみです。経費の合計と一覧表示も取り除かれます。このフラグは OFW_EXPENSE_ONLY を暗黙に有効にします。 |
これらのフラグは登録時の制限であり、プロンプトの指示ではありません。ホストは、登録されていないツールを呼び出せません。認識されない空でないフラグ値は、制限された状態に制限されます。OFW_WRITE_MODE は引き続き適用されます。厳格なアップロードのワークフローで経費の作成を利用できるようにするには、OFW_WRITE_MODE=all を設定してください。
経費払い戻し専用のデプロイで推奨される設定:
OFW_EXPENSE_UPLOAD_ONLY=true
OFW_WRITE_MODE=all
OFW_ALLOW_MARK_READ=false
読み取りも書き込みです(OFW_ALLOW_MARK_READ)
メッセージ本文を初めて取得すると、OurFamilyWizard 上で既読になり、共同養育者が確認できる**「初回閲覧」タイムスタンプが記録されます**。これは記録の一部であり、取り消せません。また、通常の読み取りに伴う副作用として発生するため、OFW_WRITE_MODE では制御されません。
デフォルトでは何も変わりません。読み取りはこれまでとまったく同じように動作します。必要に応じて、次の2つの制御を利用できます。
| 設定 | 効果 |
|---|---|
ofw_get_message(allowMarkRead: false) | 未読の受信トレイメッセージにタイムスタンプが記録される取得を拒否し、代わりに構造化された MARK_READ_BLOCKED ペイロードを返します。キャッシュ済みの本文、送信済みメッセージ、すでに既読のメッセージは、引き続き通常どおり返されます。これらによってタイムスタンプが記録されることはありません。 |
OFW_ALLOW_MARK_READ=false | デプロイ全体に適用される上限です。どのツールもタイムスタンプを記録できません。ofw_get_message は取得を拒否し、ofw_check_freshness/ofw_status は allowMarkRead:true を無視し、ofw_sync_messages は fetchUnreadBodies:true を無視します。呼び出しごとの引数でこの制限を緩めることはできません。 |
OFW_FETCH_UNREAD_BODIES=true を設定すると、ofw_sync_messages はデフォルトで未読の本文を取得するようになります(設定しない場合はオフ)。開封確認が日常的に使われる環境で便利です。この設定は OFW_ALLOW_MARK_READ による制限を受けます。
カレンダーへの書き込みを個別に許可する(OFW_CALENDAR_WRITES)
カレンダーのイベントは、メッセージの2つの段階の中間に位置します。下書きの段階はなく(イベントを作成すると共有記録にすぐ表示されます)が、送信済みメッセージとは異なり、後から編集または削除できます。drafts モードで実行していて、カレンダーへの直接の書き込みを許可する場合は、OFW_CALENDAR_WRITES=true を設定すると、ofw_create_event、ofw_update_event、ofw_delete_event も登録されます。このフラグは all モードでは不要であり、none モードを上書きすることはありません。
Egress allowlist
OFW トークンまたはログイン情報を含むすべてのリクエストは、fetch の前に、構築された URL のホストチェックを通過します。サーバーは、ofw.ourfamilywizard.com 以外のホストへの送信を拒否します。現在は常にチェックに合格しますが、それが目的です。「認証情報は OFW にしか送信されない」ことを、コードレビュー上の約束ではなく構造上の不変条件にします。これにより、後のリファクタリングや侵害された依存関係によってリクエストが別の場所に向けられた場合、ベアラートークンやメッセージを外部に送信する代わりにエラーになります。これは構築した URL に対する事前チェックであり、リダイレクトを追跡する送信先フィルターではありません。
サーバーが接続するもう 1 つのホストは *.oaiusercontent.com で、ofw_upload_expense_pdf の url モードでのみ使用します。このモードでは、OFW の認証情報を付けずに、署名付きファイル URL から領収書 PDF をダウンロードし、各リダイレクトのたびに同じサフィックスに対するチェックを再実行して、サイズを制限し、有効な PDF であることを確認します。ホスト型登録の送信先許可リスト(mint.yaml)には、この 2 つのホストだけが記載されています。
トラブルシューティング
「0 messages」 — Claude は実際のメッセージではなく、通知の件数を読み取った可能性があります。「OFW の受信トレイにあるメッセージを一覧表示して」または「ofw_list_message_folders のあとに ofw_list_messages を使って」と明示的に依頼してください。
「OFW auth: set OFW_USERNAME + OFW_PASSWORD, or install ContextMint Bridge…」 — どちらの認証方法も設定されていません。Claude Desktop の設定にある env ブロックを入力するか、ContextMint Bridge をインストールして、ブラウザーで ourfamilywizard.com にサインインしてください。
「fetchproxy fallback failed」 / 「ContextMint Bridge is down」 — 環境変数による方法が設定されておらず、拡張機能にも接続できませんでした。ContextMint Bridge がインストールされ、OFW にサインイン済みで、実行中であることを確認してください(拡張機能のポップアップを開きます)。フォールバックを完全に無効にするには、OFW_DISABLE_FETCHPROXY=1 を設定してください。
「OFW login not attempted — this OurFamilyWizard email and password were already rejected」 — このセッションで、OFW によってこれらの認証情報がすでに拒否されています。OFW はサインインの失敗回数をアカウントごとに記録するため、サーバーは拒否されたパスワードを呼び出しのたびに再送信しません。OFW_USERNAME / OFW_PASSWORD を現在のログイン情報に更新する(またはサーバーを再起動する)と、もう一度試せます。
403 Forbidden — 認証情報が間違っています。ofw.ourfamilywizard.com でユーザー名とパスワードを確認してください。
Claude にツールが表示されない — Claude Desktop → Settings → Developer を開き、接続済みのサーバーとエラー出力を確認してください。設定を編集した後は、アプリを完全に終了して再起動したことを確認してください。
Mac で設定ファイルが見つからない — Finder で Cmd+Shift+G を押して、~/Library/Application Support/Claude/ を貼り付けてください。
セキュリティ
- 認証情報は、ローカルの設定ファイルまたは
.env内にのみ保存されます - 認証情報は環境変数としてサーバーに渡され、ログに記録されることはありません
- サーバーはウェブアプリと同じログインフローを使って OFW で認証します
- 強力で固有の OFW パスワードを使用してください
- OFW の認証情報を含むリクエストの送信先は
ofw.ourfamilywizard.comに制限されています。接続するもう 1 つのホストは、ofw_upload_expense_pdfのurlモードにおける領収書ダウンロード用ホストのみです(Egress allowlist を参照)
ローカルデータと削除方法
サーバーは共同養育に関するデータをこのマシンに保存します。読み取り可能なのは、あなたのユーザーアカウントのみです。
| 内容 | 保存場所 | 権限 |
|---|---|---|
| メッセージキャッシュ(メッセージ本文、宛先、下書き、添付ファイルの記録) | ~/.cache/ofw-mcp/<hash>.db(および -wal/-shm)、または OFW_CACHE_DIR | ディレクトリ 0700、ファイル 0600 |
| ダウンロードした添付ファイル | ~/Downloads/ofw-mcp/、または OFW_ATTACHMENTS_DIR | サーバーが作成するディレクトリは 0700、ファイルは 0600 |
| セッショントークン | $MCP_DATA_DIR/.ofw-mcp/session.json、または OFW_SESSION_FILE | 0600 |
キャッシュは、削除するまで同期したすべてのデータを保持します。データの有効期限はありません。不要になったとき(アカウントを閉鎖したとき、案件が終了したとき、またはマシンを譲渡するとき)は、MCP ホストを終了して削除してください。
rm -rf ~/.cache/ofw-mcp # or your OFW_CACHE_DIR
rm -rf ~/Downloads/ofw-mcp # or your OFW_ATTACHMENTS_DIR
rm -f ~/.ofw-mcp/session.json # or your OFW_SESSION_FILE
次回の起動時に、ofw_sync_messages によって OurFamilyWizard からキャッシュが再構築されます。自分で OFW_ATTACHMENTS_DIR に指定したディレクトリは、そのディレクトリ独自の権限を維持します(意図的に共有されている場合があります)。権限が制限されるのは、サーバーが作成するものと、既定の ~/Downloads/ofw-mcp のみです。
ホスト型コネクター(mcp-host)では、同じデータはマシン上ではなく、登録用の永続データディレクトリに保存されます。メッセージキャッシュは $HOME/.cache/ofw-mcp/、セッショントークンは $MCP_DATA_DIR/.ofw-mcp/session.json、ブラウザーブリッジの ID は $HOME/.fetchproxy/identity/、使用済みの確認トークン nonce は $MCP_DATA_DIR/.mcp-confirm/ に保存されます。ダウンロードはインラインで返され、ディスクには書き込まれません。上記のコマンドではこのデータにアクセスできません。このディレクトリが保持される期間や、接続の解除または登録の削除によって削除されるかどうかは、このサーバーではなくホストのデータ保持ポリシーによって決まります。
開発
npm test # tsc typecheck, then the vitest suite
npm run build # tsc → dist/, then esbuild bundle → dist/bundle.js
npm run dev # node --env-file=.env dist/index.js (requires built dist)
Main ブランチは保護されています。変更はすべて PR 経由で取り込みます。gh pr create --label <release-notes-label> で PR を作成し、自動レビューのフィードバックに納得したら ready-to-merge を追加してください。PR とリリースの全手順については CLAUDE.md を参照してください。
プロジェクト構成
src/
index.ts MCP server entry (McpServer + StdioServerTransport)
client.ts OFW HTTP client with Bearer token + 401/429 retry
auth.ts resolveAuth(): env-var creds → fetchproxy → error
auth-password.ts Spring Security form login (legacy env-var path)
cache.ts SQLite cache (messages, drafts, attachments, sync state)
sync.ts Folder ID resolution + per-folder sync logic
config.ts Cache dir, attachment dir, env parsing
tools/
_shared.ts Recipient mapping, response helpers, path expansion
user.ts ofw_get_profile, ofw_get_notifications
messages.ts Folders, list, get, send, drafts, sync, attachments
calendar.ts List, create, update, delete events
expenses.ts Totals, list, create
journal.ts List, create entries
tests/ Mirrors src/; mocks OFWClient.request via vi.spyOn
認証フロー
認証の解決処理は src/auth.ts にあります。優先順位に従って、次の 3 つの方法があります。
- 環境変数が設定されている場合 →
src/auth-password.tsが従来の OFW Spring Security フォームログインを実行します。GET /ofw/login.form— セッション Cookie を確立しますPOST /ofw/login— 認証情報を送信し、{ auth: "<token>" }を返します
- 環境変数が設定されていない場合(かつ
OFW_DISABLE_FETCHPROXYが未設定の場合) →@fetchproxy/bootstrapが、ユーザーのサインイン済みourfamilywizard.comタブからlocalStorage["auth"]とlocalStorage["tokenExpiry"]を一度読み取り、ブリッジを閉じます。 - 何も設定されていない場合 → 解決方法を両方明示してエラーをスローします。
どちらの方法でも OFWClient に Bearer トークンが返され、以降は Node から Authorization: Bearer <token> を使って処理します。fetchproxy はリクエストのホットパスでは使用されません。401 が返された場合、クライアントは認証を再解決し、一度だけリクエストを再実行します。トークンは、環境変数を使う方法では 6 時間、fetchproxy を使う方法では tokenExpiry までキャッシュされます。
拡張機能のインストール方法については、fetchproxy の README も参照してください。
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。