Microsoft Entra ID MCP Server
Um servidor MCP Python para operações de diretório, usuário, grupo, dispositivo, login e segurança do Microsoft Entra ID (Azure AD) via Microsoft Graph.
Documentação
EntraID MCP Server (Microsoft Graph FastMCP)
Este projeto fornece um servidor FastMCP modular e orientado a recursos para interagir com a API do Microsoft Graph. Ele foi projetado para extensibilidade, manutenibilidade e segurança, suportando consultas avançadas para usuários, logs de entrada, status de MFA e usuários privilegiados.
Recursos
- Estrutura de Recursos Modular:
- Cada recurso (usuários, logs de entrada, MFA, etc.) é implementado em seu próprio módulo sob
src/msgraph_mcp_server/resources/. - Fácil de estender com novos recursos (ex.: grupos, dispositivos).
- Cada recurso (usuários, logs de entrada, MFA, etc.) é implementado em seu próprio módulo sob
- Cliente Graph Centralizado:
- Gerencia autenticação e inicialização do cliente.
- Compartilhado por todos os módulos de recursos.
- Operações Abrangentes de Usuário:
- Pesquisar usuários por nome/e-mail.
- Obter usuário por ID.
- Listar todos os usuários privilegiados (membros de funções de diretório).
- Gerenciamento Completo do Ciclo de Vida de Grupos e Associações:
- Criar, ler, atualizar e excluir grupos.
- Adicionar/remover membros e proprietários de grupos.
- Pesquisar e listar grupos e membros de grupos.
- Gerenciamento de Aplicativos e Principais de Serviço:
- Listar, criar, atualizar e excluir aplicativos (registros de aplicativos).
- Listar, criar, atualizar e excluir principais de serviço.
- Visualizar atribuições de funções de aplicativo e permissões delegadas para aplicativos e principais de serviço.
- Operações de Log de Entrada:
- Consultar logs de entrada de um usuário nos últimos X dias.
- Operações de MFA:
- Obter status de MFA para um usuário.
- Obter status de MFA para todos os membros de um grupo.
- Gerenciamento de Senhas:
- Redefinir senhas de usuários diretamente com senhas personalizadas ou geradas automaticamente de forma segura.
- Opção para exigir alteração de senha no próximo login.
- Auxiliar de Permissões:
- Sugerir permissões apropriadas do Microsoft Graph para tarefas comuns.
- Pesquisar e explorar permissões disponíveis do Graph.
- Ajuda a implementar o princípio do menor privilégio, recomendando apenas as permissões necessárias.
- Tratamento de Erros e Registro:
- Tratamento consistente de erros e relatórios de progresso via contexto FastMCP.
- Registro detalhado para solução de problemas.
- Segurança:
.enve arquivos de segredos são excluídos do controle de versão.- Usa as melhores práticas da Microsoft para autenticação.
Estrutura do Projeto
src/msgraph_mcp_server/
├── auth/ # Authentication logic (GraphAuthManager)
├── resources/ # Resource modules (users, signin_logs, mfa, ...)
│ ├── users.py # User operations (search, get by ID, etc.)
│ ├── signin_logs.py # Sign-in log operations
│ ├── mfa.py # MFA status operations
│ ├── permissions_helper.py # Graph permissions utilities and suggestions
│ ├── applications.py # Application (app registration) operations
│ ├── service_principals.py # Service principal operations
│ └── ... # Other resource modules
├── utils/ # Core GraphClient and other ultilities tool, such as password generator..
├── server.py # FastMCP server entry point (registers tools/resources)
├── __init__.py # Package marker
Uso
1. Configuração
- Clone o repositório.
- Crie um arquivo
config/.envcom suas credenciais do Azure AD:TENANT_ID=your-tenant-id CLIENT_ID=your-client-id CLIENT_SECRET=your-client-secret - (Opcional) Configure autenticação baseada em certificado, se necessário.
2. Testes e Desenvolvimento
Você pode testar e desenvolver seu servidor MCP diretamente usando a CLI do FastMCP:
fastmcp dev '/path/to/src/msgraph_mcp_server/server.py'
Isso inicia um ambiente de desenvolvimento interativo com o MCP Inspector. Para mais informações e uso avançado, consulte a documentação do FastMCP.
3. Ferramentas Disponíveis
Ferramentas de Usuário
search_users(query, ctx, limit=10)— Pesquisar usuários por nome/e-mailget_user_by_id(user_id, ctx)— Obter detalhes do usuário por IDget_privileged_users(ctx)— Listar todos os usuários em funções de diretório privilegiadasget_user_roles(user_id, ctx)— Obter todas as funções de diretório atribuídas a um usuárioget_user_groups(user_id, ctx)— Obter todos os grupos (incluindo associações transitivas) para um usuário
Ferramentas de Grupo
get_all_groups(ctx, limit=100)— Obter todos os grupos (com paginação)get_group_by_id(group_id, ctx)— Obter um grupo específico pelo seu IDsearch_groups_by_name(name, ctx, limit=50)— Pesquisar grupos por nome de exibiçãoget_group_members(group_id, ctx, limit=100)— Obter membros de um grupo pelo ID do grupocreate_group(ctx, group_data)— Criar um novo grupo (veja abaixo os campos de group_data)update_group(group_id, ctx, group_data)— Atualizar um grupo existente (campos: displayName, mailNickname, description, visibility)delete_group(group_id, ctx)— Excluir um grupo pelo seu IDadd_group_member(group_id, member_id, ctx)— Adicionar um membro (usuário, grupo, dispositivo, etc.) a um gruporemove_group_member(group_id, member_id, ctx)— Remover um membro de um grupoadd_group_owner(group_id, owner_id, ctx)— Adicionar um proprietário a um gruporemove_group_owner(group_id, owner_id, ctx)— Remover um proprietário de um grupo
Exemplo de Criação/Atualização de Grupo:
group_dataparacreate_groupeupdate_groupdeve ser um dicionário com chaves como:displayName(obrigatório para criação)mailNickname(obrigatório para criação)description(opcional)groupTypes(opcional, ex.:["Unified"])mailEnabled(opcional)securityEnabled(opcional)visibility(opcional, "Private" ou "Public")owners(opcional, lista de IDs de usuários)members(opcional, lista de IDs)membershipRule(obrigatório para grupos dinâmicos)membershipRuleProcessingState(opcional, "On" ou "Paused")
Consulte as docstrings de groups.py para mais detalhes sobre campos e comportamentos suportados.
Ferramentas de Log de Entrada
get_user_sign_ins(user_id, ctx, days=7)— Obter logs de entrada para um usuário
Ferramentas de MFA
get_user_mfa_status(user_id, ctx)— Obter status de MFA para um usuárioget_group_mfa_status(group_id, ctx)— Obter status de MFA para todos os membros de um grupo
Ferramentas de Dispositivos
get_all_managed_devices(filter_os=None)— Obter todos os dispositivos gerenciados (opcionalmente filtrar por SO)get_managed_devices_by_user(user_id)— Obter todos os dispositivos gerenciados para um usuário específico
Ferramentas de Políticas de Acesso Condicional
get_conditional_access_policies(ctx)— Obter todas as políticas de acesso condicionalget_conditional_access_policy_by_id(policy_id, ctx)— Obter uma única política de acesso condicional pelo seu ID
Ferramentas de Log de Auditoria
get_user_audit_logs(user_id, days=30)— Obter todos os logs de auditoria de diretório relevantes para um usuário por user_id nos últimos N dias
Ferramentas de Gerenciamento de Senhas
reset_user_password_direct(user_id, password=None, require_change_on_next_sign_in=True, generate_password=False, password_length=12)— Redefinir a senha de um usuário com um valor específico ou gerar uma senha aleatória segura
Ferramentas de Auxílio de Permissões
suggest_permissions_for_task(task_category, task_name)— Sugerir permissões do Microsoft Graph para uma tarefa específica com base em mapeamentos comunslist_permission_categories_and_tasks()— Listar todas as categorias e tarefas disponíveis para sugestões de permissõesget_all_graph_permissions()— Obter todas as permissões do Microsoft Graph diretamente da API do Microsoft Graphsearch_permissions(search_term, permission_type=None)— Pesquisar permissões do Microsoft Graph por palavra-chave
Ferramentas de Aplicativos
list_applications(ctx, limit=100)— Listar todos os aplicativos (registros de aplicativos) no locatário, com paginaçãoget_application_by_id(app_id, ctx)— Obter um aplicativo específico pelo seu ID de objeto (inclui atribuições de funções de aplicativo e permissões delegadas)create_application(ctx, app_data)— Criar um novo aplicativo (veja abaixo os campos de app_data)update_application(app_id, ctx, app_data)— Atualizar um aplicativo existente (campos: displayName, signInAudience, tags, identifierUris, web, api, requiredResourceAccess)delete_application(app_id, ctx)— Excluir um aplicativo pelo seu ID de objeto
Exemplo de Criação/Atualização de Aplicativo:
app_dataparacreate_applicationeupdate_applicationdeve ser um dicionário com chaves como:displayName(obrigatório para criação)signInAudience(opcional)tags(opcional)identifierUris(opcional)web(opcional)api(opcional)requiredResourceAccess(opcional)
Ferramentas de Principal de Serviço
list_service_principals(ctx, limit=100)— Listar todos os principais de serviço no locatário, com paginaçãoget_service_principal_by_id(sp_id, ctx)— Obter um principal de serviço específico pelo seu ID de objeto (inclui atribuições de funções de aplicativo e permissões delegadas)create_service_principal(ctx, sp_data)— Criar um novo principal de serviço (veja abaixo os campos de sp_data)update_service_principal(sp_id, ctx, sp_data)— Atualizar um principal de serviço existente (campos: displayName, accountEnabled, tags, appRoleAssignmentRequired)delete_service_principal(sp_id, ctx)— Excluir um principal de serviço pelo seu ID de objeto
Exemplo de Criação/Atualização de Principal de Serviço:
sp_dataparacreate_service_principaleupdate_service_principaldeve ser um dicionário com chaves como:appId(obrigatório para criação)accountEnabled(opcional)tags(opcional)appRoleAssignmentRequired(opcional)displayName(opcional)
Exemplo de Recurso
greeting://{name}— Retorna uma saudação personalizada
Estendendo o Servidor
- Adicione novos módulos de recursos sob
resources/(ex.:groups.py,devices.py). - Registre novas ferramentas em
server.pyusando o decorador@mcp.tool()do FastMCP. - Use o
GraphClientcompartilhado para todas as chamadas de API.
Segurança e Melhores Práticas
- Nunca confirme segredos:
.enve outros arquivos sensíveis são ignorados pelo git. - Use o menor privilégio: Conceda apenas as permissões necessárias do Microsoft Graph ao seu aplicativo do Azure AD.
- Audite e monitore: Use a saída de registro para solução de problemas e monitoramento.
Permissões Necessárias da API do Graph
| API / Permissão | Tipo | Descrição |
|---|---|---|
| AuditLog.Read.All | Application | Ler todos os dados de log de auditoria |
| AuthenticationContext.Read.All | Application | Ler todas as informações de contexto de autenticação |
| DeviceManagementManagedDevices.Read.All | Application | Ler dispositivos do Microsoft Intune |
| Directory.Read.All | Application | Ler dados de diretório |
| Group.Read.All | Application | Ler todos os grupos |
| GroupMember.Read.All | Application | Ler todas as associações de grupo |
| Group.ReadWrite.All | Application | Criar, atualizar, excluir grupos; gerenciar membros e proprietários de grupos |
| Policy.Read.All | Application | Ler as políticas da sua organização |
| RoleManagement.Read.Directory | Application | Ler todas as configurações de RBAC do diretório |
| User.Read.All | Application | Ler todos os perfis completos dos usuários |
| User-PasswordProfile.ReadWrite.All | Application | Permissão menos privilegiada para atualizar a propriedade passwordProfile |
| UserAuthenticationMethod.Read.All | Application | Ler todos os métodos de autenticação dos usuários |
| Application.ReadWrite.All | Application | Criar, atualizar e excluir aplicativos (registros de aplicativos) e principais de serviço |
Nota: Group.ReadWrite.All é necessário para criação, atualização, exclusão de grupos e para adicionar/remover membros ou proprietários de grupos. Group.Read.All e GroupMember.Read.All são suficientes para consultas somente leitura de grupos e associações.
Avançado: Usando com Claude ou Cursor
Usando com Claude (Anthropic)
Para instalar e executar este servidor como uma ferramenta MCP do Claude, use:
fastmcp install '/path/to/src/msgraph_mcp_server/server.py' \
--with msgraph-sdk --with azure-identity --with azure-core --with msgraph-core \
-f /path/to/.env
- Substitua
/path/to/pelo caminho real do seu projeto. - A flag
-faponta para o seu arquivo.env(nunca confirme segredos!).
Usando com Cursor
Adicione o seguinte ao seu .cursor/mcp.json (não inclua segredos reais no controle de versão):
{
"EntraID MCP Server": {
"command": "uv",
"args": [
"run",
"--with", "azure-core",
"--with", "azure-identity",
"--with", "fastmcp",
"--with", "msgraph-core",
"--with", "msgraph-sdk",
"fastmcp",
"run",
"/path/to/src/msgraph_mcp_server/server.py"
],
"env": {
"TENANT_ID": "<your-tenant-id>",
"CLIENT_ID": "<your-client-id>",
"CLIENT_SECRET": "<your-client-secret>"
}
}
}
- Substitua
/path/to/e as variáveis de ambiente pelos seus valores reais. - Nunca confirme segredos reais no seu repositório!
Licença
MIT