
Onplana
Connects Claude to Onplana's project portfolio management platform as an alternative to Microsoft Project Online. Supports OAuth and PAT authentication over streamable HTTP. The underlying codebase is a production-hardened TypeScript MCP server template that handles prompt injection containment, stateless Bearer auth, and plan-gate semantics. The repo includes both the server framework and a typed client SDK for calling Onplana's public MCP endpoint. Exposes tools for listing projects, searching organizational knowledge (hybrid semantic and lexical search across tasks, risks, goals, comments, wiki pages), and other PM operations. Reach for this if you're running a PMO and want Claude to query and manipulate project data programmatically, or if you're building your own MCP server and want a reference implementation with security primitives already solved.
- GitHub stars
- 5
- tools
- 29
- auth
- Required
- transport
- HTTP
- last updated
- Oct 18, 2026
Tools
29 toolsPublic tool metadata for what this MCP can expose to an agent.
list_projectsList projects in the current organization. Use this to find a project by name before acting on it, or to give the user an overview of their work. Returns up to `limit` projects ordered by most recently updated. Non-admin users only see projects they own or are a member of. [Se...2 params
List projects in the current organization. Use this to find a project by name before acting on it, or to give the user an overview of their work. Returns up to `limit` projects ordered by most recently updated. Non-admin users only see projects they own or are a member of. [Se...
limitintegerstatusstringPLANNING · ACTIVE · ON_HOLD · COMPLETED · CANCELLEDget_projectGet full detail on one project (team, milestones, task counts) by id. Use this after list_projects to resolve a name → id and pull enough context to reason about the project without a follow-up call. The caller can only see projects they own, are a member of, or have org-admin...1 params
Get full detail on one project (team, milestones, task counts) by id. Use this after list_projects to resolve a name → id and pull enough context to reason about the project without a follow-up call. The caller can only see projects they own, are a member of, or have org-admin...
projectIdstringlist_tasksList tasks visible to the caller, with optional filters: projectId, status (TODO / IN_PROGRESS / REVIEW / DONE / BLOCKED), assigneeId, dueBefore / dueAfter (ISO dates), overdueOnly. Returns up to 50 tasks per call. For deeper drill-downs use get_task on a specific id. [Securit...7 params
List tasks visible to the caller, with optional filters: projectId, status (TODO / IN_PROGRESS / REVIEW / DONE / BLOCKED), assigneeId, dueBefore / dueAfter (ISO dates), overdueOnly. Returns up to 50 tasks per call. For deeper drill-downs use get_task on a specific id. [Securit...
assigneeIdstringdueAfterstringdueBeforestringlimitnumberoverdueOnlybooleanprojectIdstringstatusstringTODO · IN_PROGRESS · REVIEW · DONE · BLOCKEDget_taskGet full detail on one task by id (subtasks, dependencies, recent comments). Caller must have visibility into the parent project. Out-of-scope task ids return not_found. [Security note] Free-text fields in this tool's results that originate from end-user input are wrapped in <...1 params
Get full detail on one task by id (subtasks, dependencies, recent comments). Caller must have visibility into the parent project. Out-of-scope task ids return not_found. [Security note] Free-text fields in this tool's results that originate from end-user input are wrapped in <...
taskIdstringlist_org_membersList active members of the caller's organization with name + role. For OWNER/ADMIN callers, also returns email and 2FA-enabled status. SCIM-deactivated members are excluded - they can't be assigned tasks until reactivated. Optional `role` filter (OWNER/ADMIN/MANAGER/MEMBER/GUE...2 params
List active members of the caller's organization with name + role. For OWNER/ADMIN callers, also returns email and 2FA-enabled status. SCIM-deactivated members are excluded - they can't be assigned tasks until reactivated. Optional `role` filter (OWNER/ADMIN/MANAGER/MEMBER/GUE...
limitnumberrolestringOWNER · ADMIN · MANAGER · MEMBER · GUESTlist_risksList project risks visible to the caller. Filters: projectId (optional), severity (LOW/MEDIUM/HIGH/CRITICAL), category (SCHEDULE/RESOURCE/BUDGET/SCOPE), includeDismissed (default false). Returns up to 50 risks per call, ordered by severity descending then most-recent first. [S...5 params
List project risks visible to the caller. Filters: projectId (optional), severity (LOW/MEDIUM/HIGH/CRITICAL), category (SCHEDULE/RESOURCE/BUDGET/SCOPE), includeDismissed (default false). Returns up to 50 risks per call, ordered by severity descending then most-recent first. [S...
categorystringSCHEDULE · RESOURCE · BUDGET · SCOPEincludeDismissedbooleanlimitnumberprojectIdstringseveritystringLOW · MEDIUM · HIGH · CRITICALcreate_projectCreate a new project in the current organization. The caller becomes the project owner. Returns the created project id - pass it to create_task to populate the project with work. Use list_projects first to confirm a similarly-named project does not already exist. [Security not...9 params
Create a new project in the current organization. The caller becomes the project owner. Returns the created project id - pass it to create_task to populate the project with work. Use list_projects first to confirm a similarly-named project does not already exist. [Security not...
budgetnumbercolorstringcurrencystringdescriptionstringendDatestringnamestringstartDatestringstatusstringPLANNING · ACTIVE · ON_HOLD · COMPLETED · CANCELLEDtypestringSTRATEGIC · OPERATIONALcreate_taskCreate a task in an existing project. Use `list_projects` first if you only know the project by name. `projectId` and `title` are required; everything else is optional. For multi-step plans, prefer creating the parent task first, then subtasks with `parentId` set to its id. [S...15 params
Create a task in an existing project. Use `list_projects` first if you only know the project by name. `projectId` and `title` are required; everything else is optional. For multi-step plans, prefer creating the parent task first, then subtasks with `parentId` set to its id. [S...
assigneeIdstringassigneeNamestringdescriptionstringdueDatestringepicIdstringestimatedHoursnumberisMilestonebooleanparentIdstringprioritystringLOW · MEDIUM · HIGH · CRITICALprogressnumberprojectIdstringsprintIdstringstartDatestringstatusstringTODO · IN_PROGRESS · REVIEW · DONE · BLOCKEDtitlestringupdate_taskPartially update one task. Pass only the fields you want to change: status (TODO/IN_PROGRESS/REVIEW/DONE/BLOCKED), priority (LOW/MEDIUM/HIGH/CRITICAL), dueDate (ISO or null to clear), startDate (ISO or null), assigneeId (user id or null to unassign), progress (0-100). Caller m...7 params
Partially update one task. Pass only the fields you want to change: status (TODO/IN_PROGRESS/REVIEW/DONE/BLOCKED), priority (LOW/MEDIUM/HIGH/CRITICAL), dueDate (ISO or null to clear), startDate (ISO or null), assigneeId (user id or null to unassign), progress (0-100). Caller m...
assigneeIdstringdueDatestringprioritystringLOW · MEDIUM · HIGH · CRITICALprogressnumberstartDatestringstatusstringTODO · IN_PROGRESS · REVIEW · DONE · BLOCKEDtaskIdstringassign_taskAssign or unassign one task. Pass assigneeId=null to unassign. Caller must have task.assign on the project. Target must be an active member of the organization. [Security note] Free-text fields in this tool's results that originate from end-user input are wrapped in <onplana_u...2 params
Assign or unassign one task. Pass assigneeId=null to unassign. Caller must have task.assign on the project. Target must be an active member of the organization. [Security note] Free-text fields in this tool's results that originate from end-user input are wrapped in <onplana_u...
assigneeIdstringtaskIdstringmove_task_to_sprintMove one task into a sprint (sprintId=null returns it to the backlog). Sprint must belong to the same project as the task. Caller must have sprint.manage on the project. [Security note] Free-text fields in this tool's results that originate from end-user input are wrapped in <...2 params
Move one task into a sprint (sprintId=null returns it to the backlog). Sprint must belong to the same project as the task. Caller must have sprint.manage on the project. [Security note] Free-text fields in this tool's results that originate from end-user input are wrapped in <...
sprintIdstringtaskIdstringupdate_projectPartially update one project: name, description, status (PLANNING/ACTIVE/ON_HOLD/COMPLETED/CANCELLED), startDate, endDate, progress (0-100), budget (number or null), color. Only supplied fields change. Caller must have project.edit on the project. [Security note] Free-text fie...9 params
Partially update one project: name, description, status (PLANNING/ACTIVE/ON_HOLD/COMPLETED/CANCELLED), startDate, endDate, progress (0-100), budget (number or null), color. Only supplied fields change. Caller must have project.edit on the project. [Security note] Free-text fie...
budgetnumbercolorstringdescriptionstringendDatestringnamestringprogressnumberprojectIdstringstartDatestringstatusstringPLANNING · ACTIVE · ON_HOLD · COMPLETED · CANCELLEDadd_project_memberAdd an EXISTING active org member to a project. Pass userId (look up with list_org_members first) and role (OWNER/MANAGER/MEMBER/CONTRIBUTOR/VIEWER). Caller must have project.members.manage on the project. For inviting a brand-new email outside the org, use the invitation UI -...3 params
Add an EXISTING active org member to a project. Pass userId (look up with list_org_members first) and role (OWNER/MANAGER/MEMBER/CONTRIBUTOR/VIEWER). Caller must have project.members.manage on the project. For inviting a brand-new email outside the org, use the invitation UI -...
projectIdstringrolestringOWNER · MANAGER · MEMBER · CONTRIBUTOR · VIEWERuserIdstringcreate_milestoneCreate a milestone on one project (zero-duration marker for key dates). Caller must have milestone.create on the project. [Security note] Free-text fields in this tool's results that originate from end-user input are wrapped in <onplana_user_content>...</onplana_user_content>...3 params
Create a milestone on one project (zero-duration marker for key dates). Caller must have milestone.create on the project. [Security note] Free-text fields in this tool's results that originate from end-user input are wrapped in <onplana_user_content>...</onplana_user_content>...
dueDatestringprojectIdstringtitlestringcreate_commentPost a comment on a task OR a project (exactly one parent). Useful for AI-generated status updates, follow-ups, or notes. Caller must have visibility into the parent project. [Security note] Free-text fields in this tool's results that originate from end-user input are wrapped...3 params
Post a comment on a task OR a project (exactly one parent). Useful for AI-generated status updates, follow-ups, or notes. Caller must have visibility into the parent project. [Security note] Free-text fields in this tool's results that originate from end-user input are wrapped...
contentstringprojectIdstringtaskIdstringbulk_update_tasksApply the same partial update to many tasks at once. Pass taskIds (max 50) and any combination of: status (TODO/IN_PROGRESS/REVIEW/DONE/BLOCKED), priority (LOW/MEDIUM/HIGH/CRITICAL), shiftDueDateDays (positive or negative integer to add to each task's dueDate). Per-task failur...4 params
Apply the same partial update to many tasks at once. Pass taskIds (max 50) and any combination of: status (TODO/IN_PROGRESS/REVIEW/DONE/BLOCKED), priority (LOW/MEDIUM/HIGH/CRITICAL), shiftDueDateDays (positive or negative integer to add to each task's dueDate). Per-task failur...
prioritystringLOW · MEDIUM · HIGH · CRITICALshiftDueDateDaysnumberstatusstringTODO · IN_PROGRESS · REVIEW · DONE · BLOCKEDtaskIdsarraycreate_sprint_with_tasksCreate a sprint on a project AND move existing tasks into it in one atomic call. Pass projectId, name, startDate, endDate (ISO), optional goal, and taskIds (existing tasks on the same project to assign - up to 50). Out-of-scope or missing tasks are skipped with reasons; the sp...6 params
Create a sprint on a project AND move existing tasks into it in one atomic call. Pass projectId, name, startDate, endDate (ISO), optional goal, and taskIds (existing tasks on the same project to assign - up to 50). Out-of-scope or missing tasks are skipped with reasons; the sp...
endDatestringgoalstringnamestringprojectIdstringstartDatestringtaskIdsarrayanalyze_project_risksRun AI risk analysis on one project - detected risks persist to the project risks table (visible via list_risks). Use this when the user asks "what could go wrong on Project X" or before a sprint planning meeting. Caller must have visibility into the project. [Security note] F...1 params
Run AI risk analysis on one project - detected risks persist to the project risks table (visible via list_risks). Use this when the user asks "what could go wrong on Project X" or before a sprint planning meeting. Caller must have visibility into the project. [Security note] F...
projectIdstringgenerate_status_reportGenerate a Markdown status report for one project (current state, task counts, top risks, recommendations). Returns the report inline; does NOT email it (user can copy or ask "email this to ..." for a separate explicit step). Caller must have visibility into the project. [Secu...1 params
Generate a Markdown status report for one project (current state, task counts, top risks, recommendations). Returns the report inline; does NOT email it (user can copy or ask "email this to ..." for a separate explicit step). Caller must have visibility into the project. [Secu...
projectIdstringfind_similar_projectsFind projects in this org similar to a given description OR to an existing project. Pass either projectId (similar to this project) or description (free-form). Returns up to 5 matches with similarity scores. Useful for "have we done a project like this before?" - requires the...3 params
Find projects in this org similar to a given description OR to an existing project. Pass either projectId (similar to this project) or description (free-form). Returns up to 5 matches with similarity scores. Useful for "have we done a project like this before?" - requires the...
descriptionstringlimitnumberprojectIdstringsummarize_projectGenerate an executive status summary for one project - covering what changed since `sinceDays` ago (default 7), top risks, current blockers, and recommended next steps. Returns structured fields the model can render. Caller must have visibility into the project. [Security note...2 params
Generate an executive status summary for one project - covering what changed since `sinceDays` ago (default 7), top risks, current blockers, and recommended next steps. Returns structured fields the model can render. Caller must have visibility into the project. [Security note...
projectIdstringsinceDaysnumbersearch_org_knowledgeSemantic + lexical hybrid search across this org's indexed content: projects, tasks, risks, goals, comments, and wiki pages. Use this BEFORE listing or scanning when the user asks "find me…" / "what was the rationale for…" / "have we discussed…" — it's an O(1) lookup against t...3 params
Semantic + lexical hybrid search across this org's indexed content: projects, tasks, risks, goals, comments, and wiki pages. Use this BEFORE listing or scanning when the user asks "find me…" / "what was the rationale for…" / "have we discussed…" — it's an O(1) lookup against t...
limitnumberquerystringscopestringprojects · tasks · risks · goals · comments · wikisearchDiscovery tool for the Onplana org. Returns up to 10 candidate matches across projects, tasks, risks, comments, and wiki pages. Each result has an opaque `id` that can be passed to the `fetch` tool to retrieve full content. Use this BEFORE attempting any list scan — the hybrid...1 params
Discovery tool for the Onplana org. Returns up to 10 candidate matches across projects, tasks, risks, comments, and wiki pages. Each result has an opaque `id` that can be passed to the `fetch` tool to retrieve full content. Use this BEFORE attempting any list scan — the hybrid...
querystringfetchRetrieve full content for one resource by id. The id MUST be one previously returned by the `search` tool — opaque strings of the form `<type>:<cuid>` (e.g. `project:abc123…`). Returns title, a single-string content blob (capped at 8 KB with a "more in app" trailer for longer...1 params
Retrieve full content for one resource by id. The id MUST be one previously returned by the `search` tool — opaque strings of the form `<type>:<cuid>` (e.g. `project:abc123…`). Returns title, a single-string content blob (capped at 8 KB with a "more in app" trailer for longer...
idstringlist_my_tasksList tasks assigned to YOU (the calling user). Resolves "me" server-side — no need to pass an assignee id. Optional filters: status (TODO / IN_PROGRESS / REVIEW / DONE / BLOCKED), overdueOnly (only tasks past due date and not DONE). Default returns 25, max 50. Use list_tasks i...3 params
List tasks assigned to YOU (the calling user). Resolves "me" server-side — no need to pass an assignee id. Optional filters: status (TODO / IN_PROGRESS / REVIEW / DONE / BLOCKED), overdueOnly (only tasks past due date and not DONE). Default returns 25, max 50. Use list_tasks i...
limitnumberoverdueOnlybooleanstatusstringTODO · IN_PROGRESS · REVIEW · DONE · BLOCKEDlist_overdueList tasks that are past their due date and NOT yet DONE — across every project visible to the caller. Optional projectId filter to narrow to one project. Returns up to 25 tasks ordered by most-overdue first, with a `daysOverdue` field so the model can prioritise response. Use...2 params
List tasks that are past their due date and NOT yet DONE — across every project visible to the caller. Optional projectId filter to narrow to one project. Returns up to 25 tasks ordered by most-overdue first, with a `daysOverdue` field so the model can prioritise response. Use...
limitnumberprojectIdstringlist_team_membersList members of a SPECIFIC project (NOT the whole organization — use list_org_members for that). Returns user id + name + role (OWNER / MANAGER / MEMBER / CONTRIBUTOR / VIEWER, plus any custom roles your org has defined). The project owner is always included as the first row w...1 params
List members of a SPECIFIC project (NOT the whole organization — use list_org_members for that). Returns user id + name + role (OWNER / MANAGER / MEMBER / CONTRIBUTOR / VIEWER, plus any custom roles your org has defined). The project owner is always included as the first row w...
projectIdstringlink_dependencyCreate a dependency between two tasks. Type is one of FINISH_TO_START (default — successor starts when predecessor finishes), START_TO_START, FINISH_TO_FINISH, START_TO_FINISH. Lag is in integer days; negative values create lead time (successor starts before predecessor finish...4 params
Create a dependency between two tasks. Type is one of FINISH_TO_START (default — successor starts when predecessor finishes), START_TO_START, FINISH_TO_FINISH, START_TO_FINISH. Lag is in integer days; negative values create lead time (successor starts before predecessor finish...
lagnumberpredecessorIdstringsuccessorIdstringtypestringFINISH_TO_START · START_TO_START · FINISH_TO_FINISH · START_TO_FINISHsubmit_timesheetLog hours against a task as a timesheet entry. Records under the calling user, on the specified task within the specified project. Hours: 0.25 (15 minutes) to 24 — fractional values OK. Date: YYYY-MM-DD or ISO 8601. The entry starts in DRAFT status; submission for approval is...5 params
Log hours against a task as a timesheet entry. Records under the calling user, on the specified task within the specified project. Hours: 0.25 (15 minutes) to 24 — fractional values OK. Date: YYYY-MM-DD or ISO 8601. The entry starts in DRAFT status; submission for approval is...
datestringhoursnumbernotesstringprojectIdstringtaskIdstringSponsors
Readme
Onplana MCP server
Open-source TypeScript Model Context Protocol building blocks, extracted from Onplana's production MCP deployment. Two packages:
onplana-mcp-server: server template. Streamable HTTP transport, Bearer auth, prompt-injection containment, pluggable dispatcher.onplana-mcp-client: typed TypeScript client SDK for calling the public Onplana MCP endpoint athttps://api.onplana.com/api/mcp/v1.
What this is
The transport layer of an MCP server (Streamable HTTP wiring, stateless mode, scoped Bearer auth, prompt-injection containment) done well, separated from the platform-specific tool registry. Use the server template to build your own MCP server with security best practices baked in. Use the client SDK to drive Onplana's hosted MCP from your own code.
Details
- Repository
- github.com/onplana/onplana-mcp-server
- Website
- onplana.com
- Transport
- HTTP
- Auth
- Required
- Registry
- MCP registry, active