`Authorizer.check_team_membership` in `src/rosetta-mcp-server/rosetta_mcp/services/authorizer.py` (lines 68-94) receives `dataset_name` but discards it (` = dataset_name`, line 76). Under `ROSETTA_READ_POLICY=team`, the docstring says access requires membership in the dataset's owner team, but the implementation grants read access if the user is in ANY team visible to the API token with role "owner" — with no correlation to which team actually owns the requested `project-*` dataset.
`tests/test_authorizer.py` only ever exercises a single dataset against a single team, so this per-dataset scoping gap is untested. Effect: under team policy, any team member could read any other team's project dataset. Where: `src/rosetta-mcp-server/rosetta_mcp/services/authorizer.py`.
`Authorizer.check_team_membership` in `src/rosetta-mcp-server/rosetta_mcp/services/authorizer.py` (lines 68-94) receives `dataset_name` but discards it (` = dataset_name`, line 76). Under `ROSETTA_READ_POLICY=team`, the docstring says access requires membership in the dataset's owner team, but the implementation grants read access if the user is in ANY team visible to the API token with role "owner" — with no correlation to which team actually owns the requested `project-*` dataset.
`tests/test_authorizer.py` only ever exercises a single dataset against a single team, so this per-dataset scoping gap is untested. Effect: under team policy, any team member could read any other team's project dataset. Where: `src/rosetta-mcp-server/rosetta_mcp/services/authorizer.py`.