Graph MCP
Um MCP para interagir com o Office 365 - Teams, e-mail, calendário.
Documentação
Graph MCP
Graph MCP é um servidor MCP em Node.js que conecta Claude Code e Codex ao Microsoft Teams, Outlook (e-mail e calendário), reuniões online, OneDrive, usuários e presença por meio do Microsoft Graph. Ele roda localmente via stdio e requer Node.js 22 ou mais recente.
O que ele faz
Graph MCP expõe exatamente 127 ferramentas:
| Categoria | Ferramentas |
|---|---|
| Autenticação | Verificar status, entrar com navegador ou código de dispositivo, sair |
| Usuários e organização | Ler seu perfil, pesquisar usuários, consultar um gerente ou subordinados diretos |
| Pessoas e contatos | Pesquisa de pessoas classificada por relevância, listar, criar, atualizar ou excluir contatos do Outlook, listar pastas de contatos |
| Pesquisa | Pesquisar mensagens do Teams, ou pesquisar e-mail, calendário, arquivos e Teams juntos em uma única consulta classificada |
| Conversas | Listar, obter ou criar conversas, ler, enviar, editar ou excluir mensagens, reagir a mensagens, renomear conversas, gerenciar membros, marcar como lida |
| Teams e canais | Listar equipes, canais e membros, obter uma equipe ou seu canal principal, criar canais, ler, enviar, responder, editar ou excluir mensagens de canal, acessar a pasta do SharePoint de um canal |
| Calendário | Listar calendários e eventos, obter, criar, atualizar, cancelar ou excluir eventos, recorrência, RSVP, disponibilidade, horários sugeridos para reuniões, ocorrências de séries, salas reserváveis, calendários compartilhados |
| Listar, ler, pesquisar ou sincronizar por delta o e-mail, enviar, responder ou encaminhar com rascunhos, cópia oculta, importância e anexos, mover e arquivar, excluir, marcar como lido, sinalizar, categorizar, gerenciar pastas e regras de caixa de entrada, dicas de e-mail, caixas de correio compartilhadas | |
| Configurações da caixa de correio | Ler configurações da caixa de correio, definir respostas automáticas, definir fuso horário e horário de trabalho |
| Reuniões | Resolver um ID de reunião a partir de um evento de calendário, URL de participação ou conversa de reunião, buscar uma reunião por URL de participação ou ID numérico do convite, criar ou obter reuniões online com links de participação, relatórios de presença, transcrições e gravações |
| Presença | Ler sua própria presença, a de outro usuário ou de uma equipe inteira, definir disponibilidade ou mensagem de status, limpar presença |
| Tarefas | Listar listas e tarefas do To Do, criar, atualizar, concluir ou excluir tarefas, listar tarefas do Planner atribuídas |
| Arquivos | Navegar, pesquisar ou resolver links para conteúdo do OneDrive e SharePoint, enviar, baixar como texto ou bytes base64, copiar, mover, excluir, versionar e compartilhar arquivos, gerenciar permissões, ler itens recentes e compartilhados, ler e escrever intervalos do Excel |
Pré-requisitos
- Node.js 22 ou mais recente.
- Um registro de aplicativo do Microsoft Entra ID configurado como cliente público na plataforma Aplicativos móveis e desktop.
- URI de redirecionamento
http://localhost:3000/auth/callback. - Sem segredo de cliente. Graph MCP usa autenticação delegada de usuário.
Adicione estas permissões delegadas exatas ao registro do aplicativo:
offline_accessopenidprofileUser.ReadUser.ReadBasic.AllUser.Read.AllChat.ReadChat.ReadWriteChatMember.ReadWriteChatMessage.SendChannelMessage.Read.AllChannelMessage.SendChannelMessage.ReadWriteChannel.CreateTeamMember.Read.AllTeam.ReadBasic.AllChannel.ReadBasic.AllChannelMember.Read.AllCalendars.ReadWriteCalendars.Read.SharedCalendars.ReadWrite.SharedPlace.Read.AllMail.ReadMail.ReadWriteMail.SendMailboxSettings.ReadWriteMail.ReadWrite.SharedMail.Send.SharedPresence.ReadPresence.Read.AllPresence.ReadWriteOnlineMeetings.ReadOnlineMeetings.ReadWriteOnlineMeetingArtifact.Read.AllOnlineMeetingTranscript.Read.AllOnlineMeetingRecording.Read.AllFiles.ReadWrite.AllSites.Read.AllPeople.ReadContacts.ReadWriteTasks.ReadWrite
Algumas organizações exigem consentimento do administrador para uma ou mais permissões. Use o menor privilégio que sua implantação precisar e siga o processo de aprovação da sua organização.
Instalação
Plugin do Claude Code
Este repositório é em si um marketplace de plugins, então o Claude Code pode instalá-lo diretamente do GitHub:
claude plugin marketplace add JustStas/Graph-MCP --scope user
claude plugin install graph-mcp@graph-mcp --scope user
A mesma coisa funciona dentro de uma sessão do Claude Code com /plugin marketplace add JustStas/Graph-MCP followed by /plugin install graph-mcp@graph-mcp.
O Claude clona o repositório no cache do marketplace, valida
.claude-plugin/marketplace.json e instala o plugin autocontido no cache de plugins. O servidor MCP
inicia a partir do pacote do plugin instalado, então não é necessário checkout do código-fonte.
Para obter um novo lançamento, execute os dois comandos novamente.
Para desenvolvimento de plugins, um checkout local pode ser adicionado da mesma forma por caminho em vez de
owner/repo:
claude plugin marketplace add /absolute/path/to/Graph-MCP --scope user
claude plugin install graph-mcp@graph-mcp --scope user
Plugin do Codex
O Codex aceita a mesma fonte de marketplace do GitHub:
codex plugin marketplace add JustStas/Graph-MCP --json
codex plugin add graph-mcp@personal --json
codex plugin marketplace add aceita um caminho local, owner/repo[@ref] ou uma URL Git HTTPS ou SSH,
e --ref fixa uma tag ou branch específica. O manifesto do Codex inicia
./dist/graph-mcp.js relativo à raiz do plugin instalado, então não é necessário checkout do código-fonte.
Para desenvolvimento de plugins, aponte para um checkout local:
codex plugin marketplace add /absolute/path/to/Graph-MCP --json
codex plugin add graph-mcp@personal --json
npm
Instale o pacote público com escopo globalmente:
npm install --global @juststas/graph-mcp
graph-mcp setup
O pacote npm tem escopo JustStas, mas o executável instalado permanece graph-mcp. Invocar graph-mcp sem argumentos inicia o servidor MCP via stdio.
Checkout do código-fonte
npm ci
npm run build
node dist/cli.js setup
Em seguida, registre o ponto de entrada compilado com seu host:
claude mcp add graph-mcp -- node /absolute/path/to/Graph-MCP/dist/cli.js
codex mcp add graph-mcp -- node /absolute/path/to/Graph-MCP/dist/cli.js
Configuração inicial e autenticação
setup solicita o ID do Cliente e o ID do Locatário do aplicativo Entra e os salva em
~/.graph-mcp/config.json. O ID do Cliente e o ID do Locatário são identificadores, não segredos. O
comando de configuração não realiza login.
Para um plugin instalado, use a habilidade de configuração incluída e seu comando específico do host:
- Claude Code:
node "${CLAUDE_PLUGIN_ROOT}/dist/graph-mcp.js" setup - Codex: resolva a raiz do plugin instalado a partir de
skills/setup/SKILL.md, mude para esse diretório e executenode "./dist/graph-mcp.js" setup
Após a configuração, chame graph_auth_login. O login PKCE no navegador é o padrão e abre um callback
de loopback local na URI de redirecionamento configurada. Se um navegador ou callback de loopback não estiver
disponível, chame graph_auth_login com method: "device_code" e siga as instruções de verificação
da Microsoft retornadas.
Nunca cole um segredo de cliente, token de acesso, token de atualização, código de autorização, código MFA ou outras credenciais em uma conversa. Graph MCP não precisa de um segredo de cliente.
Configuração
Para ID do Cliente e ID do Locatário, as variáveis de ambiente têm precedência sobre
~/.graph-mcp/config.json, que tem precedência sobre os padrões internos. O comando de configuração
persiste apenas esses dois identificadores. Outras opções são substituições apenas por ambiente dos
padrões internos.
| Variável | Obrigatória | Padrão | Descrição |
|---|---|---|---|
AZURE_CLIENT_ID | Sim | salvo azureClientId, depois vazio | ID do aplicativo de cliente público do Entra |
AZURE_TENANT_ID | Não | salvo azureTenantId, depois common | ID do locatário ou common |
GRAPH_REDIRECT_URI | Não | http://localhost:3000/auth/callback | Deve corresponder exatamente ao registro do aplicativo |
GRAPH_TOKEN_ENCRYPTION_KEY | Não | chave local gerada | Material explícito da chave de criptografia de token |
GRAPH_TOKEN_REFRESH_BUFFER | Não | 300 | Atualizar tokens de acesso este número de segundos antes da expiração |
GRAPH_RATE_LIMIT_MAX_REQUESTS | Não | 10000 | Limite de solicitações em janela deslizante |
GRAPH_RATE_LIMIT_WINDOW | Não | 600 | Duração da janela deslizante em segundos |
GRAPH_DEBUG | Não | false | Habilitar registro de diagnóstico em stderr |
Opções de inteiros positivos rejeitam zero, negativos, decimais e valores malformados. Valores
booleanos aceitam true, false, 1, 0, yes, no, on ou off.
Armazenamento de tokens e migração do Python
O servidor Node criptografa tokens com AES-256-GCM e os armazena em ~/.graph-mcp:
tokens-v2.enc— dados de token criptografados.key-v2— chave de criptografia local gerada quando nenhuma chave de ambiente é fornecida
O runtime Python anterior usava tokens.enc e .key. A versão 0.6.0 deliberadamente não
lê, sobrescreve ou exclui esses arquivos legados porque os formatos de texto cifrado diferem.
Após atualizar do lançamento Python, autentique-se uma vez com graph_auth_login; o servidor Node
então cria seus arquivos de token versionados separados. Os arquivos de token Python existentes permanecem
intactos e podem ser removidos posteriormente de acordo com sua política de segurança local.
Os tokens de acesso são atualizados automaticamente antes da expiração. graph_auth_logout limpa o estado de token
do Node; ele não modifica os arquivos Python legados.
Formatação de mensagens e e-mails
As ferramentas de mensagens do Teams (graph_send_chat_message, graph_send_channel_message e
graph_reply_to_channel_message) e as ferramentas de e-mail de saída (graph_send_mail e
graph_reply_mail) usam o modo HTML por padrão. Quando is_html=true, passe HTML explícito; Markdown
não é convertido automaticamente.
<p><strong>Status update</strong></p>
<ul>
<li>Use <code><strong></code> for bold text.</li>
<li>Use <code><pre><code></code> for multi-line code blocks.</li>
</ul>
Use is_html=false para texto simples exato. Menções podem usar dados brutos do Graph ou esta forma
simplificada, emparelhada com a tag <at id="0">Jane Smith</at> correspondente no corpo HTML:
[
{
"name": "Jane Smith",
"user_id": "ef1c916a-3135-4417-ba27-8eb7bd084193"
}
]
Desenvolvimento e verificação
Instale as dependências bloqueadas e execute o pipeline completo de verificação do Node:
npm ci
npm run verify
Comandos individuais úteis:
npm run format:check
npm run lint
npm run typecheck
npm test
npm run build
npm run validate:versions
npm run validate:package
npx vitest run tests/plugin-install-smoke.test.ts
Validação de plugin e lançamento:
claude plugin validate --strict plugins/graph-mcp
claude plugin validate --strict .
python3 "${CODEX_HOME:-$HOME/.codex}/skills/.system/plugin-creator/scripts/validate_plugin.py" plugins/graph-mcp
node scripts/test-plugin-install.mjs
npm pack --json --dry-run
O validador do Codex é uma ferramenta de lançamento fornecida pela habilidade plugin-creator do Codex; Python não é
necessário para compilar, testar ou executar o Graph MCP em si. Antes de publicar, verifique se o pacote,
o manifesto do Claude e o manifesto do Codex correspondem à versão do lançamento alvo, o pacote de plugin
confirmado está atualizado, ambos os plugins instalados expõem exatamente 127 ferramentas e a árvore de trabalho está limpa.
Procedimento de lançamento
Os lançamentos do Graph MCP usam o pacote npm público @juststas/graph-mcp; não há etapa de lançamento
Python/PyPI. A versão 0.6.0 concluiu a migração para Node, mas não foi publicada no npm porque
o npm rejeitou o nome graph-mcp@0.6.0 sem escopo como muito semelhante ao pacote graphmcp
existente. A versão 0.6.1 é o primeiro lançamento npm com escopo.
Lançamentos normais
- Atualize
package.json,package-lock.json, ambos os manifestos de plugin, metadados de runtime,CHANGELOG.mde o pacote de plugin confirmado para uma versão. - Execute
npm ci,npm run verify,node scripts/test-plugin-install.mjsenpm pack --json --dry-runa partir de uma árvore de trabalho limpa. - Mescle o pull request revisado em
main. Um administrador do repositório então cria a tag anotadav<version>no commit mesclado por meio do conjunto de regras obrigatório de autoridade de tags de lançamento; o conjunto de regras de imutabilidade separado sem bypass bloqueia atualização ou exclusão posterior. - Publique o GitHub Release correspondente. O gatilho do workflow é
release: types: [published]. - O job de pacote instala dependências bloqueadas, executa
npm run verifye prepara o tarball exato sem permissão OIDC. - O job de publicação roda no ambiente GitHub
npme é o único job que recebe permissão OIDC. Ele baixa um artefato somente de dados contendo o tarball e metadados, faz checkout do seu helper confiável emgithub.workflow_sha, vincula a tag esperada diretamente ao evento de lançamento, valida o manifesto JSON dry-run do npm para o snapshot privado exato e usa npm Trusted Publishing. Ele não temNODE_AUTH_TOKENou segredo npm. - Verifique o workflow, a versão npm,
dist.integrity, a versão da CLI instalada e o inventário MCP de 127 ferramentas.
Reexecuções de workflow são idempotentes. Se a versão já existir, o workflow só é bem-sucedido quando o dist.integrity do npm for igual ao tarball preparado. Uma integridade diferente falha e exige uma nova versão de patch.
Bootstrap inicial do pacote com escopo
O npm exige que um pacote exista antes que o Trusted Publishing possa ser configurado. Faça o bootstrap do primeiro lançamento com escopo nesta ordem:
- Verifique o merge de
maine, em seguida, ative o conjunto de regras de autoridade de administradorv*. - Audite o inventário exato de tags históricas e a ancestralidade, exija o blob exato do workflow histórico do PyPI na allowlist onde esperado e exija que o novo auxiliar de release esteja ausente em todos os lugares.
- Ative o conjunto de regras de imutabilidade separado, sem bypass.
- Crie a tag anotada
v0.6.1somente depois que essas portas passarem. - Execute
publish.ymla partir demaincomprepare_onlyhabilitado e inspecione o artefato preparado. - Valide o nome de arquivo exato, o status de arquivo regular, os digests SHA-512 e SHA-1 e o manifesto
JSON do dry-run do npm. Publique esse mesmo snapshot privado uma vez com a 2FA interativa do
mantenedor, registro npmjs explícito, tag
latest, scripts de ciclo de vida desabilitados e acesso público; em seguida, verifique a versão e a integridade do registro. - Revertifique ambos os conjuntos de regras de tags de release.
- Crie o ambiente do GitHub
npm. - Adicione políticas de ambiente tipadas separadas para a branch
maine a tagv*. - Verifique ambos os conjuntos de regras e ambas as políticas de ambiente tipadas.
- Configure o Trusted Publishing do npm:
npx --yes npm@11.15.0 trust github @juststas/graph-mcp \
--file publish.yml \
--repo JustStas/Graph-MCP \
--env npm \
--allow-publish
Verifique o repositório salvo, o nome do arquivo do workflow, o ambiente e a permissão de publicação e, em seguida, defina o acesso de publicação do npm para exigir 2FA e desautorizar tokens tradicionais.
O bootstrap manual 0.6.1 não usa OIDC nem proveniência, e seu workflow de release com correspondência de integridade é um no-op que não testa a troca OIDC. A versão 0.6.2 é a primeira publicação OIDC real e verificação de proveniência.
Recuperação
Use workflow_dispatch a partir de main com uma tag protegida existente para reexecutar a publicação. Use
prepare_only quando apenas o tarball verificado for necessário. Os conjuntos de regras de tags de release proíbem
mover ou excluir tags v* publicadas. Nunca sobrescreva uma versão do npm; recupere-se de uma publicação
ruim com um novo patch release.
Arquitetura e comportamento em tempo de execução
Claude Code or Codex --stdio--> Graph MCP --HTTPS--> Microsoft Graph API
|
~/.graph-mcp/
config.json
tokens-v2.enc
.key-v2
- A autenticação usa OAuth 2.0 Authorization Code com PKCE ou device code.
- A atualização do token de acesso é serializada para que chamadas Graph concorrentes compartilhem uma única atualização.
- As solicitações Graph usam timeouts limitados, limitação de taxa com janela deslizante e comportamento de
nova tentativa exponencial que honra
Retry-Afterem respostas limitadas. - A saída do protocolo MCP é gravada em stdout; os diagnósticos são gravados em stderr.
Solução de problemas
Aprovação necessária durante o login
Confirme se as permissões delegadas exatas acima estão presentes e se o consentimento de administrador necessário foi concedido.
403 Forbidden para uma ferramenta
O endpoint pode precisar de uma permissão delegada ou consentimento de administrador não disponível para o usuário conectado. Verifique a permissão da ferramenta e a política da sua organização.
Callback do navegador indisponível
Chame graph_auth_login com method: "device_code" e conclua o login na URL de verificação
da Microsoft.
Configuração alterada, mas o host ainda usa valores antigos
Reinicie o servidor MCP ou o host para que o processo recarregue config.json e seu ambiente.
As variáveis de ambiente substituem os valores salvos de Client ID e Tenant ID.
Atualizado da versão Python e parece desconectado
Isso é esperado uma vez. Execute graph_auth_login; o runtime Node cria tokens-v2.enc e
.key-v2 sem alterar os arquivos antigos tokens.enc e .key.
Aviso legal
Este projeto é um esforço independente de código aberto e não é afiliado, endossado ou patrocinado pela Microsoft Corporation. Microsoft, Microsoft Teams, Outlook, Microsoft 365, Microsoft Graph e Azure são marcas registradas do grupo de empresas Microsoft.
Este software é fornecido "como está", sem garantia de qualquer tipo. Use por sua conta e risco. Os autores não aceitam responsabilidade por danos, perda de dados ou problemas de segurança decorrentes do seu uso. Você é responsável por cumprir as políticas da sua organização e os Termos de Uso da API da Microsoft.
Este software acessa os serviços da Microsoft em seu nome usando suas próprias credenciais e registro de aplicativo. Os dados recuperados do Microsoft Graph (incluindo e-mails, mensagens, eventos de calendário, reuniões e arquivos) são passados ao modelo que invocou a ferramenta. Siga as BP e os requisitos da sua organização de tratamento de dados, retenção e uso aceitável ao usar modelos de IA hospedados na nuvem.
Licença
MIT — veja LICENSE.