Manage Microsoft Planner tasks, buckets, and plans by interacting with the Microsoft Graph API.
Also known as mspstack/mcp-planner, mcp-planner
- Stars
- 4
- Tools
- 12
- Downloads, 30 days
- —
- Latest version
- 0.4.0
- Last commit
- Aug 31, 2026
- License
- MIT
What is Microsoft Planner MCP?
Microsoft Planner manages Microsoft Planner tasks, buckets, and plans by interacting with the Microsoft Graph API. It exposes 12 tools, such as planner_search_groups, planner_find_user, planner_list_plans.
Summary generated from the project's README
About Microsoft Planner MCP server
Managing Microsoft Planner tasks, buckets, and plans directly from an AI client is what this MCP server enables. It allows developers to interact with the Microsoft Graph API to find Microsoft 365 groups, locate specific users for task assignments, and organize work through plans and buckets. You can create, update, or delete tasks while the server automatically handles ETag concurrency to prevent conflicts during updates.
Users can set this up locally via stdio or remotely using HTTP transport. The server requires an Entra ID app registration with specific permissions like Tasks.ReadWrite.All and GroupMember.Read.All. It supports both application-only authentication using a client secret and delegated mode using a refresh token to act on behalf of a specific user. For advanced needs, an opt-in toolset provides a read-only escape hatch to access other parts of the Graph surface including groups and users.
What you can do with it
- 1Assign tasks to team membersFind a specific user by name and assign them to a new Planner task.
- 2Update task checklistsModify the description of a task or add and check off items in a checklist.
- 3Organize work into bucketsCreate new buckets within an existing plan to categorize tasks.
- 4Audit user workloadsRetrieve a list of every task currently assigned to a specific person across all plans.
Written from the project's README. Every use case is checked against a quote from it.
How to install Microsoft Planner MCP
Formats verified 10 Nov 2026Add to CursorAdd to GooseInstall Microsoft Planner MCP in Claude Code
$ claude mcp add --env 'MS_CLIENT_SECRET=<YOUR_MS_CLIENT_SECRET>' --env 'MS_CLIENT_ID=<MS_CLIENT_ID>' --env 'MS_TENANT_ID=<MS_TENANT_ID>' mcp-planner -- npx -y mcp-plannerInstall Microsoft Planner MCP in Cursor
~/.cursor/mcp.json
{
"mcpServers": {
"mcp-planner": {
"command": "npx",
"args": [
"-y",
"mcp-planner"
],
"env": {
"MS_CLIENT_SECRET": "<YOUR_MS_CLIENT_SECRET>",
"MS_CLIENT_ID": "<MS_CLIENT_ID>",
"MS_TENANT_ID": "<MS_TENANT_ID>"
}
}
}
}Install Microsoft Planner MCP in VS Code
.vscode/mcp.json
{
"servers": {
"mcp-planner": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"mcp-planner"
],
"env": {
"MS_CLIENT_SECRET": "<YOUR_MS_CLIENT_SECRET>",
"MS_CLIENT_ID": "<MS_CLIENT_ID>",
"MS_TENANT_ID": "<MS_TENANT_ID>"
}
}
}
}Install Microsoft Planner MCP in VS Code CLI
$ code --add-mcp '{"name":"mcp-planner","type":"stdio","command":"npx","args":["-y","mcp-planner"],"env":{"MS_CLIENT_SECRET":"<YOUR_MS_CLIENT_SECRET>","MS_CLIENT_ID":"<MS_CLIENT_ID>","MS_TENANT_ID":"<MS_TENANT_ID>"}}'Install Microsoft Planner MCP in Claude Desktop
claude_desktop_config.json
{
"mcpServers": {
"mcp-planner": {
"command": "npx",
"args": [
"-y",
"mcp-planner"
],
"env": {
"MS_CLIENT_SECRET": "<YOUR_MS_CLIENT_SECRET>",
"MS_CLIENT_ID": "<MS_CLIENT_ID>",
"MS_TENANT_ID": "<MS_TENANT_ID>"
}
}
}
}Install Microsoft Planner MCP in Codex
$ codex mcp add mcp-planner --env 'MS_CLIENT_SECRET=<YOUR_MS_CLIENT_SECRET>' --env 'MS_CLIENT_ID=<MS_CLIENT_ID>' --env 'MS_TENANT_ID=<MS_TENANT_ID>' -- npx -y mcp-plannerInstall Microsoft Planner MCP in Codex config.toml
~/.codex/config.toml
[mcp_servers.mcp-planner] command = "npx" args = ["-y", "mcp-planner"] [mcp_servers.mcp-planner.env] MS_CLIENT_SECRET = "<YOUR_MS_CLIENT_SECRET>" MS_CLIENT_ID = "<MS_CLIENT_ID>" MS_TENANT_ID = "<MS_TENANT_ID>"
Install Microsoft Planner MCP in Gemini CLI
$ gemini mcp add -s user -e 'MS_CLIENT_SECRET=<YOUR_MS_CLIENT_SECRET>' -e 'MS_CLIENT_ID=<MS_CLIENT_ID>' -e 'MS_TENANT_ID=<MS_TENANT_ID>' mcp-planner npx -- -y mcp-plannerInstall Microsoft Planner MCP in Gemini settings.json
~/.gemini/settings.json
{
"mcpServers": {
"mcp-planner": {
"command": "npx",
"args": [
"-y",
"mcp-planner"
],
"env": {
"MS_CLIENT_SECRET": "<YOUR_MS_CLIENT_SECRET>",
"MS_CLIENT_ID": "<MS_CLIENT_ID>",
"MS_TENANT_ID": "<MS_TENANT_ID>"
}
}
}
}Microsoft Planner MCP tools 12
Detected from the READMEplanner_search_groupsplanner_find_userplanner_list_plansplanner_get_planplanner_create_bucketplanner_list_tasksplanner_list_user_tasksplanner_get_taskplanner_create_taskplanner_update_taskplanner_update_task_detailsplanner_delete_task
| planner_search_groups | — | |
| planner_find_user | — | |
| planner_list_plans | — | |
| planner_get_plan | — | |
| planner_create_bucket | — | |
| planner_list_tasks | — | |
| planner_list_user_tasks | — | |
| planner_get_task | — | |
| planner_create_task | — | |
| planner_update_task | — | |
| planner_update_task_details | — | |
| planner_delete_task | — |
Configuration
MS_CLIENT_SECRETRequiredSecretEntra app registration client secret (app needs Tasks.ReadWrite.All, GroupMember.Read.All, User.Read.All application permissions)
MS_CLIENT_IDRequiredEntra app registration client id
MS_TENANT_IDRequiredMicrosoft Entra ID tenant id (GUID or domain)
PLANNER_ADVANCED_TOOLSETtrue/1 registers the advanced toolset (graph_get, graph_find_endpoint) — a read-only escape hatch limited to /planner, /groups, /users
| Name | Description | |
|---|---|---|
| MS_CLIENT_SECRET | Entra app registration client secret (app needs Tasks.ReadWrite.All, GroupMember.Read.All, User.Read.All application permissions) | RequiredSecret |
| MS_CLIENT_ID | Entra app registration client id | Required |
| MS_TENANT_ID | Microsoft Entra ID tenant id (GUID or domain) | Required |
| PLANNER_ADVANCED_TOOLSET | true/1 registers the advanced toolset (graph_get, graph_find_endpoint) — a read-only escape hatch limited to /planner, /groups, /users |
Automated checks
Ran Nov 13, 2026Full report →Passed our automated checks. That is not a security audit: read the code and give the server the narrowest access it needs. How checks work
- Source repository linked and reachablemspstack/mcp-planner is public and reachablegithub.com/mspstack/mcp-planner ↗Pass
- Package names this repository as its sourcemcp-planner names mspstack/mcp-planner as sourcenpmjs.com/package/mcp-planner ↗Pass
- Build provenance (Sigstore attestation)Sigstore attestation for mcp-plannernpmjs.com/package/mcp-planner/v/0.4.0#provenance ↗Pass
- Open source license (OSI)MITspdx.org/licenses/MIT.html ↗Pass
- Commit or release in the last yearLast commit or release 2026-08-31github.com/mspstack/mcp-planner ↗Pass
- OpenSSF ScorecardNot checked
- Package name not close to a popular packageNo popular package one edit away from mcp-plannerPass
- No critical advisory in the package or its dependencies99 resolved dependencies checked; no critical advisoryosv.dev ↗Pass
- No hidden instructions to the model12 tool descriptions and the README read; no override phrases, credential paths or hidden charactersPass
- Destructive tools are labelledNo tool named like delete, drop or execPass
- Remote endpoint answers the MCP handshakeNot checked
README
View on GitHubmcp-planner
MCP server for Microsoft Planner via the Microsoft Graph API. Find groups and plans, list buckets and tasks, and create, update, assign, complete, or delete tasks — including descriptions and checklists — with Planner's ETag concurrency handled automatically.
Sibling project to mcp-itglue and mcp-connectwise-psa — same architecture.
Tools
| Tool | Description |
|---|---|
planner_search_groups |
Find Microsoft 365 groups (Teams) by name → group ID |
planner_find_user |
Find a user by name/UPN → user ID for assignments |
planner_list_plans |
List plans owned by a group |
planner_get_plan |
Plan + its buckets |
planner_create_bucket |
Create a bucket in a plan |
planner_list_tasks |
Tasks in a plan or bucket (filter by assignee, open/completed) |
planner_list_user_tasks |
All tasks assigned to a user, across plans |
planner_get_task |
Task with description and checklist |
planner_create_task |
Create task (bucket, due date, priority, assignees, description) |
planner_update_task |
Update title/bucket/due/priority/progress/assignees |
planner_update_task_details |
Update description; add or (un)check checklist items |
planner_delete_task |
Permanently delete a task |
graph_find_endpoint † |
Search a curated catalog of the /planner, /groups, /users Graph surface |
graph_get † |
Read-only GET for any Graph v1.0 path under /planner, /groups, /users |
† Advanced toolset (opt-in, off by default) — an escape hatch for Graph surface the curated tools don't wrap. Enable with PLANNER_ADVANCED_TOOLSET=true or --advanced. graph_get is verb-locked to GET, rejects /beta, and only reaches the three path prefixes above, so a shared app registration's other permissions (e.g. mail) stay out of reach.
Setup
1. Entra ID app registration
- Entra admin center → App registrations → New registration
- API permissions → Application permissions → add
Tasks.ReadWrite.All,GroupMember.Read.All,User.Read.All→ Grant admin consent - Certificates & secrets → New client secret — note the value
2. Run
MS_TENANT_ID=<tenant> MS_CLIENT_ID=<client-id> MS_CLIENT_SECRET=<secret> npx -y mcp-planner
Claude Code:
claude mcp add planner --env MS_TENANT_ID=<tenant> --env MS_CLIENT_ID=<client-id> --env MS_CLIENT_SECRET=<secret> -- npx -y mcp-planner
HTTP mode
npx -y mcp-planner --transport http --port 3000
Sessions authenticate per-request (BYOK) with x-ms-tenant-id + x-ms-client-id plus either x-ms-client-secret (app-only) or x-ms-refresh-token (delegated — see below), or fall back to the MS_* environment credentials when set. When both a secret and a refresh token arrive, the refresh token wins (header-overlay proxies can add but not remove headers). Health probe at GET /health.
Delegated mode — act as the signed-in user
App-only sessions act as the app registration; delegated sessions act as a user: their Planner permissions apply and every write is attributed to them.
- A separate, public app registration: Authentication → Allow public client flows → Yes; API permissions → Delegated
Tasks.ReadWrite,Group.Read.All,User.ReadBasic.All(+ admin consent where the tenant requires it). - Each user signs in once via the device-code helper and keeps the printed refresh token:
node scripts/device-login.mjs --tenant <tenant-id> --client <public-client-id>
- Use
MS_REFRESH_TOKENinstead ofMS_CLIENT_SECRET(stdio), or thex-ms-refresh-tokenheader (HTTP). Behind the MCP gateway, register it as a personal credential (fieldx-ms-refresh-token).
The refresh token is a secret — it acts as you — and stays valid ~90 days past its last use; re-run the helper when it expires.
Docker
docker build -t mcp-planner .
docker run -p 3000:3000 -e MS_TENANT_ID=... -e MS_CLIENT_ID=... -e MS_CLIENT_SECRET=... mcp-planner
Access model
No MCP-level role gating: the Entra app registration's granted Graph permissions are the access control. Point sessions at different app registrations (BYOK headers) to scope what they can do.
Notes
- Planner requires an
If-MatchETag on every update/delete — the tools fetch the current resource and pass its ETag automatically. On a 412 (concurrent change), just retry. - Priority mapping: urgent=1, important=3, medium=5, low=9 (Graph uses 0–10).
- Progress: not started (0), in progress (50), completed (100).
Development
npm install
npm run dev # stdio
npm run dev:http # http
npm test
npm run build
npm run bundle # Claude Desktop .mcpb
License
MIT
Microsoft Planner MCP questions
How do I add Microsoft Planner MCP to Claude Code?
Run claude mcp add --env 'MS_CLIENT_SECRET=<YOUR_MS_CLIENT_SECRET>' --env 'MS_CLIENT_ID=<MS_CLIENT_ID>' --env 'MS_TENANT_ID=<MS_TENANT_ID>' mcp-planner -- npx -y mcp-planner in your terminal. Add --scope user to make it available in every project.
How do I add Microsoft Planner MCP to Cursor?
Open ~/.cursor/mcp.json and add the server under mcpServers, using the Cursor config shown in the install section above.
What tools does Microsoft Planner MCP provide?
It exposes 12 tools, including planner_search_groups, planner_find_user, planner_list_plans, planner_get_plan, planner_create_bucket.
How does the server handle concurrency in Microsoft Planner?
The server automatically handles Planner's ETag concurrency by fetching the current resource and passing its ETag during updates or deletions.
What permissions are required for the Entra ID app registration?
You need to add Application permissions for Tasks.ReadWrite.All, GroupMember.Read.All, and User.Read.All, then grant admin consent.