outlook-mcp
# outlook-mcp
**Outlook/Office365 para agentes de IA** — servidor **MCP (stdio)** + **serviço FastAPI** (`:8445`), sem App Registration no Azure AD.
## Arquitetura
```
Claude Code / agente ──(MCP stdio)──► mcp_server ──HTTP──► outlook_service :8445
│
┌───────────────┴───────────────┐
▼ primário ▼ fallback
OWA REST API v2.0 Playwright/Chromium
(token da sessão, TTL 30min) (sessão web logada)
```
- **Sem App Registration**: o token Bearer é extraído da própria sessão web do Outlook (interceptação Playwright), com cache de 30 min e invalidação automática em 401.
- **11 ferramentas MCP**: inbox, inbox compartilhado, enviar e-mail, agenda hoje/semana, detalhes de evento, criar/editar/cancelar evento, disponibilidade, freebusy.
- **Endpoints REST completos** (`/calendario/*`, `/email/*`): use direto por HTTP se preferir (bridges, cron, outros serviços).
> ⚠️ **Sobre o método de login.** Este projeto não usa OAuth/App Registration — ele automatiza o login web real do Outlook via Playwright (a senha é lida de uma variável de ambiente e digitada no formulário de login da Microsoft). É um atalho deliberado para evitar burocracia de Azure AD, mas foge do fluxo oficial suportado pela Microsoft: rode isso só com contas que você controla, entenda que a sessão pode quebrar se a Microsoft mudar o formulário de login ou exigir MFA adicional, e prefira uma App Registration + Graph API oficial se isso for rodar em produção para terceiros.
## Instalação
```bash
pip install -e .
playwright install chromium
```
Configure as variáveis de ambiente antes do primeiro login:
| Variável | Uso |
|---|---|
| `OUTLOOK_MCP_EMAIL` | conta que faz login (obrigatório) |
| `OUTLOOK_MCP_PASSWORD` | senha dessa conta (obrigatório, só usado no login inicial) |
| `OUTLOOK_MCP_DEFAULT_MAILBOX` | e-mail do calendário/caixa gerenciada por padrão (opcional) |
| `OUTLOOK_MCP_DEFAULT_CC` | e-mail incluído em CC automático nos envios (opcional) |
| `OUTLOOK_MCP_ORG_DOMAINS` | domínios internos da sua organização, separados por vírgula — usado pra distinguir participante interno de externo no FreeBusy (opcional) |
**Login (uma vez):** inicie o serviço e faça o login web quando o Chromium abrir — a sessão persiste (cookies) e o serviço renova sozinho.
```bash
outlook-service # FastAPI em 127.0.0.1:8445
```
Produção (macOS): use `launchd/com.outlookmcp.service.plist` via `install.sh` (inclui restart automático). Em Linux, rode `outlook-service` sob o supervisor de sua preferência (systemd, supervisord etc.) — não há unit pronta ainda.
## Registrar o MCP em outro projeto (Claude Code)
`.mcp.json` do projeto (ou `~/.claude/.mcp.json` para todas as sessões):
```json
{
"mcpServers": {
"outlook": {
"command": "outlook-mcp"
}
}
}
```
> O MCP fala com `localhost:8445` — o serviço precisa estar rodando (mesma máquina).
## FreeBusy externo (opcional)
Calendários externos via iCal: copie `config/ical_feeds.json.example` para `ical_feeds.json` no diretório do pacote instalado e preencha. **⛔ `ical_feeds.json` contém tokens privados — está no `.gitignore`, nunca commite.**
## Notas de robustez
- Token OWA: TTL 30 min + invalidação em 401. Um TTL curto força refresh constante do Chromium de vida longa, o que desgasta o driver com o tempo — 30 min reduz bastante essa frequência sem risco de token vencido (o token real vive ~60 min).
- Recomenda-se um watchdog no `/health` (o corpo indica `status: degraded` mesmo com HTTP 200) e uma reciclagem preventiva diária do serviço.
## Status
O projeto ainda não tem testes automatizados nem CI. Use, reporte problemas, contribua.
TDQS
Scored across 11 tools
Most tools have clear distinct purposes: email vs calendar, list vs send vs create/edit/cancel. However, 'outlook_agenda_hoje' and 'outlook_agenda_semana' could overlap when N=1, and 'outlook_disponibilidade' vs 'outlook_freebusy' address similar availability scenarios for single vs multiple users, creating possible misselection.
All tools share the consistent 'outlook_' prefix and snake_case naming. However, the pattern mixes resource-noun names (outlook_inbox, outlook_agenda_hoje, outlook_disponibilidade) with action_verb names (outlook_enviar_email, outlook_criar_evento), and 'outlook_freebusy' is a single string rather than a compound. This is readable but not fully uniform.
With 11 tools, the set is well-scoped for an Outlook email and calendar server. Each tool covers a meaningful core operation without excessive redundancy or trivial additions, fitting comfortably in the ideal range.
Calendar coverage is solid (list, detail, create, edit, delete, availability). Email coverage is incomplete: inbox list returns only previews, and there is no tool to fetch/retrieve the full email body, nor delete or manage emails. This leaves a notable gap for a server intended to handle Outlook email.