O que faz
agent-access-review é uma ferramenta de linha de comando de código aberto, publicada sob licença MIT pelo usuário do GitHub Mihirajmera, que aplica o processo de revisão de acesso de usuários a agentes de IA. Ela inventaria todos os agentes e servidores MCP que uma organização executa, determina o que cada um pode ler, escrever, executar e enviar, testa esse acesso contra um catálogo de controles e produz o pacote que um auditor espera: uma folha de aprovação do revisor, evidências com hash e resultados de avaliação OSCAL mapeados para NIST 800-53, SOC 2, o NIST AI Risk Management Framework e o OWASP Top 10 for LLM Applications.
O autor a resume como a revisão trimestral de "quem tem acesso a quê" que as empresas já fazem para funcionários, aplicada a agentes de IA. Como estudo de caso real, o projeto relata o que resulta de copiar as configurações MCP mostradas em READMEs oficiais: 8 de 9 pacotes sem versão fixada, 7 de 9 com acesso de escrita, envio ou execução não revisado, e um caminho de exfiltração quando as permissões são combinadas.
Início rápido
A ferramenta exige Python 3.11 ou superior. Não precisa de conta em nuvem, chaves de API nem acesso à rede.
pip install agent-access-review
agent-access-review demo
A demo revisa cinco agentes de exemplo e grava o pacote em review-demo/; o relatório é review-demo/access-review.md, e um relatório de exemplo também está no repositório.

Para revisar uma configuração real, aponte a varredura para um arquivo de configuração:
| Ferramenta | Onde fica sua configuração MCP | Comando |
|---|---|---|
| Claude Desktop (macOS) | ~/Library/Application Support/Claude/claude_desktop_config.json | agent-access-review scan ~/Library/Application\ Support/Claude/claude_desktop_config.json |
| Claude Desktop (Windows) | %APPDATA%\Claude\claude_desktop_config.json | PowerShell: agent-access-review scan "$env:APPDATA\Claude\claude_desktop_config.json" |
| Cursor | ~/.cursor/mcp.json (global) ou .cursor/mcp.json (projeto) | agent-access-review scan ~/.cursor/mcp.json |
| VS Code | .vscode/mcp.json em um projeto | agent-access-review scan .vscode/mcp.json |
| Agentes próprios | um agents.yaml mantido pelo usuário | agent-access-review scan agents.yaml |
Os segredos encontrados nas configurações são mascarados antes de qualquer gravação, de modo que a saída pode ser compartilhada com segurança.
Termos-chave
- Agente de IA: um modelo de IA capaz de realizar ações por meio de ferramentas: ler arquivos, consultar bancos de dados, enviar e-mail ou executar comandos.
- MCP (Model Context Protocol): a forma padrão pela qual aplicações como Claude Desktop, Cursor e VS Code conectam ferramentas a uma IA. Cada servidor MCP em uma configuração é uma ferramenta que o agente pode usar.
- Revisão de acesso de usuários (UAR): a verificação periódica em que o acesso de cada pessoa é listado, um responsável confirma que ele ainda é necessário e o restante é revogado; auditores a testam sob SOX e SOC 2.
- ITGC: IT General Controls, os controles básicos (acesso, gestão de mudanças, operações) que os auditores testam para relatórios financeiros.
- Identidade não humana: uma conta usada por software, e não por uma pessoa: contas de serviço, chaves de API e agora agentes de IA.
- Caminho de exfiltração: uma rota para os dados saírem da organização; aqui, um agente que pode ler dados sensíveis, lê conteúdo que um atacante pode escrever e pode enviar dados para fora.
- Injeção de prompt: esconder instruções em conteúdo que uma IA lê (um e-mail, página web ou ticket) para que ela faça algo que o usuário nunca pediu.
- OSCAL: o formato legível por máquina do NIST para controles de segurança e resultados de avaliação, que permite a ferramentas de GRC importar achados automaticamente.
O problema
Todo programa SOX e SOC 2 executa revisões trimestrais de acesso de usuários: listar quem tem acesso a quê, fazer um responsável confirmar que o acesso ainda é necessário, revogar o restante e guardar as evidências. Os agentes de IA agora detêm o mesmo tipo de acesso (tokens de API, conexões de banco de dados, acesso a shell, caixas de e-mail) e quase ninguém os revisa. O README lista quatro lacunas:
- Sem responsável, sem aprovação. Um desenvolvedor adiciona um servidor MCP à sua configuração do Claude Desktop ou do Cursor e o agente passa a ter imediatamente o token do GitHub e o diretório pessoal dessa pessoa: sem ticket, sem aprovador, e isso nunca aparece em uma revisão de acesso.
- Amplo demais por padrão. Os guias de instalação orientam conceder o diretório pessoal inteiro, o escopo de repositório com controle total ou permissões *.All do Microsoft Graph para todo o tenant.
- Segredos em texto claro. Configurações MCP costumam conter tokens brutos e senhas de banco de dados.
- Um novo caminho de ataque. Um agente que pode ler dados sensíveis, lê conteúdo escrito por um atacante (uma issue do GitHub, um e-mail, uma página web) e pode enviar dados para fora pode ser induzido por injeção de prompt a vazar esses dados; nenhum controle de acesso tradicional examina essa combinação.
A premissa do autor é que agentes são identidades não humanas: precisam dos mesmos controles de joiner/mover/leaver e recertificação que as pessoas, mais alguns específicos de IA.
O catálogo de controles
O texto de apresentação descreve a revisão como um teste de acesso contra 12 controles, enquanto o próprio catálogo e a arquitetura da ferramenta listam 14 verificações, numeradas de AAR-01 a AAR-14:
| ID | Controle | Severidade | Frameworks |
|---|---|---|---|
| AAR-01 | Todo agente tem um responsável humano designado | high | NIST 800-53 AC-2 · SOC 2 CC6.2 · AI RMF GOVERN 2.1 |
| AAR-02 | O acesso é aprovado e recertificado em até 90 dias | high / medium | AC-2 · CC6.2, CC6.3 |
| AAR-03 | Ações privilegiadas (escrita, exclusão, envio) exigem aprovação humana | high / medium | AC-6 · CC6.3 · AI RMF MAP 3.5 · OWASP LLM06 |
| AAR-04 | Menor privilégio: sem diretórios pessoais, curingas nem escopos de administrador ou de todo o tenant | high | AC-6 · CC6.3 · LLM06 |
| AAR-05 | Execução de código e shell em sandbox | high | CM-7, AC-6 · LLM05, LLM06 |
| AAR-06 | Sem credenciais embutidas no código | high | IA-5 · CC6.1 |
| AAR-07 | Credenciais rotacionadas em até 90 dias | medium / low | IA-5 · CC6.1 |
| AAR-08 | Acesso inativo removido após 90 dias | medium / low | AC-2(3) · CC6.2 |
| AAR-09 | Sem caminho de exfiltração (dados sensíveis + entrada não confiável + saída, sem barreira humana) | high | AC-4 · AI RMF MEASURE 2.7 · LLM01, LLM02 |
| AAR-10 | Pacotes de ferramentas fixados em uma versão ou digest de imagem | medium | SR-3 · LLM03 |
| AAR-11 | Servidores MCP remotos usam HTTPS | high | SC-8 · CC6.7 |
| AAR-12 | As capacidades de cada ferramenta estão inventariadas | medium | CM-8 · AI RMF GOVERN 1.6 |
| AAR-13 | Sem servidores MCP obsoletos ou arquivados (indica a substituição mantida) | high | SA-22, SI-2 · CC7.1 · LLM03 |
| AAR-14 | Sem versões de servidores MCP com vulnerabilidades conhecidas nem pacotes publicados como malware (a partir de um snapshot do OSV) | high / medium / low | RA-5, SI-2 · CC7.1 · LLM03 |
Cada controle é definido uma única vez em controls.yaml e relacionado a todos os frameworks, de modo que um único teste produz evidências para todos eles. O autor afirma que os mapeamentos para os frameworks são de seu próprio julgamento e devem ser verificados contra os crosswalks oficiais antes de serem usados em uma auditoria real.
Caminhos de exfiltração: o risco específico de IA (AAR-09)
As revisões de acesso tradicionais examinam uma permissão por vez. Nos agentes de IA, o perigo está em uma combinação: um agente que pode ler dados sensíveis, lê conteúdo escrito por alguém de fora e pode enviar dados para fora. Cada trecho é inofensivo sozinho; juntos, uma única injeção de prompt escondida em um e-mail, ticket, issue ou página web pode instruir o agente a vazar os dados. Uma etapa de aprovação humana em qualquer trecho quebra a cadeia.
O README ilustra isso com dois agentes de exemplo. O finance-ops-agent é sinalizado: qualquer pessoa pode escrever para sua caixa de contas a pagar (entrada não confiável), ele lê faturas de fornecedores restritas no NetSuite e pode enviar e-mail para qualquer destinatário sem aprovação humana. O support-copilot passa: lê tickets de clientes e histórico confidencial de tickets, mas um humano aprova cada resposta redigida antes do envio ao cliente.
O AAR-09 é mapeado para OWASP LLM01 (injeção de prompt) e LLM02 (divulgação de informações sensíveis), NIST 800-53 AC-4 (aplicação do fluxo de informações) e NIST AI RMF MEASURE 2.7 (segurança e resiliência de IA).
Como funciona
- Descobrir. Aponte para arquivos ou pastas. A ferramenta lê dois formatos: configurações MCP (Claude Desktop, Cursor, VS Code .vscode/mcp.json), cobrindo servidores locais npx, uvx ou docker e servidores HTTP remotos (essas configurações não trazem responsável nem aprovação, o que segundo o autor é exatamente por que são o problema da IA invisível), e manifestos de agentes (agents.yaml), um registro governado para agentes LangChain, CrewAI ou personalizados com responsável, aprovação, ferramentas, escopos, credenciais e datas de último uso.
- Classificar. Uma configuração MCP diz qual servidor roda, não o que ele pode fazer; o catálogo de capacidades transforma o nome de um servidor em uma permissão: ações, classificação de dados, se ingere conteúdo não confiável e se pode enviar dados para fora. Servidores desconhecidos são sinalizados sob o AAR-12 e nunca presumidos seguros.
- Mascarar e depois aplicar hash. Os segredos são mascarados durante a análise, antes de qualquer armazenamento, de modo que as evidências possam ser compartilhadas com auditores. O inventário de cada agente e seu registro de origem mascarado recebem hash SHA-256 sobre JSON canônico, tornando detectável qualquer edição posterior das evidências.
- Revisar. Cada permissão de ferramenta recebe uma decisão recomendada (Keep, Modify, Revoke ou Investigate) mais uma coluna vazia para o revisor, no mesmo formato de uma planilha de revisão de acesso de usuários.
- Exportar. A ferramenta emite resultados de avaliação OSCAL 1.1.2: uma observação por agente apontando para seu arquivo de evidência e hash, e um achado por objetivo de controle do NIST 800-53.
O ciclo de revisão espelha a revisão trimestral de acesso de usuários que os auditores de SOX e SOC 2 já testam para pessoas: descobrir configurações e manifestos, classificar pelo catálogo de capacidades, testar os controles, deixar cada responsável revisar cada permissão de ferramenta, guardar as evidências com hash e a saída OSCAL para permissões marcadas como Keep, abrir um ticket de remediação e repetir a varredura em caso de Modify ou Revoke, e recertificar a cada 90 dias.
| Revisão de acesso de usuários (pessoas) | Revisão de acesso de agentes (esta ferramenta) |
|---|---|
| Uma fonte de RH lista cada funcionário | Configurações e manifestos listam cada agente e servidor MCP |
| O gerente confirma cada direito | O responsável do agente marca cada permissão como Keep / Modify / Revoke |
| Usuários desligados são removidos | Agentes sem responsável são sinalizados (AAR-01) e ferramentas sem uso são revogadas (AAR-08) |
| Acesso privilegiado recebe escrutínio extra | Acesso de escrita, envio, exclusão e shell exige barreira humana (AAR-03, AAR-05) |
| Capturas de tela e planilhas como evidência | Evidências em JSON com hash e saída OSCAL |
Execução de exemplo
Os exemplos incluídos são a configuração do Claude Desktop de um desenvolvedor, uma configuração MCP do VS Code e três agentes governados; a saída completa está em sample-output/: o pacote do revisor, a folha de decisões, as evidências com hash e o OSCAL. Executar a demo produz:
$ agent-access-review demo
AGENT TOOLS HIGH MED LOW
support-copilot 2 0 0 0
finance-ops-agent 4 4 3 0
devops-agent 2 6 1 1
claude-desktop-config 6 12 5 1
vscode-mcp 3 6 2 3
5 agents · 17 tool grants · 44 findings
Por severidade, os achados se dividem em 28 high, 11 medium e 5 low. Os controles que mais falham entre os cinco agentes:
| Controle | Agentes reprovados |
|---|---|
| AAR-02 · Aprovado e recertificado em 90 dias | 4 / 5 |
| AAR-03 · Aprovação humana para ações privilegiadas | 4 / 5 |
| AAR-08 · Acesso inativo removido | 4 / 5 |
| AAR-01 · Responsável designado | 3 / 5 |
| AAR-04 · Menor privilégio | 3 / 5 |
| AAR-09 · Sem caminho de exfiltração | 3 / 5 |
| AAR-05, 06, 07, 10, 12 | 2 / 5 cada |
| AAR-11, 13, 14 | 1 / 5 cada |

Um trecho do pacote do revisor para o finance-ops-agent:
| Ferramenta | Ações | Dados | Recomendado | Decisão do revisor |
|---|---|---|---|---|
| netsuite | read, write | restricted | Modify | ☐ Keep ☐ Modify ☐ Revoke |
| outlook | read, send | confidential | Modify | ☐ Keep ☐ Modify ☐ Revoke |
| sharepoint | read | confidential | Modify | ☐ Keep ☐ Modify ☐ Revoke |
| expense-ocr | read | confidential | Revoke | ☐ Keep ☐ Modify ☐ Revoke |
| Controle | Severidade | Achado |
|---|---|---|
| AAR-09 | high | Caminho de exfiltração: lê dados sensíveis, ingere conteúdo não confiável (outlook) e pode enviar dados (outlook) sem aprovação humana. |
| AAR-03 | high | netsuite pode escrever dados restricted sem que um humano aprove cada ação. |
| AAR-03 | high | outlook pode enviar dados confidential sem que um humano aprove cada ação. |
| AAR-04 | high | Acesso amplo demais no sharepoint: Sites.Read.All. |
| AAR-02 | medium | O acesso foi aprovado pela última vez há 216 dias por cfo-office (limite 90). |
| AAR-07 | medium | netsuite.NETSUITE_TOKEN foi rotacionado pela última vez há 315 dias (limite 90). |
| AAR-08 | medium | expense-ocr não é usado há 164 dias. |
Nos achados de exemplo, o finance-ops-agent lê faturas de fornecedores no NetSuite (dados restricted), lê uma caixa de entrada para a qual fornecedores podem escrever (entrada não confiável) e pode enviar e-mail (saída) sem aprovação humana: um caminho AAR-09, o que significa que um único e-mail de fatura manipulado poderia fazer o agente enviar os dados bancários dos fornecedores. Sua aprovação tem 216 dias e sua ferramenta de OCR não é usada há 164 dias, por isso é marcado como Revoke. O exemplo claude-desktop-config concede a um agente todo o diretório pessoal /Users/dev, um terminal sem sandbox, um token do GitHub e uma senha de banco de dados em texto claro, e executa quatro pacotes sem fixação. O support-copilot passa em todas as verificações: escreve em tickets, mas um humano aprova antes de qualquer envio. O CI regenera sample-output/ a cada push e falha se diferir do que está commitado, de modo que o exemplo sempre corresponde ao código atual.
Como ler os resultados
Cada permissão de ferramenta recebe uma decisão recomendada, registrada no pacote e no CSV:
| Decisão | Significado | O que o responsável faz |
|---|---|---|
| Keep | Sem achados nesta ferramenta | Confirma que ainda é necessária e assina |
| Modify | O acesso é necessário, mas inseguro como configurado | Restringe escopos, adiciona aprovação humana, move segredos para um cofre, fixa a versão |
| Revoke | Sem uso há mais de 90 dias | Remove; solicita novamente se necessário |
| Investigate | A ferramenta não está no catálogo de capacidades, portanto seu acesso não pode ser avaliado | Descobre o que ela pode fazer e a adiciona ao catalog.yaml |
A severidade é definida assim: high significa corrigir antes do próximo uso do agente (um agente sem responsável, segredos em texto claro, um caminho de exfiltração); medium significa corrigir dentro do ciclo de revisão (uma aprovação vencida, um pacote sem fixação); low significa uma lacuna de evidência, não um risco (sem registros de uso, sem data de rotação). O revisor preenche a coluna vazia de decisão e a tabela de aprovação; o pacote completo mais os arquivos de evidência com hash constituem a evidência de auditoria da revisão.
Execução
Além de instalar uma versão com pip, a ferramenta pode ser executada a partir do código-fonte, com dependências fixadas exatamente em requirements.txt:
git clone https://github.com/Mihirajmera/agent-access-review.git
cd agent-access-review
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
python -m agent_access_review demo # grava review-demo/
pytest -q
O comando scan aceita --out DIR (padrão review/), --as-of YYYY-MM-DD (a data usada para recertificação, rotação e inatividade) e --fail-on high|medium|low (sai com código 1 se um achado atingir ou superar essa severidade). agent-access-review --help lista exemplos.
Como barreira de CI
As configurações MCP e o agents.yaml podem ficar no repositório para bloquear pull requests que deem a um agente acesso sem fixação, arquivado, vulnerável ou excessivamente privilegiado:
# .github/workflows/agent-access.yml
on: pull_request
permissions:
contents: read
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: Mihirajmera/[email protected] # or a commit SHA
with:
paths: .mcp.json .vscode/mcp.json agents.yaml # files or folders; default "."
fail-on: high # high | medium | low | never
O pacote de revisão vai para o resumo do job e o passo falha diante de achados iguais ou acima do limite fail-on. Um repositório sem configurações recebe um aviso em vez de uma falha. A saída report contém o caminho do pacote, de modo que a pasta (padrão agent-access-review/) pode ser enviada como artefato. O autor recomenda fixar a action em uma tag de release ou em um SHA de commit, e não em main, para que uma nova versão não possa alterar a barreira sem revisão, algo que descreve como o controle AAR-10 aplicado à própria ferramenta. Sem a action, pip install agent-access-review seguido de agent-access-review scan ... --fail-on high faz a mesma coisa.
Decisões de design
- Agentes são identidades, não aplicações. A revisão é modelada sobre as revisões de acesso de usuários de ITGC (responsável, aprovação, recertificação, inatividade, higiene de credenciais) porque esse é o framework de controle que os auditores já testam; os riscos específicos de IA são adicionados por cima, não no lugar.
- AAR-09 olha combinações, não permissões isoladas. Cada trecho de um caminho de exfiltração é inofensivo sozinho; o risco só aparece quando um agente reúne os três, razão pela qual as revisões de permissões tradicionais não o detectam. Uma etapa de aprovação humana no trecho de entrada não confiável ou de saída quebra a cadeia.
- Falhar fechado diante de ferramentas desconhecidas. Um servidor MCP não classificado é um achado, não uma aprovação; como o catálogo é dados, uma equipe de GRC pode estendê-lo sem tocar no código.
- Mascarar antes de aplicar hash. Evidências contendo segredos não podem ser compartilhadas, e mascarar depois quebraria o hash, portanto o mascaramento acontece no parser.
- Tags de Docker contam como não fixadas. Apenas um digest de imagem é imutável; :v1.0 pode ser republicada.
Limitações
- Revisa a configuração, não o comportamento em tempo de execução: vê que um agente pode enviar e-mail, não o que ele realmente enviou. As datas de uso vêm do manifesto, que em produção seria alimentado por logs de chamadas de ferramentas.
- O catálogo de capacidades é aproximado: descreve o que um servidor pode fazer por padrão, e os escopos reais de um token (por exemplo, um PAT de GitHub de granularidade fina) podem ser mais estreitos; o formato de manifesto permite registrar escopos exatos.
- Configurações JSON com comentários são ignoradas com um aviso.
O que o autor faria em escala empresarial
- Descobrir a partir de endpoints, não de arquivos: coletar configurações MCP de laptops gerenciados via MDM ou EDR, e identidades de agentes do IdP (service principals, aplicações OAuth), de modo que agentes invisíveis surjam automaticamente.
- Alimentar o uso a partir de logs: preencher last_used a partir de logs de gateway ou proxy MCP para que o AAR-08 se baseie em evidências, e não em autorrelato.
- Executar a revisão na plataforma de GRC: enviar a folha de decisões para o ServiceNow GRC ou SailPoint como campanha de certificação com responsáveis, prazos e escalonamento, e revogar automaticamente permissões não certificadas.
- Fechar o ciclo: transformar achados OSCAL não satisfeitos em itens de POA&M com responsáveis e prazos.
Segundo o README, a forma mais fácil de contribuir é adicionar um servidor MCP ao catálogo de capacidades (ver CONTRIBUTING.md); as mudanças são listadas no CHANGELOG e o projeto é publicado sob licença MIT.