Microsoft Planner MCP
About
An MCP server that connects AI assistants to Microsoft Planner. Entra ID authenticated for enterprise grade on-behalf-of user authentication.
Details
- Author
- aixolotl
- Categories
- Productivity, Project Management
Jump to
Setup
Install Microsoft Planner MCP in your MCP client (Claude Desktop, Cursor, Windsurf, and others).
Repository: https://github.com/aixolotl/microsoft-planner-mcp
Follow the installation instructions in the repository README, then restart your MCP client.
An unofficialMCPserver that connects AI assistants toMicrosoft Planner. Ask your AI assistant to create tasks, organise plans, manage buckets, and more, all through natural language.
This is an unofficial, community/open-source MCP server for Microsoft Planner.
It is not affiliated with, endorsed by, or sponsored by Microsoft.
Built withFastMCPand authenticated viaMicrosoft Entra ID(Azure AD) using the On-Behalf-Of (OBO) flow to callMicrosoft Graph.
- What Can It Do?
- Prerequisites
- Azure Entra ID Setup
- Installation
- Configuration
- Running the Server
- Connecting an MCP Client
- Available Tools
- Development
- Contributing
- License
- Security
Once connected, you can ask your AI assistant things like:
- "Show me all my Planner tasks that are overdue"
- "Create a task called 'Prepare Q3 report' in the Marketing plan"
- "Move all incomplete tasks in the Sprint bucket to the Backlog bucket"
- "Mark the 'Update docs' task as complete"
The AI assistant translates your request into the appropriate tool calls automatically.
Note: This MCP only supports Planner basic tasks and plans
- AMicrosoft 365account with access to Microsoft Planner
- AnAzure Entra ID(Azure AD) app registration (seeAzure Setupbelow)
- An MCP-compatible client — for example:
To run the server locally you also need:
- Python 3.12+
- uv(Python package manager)
An Azure app registration is required so the server can authenticate users and call Microsoft Graph on their behalf. You need admin access to an Azure Entra ID tenant (or ask your IT administrator).
- Go to theAzure Portal→Microsoft Entra ID→App registrations→New registration
- Enter a name (e.g.Microsoft Planner MCP)
- UnderSupported account types, choose the option appropriate for your organisation
- Set theRedirect URItoWeb→http://localhost:8000/auth/callback
- ClickRegister
- In your new app registration, go toAPI permissions→Add a permission→Microsoft Graph→Delegated permissions
- Add these permissions:
- Tasks.ReadWrite— read and write Planner tasks
- User.Read— read the signed-in user's profile
- User.ReadBasic.All— resolve user display names from the GUIDs in task assignments (required only forlist_userstool)
- Go toExpose an API
- Set theApplication ID URI(accept the defaultapi://<client-id>or customise it)
- ClickAdd a scope:
- Scope name:mcp-access
- Who can consent:Admins and users(orAdmins onlyif you prefer)
- Fill in the display name and description
- Set state toEnabled
- Go toManifest(orAuthentication→Advanced settingsin newer portal versions)
- Set"requestedAccessTokenVersion"to2
- Save
- Go toCertificates & secrets→New client secret
- Add a description and choose an expiry period
- Copy theValueimmediately (it is only shown once)
You will need these three values for configuration:
git clone https://github.com/aixolotl/microsoft-planner-mcp cd microsoft-planner-mcp uv sync
No Python installation needed. SeeRunning with Dockerbelow.
Copy the example environment file and fill in your Azure credentials:
# Azure App Registration (required) CLIENT_ID=your-app-client-id CLIENT_SECRET=your-app-client-secret TENANT_ID=your-azure-tenant-id # Public URL of this server (used for OAuth redirect URI) BASE_URL=http://localhost:8000 # JSON-encoded list of allowed CORS origins # Include http://localhost:6274 if using MCP Inspector for testing ALLOWED_ORIGINS=["http://localhost:8000","http://localhost:6274"] # Require FastMCP's extra client consent prompt per MCP client. (default: true) # Prevents confused-deputy attacks by requiring users to explicitly approve each new # client. Keep true in production; set false only for local dev with throwaway # clients. # REQUIRE_AUTHORIZATION_CONSENT=true # Optional rate-limit overrides (per client sliding window) # Defaults are 120 requests per 1 minute # RATE_LIMIT_MAX_REQUESTS=120 # RATE_LIMIT_WINDOW_MINUTES=1
REQUIRE_AUTHORIZATION_CONSENTcontrols whether FastMCP prompts users to explicitly approve each new MCP client. Keep thistrue(default) in production to prevent confused-deputy attacks; set it tofalseonly during local development with throwaway clients.
RATE_LIMIT_MAX_REQUESTSandRATE_LIMIT_WINDOW_MINUTESare optional and should stay commented out unless you need to override the defaults for your environment.
uv run uvicorn src.server:app --host 0.0.0.0 --port 8000
The MCP endpoint is available athttp://localhost:8000/mcp. A health check endpoint is athttp://localhost:8000/health.
# Pull the latest image docker pull ghcr.io/aixolotl/microsoft-planner-mcp:latest # Run with environment variables docker run --rm -i \ -e BASE_URL=https://localhost:8000 \ -e CLIENT_ID=your_client_id \ -e CLIENT_SECRET=your_api_token \ -e TENANT_ID=your_tenant_id \ -e ALLOWED_ORIGINS=["http://localhost:8000","http://localhost:6274", "http://localhost:3000"] \ -e REQUIRE_AUTHORIZATION_CONSENT=true \ ghcr.io/aixolotl/microsoft-planner-mcp:latest
This starts the MCP server on port 8000. To override rate limits, also pass-e RATE_LIMIT_MAX_REQUESTS=<value>and-e RATE_LIMIT_WINDOW_MINUTES=<minutes>(defaults:120and1).
This starts the MCP server on port 8000. The Docker Compose configuration also includes aJaegerinstance for trace visualisation (seeOpenTelemetry Tracing).
Once the server is running, configure your MCP client to connect to it.
Add the following to your VS Code settings (.vscode/settings.jsonin your project, or your user settings):
{ "mcp": { "servers": { "planner": { "type": "http", "url": "http://localhost:8000/mcp" } } } }
Then use Copilot Chat inAgent modeand ask it to interact with your Planner tasks. Copilot will discover the available tools automatically.
Any client that supports theStreamable HTTPtransport can connect by pointing tohttp://localhost:8000/mcp. The server advertises OAuth metadata automatically — the client handles the authentication flow.
All tools are available to your AI assistant automatically once connected. You don't need to call them directly — just describe what you want in natural language. The parameter details below are provided for reference and for client developers.
Read-only tools are annotated withreadOnlyHint: trueso clients can skip confirmation prompts. Destructive tools (deletes) are annotated withdestructiveHint: true.
Return the authenticated user's profile from Microsoft Graph.
- Parameters:None
- Returns:User profile object (id, displayName, mail, etc.) ornull
Retrieve Microsoft 365 users by GUID, e-mail address, or free-text search. Useful for resolving the user GUIDs returned in task assignment objects to display names.
Note:When bothguids/emailsandsearchare supplied, the GUID/email filter takes priority. Very large lists of GUIDs or e-mail addresses are silently truncated to stay within the 2 048-character Graph URL limit.
List all Microsoft 365 groups the authenticated user is a member of.
Note:The Groups tool will not return details like name or mail of groups with the standard permissionsTasks.ReadWritedocumented here,howeversearching and filtering still works, so you can find a group with a specific name using this tool.
List Planner plans shared with the authenticated user.
List all Planner plans belonging to a Microsoft 365 group.
Create a new Planner plan for a Microsoft 365 group.
- Returns:The created plan object ornull
Get category label definitions for a Planner plan. Returns all 25 category slots with their key (e.g.category1) and display name.
- Returns:List of category objects (key,display_name) ornull
- Returns:The created bucket object ornull
List all Planner tasks assigned to the authenticated user across all plans.
Get the full details for a task: description, checklist items, and external references.
- Returns:Task details object (description, checklist, references) ornull
- Returns:The created task object ornull
Update a task's standard fields and/or detail fields (description, checklist, references). Only provided fields are changed. When detail fields are specified, a separate API call updates the task details resource automatically.
- Returns:The updated task object, the updated task details object, or both ({ "task": ..., "details": ... }) depending on which fields were provided. Returnsnullif the result is empty.
Note:Theupdate_task_detailstool has been removed. Useupdate_taskwith detail field parameters (description,checklistItems,references,previewType) instead. The task and details resources have separate ETags — provideetagDetailswhen available to avoid an extra round-trip, or omit it to let the tool auto-refresh.
Return metadata for every field on a Planner task, including its data type, description, whether it is writable, and whether it requires a separateget_task_detailscall.
- Parameters:None
- Returns:List of field metadata objects (name,type,description,writable,detailed)
Note:The list of fields is static as Planner Standard doesn't support custom fields. But this endpoint awaits Microsoft's future updates to the API to fully support Planner Premium.
This section covers building, testing, and contributing to the project.
src/ ├── server.py # FastMCP app, middleware, route mounting ├── config.py # Settings via pydantic-settings ├── auth_provider.py # Azure OAuth provider (OBO flow) ├── deps.py # Shared dependency helpers ├── graph_client_manager.py # Singleton GraphClientManager with per-user OBO clients ├── telemetry.py # OpenTelemetry setup ├── types.py # Shared structural types ├── services/ │ └── planner_service.py # Business logic wrapping Graph SDK calls └── tools/ ├── me.py # get_me ├── groups.py # list_my_groups ├── plans.py # plan tools + list_plan_categories ├── tasks.py # task tools + list_task_fields └── buckets.py # bucket tools tests/ ├── conftest.py ├── test_buckets_tool.py ├── test_groups_tool.py ├── test_planner_service.py ├── test_plans_tool.py └── test_tasks_tool.py
The server is built withFastMCPand uses these key patterns:
Server composition— Tools are split into five domain routers (me,groups,plans,tasks,buckets), each a standaloneFastMCPinstancemountedon the main app. This keeps each domain's tools, imports, and tests isolated.
Authentication— The server uses FastMCP'sOAuthProxypattern via a customAzureProvider. Azure Entra ID does not support Dynamic Client Registration (DCR), so the provider acts as a DCR-compliant proxy facing MCP clients while using the pre-registered app credentials with Azure. When a tool call arrives, the server exchanges the MCP session token for a Microsoft Graph token via theOn-Behalf-Of flow, scoped toTasks.ReadWriteandUser.Read.
Middleware— Fivebuilt-in middlewarelayers are stacked on the server (outermost first):
Client logging— Every tool sends real-time progress messages to the MCP client viaget_optional_context(), so users see status updates like"Fetching tasks…"and"Found 12 task(s)"in their client.
The server includes nativeOpenTelemetry instrumentationwith zero overhead when unused. To enable trace export:
# Install the optional OTEL dependency group uv sync --group otel # Set the OTLP endpoint and start the server export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317 export OTEL_SERVICE_NAME=microsoft-planner-mcp uv run uvicorn src.server:app --host 0.0.0.0 --port 8000
MCP Inspectorlets you test tools interactively in a browser:
uv run uvicorn src.server:app --host 0.0.0.0 --port 8000
Open the URL printed in the terminal (e.g.http://localhost:6274/?MCP_PROXY_AUTH_TOKEN=...)
SetTransport TypetoStreamable HTTPandURLtohttp://localhost:8000/mcp, then clickConnect.
Contributions are welcome! Please open an issue or submit a pull request. See theissue templatesfor bug reports, feature requests, and tasks.
This project is licensed under theMIT License.
Interact with task, doc, and project data in Dart, an AI-native project management tool
Remote MCP server for MeisterTask. Create and manage projects, tasks, and notes from your AI assistant. Hosted (streamable-HTTP) — connect at https://mcp.meistertask.com/mcp
The official Plane MCP server provides integration with Plane APIs, enabling full AI automation of Plane projects, work items, cycles and more.
Keep teams & agents coordinated automatically
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.



