Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
43bbf39
Initial import: SharePoint Embedded MCP Server
Jun 24, 2026
d0d8637
fix(spe): supply required etag on container type update; prime auth i…
Jun 25, 2026
f3893b6
fix(spe): make project_run_local work on Windows (dual-stack readines…
Jun 25, 2026
6ad82db
ci: add GitHub Actions CI, supply-chain gates, Dependabot, CODEOWNERS
Jun 26, 2026
7bb2611
registry: add server.json; README lead-with-npx install + MCP CELA di…
Jun 26, 2026
393d8c7
docs: add prompts library, enriched resources, troubleshooting/known-…
Jun 26, 2026
424b236
foundation: structured envelope, safe errors, arg-log redaction, tool…
Jun 26, 2026
7a17d61
merge(agents/gap-foundation): integrate gap-analysis workstream into …
Jun 26, 2026
f2bcacd
merge(agents/gap-ci): integrate gap-analysis workstream into feat/spe…
Jun 26, 2026
58f571e
merge(agents/gap-registry): integrate gap-analysis workstream into fe…
Jun 26, 2026
c5db948
merge(agents/gap-docs): integrate gap-analysis workstream into feat/s…
Jun 26, 2026
5f79bfc
tools(partial): confirm-gate container_delete permanent-delete; withC…
Jun 29, 2026
9c7d0cb
tools: wire read-only mode + tool profiles (SAFE-003/004); apply with…
Jun 29, 2026
ae1d3aa
tools: add pagination to list/search (TOOL-003); enforce Learn MCP en…
Jun 29, 2026
b13f617
merge(agents/gap-tools): integrate Wave-2 safety + agent-quality (SAF…
Jun 29, 2026
9d3f623
test: MCP protocol-level e2e harness (TEST-001); provision prompt gol…
Jun 29, 2026
d0fd3df
merge(agents/gap-tests): integrate Wave-3 protocol e2e + provision go…
Jun 29, 2026
d0d9e0a
ci: build before test so protocol-e2e has dist/; self-build guard in …
Jun 29, 2026
6a71085
security: enforce 0o600 token-cache/state perms (SEC-003); fix docs_f…
Jun 29, 2026
fcf3ecd
ci: make gitleaks secret-scan gracefully skip without GITLEAKS_LICENS…
Jun 29, 2026
a7670ef
fix(auth): accept guest/B2B cached account; move wrong-tenant guard t…
Jun 29, 2026
ff1eab3
merge(agents/gap-auth-bug1): fix guest/B2B cached-account rejection; …
Jun 29, 2026
56f3568
feat(auth/ux): inbuilt owning-app precondition guidance + in-process …
Jun 29, 2026
0e65098
fix(auth/ux): address review — headless-safe interactive defaults + d…
Jun 29, 2026
5d811e4
merge(agents/gap-onboarding-ux): inbuilt owning-app guidance + in-pro…
Jun 29, 2026
5ed132f
feat(crudl): container-type registration delete/get/list, recycle-bin…
Jun 29, 2026
93e4250
feat(crudl): registration-aware project_cleanup teardown ordering
Jun 29, 2026
5c363fe
fix(crudl): address code review (3 should-fix)
Jun 29, 2026
253d813
merge(agents/gap-crudl): container-type registration CRUDL + recycle-…
Jun 29, 2026
808019e
merge origin/feat/spe-mcp-server: integrate Windows dual-stack run-lo…
Jun 29, 2026
9369f1f
chore(dx): multi-root-safe mcp.json path, build:watch script, README …
Jun 29, 2026
0f1fb36
feat(server): add SPE domain primer via MCP instructions field
Jul 6, 2026
3cfe760
merge: SPE domain primer via MCP instructions field (agents/gap-instr…
Jul 6, 2026
cd5b2ad
fix(version): derive SERVER_VERSION and USER_AGENT from package.json …
Jul 8, 2026
4a136f7
fix(policy): guard tool-profile allowlist against inherited keys (WI-05)
Jul 8, 2026
893b8cf
Merge pull request #6 from microsoft/agents/pr3-wi04-version-sot
gnjoseph Jul 8, 2026
5e5b702
Merge pull request #5 from microsoft/agents/pr3-wi05-policy-allowlist
gnjoseph Jul 8, 2026
fadd2b4
chore(pkg): ESRP-compliant homepage/author on microsoft.com domain (W…
Jul 8, 2026
f1329d3
fix(auth): settle in-flight authReadyPromise before reset to prevent …
Jul 8, 2026
173d965
fix(errors): status-code error classification + registration precheck…
Jul 8, 2026
f845acd
Merge pull request #7 from microsoft/agents/pr3-oss-package-config
gnjoseph Jul 8, 2026
cd4bc97
Merge pull request #9 from microsoft/agents/pr3-wi08-error-handling
gnjoseph Jul 8, 2026
0411613
Merge pull request #8 from microsoft/agents/pr3-wi06-auth-hang
gnjoseph Jul 8, 2026
b4c2c7d
docs: remove internal-tool references for OSS publish (WI-01)
Jul 8, 2026
5f4a61d
refactor(tools): standardize arg validation on defineTool + shared Zo…
Jul 8, 2026
1a11e05
Merge pull request #10 from microsoft/agents/pr3-wi01-strip-internal
gnjoseph Jul 8, 2026
d25fdab
Merge pull request #11 from microsoft/agents/pr3-wi07-validation
gnjoseph Jul 8, 2026
ff3de02
fix(cross-platform): guard POSIX perms, named mode consts, OS-agnosti…
Jul 8, 2026
47078f5
docs(dx): debugging guide, correlationId + stderr logging clarity, CL…
Jul 8, 2026
f8533f2
test(quality): explicit types, robust fetch mocking, assertion ration…
Jul 8, 2026
5b42571
Merge pull request #12 from microsoft/agents/pr3-wi25-crossplat
gnjoseph Jul 9, 2026
845decf
Merge pull request #14 from microsoft/agents/pr3-wi26-test-quality
gnjoseph Jul 9, 2026
06899a0
Merge pull request #13 from microsoft/agents/pr3-wi29-readme-dx
gnjoseph Jul 9, 2026
5eeab0f
refactor(tools): extract shared container-type grant logic, DRY + dea…
Jul 9, 2026
faa5936
refactor(graph-client): typed ids/enums, DRY request reuse, clarity d…
Jul 9, 2026
496bc50
feat(auth): clearer login success/error messaging + right-level logs …
Jul 9, 2026
88a4016
Merge pull request #15 from microsoft/agents/pr3-wi32-dry
gnjoseph Jul 9, 2026
009d23e
Merge pull request #16 from microsoft/agents/pr3-wi23-graphtyping
gnjoseph Jul 9, 2026
8fba0f0
Merge pull request #17 from microsoft/agents/pr3-wi14-login-msg
gnjoseph Jul 9, 2026
fb03649
docs(security): humanize SAFE-/SEC- control codes + central legend (W…
Jul 9, 2026
07105ae
docs(jsdoc): document auth/policy/index functions + policy rationale …
Jul 9, 2026
a910533
feat(provision): live step logging + partial-steps on mid-flow failur…
Jul 9, 2026
5d1d56e
Merge pull request #19 from microsoft/agents/pr3-wi28-jsdoc
gnjoseph Jul 9, 2026
d6f47f3
Merge pull request #18 from microsoft/agents/pr3-wi27-safecodes
gnjoseph Jul 9, 2026
d7fbed9
Merge pull request #20 from microsoft/agents/pr3-wi16-progress2
gnjoseph Jul 9, 2026
4f4c3ea
fix(tools): clearer app-create idempotency + actionable provisioning …
Jul 9, 2026
24d22b4
Merge pull request #21 from microsoft/agents/pr3-wi19-toolset
gnjoseph Jul 9, 2026
f55bc1e
docs(http-client): clarify outbound-HTTP role (not MCP transport) + d…
Jul 9, 2026
0edeffb
poc(types): adopt official Graph FileStorageContainer type for Contai…
Jul 9, 2026
ebc08d2
Merge pull request #22 from microsoft/agents/pr3-wi31-httpclient
gnjoseph Jul 9, 2026
fec389e
docs(types): clarify Required<Pick> keeps null on NullableOption fiel…
Jul 9, 2026
2a6a21e
refactor(types): single BillingClassification union (WI-30)
Jul 9, 2026
b9cb3e4
Merge pull request #25 from microsoft/agents/pr3-wi30-enum
gnjoseph Jul 9, 2026
bc6a730
refactor(auth): shared logger, AuthConfig to types, inline ensureCach…
Jul 9, 2026
e2e91cf
Merge pull request #26 from microsoft/agents/pr3-wi15-dry
gnjoseph Jul 9, 2026
d6f5a3a
Merge pull request #23 from microsoft/agents/pr3-wi22-poc-graphtypes
gnjoseph Jul 9, 2026
ab4c56e
chore: set mcpName/server.json name to com.microsoft/sharepointembedd…
gnjoseph Jul 9, 2026
e71cb2e
feat(auth): always-ask app selection with per-session confirmation ga…
Jul 9, 2026
ad9edd2
docs: reference PR #3 review id (r-appgate) instead of internal label…
gnjoseph Jul 9, 2026
7cadc57
Merge pull request #28 from microsoft/agents/pr3-appgate
gnjoseph Jul 9, 2026
8ac098f
Merge pull request #27 from microsoft/agents/pr3-mcpname-esrp
gnjoseph Jul 9, 2026
0c250d4
refactor(types): adopt official @microsoft/microsoft-graph-types for …
Jul 9, 2026
6f51252
docs: neutral wording for Graph-type derivation comments
gnjoseph Jul 9, 2026
9f69e4f
Merge pull request #29 from microsoft/agents/pr3-graphB
gnjoseph Jul 9, 2026
bcb480d
feat(provision): financial-safety confirmation before chargeable stan…
gnjoseph Jul 9, 2026
fa5a270
fix(provision): scope billing-confirm skip to same target + fail-clos…
gnjoseph Jul 9, 2026
3c5af1d
Merge pull request #30 from microsoft/agents/pr3-wi20-billing
gnjoseph Jul 9, 2026
a0fe184
fix(samples): map SWA-unsupported deploy regions to a supported region
Jul 9, 2026
273a505
fix(provision): validate Syntex region before creating a standard con…
gnjoseph Jul 9, 2026
e92ea38
test: cover container_type_create region guard (reject unsupported + …
gnjoseph Jul 9, 2026
27084e9
Merge pull request #31 from microsoft/agents/pr3-region-guard
gnjoseph Jul 9, 2026
f424d76
feat(elicitation): use native MCP elicitation for app/billing/context…
Jul 9, 2026
9fe61e1
feat(auth): intent-based least-privilege scopes and opt-in app-only g…
Jul 9, 2026
4b38390
refactor(elicitation): gate native path on form capability + clarify …
gnjoseph Jul 9, 2026
473e39a
Merge pull request #32 from microsoft/agents/pr3-native-elicit
gnjoseph Jul 9, 2026
73341e2
fix(auth): tighten WI-09 review nits — 404-only read-merge + accurate…
gnjoseph Jul 9, 2026
fd571e9
Merge pull request #33 from microsoft/agents/pr3-wi09-scopes
gnjoseph Jul 9, 2026
a7c5743
fix(provision): reconcile ownerScope elicitation with native MCP elic…
gnjoseph Jul 9, 2026
a1efef2
feat(provision): guided inline subscription/resource-group selection …
Jul 9, 2026
95c4f21
Merge pull request #34 from microsoft/agents/pr3-wi17-guided
gnjoseph Jul 9, 2026
cd94b10
feat(auth): non-blocking guest-account warnings (sign-in + container-…
Jul 9, 2026
e768677
Merge pull request #35 from microsoft/agents/pr3-wi11-guest
gnjoseph Jul 9, 2026
5101f1a
refactor(types): adopt official beta Graph types for container-type c…
Jul 9, 2026
d7a4d9d
feat(onboarding): admin-consent link + bring-your-own-app guidance + …
Jul 9, 2026
a4055d8
docs: note ContainerTypeRegistration is intentionally retained though…
gnjoseph Jul 9, 2026
1694346
Merge pull request #36 from microsoft/agents/pr3-graphC
gnjoseph Jul 9, 2026
e6ec51e
Merge pull request #37 from microsoft/agents/pr3-wi24-consent
gnjoseph Jul 9, 2026
244283b
fix(auth): align device-code timeout to the ~15-min code lifetime + d…
Jul 9, 2026
67b7c14
fix(auth): clamp device-code cancel delay to a sane upper bound
gnjoseph Jul 9, 2026
9113292
Merge pull request #38 from microsoft/agents/pr3-wi13-devicecode
gnjoseph Jul 9, 2026
11a3e6d
feat(data-dir): per-instance data directory (--data-dir / SPE_DATA_DI…
Jul 9, 2026
dfefaaa
fix(data-dir): address code + security review findings (PR #39)
Jul 9, 2026
1839816
docs(changelog): add 0.2.0-alpha.1 entry for --data-dir + secure-fs h…
Jul 9, 2026
63f34ff
feat(sample): modern visual refresh for the React SPA reference app
Jul 9, 2026
960a0bc
fix: address code-review follow-up nits (confirm-stamp ordering, gate…
Jul 9, 2026
8e83795
Merge pull request #41 from microsoft/agents/pr3-followups
gnjoseph Jul 9, 2026
1b75869
Merge pull request #24 from microsoft/agents/pr3-swa-region-fix
gnjoseph Jul 9, 2026
aec8ac4
Merge pull request #39 from microsoft/agents/pr3-data-dir
gnjoseph Jul 9, 2026
68a4982
Merge pull request #40 from microsoft/agents/refapp-visual-refresh
gnjoseph Jul 9, 2026
b3eb6f8
docs: add CELA MCP notices, PRIVACY, and data-flow doc
Jul 10, 2026
85080d8
Rename npm package to @microsoft/spe-mcp; add README docs cross-link
Jul 10, 2026
5267001
Merge pull request #44 from microsoft/agents/spe-mcp-pkg-rename
gnjoseph Jul 10, 2026
6b00392
Merge remote-tracking branch 'origin/feat/spe-mcp-server' into agents…
Jul 10, 2026
14450df
Merge pull request #43 from microsoft/agents/cela-mcp-notices
gnjoseph Jul 10, 2026
17aa32e
chore: update Node support to 22/24/26
Jul 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Normalize line endings to LF in the repository for all text files.
# Prevents CRLF churn across Windows/macOS/Linux contributors.
* text=auto eol=lf

# Explicitly binary (no EOL normalization) for common binary assets.
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.ico binary
*.pdf binary
2 changes: 2 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# <!-- The @microsoft/sharepoint-embedded team handle must be confirmed by the repo owner. -->
* @microsoft/sharepoint-embedded
17 changes: 17 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
version: 2
updates:
- package-ecosystem: npm
directory: /
schedule:
interval: weekly
open-pull-requests-limit: 5
commit-message:
prefix: deps

- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
open-pull-requests-limit: 5
commit-message:
prefix: ci
33 changes: 33 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: CI

on:
pull_request:
push:
branches:
- main
- feat/**

permissions:
contents: read

jobs:
build-test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node-version:
- 22.x
- 24.x
- 26.x
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: npm
- run: npm ci
- run: npm run lint
- run: npm run typecheck
- run: npm run build
- run: npm test
45 changes: 45 additions & 0 deletions .github/workflows/security.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: Security

on:
pull_request:
push:
branches:
- main
schedule:
- cron: '0 12 * * 1'

permissions:
contents: read

jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 24.x
cache: npm
- run: npm ci
- run: npm audit --audit-level=high

secrets:
runs-on: ubuntu-latest
env:
GITLEAKS_LICENSE: ${{ secrets.GITLEAKS_LICENSE }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
# gitleaks-action@v2 requires a GITLEAKS_LICENSE when run under a GitHub
# organization (free only for personal accounts). Until the owner
# provisions the secret, this step is skipped so the workflow stays green;
# it is also continue-on-error as a belt-and-suspenders. Owner action:
# add GITLEAKS_LICENSE (or switch to GitHub Advanced Security secret
# scanning, which is available org-wide) — see SECURITY.md.
- name: Scan for secrets (gitleaks)
if: ${{ env.GITLEAKS_LICENSE != '' }}
continue-on-error: true
uses: gitleaks/gitleaks-action@v2
env:
GITLEAKS_ENABLE_COMMENTS: "false"
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
node_modules/
dist/
coverage/
*.tgz

# Sample app build outputs (the sample SOURCES under samples/ are committed)
samples/**/bin/
samples/**/obj/
samples/**/.publish/
15 changes: 15 additions & 0 deletions .vscode/mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
// SPE MCP server for this repo. Bootstrap mode uses your Azure CLI sign-in,
// so no Entra app is required:
// 1. az login --allow-no-subscriptions
// 2. npm run build
// 3. Click the 'Start' CodeLens above the "spe" entry below.
// Then ask Copilot Chat things like "List my SPE container types".
"servers": {
"spe": {
"type": "stdio",
"command": "node",
"args": ["${workspaceFolder:SharePoint-Embedded-MCP-Server}/dist/cli.js", "start"]
}
}
}
34 changes: 34 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Changelog

All notable changes to this project will be documented in this file. The format
is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this
project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.2.0-alpha.1]

### Added

- **Per-instance data directory.** New `--data-dir <path>` flag and `SPE_DATA_DIR`
environment variable select where the provisioning `state.json` and MSAL token
cache are stored (precedence: flag > env > default `~/.spe-mcp`). Point each
server instance at a unique directory to run multiple instances (e.g. two
tenants, or a published build alongside a local build) without clobbering
shared state. Applies uniformly to `start`, `auth`, and `logout`. The default
path is unchanged and byte-identical to prior releases.

### Security

- **Fail-closed credential/state file handling.** The data directory and token
cache files are now validated fail-closed: a symlinked, foreign-owned, or
group/other-accessible directory is refused (POSIX `0o700`); an off-`%USERPROFILE%`
Windows override is given an owner-only DACL or refused. Reads and writes use
`O_NOFOLLOW` + `fstat` fd verification and `fchmod` the descriptor (never the
path) to defeat symlink/TOCTOU swaps. A caller-supplied `--data-dir` must be an
absolute (or `~/`-relative) path; CWD-relative paths are rejected so credentials
can never be written into a working directory. On an insecure/unverifiable
target, refresh-token persistence is skipped (forcing a fresh interactive
sign-in) rather than writing a token to an unsafe location.

## [0.1.0]

Initial release.
10 changes: 10 additions & 0 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Microsoft Open Source Code of Conduct

This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).

Resources:

- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)
- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns
- Employees can reach out at [aka.ms/opensource/moderation-support](https://aka.ms/opensource/moderation-support)
44 changes: 44 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Contributing to SharePoint Embedded MCP Server

Thank you for your interest in contributing! This project welcomes contributions and
suggestions.

## Contributor License Agreement

Most contributions require you to agree to a Contributor License Agreement (CLA)
declaring that you have the right to, and actually do, grant us the rights to use your
contribution. For details, visit <https://cla.opensource.microsoft.com>.

When you submit a pull request, a CLA bot will automatically determine whether you need
to provide a CLA and decorate the PR appropriately (e.g., status check, comment). Simply
follow the instructions provided by the bot. You will only need to do this once across
all repositories using our CLA.

## How to contribute

1. Fork the repository and create your branch from `main`.
2. Install dependencies: `npm install`.
3. Make your change. Add or update tests alongside the code (`src/**/*.test.ts`).
4. Validate locally: `npm run ci` (typecheck + test + build).
5. Open a pull request describing the change and its motivation.

## Code style

- TypeScript, ES modules, strict mode. Run `npm run lint` and `npm run typecheck`
before opening a PR.
- Each tool is a `{ name, description, inputSchema, handler }` export — see
"Adding New Tools" in the [README](README.md).

## Code of Conduct

This project has adopted the
[Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
For more information see the
[Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact
[opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or
comments.

## Reporting security issues

Please report security issues privately as described in [SECURITY.md](SECURITY.md). Do
not file public GitHub issues for security vulnerabilities.
23 changes: 23 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
MIT License

SharePoint Embedded MCP Server

Copyright (c) Microsoft Corporation.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
57 changes: 57 additions & 0 deletions PRIVACY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Privacy

`@microsoft/spe-mcp` ("the tool") is an open-source Model Context Protocol (MCP)
server that you run **locally** to manage **your own** SharePoint Embedded, Microsoft Graph,
and Azure resources. This notice explains what the tool does and does not do with data. It is
provided for transparency and does not replace the
[Microsoft Privacy Statement](https://privacy.microsoft.com/privacystatement) or your
organization's agreements with Microsoft.

## What the tool collects and sends

**The tool does not collect telemetry or usage analytics, and it opens no dedicated channel
to send data to Microsoft.** Specifically:

- **No telemetry channel.** The tool does not implement application telemetry and does not
"phone home." Diagnostic logs are written to the local process's **stderr only**, with
tokens and secrets redacted (`src/logging.ts`), and are never transmitted by the tool.
- **Authentication against your tenant.** You sign in with your own Microsoft Entra identity
via [MSAL](https://learn.microsoft.com/entra/identity-platform/msal-overview). Access and
refresh tokens are cached **locally** with owner-only file permissions (control
**SEC-003**). The tool does not send your tokens anywhere other than the standard Microsoft
authentication and API calls you initiate.
- **API calls you initiate.** When you invoke a tool, the server calls Microsoft first-party
endpoints — Microsoft Graph and Azure Resource Manager — **on your behalf**, in **your**
tenant and subscription. The content and directory data involved flow between your machine
and those Microsoft services; the tool adds no additional recipients.
- **Product `User-Agent`.** Outbound Graph/ARM requests are stamped with a static
`User-Agent` of the form `spe-mcp-server/<version>` (`src/user-agent.ts`). It contains
**no personal, tenant, or usage information** and exists only so the service can measure
aggregate traffic driven by this tool. It is a request header on calls you already make —
not a separate data feed.

See [docs/DATA-FLOW.md](docs/DATA-FLOW.md) for the full list of network endpoints and what
travels to each.

## Service-side data handling

Microsoft Graph, Azure, and SharePoint Embedded are Microsoft Online Services. Any data you
create or access through them is handled under the
[Microsoft Product Terms](https://www.microsoft.com/licensing/terms/), the
[Microsoft Products and Services Data Protection Addendum (DPA)](https://www.microsoft.com/licensing/docs/view/Microsoft-Products-and-Services-Data-Protection-Addendum-DPA),
and the [Microsoft Privacy Statement](https://privacy.microsoft.com/privacystatement),
according to your tenant's configuration (including any **EU Data Boundary** commitments).
This tool does not change that handling.

## Third-party MCP clients

You connect the tool to an MCP client (for example VS Code, Claude Desktop, or Cursor). The
prompts you type and the data the client displays are handled under **that client's** privacy
terms, which are outside the control of this project.

## Turning it off

Because the tool has no telemetry channel, there is nothing to opt out of. To further limit
outbound calls you can run with `--read-only` (no mutating operations) or `--tools` (restrict
the exposed tool set, including the optional Microsoft Learn documentation lookup). See
[docs/DATA-FLOW.md](docs/DATA-FLOW.md) and [docs/SECURITY-CONTROLS.md](docs/SECURITY-CONTROLS.md).
Loading
Loading