Atlas / MCP servers / knuckles-team / microsoft-agent

microsoft-agentSAFE

mcp/knuckles-team/microsoft-agent

Microsoft A2A / AG-UI Agent

Verdict
SAFE
Grade
B
Trust score
84 /100
Exposed tools
16 13r · 3w · 0d
Transport
sse · stdio · streamable-http
License
MIT
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Microsoft Agent provides a governed Microsoft Graph MCP server and an optional A2A agent. It uses Agent Utilities for MCP, identity propagation, intent delegation, configuration, telemetry, and graph integration.

Current package version: 2.1.0

Capabilities

  • Outlook mail, calendars, contacts, tasks, and attachments
  • Teams chats, channels, meetings, and presence
  • OneDrive, SharePoint, Excel, OneNote, and Universal Print
  • Entra users, groups, applications, policy, audit, security, and reports
  • Optional Word and PowerPoint generation and an exact-origin Office.js bridge
  • Optional Power Platform, Intune, and outbound Windows companion integrations
  • Governed ingestion into Epistemic Graph with provider-owned ontology, mapping,

schema fingerprint, provenance, and quarantine contracts

  • One consolidated microsoft-agent-operations skill

The current implementation has one modular Graph client in microsoft_agent/api_client.py, one authentication authority in microsoft_agent/auth.py, and one MCP entry point in microsoft_agent/mcp_server.py. No raw-token fallback, plaintext cache, bundled database, bundled endpoint profile, or duplicate API wrapper is shipped.

Install

python -m pip install "microsoft-agent[mcp]"

Useful extras:

python -m pip install "microsoft-agent[agent]"        # A2A agent runtime
python -m pip install "microsoft-agent[documents]"    # Word and PowerPoint
python -m pip install "microsoft-agent[cloud]"        # managed/workload identity
python -m pip install "microsoft-agent[windows]"      # Windows companion
python -m pip install "microsoft-agent[control-plane]"
python -m pip install "microsoft-agent[all]"

Agent Utilities depends on epistemic-graph[full]; the full and numeric engine features therefore remain available when the A2A/GraphOS runtime is installed.

Authentication

Microsoft identity values are provided by deployment configuration. There is no baked-in client identi

Read from source at commit b2873c9efe95OBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add microsoft-agent-office-addin --env MICROSOFT_TOKEN=${MICROSOFT_TOKEN} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "microsoft-agent-office-addin": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "MICROSOFT_TOKEN": "${MICROSOFT_TOKEN}"
      }
    }
  }
}
03

Exposed tools (16)

13 read · 3 write · 0 destructive.

ToolRiskDescription
activate_power_automate_flowreadActivate a flow when lifecycle changes are explicitly enabled.
add_powerpoint_slide_in_officewriteEnqueue a typed PowerPoint append-slide request.
deactivate_power_automate_flowreadDeactivate a flow when lifecycle changes are explicitly enabled.
get_intune_managed_devicereadRetrieve a managed device after enforcing its UUID allowlist.
get_office_command_resultreadRead one queued, delivered, completed, failed, or expired command.
get_power_automate_desktop_flow_outputsreadRead the documented outputs value for a desktop-flow session.
get_power_automate_desktop_flow_runwriteRead documented Dataverse status fields for a desktop-flow session.
get_power_automate_flowreadRetrieve a cloud-flow workflow row by its immutable ID.
get_power_platform_configurationwriteInspect Power Platform readiness without revealing trigger URLs.
get_windows_action_resultreadRetrieve a companion action result through the authenticated relay.
get_windows_companion_configurationreadInspect configured device aliases without exposing identity material.
get_windows_device_healthreadGet connection state and validated companion identity for one device.
get_word_selection_from_officereadEnqueue a typed Word selection read and optionally await its result.
list_intune_managed_devicesreadList allowlisted managed-device inventory from Graph v1.0.
list_office_sessionsreadReturn live Office session IDs, hosts, labels, and capabilities.
list_powerpoint_slides_in_officereadEnqueue a typed PowerPoint slide-list request.
04

Trust audit

SAFEgrade B · trust 84/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codePASS
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
none-observed
Network
declared (5 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
none-found

Findings (20)

LOWInventory / provenance · inv.hidden_file · CWE-1104
.bumpversion.cfg
.bumpversion.cfg
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.codespellignore
.codespellignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.coveragerc
.coveragerc
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.pre-commit-config.yaml
.pre-commit-config.yaml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
tests/test_init_dynamics.py:29
mod = importlib.import_module(pkg_name)
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
tests/test_init_dynamics.py:35
mod = importlib.import_module(pkg_name)
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
tests/test_init_dynamics.py:47
mod = importlib.import_module(pkg_name)
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
microsoft_agent/windows_companion_service.py:244
actual_thumbprint = hashlib.sha1(certificate_der).hexdigest().upper()  # noqa: S324
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/test_graph_file_service.py:132
"https://169.254.169.254/latest/meta-data",
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/test_graph_file_service.py:130
"https://127.0.0.1/session",
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/test_graph_file_service.py:131
"https://10.0.0.1/session",
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/test_graph_file_service.py:132
"https://169.254.169.254/latest/meta-data",
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
microsoft_agent/api/_graph_models.py:34
return base64.b64decode(value, validate=True)
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
microsoft_agent/api/api_client_drive.py:153
body = base64.b64decode(content_bytes)
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
microsoft_agent/api/api_client_mail.py:289
attachment.content_bytes = base64.b64decode(content_bytes)
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
microsoft_agent/document_service.py:148
return base64.b64decode(self.content_base64, validate=True)
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
microsoft_agent/universal_print.py:89
content = base64.b64decode(self.content_base64, validate=True)
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
office_addin/package.json
@types/office-js, copy-webpack-plugin, office-addin-dev-certs, ts-loader, typescript, vitest, webpack, webpack-cli
Why it matters. 9 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
requirements.txt
agent-utilities, msal, keyring, msgraph-sdk
Why it matters. 4 requirement(s) not pinned with ==
Fix. pin exact versions
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
deployment/windows/README.md:60
not collect or persist that password.
Why it matters. asks the agent to read credentials

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha b2873c9efe95full audit observations/trust-audit/mcp-server/knuckles-team__microsoft-agent.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-11b2873c9efe95SAFEB84first audit
06

Questions

What is the microsoft-agent MCP server?

Microsoft A2A / AG-UI Agent

What tools does microsoft-agent expose?

16 in total: 13 read-only, 3 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is microsoft-agent safe to connect to an agent?

The audit found nothing in the source that contradicts what it says it does, and graded it B (84/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B.

What credentials does microsoft-agent need?

It reads MICROSOFT_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does microsoft-agent run?

It speaks sse, stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as microsoft-agent-office-addin at 0.1.0.

How current is this page?

The grade is for one exact copy of the source (b2873c9efe95), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement