get_meLABSCO SUMMARY
The consent prompt is on by default, and that is the right default.
Requiring each new client to be explicitly approved is a deliberate defence against a confused-deputy problem, and it costs one click. The tool annotations are the other quiet quality signal: reads are marked so clients stop asking, deletes are marked so clients keep asking. Scope note worth knowing up front — basic Planner tasks and plans only.
What it is
An MCP server over Microsoft Planner via the Graph API. You register an Azure Entra ID application, and the server handles the OAuth flow, so an assistant can list what is overdue, create a task in the right plan, move work between buckets and mark things complete. Read-only tools carry readOnlyHint: true so clients can skip confirmation, and deletes carry destructiveHint: true so they do not.
What you get
- The signed-in user's profile, and Microsoft 365 users resolved by GUID, email or free-text search — which is what turns an assignment GUID into a name —
get_me,list_users - The groups you belong to, since a Planner plan is owned by an M365 group —
list_my_groups - Plans listed for you or for a group, created, and deleted with an ETag —
list_my_plans,list_group_plans,create_plan,delete_plan - Buckets listed and created within a plan —
list_buckets,create_bucket,delete_bucket - Tasks listed across your plans or within one, opened in detail, created, updated and deleted —
list_my_tasks,list_tasks,get_task_details,create_task,update_task,delete_task - The plan's categories and the available task fields, so the agent works from the real schema —
list_plan_categories,list_task_fields - Field selection on most read tools via
select, with*allwhen you want everything
Requirements
A Microsoft 365 account with Planner access and an Azure Entra ID app registration you create yourself — the README walks the six steps, including exposing an API scope and setting the token version. Three values are required: CLIENT_ID, CLIENT_SECRET and TENANT_ID, plus BASE_URL for the OAuth redirect and ALLOWED_ORIGINS as a JSON list. Python 3.12+ with uv, or Docker. REQUIRE_AUTHORIZATION_CONSENT defaults to true and makes each new MCP client be approved explicitly — the README says to keep it that way in production to prevent confused-deputy attacks, and only turn it off for local development with throwaway clients. Rate limiting defaults to 120 requests per 1 minute per client. The server supports Planner basic tasks and plans, not the premium features.
Setup effort
Build from source — git clone https://github.com/aixolotl/microsoft-planner-mcp
USE CASES
Finding out what is overdue across everything
List your tasks across plans and let the assistant sort out which are past due, instead of opening each plan.
Adding a task to the right place
Find the group, then the plan, then the bucket, and create the task where it belongs rather than in a default lane.
Working out who a task is assigned to
Resolve the user GUIDs that come back on assignments into display names and emails in one lookup.
Moving a batch of work between buckets
List the tasks in the source bucket and update each one's bucket, rather than dragging cards individually.
Setting up a plan from a conversation
Create the plan on the owning group, add the buckets it needs, and check which categories and fields exist before filling it.
18 tools
Listed in project docs. Your client may show a different list.
list_userslist_my_groupslist_my_planslist_group_planscreate_plandelete_planlist_plan_categorieslist_bucketscreate_bucketdelete_bucketlist_my_taskslist_tasksget_task_detailscreate_taskupdate_tasklist_task_fieldsdelete_taskBEFORE YOU INSTALL
What to know first
Tools you get
18 tools named in the project's documentation.
Requires
- CLIENT_ID in your environment
- CLIENT_SECRET in your environment
- TENANT_ID in your environment
Where it runs
Both documented clients run the server on your machine.
INSTALLATION
Connect your client
Server setup
git clone https://github.com/aixolotl/microsoft-planner-mcp
cd microsoft-planner-mcp
uv sync
cp .env.example .envEdit .env and set CLIENT_ID, CLIENT_SECRET and TENANT_ID from your Azure app registration, plus BASE_URL and ALLOWED_ORIGINS
uv run uvicorn src.server:app --host 0.0.0.0 --port 8000MCP Clients
VS Code
{
"servers": {
"planner": {
"type": "http",
"url": "http://localhost:8000/mcp"
}
}
}Any MCP client
{
"mcpServers": {
"microsoft-planner-mcp": {
"url": "http://localhost:8000/mcp"
}
}
}