outlook-mcp@1.32.0
CAUTION· static onlyPublisher claims: "Production-grade MCP server for personal Outlook (Outlook.com / Hotmail / Live). 77 typed Graph tools across mail, inbox rules, calendar, contacts, to-do, drafts, attachments, folders, threading, batch ops, delta-sync. Granular permissions, OS-keyring auth, /$batch-optimized triage and bulk read. Built for agents that need real Outlook coverage, not a CLI wrapper. BYO Azure app; zero telemetry." Observed in sandbox: static analysis only — behavior not yet observed.
Coverage
Static only; nothing was run yet.The label rests on the code, the instruction files and the publisher. The honeypot run replaces this verdict when it completes.
Is [email protected] safe to install?
KillerSkills analysed it statically (a sandbox run is pending) on 2026-11-14 and scored it 58/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Credential pass-through configuration; Credential pass-through configuration; Credential pass-through configuration. Summary: static analysis only — behavior not yet observed.
Behavior trace
Queued for honeypot run · static analysis onlyThis version has not been detonated yet. The score above counts behavior as unknown (50/100), so it cannot read Verified until the honeypot run completes and replaces this verdict.
Static findings
# has marked read-only used to have that attribute cleared here — chmod on Windows doesFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.def build_app(server: MCPServer, settings: HttpSettings) -> ASGIApp:Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.# The 0o700 directory and 0o600 file modes below are POSIX-only. On Windows os.chmod can setFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.# feature here (~1.2k proxy tokens, ~8% of the default surface — mostlyFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# feature here (~1.2k proxy tokens, mostly `create_rule`'s argument list), andFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.def uvicorn_config(server: MCPServer, settings: HttpSettings) -> uvicorn.Config:Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.2. **Config-gated toolsets** — the full tool schemas cost chars/4 proxy tokensFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.def serve(server: MCPServer, settings: HttpSettings) -> None:Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.# Ours to lock down. Never chmod a directory the user pointed us at.Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.# POSIX-only: on Windows os.chmod sets nothing but the read-only attribute, so thisFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.out = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# re-fetching ~13k chars/4 proxy tokens of schemas. The set is fixed at import —Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.done = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.proxy tokens on 1.25.1), and the budget measured a different surfaceFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.pytest.param("file:///etc/passwd", id="file-scheme"),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.'p=subprocess.Popen([sys.executable,"-c","import time; time.sleep(60)"])\n'Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.("image/jpeg", b"\xff\xd8\xff\xe0\x00\x10JFIF"),Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."""An upgrade must not kill a server whose config.json already says EST.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.return subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.off = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.proc = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.on = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.out = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.validate_graph_id("../../etc/passwd")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.out = subprocess.run(Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.reason="os.chmod on Windows honours only the read-only attribute, so 0o700 is not "Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.reason="os.chmod on Windows honours only the read-only attribute, so 0o600 is not "Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.out = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.reason="os.chmod on Windows honours only the read-only attribute (#85).",Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.reason="the repair asserts a POSIX mode, and os.chmod on Windows cannot set 0o600 (#85).",Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts._INVISIBLE = dict.fromkeys(map(ord, "\u200b\u200c\u200d\u2060\ufeff\u034f"))Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.done = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.raw_content = b"PK\x03\x04\x14\x00\x00\x00\x08\x00\xff\xfe\x00\x01binary"Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.pytest.param("https://user:[email protected]/x", id="userinfo"),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.proc = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.f"`prompts/list` now costs ~{cost} proxy tokens. A prompt's body is supposed "Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# (+79 proxy tokens). All groups: 77 / 12,175. Measured on Python 3.13 withFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.for key in ("/etc/localtime", "../../etc/passwd"):Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.DOCX = b"PK\x03\x04\x14\x00\x00\x00\x08\x00\xff\xfe\x00\x01binary"Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.reason="os.chmod on Windows honours only the read-only attribute (#85).",Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.save_path="/etc/passwd",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.reason="os.chmod on Windows honours only the read-only attribute, so 0o700 is not "Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.out = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# ── Format / concise / deferred-send ─────────────────────────────────────Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.f"The 71-tool default surface now costs ~{cost} proxy tokens per turn, over the "Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.f"The rules-enabled surface costs ~{measured['cost']} proxy tokens, over the "Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.Cost to the agent
Tokens estimated at four characters each. Skills load their instruction text when triggered; the figure is what that costs.
Known vulnerabilities
Vulnerability advisories (OSV) cover npm and PyPI packages; this registry has no advisory database.
What would make this Verified
22 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim mpalermiti: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Credential pass-through configuration≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- File permission modification command≈ +2 on the totalRequest the narrowest permission that works; replace wildcards with the exact paths or hosts.
- MCP server using network transport (SSE/HTTP)≈ +2 on the totalNamespace tool names and keep tool descriptions literal; no instructions to the agent inside them.
- Python subprocess execution detected≈ +2 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
- Access to sensitive file paths≈ +2 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.