Skip to main content
Glama

Server Details

AI-native project and portfolio management platform for PMOs. OAuth + PAT.

Ownership verified
Status
Healthy
Uptime
100.0% over the last 24 hours
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
Onplana/onplana-mcp-server
GitHub Stars
5
Server Listing
Onplana MCP server
ChatGPT
Onplana
Claude
Onplana

TDQS

A3.5/5.0

Scored across 317 tools

Disambiguation3/5

Individual descriptions are unusually explicit (heavy use of 'PREFER X over Y'), which rescues most of the surface, but a 317-tool set inevitably contains genuine overlaps: gantt_optimize and auto_schedule_proposal appear to be the same tool under two names, compute_risk_patterns and list_org_risk_patterns return the same aggregation, create_timesheet_entry and submit_timesheet both log hours into a DRAFT entry, and list_tasks / list_my_tasks / list_assigned_tasks / list_overdue / list_related_tasks overlap heavily. An agent can usually pick correctly only after reading several paragraphs of routing prose.

Naming Consistency4/5

The dominant convention is consistent snake_case verb_noun (create_task, update_project, list_risks, bulk_update_status), applied across hundreds of tools. Deviations exist (fetch, search, whoami, next_task, gantt_optimize, workflow_stats, week_status, weekly_compliance, revenue_at_risk) but are few and still readable, and no camelCase/snake_case mixing of the chaotic kind.

Tool Count1/5

317 tools for a project-management product is far beyond what an agent can hold in context or choose between reliably; the toolset sprawls across PM, governance, compliance, Microsoft 365, whiteboards, workflows and CRM. Even with category-based load_tools gating, the catalog is an extreme mismatch for the stated purpose and many tools are near-duplicates that could be collapsed.

Completeness4/5

Coverage is remarkably deep: full CRUD across tasks, projects, risks, issues, proposals, timesheets, documents, workflows, custom fields and dependencies, plus lifecycle tools (baseline, closeout, archive, readiness). Minor gaps remain, e.g. create_goal and create_key_result exist but there is no list_goals/get_goal or delete_goal, and no delete_epic / delete_sprint / delete_milestone analogues to delete_task and delete_project.

Available Tools

317 tools
add_ccb_memberA
Idempotent
Inspect

Add a user to the org-level Change Control Board. Requires org.governance.manage (Admin+ by default). Idempotent. User must be an active org member. Feature: changeControl (ENTERPRISE+).

Inputs: userId (required).

add_project_memberA
Idempotent
Inspect

Add an EXISTING active org member to a project. Pass userId (look up with list_org_members first) and role (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 - this tool intentionally does not send emails.

Inputs: role (required), userId (required), projectId (required).

add_project_to_portfolioAInspect

Add a project to a portfolio (BUSINESS+ feature). Requires org.portfolio.manage (default Manager+). Idempotent-safe: if the project is already in the portfolio, returns an error so the caller can detect duplicates.

Inputs: projectId (required), portfolioId (required).

add_subtasksAInspect

Atomically create one or more subtasks under an existing parent task. All children inherit the parent's project. Returns the created ids. Up to 25 subtasks per call. Use this instead of calling create_task repeatedly when decomposing a claimed task — single transaction, single tool-call budget slot, atomic rollback on any failure.

Inputs: parentId (required), subtasks (required), idempotencyKey.

add_timesheet_approverA
Idempotent
Inspect

Add a user to the designated timesheet approver list. Requires OWNER or ADMIN. Idempotent. User must be an active org member. Feature: timeTracking (PRO+).

Inputs: userId (required).

advance_proposal_stageA
DestructiveIdempotent
Inspect

Drive a governance proposal through its lifecycle. Actions: submit (DRAFT->PROPOSAL_REVIEW, owner+; restricted), start_review (SUBMITTED->PROPOSAL_REVIEW for older proposals, reviewer+), hold (any pre-terminal->ON_HOLD), unhold (ON_HOLD->previousStage), reject (any pre-terminal->REJECTED; gate-panel restricted at review stages), archive (terminal->ARCHIVED). Advancing into a review stage seeds the gate-reviewer panel (parity with REST); only the PROPOSAL_STAGE_CHANGED workflow-run dispatch is skipped on the agent path. Plan gate: governance.

Inputs: action (required), proposalId (required).

agent_bootstrapA
Read-onlyIdempotent
Inspect

Cold-start summary for a fresh session, in one round-trip. Returns identity + org + plan features (as whoami does), a capabilities summary (how many tools exist, are reachable, and are callable), the entity schema index, and the assigned-task count, collapsing whoami, describe_capabilities and describe_schema into a single call. Finer detail lives in those tools individually: describe_capabilities for full per-tool gates, describe_schema(entity[, projectId]) for field shapes (projectId yields a project's merged custom fields), list_assigned_tasks for the full queue. Also returns workspace: the URL of the user's Onplana workspace, plus a list of what only the web app can do (Gantt, boards, dashboards, exports, inviting teammates, file and MS Project import). That field exists because many users arrive from inside another app and have never opened Onplana, so the workspace URL is often the only pointer they have to it.

Inputs: no named parameters.

analyze_project_risksA
Destructive
Inspect

Run AI risk analysis on one project and merge the findings into its risk register (visible via list_risks). A finding that matches an open AI risk nobody has touched updates it; one matching a risk a person or agent added or edited, or a dismissed risk, is skipped; the rest are added. Nothing is removed. Use this when the user asks "what could go wrong on Project X" or before a sprint planning meeting. Caller needs write access to the project, as for create_risk.

Inputs: projectId (required).

append_logAInspect

Append a streaming progress log line to the current agent conversation. Required: conversationId (the AiConversation this agent session belongs to), lineNum (monotonic integer the agent maintains), level (INFO/WARN/ERROR/DEBUG or any string <=8 chars), text (the log line up to 4000 chars). Optional taskId attaches the line to a specific task and triggers a real-time UI broadcast so humans see it land. No undo — log lines are append-only.

Inputs: text (required), level (required), lineNum (required), conversationId (required), +2 more.

approve_timesheet_entryA
DestructiveIdempotent
Inspect

Approve a single SUBMITTED timesheet entry. Caller must be an eligible approver (OWNER/ADMIN/MANAGER in managers mode, or a designated approver in approvers mode). Feature: timeTracking (PRO+).

Inputs: entryId (required).

approve_timesheet_weekA
DestructiveIdempotent
Inspect

Bulk-approve all SUBMITTED timesheet entries for a specific user in a given week. Caller must be an eligible approver. Feature: timeTracking (PRO+).

Inputs: userId (required), weekStart (required).

archive_projectA
Destructive
Inspect

Archive a completed or cancelled project: it becomes read-only (every write to it or anything inside it is refused with PROJECT_ARCHIVED) and is hidden from project lists unless they ask for archived projects. Nothing is deleted, and unarchive_project reverses it. The organization's archive readiness criteria are checked under its enforcement mode: in BLOCK a required gap refuses with READINESS_GAPS, in WARN the archive goes through and the verdict is returned. Needs the project Owner or Manager role, or org.compliance.manage.

Inputs: projectId (required).

assign_tagA
Idempotent
Inspect

Assign a tag to a task or project. Provide either taskId or projectId, not both. The caller must have access to the target entity. Assigning a tag that is already on the target succeeds as a no-op (alreadyAssigned: true in the result).

Inputs: tagId (required), taskId, projectId.

assign_taskA
DestructiveIdempotent
Inspect

Assign or unassign one task. Pass assigneeId=null to unassign. Alternatively pass assigneeEmail to resolve by org-member email (useful when the agent only knows the user's email and would otherwise need a separate list to find their id). Mutually exclusive with assigneeId. Optional expectedAssigneeRevision (integer): if supplied, the call fails with a CONFLICT error when another caller has assigned the task since you last read it. Returns the assignee's id and name (assigneeName), and the new claimRevision so you can chain consecutive assigns under optimistic concurrency. Caller must have task.assign on the project. Target must be an active member of the organization. On plans with resource management the result also carries load: the assignee's capacity for the week the task lands in, the hours already committed to their other open work, this task's share, whether that projection exceeds capacity (over, overBy), and the competing work that week (otherWork). Null when the task has no dates.

Inputs: taskId (required), dryRun, assigneeId, assigneeEmail, +1 more.

attach_file_from_urlAInspect

Attach a file to a task by URL. The SERVER downloads the file (public http(s) URL only; internal/private addresses are blocked) and stores it as a real attachment, so the bytes never pass through the model (no truncation risk). Use this when the file already lives at a URL (cloud storage, a public link). Max 50 MB. fileName is optional (derived from the URL otherwise). For a file that exists only in your sandbox, use upload_task_attachment instead. Any project contributor or above can attach (VIEWERs cannot).

Inputs: url (required), taskId (required), fileName, idempotencyKey.

attach_sharepoint_documentAInspect

Attach a SharePoint document to an Onplana project workspace as a LINK reference (externalProvider=SHAREPOINT). The file stays in SharePoint; Onplana stores only the URL + metadata. No file is downloaded or copied in V1 (security stance). Caller must have read access to the SharePoint site. siteId comes from list_sharepoint_sites; driveItemId, and driveId for a file outside the default library, come from list_sharepoint_files.

Inputs: siteId (required), projectId (required), driveItemId (required), driveId, +1 more.

audit_filter_metadataA
Read-onlyIdempotent
Inspect

Distinct action + resource + clientSurface values the caller's org has logged, with row counts per value. Useful for building filter chips before a follow-up list_audit_log call. clientSurfaces reports which clients the org has actually seen (WEB, MAKER, EXTENSION, DESKTOP, MOBILE, MCP, PAT, SYSTEM, UNKNOWN), with rows that record no client grouped under the value 'NONE'. Capped at 100 values per dimension. OWNER or ADMIN + auditLogs feature.

Inputs: no named parameters.

auto_detect_import_risksA
Idempotent
Inspect

Run deterministic schedule-risk detection on a project and persist any findings to the Risks tab. Detects: project-end overruns, overdue tasks, unassigned-task ratio above 30%, and stuck-at-99% tasks. Idempotent via dedupe — re-running does not pile up duplicates. Returns the count of NEW risks inserted (0 when all detected risks already exist). No LLM call, no plan gate. Use after import or when the Risks tab is empty and the user asks "are there any obvious problems with this project?"

Inputs: projectId (required).

auto_schedule_proposalA
Destructive
Inspect

PRO+ AI scheduling tool for agents. Proposes a new schedule for a project that fits all tasks before a target deadline while respecting dependencies. Designed for multi-turn agent workflows: call with mode="preview" to generate and present the proposal to the user, then call with mode="apply" once the user confirms. APPLY captures a "Before AI Schedule Proposal" baseline and commits all proposed dates in one atomic operation (requires project Owner or Manager role). Optionally levels resources to avoid overallocation. Cap: 100 tasks. Feature: aiAdvanced (PRO+).

Inputs: deadline (required), projectId (required), mode, previewId, +2 more.

bulk_assignA
DestructiveIdempotent
Inspect

(Un)assign multiple tasks to one person in a single call. Pass assigneeId (a user id, or null to unassign) OR assigneeEmail (resolved against active org members) - mutually exclusive. Returns { updated, skipped, errors } so partial success is observable: skipped lists tasks already at that assignee; errors lists per-task failures (NOT_FOUND / PROJECT_ACCESS_DENIED). Up to 200 task ids per call. Use the single-task assign_task when you need optimistic-concurrency (expectedAssigneeRevision). Caller must have task.assign on each task's project; the target must be an active member of the organization.

Inputs: taskIds (required), dryRun, assigneeId, assigneeEmail.

bulk_create_tasksAInspect

Add a list of up to 50 tasks to an existing Onplana project in one call, at the project root or under a sprint / epic. Fits "add these tasks to my launch project" or a checklist pasted into the chat. Single transaction (all-or-nothing), in place of calling create_task N times; add_subtasks covers new tasks that are children of an existing task. THIS TOOL DOES NOT SCHEDULE. Tasks land with NO dates unless startDate and dueDate are set on each one, and there is no way to express durations or predecessors here at all. A schedule (phase durations, effort estimates, "task 5 depends on task 3", a critical path) sent through this tool arrives as a flat dateless list, and the Gantt, timeline and critical path are all empty. Use instantiate_plan instead, which takes estimatedDays per task and computes real start and due dates from them. It accepts a projectId, so it works on a project that already exists. Neither tool accepts predecessors: create the tasks first, then add each dependency with link_dependency. The result includes url for the project (and one per task). ALWAYS show the project link in your reply so the user can open what you just created.

Inputs: tasks (required), projectId (required), epicId, sprintId, +1 more.

bulk_create_workspace_rowsAInspect

Append many rows to a workspace list (table) in one call, where create_workspace_row appends a single row per call. rows is an array, each entry a map of columnId to value (string|number|boolean|null); a row may omit any column. Unknown column ids are refused. Limits per call: 200 rows and 3000 cells in total, whichever is reached first, so a wide list takes fewer rows per call than a narrow one. Rows are appended in the order given, and the whole batch lands or none of it does.

Inputs: rows (required), tableId (required).

bulk_update_statusA
DestructiveIdempotent
Inspect

Flip status on multiple tasks in one call. Use this instead of N update_task calls when marking siblings DONE / blocking a batch / reopening a set. Returns { updated, skipped, errors } so partial success is observable. Up to 50 task ids per call. Tasks the caller can't change are skipped, not errored. Each task is written with the rules and effects of update_task (workflows, webhooks, parent rollup); a task refused there is in errors and the rest land.

Inputs: status (required), taskIds (required), dryRun.

bulk_update_tasksA
DestructiveIdempotent
Inspect

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, a ranking label that does not put a task on the critical path), shiftDueDateDays (positive or negative integer to add to each task's dueDate). Per-task failures are reported in errors but do not abort the whole call. Permission: task.edit.any on each task's project. Each task is written with the rules and effects of update_task (a shifted due date is a typed date: the duration is recounted and the schedule reflows). PREFER bulk_update_status when the ONLY change is status. Instead of taskIds and one patch, items takes up to 50 tasks, each with its own startDate, dueDate, originalDurationMinutes, constraintType and constraintDate (any of them), each applied with exactly the rules and effects of update_task (a duration on a dated task moves its due date, a typed date derives its constraint, the schedule reflows), in the order given; a refused row is reported in errors with its code while the rest land. The monthly allowance counts tasks, not calls.

Inputs: items, dryRun, status, taskIds, +2 more.

calculate_evmA
Read-onlyIdempotent
Inspect

Earned Value Management report for one project as of a given date (default: now). Returns BAC, EV, PV, AC, CPI, SPI, EAC, ETC, plus EV/PV/AC in revenue currency when the org has billable rates. With no actual cost recorded, CPI, CV, EAC, ETC and VAC are null and actualCostRecorded is false: report them as N/A, not on budget. PREFER calculate_evm_history for time-series. Access: callers who may read the project cost: org OWNER/ADMIN, or budget.read at their project role (by default project OWNER and MANAGER). Plan gate: aiAdvanced.

Inputs: projectId (required), asOf.

calculate_evm_historyA
Read-onlyIdempotent
Inspect

EVM time-series for one project: each point carries the date, PV and AC (the S-curve). CPI and the estimates are in calculate_evm, which returns them null when no actual cost is recorded. Powers the S-Curve and trajectory analyses. Same access + plan gate as calculate_evm. points is empty when dataSource is "none" (no imported costs, rate card or default rate to price hours with), the same rule calculate_evm applies.

Inputs: projectId (required).

cancel_workflow_runA
DestructiveIdempotent
Inspect

Cancel an in-progress workflow run. Caller must be able to manage the workflow. Feature: automations (PRO+).

Inputs: runId (required).

capture_baselineAInspect

Capture a point-in-time baseline snapshot of a project (tasks, dates, progress, EVM). Caller must be a project Owner or Manager. On every plan unless baselines are set to Professional; then a capture needs Professional or above and is refused below it.

Inputs: projectId (required), name.

claim_taskA
Idempotent
Inspect

Take an exclusive execution lease on one task before working on it, so a second agent on the same board does not do the same work. Returns claimed=true with an expiry, or claimed=false naming the agent already executing it, or claimed=false when the task is already DONE (with its status and when it changed). The lease lapses on its own after 10 minutes, so a crashed agent never blocks a task permanently; call renew_task_lease about every 3 minutes while the work continues, and release_task when finished. Optional ttlMinutes sets a different lifetime. A lease does not change who the task is assigned to and does not grant any permission; use assign_task for ownership. Caller needs task.edit.any on the project, or task.edit.own on a task they are assigned or created.

Inputs: taskId (required), ttlMinutes.

compare_baselineA
Read-onlyIdempotent
Inspect

Computed variance of a project against one of its baselines: project finish slip (calendar days), an on-track / at-risk / behind rating, counts of delayed / on-time / ahead / added / removed tasks, and the worst slippers with their start, finish, planned-duration and started-late variance. Duration variance uses the stored planned duration, not the date span. Also returns summary: the comparison in plain English (paragraphs on the finish and the chain of tasks driving it, scope, cost where the caller may read it, tasks added and removed, and a list of the five largest start or finish moves), built without AI, the same text the Baselines tab shows. Use get_baseline for the raw snapshot. On every plan unless baselines are set to Professional; then it needs Professional or above, and below Professional reads continue for 30 days after the change, then are refused.

Inputs: baselineId (required), maxTasks.

compose_evm_narrativeAInspect

Generate a plain-language EVM narrative for a project and deliver it to the Agent inbox for review. Fetches BAC/EV/PV/AC/CPI/SPI/EAC and writes a PMO-quality prose document into the Agent Deliverables library. Returns the artifact id and conversation id once the narrative is drafted. Plan gate: aiCore (every plan). Access: callers who may read the project cost: org OWNER/ADMIN, or budget.read at their project role (by default project OWNER and MANAGER). The Onplana agent saves the draft, so it needs Contributor access or above on the project.

Inputs: projectId (required), locale.

compose_meeting_briefAInspect

Generate a structured meeting agenda for a project and deliver it to the Agent inbox for review. Reads the live project facts: progress and task counts, tasks completed in the last 7 days, overdue tasks, the overdue and the next milestones with their due dates (up to 5 of each), the top 5 open risks and the top 5 open issues by severity, and the project overview with its 15 most recently updated tasks. Writes a ready-to-share agenda (goals, status, risks, milestones, decisions needed). Returns the artifact id and conversation id once the agenda is drafted. Plan gate: aiCore (every plan). Access: any project member.

Inputs: projectId (required).

compose_meeting_inviteAInspect

Compose a draft meeting in the authorized user's own Outlook calendar. Draft only, nobody is invited: the event is created without attendees (Microsoft sends an invitation for any event created with attendees), and the proposed attendees are listed in its body. The user opens it from the returned webLink, adds the attendees and sends it from Outlook. Onplana has no step that sends a meeting invitation. Returns the event id, webLink, attendeesInvited (always 0) and proposedAttendees. Per-invite external attendee cap: 10. Uses existing Calendars.ReadWrite scope.

Inputs: body (required), endUtc (required), subject (required), startUtc (required), +4 more.

compose_release_notesAInspect

Generate structured release notes for a project from the tasks marked done in the last 30 days (up to 30, newest first; a task with no completion date counts by its last update), grouped by epic or theme, and deliver the draft to the Agent inbox for review. Known issues come from the open issues and overdue tasks, next planned work from the next milestones. Output includes a summary, changes by area, known issues, and next planned work; when no task was done in the window, the notes state that. Returns the artifact id and conversation id once the notes are drafted. Plan gate: aiCore (every plan). Access: any project member.

Inputs: projectId (required).

compose_status_digestAInspect

Generate a concise weekly status report for a project and deliver it to the Agent inbox for review. Assembles the project context bundle and writes a structured status report (health, accomplishments, risks, next steps) into the Agent Deliverables library. Returns the artifact id and conversation id once the digest is drafted. Plan gate: aiCore (every plan). Access: any project member; the CPI and SPI line appears only when the caller may read the project cost.

Inputs: projectId (required), locale.

compute_risk_patternsA
Read-onlyIdempotent
Inspect

Aggregate risks across the caller's visible projects by category. Returns acceptedCount, dismissedCount, affectedProjects, and a verdict (recurring | frequently_dismissed | mixed) per category. Drives the "Pattern (X/Y projects)" badge on the Critical Risk Register widget. Optional windowDays (1..365, default 90) bounds the detection lookback.

Inputs: windowDays.

create_change_requestBInspect

Create a DRAFT change request on a project (scope, schedule, budget, resource or other change). Requires project membership. Feature: changeControl (ENTERPRISE+).

Inputs: type (required), title (required), projectId (required), description (required), +15 more.

create_commentAInspect

Post a comment on a task, project, issue OR client company (exactly one parent). Useful for AI-generated status updates, follow-ups, or notes - including progress on an Issue you filed. Caller must have visibility into the parent project. Task comments support two threads: the focused human-agent thread (threadKind 'AGENT', the task's [Agent] tab) and the team thread (threadKind 'general', the [Comments] tab). Comments default to the team thread, including your own progress/status updates. Set threadKind 'AGENT' ONLY to reply in the focused [Agent] thread - i.e. when replying to a comment you read (via get_task / list_comments / list_related_tasks) whose threadKind is 'AGENT', echo that value so the directed conversation stays in one thread.

Inputs: content (required), taskId, issueId, companyId, +3 more.

create_cost_lineAInspect

Add a cost line to a project's budget list: what the money is for, the amount in the PROJECT currency, and whether it is EXPECTED, COMMITTED or SPENT. There is no currency argument: convert the amount first. A SPENT line counts in the project's earned value actual cost. Access: the project budget's write rule (project.edit and budget.read on the project).

Inputs: label (required), amount (required), projectId (required), date, +4 more.

create_custom_field_defAInspect

Create a custom field definition (PRO+ feature). fieldType: one of TEXT, TEXTAREA, NUMBER, DATE, DROPDOWN, MULTI_SELECT, CHECKBOX, URL, EMAIL, PHONE, CURRENCY, RATING. entityType: PROJECT, TASK, or PROPOSAL. DROPDOWN/MULTI_SELECT require at least one option. Omit projectId for an org-wide field (admin/manager only). Set projectId to scope the field to one project (project owner/manager allowed).

Inputs: name (required), fieldType (required), entityType (required), options, +4 more.

create_epicAInspect

Create an Epic on one project. Epics group related tasks under a business theme. Required: projectId, title (2-200 chars). "name" is accepted as a deprecated alias for title (until 2026-11-27). Optional: description (up to 5000 chars), color (hex like "#6366F1" or CSS name; defaults to indigo). The new epic is appended at the end of the project's epic order. Caller must have project.content.create on the project (default: project MEMBER+).

Inputs: projectId (required), name, color, title, +2 more.

create_evaluation_criterionAInspect

Create an org-specific evaluation criterion for a governance gate. Requires org.governance.manage (Admin+ by default). Feature: governance (ENTERPRISE+).

Inputs: gate (required), name (required), order, weight, +4 more.

create_goalAInspect

Create a goal / objective / OKR in the caller's org. title is required. Optional: description, type (OBJECTIVE / KEY_RESULT / INITIATIVE, default OBJECTIVE), parentId (existing goal to nest under), projectIds (array of project ids to link), startDate + dueDate (ISO). Caller becomes the owner. Use create_key_result to add measurable KRs to the new goal once it exists.

Inputs: title (required), type, dueDate, parentId, +4 more.

create_ideaAInspect

Capture an IDEA: an uncommitted, possibly half-formed thought. Use this instead of create_task when the thing is not agreed work yet. An idea has no assignee and no due date and never appears in anyone's task list, so capturing one costs the user nothing. It is PRIVATE to the capturing user until they share it or open it to the org (visibility is controlled in the web app). projectId is OPTIONAL: omit it for a "General" idea that is not tied to a project yet, which is the normal case when someone is just thinking out loud. Promote it later with promote_idea. Returns the new idea's id, idea (id, title, status) and url (its link in the Onplana web app).

Inputs: title (required), companyId, projectId, sourceUrl, +1 more.

create_issueAInspect

File a new Issue (PMBOK Issue Log: a problem that has already happened and needs triage). Use this - NOT create_task - for bugs, blockers, and materialized problems. projectId is OPTIONAL: omit it to file an organization-level ("General") issue when you do not know which project it belongs to. type: OPERATIONAL/TECHNICAL/SCHEDULE/RESOURCE/BUDGET/SCOPE/QUALITY/EXTERNAL/OTHER. severity: LOW/MEDIUM/HIGH/CRITICAL. Optionally link a materializing risk, a fix-task, or a change request. Starts in OPEN. Returns the new issue's id, issue (id, title, status) and url (its link in the Onplana web app).

Inputs: type (required), title (required), severity (required), ownerId, +7 more.

create_key_resultAInspect

Attach a measurable Key Result to an existing goal. Required: goalId, title, targetValue (number > 0). Optional: unit (default "%"), startValue (default 0), rollupMethod (TASK_COUNT or TASK_PERCENTAGE, leave unset for manual updates via update_key_result_value). Any org member except a Guest may add one.

Inputs: title (required), goalId (required), targetValue (required), unit, +3 more.

create_libraryAInspect

Create a document library. Specify exactly one scope: projectId, proposalId, or scope="org" for a tenant-level (organization) library. name is 1..200 chars; optional description. Project libraries require project.content.create (Viewers are read-only); org libraries require org.library.manage (MANAGER+ by default). Agent-created libraries are always user-visible, never the system's auto-stash variant.

Inputs: name (required), scope, projectId, proposalId, +1 more.

create_milestoneAInspect

Create a milestone on one project (zero-duration marker for key dates). Caller must have milestone.create on the project.

Inputs: title (required), dueDate (required), projectId (required), idempotencyKey.

create_office_documentAInspect

Create a blank, editable Office document (Word .docx, Excel .xlsx, or PowerPoint .pptx) in a workspace document library. The file appears in the Documents tab and a person can open it in the in-browser Office editor to co-edit it. Use this (not draft_document, which only makes markdown) when the deliverable should be a real Office file the team will edit. kind is one of word | cell | slide (aliases: document/docx, spreadsheet/xlsx, presentation/pptx). libraryId must reference an existing library; create one first via create_library if needed. Requires project.content.create (CONTRIBUTOR+; Viewers are read-only).

Inputs: kind (required), libraryId (required), name.

create_pageAInspect

Create a web part page (PRO+ feature). Omit projectId for an organization page; pass projectId for a project page. content is optional Puck Data JSON (root + content[]) validated against the component allowlist and https-only url policy (see describe_schema Page); omit it to start empty. Requires contribute access to the org workspace (org page) or the project (project page).

Inputs: title (required), icon, content, projectId.

create_portfolioAInspect

Create a portfolio (BUSINESS+ feature). The caller becomes the portfolio owner. Requires org.portfolio.manage (default Manager+).

Inputs: name (required), description.

create_projectAInspect

Create a new, EMPTY project in the user's Onplana workspace: a named container with an optional start and end date and no tasks yet. Fits "start a project called X" or "set up a project for our office move" when there is no work to put in it yet. When the request includes the work itself ("plan a website launch", "set up a project with the tasks for X"), instantiate_plan creates the project and its whole plan in one call; calling this tool first and then instantiate_plan without a projectId produces two projects and leaves this empty one behind. An id from this tool passed to instantiate_plan as projectId fills this project with a plan instead. Tasks can also go in with create_task or bulk_create_tasks. The caller becomes the project owner. If start/end are omitted, the project runs from today to about 90 days out, adjustable later with update_project. In an organization that classifies its projects, type STRATEGIC is refused: a strategic project there starts as a proposal and is created when the proposal passes its gate. list_projects with search shows whether a similarly named project already exists. The result carries nextSteps: the follow-on calls with this project id already filled in. A project left at "created" is an empty project the user then has to fill by hand. The result includes url, a direct link to the project in Onplana. ALWAYS show that link in your reply: the user is working inside another app and has no other way to find what was just created.

Inputs: name (required), type, color, budget, +6 more.

create_proposalBInspect

Create a DRAFT governance proposal for review through the pipeline (DRAFT to APPROVED/REJECTED). Feature: governance (ENTERPRISE+).

Inputs: title (required), currency, priority, riskLevel, +9 more.

create_riskAInspect

Record a risk on a project's risk register (a forward-looking "might happen" - for a problem that HAS happened, file an Issue via create_issue instead). ADDITIVE: creates one ProjectRisk row and never touches existing risks. analyze_project_risks never changes or removes a risk created here. severity: LOW/MEDIUM/HIGH/CRITICAL. category: SCHEDULE/RESOURCE/BUDGET/SCOPE/EXTERNAL. Optionally include a mitigation (the recommended response). Optionally make it a schedule event for the Monte Carlo schedule risk run: probability (0 to 1), impactDays (working days added to EACH affected task when it happens) and affectedTaskIds (tasks in the same project). Caller needs write access to the project.

Inputs: category (required), severity (required), projectId (required), description (required), +4 more.

create_sprint_with_tasksA
Destructive
Inspect

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 sprint is still created. Permission: sprint.manage on the project.

Inputs: name (required), endDate (required), taskIds (required), projectId (required), +3 more.

create_tagAInspect

Create a new org-scoped tag/label. Name must be 1-30 chars. Optional color must be a 6-digit hex (#RRGGBB). Requires org.tag.manage permission (default Member+).

Inputs: name (required), color.

create_taskAInspect

Add one task to an existing Onplana project, with an optional assignee, due date, priority and description. Fits "add a task to book the venue by Friday" or "remind me to send the invoice next week" once the project is known. projectId and title are required; list_projects with search finds a project known only by name. A subtask is a task whose parentId is its parent's id. add_subtasks creates 2+ children under the same parent in one atomic call, and instantiate_plan commits a whole project with tasks and risks at once. Pass recurringRule to create a repeating task in one call (set dueDate too). The result includes url, a direct link to the task in Onplana. ALWAYS show it in your reply so the user can open what you just created.

Inputs: title (required), projectId (required), epicId, status, +14 more.

create_timesheet_entryBInspect

Log hours worked on a task (creates a DRAFT timesheet entry). Hours must be 0.25-24. Date must be today or in the past and within project dates. Feature: timeTracking (PRO+).

Inputs: date (required), hours (required), taskId (required), projectId (required), +2 more.

create_whiteboardAInspect

Create a whiteboard. Must specify exactly one of projectId or proposalId. elements is the initial Excalidraw element array (default []); appState is the optional Excalidraw appState slice. Plan gate: whiteboards (PRO+).

Inputs: name (required), appState, elements, projectId, +2 more.

create_wiki_pageAInspect

Create a wiki page in a project or proposal (PRO+ feature). Wiki has been retired in favour of Pages: while it is retired this tool creates nothing and returns an error naming create_page, the Pages tool that replaced it. Provide either projectId or proposalId (not both). Title must be 1-200 chars. Icon is an optional emoji (up to 8 chars). Caller must have write access to the parent project.

Inputs: title (required), icon, parentId, projectId, +1 more.

create_workflowAInspect

Create a workflow (PRO and above): a trigger event, an optional trigger condition, and a graph of steps, scoped to one project or, with no projectId, org-wide. The workflow is created INACTIVE and this tool cannot activate it; a person turns it on in the app. Same rules as saving a new workflow in the web builder: automation.manage on the project (org MANAGER and above for org-wide), the plan for the trigger, and a graph that would run. Returns the new workflow id and a plain-language readback of what it does. design_workflow_draft can then redesign its steps with AI, and test_run_workflow runs it once against a sample.

Inputs: name (required), graph (required), trigger (required), maxRuns, +3 more.

create_workspace_columnAInspect

Add a column to an existing workspace table (list), placed after its last column. colType is one of: TEXT, TEXTAREA, NUMBER, DATE, DROPDOWN, MULTI_SELECT, CHECKBOX, URL, EMAIL, PHONE, CURRENCY, RATING, RELATION (default TEXT). options (string[]) holds the choices of a DROPDOWN or MULTI_SELECT. required is a boolean. A RELATION column links each row to a row of another list in the same organization and takes relationConfig { targetTableId, cardinality: MANY_TO_ONE or ONE_TO_ONE }. Returns the new column with its id, which update_workspace_row and create_workspace_row take as a cell key. A list holds a fixed maximum number of columns.

Inputs: name (required), tableId (required), colType, options, +3 more.

create_workspace_rowAInspect

Append a row to a workspace table. cells is a map of columnId to value (string|number|boolean|null). Unknown column ids return 400. Optional order (default = max(order)+1).

Inputs: cells (required), tableId (required), order, idempotencyKey.

create_workspace_tableAInspect

Create a workspace table (list). Specify exactly one scope: projectId, proposalId, or scope="org" for a tenant-level (organization) list. Optional columns array creates the columns in the same atomic transaction. colType is one of: TEXT, TEXTAREA, NUMBER, DATE, DROPDOWN, MULTI_SELECT, CHECKBOX, URL, EMAIL, PHONE, CURRENCY, RATING. Provide options (string[]) for DROPDOWN and MULTI_SELECT. required is a boolean. Column order in the array determines render order. Use this for genuinely TABULAR reference data (registers, inventories, trackers). It is NOT a plan container: a WBS, work breakdown, task hierarchy or imported schedule belongs in real tasks, since only tasks participate in scheduling, dependencies and rollups. Plans go through instantiate_plan (creates project + tasks + subtasks atomically, and is the only one of these with no monthly cap), or bulk_create_tasks plus add_subtasks. Rows here are created one call at a time and cannot be converted into tasks afterwards.

Inputs: name (required), scope, columns, projectId, +3 more.

critical_path_narrativeA
Read-onlyIdempotent
Inspect

Compute the critical path for a project with the schedule engine and return a prose summary. The critical path is the chain of linked tasks with no float, worked out from dependencies, durations, constraints and the project calendar; no field on a task puts it on the path, and task priority is unrelated to it. Returns the ordered critical-task IDs, the bottleneck task, projectEnd (the engine's computed finish), the project's total duration in days, the critical chain's own length in working days (chainDurationDays, the figure the prose quotes), a 2-3 sentence explanation of the chain, autoSchedule, and facts: computedAt, statusDate, criticalTasks (title, computed and stored start and finish, float), computedFinish next to storedLatestDue (the latest due date stored on a task) and projectEndField, finishesAgree, finishGapCalendarDays, finishesLaterThanStored (the tasks the engine finishes after their stored due date, with a reason code) and finishNote, one paragraph stating both finishes and why they differ. The calculation is deterministic (no LLM); the prose falls back to a template when the AI provider is unavailable. No plan gate. Use when the user asks what is on the critical path, which tasks are critical, why a task is or is not critical, asks for tasks to be made critical, or asks when the project or its critical path finishes.

Inputs: projectId (required).

decide_closeout_signoffA
Destructive
Inspect

Record the caller's decision on a closeout that is IN_REVIEW: SIGNED_OFF, or CHANGES_REQUESTED with a comment saying what needs to change. When every active designated reviewer has signed off the closeout is SIGNED_OFF and the person who sent it is told; any change request sends it back to DRAFT and tells them too. A designated reviewer may decide, as may the project Owner or Manager, whose decision can send it back but never counts toward the quorum unless they were named. Refused with CLOSEOUT_NOT_IN_REVIEW when nothing is waiting. Returns the record get_closeout_status returns.

Inputs: decision (required), projectId (required), comment.

decide_time_offA
DestructiveIdempotent
Inspect

Approve or decline a PENDING time off request. Requires org-wide project access (a manager). An approved request takes those working hours out of the capacity planner and tells the people running affected projects when it lands on tasks with little float; a declined one changes nothing. The person who asked is notified either way. A request already decided is refused with code NOT_PENDING.

Inputs: status (required), timeOffId (required).

decide_workflow_approvalAInspect

Decide a PENDING workflow approval (APPROVED or REJECTED) with an optional note. Caller must be the assigned approver. Duplicate decisions return CONFLICT. The workflow engine picks the decision up on its next tick. Plan gate: automations (PRO+).

Inputs: decision (required), approvalId (required), note.

delete_documentA
DestructiveIdempotent
Inspect

Delete a workspace document. Recoverable from the recycle bin (a manager can restore it). This is a GOVERNED destructive operation: an org admin must enable it in Settings > Agents > Agent Policies (Governed operations) before a connected agent can run it; otherwise it is denied. You also need write access to the document.

Inputs: documentId (required).

delete_projectA
DestructiveIdempotent
Inspect

Soft-delete one project. The project (and its tasks via cascade) is moved to the recycle bin, restorable for the org's data-retention window. Caller must have project.delete on the project (project OWNER by default).

Inputs: projectId (required).

delete_taskA
DestructiveIdempotent
Inspect

Soft-delete one task. The task AND its subtasks are moved to the recycle bin (restorable via the Recycle Bin UI for the org's data-retention window, with subtasks, attachments, comments and dependencies intact). Caller must have task.delete on the project. Returns the recycle-bin entry id so a human can restore it manually.

Inputs: taskId (required).

delete_workspace_tableA
DestructiveIdempotent
Inspect

Delete a workspace table (a "list") and its rows. Recoverable from the recycle bin (a manager can restore it). This is a GOVERNED destructive operation: an org admin must enable it in Settings > Agents > Agent Policies (Governed operations) before a connected agent can run it; otherwise it is denied. You also need write access to the list.

Inputs: tableId (required).

describe_capabilitiesA
Read-onlyIdempotent
Inspect

Return the live MCP tool surface for the calling org. Each row: name, description, kind (READ/MUTATION), category (coarse domain bucket, e.g. tasks / governance / microsoft), featureKey (plan gate), permissionKey, monthlyCap (-1 = unlimited), mcpExposed (true if reachable from MCP), planSatisfied (caller's plan grants the feature gate), and permissionSatisfied (caller's role grants the permission: true/false for org-level keys, null for project-level keys that depend on your role in a specific project). Together they let you predict a 402/403 before calling. IMPORTANT , this lists the ENTIRE catalog, not the tools you currently hold. Read availability on each row: "available" means call it directly; "loadable" means it exists and you are permitted to use it but must call load_tools with that row's category FIRST. The availableNow and loadable counts say how many of each. The distinction matters for reporting reach: availableNow is what is callable right now, whereas totalTools counts the whole catalog including rows that are gated or not yet loaded. Optional filters: kind=READ|MUTATION, mcpOnly=true, availableOnly=true. Pairs with whoami, which supplies the identity and plan context these gates resolve against. Source-of-truth is the registered tool catalog + MCP_EXPOSED_TOOLS, not training data.

Inputs: kind, mcpOnly, availableOnly.

describe_schemaA
Read-onlyIdempotent
Inspect

Return the canonical Onplana entity schema. Three call modes: (1) no args → list every known entity name; (2) entity= → full descriptor (fields with type/required/default/enumValues/maxLength/isFK/isAutoManaged/description, relations, state machines, validation rules, writeSurfaces); (3) includeAll=true → bulk payload of every descriptor. It is the only source of field shapes when planning against an empty org (no sample row to introspect via get_X), and of the cross-field rules a write must satisfy. Pass projectId with entity=Task (or Project/ProjectProposal) to also get that project's live custom fields merged in, the effective create-time field set in one call. Source = hand-curated lib/schemaCatalog.ts mirroring prisma/schema.prisma + tool validate() rules.

Inputs: entity, projectId, includeAll.

designate_gate_reviewerA
Idempotent
Inspect

Designate a user as a gate reviewer for a specific governance gate. Requires org.governance.manage. Idempotent. User must be an active org member. Feature: governance (ENTERPRISE+).

Inputs: gate (required), userId (required).

design_page_draftA
DestructiveIdempotent
Inspect

Design or edit a web part page with AI (PRO+ feature). Call with { pageId, prompt } to GENERATE a proposed page design from a natural-language instruction, the tool returns the proposed Puck Data content plus a diff (removed parts + added external links) WITHOUT saving it. Then call with { pageId, draft, expectedUpdateRevision } to APPLY that reviewed draft; if the diff removes parts or adds non-first-party external links the apply is REFUSED with requiresConfirmation until you re-send it with acknowledgeChanges: true. A "Before AI edit" version is snapshotted before the write. Requires contribute access. Publish separately with publish_page.

Inputs: pageId (required), draft, prompt, promptText, +2 more.

design_workflow_draftA
DestructiveIdempotent
Inspect

Design a workflow graph with AI for an existing workflow (PRO and above). Called with a prompt, it returns a proposed graph, a plain-language readback of what that graph would do, and a diff against the current one, without saving anything. Called with a graph from a previous reply, it saves that graph, and saving always requires acknowledgeChanges, so a person sees the readback before a workflow changes. Without it the reply is a refusal carrying that readback. It edits an existing workflow and cannot create one, and it cannot activate a workflow: a saved draft stays in whatever state the workflow was already in. Unresolved references, such as an approver who is not in the workspace, are listed on the draft and prevent it being saved until a person chooses them. A draft is built for the trigger the workflow already has, returned as trigger with triggerProposed false; it never changes a workflow's trigger or name.

Inputs: workflowId (required), graph, prompt, acknowledgeChanges.

detect_evm_data_sourceA
Read-onlyIdempotent
Inspect

Probe the cost-attribution path EVM will use for a project. Returns "imported" when >=80% non-milestone tasks have plannedCost (MS Project import), "rate-cards" when at least one active rate card exists, "none" otherwise. Cheap pre-flight before calling calculate_evm so you can warn the user when fidelity is low.

Inputs: projectId (required).

dismiss_all_read_notificationsA
DestructiveIdempotent
Inspect

Delete every already-read notification for the calling user. Pair with mark_all_notifications_read to clear the inbox entirely.

Inputs: no named parameters.

dismiss_notificationA
DestructiveIdempotent
Inspect

Permanently delete one notification (removes it from the inbox). Caller must own the notification.

Inputs: notificationId (required).

dismiss_riskA
DestructiveIdempotent
Inspect

Mark a ProjectRisk as dismissed, with why: reason is MITIGATED, NOT_RELEVANT, DUPLICATE or OTHER (OTHER needs a note), and note is free text. Idempotent: dismissing an already-dismissed risk returns the existing row without re-writing. Also records implicit "DISMISSED" feedback against the risk category, which downweights that category in future detector runs. A person can restore a dismissed risk from the Risks tab.

Inputs: riskId (required), note, reason.

draft_documentAInspect

Draft a markdown document directly into a project document library as a first-class file (mimeType=text/markdown). The operator opens it from the Documents tab and reads the styled output. Use for status reports, summaries, and other prose deliverables the agent wants the team to review in context. libraryId must reference an existing library; create one first via create_library if needed. contentMarkdown is capped at 100KB UTF-8; split into multiple documents or take the file-upload route for anything larger. Supported markdown features: headings (h1-h6), bold, italic, inline code, bullet + numbered lists (including multi-level nesting), paragraphs, links and auto-linked URLs, GFM pipe tables, blockquotes, fenced code blocks, and thematic breaks (---). NOT supported: embedded images (alt degrades to its alt text), footnotes, and setext (underline) headings. Requires project.content.create (CONTRIBUTOR+; Viewers are read-only).

Inputs: title (required), libraryId (required), contentMarkdown (required).

duplicate_projectAInspect

Make a copy of an existing project as a new project, to run the same work again: "copy last quarter's launch project", "duplicate this project for the new office", "start again from the Q3 plan". The copy carries the project's settings and description, tasks at every level with their order, priorities, estimates, durations, constraints and recurrence, the dependencies between its own tasks, epics, sprints, milestones, tags and org-wide custom field values. With people (default true) it also carries the project members, assignees and task collaborators; the source's owner joins as a manager. It resets every task to To do with no progress, actuals or completion, every milestone and sprint to not done and the project to Planning, and the caller becomes the owner. With startDate every date moves by the same whole days; without it the dates stay as they were. It leaves behind comments, attachments and documents, risks, issues, baselines, time, expenses and revenue, portfolio links, deals, readiness and closeout records, workspace lists and pages, sharing grants, links to tasks in other projects, fields scoped to the source project and every sync the source has. The source project is not changed. Unlike save_project_as_template, which keeps two levels of tasks as date offsets for reuse across many projects and needs the templates feature, this keeps the whole schedule and makes one new project now. A project above 5000 tasks or one that holds a Maker app is refused. The new project counts toward the plan's project limit. Undo deletes the copy. The result includes url, a direct link to the new project in Onplana, which the user has no other way to find from another app.

Inputs: projectId (required), name, people, startDate.

duplicate_workflowAInspect

Clone a workflow with fresh step IDs. PRO+ feature (automations). The copy starts inactive (isActive=false) and is named " (Copy)". Returns the new workflow's id + name. Use this to template-then-tweak an existing workflow without disturbing the original. MUTATION: writes a new Workflow row. Permission: automation.manage on the workflow's project (or org MANAGER+ for org-wide workflows).

Inputs: workflowId (required).

edit_commentA
DestructiveIdempotent
Inspect

Edit a comment you authored. Only works on comments the calling agent created. Content must be 1-10000 chars. Use this to correct a previously posted status note or fix a typo.

Inputs: content (required), commentId (required).

end_sessionA
Idempotent
Inspect

Signal that this agent session is complete. Flips the underlying AiConversation agentStatus to ENDED so the human-side Settings → Agents UI shows the session as terminated. Optional reason string (1-500 chars) is captured for audit. Idempotent: calling again returns the existing terminal status without changing it. Honest agents call this when they've finished their assigned work or are about to disconnect; humans can also revoke the PAT, which is more forceful but achieves the same lifecycle outcome. Any task leases this session still holds are handed back, so the tasks become available to other agents immediately rather than after the lease expires.

Inputs: reason.

evidence_exportA
Read-onlyIdempotent
Inspect

ENTERPRISE+ compliance evidence export over a date window (≤90 days). Returns per-week timesheet compliance + the TIMESHEET_* AuditLog event stream for the period, plus summary totals. Mirrors GET /api/compliance/evidence used by SOX/HIPAA shops to feed external GRC tools. Permission: org.compliance.manage (default OWNER+/ADMIN+). Inputs: from and to as YYYY-MM-DD strings. CSV format is HTTP-only; this tool returns JSON.

Inputs: to (required), from (required).

export_audit_logA
Read-onlyIdempotent
Inspect

Read org audit log entries (ENTERPRISE+ feature). Requires OWNER or ADMIN org role. Returns up to 200 entries per call with optional filters: action, resource, userId, date range (from/to as ISO strings), and pagination (limit/offset). Each entry carries clientSurface (which client made the request: WEB, MAKER, EXTENSION, DESKTOP, MOBILE, MCP, PAT, SYSTEM, UNKNOWN) and clientLabel (the precise client). Distinct from actorType, which is the actor's privilege. Null on rows predating client attribution; that history is deliberately not backfilled, so a missing value means unknown rather than web.

Inputs: to, from, limit, action, +3 more.

fetchA
Read-onlyIdempotent
Inspect

Retrieve full content for one resource by id. The id MUST be one previously returned by the search tool, an opaque string 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 items), and a url deep-link into the Onplana app. Use this AFTER search when you need the full body of a specific result to answer the user. Returns not_found if the id is invalid, malformed, or refers to a resource the caller can't see.

Inputs: id (required).

find_meeting_timesC
Read-onlyIdempotent
Inspect

Find free meeting times across attendees using the Graph findMeetingTimes endpoint. Reuses Calendars.ReadWrite scope.

Inputs: attendees (required), endWindowUtc, maxCandidates, startWindowUtc, +1 more.

find_similar_projectsA
Read-onlyIdempotent
Inspect

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 org's RAG index to be populated (Azure OpenAI required).

Inputs: limit, projectId, description.

gantt_optimizeA
Destructive
Inspect

Ask the AI to propose a new schedule for a project that fits all tasks before a target deadline while respecting dependencies. Returns an array of {taskId, startDate, dueDate} proposals (YYYY-MM-DD strings), any warnings, and feasibility status. Use mode="preview" (default) to inspect the proposal first; use mode="apply" to capture a baseline and commit the dates immediately (requires project Owner or Manager role). Cap: 100 tasks per project. Use when the user asks "can we finish by [date]?" or "reschedule this project to meet the deadline".

Inputs: deadline (required), projectId (required), mode, previewId, +2 more.

generate_status_reportA
Read-onlyIdempotent
Inspect

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.

Inputs: projectId (required), locale.

get_agent_skillA
Read-onlyIdempotent
Inspect

Returns the full text of an Onplana agent skill: a written guide to driving this MCP server for a particular job, covering the cold-start sequence, which tools to reach for, and the conventions Onplana expects. Two exist. planner turns a goal or brief into an executable plan, a plan document plus a task tree with dates, dependencies and owners. autonomous runs an existing plan, claiming tasks, recording evidence and handing back. Called with no argument it lists both without their bodies. The same text is downloadable at onplana.com/agent-skill for clients that install skills as files. No plan gate; all plans.

Inputs: skill.

get_ai_budgetA
Read-onlyIdempotent
Inspect

Read the caller org's AI token budget: monthly cap, per-seat cap, active members feeding the cap, top-up tokens, and the source label (unlimited / no-ai / tier / top-up-only). Use BEFORE calling tools that burn AI tokens (summarize_project, analyze_project_risks, generate_status_report, etc.) so you can fail fast or fall through to a non-AI path.

Inputs: no named parameters.

get_audit_entryA
Read-onlyIdempotent
Inspect

Read one AuditLog row by id. Returns the full payload including before / after snapshots when present. Org-scoped findFirst, so a cross-org id returns 404. OWNER or ADMIN + auditLogs feature. Includes clientSurface (which client made the request: WEB, MAKER, EXTENSION, DESKTOP, MOBILE, MCP, PAT, SYSTEM, UNKNOWN) and clientLabel (the precise client). Distinct from actorType, which is privilege. Null on rows predating client attribution; that history is not backfilled.

Inputs: entryId (required).

get_baselineA
Read-onlyIdempotent
Inspect

Full baseline snapshot for one project baseline row. Returns the serialised snapshot JSON (tasks + estimated hours + dates at the time of capture) for variance tracking. On every plan unless baselines are set to Professional; then it needs Professional or above, and below Professional reads continue for 30 days after the change, then are refused.

Inputs: baselineId (required).

get_capacityA
Read-onlyIdempotent
Inspect

Read one user's weekly available hours. Defaults to the caller's own row + the current Monday. Reading another user's capacity requires OWNER / ADMIN / MANAGER org role. PREFER get_capacity_report for the org-wide team utilisation rollup.

Inputs: userId, weekStart.

get_change_requestA
Read-onlyIdempotent
Inspect

Full change-request detail incl. reviews (per-reviewer decisions) + designated reviewers. Plan gate: changeControl (ENTERPRISE+).

Inputs: changeRequestId (required).

get_change_request_historyA
Read-onlyIdempotent
Inspect

Get field-level change history for one change request. Feature: changeControl (ENTERPRISE+).

Inputs: changeRequestId (required), limit, cursor.

get_closeout_statusA
Read-onlyIdempotent
Inspect

Read a project's closeout record: its state (DRAFT, IN_REVIEW or SIGNED_OFF), the final baseline and the EVM summary captured when it started (cost figures are null for a caller who may not read the project's cost), the closeout report document, the sign-offs and the quorum, the lessons learned, and what this caller may do next. closeout is null when none was started. Any caller who can read the project, or a reviewer named on its closeout.

Inputs: projectId (required).

get_cost_line_historyA
Read-onlyIdempotent
Inspect

The change history of one cost line, newest first: one row per changed field (label, category, amount, currency, status, date, taskId, note) with the old and new value, plus a "created" row and, for a deleted line, a "deleted" row holding its last values as JSON. Answers for a deleted line too. Access: budget.read.

Inputs: costLineId (required).

get_custom_field_valuesA
Read-onlyIdempotent
Inspect

List populated custom-field values across one project (default entityType=TASK; PROJECT and PROPOSAL also supported). Returns each row with its field definition's name + type joined for context. Requires PRO+ customFields feature + project read access.

Inputs: projectId (required), entityType.

get_document_historyA
Read-onlyIdempotent
Inspect

Get rename history for one workspace document. Caller must be a member of the parent project.

Inputs: documentId (required), limit, cursor.

get_document_metadataA
Read-onlyIdempotent
Inspect

Read one WorkspaceDocument row by id. Metadata only (no bytes). Access via project membership on the parent library's project; org-admin canViewAll also OK. 404 on cross-org / no-access. PREFER list_documents for browsing a library; PREFER get_document_history for rename history.

Inputs: documentId (required).

get_epicA
Read-onlyIdempotent
Inspect

Full detail on one epic incl. linked tasks summary (id/title/status/assigneeId/collaborators), project context, audit fields. Out-of-scope epicIds return not_found.

Inputs: epicId (required).

get_ideaA
Read-onlyIdempotent
Inspect

Read one idea in full, including any stored AI feedback pass (critique, sharpening questions, risks, and the recommended route) and what it was promoted into. Read this before update_idea so you can pass expectedUpdateRevision.

Inputs: ideaId (required).

get_issueA
Read-onlyIdempotent
Inspect

Full detail on one Issue: status, severity, owner/reporter, resolution, linked Task/Risk/CR, and recent comments (so you can see human responses on an issue you filed without a separate list_comments call), and the issue attachments as metadata. On a bug report the attachment is usually the evidence, so triage starts here; use read_issue_attachment to open one.

Inputs: issueId (required).

get_issue_historyA
Read-onlyIdempotent
Inspect

Field-level change log for one Issue (status moves, severity bumps, owner reassignments, resolution). Clone of get_task_history. Use before updating an issue another agent may have touched.

Inputs: issueId (required), limit.

get_milestoneA
Read-onlyIdempotent
Inspect

Full detail on one Milestone row. Distinct from Task.isMilestone — Milestone is its own first-class entity with dueDate + completed.

Inputs: milestoneId (required).

get_my_quota_usageA
Read-onlyIdempotent
Inspect

Return per-tool monthly quota usage for the calling org/agent. Default returns ONLY tools you have called this month (small payload). Pass includeAllExposed=true to pre-flight every registered tool before a long job. Pass cappedOnly=true to skip unlimited tools. Used count resets at the start of each calendar month (UTC); resetAt in the response is the next reset timestamp. capacityPct 100+ means at/over cap. Reading it ahead of a multi-day job is what surfaces a cap before it becomes a mid-flight 429.

Inputs: cappedOnly, includeAllExposed.

get_notification_preferencesA
Read-onlyIdempotent
Inspect

Retrieve the calling user's notification preferences (email on/off, task-assigned, overdue, project updates, weekly digest, plus the grouped email opt-outs: timesheetEmails, approvalEmails, workflowEmails). Returns system defaults when the user has not yet saved preferences.

Inputs: no named parameters.

get_pageA
Read-onlyIdempotent
Inspect

Get one web part page by id. Viewers get the published content only (a never-published page is not found for them). Editors additionally get the working draft, the current updateRevision (pass it to update_page), and the version history summary.

Inputs: pageId (required).

get_planA
Read-onlyIdempotent
Inspect

Return a project's full plan tree in one call: project + epics + sprints + tasks (with parentId, epicId, sprintId, assignee, collaborators) + milestones. Optional includeDependencies adds each task's predecessor / successor edges; includeAgentBriefs adds the per-task brief. Capped at 500 tasks per response (taskTruncated=true if more exist - fall back to list_tasks for paginated reads). When the response carries taskTotal, that is the project's full task count, summary tasks included; summarize_project gives counts of work items for a large plan.

Inputs: projectId (required), includeAgentBriefs, includeDependencies.

get_plan_featuresA
Read-onlyIdempotent
Inspect

Read the caller org's plan code, plan display name, resolved feature flag map (plan defaults merged with admin overrides), trial end date, and billing interval. Use this before calling a tool that might hit a plan gate (aiAdvanced, automations, governance, etc.) so you can fail fast or surface the gate to the user.

Inputs: no named parameters.

get_portfolioA
Read-onlyIdempotent
Inspect

Get one portfolio with its in-scope projects. Returns owner, project summaries, and a hiddenProjectCount for projects the caller cannot see (org.project.view.all gated). A project whose cost the caller may not read has budget null and costHidden true. Archived projects are left out, as on the portfolio page. Requires the BUSINESS+ portfolios plan feature.

Inputs: portfolioId (required).

get_projectA
Read-onlyIdempotent
Inspect

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 visibility for - out-of-scope ids return not_found. PREFER get_plan when you need the FULL task tree (epics + sprints + tasks + deps + milestones in one call); this tool returns only headline data. autoSchedule false means the project has automatic scheduling off: an edit or a new link moves no other task until someone presses Recalculate. parentDatesFromSubtasks true means a task with subtasks takes its dates from them unless the task says otherwise (each task reports datesFromSubtasks). retainedLogic true means the remaining work of a started task waits on its links, so a late predecessor pushes it; false means a started task holds. archivedAt set means the project is archived and read-only: every write to it is refused (PROJECT_ARCHIVED) until it is unarchived. When taskCounts carries summaryTasks, the other counts are work items (tasks with no subtasks) and summaryTasks is the number of summary tasks, such as phases, they leave out. scheduleRisk, when present, is the latest finished schedule risk run: p80 is the date the project finishes by in 80 percent of simulated outcomes, chance (0 to 1) is the likelihood of finishing by against, which is the target date (chanceOf target) or the plan finish (chanceOf plan), and runAt is when the run finished. It is absent when the project has no finished run or the plan does not include schedule risk.

Inputs: projectId (required).

get_project_historyA
Read-onlyIdempotent
Inspect

Get field-level change history for one project. PREFER get_project for current state.

Inputs: projectId (required), limit, cursor.

get_project_velocityA
Read-onlyIdempotent
Inspect

Compute a project's task-completion velocity over the last 35 days. Returns lastWeek count, fourWeekAvg, driftPct (negative = slowing), and a 5-bucket breakdown (oldest to newest). Caller must have project access. Use this when the user asks about a project's pace, when investigating a VELOCITY_DRIFT governance signal, or before suggesting actions on a project (so the model knows whether the team is keeping up).

Inputs: projectId (required).

get_proposalA
Read-onlyIdempotent
Inspect

Get full detail on one governance proposal: business case fields, reviews, gate approvals (per-reviewer quorum rows, the current review round of each gate), criteria scores, sponsor, submitter, linked project (if APPROVED + bootstrapped). Visibility: reviewers (org.governance.review) see all; non-reviewers see only their own submissions. Out-of-scope proposalIds return not_found.

Inputs: proposalId (required).

get_proposal_historyA
Read-onlyIdempotent
Inspect

Get field-level change history for one proposal. Requires governance access.

Inputs: proposalId (required), limit, cursor.

get_readiness_statusA
Read-onlyIdempotent
Inspect

Read one project's live readiness to be completed (or archived): every criterion that applies, the result of each auto check (pass, fail or unknown), the stored state and owner of each manual or ai item, active waivers, the required gaps, whether the project is ready, the organization's enforcement mode (OFF, WARN or BLOCK) and the last recorded check. Changes nothing and records nothing. Any caller who can read the project.

Inputs: projectId (required), transition.

get_row_historyA
Read-onlyIdempotent
Inspect

Get cell-level change history for one list row. Available for rows in any list the caller can open, including organization-level lists.

Inputs: rowId (required), limit, cursor.

get_schedule_riskA
Read-onlyIdempotent
Inspect

Read the Monte Carlo schedule risk runs of a project. Returns the newest run (status QUEUED, RUNNING, DONE or FAILED) and, when that run is not finished, the newest finished run. A finished run carries a summary: the P50, P80 and P90 finish dates, the plan date (the latest stored task finish, as the Gantt shows it) and its chance of being met, the finish as the links schedule it, the target date and its chance when one was set, how many risk events were sampled, and unlinkedCaveat: a sentence, or null, saying the run understates the slip because more than 5 percent of the working tasks have no links (a delay on an unlinked task moves nothing). includeResult=true adds the whole stored result of the finished run (finish histogram and curve, milestone dates, task criticality and duration sensitivity). runId reads one run by id instead. Read-only; runs are started from the project Risks tab or the REST API.

Inputs: projectId (required), runId, includeResult.

get_seat_countA
Read-onlyIdempotent
Inspect

Read the caller org's seat-count breakdown: active members, deactivated members, agent-persona count, per-role tallies, GUEST count, free-guest allowance per plan, and the resulting billable seat count (the figure Stripe meters on, max with floor of 1). Active = OrganizationMember.isActive true (CLAUDE.md note 79). billableSeats EXCLUDES agent personas (an agent is not a billable human seat), mirroring the real billing path (routes/billing.ts).

Inputs: no named parameters.

get_sprintA
Read-onlyIdempotent
Inspect

Full detail on one sprint incl. linked tasks (id/title/status/assigneeId/collaborators/progress). Plan gate: sprints (PRO+).

Inputs: sprintId (required).

get_subtreeA
Read-onlyIdempotent
Inspect

Return a task and all its descendants up to a given depth. Use this when you have a root task id and want parent + children + grandchildren in one call. PREFER get_plan when you need the whole project tree; PREFER list_tasks(parentId) when you want exactly one level. Caps: maxDepth ≤ 5 (default 3), total nodes ≤ 200. Each node carries title / description / status / priority / progress / dueDate / assignee / collaborators / isMilestone / updateRevision (+ agentBrief when includeAgentBrief=true). The response also returns totalDescendants (the full count under the root, ignoring the caps) so you can tell when the tree was truncated.

Inputs: rootTaskId (required), maxDepth, includeAgentBrief.

get_taskA
Read-onlyIdempotent
Inspect

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. PREFER read_agent_brief when you have just claimed a task and want only the brief-relevant context; PREFER get_subtree when you need this task PLUS its descendants. §Y1: returns the shared task shape: id, title, description, status, priority, dates, progress, parent/epic/sprint, assignee + createdBy + updatedBy (each with isAgentPersona), collaborators (people working on the task besides its assignee), tags, customFields, agentBrief, isMilestone, updateRevision, claimRevision, isManual and datesFromSubtasks (true when the start and due dates come from the subtasks, so a date edit on the task is refused with PARENT_DATES_FROM_SUBTASKS).

Inputs: taskId (required).

get_task_historyA
Read-onlyIdempotent
Inspect

Returns field-level change log for one task. Agents use this to check if a task was recently modified before claiming or updating it. PREFER get_task when you only need current state.

Inputs: taskId (required), limit.

get_teamA
Read-onlyIdempotent
Inspect

Full team detail incl. all members (userId, name, role). Members may be deactivated org members — list_org_members for activity flags.

Inputs: teamId (required).

get_templateA
Read-onlyIdempotent
Inspect

Full template detail incl. snapshot JSON (tasks blueprint + defaultDuration). Visible: this org's templates plus globally-public ones. Plan gate: templates (PRO+).

Inputs: templateId (required).

get_user_inputA
Idempotent
Inspect

Poll the status of a prompt previously created via request_user_input. Returns the current status (PENDING / ANSWERED / CANCELLED / TIMED_OUT) plus answer text when ANSWERED. Stale prompts (now > timeoutAt) flip to TIMED_OUT inline on poll, no separate cleanup pass needed. Agents should poll on a backoff (e.g. 5s, 10s, 30s, 60s).

Inputs: requestId (required).

get_webhookA
Read-onlyIdempotent
Inspect

Get one webhook by id. Returns metadata but NOT the secret value (hasSecret boolean only — never echo a secret over MCP). Plan gate: webhooks (BUSINESS+).

Inputs: webhookId (required).

get_whiteboardA
Read-onlyIdempotent
Inspect

Get a whiteboard incl. Excalidraw elements (array) + appState. Use update_whiteboard with elements to commit changes; version bumps on each write. Plan gate: whiteboards (PRO+).

Inputs: whiteboardId (required).

get_wiki_pageA
Read-onlyIdempotent
Inspect

Get a single wiki page: metadata (title, icon, parent, order) + a read-only plaintext rendering of the body so you can read what the page says. The body is a Y.js collab doc — it can be READ here but only EDITED in the live editor (update_wiki_page changes metadata only). Plan gate: wikis (PRO+).

Inputs: pageId (required).

get_workflowB
Read-onlyIdempotent
Inspect

Full workflow definition: trigger ({event, condition}), graph (steps array with kind + label + next + config), schedule ({cron, timezone}), runCount/maxRuns. Plan gate: automations (PRO+).

Inputs: workflowId (required).

get_workflow_runA
Read-onlyIdempotent
Inspect

Full execution context for one workflow run: status, started / finished timestamps, step-run timeline, and approval decisions. PREFER list_workflow_runs to discover runs by workflow id or status; PREFER list_workflow_approvals for the caller's own approval inbox.

Inputs: runId (required).

get_working_calendarB
Read-onlyIdempotent
Inspect

Full working-calendar detail with every exception (holidays, special working days). workDays is a 0..6 day-of-week array (0=Sun).

Inputs: calendarId (required).

get_workspace_tableA
Read-onlyIdempotent
Inspect

Full workspace table incl. columns (id/name/colType/options/required/order) + rows + cells. A NUMBER cell is a number, null when empty or not a number; every other cell is text as stored. For very large tables prefer paging through list_workspace_rows.

Inputs: tableId (required).

implement_change_requestA
DestructiveIdempotent
Inspect

Mark an APPROVED change request as IMPLEMENTED. Caller must be a project Owner or Manager, or an org CCB member. Feature: changeControl (ENTERPRISE+).

Inputs: changeRequestId (required).

import_sharepoint_list_projectsA
Idempotent
Inspect

Import a SharePoint list used as a project tracker into an Onplana portfolio, one project per row. Columns map to project fields (name, status, owner email, start and end dates, health, budget, description); unmapped columns become project custom fields only when named in customFieldColumns. An owner email that matches an org member owns the project; any other email is written on the project as a note and nobody is invited. Rows imported by an earlier run are skipped, so a re-run creates no duplicates. Pass dryRun: true to see the columns, the proposed mapping and the first rows as projects without writing anything. Requires the SharePoint permission on the connected Microsoft account.

Inputs: siteId (required), listId, mapping, listName, +2 more.

initiate_closeoutA
Destructive
Inspect

Start the closeout of a completed or cancelled project: captures a final baseline ("Final closeout snapshot") and its EVM summary, writes the closeout report into the project's documents, and leaves the record in DRAFT. Called again while the closeout is DRAFT it recaptures both and rolls the report forward as a new version. Refused while the closeout is in review or signed off (CLOSEOUT_LOCKED) and on a project that is not completed or cancelled (PROJECT_NOT_CLOSED). Needs project.edit. Returns the same record get_closeout_status returns.

Inputs: projectId (required).

insert_subprojectAInspect

Insert one project into another as a subproject: a read-only summary row at the inserted project's span, its tasks shown under it. Both projects must be in this workspace. The parent's schedule then finishes no earlier than the subproject; the subproject itself never moves for its parent. Refused when the project would insert itself or a project that already includes it. position places the row among the parent's top-level tasks by their order; omit it to add the row last. Access: edit the parent project and read the inserted one.

Inputs: projectId (required), insertedProjectId (required), position.

instantiate_planAInspect

Build a complete project plan in Onplana in one call: the project, its tasks and subtasks, epics and risks, with a start and due date on every task. Fits "plan a website launch", "turn this goal into a project with tasks and dates" and "set up a project plan for our office move". A first draft written from the conversation is a valid plan; every task stays editable afterwards. Each task carries estimatedDays, and every task gets a start and due date computed from it, laid out one after another, so the project opens with a filled timeline. This call takes no predecessors; link_dependency adds them afterwards. By default it CREATES A NEW PROJECT for the plan. Pass projectId to add the plan to a project that ALREADY EXISTS instead. Because it creates a project by default, calling create_project first and then this tool WITHOUT projectId produces two projects, one of them empty. When a project already exists, whether just created or named by the user, its id belongs in projectId. Attaching appends only: it never renames the project, never changes its owner, and never reschedules tasks that were already there. The plan carries projectTitle, scopeSummary, estimatedStart, estimatedEnd, tasks[] (title, priority, estimatedDays, optional description, subtasks[] and collaborators) and risks[]. On the create path the caller becomes project owner; attaching leaves the existing owner alone. A task the plan does not name an assignee for goes to the person the call is made for, not to the agent persona, so generating a plan does not put its tasks in the agent work queue that list_assigned_tasks reads. Optional epics[] group the tasks into phases or themes ("Design", "Build", "Launch"): each epic has a caller-defined ref, and a task joins one through task.epicRef. When epics is omitted, every task lands in the default "Initial Scope" epic (legacy behaviour). UNDO SEMANTICS DIFFER BY PATH, and the difference is destructive: a project this call CREATED is fully reversed by delete_project, because nothing else is in it. A project this call ATTACHED to is not, because delete_project destroys the pre-existing project and everything that was already in it, not just what this call added; on that path only the individual tasks this call created are safely removable. createdProject in the result distinguishes the two. Limits: up to 20 epics and 100 tasks per call (each task may carry subtasks[]); split a larger plan across calls or extend it afterward with bulk_create_tasks / add_subtasks. The result includes url, a direct link to the project in Onplana, and createdProject, false when the plan was added to a project that already existed, in which case the plan is an addition to the user's project rather than a new one. ALWAYS show that link in your reply: the user is working inside another app and has no other way to find the plan you just built.

Inputs: plan (required), projectId, projectName, idempotencyKey.

instantiate_templateAInspect

Create a new project from a template (PRO+ feature). Provide the template id, a project name, and a start date (YYYY-MM-DD). The caller automatically becomes the project owner.

Inputs: name (required), startDate (required), templateId (required).

invite_memberA
Destructive
Inspect

Invite a person by email to join this organization. Sends Onplana's standard invitation email in the name of the person this connection acts for; they join when they accept, and re-inviting an address sends a fresh link. Use this after create_project or instantiate_plan to bring the people on the plan into the workspace. seat is MEMBER (default: a team member place, which counts toward the plan's member limit and is a paid seat on paid plans) or GUEST (access to the projects they are added to only; free inside the plan's guest allowance). role (ADMIN, MANAGER or MEMBER, default MEMBER) applies to a MEMBER seat and cannot exceed the caller's own role. Refusals: SEAT_LIMIT_REACHED when members plus invitations already waiting fill the member limit (with the plan, or the 14-day Pro trial, that lifts it where one exists), RATE_LIMITED, EMAIL_UNVERIFIED, and an address that already belongs to a member. Permission: org.member.invite (default MANAGER+); on the Free plan any member except a guest may invite at a MEMBER or GUEST seat.

Inputs: email (required), role, seat.

leveling_narrativeA
Read-onlyIdempotent
Inspect

Generate a prose summary of a project's resource leveling situation. Runs the deterministic overallocation analysis first, then asks the AI to explain WHY the suggested moves were chosen and what the trade-offs are. Returns a 2-3 sentence overall summary and a per-suggestion hint for each recommended task move. Feature: resourceMgmt (PRO+). Use this after resource_leveler_analyze when the user wants a plain- language explanation of the results, not just the raw numbers.

Inputs: projectId (required).

list_assigned_tasksA
Read-onlyIdempotent
Inspect

List tasks assigned to YOU (the calling agent / user). Enriched variant of list_my_tasks: each row includes description, agentBrief, projectName, and hasOpenPrompt so an agent can pick its next task and start work without a follow-up get_task call. By default excludes DONE tasks. Filters: status, projectId, includeDone, limit (max 50). When the response carries hasMore true, more tasks match than the limit returned and total counts them all.

Inputs: limit, status, projectId, includeDone.

list_audit_logA
Read-onlyIdempotent
Inspect

List AuditLog rows for the caller's org with common filters: userId, action, resource, since (ISO), until (ISO), search (matches userEmail / action / resource). Default limit 50, max 200. Requires OWNER or ADMIN org role, auditLogs feature (ENTERPRISE+). PREFER export_audit_log for bulk CSV/JSON export. Each row carries clientSurface (which client the request came from: WEB, MAKER, EXTENSION, DESKTOP, MOBILE, MCP, PAT, SYSTEM or UNKNOWN) and clientLabel (the precise client, e.g. "Claude Code"). These are a DIFFERENT axis from actorType, which is the actor's privilege. Both are null on rows written before client attribution shipped; that history is deliberately not backfilled, so absence means "unknown", never "web".

Inputs: limit, since, until, action, +4 more.

list_baselinesA
Read-onlyIdempotent
Inspect

List baseline snapshots captured for a project. Returns id, name, takenById, takenAt per row. Snapshot JSON is excluded from the list to keep it small; get_baseline returns the snapshot payload. On every plan unless baselines are set to Professional; then it needs Professional or above, and below Professional reads continue for 30 days after the change, then are refused.

Inputs: projectId (required), limit, cursor.

list_calendar_eventsA
Read-onlyIdempotent
Inspect

List calendar events for the authorized user. Without a date window, returns the next top events. With startUtc + endUtc, uses Graph calendarView for instance expansion of recurring meetings. No new scope.

Inputs: top, endUtc, startUtc.

list_ccb_membersA
Read-onlyIdempotent
Inspect

List the Change Control Board (CCB) member roster for the current org. Requires org.governance.manage (Admin+ by default). Feature: changeControl (ENTERPRISE+).

Inputs: no named parameters.

list_change_requestsA
Read-onlyIdempotent
Inspect

List change requests. Optional filters: projectId, status. Returns id, title, type, priority, status, schedule + budget impact, projectId, requesterId per row. PREFER get_change_request for full detail incl. reviews; PREFER submit_cr_review to act on a SUBMITTED/UNDER_REVIEW CR you are a designated reviewer for. Plan gate: changeControl (ENTERPRISE+).

Inputs: limit, cursor, status, projectId.

list_commentsA
Read-onlyIdempotent
Inspect

List top-level comments on a task, project, proposal, or issue. Exactly one of taskId, projectId, proposalId, issueId, or companyId must be set. Returns root comments with their direct replies + author info. Newest comments first. Each root comment carries url, the link in the Onplana web app to the task, project, issue, proposal or client it is on.

Inputs: taskId, issueId, companyId, projectId, +1 more.

list_compliance_exceptionsA
Read-onlyIdempotent
Inspect

List timesheet compliance exceptions for the current org. Filter to active-only with activeOnly=true. Requires org.compliance.manage. Feature: auditLogs (ENTERPRISE+).

Inputs: activeOnly.

list_cost_linesA
Read-onlyIdempotent
Inspect

A project's cost lines (its budget list) and their totals against the budget, in the project currency. Each line is EXPECTED, COMMITTED or SPENT. summary: spent = SPENT lines; committed = COMMITTED + SPENT; forecast = every line; remaining = budget - forecast; remainingAfterCommitments = budget - committed. When summary.labourActual is a number, timesheet labour priced by earned value is included in spent, committed and forecast; null means labour is not included. A null budget means none was entered, and the remaining figures are then null, not zero. status filters lines only; summary always covers every line. Access: callers who may read the project cost (budget.read).

Inputs: projectId (required), status.

list_custom_field_defsA
Read-onlyIdempotent
Inspect

List custom-field definitions for an entity type (TASK / PROJECT / PROPOSAL). When projectId is set the return is the union of org-wide definitions and the project's own scoped fields, unless scope='project-only' which trims to just the project-scoped subset. Requires the PRO+ customFields plan feature.

Inputs: scope, projectId, entityType.

list_dependenciesA
Read-onlyIdempotent
Inspect

List TaskDependency rows. Specify projectId (all deps in a project) OR taskId (deps where this task is predecessor or successor). Returns predecessor + successor task ids and titles, dependency type (FINISH_TO_START/START_TO_START/FINISH_TO_FINISH/START_TO_FINISH), and lag in days. PREFER get_plan when you need the full dependency graph + the tasks.

Inputs: limit, cursor, taskId, projectId.

list_documentsA
Read-onlyIdempotent
Inspect

List documents (files + external links) in a workspace library. Returns id, name, fileName, mimeType, size, linkedMode (FILE | LINK), externalProvider, externalUrl, uploader, timestamps. Newest first. Use list_libraries first to discover the libraryId.

Inputs: libraryId (required), limit, cursor.

list_document_versionsA
Read-onlyIdempotent
Inspect

List a workspace document's version history, newest first. Each entry: versionNumber, fileName, mimeType, size, createdAt, createdBy. Also returns the approval record: status (the approval status a workflow set, with the version it covers) and approvals (who approved or rejected which version, and when). The approval record is part of the document approval workflows plan feature; on a plan without it the two fields are absent. Read-only.

Inputs: documentId (required).

list_epicsA
Read-onlyIdempotent
Inspect

List epics in a project (ordered). Returns each epic's id, name, description, color, order, projectId, taskCount. Cursor pagination (last-id). PREFER get_plan when you also need the tasks under each epic; PREFER get_epic for full single-epic detail.

Inputs: projectId (required), limit, cursor.

list_escalationsA
Read-onlyIdempotent
Inspect

ENTERPRISE+ list of in-flight TimesheetEscalation rows for the org. Optional status (active|all, default active) filters resolved rows. Returns each user's current step + step name from the active template + history timeline. Mirrors GET /api/compliance/escalations. Permission: org.compliance.manage (default OWNER+/ADMIN+).

Inputs: status.

list_evaluation_criteriaA
Read-onlyIdempotent
Inspect

List evaluation criteria for a governance gate (PROPOSAL_REVIEW, BUSINESS_CASE_REVIEW, or PLAN_REVIEW). Falls back to global defaults when no org-specific criteria exist. Feature: governance (ENTERPRISE+).

Inputs: gate.

list_gate_approvalsA
Read-onlyIdempotent
Inspect

Return the calling agent's gate-approval inbox (ProposalGateApproval rows where reviewer = caller). Default status=PENDING (your queue: seats whose proposal is still waiting on that gate, in the gate's current review round); pass status=APPROVED/REJECTED to see your decision history, where round says which time the proposal was at that gate. Reviewers with org.governance.review can pass reviewerId to inspect another user's queue (e.g. admin auditing). On the PENDING queue, awaiting lists the proposals at a review gate the reviewer sits on the panel of with no seat for them in the current round and no review by them since, the same list the web My Approvals shows; it is empty while that list is switched off. PREFER submit_proposal_review to act on a PENDING row or an awaiting proposal. Plan gate: governance (ENTERPRISE+).

Inputs: limit, status, reviewerId.

list_gate_reviewersA
Read-onlyIdempotent
Inspect

List the designated gate reviewers for the current org. Optionally filter by gate (PROPOSAL_REVIEW, BUSINESS_CASE_REVIEW, PLAN_REVIEW). Requires org.governance.manage. Feature: governance (ENTERPRISE+).

Inputs: gate.

list_ideasA
Read-onlyIdempotent
Inspect

List captured ideas. scope="general" returns unfiled ideas (no project), "mine" returns ideas the caller captured, "all" (default) returns both. Filter by projectId or status. Ideas are NOT tasks: they never appear in list_my_tasks, so this is the only way to see them.

Inputs: limit, scope, status, projectId.

list_issue_attachmentsA
Read-onlyIdempotent
Inspect

List the attachments on an Issue (metadata only: id, fileName, mimeType, size, uploader, createdAt). Use read_issue_attachment to fetch the content of one. On a bug report the attachment is usually the evidence. Caller must be able to read the issue.

Inputs: issueId (required).

list_issuesA
Read-onlyIdempotent
Inspect

List Issues visible to the caller. Filters: projectId (optional - omit for cross-project), status, severity, type, ownerId. Ordered by severity desc then most-recently-reported. Returns up to 50 per call.

Inputs: type, limit, status, ownerId, +2 more.

list_librariesA
Read-onlyIdempotent
Inspect

List document libraries on a project or proposal, the tenant-level libraries with scope="org", or across everything with all=true. Returns id, name, parent project/proposal name, and document count. Newest first. Pass exactly one of projectId / proposalId / scope="org" / all=true.

Inputs: all, scope, projectId, proposalId.

list_mentionsA
Read-onlyIdempotent
Inspect

List @-mentions for the calling user from the last 30 days. Scoped to ctx.userId. Implementation matches the route: fetch the most recent 200 notifications, filter by metadata.kind === "mention".

Inputs: no named parameters.

list_milestonesA
Read-onlyIdempotent
Inspect

List milestones in a project ordered by order asc then dueDate asc. Optional completed filter. Returns id, title, dueDate, completed, completedAt, order, projectId, and url (its link in the Onplana web app). Distinct from Task.isMilestone, these are first-class Milestone rows with their own dueDate column.

Inputs: projectId (required), limit, cursor, completed.

list_my_operationsA
Read-onlyIdempotent
Inspect

List MY recent tool invocations (AiOperation rows) since a given timestamp. Conversation-scoped by default (just this session); pass allMySessions=true to widen to every MCP conversation in this org. Each row carries toolName, mode (PREVIEW/APPLY), status (APPLIED/FAILED/etc), outputEntityType+Id, errorMessage, and durationMs. errorMessage repeats the same message the failing call returned at the time, so a constraint trip reads as the actionable explanation rather than raw database text. Time window capped at 30 days. Scope: this answers agent-restart introspection ("what did I do before I crashed?") from the operation ledger, whereas list_recent_activity(projectId, since) answers "what changed on this PROJECT?" from the activity feed. Different tables, different questions.

Inputs: since (required), limit, allMySessions.

list_my_tasksA
Read-onlyIdempotent
Inspect

Answers "what is on my plate", "my tasks this week" and "what do I have overdue" from the user's Onplana workspace. List tasks assigned to YOU (the calling user), and tasks you collaborate on. Resolves "me" server-side - no need to pass an assignee id. Each row's role is "assignee" or "collaborator"; a collaborator row also names the assignee in assigneeName. Optional scope: "assigned" (the default, the tasks above) or "managed", every task in the projects you manage (projects you own, or where your project role can edit the project), whoever holds it; a row there you are not on has role "manager" and names its assignee. Optional filters: status (TODO / IN_PROGRESS / REVIEW / DONE / BLOCKED), overdueOnly (only tasks past due date and not DONE). Default returns 25, max 50. PREFER list_assigned_tasks when YOU are an AI agent - that variant adds agentBrief, projectName, and hasOpenPrompt to each row so you can start work without a follow-up get_task. Use list_tasks instead when querying across multiple users. When the response carries hasMore true, more tasks match than the limit returned and total counts them all.

Inputs: limit, scope, status, overdueOnly.

list_notificationsA
Read-onlyIdempotent
Inspect

List the calling user's notifications. Scoped to ctx.userId; never returns another user's inbox. Optional filters: onlyUnread, type (NotificationType enum value), since (ISO date), search (matches title + body). Default 50, max 100. PREFER list_mentions for @-mention drill-down; PREFER mark_notification_read to flip a single row read.

Inputs: type, limit, since, search, +1 more.

list_notification_typesB
Read-onlyIdempotent
Inspect

List the distinct NotificationType values the caller has received, each with the row count. Useful for building filter chips. Scoped to ctx.userId.

Inputs: no named parameters.

list_org_membersA
Read-onlyIdempotent
Inspect

List active members of the caller's organization with name + role. Every row carries isAgentPersona: true means a service account (an MCP-connected agent), false means a person. Filter on it before reporting headcount or reviewing who holds access, since agents are excluded from 2FA posture and billable seats elsewhere in the product. 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/GUEST).

Inputs: role, limit.

list_org_risk_patternsA
Read-onlyIdempotent
Inspect

Aggregate cross-project risk patterns for the caller's accessible projects. Returns per-category accepted vs dismissed counts, the projects where the category surfaced, and a verdict (recurring / frequently_dismissed / mixed). Use this when planning risk analysis on a new project or when the user asks "what kinds of risks keep coming up for us?" Optionally filter by category (SCHEDULE / RESOURCE / BUDGET / SCOPE / EXTERNAL) or change the windowDays lookback (default 90, max 365).

Inputs: category, windowDays.

list_org_risksA
Read-onlyIdempotent
Inspect

List the top 20 HIGH and CRITICAL undismissed risks across every project the caller can see, ordered by severity descending then most-recent first. PREFER list_risks when you need filtering by project, severity, category, or to include dismissed rows.

Inputs: no named parameters.

list_outlook_messagesA
Read-onlyIdempotent
Inspect

List recent Outlook inbox messages for the authorized user. Reuses existing Mail.Read scope (no new consent). Default 50 most recent; unreadOnly=true filters to unread.

Inputs: maxResults, unreadOnly.

list_overdueA
Read-onlyIdempotent
Inspect

Answers "what is overdue across my projects" and "which tasks are late" from the user's Onplana workspace. List tasks due before today (in the time zone of the user; a task due today is not overdue) 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 list_my_tasks({overdueOnly:true}) for "MY overdue tasks only" - this tool returns overdue tasks across all assignees. Each row carries collaborators, the people working on the task besides its assignee. Optional underTaskId narrows to the tasks under one task at any depth, such as a phase and its work packages. workItemsOnly true leaves out summary tasks (a task with subtasks, such as a phase), false includes them; the response's workItemsOnly field, when present, says which it read. When the response carries hasMore true, more tasks are overdue than were returned and total counts them all: raise limit, narrow by projectId or underTaskId, or read summarize_project for project-wide counts.

Inputs: limit, projectId, underTaskId, workItemsOnly.

list_pagesA
Read-onlyIdempotent
Inspect

List web part pages (PRO+ feature) as metadata only. Omit projectId for organization-scoped pages; pass projectId for that project's pages. Restricted pages you cannot access are hidden, and pages that have never been published are hidden unless you can edit them.

Inputs: projectId.

list_portfoliosA
Read-onlyIdempotent
Inspect

List every portfolio in the org with owner + project count. Sorted newest first. Requires the BUSINESS+ portfolios plan feature and the org.portfolio.manage permission (default MANAGER+). Use before add_project_to_portfolio to discover candidate portfolios.

Inputs: limit.

list_projectsA
Read-onlyIdempotent
Inspect

List the projects in the user's Onplana workspace, with status and dates. Fits "what projects do I have", "how are my projects doing" and finding the project a request refers to. To FIND A PROJECT BY NAME, pass search (case-insensitive substring on the name) rather than listing everything and matching client-side, which silently misses projects past limit in orgs with more projects than one page. Also filters by status and customFields. Returns up to limit projects ordered by most recently updated; total is how many MATCH (not just this page), and when truncated is true pass nextCursor back as cursor for the next page. Non-admin users only see projects they own or are a member of. On a first connect to a new org, whoami + describe_capabilities + describe_schema ground caller identity, available tools and entity shapes, which the list_* tools all read against. Each project carries autoSchedule; false means edits and links there move no other task. And parentDatesFromSubtasks, the default for a task with subtasks, and retainedLogic, whether a late predecessor pushes a started task. Archived projects are hidden unless includeArchived is true; an archived project carries archivedAt and is read-only until it is unarchived.

Inputs: limit, cursor, search, status, +2 more.

list_proposal_reviewsA
Read-onlyIdempotent
Inspect

List all reviews submitted on a governance proposal (gate-by-gate decision history). Visibility: reviewers see all; non-reviewers see only reviews on proposals they submitted. PREFER get_proposal when you also need the gate-approval (quorum) rows. Plan gate: governance (ENTERPRISE+).

Inputs: proposalId (required).

list_proposalsA
Read-onlyIdempotent
Inspect

List governance proposals. Non-reviewers (no org.governance.review) see only their own submissions; reviewers see all in the org. Optional filters: stage, priority, riskLevel, submittedById, title (case-insensitive substring), sortBy + sortOrder, cursor (last id). Returns up to 100 per call. PREFER get_proposal for full detail on one row; PREFER list_gate_approvals for the per-user gate-approval inbox.

Inputs: limit, stage, title, cursor, +5 more.

list_readiness_criteriaA
Read-onlyIdempotent
Inspect

List the readiness criteria (the definition of done) an organization holds projects to before they are completed or archived. Returns the org's own criteria when it has any for the transition, otherwise the platform preset set that applies, each with its check kind (auto, manual, ai), whether it is required, and its auto rule. presetSet browses a named preset set, or all of them, instead of the set that applies. Readable by every org member.

Inputs: presetSet, transition, projectType.

list_recent_activityA
Read-onlyIdempotent
Inspect

List recent activity (task creates / updates / status changes / comments / dependency edits) for one project since a given timestamp. Returns up to 100 ActivityLog rows newest-first with actor + entity + action so an agent that just reconnected can catch up on what changed while it was offline. Time window capped at 30 days; for older history use list_audit_log instead. Each item includes entityTitle (the changed entity's current title, so you know WHICH task, project, change request, proposal, issue, page or idea changed without a per-row lookup; null when that entity has since been deleted or moved out of this project) and changedFields (the field names that changed, when recorded). Page and idea rows the caller cannot open are left out, details included, rather than returned with a null title, so a response can hold fewer than limit items and still report hasMore.

Inputs: since (required), projectId (required), limit.

list_recycle_binA
Read-onlyIdempotent
Inspect

List soft-deleted items in the org recycle bin. Non-privileged callers only see items they themselves deleted; managers/admins see every item. Filter by entityType (project|task|proposal|document) and/or a substring on the title. Newest deletions first.

Inputs: limit, search, entityType.

list_risksA
Read-onlyIdempotent
Inspect

List project risks visible to the caller. Filters: projectId (optional), severity (LOW/MEDIUM/HIGH/CRITICAL), category (SCHEDULE/RESOURCE/BUDGET/SCOPE/EXTERNAL), includeDismissed (default false). Returns up to 50 risks per call, ordered by severity descending then most-recent first. Each risk carries url, its link in the Onplana web app.

Inputs: limit, category, severity, projectId, +1 more.

list_sharepoint_filesA
Read-onlyIdempotent
Inspect

List the files and folders in a SharePoint site's document library, as the authorized user sees them. Without driveId it reads the site's default library and also returns the site's other libraries (driveId each). Pass folderId to open a folder, or search to find files by name or content in the library. Each item's driveItemId (with driveId for a non-default library) is what attach_sharepoint_document takes. Read only; requires Sites.Read.All delegated scope, like list_sharepoint_sites.

Inputs: siteId (required), cursor, search, driveId, +1 more.

list_sharepoint_sitesA
Read-onlyIdempotent
Inspect

List SharePoint sites the authorized user can read. Default returns followed sites; pass search to walk the tenant index. Requires Sites.Read.All delegated scope.

Inputs: top, search.

list_sprintsA
Read-onlyIdempotent
Inspect

List sprints in a project. Filter by status (PLANNING/ACTIVE/COMPLETED/CANCELLED). Cursor pagination (last-id). Returns id, name, goal, status, startDate, endDate, taskCount per row. Plan gate: sprints (PRO+).

Inputs: projectId (required), limit, cursor, status.

list_subprojectsA
Read-onlyIdempotent
Inspect

The projects inserted into a project as subprojects (its master schedule), in the order its Gantt shows them. Each has its span, start and finish (YYYY-MM-DD), the earliest start and latest finish of its tasks; null when it has no dates. The parent project's schedule holds each subproject fixed at that span and finishes no earlier than its latest one; a subproject's own schedule never moves for its parent. position places it among the parent's top-level tasks by their order. Access: anyone who can read the project.

Inputs: projectId (required).

list_tagsA
Read-onlyIdempotent
Inspect

List every org-scoped tag with usage counts. Returns id, name, color, and counts of tasks + projects each tag is applied to. Sorted by name. Use before create_tag to avoid duplicates or to discover what tags exist.

Inputs: limit.

list_task_attachmentsA
Read-onlyIdempotent
Inspect

List the attachments on a task (metadata only: id, fileName, mimeType, size, uploader, createdAt). Use read_task_attachment to fetch the content of one. Caller must have visibility into the parent project.

Inputs: taskId (required).

list_tasksA
Read-onlyIdempotent
Inspect

List tasks visible to the caller, with optional filters: projectId, parentId (pass "null" string or JSON null for top-level-only), status, assigneeId (or the sentinels "me" / "unassigned"), assignedToAgentPersona, collaboratorId (or "me": tasks a person collaborates on without holding them), title with titleMode ("contains" default, "equals", "startsWith"; all case-insensitive), dueBefore / dueAfter, overdueOnly, orderBy. Each row carries collaborators, the people working on it besides its assignee, isManual and datesFromSubtasks (true when its dates come from its subtasks), and url, the task's link in the Onplana web app. Returns up to 200 tasks per call with cursor-based pagination (nextCursor). Without parentId, matching tasks at every depth are returned, subtasks included; parentId "null" narrows to top-level tasks. underTaskId narrows to every task under one task at any depth, such as a phase with its work packages and their tasks. workItemsOnly true leaves out summary tasks (a task with subtasks), false includes them; the response's workItemsOnly field, when present, says which it read; milestonesExcluded true, when present, says milestones were left out (pass workItemsOnly to include them). When the response carries hasMore, total counts every matching task and hasMore says more exist past this page: pass nextCursor back as cursor for the next page, or read summarize_project for project-wide counts. PREFER get_plan when you need the whole project tree in one call; PREFER list_assigned_tasks for your own queue. Use list_tasks when drilling parent to children or paginating through a large project. When you pass projectId, the response carries projectResolved: if it is false the id did not match any project visible to you and the empty tasks list says NOTHING about whether that project has work in it, re-check the id (use full ids from list_projects, never abbreviated) rather than concluding the project is empty or unsaved.

Inputs: limit, title, cursor, status, +14 more.

list_team_membersA
Read-onlyIdempotent
Inspect

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 with role=OWNER, regardless of ProjectMember table entries.

Inputs: projectId (required).

list_teamsA
Read-onlyIdempotent
Inspect

List teams in this org. Returns id, name, description, memberCount, createdAt per row. PREFER get_team for full member detail.

Inputs: limit, cursor.

list_templatesA
Read-onlyIdempotent
Inspect

List project templates visible to the caller: this org's templates plus globally-public templates (organizationId null). Returns id, name, description, category, isPublic, usageCount, createdById, createdAt per row. Plan gate: templates (PRO+).

Inputs: limit, cursor, category.

list_timesheet_approversA
Read-onlyIdempotent
Inspect

List the designated timesheet approver roster for the current org. Feature: timeTracking (PRO+).

Inputs: no named parameters.

list_timesheet_entriesA
Read-onlyIdempotent
Inspect

List timesheet entries. Members see their own entries by default; managers / approvers can pass userId to see anyone's, or omit userId to get the org-wide cut. Filter by weekStart (Monday-based 7-day window) OR startDate+endDate (arbitrary range). Status filter accepts a single string or array (DRAFT / SUBMITTED / APPROVED / REJECTED). total is how many entries match, which can exceed the rows returned; truncated says so. Requires the PRO+ timeTracking plan feature.

Inputs: limit, status, userId, endDate, +2 more.

list_webhook_deliveriesA
Read-onlyIdempotent
Inspect

List recent delivery attempts for a webhook (success or failure). Returns id, event name, HTTP statusCode, success boolean, duration ms, response body, createdAt. Newest-first. Plan gate: webhooks (BUSINESS+).

Inputs: webhookId (required), limit, cursor, success.

list_webhook_eventsA
Read-onlyIdempotent
Inspect

List the webhook event types the platform supports. Use this to discover valid values for the events array on create_webhook and update_webhook. Pure read, no org / plan gate.

Inputs: no named parameters.

list_webhooksA
Read-onlyIdempotent
Inspect

List webhook subscriptions in this org. Returns id, name, url, events, isActive, lastTriggeredAt, failCount. PREFER get_webhook for the secret + audit fields. Plan gate: webhooks (BUSINESS+).

Inputs: limit, cursor.

list_whiteboardsA
Read-onlyIdempotent
Inspect

List whiteboards in a project or proposal scope (elements + appState omitted from the list to keep payload small; use get_whiteboard). Plan gate: whiteboards (PRO+).

Inputs: limit, cursor, projectId, proposalId.

list_wiki_pagesA
Read-onlyIdempotent
Inspect

List wiki pages in a project or proposal scope. Pass parentId="null" to return only top-level pages. Returns id, title, icon, order, parentId, hasContent (true when yDocState is populated). Plan gate: wikis (PRO+).

Inputs: limit, cursor, parentId, projectId, +1 more.

list_workflow_approvalsA
Read-onlyIdempotent
Inspect

Caller's workflow-approval inbox (WorkflowApproval rows). Default status=PENDING (your queue: approvals whose run is still waiting on that step). Pass approverId to inspect another user's queue (admins). PREFER decide_workflow_approval to act on a PENDING row. Plan gate: automations (PRO+).

Inputs: limit, status, approverId.

list_workflow_runsA
Read-onlyIdempotent
Inspect

List workflow run history. Filter by workflowId, projectId, status (RUNNING / WAITING_DELAY / WAITING_APPROVAL / SUCCESS / FAILED / CANCELLED). Returns id, workflowId, status, event, taskId, startedAt, finishedAt, resumeAt, error per row. Cursor pagination. PREFER list_workflow_approvals for the decide-now inbox; PREFER cancel_workflow_run to abort an in-flight run. Plan gate: automations (PRO+).

Inputs: limit, cursor, status, projectId, +1 more.

list_workflowsA
Read-onlyIdempotent
Inspect

List workflows in the org. Returns each workflow's name, description, isActive, projectId (null = org-wide), runCount, maxRuns, triggerEvent, lastRunAt. Pass projectId to scope to one project (or omit for org-wide + every project). Pass entity and entityId to list the workflows set up on one project, task, document, library or list. PREFER get_workflow for the full graph + steps definition. Plan gate: automations (PRO+).

Inputs: limit, cursor, entity, entityId, +2 more.

list_working_calendarsA
Read-onlyIdempotent
Inspect

List working calendars in this org. Returns id, name, workDays (0=Sun..6=Sat array), hoursPerDay, isDefault, exceptionCount per row. PREFER get_working_calendar for the full exception list.

Inputs: limit, cursor.

list_workspace_rowsA
Read-onlyIdempotent
Inspect

List rows in a workspace table (with cells), in list order. A NUMBER cell is a number, null when empty or not a number; other cells are text. Cursor pagination: cursor takes the nextCursor of the previous page, which is null on the last page. PREFER get_workspace_table for small tables where the full shape is more useful.

Inputs: tableId (required), limit, cursor.

list_workspace_tablesA
Read-onlyIdempotent
Inspect

List workspace tables (custom structured-data tables) in a project or proposal scope. Returns id, name, description, columnCount, rowCount. PREFER get_workspace_table for column + row detail.

Inputs: limit, cursor, projectId, proposalId.

lookup_governance_alertsA
Read-onlyIdempotent
Inspect

Fetch active governance alerts for the caller's org: stuck proposals,untouched risks, compliance dips, critical-unassigned tasks, stuck approvals. Use this when the user opens chat from the dashboard "Governance alerts" widget (the Ask-AI handoff) or asks broad questions like "what needs my attention." Visible to OWNER/ADMIN/MANAGER on PRO+ plans. The result is auto-filtered to signals the caller can actually act on.

Inputs: minSeverity.

lookup_help_topicA
Read-onlyIdempotent
Inspect

Searches Onplana's product help catalog and returns NAVIGATION PATHS: where a page, tab or project view lives, so paths do not have to be guessed. It answers "where is X" and "what does role Z do" for a specific page, tab or feature. It returns no article text, so it cannot say how a feature is used or which of its settings exist; search_docs returns the step-by-step article body that covers those. Takes a short keyword phrase as query (e.g. "rate cards", "goals", "permissions matrix"); empty returns every page available to the caller. Results are auto-filtered to the caller's org role, so they never include pages the user cannot reach. Each page comes with reach, the clicks that open it starting from the sidebar (for Import: the sidebar item, and the menu on the New Project button of the Projects page); routes are not returned, because a person clicks rather than types an address. SCOPE: this catalog covers navigation (pages and project views), the buttons, tabs and menus on the Projects, Issues, Goals and Workflows pages, the project overflow menu, which is where export lives, the web Gantt's toolbar menus item by item (Schedule holds Recalculate now), and how a few things work (a calendar change and Recalculate now; links and lag in Onplana Schedule). It is still not the full set of available actions, so an empty result means nothing in the catalog matched, which is not evidence that the capability is missing; describe_capabilities is the authoritative list of what is actually callable, including categories not yet loaded. Export-shaped queries also return an exportNote stating plainly which outbound formats exist and which do not.

Inputs: query.

mark_all_notifications_readA
DestructiveIdempotent
Inspect

Mark every unread notification for the calling user as read. Call after a long agent session to clear the inbox before ending.

Inputs: no named parameters.

mark_notification_readA
DestructiveIdempotent
Inspect

Flip a single notification's read flag to true. Idempotent: marking an already-read notification returns alreadyRead=true without re-writing. Caller can only act on their own notifications; 404 on a miss (avoids leaking other users' ids). PREFER mark_all_notifications_read for bulk, dismiss_notification to remove entirely.

Inputs: notificationId (required).

move_projectA
DestructiveIdempotent
Inspect

Move a whole project to a new start date, the way Microsoft Project's Move Project does. Every task without actual work moves by the difference between the old and the new project start, counted in working days on the project's working calendar, so durations, links and lags stay as they are and no date lands on a non-working day. Tasks with an actual start, any progress, or status Done stay where they are, as do tasks whose dates come from Microsoft Planner; tasks linked after them are rescheduled from their links. Dated constraints move with their task. Deadlines move only with moveDeadlines: true. The project start becomes start, and the project end (the target finish, project.endDate.to in the result) moves by the same working days, so this is also the tool that moves a plan's finish. The finish the plan actually reaches is finish.to: the latest task finish the project schedule computes after the move (finish.from before it). Tasks that stay can finish later than every task that moves; then finish.to is later than project.endDate.to, finish.held gives how many such tasks and the latest (drivingTaskId, drivingTaskTitle), and finishNote states it in one sentence. update_project's endDate changes only the target date and moves no task. dryRun: true returns the same counts (moving, staying and why, deadlinesMoving, constraintsMoving) and the finish, and writes nothing. Requires the project-level project.edit permission. A start equal to the current one returns changed: false and writes nothing. The result carries undo, the move that puts the plan back.

Inputs: start (required), projectId (required), moveDeadlines.

move_taskA
DestructiveIdempotent
Inspect

Move a task and its direct subtasks to another project in the same workspace; subtasks of those subtasks stay in the source project. The task keeps its id, comments, attachments, history, assignee, tags, custom field values and dependencies, and its timesheet hours move with it, which a new task plus a delete of the old one would lose. A sprint and an epic belong to one project, so both are cleared on every task that moves; a subtask moved on its own leaves its parent; collaborators who are not in the target project are removed. Links to tasks left behind are kept and span the two projects. The result counts what was cleared, and Undo moves the task back and puts back its sprint, epic, parent, place and collaborators where they still exist. Requires permission to edit any task (task.edit.any) in both projects. Refused while the task is mirrored from Microsoft Planner, and while an accounting export holds its hours. To move a task into a sprint or an epic in its own project, use move_task_to_sprint or move_task_to_epic. dryRun: true returns the same counts and writes nothing.

Inputs: taskId (required), targetProjectId (required), restore.

move_task_to_epicA
DestructiveIdempotent
Inspect

Move one task into an epic (epicId=null detaches it from any epic). Epic must belong to the same project as the task. Caller must be able to edit the task (task.edit.any, or task.edit.own on their own task).

Inputs: epicId (required), taskId (required).

move_task_to_sprintA
DestructiveIdempotent
Inspect

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 be able to edit the task (task.edit.any, or task.edit.own on their own task).

Inputs: taskId (required), sprintId (required).

next_taskAInspect

Pick the next task assigned to you that is ready to start and that no other agent is working on, and lease it, in one call. Use this instead of listing tasks and then claiming one: between the list and the claim a second agent can take it, and this avoids that race. Passes over DONE and BLOCKED tasks; tasks with a finish-to-start predecessor that is not DONE yet (any open predecessor counts, and lag is not considered; start-to-start, finish-to-finish and start-to-finish links do not hold a task back); tasks another agent holds a lease on; and tasks you lack permission to lease (the same rule as claim_task: task.edit.any on the project, or task.edit.own on a task you are assigned or created). Containers (tasks with subtasks other than milestones) and milestones are never offered: a container's subtasks are offered on their own, and a milestone is a date, not work. Order: earliest due date first (no due date last), then highest priority, then oldest. With includeUnassigned=true, unassigned tasks in projects you are a member of are offered too, under the same rules, and only after every one of your assigned tasks. Returns claimed=false when nothing passes. Optional projectId narrows to one project. Renew within 3 minutes and call release_task when finished.

Inputs: limit, projectId, includeUnassigned.

parse_pasted_scheduleA
Read-onlyIdempotent
Inspect

Parse a free-text or pasted schedule into a structured task list. Each task line/paragraph is extracted into {title, description?, assigneeId?, dueDate?, priority?}. When projectId is provided, member names in the text are matched against actual project members for assigneeId resolution. Returns an array of parsed tasks, does NOT create them. Pass the result to instantiate_plan or create_task to materialise. Feature: aiCore (every plan). Use when the user pastes a schedule from email, a spreadsheet, or a document and asks "turn this into tasks".

Inputs: text (required), projectId.

portfolio_cashflowA
Read-onlyIdempotent
Inspect

A portfolio's cashflow against its baselines, per month, in the organization's default currency. baseline: each project's chosen baseline (its latest, or baselineId for that one project), its tasks' planned cost spread over their baseline dates. forecast: expected and committed cost lines on their dates plus the cost still to spend on unfinished tasks over their remaining dates. actual: spent cost lines, approved expense claims and timesheet labour on their days. variance is actual plus forecast minus baseline (positive is above the baseline); the cumulative figures include what fell before the range (beforeRange). unscheduled is task cost with no dates to place it. A project whose cost the caller may not read is listed with costHidden and left out of every figure (costHiddenCount). unconvertedCurrencies names currencies with no rate, counted at face value. from and to are months, YYYY-MM, at most 120 apart; omitted, they span the projects' dates. Each project carries its totals; pass includeProjectMonths for its months too. Requires the portfolios feature and org.portfolio.manage.

Inputs: portfolioId (required), to, from, baselineId, +1 more.

portfolio_summaryA
Read-onlyIdempotent
Inspect

Aggregate metrics for one portfolio: project count, task totals, status breakdown, RAG distribution, currency-normalized budget rollup. The budget rollup counts only projects whose cost the caller may read (budget.read); budgetHiddenCount is how many visible projects it leaves out. plans gives each visible plan its RAG (a Planner plan is judged on its tasks' progress and dates, GREY when it has none) and url. attention lists the open issues and risks across the plans, the cross-plan dependencies whose predecessor is late, and each plan's next late milestone, each row with its url. While the staleness score is on, each plan carries staleness: days since a person last wrote to it, its cadence (tasks due per week) and a level (CURRENT, QUIET or STALE). A plan with a finished schedule risk run carries scheduleRisk, as get_project gives it (p80 finish, chance of the target or plan date). Requires BUSINESS+ portfolios feature + org.portfolio.manage permission (MANAGER+ default). For per-project detail use get_portfolio.

Inputs: portfolioId (required).

post_teams_channel_messageA
DestructiveIdempotent
Inspect

Post a message to a Microsoft Teams channel as the authorized user. No draft mode (Teams channel posts are inherently immediate); requires confirm=true. The post appears under the connected user's identity, not the agent's.

Inputs: body (required), teamId (required), confirm (required), channelId (required), +2 more.

preview_migrationA
Read-onlyIdempotent
Inspect

Preview migrating an existing Onplana project OUT to every target (Onplana, MS Project XML, CSV, Excel, Microsoft Planner / Project for the web / To Do / Lists, Azure DevOps, Asana, monday.com, ClickUp, Notion, Airtable, Jira). Returns a 0-100 fidelity score per target plus the features that carry cleanly vs with loss. Read-only.

Inputs: projectId (required).

promote_ideaA
DestructiveIdempotent
Inspect

Turn an idea into real work. target="task" is the fast lane (small, clear, do it now) and needs a projectId when the idea is still General. target="proposal" is the governance lane for material investment: it opens a DRAFT proposal that goes through the stage gates, and requires the Enterprise governance feature. Either way the idea flips to PROMOTED and links to what it became. Choose the lane deliberately: most ideas are tasks.

Inputs: ideaId (required), target (required), projectId, assigneeId.

propose_assignmentAInspect

Propose assigning a task to a teammate for human review. Writes a PENDING suggestion; on accept the task is assigned. The target must be an active member of the organization. Use when you can identify the right owner but want human confirmation before assigning. On plans with resource management the result carries load: the proposed assignee's capacity for the week the task lands in, their other committed work, this task's share, whether that exceeds capacity, and the competing work that week. The same row travels in the suggestion for the reviewer.

Inputs: reason (required), taskId (required), assigneeId (required).

propose_deadline_extensionAInspect

Propose changing a task due date (typically extending it) for human review. Writes a PENDING suggestion; on accept the due date is applied. Use when a task is blocked or slipping and you want human sign-off on a new date rather than silently moving it. Date is YYYY-MM-DD.

Inputs: reason (required), taskId (required), newDueDate (required).

propose_dependencyAInspect

Propose linking two tasks with a dependency (FINISH_TO_START etc.) for human review. Writes a PENDING suggestion; on accept the dependency is created (with a circular-chain guard). Use when you see a sequencing constraint between tasks but want human confirmation before wiring it.

Inputs: reason (required), successorId (required), predecessorId (required), lag, +1 more.

propose_milestone_completionAInspect

Propose marking a milestone complete for human review (e.g. all its tasks are done). Writes a PENDING suggestion; on accept the milestone is flipped to completed. Use when a milestone looks reached but you want a human to confirm the sign-off.

Inputs: reason (required), milestoneId (required).

propose_status_changeAInspect

Propose changing a task to a new status (TODO / IN_PROGRESS / REVIEW / DONE / BLOCKED). Writes a PENDING suggestion a human reviews + accepts in the Suggestions inbox; on accept the status is applied. Use when you observe a task should move (e.g. work referenced it this week) but want human confirmation rather than flipping it yourself.

Inputs: reason (required), status (required), taskId (required).

propose_task_splitAInspect

Propose splitting an existing task into 2–10 smaller children. Writes a PENDING AISuggestion row that a human reviews + accepts in the normal Suggestions inbox. The agent should poll the suggestion id until status flips to ACCEPTED, then call add_subtasks to materialize the split. Use this when the brief reveals a task is too coarse to execute as one unit and you want explicit human approval before fragmenting the plan.

Inputs: taskId (required), children (required), rationale (required).

publish_pageA
DestructiveIdempotent
Inspect

Publish a web part page: snapshots a new version and copies the working draft to the published content so viewers see it. Requires contribute access.

Inputs: pageId (required).

read_agent_briefA
Read-onlyIdempotent
Inspect

Return the focused brief for a single task: title, description, agentBrief, collaborators (people working on it besides the assignee), parent task (if any), immediate dependency neighbours, project context, and any PENDING agent prompts outstanding before the task can start. Narrower than get_task: it carries just-enough context to begin work rather than the full task record, and it pairs with list_assigned_tasks, which supplies the queue this reads from.

Inputs: taskId (required).

read_document_contentA
Read-onlyIdempotent
Inspect

Read the body of a workspace document by id (markdown/text drafted by the agent or a human). Complements get_document_metadata (metadata) and draft_document (create). Text returns decoded; binaries return a download pointer; >8 MB returns metadata only. Caller must have project visibility.

Inputs: documentId (required).

read_issue_attachmentA
Read-onlyIdempotent
Inspect

Read the content of one Issue attachment by id (get the id from list_issue_attachments or get_issue). Text files return decoded text; images return a viewable image, which is what makes a screenshot on a bug report usable; other binaries return base64 when small. Files over 8 MB return metadata only. Caller must be able to read the issue.

Inputs: issueId (required), attachmentId (required).

read_task_attachmentA
Read-onlyIdempotent
Inspect

Read the content of one task attachment by id (get the id from list_task_attachments). Text files return decoded text; images return a viewable image; other binaries return base64 when small. Files over 8 MB return metadata only, download them in the app. Caller must have visibility into the parent project.

Inputs: taskId (required), attachmentId (required).

record_time_offAInspect

Record time off (vacation, sickness, a public holiday, training and so on) for a date range, so the capacity planner takes those working hours out. With no userId the leave is the caller's own; recording someone else's needs org-wide project access (a manager). When the workspace requires approval for time off, a non-manager's entry is PENDING and the approvers are notified; otherwise, and always for a manager, it is APPROVED at once. An entry that overlaps existing pending or approved leave for the same person is refused. When an approved entry lands on tasks with little float, the people running those projects are told.

Inputs: endDate (required), startDate (required), note, type, +2 more.

reject_timesheet_entryA
DestructiveIdempotent
Inspect

Reject a single SUBMITTED timesheet entry (returns it to the submitter for correction). Optionally provide a reason. Feature: timeTracking (PRO+).

Inputs: entryId (required), reason.

reject_timesheet_weekA
DestructiveIdempotent
Inspect

Bulk-reject all SUBMITTED timesheet entries for a specific user in a given week. Optionally provide a rejection reason. Feature: timeTracking (PRO+).

Inputs: userId (required), weekStart (required), reason.

release_taskA
Idempotent
Inspect

Give back a lease when the work is finished or abandoned, so another agent can pick the task up immediately instead of waiting for the lease to expire. Call it as soon as you stop working, including when you stop because the work failed. released=false simply means this session did not hold the lease; it is not an error worth retrying. This does not change the task status or its assignee.

Inputs: taskId (required).

renew_task_leaseA
Idempotent
Inspect

Extend a lease this session already holds, to keep working past its expiry. Call it roughly every 3 minutes during long work. renewed=false means the lease has already lapsed or another agent now holds the task: stop, and call claim_task again to find out which. Retrying a failed renew never succeeds.

Inputs: taskId (required), ttlMinutes.

reorder_tasksA
DestructiveIdempotent
Inspect

Changes the manual order of tasks within one sibling group - the order the List and the Gantt display. Two input shapes: taskIds as the COMPLETE sibling group (every task sharing the same parentId, missing ids are refused) in its new order, together with projectId and parentId (null or omitted = top-level tasks); or taskId plus ONE of beforeTaskId / afterTaskId to move a single task relative to a sibling, with the full order computed server-side from the current order. The reference task must share the moved task's parent: reordering never changes a task's parent (that is update_task's parentId field). Requires the project.edit permission on the project; the reordered view is shared by everyone on it. Returns the group in its resulting order.

Inputs: taskId, taskIds, parentId, projectId, +2 more.

request_user_inputAInspect

Ask the human PAT holder a question and wait for their answer via the get_user_input poll. Required: question (1-2000 chars). Optional: options (string[] of up to 10 choices; when set, the human must pick one), taskId (binds the prompt to a task so it appears on that task's detail panel; without one it is listed on the human's agent inbox, Questions tab), timeoutMinutes (1-120, default 30; after this the prompt flips to TIMED_OUT inline on the next get_user_input poll). Returns { requestId, status: "PENDING" }; poll get_user_input(requestId) until status changes. Fires an in-app + email notification at the PAT holder so they know to answer.

Inputs: question (required), taskId, options, timeoutMinutes.

resolve_issueA
DestructiveIdempotent
Inspect

Close out an Issue with a resolution note. status: RESOLVED (fixed), WONT_FIX (closed without fix), or DEFERRED (parked). Stamps resolvedAt. An OPEN issue reaches RESOLVED, WONT_FIX or DEFERRED directly, so a newly filed issue can be resolved in one call with no intermediate step. An INVESTIGATING or BLOCKED issue is also eligible. CLOSED and WONT_FIX are terminal, and an already-RESOLVED issue moves only to CLOSED or back to INVESTIGATING.

Inputs: issueId (required), resolution (required), status.

resource_leveler_analyzeA
Destructive
Inspect

Analyze resource allocation for a project. Returns per-user, per-week overallocations and suggested task reschedules to flatten the load. Deterministic (no AI call), fast and free to call on every plan that includes resourceMgmt (PRO+). Use mode="preview" (default) to inspect suggestions before committing; use mode="apply" to capture a baseline and apply all suggested reschedules immediately (requires project Owner or Manager role). Use this before leveling_narrative to get the raw data, or directly to answer "who is overloaded and by how much this week?"

Inputs: projectId (required), mode.

restore_document_versionA
DestructiveIdempotent
Inspect

Restore a prior version of a workspace document as the new current bytes. Reversible: the current bytes are snapshotted as a new version first. Requires write access to the document. Refused with code DOCUMENT_LOCKED_FOR_APPROVAL while a workflow approval is open on the document.

Inputs: documentId (required), versionNumber (required).

restore_page_versionA
DestructiveIdempotent
Inspect

Restore an earlier version of a web part page into the working draft. The current draft is snapshotted first (recoverable), then the chosen version is loaded into the draft. Does NOT auto-publish; call publish_page afterward to make it public. Requires contribute access.

Inputs: pageId (required), versionNumber (required).

revenue_at_riskA
Read-onlyIdempotent
Inspect

ENTERPRISE+ per-user breakdown of cost vs revenue at risk across a date window (≤90 days). Risk is each user's total-hours compliance gap (expected minus logged, across all projects) valued at their billable rate - not restricted to billable projects. Returns per-user rows sorted by marginAtRisk descending + per-currency totals (NOT normalized across currencies). Mirrors GET /api/compliance/revenue-at-risk. Permission: org.compliance.manage (default OWNER+/ADMIN+).

Inputs: to (required), from (required).

run_readiness_checkAInspect

Run a project's readiness check now and record the result as evidence (a check row), changing nothing else: the project's status, items and waivers are untouched. Returns whether it passed, the required gaps, the enforcement mode and the full resolution. Use it to see what still blocks completing or archiving a project and to leave a dated record of that. Any caller who can read the project.

Inputs: projectId (required), transition.

run_workflowA
DestructiveIdempotent
Inspect

Run an active workflow for real on chosen items. PRO+ feature (automations). kind "task" with ids of up to 50 tasks starts one WorkflowRun per task; kind "document" with document ids starts one per document, as a send for approval (the workflow must be on a document trigger; Business+ for document approval). Every step runs, emails and approvals included. Returns the runIds (list_workflow_runs monitors them). All or nothing: an item outside the workflow's scope or not visible to the caller starts nothing. Permission: automation.manage on the workflow's project (or org MANAGER+ for org-wide workflows). Answers that it is off while the operator switch is off.

Inputs: ids (required), kind (required), workflowId (required).

save_project_as_templateAInspect

Save an existing project as a reusable template (PRO+ feature). The caller must be OWNER or MANAGER on the project. The template captures all top-level tasks and subtasks with relative date offsets.

Inputs: name (required), projectId (required), category, isPublic, +1 more.

schedule_health_checkA
Read-onlyIdempotent
Inspect

Run a deterministic schedule-health check on an in-app project. Returns a 0-100 health score, an overall severity (info/warning/critical), an issues array covering: overdue tasks, project-end overruns, unassigned tasks, stuck-at-99% tasks, budget status, and data freshness (the share of in-play tasks touched in the last 7 days, with the oldest untouched task), plus a freshness block with those figures. No LLM call. No plan gate. Use when the user asks "how healthy is this project?" or as a pre-flight check before sprint planning. Does NOT write anything to the database.

Inputs: projectId (required).

schedule_narrative_reportA
Read-onlyIdempotent
Inspect

The monthly schedule narrative for a project, the report a scheduler attaches to a schedule update. Six sections, each with plain sentences and its figures, or available=false with the reason it is missing (no baseline, no milestones, cost not readable, no earned value data, no tasks, no risk run, risk runs not on the plan): progress (percent complete, tasks done of total, forecast finish against the baseline finish); the critical path with its changes against the newest baseline; slipped milestones (forecast later than baseline, in calendar and working days); earned value (SPI, CPI, EAC, VAC); the DCMA 14-point score with its failing checks; and the P50 and P80 finish from the newest finished schedule risk run. Also the status date it reads as of. Deterministic: no AI call, nothing written, no risk run started. The same report the project menu downloads as a PDF. Every plan.

Inputs: projectId (required).

search_docsA
Read-onlyIdempotent
Inspect

Searches the Onplana docs (docs.onplana.com) and returns article excerpts: the readable step-by-step article text, quotable directly, for "how do I X", "explain Y" and "what does Z mean" questions. The companion to lookup_help_topic, which returns navigation paths rather than article bodies. No plan gate; all plans. SCOPE: docs coverage lags the product, so an empty result means no ARTICLE matched, which is not evidence that the capability is missing; describe_capabilities is the authoritative list of what is actually callable, including categories not yet loaded.

Inputs: query (required).

search_org_knowledgeA
Read-onlyIdempotent
Inspect

Semantic + lexical hybrid search across this org's indexed content: projects, tasks, risks, goals, comments, wiki pages, and (for callers who can open Clients in Onplana Services) the client records: companies, contacts and deals, under the "clients" scope. 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 the embedding index and returns ranked snippets with similarity scores. Pass scope: "all" (default) for cross-cutting queries, or narrow to one type (projects, tasks, risks, goals, comments, wiki) when the user is clearly asking about that surface. Returns up to 20 ranked matches with similarity scores. Cosine similarity ranges 0–1; >0.7 is a strong match, 0.45–0.7 is plausible, lower scores are weak hints (the hybrid pipeline keeps them when a lexical BM25 hit backs them up, but treat sub-0.45 results as low-confidence). The floor is admin-tunable via the rag_min_similarity system config, so a deployed override can shift these bands. An empty matches array means either (a) no indexed content matched, or (b) the org hasn't populated its RAG index yet (Azure OpenAI embeddings unconfigured) - phrase your reply as "I didn't find anything matching that" rather than asserting confidently.

Inputs: query (required), limit, scope.

send_member_messageAInspect

Send a short note to one member of this workspace, in the name of the person the caller acts for. The member gets a notification in Onplana and an email with the note (unless they turned off all email); the email's Reply-To is the sender's address, so the member answers by replying to the email. Onplana keeps no conversation thread. Optionally attach a link to a project, or to a task in it. Recipients are active members of this workspace only, never yourself or an agent. Each call sends another email, and a sender has an hourly limit; over it the call is refused with code RATE_LIMITED. Available only while the workspace operator has turned this on.

Inputs: text (required), recipientId (required), taskId, projectId.

send_outlook_messageAInspect

Create a draft email in the authorized user's Outlook mailbox. Draft-only: it saves a draft and returns its id for the user to review and send themselves from Outlook — it never transmits. Recipients are optional (the human can fill them in when reviewing). Per-message external recipient cap: 10. The draft is owned by the connected user, not the agent.

Inputs: body (required), subject (required), cc, to, +2 more.

set_bulk_custom_field_valuesA
DestructiveIdempotent
Inspect

Upsert up to 2000 custom field values in one call. All-or-nothing: if any value fails validation or access checks, no values are saved. Useful for batch-populating fields on a set of imported tasks.

Inputs: values (required).

set_capacityA
DestructiveIdempotent
Inspect

Set a user's available hours for a given week. Users can update their own capacity; updating others requires org-level admin access. Feature: resourceMgmt (PRO+).

Inputs: userId (required), weekStart (required), hoursAvail (required).

set_custom_field_valueA
DestructiveIdempotent
Inspect

Set (upsert) a custom field value on a task, project, or proposal. Pass value: null to clear the field. Caller must have write access to the target entity.

Inputs: fieldId (required), entityId (required), entityType (required), value.

submit_change_requestA
DestructiveIdempotent
Inspect

Submit a DRAFT change request for review (moves it to SUBMITTED). Only the original requester can submit. Feature: changeControl (ENTERPRISE+).

Inputs: changeRequestId (required).

submit_closeout_signoffA
Destructive
Inspect

Send a project's closeout for sign-off: names the reviewers and moves the closeout from DRAFT to IN_REVIEW with one pending sign-off each, and tells each reviewer. Without reviewerIds the reviewer is the project owner (every plan); naming anyone else, or more than one, is designated multi-reviewer sign-off, a plan feature. Reviewers are active members of the workspace, never guests. Sending again while IN_REVIEW replaces the panel and clears the decisions. Lessons learned lock once it is sent. Refused on a closeout not started (CLOSEOUT_NOT_FOUND) or signed off (CLOSEOUT_LOCKED). Needs project.edit. Returns the record get_closeout_status returns.

Inputs: projectId (required), reviewerIds.

submit_cr_reviewAInspect

Submit an APPROVED/REJECTED decision on a change request that is SUBMITTED or UNDER_REVIEW. Eligible reviewers are project Managers and Owners, members of the organization's Change Control Board, and reviewers designated on the change request. An agent acting for a person reviews only where that person is eligible too. The requester cannot review their own change request, and neither can an agent acting for them. One review per (CR, reviewer) pair; a second returns CONFLICT. Plan gate: changeControl (ENTERPRISE+).

Inputs: decision (required), changeRequestId (required), comment.

submit_proposal_reviewAInspect

Submit a gate review decision (APPROVED|REJECTED) on a proposal at a review gate (PROPOSAL_REVIEW / BUSINESS_CASE_REVIEW / PLAN_REVIEW) or at the stage just before one (SUBMITTED / BUSINESS_CASE / PLANNING), which enters that gate first. Optionally include criteriaScores[] for a weighted score, plus a comments string. It is the same decision a reviewer makes in the web app: any REJECTED rejects the proposal, all APPROVED advances it, otherwise it waits on the rest of the panel. When the gate has a reviewer panel the caller needs a pending seat on it (an org Owner/Admin can always decide); without a panel, org.governance.review. One review per person per gate. A decision notifies the submitter and sponsor, an advance seats the next gate's panel, and reaching the org's project-creation gate creates the project, whose id is returned as createdProjectId. Plan gate: governance.

Inputs: decision (required), proposalId (required), score, comments, +1 more.

submit_timesheetAInspect

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 a separate operation. Duplicate entries for the same (task, date) are rejected, edit the existing entry instead. Requires the timeTracking feature (PRO+). Caller must be a member of the project (or org admin).

Inputs: date (required), hours (required), taskId (required), projectId (required), +1 more.

submit_timesheet_weekA
DestructiveIdempotent
Inspect

Submit all DRAFT timesheet entries for a given week (YYYY-MM-DD Monday date). Requires the org's timesheet approval to be enabled. Feature: timeTracking (PRO+).

Inputs: weekStart (required).

summarize_projectA
Read-onlyIdempotent
Inspect

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.

Inputs: projectId (required), sinceDays.

test_run_workflowA
DestructiveIdempotent
Inspect

Test a workflow on one task. PRO+ feature (automations). mode "rehearsal" writes nothing: it returns the steps the workflow would take on the task and what each would do. mode "live" (the default) writes a WorkflowRun with workflowName suffixed "(test)" and runs the graph end-to-end for real, returning the new runId (list_workflow_runs monitors it). taskId names the task, which must be in the workflow's project (any visible project for an org-wide workflow); without it the newest task in scope is used. Permission: automation.manage on the workflow's project (or org MANAGER+ for org-wide workflows).

Inputs: workflowId (required), mode, taskId.

test_webhookA
DestructiveIdempotent
Inspect

Send a test payload to an existing webhook endpoint (BUSINESS+ feature). Requires org.webhook.manage (default Admin+). Returns whether the endpoint responded successfully and the response duration in ms.

Inputs: webhookId (required).

unarchive_projectA
Destructive
Inspect

Unarchive a project so it can be changed again and shows in project lists. The project keeps its completed or cancelled status and its closeout as they were; reopening it is a separate status change afterwards (update_project), which resets the closeout to DRAFT. Refused with NOT_ARCHIVED when the project is not archived. Needs the project Owner or Manager role, or org.compliance.manage.

Inputs: projectId (required).

unassign_tagA
DestructiveIdempotent
Inspect

Remove a tag from a task or project. Provide either taskId or projectId, not both. Removing a tag that is not on the target succeeds as a no-op (removed: false in the result).

Inputs: tagId (required), taskId, projectId.

update_closeout_lessonsA
DestructiveIdempotent
Inspect

Record a project's lessons learned on its closeout while it is DRAFT. values maps a lesson key to its text: wentWell, toImprove, scheduleVarianceReason, budgetVarianceReason and leavesBehind (impacts that continue after handover and who inherits each). Null or an empty string clears a lesson; keys not sent keep their answer. The organization may label the keys differently; get_closeout_status returns the labels. Refused before the closeout is started (CLOSEOUT_NOT_FOUND) and once it is in review or signed off (CLOSEOUT_LOCKED). Needs project.edit. Returns the record get_closeout_status returns.

Inputs: values (required), projectId (required).

update_cost_lineA
DestructiveIdempotent
Inspect

Change a cost line: its label, amount (in the project currency), status (EXPECTED, COMMITTED, SPENT, in any direction, e.g. back to EXPECTED when an order is cancelled), category, date, task or note. Pass only the fields to change; null clears category, date, taskId or note. Every change is kept in the line's history (get_cost_line_history). Access: the project budget's write rule.

Inputs: costLineId (required), date, note, label, +4 more.

update_custom_field_defA
DestructiveIdempotent
Inspect

Update a custom field definition (rename, change options, toggle required, set default). Requires customFields (PRO+) and org admin/manager (or project owner/manager for project-scoped fields). Scope changes (project vs org-wide) must use the REST /promote endpoint.

Inputs: defId (required), name, options, required, +2 more.

update_dependencyA
DestructiveIdempotent
Inspect

Change an existing task dependency's type or lag in place; the link keeps its id. Address it by its row id (dependencyId, from list_dependencies or from the error link_dependency returns when the pair is already linked), or by the two task ids it joins (predecessorId + successorId) when exactly one link joins them. Pass type (FINISH_TO_START, START_TO_START, FINISH_TO_FINISH, START_TO_FINISH), lag, or both; a field left out keeps its value. Lag is in lagUnit, days by default, or hours or minutes for a finer lag; negative values are lead time. Requires the project-level dependency.manage permission on the successor's project, as linking does. A type the pair already holds is refused, since one pair holds each type at most once. When the values sent are already the link's the call succeeds with changed: false and writes nothing. Otherwise the successor and the tasks after it are rescheduled, and rescheduled counts them; in a project with automatic scheduling off it is 0 and the response carries autoScheduleOff: true. previous holds the type and lag the edit replaced. No plan gate.

Inputs: lag, type, lagUnit, successorId, +2 more.

update_document_contentA
DestructiveIdempotent
Inspect

Replace the body of an existing text/markdown workspace document (use draft_document to create a new one, read_document_content to read). Max 100 KB. Requires project.content.create. Binary documents (PDF, images) cannot be edited this way. Refused with code DOCUMENT_LOCKED_FOR_APPROVAL while a workflow approval is open on the document.

Inputs: documentId (required), contentMarkdown (required).

update_epicA
DestructiveIdempotent
Inspect

Partially update one Epic. Pass only the fields you want to change: title (2-200 chars; "name" accepted as a deprecated alias until 2026-11-27), description (string up to 5000 chars, or null to clear), color (hex like "#6366F1" or CSS name), order (non-negative integer; explicit slot in the project's epic order). Caller must have project.content.create on the project.

Inputs: epicId (required), name, color, order, +2 more.

update_evaluation_criterionB
DestructiveIdempotent
Inspect

Update an org-specific evaluation criterion. Requires org.governance.manage. Feature: governance (ENTERPRISE+).

Inputs: criterionId (required), name, order, weight, +4 more.

update_goalA
DestructiveIdempotent
Inspect

Partially update one goal. Pass only the fields you want to change: title, description (or null to clear), status (NOT_STARTED / ON_TRACK / AT_RISK / BEHIND / COMPLETED / CANCELLED), startDate (ISO or null), dueDate (ISO or null), projectIds (replaces the linked-project set; pass empty array to unlink all). Caller must own the goal or have the org.project.view.all permission.

Inputs: goalId (required), title, status, dueDate, +3 more.

update_ideaA
DestructiveIdempotent
Inspect

Update an idea: sharpen its title or detail, file it to a project, or move its status (NEW / EXPLORING / PARKED / DROPPED). PROMOTED is NOT settable here , use promote_idea, so the idea links to the work it became. Pass expectedUpdateRevision (from get_idea) to avoid clobbering a concurrent edit.

Inputs: ideaId (required), title, status, projectId, +2 more.

update_issueA
DestructiveIdempotent
Inspect

Patch an Issue. Any subset of: title, description, type, severity, status, ownerId, targetResolutionAt, resolution. Status changes are state-machine guarded, and naming one forbidden jump understated it, so here is the whole map: OPEN -> INVESTIGATING | DEFERRED | WONT_FIX; INVESTIGATING -> BLOCKED | RESOLVED | WONT_FIX | DEFERRED; BLOCKED -> INVESTIGATING | WONT_FIX | DEFERRED; RESOLVED -> CLOSED | INVESTIGATING; DEFERRED -> OPEN | INVESTIGATING; CLOSED and WONT_FIX are terminal. Note RESOLVED is not reachable from OPEN. PROMOTED is not settable here at all. Pass expectedUpdateRevision (from get_issue) for optimistic concurrency - a mismatch returns a conflict so concurrent agents do not clobber each other. To resolve/defer/wont-fix with a resolution note, PREFER resolve_issue.

Inputs: issueId (required), type, title, status, +6 more.

update_key_result_valueA
DestructiveIdempotent
Inspect

Log a progress update on a key result (manual KRs only, KRs with TASK_COUNT / TASK_PERCENTAGE rollup are auto-calculated and reject manual writes). Required: krId, value (the new current value). Optional: note (short context for the audit log). Any org member except a Guest may log progress.

Inputs: krId (required), value (required), note.

update_member_roleA
DestructiveIdempotent
Inspect

Update an organization member's role (OWNER/ADMIN/MANAGER/MEMBER/GUEST). Guards: cannot demote the last OWNER (LAST_OWNER conflict); only an existing OWNER can promote another user to OWNER. Permission: org.member.role.update (default ADMIN+) plus the OWNER-promote rule.

Inputs: role (required), userId (required).

update_milestoneA
DestructiveIdempotent
Inspect

Update milestone fields: title, dueDate, completed (toggle). Flipping completed=true stamps completedAt=now(); flipping back clears it. Requires the project-level milestone.create permission, held by project MEMBER and above under the default matrix, or org admin.

Inputs: milestoneId (required), title, dueDate, completed.

update_notification_preferencesA
DestructiveIdempotent
Inspect

Update the calling user's notification preferences. Pass only the fields you want to change; all others stay as-is. Useful when an agent is starting a noisy batch operation and wants to mute emails temporarily.

Inputs: riskEmails, pushEnabled, taskOverdue, emailEnabled, +9 more.

update_pageA
DestructiveIdempotent
Inspect

Update a web part page: metadata (title/icon) and/or content. Content updates require expectedUpdateRevision (from get_page); a mismatch means someone else changed the page first and the write is rejected with UPDATE_REVISION_MISMATCH, which a fresh get_page resolves. Requires contribute access. Publishing is separate: publish_page makes changes public.

Inputs: pageId (required), icon, title, content, +1 more.

update_portfolioA
DestructiveIdempotent
Inspect

Update a portfolio name or description (BUSINESS+ feature). Caller must be the portfolio owner or have org.portfolio.manage permission.

Inputs: portfolioId (required), name, description.

update_projectA
DestructiveIdempotent
Inspect

Partially update one project: name, description, status (PLANNING/ACTIVE/ON_HOLD/COMPLETED/CANCELLED), startDate, endDate, budget (number or null), color, retainedLogic (true: the remaining work of a started task waits on its links, so a late predecessor pushes it; false: a started task holds). Only supplied fields change. startDate and endDate are the project's own target dates: writing them moves no task, so the plan's tasks keep their dates even when they then sit long before the new finish. move_project is the tool that shifts the plan itself (every task without actual work, durations and links kept). Caller must have project.edit on the project. Project progress is not writable here: it is derived from the progress of the tasks underneath, so it changes through update_task rather than through this tool.

Inputs: projectId (required), name, color, budget, +13 more.

update_proposalA
DestructiveIdempotent
Inspect

Update business-case fields on a governance proposal. Submitter or org.governance.review can edit. Only editable in pre-terminal stages (DRAFT through ON_HOLD). Stage transitions DO NOT happen here — use advance_proposal_stage. Sponsor must be an active org member. Pass null to clear nullable fields. Plan gate: governance (ENTERPRISE+).

Inputs: proposalId (required), title, currency, priority, +9 more.

update_sprintA
DestructiveIdempotent
Inspect

Update sprint fields: name, goal (null to clear), status (PLANNING/ACTIVE/COMPLETED/CANCELLED), startDate, endDate. Caller must be the project-level sprint.manage permission, held by project MEMBER and above under the default matrix, or org admin. endDate must be >= startDate. Plan gate: sprints (PRO+).

Inputs: sprintId (required), goal, name, status, +2 more.

update_taskA
DestructiveIdempotent
Inspect

Partially update one task. Pass only the fields you want to change: title (string, 1-500 chars), description (string or null to clear, up to 10000 chars), status (TODO/IN_PROGRESS/REVIEW/DONE/BLOCKED), priority (LOW/MEDIUM/HIGH/CRITICAL, a ranking label that does not put a task on the critical path), dueDate (ISO or null to clear), startDate (ISO or null), assigneeId (user id or null to unassign), progress (0-100), estimatedHours (number or null to clear), agentBrief (per-task agent spec, string or null to clear), isMilestone (boolean), constraintType (ASAP/ALAP/MSO/MFO/SNET/SNLT/FNET/FNLT or null) + constraintDate + deadline (ISO dates or null), plannedCost + fixedCost + baselineCost (currency numbers or null), recurringRule ({freq,interval,endDate?} object or null), previewUrl + prUrl (URLs or null to clear), isManual (for a task with subtasks: true keeps its own dates, false takes them from its subtasks, null follows the project). A date, duration or constraint change on a task whose dates come from its subtasks is refused with code:"PARENT_DATES_FROM_SUBTASKS"; change a subtask, or send isManual:true with the dates. Optional notify="owner"|"assigner"|"both" sends a notification to the assignee, the creator, or both. Optional reason adds a comment with the supplied text and includes it in the notification body. Caller must have task.edit.any on the project, or task.edit.own + ownership. Optional expectedUpdateRevision guards against overwriting a concurrent edit: when it no longer matches, the call SUCCEEDS with applied:false and code:"UPDATE_REVISION_MISMATCH" and writes nothing, so read applied before treating the task as changed. A real write returns applied:true. In a project with automatic scheduling off, a date or duration change moves no other task, and the result carries autoScheduleOff:true. When the edit moves the project finish, the result carries finishMove: the old and new finish, what changed, the driving chain, and plain sentences. PREFER bulk_update_status when flipping status on 2+ tasks at once; PREFER bulk_update_tasks when applying the SAME multi-field patch to 2+ tasks.

Inputs: taskId (required), prUrl, title, dryRun, +27 more.

update_task_collaboratorsA
DestructiveIdempotent
Inspect

Add or remove collaborators on one task: people who work on it besides its single assignee. A collaborator sees the task in their My Work, is notified about it and may update it, but cannot reassign it or change who collaborates. Name people in add and remove by user id, full or first name, or email; a reference that matches no single org member is reported in warnings and left out. Each person must be an active member of the task's project and is never the assignee; anyone the server does not add or remove is listed in skipped with a reason (NOT_ORG_MEMBER, NOT_PROJECT_MEMBER, IS_ASSIGNEE, ALREADY_COLLABORATOR, NOT_COLLABORATOR, CAP_REACHED). Requires task.assign plus task.edit.any or holding the task, except that anyone may remove themselves. Returns the task's collaborators after the change.

Inputs: taskId (required), add, dryRun, remove.

update_templateA
DestructiveIdempotent
Inspect

Update project template metadata (name, description, category, isPublic). The snapshot is immutable — re-save from a project to rebuild it. Caller must be the template creator or an org admin. Plan gate: templates (PRO+).

Inputs: templateId (required), name, category, isPublic, +1 more.

update_timesheet_entryA
DestructiveIdempotent
Inspect

Update date, hours, or notes on the calling user's own DRAFT or REJECTED timesheet entry. SUBMITTED and APPROVED entries must be returned first. Feature: timeTracking (PRO+).

Inputs: entryId (required), date, hours, notes.

update_whiteboardA
DestructiveIdempotent
Inspect

Update whiteboard name / description / elements (Excalidraw scene) / appState. A scene change (elements/appState) bumps version; a metadata-only edit does not. Pass description=null to clear. Plan gate: whiteboards (PRO+).

Inputs: whiteboardId (required), name, appState, elements, +1 more.

update_wiki_pageA
DestructiveIdempotent
Inspect

Update wiki page metadata: rename (title), change icon (emoji), or move under a different parent page (parentId). Does NOT edit the document body, only tree metadata. Requires wikis (PRO+) and write access to the parent project. Wiki has been retired in favour of Pages: while it is retired existing wiki pages are read-only, and this tool changes nothing and returns an error naming update_page.

Inputs: pageId (required), icon, title, parentId.

update_workspace_columnA
DestructiveIdempotent
Inspect

Edit a column of a workspace table (list): rename it, replace the choices of a DROPDOWN or MULTI_SELECT (options, the full list), or set required. Fields left out stay unchanged. A column's type and a link column's target are fixed once created. Values already stored are kept when a choice is removed. warnings names the effects of the edit outside the list: rows still holding a removed choice, and for a rename, the published apps and workflows that address the column by name.

Inputs: columnId (required), name, options, required.

update_workspace_rowA
DestructiveIdempotent
Inspect

Update cells on a workspace row. cells is a partial map of columnId -> value (string|number|boolean|null). Specified columns upsert; unspecified stay unchanged. Optional order reorders the row.

Inputs: rowId (required), cells, order.

upload_library_documentAInspect

Upload an existing file (PDF, Word/Excel/PowerPoint, an existing markdown/text/CSV file, or an image) into a project, proposal, or organization (tenant-level) document library from base64 content. Provide libraryId (create one first via create_library if needed), fileName incl. extension, mimeType, and contentBase64. Max 25 MB decoded. The bytes are magic-byte verified against the claimed mimeType (spoofed or disallowed types are rejected) and a WorkspaceDocument row is created exactly like a human upload. Use draft_document instead when you want to author markdown directly from a string. Requires project.content.create on the parent project (Viewers are read-only); for proposal libraries, a governance reviewer or the proposal submitter; for organization libraries, org.library.contribute (MEMBER+ by default).

Inputs: fileName (required), mimeType (required), libraryId (required), contentBase64 (required), +1 more.

upload_task_attachmentAInspect

Attach a file to a task from base64 content (fileName + mimeType + contentBase64). Max 25 MB. Any project contributor or above can attach (VIEWERs cannot). The file is stored and a TaskAttachment row is created, exactly like a human upload. For integrity, ALSO pass sizeBytes (raw byte length) and/or sha256 (hex of the raw bytes): the tool then REJECTS a truncated or garbled upload instead of silently storing a corrupt file. Strongly recommended for binaries (docx/xlsx/pdf/png), where base64 sent through the model can truncate.

Inputs: taskId (required), fileName (required), mimeType (required), contentBase64 (required), +3 more.

weekly_complianceA
Read-onlyIdempotent
Inspect

Per-user timesheet compliance + cost-at-risk for one week (YYYY-MM-DD). Approver-only. Plan gate: timeTracking (PRO+). Drives the Compliance sub-tab on the Approvals inbox; agents use it for the "who is behind on hours?" rollup.

Inputs: weekStart (required).

week_statusA
Read-onlyIdempotent
Inspect

Per-user timesheet submission state for one week (YYYY-MM-DD). Approver-only (managers-mode: OWNER/ADMIN/MANAGER; approvers-mode: explicit approver list). Returns rows + a KPI summary for the Approvals inbox. GUESTs excluded.

Inputs: weekStart (required).

whoamiA
Read-onlyIdempotent
Inspect

Self-introspection. Returns the calling agent's identity (id, name, email, isAgentPersona, agentProvider when persona), the org context (id, name, slug, plan tier, caller's org role), the effective feature gates for the org, the PAT scope context when called via MCP, and the conversation id, plus a human-first youAre summary. When a human asks who they are, youAre is the field that answers it: it leads with the human and names the agent only as the channel, whereas the persona name identifies the agent rather than the person. Grounding a session on this first is what stops subsequent tool calls trial-and-erroring 401/402. Cheap (a few small DB reads). Its companions are describe_capabilities for the tool surface and describe_schema for entity field shapes.

Inputs: no named parameters.

withdraw_change_requestA
DestructiveIdempotent
Inspect

Withdraw a DRAFT, SUBMITTED, or UNDER_REVIEW change request. Only the requester or a project PM can withdraw. Feature: changeControl (ENTERPRISE+).

Inputs: changeRequestId (required).

workflow_statsA
Read-onlyIdempotent
Inspect

Workflow counters: total and active workflows in the org, and of the runs the caller can see, the total and those that FAILED in the last 7 days. Used by the dashboard widget. PREFER list_workflows / list_workflow_runs for filtering. Plan gate: automations (PRO+).

Inputs: no named parameters.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables AI agents to track time, manage the project board with epics, milestones, schedules and dependencies, and generate shareable reports through a single authenticated connection.
      MIT
    • F
      license
      Not graded
      quality
      Not graded
      maintenance
      Enables AI agents in editors and terminals to read and update project data such as tasks, sprints, schedules, RAID logs, and wiki pages with scoped permissions. Supports read-only or read/write tokens while keeping changes traceable and revertible.
      -
    • A
      license
      Not graded
      quality
      C
      maintenance
      Provides AI tools with secure, real-time, permission-aware access to an Orangescrum workspace so users can search, create, and update projects, tasks, sprints, test cases, releases, risks, resources, and Wiki pages through natural language. It lets assistants summarize and plan work, automate repetitive effort, and keep delivery data current without switching context.
      3
      Apache 2.0
    Try in Browser

    Glama MCP Gateway

    Add one secure layer between your agents and this server.