fix: MCP更新系ツールにロール権限チェックが無い #40
Labels
No labels
h1-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
joe/o2#40
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
概要
MCP(JSON-RPC
/mcp)経由の更新系ツールにロール権限チェックがありません。POST /mcpはルーターレベルでrequire_readのみであり、dispatch_toolはユーザー/ロールを受け取らず、ツールごとの必要権限を検証していません。問題
src/o2/api/__init__.py:207でmcp_routerに_auth_deps(require_read)が付与src/o2/mcp/tools.pyのdispatch_toolはtenant_idのみ受け取り、_get_current_userやロールを見ないRole.VIEWERのトークンでもcreate_journal/create_product/create_delivery_note/complete_delivery_noteなどの更新系 MCP ツールを実行できる(各ツールは tenant scope のみ検証)影響
対応方針
_get_current_user)を渡し、ツール定義に必要権限(read/write、場合により manage)を持たせるtools/call実行時に、呼び出したユーザーのロールが必要権限を満たすか検証(不足時は JSON-RPC エラー)tools/listなどの参照系は read のまま受け入れ条件
Role.VIEWERが更新系 MCP ツールを呼ぶと権限エラーRole.ACCOUNTANT/ADMINは従来どおり実行可能Role.VIEWERでも成功tests/test_mcp*.pyが緑(権限テストを追加)証拠
src/o2/api/__init__.py:207src/o2/mcp/tools.py(dispatch_tool)関連
対応完了
MCP
tools/callにロール権限検証を追加しました。mainccb5f59にマージ・push 済み。実装
src/o2/mcp/tools.py:TOOL_PERMISSIONSでツール別必要権限を定義(参照系4=read / 更新系4=write)。未定義ツールは安全側でwriteMCPPermissionErrorを追加dispatch_tool(name, arguments, tenant_id, user=None)にuserを追加し、PermissionChecker.checkで検証src/o2/mcp/server.py:mcp_handlerにuser: User = Depends(_get_current_user)を追加しdispatch_tool(..., user=user)へ配線error(日本語メッセージ)で返却権限マップ
list_accounts/get_trial_balance/get_income_statement/get_balance_sheetcreate_journal/create_product/create_delivery_note/complete_delivery_noteテスト
tests/test_mcp_permissions.py: VIEWER の更新系ツール → error、VIEWER の参照系 → 成功、ACCOUNTANT の更新系 → 成功、tools/list/initializeは VIEWER でも成功、未認証 → 401TOOL_MAPとTOOL_PERMISSIONSのキー一致を確認成果物
075342c→ mainccb5f59補足・残課題
src/o2/mcp/__main__.py)は認証コンテキストを持たないローカル実行のためuserなしでdispatch_toolを呼びます(権限チェックはスキップ)。HTTP/mcpは常にuserを渡すため検証されます。stdio を外部公開する場合は別途対応が必要write権限を要求します本 Issue は完了につきクローズします。