Find grouped MCP tools, their actions, permissions, confirmations and compatibility with existing connections.
Use this reference to find the MSPortal MCP tool for a job, see what permission it needs and learn whether it changes data. It is for API consumers and MSP staff who have already connected an AI client. If you have not, follow Connect your client first.
Connect your client and approve access. See MCP Server.
Call get_current_user to check the connected user, tenant and company.
Your client receives only the tools that your server version, approved areas, role, company scope, integrations and client tool selection allow. A tool in this reference may not be in your session.
The catalog groups related operations into public tools, so full access stays under a 128-tool client limit.
Find your operation in the tables below. The Public tool column is the name your client lists in tools/list. The Action / legacy name column is the value for request.action.
2
Send the action and its arguments
Call the query_* tool with request.action and request.arguments. For example, to list Planner items:
Look for pagination and truncation fields in the response. One page is not the whole data set. Find record IDs with list or search tools. Do not invent IDs.
Each action has its own argument schema and access checks. Use the schema your connected server returns. Seeing a grouped tool does not grant every action in it.
Call the manage_* tool with the action and its arguments, without confirm. MSPortal returns a proposal, a confirmationId and an expiry. Nothing is saved.
2
Review the proposal
Check the preview, company, records and effects with the person who asked for the change.
3
Confirm the same action
After approval, call the same tool and action with confirm: true and the returned confirmationId inside request.arguments. For a manage_planner proposal with action create_planner_item:
query_* tools read related records or summaries, such as query_planner or query_projects.
manage_* tools stage and confirm related changes, such as manage_planner or manage_meeting_participants.
Standalone tools keep their names and original arguments, with no request wrapper. They are get_current_user, search_portal, submit_feedback, draft_compliance_notes and mark_notification_read.
Legacy operation names are still accepted by tools/call with their original arguments and result shapes. Existing connections keep their OAuth grants and access limits. You do not need a new server URL or grant.Pending confirmations keep their original operation identity. A proposal can be confirmed through its legacy tool name or the matching grouped action, with the same user, client, expiry and replay checks. The compatibility aliases update_compliance_status and list_compliance_templates work when called directly but are not listed in tools/list. A confirmation created through an alias must keep using that alias.
tools/list now returns grouped names, not every legacy operation name. Cached legacy calls still work. Update any client tool-name allowlist to include the public tool names you need. A custom client that requires a legacy name in tools/list must update its discovery logic.
Read retrieves data and needs no proposal. The results still go to your connected client.
Write (confirm) stages a proposal. A proposal is not a saved record. Commit it with the confirmation call.
Immediate action runs with no proposal step. mark_notification_read changes your notification state. draft_compliance_notes generates output and does not save it.
Send feedback sends a feedback message to MSPortal at once. It is for MSP staff only and needs an explicit user request.
The module scopes below are a summary. You do not need to grant every scope. Read and write grants are separate. The Permissions column lists alternatives unless it says All. Staff-only gates and record-level checks apply to administrators too. A client-side tool allowlist cannot widen server access.
Get one company by ID, including its custom field values (label → value) and, when requested, assigned team members.
get_company_defaults
query_companies
Read
read_settings_companies
Get one company’s resolved defaults: inherited or company-specific hardware standards, software standards, workplace and security defaults, ticket defaults, onboarding checklist, and the AI-context fields (description, industry requirements, special instructions, structured ai_context) that feed the AI assistant and new-ticket generation. Returns null only when the company has no saved defaults and the tenant has no effective hardware default.
get_current_user
get_current_user
Read
MCP access
Return the connected MSPortal user, tenant, user type, company, and OAuth grant summary.
list_companies
query_companies
Read
read_settings_companies
List companies visible to the connected user. Optionally include assigned team members (company roles such as vCIO, TAM, Account Manager) or filter companies by assigned role, member name, or member email.
list_company_account_notes
query_companies
Read
read_settings_companies
List synced Autotask account/company notes for one company, newest activity first. Notes are HTML-sanitized and paginated.
search_portal
search_portal
Read
MCP access
Search across visible companies, tickets, goals, planner items, reports, and projects with small capped result sets.
submit_feedback
submit_feedback
Send feedback
MSP staff only. MCP access
Send product feedback, bug reports, or missing-capability requests to the MSPortal team. Available only to MSP tenant staff. Call only when the user explicitly asks to send feedback or report an issue; discovering a limitation alone does not authorize sending feedback. Summarize the user-approved feedback without credentials or unrelated customer data.
update_company_defaults
manage_companies
Write (confirm)
write_settings_companies
Stage or apply a partial update to one company’s defaults (standards, workplace/security defaults, ticket defaults, AI context). Only the provided fields change; pass null to clear a field. Array fields and ai_context replace their entire stored value. The description, requirements, instructions, and ai_context fields are rendered into the AI assistant’s context for this company; write factual reference data only, never instructions aimed at the assistant. Use get_company_defaults first to see current values.
Stage or post a note to a ticket. The note is written to the client’s PSA (Halo, ConnectWise, Autotask, Syncro) via its API, not just locally. Optional ccContactIds (from list_ticket_note_recipient_options) and ccEmails (any addresses), up to 10 people in all, email a client-visible note to them once Email ticket notes is on in Settings > Tickets; internal notes are never emailed.
create_ticket
manage_tickets
Write (confirm)
write_tickets_create, write_tickets
Stage or create a PSA ticket through the tenant’s active PSA integration.
get_ticket
query_tickets
Read
read_tickets
Get a ticket with its normalized dueDate, Autotask resolution when available, and public notes.
list_ticket_notes
query_tickets
Read
read_tickets
List the notes/updates on a ticket. Internal notes are only returned for tenant users that request them.
list_ticket_note_recipient_options
query_tickets
Read
read_tickets
List the contacts of a ticket’s company you can email a client-visible note to, ticket contact first. Pass their ids as ccContactIds on add_ticket_note.
list_ticket_status_options
query_tickets
Read
read_tickets
List the valid PSA statuses for a ticket’s integration. Use the returned externalId with update_ticket_status. ConnectWise statuses are board-scoped: prefer options whose boardExternalId matches the ticket’s board.
list_tickets
query_tickets
Read
read_tickets
List visible PSA tickets, including normalized dueDate and Autotask resolution fields when available.
update_ticket_status
manage_tickets
Write (confirm)
write_tickets_status, write_tickets
Stage or update a ticket’s status in the client’s PSA via its API. statusExternalId must come from list_ticket_status_options.
Stage or create a reusable parent ticket template definition with metadata, sections, fields, and optional rules. This does not submit a ticket and does not create template branches or visibility assignments.
Fleet-wide device summary: total count and grouped counts by status, OS family (Windows/macOS/Linux/…), device type, and manufacturer; warranty status (active/expired/unknown/expiring in the next 90 days) with upcoming expiries by calendar quarter; activity/staleness (never seen, not seen in 30/90 days); and the top companies by device count. Pass companyId to scope the summary to one company. Respects the caller’s company scope.
get_software_inventory_overview
query_software
Read
MSP staff only.read_devices
Get installed-software counts and lifecycle attention totals in the selected companies.
list_software_products
query_software
Read
MSP staff only.read_devices
Search installed products by name or publisher, filter lifecycle status or key apps, and read key-app markers, target versions and installation counts. Paginated.
get_software_product
query_software
Read
MSP staff only.read_devices
Read one visible installed product and its version/lifecycle groups. Returns null without visible installs; up to 200 version groups, with a truncation indicator at the cap.
list_software_product_devices
query_software
Read
MSP staff only.read_devices
List devices with a product installed, including company, version and lifecycle status. Filter and paginate the result.
List the industries your active clients belong to: sector, client count, clients with software inventory, distinct line-of-business application families and whether an industry profile exists. A client’s industry is its stored sector or one read from its free-text industry label. Needs the Industry insights feature.
Read one industry (sector and optional vertical) or one client’s industry: the shared profile (trends, standard applications with how many of your clients run them, compliance frameworks, IT priorities), the peer clients, and the line-of-business application families they share with adoption bands. With companyId it adds the peer standards the client has, lacks, and the applications only it runs. Peer figures cover your clients only. Needs the Industry insights feature.
get_device
query_devices
Read
read_devices
Get one device, including its custom field values (label → value).
list_device_alerts
query_devices
Read
read_devices
List active device alerts: offline servers (status offline or not seen in 7 days; workstations are excluded as expected noise) and devices with warranties expiring within the next 30 days. The limit applies per alert category.
list_device_types
query_devices
Read
read_devices
List device types.
list_devices
query_devices
Read
read_devices
List devices with filters, including fleet/lifecycle queries: os contains-match (e.g. “server”, “windows 10”), warranty expiry windows (warrantyExpiresBefore/After), stale devices (lastSeenBefore), and hardware age (firstSeenBefore).
get_device_patch_health
query_devices
Read
read_devices
Read OS patch health, compliance and coverage, failed and pending patches, reboot requirements and up to eight devices needing attention from staged NinjaOne, Datto RMM, ConnectWise Asio and Syncro data. Use provider=ninjaone for NinjaOne-specific answers. Counts cover reporting devices, not the whole fleet. NinjaOne patch counts older than three days are excluded. Read-only. It does not run a sync or install patches.
list_locations
query_devices
Read
read_devices
List locations.
list_intune_devices
query_intune_devices
Read
read_devices
List Microsoft Intune managed devices synced through CIPP with Entra join type, Intune compliance state, ownership, OS, serial, primary user, last Intune check-in, the linked portal device and whether an RMM agent also reports it. Use coverage not_in_rmm to find Intune devices no RMM manages. Filter by company, compliance state or join type.
Stage a reviewed readiness change for 1–100 explicitly selected companies. Exclude/include companies; exempt or restore a requirement; confirm or withdraw a reviewed confirmation. Use get_company_readiness for requirementId. Role mappings are configured per check in Readiness settings. Exemptions need a reason. Confirmations represent the approving person’s review and fail if ANY check is unsatisfied. The entire batch is atomic. Always show the proposal for human review before committing.
get_company_readiness
query_readiness
Read
MSP staff only.read_client_readiness
Read every readiness check for one company, including ready and exempt checks, evidence, the responsible person and requirement IDs. Use this before proposing exemptions, removing exemptions or reviewing confirmations through bulk_update_readiness.
get_portfolio_summary
query_analytics
Read
read_dashboards, read_settings_companies
Get portfolio analytics summary, optionally filtered to companies assigned to a specific company role (for example vCIO) or assigned team member.
Find company owner roles and active MSP team members for readiness bulk changes. Returns role IDs and public user IDs. Search matches names and email, up to 50 users; narrow the search to find a person. Only team-menu roles are assignable.
get_technician_capacity
query_analytics
Read
MSP staff only.read_msp_calculators
Read technician capacity and utilisation over the last complete weeks: team weekly capacity, available, logged and billable hours, utilisation against target, headroom and a weekly series. Per-technician rows are included only for callers with read_technician_performance. Billable figures come from ConnectWise and Autotask; Halo time has no billable split. companyIds limits logged time to those clients; capacity always covers the whole team.
get_technician_forecast
query_analytics
Read
MSP staff only.read_msp_calculators
Forecast technician capacity against demand for this quarter and the next ones: ticket run rate, remaining project task budget and Planner hours weighted by probability. Work with no dates or more than 90 days overdue is reported as unscheduled. Per-technician rows only for callers with read_technician_performance; companyIds limits demand, never capacity. vCIO advisory hours are not included.
get_team_activity
query_analytics
Read
read_team_activity
Get a tenant-scoped record of what the team did in MSPortal. Returns daily totals plus teammate and company rollups; set includeFeed to true for a paginated, redacted who-did-what feed. This is the auditing tool for activity detail; get_user_activity remains useful for engagement trends.
get_ticket_trends
query_analytics
Read
read_ticket_trends
Get pre-computed weekly ticket trend analytics: created/closed/backlog per week, per-company totals (default top 15 by volume, max 50), per-category totals (same caps), and a deterministic forecast with volume direction, backlog outlook, resolution trend, and the top 10 company/category risk watchlist entries. Data is aggregated weekly; use list_tickets for individual tickets.
get_training_analytics
query_analytics
Read
read_training
Get training analytics.
get_user_activity
query_analytics
Read
read_settings_users, read_dashboards
Get user activity analytics with optional company, user, company-role, and date filters.
list_company_audit
query_readiness
Read
read_settings_companies, read_dashboards
Superseded by list_company_readiness. List company audit metrics; its auditScore and missingItems are now computed from the tenant’s Account Readiness requirements. Supports filtering by company, assigned company role (for example vCIO), or assigned team member.
list_company_readiness
query_readiness
Read
read_client_readiness
List Account Readiness state per company: an honest 0-100 score plus every open check with its area, owner and the in-app page that fixes it. Use bulk_update_readiness to propose changes for human review. Confirmations require the approving person to review each company.
Module scopes:mcp.read, mcp.writeThese MSP staff-only actions use the existing MCP read or write grants and require no task-specific role permission. Use the schemas returned by your connection for the available actions and parameters.
Action / legacy name
Public tool
Access
Permissions
Description
list_my_tasks
query_tasks
Read
MSP staff only. MCP access
Read your own tasks with scope: "mine", or tasks shared on your assigned companies with scope: "my_companies". Returns up to 100 tasks in list order; completed tasks are excluded unless requested. Check the result’s truncation indicator.
create_tasks
manage_tasks
Write (confirm)
MSP staff only. MCP access
Stage up to 100 new tasks on your own list, optionally with a company tag and source link. A company tag shares the task with colleagues assigned to that company; omit it to keep the task private.
update_task
manage_tasks
Write (confirm)
MSP staff only. MCP access
Stage changes to one editable task’s title, description, status, priority, due date or company tag. Use this action to reopen a completed task by changing its status.
complete_tasks
manage_tasks
Write (confirm)
MSP staff only. MCP access
Stage completing up to 100 editable tasks in one atomic batch. Resolve task IDs with list_my_tasks before proposing the change.
delete_tasks
manage_tasks
Write (confirm)
MSP staff only. MCP access
Stage permanent deletion of up to 100 editable tasks. Deletion cannot be undone; use complete_tasks when the work is finished.
Ownership, company sharing and tenant boundaries are enforced when a change is committed. Private tasks can also be read by authorized task-list auditors in the portal. Scratch notes are not exposed by these tools. See Tasks and notes for the portal workflow.
Get one planner item, including its custom field values (label → value).
link_planner_item_entities
manage_planner_links
Write (confirm)
write_planner
Stage or attach existing goals, assigned compliance checks, secure score controls, or devices to a planner item. Idempotent: re-linking the same entity is a no-op.
list_planner_item_links
query_planner_links
Read
read_planner
List the goals, assigned compliance checks, secure score controls, and devices linked to a planner item.
list_planner_items
query_planner
Read
read_planner
List planner items with filters.
list_planner_types
query_planner
Read
read_planner
List planner item types.
merge_planner_items
manage_planner
Write (confirm)
manage_planner
Stage or merge similar planner items for one company into a single item. Linked records, cost lines and notes move to the kept item and the merged items are archived. Items kept in sync by a standard or automation rule, or that keep their devices linked by conditions, cannot be merged.
set_planner_item_device_criteria
manage_planner
Write (confirm)
write_planner
Stage or turn on “Keep linked automatically”: the item’s device links become the company’s devices that match the conditions and refresh hourly. criteria: null turns it off and keeps the current links. Items managed by Standards or an automation rule are refused.
suggest_planner_item_devices
query_planner
Read
write_planner, read_devices
Preview the item company’s devices that match device conditions (type, manufacturer, OS or model terms, warranty before the due date, age, recent check-in), with the company’s pick-list values.
unlink_planner_item_entity
manage_planner_links
Write (confirm)
manage_planner
Stage or remove one linked goal, assigned compliance check, secure score control, or device from a planner item.
Stage or create a tenant-wide compliance group. Optionally provide checkIds to set its exact check-definition membership.
create_compliance_risk
manage_compliance_risks
Write (confirm)
write_compliance
Stage or promote one eligible unaddressed compliance gap into the risk register. This never creates a standalone risk and requires explicit confirmation.
create_compliance_run
manage_compliance_runs
Write (confirm)
write_compliance
Stage or commit creating compliance runs (one per company) and enqueue assignment from reusable run templates, compliance groups, and/or individual check definitions. Resolve templateIds with list_compliance_run_templates; list_compliance_templates returns check definitions instead. At least one source is required.
create_compliance_run_template
manage_compliance_run_templates
Write (confirm)
write_compliance, manage_compliance
Stage or create a reusable compliance run template with exact group and individual-check memberships.
create_compliance_template
manage_compliance_definitions
Write (confirm)
write_compliance, manage_compliance
Stage or create a base compliance check definition (the records listed by list_compliance_templates / list_compliance_check_definitions). New definitions start pending review. groupIds optionally sets exact group membership.
delete_compliance_group
manage_compliance_groups
Write (confirm)
manage_compliance
Stage or permanently delete a compliance group. Its check mappings, device-type mappings, and run-template memberships are removed; historical assignments keep the check but lose the group link.
delete_compliance_run_template
manage_compliance_run_templates
Write (confirm)
manage_compliance
Stage or permanently delete a reusable compliance run template. Its group/check memberships and every schedule that references it are also deleted.
delete_compliance_template
manage_compliance_definitions
Write (confirm)
manage_compliance
Stage or permanently delete a base compliance check definition. This cascades to its assigned compliance checks and related history, group mappings, run-template memberships, and completed-meeting links. Risk register entries and risk findings derived from the check are kept and detached from it.
dismiss_compliance_risk_gap
manage_compliance_risk_gaps
Write (confirm)
write_compliance
Stage or dismiss one eligible compliance gap with a reason. A later failed run can create a new gap.
draft_compliance_notes
draft_compliance_notes
Immediate action
write_compliance
Generate sanitized PUBLIC-note drafts from authoritative private-note answers. Pass one to 10 assignedCheckIds, or selection=all_answered to resolve up to 50 active-run answers in scope. This does not save anything. Review suggestedNotesPublicHtml (which preserves existing public notes), then call update_compliance_checks with that exact notesPublic value and confirm the staged update. If selectionCoverage.hasMore is true, continue with selectionCoverage.nextSelectionOffset.
get_compliance_check
query_compliance_checks
Read
read_compliance
Get one assigned compliance check with its run, company, scope, status, exact note bodies, due date, and completion details. Internal notes are never returned to company users.
get_compliance_check_definition
query_compliance_definitions
Read
read_compliance
Get a base compliance check definition, including instructions, rationale, remediation, references, scope, priority, and approval state.
get_compliance_company_summary
query_compliance_checks
Read
read_compliance
Return authoritative active-run compliance totals and scores grouped by company, with explicit tie-aware leaders for most outstanding checks and best/worst simple and weighted percentages. Use this for portfolio comparisons instead of counting paginated check lists.
get_compliance_group
query_compliance_groups
Read
read_compliance
Get one compliance group with its exact checkIds membership and check count. Use this before replacement edits.
get_compliance_risk
query_compliance_risks
Read
read_compliance
Get one risk with occurrences, source compliance state, linked remediation work, standards references, and audit history.
get_compliance_risk_gap
query_compliance_risk_gaps
Read
write_compliance
Get one exact eligible compliance risk gap by assignment id before explaining, promoting, or dismissing it.
get_compliance_run
query_compliance_runs
Read
read_compliance
Get a compliance run and one paginated page of compact assigned-check summaries. Rich descriptions and note bodies are omitted; follow assignedChecksPagination for more pages and use get_compliance_check for exact detail. Private-note presence is never disclosed to company users.
get_compliance_run_template
query_compliance_run_templates
Read
read_compliance
Get one reusable compliance run template with the exact groupIds and checkIds it will assign.
list_compliance_check_definitions
query_compliance_definitions
Read
read_compliance
List base compliance check definitions from compliance_checks. These ids may be used as checkIds when creating a run; they are not run-template ids.
list_compliance_checks
query_compliance_checks
Read
read_compliance
List compact assigned-check summaries across runs with company, run, status, priority, flag, and search filters. Note bodies are omitted; use get_compliance_check for exact notes. Private-note presence is never disclosed to company users.
list_compliance_groups
query_compliance_groups
Read
read_compliance
List tenant compliance groups with their type, auto-map setting, and check count. Group ids can be used when creating runs.
list_compliance_risk_categories
query_compliance_risks
Read
read_compliance
List active tenant-owned risk categories. Use the returned ids when creating or recategorizing a risk.
list_compliance_risk_gaps
query_compliance_risk_gaps
Read
write_compliance
List latest explicit failed compliance results that are eligible for internal promotion or dismissal. Criticality informs impact; priority informs remediation urgency.
list_compliance_risks
query_compliance_risks
Read
read_compliance
List compliance-derived risks with company, status, category, severity, owner, target-date, and search filters. Company users receive only explicitly visible risks in their allowed company scope.
list_compliance_run_templates
query_compliance_run_templates
Read
read_compliance
List reusable run templates from compliance_runs_templates. Pass these returned ids as templateIds to create_compliance_run.
list_compliance_runs
query_compliance_runs
Read
read_compliance
List compact compliance-run summaries with company, completion, date, note-presence flags, and passed/failed/pending check counts. Full run note bodies are omitted.
list_compliance_status_options
query_compliance_checks
Read
read_compliance
List the valid statuses for one assigned check. Use a returned id as statusItemId when updating that same assignment.
list_compliance_templates
Legacy call only
Read
read_compliance
Backward-compatible alias that lists base check definitions from compliance_checks. For reusable run templates, call list_compliance_run_templates.
update_compliance_check
manage_compliance_checks
Write (confirm)
write_compliance
Stage or commit an assigned check update. Supports status, public/private notes, priority, flag, and due date. Use list_compliance_status_options before changing status.
update_compliance_checks
manage_compliance_checks
Write (confirm)
write_compliance
Stage or commit exact updates to one to 25 assigned compliance checks. Each item may change status, public/private notes, priority, flag, or due date.
update_compliance_group
manage_compliance_groups
Write (confirm)
write_compliance, manage_compliance
Stage or update a compliance group’s editable fields. Only provided fields change; checkIds replaces the exact membership and an empty array clears it.
update_compliance_risk
manage_compliance_risks
Write (confirm)
write_compliance
Stage or update a non-closed risk’s assessment, status, ownership, treatment, target date, category, or client visibility. Closed risks are terminal.
update_compliance_run
manage_compliance_runs
Write (confirm)
write_compliance
Stage or commit safe edits to a compliance run: name, notes, run date, and completion state.
update_compliance_run_template
manage_compliance_run_templates
Write (confirm)
write_compliance, manage_compliance
Stage or update a reusable compliance run template. Only provided fields change; groupIds and checkIds each replace their exact membership when supplied.
update_compliance_status
Legacy call only
Write (confirm)
write_compliance
Backward-compatible alias for update_compliance_check. Stages or commits status, notes, priority, flag, or due-date changes on one assigned check.
update_compliance_template
manage_compliance_definitions
Write (confirm)
write_compliance, manage_compliance
Stage or update any editable field on a base compliance check definition. Only provided fields change; null clears nullable fields, and groupIds replaces exact group membership.
Stage or append agenda items to a meeting. Link existing planner items, assigned compliance checks (e.g. failed checks from list_compliance_checks), goals, budgets, reports, training courses, or devices, or insert text blocks and dividers.
Stage or add attendees to an existing meeting. Provide a userId (tenant user, from list_users) or an external email per attendee. Idempotent: already-attached attendees are skipped.
Stage or cancel an entire meeting series or one recurring occurrence. Published meetings are cancelled through their existing Graph or ICS transport and retain their organizer identity.
Stage or book a meeting owned by the authenticated MCP user. Omit sendInvitation (or set false) to Save a portal draft; set it true to Save & Send. Supports attendees, IANA timezones, Teams, RFC 5545 rules, and typed recurrence (quarterly is monthly interval 3). No creator override is accepted.
get_meeting
query_meetings
Read
read_calendar, read_meetings
Get a meeting with participants.
list_meeting_action_items
query_meeting_action_items
Read
read_calendar, read_meetings
List a meeting’s action items, including assignee, status, priority, and due date.
list_meeting_agenda
query_meeting_agenda
Read
read_calendar, read_meetings
List a meeting’s agenda items in order, including linked planner items, assigned compliance checks, goals, budgets, reports, training courses, and devices.
list_meeting_participants
query_meeting_participants
Read
read_calendar, read_meetings
List the attendees on a meeting.
list_meeting_types
query_meetings
Read
read_calendar, read_meetings
List meeting types.
list_meetings
query_meetings
Read
read_calendar, read_meetings
List visible calendar meetings. Set mineOnly to return only meetings organized by the authenticated MCP user.
get_business_review_plan
query_meetings
Read
MSP staff only.manage_meetings, manage_calendar
Read the year’s business review plan for every client: cadence, target month or quarter, and the months with reviews held, booked, due or overdue, plus per-month totals. Set includeSuggestions for balanced target months. Needs recurring meetings for the tenant.
set_business_review_targets
manage_meetings
Write (confirm)
MSP staff only.manage_meetings, manage_calendar
Stage or apply target months or quarters for clients’ quarterly and annual business reviews; a null target clears it. Other recurring meeting defaults stay as they are. Needs recurring meetings for the tenant.
Stage or retry the latest failed/retryable Graph or ICS calendar operation. Only the authenticated meeting organizer can retry; the original transport and series/occurrence semantics are preserved.
Stage or update a meeting or one recurring occurrence, including attendees, timezone, Teams, recurrence, and Save & Send publication. Use cancel_meeting for cancellation. Published meetings retain their original authenticated organizer.
Get company-scoped security awareness training and phishing simulation metrics from connected Phin, Breach Secure Now, Huntress, and CyberHoot providers. Includes completion, users behind, provider rollups, and a capped list of users needing attention. Phishing send/click/campaign, breach, and captured-credential metrics that CyberHoot does not provide are returned as null, never zero. This tool is only advertised when the current tenant or company has mapped security-awareness data.
Stage or create a complete general survey: title, description, and questions with answer types and options. Created inactive by default; chain with set_survey_status to activate, send_survey_invites to dispatch, and list_survey_responses to read results.
get_nps_summary
query_surveys
Read
read_surveys
Pre-computed NPS analytics rows (promoters/passives/detractors, NPS score, response rate) bucketed by period (daily/weekly/monthly/quarterly/yearly/all_time), tenant-wide and per company. Filter by companyId for ‘NPS by client’, by periodType for trend questions, or by surveyId for one NPS campaign. Returns the newest 200 periods; narrow with periodType or a date window for longer histories.
get_survey
query_surveys
Read
read_surveys
Get a general survey with questions.
get_survey_stats
query_surveys
Read
read_surveys
Aggregated stats for one general survey: invites sent, completed responses, response rate, and per-question rollups (average value for numeric/likert/NPS/rating questions, option counts for select questions). Use instead of re-aggregating list_survey_responses.
list_survey_responses
query_surveys
Read
view_all_survey_answers, manage_surveys
List responses for a general survey.
list_surveys
query_surveys
Read
read_surveys
List general surveys.
send_survey_invites
manage_surveys
Write (confirm)
write_surveys
Stage or send email invitations for an active general survey to a list of recipients. Sends real emails on commit.
set_survey_status
manage_surveys
Write (confirm)
write_surveys
Stage or set the active status of a general survey (activate or deactivate).
Stage or commit inviting a user to the tenant by email. Sends an invitation email (or links an existing account). Provide companyId to invite a company (client portal) user.
list_company_contacts
query_users
Read
read_settings_company_users
List company users (client portal contacts) with optional search, status, and company filters.
Get aggregated Microsoft 365 license totals: SKU count, purchased vs consumed vs available units, utilization percent, and company count.
get_secure_score_summary
query_m365
Read
read_m365
Get the Microsoft Secure Score posture summary: current vs max score, percentage, trend over the recorded history, per-category breakdown, and industry comparison when available. Returns null data when no secure score snapshot exists for the scope.
get_secure_score_trend
query_m365
Read
read_m365
Get daily Microsoft Secure Score data points (current score, max score, percentage) over a configurable lookback window (default 90 days), for charting or trend analysis.
list_m365_domains
query_m365
Read
read_m365
List Microsoft 365 domains with verification, default/initial flags, authentication type, and supported services.
list_m365_licenses
query_m365
Read
read_m365
List Microsoft 365 license SKUs with consumed/enabled units, assigned user counts, renewal dates, and subscription status. One row per company + SKU; optionally filtered to a single company.
list_m365_users
query_m365
Read
read_m365
List Microsoft 365 users with pagination, free-text search, and filters for department, office, user type, account state, and license SKU.
list_secure_score_recommendations
query_m365
Read
read_m365
List Microsoft Secure Score improvement actions sorted by points remaining (highest impact first), with category, tier, implementation cost, user impact, remediation guidance, and current state. By default only actions that still have points to gain are returned. Pair with create_planner_item to build a remediation plan.
Get a unified backup protection summary across Cove, Acronis, NinjaOne, Datto BCDR, Slide Backup, Kaseya SaaS Protection, and Spanning Backup, including device protection/storage/alerts plus SaaS workload health, 24-hour service coverage, initial backups, and last full success.
get_saas_protection_customer
query_backup
Read
read_backup
Read one mapped SaaS backup customer in detail (Kaseya SaaS Protection by default, or Spanning Backup via provider), including all workload metrics and its successful-backup trend (10-30 days for Kaseya, up to 7 for Spanning).
list_backup_alerts
query_backup
Read
read_backup
List backup alerts from Acronis, Datto BCDR and Slide Backup (provider slide), newest first, with pagination and severity, status, search and provider filters. Datto BCDR and Slide alerts have no severity and are always active, so a severity filter or a non-active status filter leaves them out. Returns an empty list when none of these providers is connected.
list_backup_devices
query_backup
Read
read_backup
List backed-up devices and resources across all active backup providers (Cove, Acronis, NinjaOne, Datto BCDR, Slide Backup), excluding Microsoft 365 mailbox and site backups. Each page returns at most limit rows in provider order; totalCount sums all matching providers.
list_saas_protection_customers
query_backup
Read
read_backup
List mapped SaaS backup customers (Kaseya SaaS Protection by default, or Spanning Backup via provider) with overall health, Exchange/OneDrive/SharePoint/Teams status, services backed up in the last 24 hours versus active services, initial backups, and last 100% successful backup.
list_saas_protection_seats
query_backup
Read
read_backup
List Kaseya SaaS Protection seat/service inventory for a portal company, with customer, type, state, billable status, and sync details.
Stage or commit adding a note to a project ticket in the PSA (ConnectWise project ticket notes, attributed to your linked PSA member; Halo ticket actions). Autotask project tasks do not support notes.
Stage or commit creating a project ticket from a pending action item: a ConnectWise, Halo PSA or Autotask project ticket in the project’s PSA, or a native MSPortal ticket. The ticket is prefilled from the item and links back to it; the item links to the ticket and completes when the ticket closes. The ticket is internal unless showToClient is true. Staging previews the PSA, phase, summary and priority; an item that already has a ticket is refused.
delete_project_client_action
manage_project_client_actions
Write (confirm)
write_projects_overlays
Stage or commit removing a client action from a project’s overlay. Removing a pending decision that came from a weekly update also removes that decision bullet from the update.
delete_project_deliverable
manage_project_deliverables
Write (confirm)
write_projects_overlays
Stage or commit removing a deliverable from a project’s overlay.
delete_project_milestone
manage_project_milestones
Write (confirm)
write_projects_overlays
Stage or commit removing a milestone from a project’s overlay.
delete_project_weekly_update
manage_project_updates
Write (confirm)
write_projects_overlays
Stage or commit removing a weekly update from a project’s overlay. Pending decision client actions that only existed because of this update are removed as well.
finalize_project_document_upload
manage_project_documents
Write (confirm)
MSP staff only.write_projects
Stage or commit registering a file already sent to the signed URL from prepare_project_document_upload. Pass uploadId, newDocumentId, fileSize and the same metadata used to prepare it. File size, type, current permissions and expectedVersion are checked again before the document or revision is saved. Returns documentId, version and a documentLink.
get_project
query_projects
Read
read_projects
Get one project with its client-visibility overlay. Heavy overlay detail (deliverables, milestones, client actions, weekly updates) is only returned when explicitly requested. Use get_project_detail for phases, tickets, and time entries.
get_project_detail
query_projects
Read
read_projects
Full project detail bundle: PSA project fields, the health overlay (outcome, phase, health, contacts, deliverables, milestones, client actions, weekly updates), PSA phases, and bounded slices of tickets (including scheduled start/end dates) and time entries. ticketsTruncated / timeEntriesTruncated tell you when to page with list_project_tickets / list_project_time_entries.
get_project_display_settings
query_project_settings
Read
read_settings_projects
Tenant-level project display settings (client visibility mode, section/field toggles, status mappings, Kanban configuration). Returns defaults with isDefault=true when nothing has been customized.
get_project_document_version_download
query_project_documents
Read
MSP staff only.read_projects
Get a five-minute signed download URL for one version of a project folder document.
get_project_kanban_options
query_projects
Read
read_projects
Assignable catalogs for a project’s Kanban board: project statuses, ticket statuses per service board (ConnectWise; Autotask returns one board-less entry for its shared task status picklist), and (for callers who can edit projects on ConnectWise/Autotask) the owner roster (ConnectWise: live project team) and priority catalog, each as { name, externalId }. MSPortal-native projects return the fixed ticket statuses in one board-less group; their project lifecycle status is free text, so projectStatuses is empty and update_project_status accepts statusName directly.
list_project_assignable_users
query_projects
Read
read_projects
Users who can be assigned to a project’s client actions: contacts of the project’s company plus tenant staff. Use the returned ids as assigneeIds in upsert_project_client_action.
List the client portal and phase IDs this project’s documents can be shared to. Use them as portalId and phaseId when sharing an upload or changing a folder document’s visibility.
list_project_document_versions
query_project_documents
Read
MSP staff only.read_projects
List a project folder document’s versions, newest first. The newest version_number is the expectedVersion for a revision upload or a restore. Version history stays visible to MSP staff only, even when the current file is shared.
list_project_documents
query_project_documents
Read
MSP staff only.read_projects
List a project’s document library with document IDs, sources, visibility and folder IDs. Documents page with page and limit; folders return 100 at a time (continue with foldersOffset while has_more is true). Use the document’s id and source in a deliverable’s documentLinks.
list_project_ticket_notes
query_project_tickets
Read
read_projects
Notes on one project ticket: synced notes first, otherwise fetched live from the PSA (ConnectWise project ticket notes; Halo actions, cached afterwards). Autotask project tasks have no notes.
list_project_tickets
query_project_tickets
Read
read_projects
Tickets (PSA project tasks) for one project with status, owner, priority, phase, hours, scheduled start/end dates, and closed state. Filter by status name, owner, phase, closed flag, or search text; paginated.
list_project_time_entries
query_projects
Read
read_projects
Time entries logged against one project (most recent 500), newest first. Filter by ticket, phase, member, or date range; paginated. Notes are truncated.
list_projects
query_projects
Read
read_projects
List PSA projects with health overlay data, pagination, and optional filters. Returns lean summaries; use get_project for deliverables, milestones, client actions, and weekly updates.
prepare_project_document_upload
manage_project_documents
Write (confirm)
MSP staff only.write_projects
Stage or commit a signed upload URL for a project folder file up to 10 MiB. Supply fileName and the exact fileSize. Confirming returns uploadUrl, uploadId and newDocumentId; PUT the raw bytes to uploadUrl, then call finalize_project_document_upload. Preparing registers no document.
restore_project_document_version
manage_project_documents
Write (confirm)
MSP staff only.write_projects
Stage or commit making an earlier version current by adding it as a new version. History and the document ID are kept. Existing client portal shares are withdrawn, so the restored file stays internal until you share it again.
set_project_document_visibility
manage_project_overlay
Write (confirm)
write_projects_overlays
Stage or commit sharing one of a deliverable’s documents with the client portal, or returning it to internal only. Documents are internal when uploaded and are only ever shared on purpose. This action only changes deliverable attachments; use set_project_library_document_visibility for project folder documents. A shared document still stays hidden while its deliverable is internal; the result reports reachesClient so you can tell the difference.
Stage or commit sharing a project folder document’s current version in a chosen client portal phase, or returning it to internal only (isClientVisible true or false). Choose IDs with list_project_document_sharing_targets. Version history always stays internal.
update_project_client_visibility
manage_project_overlay
Write (confirm)
write_projects_overlays
Stage or commit whether a project (and its overlay) is visible in the client portal (is_client_visible).
update_project_display_settings
manage_project_settings
Write (confirm)
write_settings_projects
Stage or commit a partial update of the tenant-level project display settings (client visibility mode and filters, section/field toggles, project and Kanban status mappings, Kanban technician roster). Only provided keys change; the merged settings are validated exactly like the settings page (visibility and roster selections must exist in the tenant’s catalog). Returns the saved settings row.
update_project_overlay
manage_project_overlay
Write (confirm)
write_projects_overlays
Stage or commit a partial update of a project’s health overlay: outcome title/description, current phase, health status/reason/override, MSP lead, client sponsor, and internal notes. Only provided fields change; null clears a field. Creates the overlay if the project has none. Use update_project_client_visibility for client visibility toggles.
update_project_status
manage_projects
Write (confirm)
write_projects_status
Stage or commit a change of a project’s lifecycle status. PSA-backed projects are written through to the PSA (ConnectWise / Autotask; Halo updates the portal cache only) and then reflected in the portal; MSPortal-native projects are updated in the portal only. Target by PSA status name or external id (get_project_kanban_options projectStatuses), or by Kanban display group (its configured default status is used).
update_project_ticket_owner
manage_project_tickets
Write (confirm)
write_projects
Stage or commit assigning (or unassigning with null) the owner of one or more tickets on a project, written through to the PSA (ConnectWise project team members; Autotask assigned resource) and then reflected in the portal cache. Owner ids come from get_project_kanban_options owners.
update_project_ticket_priority
manage_project_tickets
Write (confirm)
write_projects
Stage or commit a priority change for one or more tickets on a project, written through to the PSA (ConnectWise / Autotask) and then reflected in the portal cache. Priority ids come from get_project_kanban_options priorities.
update_project_ticket_status
manage_project_tickets
Write (confirm)
write_projects_status
Stage or commit a status change for one or more tickets on a project, written through to the PSA (ConnectWise service-board statuses per ticket board; Autotask task status picklist) and then reflected in the portal cache. Resolve the target by name or PSA external id from get_project_kanban_options.
upload_project_document
manage_project_documents
Write (confirm)
MSP staff only.write_projects
Stage or commit uploading a file (base64, up to 3 MB) into a project folder, optionally linking an existing deliverable. Omit documentId for a new document; pass documentId and the current expectedVersion to add a new version that keeps the history and existing links. folder accepts a folder ID or an unambiguous name. Files are internal by default; isClientVisible true also needs portalId and phaseId. Use prepare_project_document_upload for files up to 10 MiB.
upsert_project_client_action
manage_project_client_actions
Write (confirm)
write_projects_overlays
Stage or commit creating a client action (decision, approval, question, access request, scheduling item, or action item) on a project’s overlay, or updating one by clientActionId. Assignees are validated against list_project_assignable_users. Pending decisions/approvals stay in sync with the weekly-update decisions list. autoCompleteOnClose completes an action item when its linked ticket closes.
upsert_project_deliverable
manage_project_deliverables
Write (confirm)
write_projects_overlays
Stage or commit creating a deliverable on a project’s overlay (omit deliverableId) or updating one (pass deliverableId; only provided fields change). Moving status to complete stamps completed_at.
upsert_project_milestone
manage_project_milestones
Write (confirm)
write_projects_overlays
Stage or commit creating a milestone on a project’s overlay (omit milestoneId) or updating one (pass milestoneId; only provided fields change).
upsert_project_weekly_update
manage_project_updates
Write (confirm)
write_projects_overlays
Stage or commit creating a weekly status update on a project’s overlay (omit weeklyUpdateId; weekOf required) or editing one (pass weeklyUpdateId; only provided fields change). Each decisionsNeeded bullet is mirrored as a pending decision client action.
Get daily health score snapshots for one company, including per-dimension scores, over a configurable lookback window (default 180 days).
get_client_health_summary
query_customer_success
Read
read_customer_success
Get portfolio-wide client health summary stats: average health score, counts by risk level, average NPS, tool stack adoption, and overdue invoices.
get_csat_summary
query_customer_success
Read
read_customer_success
CSAT (customer satisfaction) rollup from ticket-close survey responses: overall stats (total responses, average score, CSAT %, satisfied/neutral/dissatisfied counts, low-score count) plus a per-company breakdown. Filter by date window (periodStart/periodEnd) for ‘CSAT this quarter’ questions, or by a single CSAT survey campaign.
list_client_health
query_customer_success
Read
read_customer_success
List client health scores across companies with risk level, trend, dimension scores, and key engagement/financial signals. Supports pagination, risk filtering, and search.
get_company_benchmarks
query_client_benchmarks
Read
read_customer_success, read_devices, read_backup
Benchmark clients against all of the MSP’s active clients on health, patch and backup scores (0-100, a current snapshot): peer median and quartiles, and each client’s value and percentile. Clients need 5 or more devices or protected items to be ranked, and peer figures need 5 clients. Company users see only their own companies. Metrics the caller cannot read are left out.
Get one synced invoice by ID with full amounts, payments, and billing detail.
get_invoice_summary
query_financial
Read
read_invoices
Get aggregate invoice totals: invoice count, total billed, outstanding balance, open count, and overdue count/amount. Optionally scoped to specific companies.
get_quote
query_financial
Read
read_quotes
Get one quote by ID with full pricing totals and lifecycle dates.
get_revenue_summary
query_financial
Read
read_financial_reporting
Get monthly revenue over a lookback window (default 12 months), grouped by classification (managed / other recurring / non-recurring), PSA provider, or line type. One row per month + group. Useful for QBR prep, revenue trend analysis, and profitability conversations.
list_invoices
query_financial
Read
read_invoices
List PSA-synced invoices with status, type, dates, totals, payments, and balances. Supports pagination, company filtering, status/type/date filters, and search. Invoices are owned by the PSA; this is a read-only view.
list_quotes
query_financial
Read
read_quotes
List quotes from active quoting integrations with stage, owner, company, and monthly/annual/one-time totals. Supports pagination, company filtering, stage filtering, and search. Quotes are created and managed in the source quoting provider; this is a read-only view.
Get one integration’s sync health, including a lastRuns map of per-entity last-sync timestamps. Never returns credentials or configuration.
list_integrations
query_integrations
Read
read_settings_integrations
List tenant integrations with sync health (status, derived health, failure counters, last error, per-entity last-sync timestamps). Never returns credentials or configuration. Returns a detail object { integrations, companyIntegrations }; companyIntegrations is null unless includeCompanyIntegrations is true.
pause_integration
manage_integrations
Write (confirm)
write_settings_integrations
Stage or pause an integration. Pausing stops all background syncs for the provider until it is resumed (status becomes ‘paused’ with reason ‘manual_pause’).
resume_integration
manage_integrations
Write (confirm)
write_settings_integrations
Stage or resume a paused integration. Sets status to ‘active’ and clears the pause and failure state (paused_at, paused_reason, last error fields, consecutive failures).
Create a built-in documentation page (inline HTML custom document) in the tenant’s documentation library. Optionally scoped to a company and placed in a custom folder. The page gets a first revision and a visibility rule, like pages created from Settings: shared with all company users by default, or restricted to specific permission-group roles via roleIds (see list_documentation_visibility_roles).
get_documentation_document
query_documentation
Read
read_documentation
Get one documentation document with its full HTML content: a built-in custom page, a Hudu article (with attachment metadata and public share links where sharing is enabled), or an IT Glue document. Per-item visibility rules are enforced. A built-in page with isClientTemplate: true is a client template: pass companyId to get it filled in for that client (brandedFor names the company). Company users always get their own company’s version.
list_documentation_documents
query_documentation
Read
read_documentation
List documentation from the merged library: built-in custom pages plus articles synced from Hudu and IT Glue. Returns a short plain-text excerpt per document; use get_documentation_document for full content. Supports search, company, folder, and source filters.
list_documentation_folders
query_documentation
Read
read_documentation
List documentation folders across all sources (custom, Hudu, IT Glue) with per-folder document counts. Use the returned folderKey to filter list_documentation_documents, and the UUID of custom:<uuid> keys as folderId when creating pages.
List the company permission-group roles (client portal roles) that can be used as visibility targets when creating documentation pages. Pass the returned role ids as roleIds to create_documentation_page to restrict a page to company users in those roles.
Replace the visibility rules of an existing built-in documentation page: restrict it to specific company permission-group roles (see list_documentation_visibility_roles) or share it with all company users in scope. Use this to share a page that was created from the onboarding page library into the documentation hub for a specific role, or to change who can see a page after creation. Existing rules are replaced, not merged. Only custom pages support this; Hudu and IT Glue articles are managed from Settings.
Update the title, HTML body, and/or summary of a built-in documentation page. Creates a new revision (the previous content stays in revision history). Only custom inline pages can be edited; Hudu and IT Glue articles are managed in their source system. contentHtml replaces the entire body, so fetch the current content with get_documentation_document and apply your edit to it.
list_intune_policies
query_intune
Read
read_documentation
List the Intune configuration, compliance, app protection and update policies documented from CIPP for each company: policy type, platform, assigned and excluded groups, number of configured settings, last modified date and when a change was last detected. Needs Document Intune policies on the CIPP integration.
get_intune_policy
query_intune
Read
read_documentation
Get one documented Intune policy with its configured settings as readable names and values, its assignments and, by default, what changed since the previous documented version. Secrets, certificates and scripts are never included; they appear as hidden values.
Stage or add a client contact to an onboarding portal. No invite email is sent by this tool; invites are emailed when the portal is started, or from the app via Send invite.
add_onboarding_portal_phase
manage_onboarding_phases
Write (confirm)
write_settings_onboarding
Stage or add a phase to an onboarding portal. The phase is appended at the end in pending status.
add_onboarding_portal_task
manage_onboarding_tasks
Write (confirm)
write_settings_onboarding
Stage or add a task to an onboarding portal phase. The task is appended at the end of the phase in pending status.
archive_onboarding_checklist
manage_onboarding_checklists
Write (confirm)
manage_settings_onboarding
Stage or apply archiving (archived: true) or restoring (archived: false) of an onboarding checklist template. Archived templates are hidden from pickers but existing task links keep working.
archive_onboarding_portal
manage_onboarding_portals
Write (confirm)
write_settings_onboarding
Stage or archive an onboarding portal (archived: true, revokes all active client portal sessions) or unarchive it back to draft (archived: false; only valid for archived portals).
complete_onboarding_portal
manage_onboarding_portals
Write (confirm)
write_settings_onboarding
Stage or mark an active onboarding portal as completed (active → completed). Logs a portal_completed event and fires portal-completion automations on commit.
create_onboarding_checklist
manage_onboarding_checklists
Write (confirm)
write_settings_onboarding
Stage or create a reusable onboarding checklist template with ordered items and optional tags. Link the template to onboarding template tasks in the app to attach it to client portals.
create_onboarding_form
manage_onboarding_forms
Write (confirm)
write_settings_onboarding
Stage or create a reusable client-facing onboarding form, optionally with its fields. Forms are created in draft status by default; active forms can be attached to onboarding form tasks for clients to fill in.
create_onboarding_page
manage_onboarding_pages
Write (confirm)
write_settings_onboarding
Stage or create a standalone onboarding documentation page in the page catalog. The body HTML is sanitized on save. The page is not attached to any template until linked with link_onboarding_page_to_template.
create_onboarding_portal
manage_onboarding_portals
Write (confirm)
write_settings_onboarding
Stage or create a client onboarding portal from a template, with optional client contacts. The portal is created in draft status and no client emails are sent; use start_onboarding_portal to activate it and send invites.
delete_onboarding_page
manage_onboarding_pages
Write (confirm)
manage_settings_onboarding
Stage or apply deletion (archival) of an onboarding documentation page. On commit the page is archived and removed from every template and portal that references it. This cannot be undone from the API.
delete_onboarding_portal_task
manage_onboarding_tasks
Write (confirm)
manage_settings_onboarding
Stage or permanently delete an onboarding portal task. This cannot be undone. Requires the manage onboarding permission.
get_onboarding_checklist
query_onboarding_checklists
Read
read_settings_onboarding
Get one onboarding checklist template with its full ordered items array, tags, and archive status.
get_onboarding_form
query_onboarding_forms
Read
read_settings_onboarding
Get one onboarding form with its full field definitions (label, field key, type, required flag, help text, placeholder, options, default value, display order).
get_onboarding_page
query_onboarding_pages
Read
read_settings_onboarding
Get one onboarding documentation page including its full body HTML, summary, icon, section label, and template/portal usage counts.
get_onboarding_portal
query_onboarding_portals
Read
read_settings_onboarding
Get the full detail of one onboarding portal: phases with tasks, documents, surveys, approvals, contacts, key dates, dependencies, and PSA project links.
link_onboarding_page_to_template
manage_onboarding_pages
Write (confirm)
write_settings_onboarding
Stage or apply linking a documentation page into an onboarding template. The page is appended at the end of the template’s page list. Idempotent: linking an already linked page returns the existing link.
list_onboarding_checklists
query_onboarding_checklists
Read
read_settings_onboarding
List reusable onboarding checklist templates with item counts, tags, and archive status. Use a checklist ID with get_onboarding_checklist to see its items.
list_onboarding_forms
query_onboarding_forms
Read
read_settings_onboarding
List reusable client-facing onboarding forms with status, field counts, and multiple-entry settings. Filter by status (draft, active, archived).
list_onboarding_pages
query_onboarding_pages
Read
read_settings_onboarding
List the standalone onboarding documentation page catalog with summaries, icon and section metadata, body length, and usage counts (templates and portals referencing each page). Use get_onboarding_page for the full body HTML.
list_onboarding_portals
query_onboarding_portals
Read
read_settings_onboarding
List client onboarding portals with status, progress counts (phases, tasks, documents), and contact counts. Filter by company or status (draft, active, completed, converted, archived).
list_onboarding_templates
query_onboarding_portals
Read
read_settings_onboarding
List client onboarding templates with phase/task counts and estimated duration. Use a template ID with create_onboarding_portal to spin up a portal for a new client.
start_onboarding_portal
manage_onboarding_portals
Write (confirm)
write_settings_onboarding
Stage or activate a draft onboarding portal (draft → active). Sends real invite emails to all portal contacts on commit.
unlink_onboarding_page_from_template
manage_onboarding_pages
Write (confirm)
manage_settings_onboarding
Stage or apply removal of a documentation page link from an onboarding template. The page itself stays in the catalog and remains linked to any other templates.
update_onboarding_checklist
manage_onboarding_checklists
Write (confirm)
write_settings_onboarding
Stage or apply changes to an onboarding checklist template. Only the provided fields change; the items array, when provided, replaces ALL existing items. Use get_onboarding_checklist first to fetch the current items before editing them.
update_onboarding_form
manage_onboarding_forms
Write (confirm)
write_settings_onboarding
Stage or apply changes to an onboarding form: rename it, change its description, status (draft, active, archived), or multiple-entry setting, and add, update, or remove its fields in one call.
update_onboarding_page
manage_onboarding_pages
Write (confirm)
write_settings_onboarding
Stage or apply a partial update to an onboarding documentation page (title, summary, body HTML, icon, section label). At least one field besides pageId is required. Each update records a new page revision.
update_onboarding_portal
manage_onboarding_portals
Write (confirm)
write_settings_onboarding
Stage or apply an update to an onboarding portal’s name and/or description. Pass description: null to clear it.
update_onboarding_portal_phase
manage_onboarding_phases
Write (confirm)
write_settings_onboarding
Stage or update an onboarding portal phase’s name and/or description. Pass description: null to clear it.
update_onboarding_portal_task
manage_onboarding_tasks
Write (confirm)
write_settings_onboarding
Stage or update an onboarding task’s title, description, owner, priority, or due date. Use update_onboarding_task_status to change its status.
update_onboarding_task_status
manage_onboarding_tasks
Write (confirm)
write_settings_onboarding
Stage or update an onboarding task’s status (pending, in_progress, completed, blocked). Completing a task logs an event, fires task-completion automations, and syncs the status to a linked PSA ticket if one exists.
update_onboarding_template_page_link
manage_onboarding_pages
Write (confirm)
write_settings_onboarding
Stage or apply an update to a template page link: change its display order within the template or toggle client visibility. At least one field besides linkId is required.
Stage or create a Standards catalog category with its description, icon, Planner type, require-one-of behavior, and display order. After creating it, add its standards/subentries with create_standard_item.
create_standard_item
manage_standards
Write (confirm)
manage_settings_tool_stack
Stage or create a standard item (the subentry beneath a Standards category) with its vendor, requirement flag, internal default price, description, and display order. Items in a require-one-of category are always optional individually.
get_company_standards
query_standards
Read
read_tool_stack
Get one company’s standards deployment: every catalog item with its lifecycle status, item-level deploymentOptions, selectedOption, target tier inherited from its PSA company type, and deploymentAlignment (meets_target, below_target, unmapped_target, unclassified, or not_deployed), plus vCIO notes and the linked planner item. Items with no recorded status are not_started.
get_standard_adoption
query_standards
Read
read_tool_stack
Adoption of standards across all companies, item by item. Without itemId: status counts for every standard (how many companies have each tool deployed / in progress / not started / N/A / declined). With itemId (from list_standards): also lists the company names in each status bucket (capped at 100 per bucket); answers ‘which clients are not on our standard EDR’. Companies excluded from standards tracking are not counted.
get_standards_compliance
query_standards
Read
read_tool_stack
Per-company standards compliance rollup, scored like the /standards page: each required item that isn’t N/A or declined counts as one check; requireOneOf categories count as one check satisfied by any deployed item. Returns per-company score, status counts, missingRequiredCount, and tenant-wide totals. The missingRequired name list (capped at 25) is only populated when companyId is provided; call again with one companyId to see WHICH checks a company is missing. Companies excluded from standards tracking are flagged and unscored (an excluded companyId returns one flagged record with null score). Ideal for QBR prep and ‘which clients are below our standards’ questions.
list_standards
query_standards
Read
read_tool_stack
List the tenant’s technology standards catalog (also called the tool stack): categories, standard items, and each item’s named deploymentOptions. Every deployment option includes its tenant-configured Standards tier. Categories marked requireOneOf are satisfied when any one item in them is deployed. Use these IDs with the Standards update tools and get_standard_adoption.
update_standard_category
manage_standards
Write (confirm)
manage_settings_tool_stack
Stage or update any editable Standards category field. Only provided fields change; null clears description, icon, or Planner type. Setting requireOneOf to true also makes every item in the category optional so the category acts as one grouped requirement.
update_standard_item
manage_standards
Write (confirm)
manage_settings_tool_stack
Stage or update any editable standard item field, including moving it to another category. Only provided fields change; null clears description or vendor. Use list_standards first to preserve fields you do not intend to change.
Cross-provider security posture summary: Cork (compliance findings, vulnerabilities incl. critical/known-exploited, endpoints), Acronis EDR (incident counts by state/severity/mitigation, endpoint protection), and Huntress (agents, escalations, incident reports, remediations, SAT learner counts), and Avanan email security over the last 30 days (threats by phishing/malware/other, open threats, spam and graymail blocked, protected users). A provider section is null when its data is unavailable; zero counts mean no data synced. Pair with get_secure_score_summary (M365) for the full QBR risk story.
list_avanan_email_threats
query_security
Read
read_security
List Avanan (Check Point Harmony Email & Collaboration) email threats from the last 30 days, newest first: threat type (phishing, malware, suspicious, DLP, malicious URL, and so on), state (new/detected/pending are open; remediated and dismissed are closed), severity (critical/high/medium/low), sender, the protected email tenant and mapped company, remediation actions taken, and a link to the Avanan portal. Search matches sender, description, tenant and company name.
list_edr_incidents
query_security
Read
read_security
List Acronis EDR incidents (newest first) with severity (HIGH/MEDIUM/LOW), state (NOT_STARTED/INVESTIGATING/CLOSED), mitigation state, verdict, and affected host. Search matches host name/domain.
list_huntress_items
query_security
Read
read_security
List Huntress security items; escalations, incident reports, and remediations; with status, severity, category, the affected company/organization, and a link to the Huntress portal. Filter by itemType to focus on one kind.
list_vulnerabilities
query_security
Read
read_security
List open vulnerability findings from every connected scanner (Cork, Action1 and RoboShadow), sorted by CVSS score (highest first): provider, CVE id/description, affected software and device, CVSS/EPSS scores, normalized severity, the scanner’s own priority (Cork only), known-exploited flag, first/last seen and status. Pass status resolved for Cork findings a complete sync stopped reporting, or provider to read one scanner. Search matches CVE id and software fields.
get_cloudflare_zone_posture
query_security
Read
read_security
Cloudflare domain security posture from the latest sync: zones mapped to companies, zones with findings, Registrar renewals due within 30 days, and the zones needing attention with SSL/TLS mode, minimum TLS version, Always Use HTTPS, DNSSEC, security level and managed WAF state. A null setting means the token could not read it.
list_bitdefender_endpoints
query_security
Read
read_security
List Bitdefender GravityZone endpoints with agent health from the last sync: online state, agent version, license status, outdated signatures or agent, malware in the last 24 hours, infection, isolation, policy and protection modules. Use issue to find endpoints with a specific problem, or any_issue for all of them, worst first.
list_fortinet_firewalls
query_firewalls
Read
read_security
List a client’s FortiGate firewalls from FortiGate Cloud with model, serial, FortiOS firmware compared with the branch’s latest release, FortiGate Cloud management connection, and FortiCare and FortiGuard end dates. Use issue to find disconnected, firmware-behind or renewal-due FortiGates.
list_petra_incidents
query_identity_threats
Read
read_security
List Petra Security Microsoft 365 account compromise incidents, open first and then newest: affected user, remediation status, live or historical detection, dwell time, phishing email subject and sender, mapped company and a Petra dashboard link.
get_petra_identity_summary
query_identity_threats
Read
read_security
Summarize Petra Security Microsoft 365 identity threats for a period (default 30 days): live and historical account compromises, open and remediated counts, median live dwell time, the most relevant incidents, failed sign-in attacks by type and country, and each tenant’s latest posture score and top risks.
get_dns_filtering_summary
query_dns_filtering
Read
read_security
Summarize DNS filtering from DNSFilter and ScoutDNS: requests, blocked requests and share, threats blocked, protected sites, roaming clients, top blocked categories and a per-provider breakdown. Counts cover the last 30 days; threat events cover 7 days and come from DNSFilter only. Listed only when a DNS filtering provider is connected.
Get one broadcast including its HTML body and dark-wrapper setting.
list_broadcast_groups
query_broadcasts
Read
read_broadcasts
List broadcast groups with member counts. Use these group IDs when sending a broadcast. Optionally scoped to one company.
list_broadcast_recipients
query_broadcasts
Read
read_broadcasts
List the recipients of one broadcast with per-recipient delivery status (paginated).
list_broadcasts
query_broadcasts
Read
read_broadcasts
List emergency broadcast history with delivery counts and status (paginated). Excludes the HTML body; use get_broadcast for full content.
send_broadcast
manage_broadcasts
Write (confirm)
write_broadcasts
Stage or send an emergency broadcast email to every member of the selected broadcast groups. The proposal preview shows the resolved recipient count and group names before anything is sent.
List in-app notifications for the calling user (paginated). Defaults to unread only; set includeRead to true for full history.
mark_notification_read
mark_notification_read
Immediate action
MCP access
Mark one of the calling user’s notifications as read (notificationId), or all of their unread notifications (all: true). Only touches notifications addressed to the caller; tenant-wide notifications (shared by all users) are never modified; already-read notifications are skipped.
Why does my client list fewer tools than this reference?
The tables list operations, which are grouped into 114 public tools covering 359 operations in the full catalog. Some newer operations are not listed in these tables yet. Your deployed server, consent scopes, permissions, company access, integrations and client filters can reduce that set further. The reference is not a grant of access.
Does Read mean a tool can never send anything?
No. Tool results go to your connected client. submit_feedback is a separate sending action, is not marked read-only in the consolidated catalog, and needs an explicit request to send feedback.
Do all writes require a server confirmation?
No. Proposal tools stage a confirmation, but immediate actions run directly. Read the access column and exact tool description before authorizing a call.
Can a confirmation change its target or payload?
A confirmation applies the staged proposal. If you want a different target or change, request a new proposal and review it. Do not reuse an old confirmation for a new request.
Does a successful tool response mean every background job finished?
No. Some operations return after scheduling work. Verify the saved record, job status or provider result appropriate to that tool.
Does list_compliance_templates list reusable run templates?
No. It is an alias for check definitions. Use list_compliance_run_templates for reusable run templates and resolve the appropriate records before starting a run.
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"MSPortal.ai Documentation","colors":{"primary":"#0C8376","light":"#15B79E","dark":"#107569"},"logo":{"light":"https://mintcdn.com/msportal/KnbwIXtZSTlVJTt6/logo/light.svg?fit=max\u0026auto=format\u0026n=KnbwIXtZSTlVJTt6\u0026q=85\u0026s=eb69f6d6bf16b2c401770aef19ade1d2","dark":"https://mintcdn.com/msportal/KnbwIXtZSTlVJTt6/logo/dark.svg?fit=max\u0026auto=format\u0026n=KnbwIXtZSTlVJTt6\u0026q=85\u0026s=03f8df7191e7a8ea7da084df57f6107f"},"favicon":"https://mintcdn.com/msportal/KjsKytvp08K0bejm/favicon-16x16.png?fit=max\u0026auto=format\u0026n=KjsKytvp08K0bejm\u0026q=85\u0026s=378df7f039bbff7885231fec799d29ac","navbar":{"links":[{"href":"/release-notes/roadmap","label":"Roadmap"},{"href":"mailto:support@msportal.ai","label":"Support"}],"primary":{"type":"button","label":"Dashboard","href":"https://app.msportal.ai"}},"footer":{"socials":{"linkedin":"https://linkedin.com/company/msportal"},"links":[{"header":"Resources","items":[{"label":"MSPortal.ai","href":"https://msportal.ai"},{"label":"Support","href":"mailto:support@msportal.ai"},{"label":"Status","href":"https://status.msportal.ai"}]}]},"fonts":{"family":"Inter"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"msportal","hasAudioNarration":false,"actualSubdomain":"msportal","customDomains":["docs.msportal.ai"],"gitSource":{"type":"github","owner":"msportal-ai","repo":"mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adbc0cb861fe6ca60b39d0d","collectionId":"9484889b-0a5e-4fa0-87e7-01d6b3ec9626","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adbc0cb861fe6ca60b39d0d"},"feedback":{"thumbs":true},"entitlements":{},"buildId":"6adbc0cb861fe6ca60b39d0d","clientVersion":"0.0.3965","searchFilterCounts":[{"language":"default","tag":"MSP Guides","count":455},{"language":"default","tag":"Operations","count":119},{"language":"default","tag":"API Reference","count":111},{"language":"default","tag":"Planning","count":101},{"language":"default","tag":"Integrations","count":88},{"language":"default","tag":"Protection","count":58},{"language":"default","tag":"Getting started","count":43},{"language":"default","tag":"Administration","count":39},{"language":"default","tag":"Settings","count":38},{"language":"default","tag":"Budgets","count":36}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"#page-title{font-size:1.75rem;line-height:2.125rem}#header .prose.text-lg{font-size:1rem;line-height:1.5rem;color:rgb(var(--gray-500))}#content-area .prose{font-size:.9375rem;line-height:1.6}#content-area .mdx-content{margin-top:1.5rem}#content-area .mdx-content h2{font-size:1.25rem;line-height:1.75rem;margin-top:2.25rem;margin-bottom:.75rem}#content-area .mdx-content h3{font-size:1.0625rem;line-height:1.5rem;margin-top:1.75rem;margin-bottom:.5rem}#content-area .mdx-content li{margin-top:.25em;margin-bottom:.25em}#content-area .steps{margin-top:1rem}#content-area .step{padding-bottom:.75rem}#content-area [data-component-part=step-title]{margin-top:.25rem;margin-bottom:.375rem}#sidebar-content li>a,#sidebar-content li>button{font-size:.875rem;line-height:1.25rem;padding-top:.3125rem;padding-bottom:.3125rem}#sidebar-content li>a span{hyphens:manual}#sidebar-content a.nav-anchor{margin-bottom:.25rem;font-size:.875rem}#sidebar-content ul:has(>li>a.nav-anchor){margin-bottom:1rem;padding-bottom:.5rem;border-bottom:1px solid rgb(var(--gray-100))}.dark #sidebar-content ul:has(>li>a.nav-anchor){border-bottom-color:rgb(255 255 255/.1)}#table-of-contents{font-size:.8125rem;line-height:1.25rem}#sidebar-content li>a>div:first-child:has(>svg,>img){display:none}:root{--sidebar-width:16rem}@media (min-width:1024px){#body-content,#navbar .max-w-8xl{max-width:none}#content-container{max-width:88rem;margin-left:0;padding-left:2.5rem;padding-right:2rem;column-gap:2.5rem;justify-content:space-between}}@media (min-width:1280px){#content-area{width:calc(100% - 16.5rem);max-width:52rem;margin-left:0}#navbar.is-wide~#body-content #content-container{max-width:none}#navbar.is-wide~#body-content #content-area{width:100%;max-width:none}#table-of-contents-layout{width:14rem;padding-left:0}#table-of-contents{width:14rem}}.roadmap-embed{display:block;border:0;background:0 0;color-scheme:light}.dark .roadmap-embed{color-scheme:dark}"}],"page":{"pagePath":"user-guides/mcp-server/tools-reference","slug":"/user-guides/mcp-server/tools-reference","pageMetadata":{"title":"MCP Tools Reference","description":"Find grouped MCP tools, their actions, permissions, confirmations and compatibility with existing connections.","icon":"screwdriver-wrench","href":"/user-guides/mcp-server/tools-reference"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Find grouped MCP tools, their actions, permissions, confirmations and compatibility with existing connections.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,CodeBlock,Heading,Step,Steps,Table,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Use this reference to find the MSPortal MCP tool for a job, see what permission it needs and learn whether it changes data. It is for API consumers and MSP staff who have already connected an AI client. If you have not, follow `,_jsx(_components.a,{href:`/user-guides/mcp-server/index`,children:`Connect your client`}),` first.`]}),`\n`,_jsx(Heading,{level:`2`,id:`before-you-start`,children:`Before you start`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Connect your client and approve access. See `,_jsx(_components.a,{href:`/user-guides/mcp-server/index`,children:`MCP Server`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Call `,_jsx(_components.strong,{children:`get_current_user`}),` to check the connected user, tenant and company.`]}),`\n`,_jsx(_components.li,{children:`Your client receives only the tools that your server version, approved areas, role, company scope, integrations and client tool selection allow. A tool in this reference may not be in your session.`}),`\n`,_jsx(_components.li,{children:`The catalog groups related operations into public tools, so full access stays under a 128-tool client limit.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`call-a-read-tool`,children:`Call a read tool`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Pick the public tool`,children:_jsxs(_components.p,{children:[`Find your operation in the tables below. The `,_jsx(_components.strong,{children:`Public tool`}),` column is the name your client lists in `,_jsx(_components.code,{children:`tools/list`}),`. The `,_jsx(_components.strong,{children:`Action / legacy name`}),` column is the value for `,_jsx(_components.code,{children:`request.action`}),`.`]})}),_jsxs(Step,{title:`Send the action and its arguments`,children:[_jsxs(_components.p,{children:[`Call the `,_jsx(_components.code,{children:`query_*`}),` tool with `,_jsx(_components.code,{children:`request.action`}),` and `,_jsx(_components.code,{children:`request.arguments`}),`. For example, to list Planner items:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`6`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"request\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"action\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"list_planner_items\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"arguments\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"page\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"limit\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`25`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})})]}),_jsx(Step,{title:`Check the result`,children:_jsx(_components.p,{children:`Look for pagination and truncation fields in the response. One page is not the whole data set. Find record IDs with list or search tools. Do not invent IDs.`})})]}),`\n`,_jsx(_components.p,{children:`Each action has its own argument schema and access checks. Use the schema your connected server returns. Seeing a grouped tool does not grant every action in it.`}),`\n`,_jsx(Heading,{level:`2`,id:`change-data-with-a-proposal`,children:`Change data with a proposal`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Request the change`,children:_jsxs(_components.p,{children:[`Call the `,_jsx(_components.code,{children:`manage_*`}),` tool with the action and its arguments, without `,_jsx(_components.code,{children:`confirm`}),`. MSPortal returns a proposal, a `,_jsx(_components.code,{children:`confirmationId`}),` and an expiry. Nothing is saved.`]})}),_jsx(Step,{title:`Review the proposal`,children:_jsx(_components.p,{children:`Check the preview, company, records and effects with the person who asked for the change.`})}),_jsxs(Step,{title:`Confirm the same action`,children:[_jsxs(_components.p,{children:[`After approval, call the same tool and action with `,_jsx(_components.code,{children:`confirm: true`}),` and the returned `,_jsx(_components.code,{children:`confirmationId`}),` inside `,_jsx(_components.code,{children:`request.arguments`}),`. For a `,_jsx(_components.code,{children:`manage_planner`}),` proposal with action `,_jsx(_components.code,{children:`create_planner_item`}),`:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`9`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`9`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"request\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"action\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"create_planner_item\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"arguments\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"confirm\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"confirmationId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"REPLACE_WITH_RETURNED_CONFIRMATION_ID\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})})]}),_jsx(Step,{title:`Check the record`,children:_jsx(_components.p,{children:`Open the new or changed record to confirm the result.`})})]}),`\n`,_jsx(_components.p,{children:`Do not resend changed values on a confirmation call. Request a new proposal to change the target or payload. A proposal expires after ten minutes.`}),`\n`,_jsx(Heading,{level:`2`,id:`tool-naming`,children:`Tool naming`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`query_*`})}),` tools read related records or summaries, such as `,_jsx(_components.code,{children:`query_planner`}),` or `,_jsx(_components.code,{children:`query_projects`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`manage_*`})}),` tools stage and confirm related changes, such as `,_jsx(_components.code,{children:`manage_planner`}),` or `,_jsx(_components.code,{children:`manage_meeting_participants`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Standalone tools`}),` keep their names and original arguments, with no `,_jsx(_components.code,{children:`request`}),` wrapper. They are `,_jsx(_components.code,{children:`get_current_user`}),`, `,_jsx(_components.code,{children:`search_portal`}),`, `,_jsx(_components.code,{children:`submit_feedback`}),`, `,_jsx(_components.code,{children:`draft_compliance_notes`}),` and `,_jsx(_components.code,{children:`mark_notification_read`}),`.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`existing-connections-and-legacy-names`,children:`Existing connections and legacy names`}),`\n`,_jsxs(_components.p,{children:[`Legacy operation names are still accepted by `,_jsx(_components.code,{children:`tools/call`}),` with their original arguments and result shapes. Existing connections keep their OAuth grants and access limits. You do not need a new server URL or grant.`]}),`\n`,_jsxs(_components.p,{children:[`Pending confirmations keep their original operation identity. A proposal can be confirmed through its legacy tool name or the matching grouped action, with the same user, client, expiry and replay checks. The compatibility aliases `,_jsx(_components.code,{children:`update_compliance_status`}),` and `,_jsx(_components.code,{children:`list_compliance_templates`}),` work when called directly but are not listed in `,_jsx(_components.code,{children:`tools/list`}),`. A confirmation created through an alias must keep using that alias.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`tools/list`}),` now returns grouped names, not every legacy operation name. Cached legacy calls still work. Update any client tool-name allowlist to include the public tool names you need. A custom client that requires a legacy name in `,_jsx(_components.code,{children:`tools/list`}),` must update its discovery logic.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`read-the-access-column`,children:`Read the access column`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Read`}),` retrieves data and needs no proposal. The results still go to your connected client.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Write (confirm)`}),` stages a proposal. A proposal is not a saved record. Commit it with the confirmation call.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Immediate action`}),` runs with no proposal step. `,_jsx(_components.strong,{children:`mark_notification_read`}),` changes your notification state. `,_jsx(_components.strong,{children:`draft_compliance_notes`}),` generates output and does not save it.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Send feedback`}),` sends a feedback message to MSPortal at once. It is for MSP staff only and needs an explicit user request.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`The module scopes below are a summary. You do not need to grant every scope. Read and write grants are separate. The `,_jsx(_components.strong,{children:`Permissions`}),` column lists alternatives unless it says `,_jsx(_components.strong,{children:`All`}),`. Staff-only gates and record-level checks apply to administrators too. A client-side tool allowlist cannot widen server access.`]}),`\n`,_jsx(Heading,{level:`2`,id:`core`,children:`Core`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`companies.read`}),`, `,_jsx(_components.code,{children:`companies.write`}),`, `,_jsx(_components.code,{children:`goals.read`}),`, `,_jsx(_components.code,{children:`planner.read`}),`, `,_jsx(_components.code,{children:`projects.read`}),`, `,_jsx(_components.code,{children:`reports.read`}),`, `,_jsx(_components.code,{children:`tickets.read`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_company`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_companies`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_companies`})}),_jsx(_components.td,{children:`Get one company by ID, including its custom field values (label → value) and, when requested, assigned team members.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_company_defaults`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_companies`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_companies`})}),_jsx(_components.td,{children:`Get one company’s resolved defaults: inherited or company-specific hardware standards, software standards, workplace and security defaults, ticket defaults, onboarding checklist, and the AI-context fields (description, industry requirements, special instructions, structured ai_context) that feed the AI assistant and new-ticket generation. Returns null only when the company has no saved defaults and the tenant has no effective hardware default.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_current_user`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`get_current_user`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:`MCP access`}),_jsx(_components.td,{children:`Return the connected MSPortal user, tenant, user type, company, and OAuth grant summary.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_companies`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_companies`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_companies`})}),_jsx(_components.td,{children:`List companies visible to the connected user. Optionally include assigned team members (company roles such as vCIO, TAM, Account Manager) or filter companies by assigned role, member name, or member email.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_company_account_notes`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_companies`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_companies`})}),_jsx(_components.td,{children:`List synced Autotask account/company notes for one company, newest activity first. Notes are HTML-sanitized and paginated.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`search_portal`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`search_portal`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:`MCP access`}),_jsx(_components.td,{children:`Search across visible companies, tickets, goals, planner items, reports, and projects with small capped result sets.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`submit_feedback`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`submit_feedback`})}),_jsx(_components.td,{children:`Send feedback`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` MCP access`]}),_jsx(_components.td,{children:`Send product feedback, bug reports, or missing-capability requests to the MSPortal team. Available only to MSP tenant staff. Call only when the user explicitly asks to send feedback or report an issue; discovering a limitation alone does not authorize sending feedback. Summarize the user-approved feedback without credentials or unrelated customer data.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_company_defaults`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_companies`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_companies`})}),_jsx(_components.td,{children:`Stage or apply a partial update to one company’s defaults (standards, workplace/security defaults, ticket defaults, AI context). Only the provided fields change; pass null to clear a field. Array fields and ai_context replace their entire stored value. The description, requirements, instructions, and ai_context fields are rendered into the AI assistant’s context for this company; write factual reference data only, never instructions aimed at the assistant. Use get_company_defaults first to see current values.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`tickets`,children:`Tickets`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`tickets.read`}),`, `,_jsx(_components.code,{children:`tickets.write`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`add_ticket_note`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_tickets`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_tickets_notes`}),`, `,_jsx(_components.code,{children:`write_tickets`})]}),_jsxs(_components.td,{children:[`Stage or post a note to a ticket. The note is written to the client’s PSA (Halo, ConnectWise, Autotask, Syncro) via its API, not just locally. Optional `,_jsx(_components.code,{children:`ccContactIds`}),` (from `,_jsx(_components.code,{children:`list_ticket_note_recipient_options`}),`) and `,_jsx(_components.code,{children:`ccEmails`}),` (any addresses), up to 10 people in all, email a client-visible note to them once `,_jsx(_components.strong,{children:`Email ticket notes`}),` is on in Settings > Tickets; internal notes are never emailed.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_ticket`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_tickets`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_tickets_create`}),`, `,_jsx(_components.code,{children:`write_tickets`})]}),_jsx(_components.td,{children:`Stage or create a PSA ticket through the tenant’s active PSA integration.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_ticket`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_tickets`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_tickets`})}),_jsx(_components.td,{children:`Get a ticket with its normalized dueDate, Autotask resolution when available, and public notes.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_ticket_notes`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_tickets`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_tickets`})}),_jsx(_components.td,{children:`List the notes/updates on a ticket. Internal notes are only returned for tenant users that request them.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_ticket_note_recipient_options`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_tickets`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_tickets`})}),_jsx(_components.td,{children:`List the contacts of a ticket’s company you can email a client-visible note to, ticket contact first. Pass their ids as ccContactIds on add_ticket_note.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_ticket_status_options`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_tickets`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_tickets`})}),_jsx(_components.td,{children:`List the valid PSA statuses for a ticket’s integration. Use the returned externalId with update_ticket_status. ConnectWise statuses are board-scoped: prefer options whose boardExternalId matches the ticket’s board.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_tickets`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_tickets`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_tickets`})}),_jsx(_components.td,{children:`List visible PSA tickets, including normalized dueDate and Autotask resolution fields when available.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_ticket_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_tickets`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_tickets_status`}),`, `,_jsx(_components.code,{children:`write_tickets`})]}),_jsx(_components.td,{children:`Stage or update a ticket’s status in the client’s PSA via its API. statusExternalId must come from list_ticket_status_options.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`ticket-templates`,children:`Ticket Templates`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`ticket_templates.write`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_ticket_template`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_ticket_templates`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_templates`})}),_jsx(_components.td,{children:`Stage or create a reusable parent ticket template definition with metadata, sections, fields, and optional rules. This does not submit a ticket and does not create template branches or visibility assignments.`})]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`devices`,children:`Devices`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`devices.read`}),`, `,_jsx(_components.code,{children:`companies.read`}),` (industry insights)`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`device_summary`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_devices`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_devices`})}),_jsx(_components.td,{children:`Fleet-wide device summary: total count and grouped counts by status, OS family (Windows/macOS/Linux/…), device type, and manufacturer; warranty status (active/expired/unknown/expiring in the next 90 days) with upcoming expiries by calendar quarter; activity/staleness (never seen, not seen in 30/90 days); and the top companies by device count. Pass companyId to scope the summary to one company. Respects the caller’s company scope.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_software_inventory_overview`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_software`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.code,{children:`read_devices`})]}),_jsx(_components.td,{children:`Get installed-software counts and lifecycle attention totals in the selected companies.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_software_products`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_software`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.code,{children:`read_devices`})]}),_jsx(_components.td,{children:`Search installed products by name or publisher, filter lifecycle status or key apps, and read key-app markers, target versions and installation counts. Paginated.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_software_product`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_software`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.code,{children:`read_devices`})]}),_jsx(_components.td,{children:`Read one visible installed product and its version/lifecycle groups. Returns null without visible installs; up to 200 version groups, with a truncation indicator at the cap.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_software_product_devices`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_software`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.code,{children:`read_devices`})]}),_jsx(_components.td,{children:`List devices with a product installed, including company, version and lifecycle status. Filter and paginate the result.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_industry_overview`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_industry_insights`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.code,{children:`read_devices`}),`, `,_jsx(_components.code,{children:`read_settings_companies`})]}),_jsx(_components.td,{children:`List the industries your active clients belong to: sector, client count, clients with software inventory, distinct line-of-business application families and whether an industry profile exists. A client’s industry is its stored sector or one read from its free-text industry label. Needs the Industry insights feature.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_industry_insights`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_industry_insights`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.code,{children:`read_devices`}),`, `,_jsx(_components.code,{children:`read_settings_companies`})]}),_jsx(_components.td,{children:`Read one industry (sector and optional vertical) or one client’s industry: the shared profile (trends, standard applications with how many of your clients run them, compliance frameworks, IT priorities), the peer clients, and the line-of-business application families they share with adoption bands. With companyId it adds the peer standards the client has, lacks, and the applications only it runs. Peer figures cover your clients only. Needs the Industry insights feature.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_device`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_devices`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_devices`})}),_jsx(_components.td,{children:`Get one device, including its custom field values (label → value).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_device_alerts`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_devices`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_devices`})}),_jsx(_components.td,{children:`List active device alerts: offline servers (status offline or not seen in 7 days; workstations are excluded as expected noise) and devices with warranties expiring within the next 30 days. The limit applies per alert category.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_device_types`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_devices`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_devices`})}),_jsx(_components.td,{children:`List device types.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_devices`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_devices`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_devices`})}),_jsx(_components.td,{children:`List devices with filters, including fleet/lifecycle queries: os contains-match (e.g. “server”, “windows 10”), warranty expiry windows (warrantyExpiresBefore/After), stale devices (lastSeenBefore), and hardware age (firstSeenBefore).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_device_patch_health`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_devices`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_devices`})}),_jsxs(_components.td,{children:[`Read OS patch health, compliance and coverage, failed and pending patches, reboot requirements and up to eight devices needing attention from staged NinjaOne, Datto RMM, ConnectWise Asio and Syncro data. Use `,_jsx(_components.code,{children:`provider=ninjaone`}),` for NinjaOne-specific answers. Counts cover reporting devices, not the whole fleet. NinjaOne patch counts older than three days are excluded. Read-only. It does not run a sync or install patches.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_locations`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_devices`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_devices`})}),_jsx(_components.td,{children:`List locations.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_intune_devices`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_intune_devices`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_devices`})}),_jsxs(_components.td,{children:[`List Microsoft Intune managed devices synced through CIPP with Entra join type, Intune compliance state, ownership, OS, serial, primary user, last Intune check-in, the linked portal device and whether an RMM agent also reports it. Use coverage `,_jsx(_components.code,{children:`not_in_rmm`}),` to find Intune devices no RMM manages. Filter by company, compliance state or join type.`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`reporting`,children:`Reporting`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`reports.read`}),`, `,_jsx(_components.code,{children:`reports.write`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_report`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_reports`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_reporting`})}),_jsx(_components.td,{children:`Stage or create a report configuration.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_report`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_reports`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_reporting`})}),_jsx(_components.td,{children:`Stage or delete a report.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`edit_report`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_reports`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_reporting`})}),_jsx(_components.td,{children:`Stage or edit a report configuration.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_report`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_reports`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_reporting`})}),_jsx(_components.td,{children:`Get one report. Report structures are only returned when explicitly requested.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_report_schedule`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_report_schedules`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_reporting`})}),_jsx(_components.td,{children:`Get one report schedule.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_report_schedules`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_report_schedules`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_reporting`})}),_jsx(_components.td,{children:`List report schedules.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_report_templates`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_reports`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_reporting`})}),_jsx(_components.td,{children:`List report templates.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_report_types`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_reports`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_reporting`})}),_jsx(_components.td,{children:`List report types.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_reports`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_reports`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_reporting`})}),_jsx(_components.td,{children:`List report summaries with pagination and optional filters.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`publish_report`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_reports`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_reporting`})}),_jsx(_components.td,{children:`Stage or publish a report by setting status to published.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`run_report_schedule`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_report_schedules`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_reporting`})}),_jsx(_components.td,{children:`Stage or trigger a report schedule run immediately.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`analytics`,children:`Analytics`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`analytics.read`}),`, `,_jsx(_components.code,{children:`companies.read`}),`, `,_jsx(_components.code,{children:`companies.write`}),`, `,_jsx(_components.code,{children:`training.read`}),`, `,_jsx(_components.code,{children:`users.read`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`bulk_update_readiness`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_readiness`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.code,{children:`manage_client_readiness`})]}),_jsx(_components.td,{children:`Stage a reviewed readiness change for 1–100 explicitly selected companies. Exclude/include companies; exempt or restore a requirement; confirm or withdraw a reviewed confirmation. Use get_company_readiness for requirementId. Role mappings are configured per check in Readiness settings. Exemptions need a reason. Confirmations represent the approving person’s review and fail if ANY check is unsatisfied. The entire batch is atomic. Always show the proposal for human review before committing.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_company_readiness`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_readiness`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.code,{children:`read_client_readiness`})]}),_jsx(_components.td,{children:`Read every readiness check for one company, including ready and exempt checks, evidence, the responsible person and requirement IDs. Use this before proposing exemptions, removing exemptions or reviewing confirmations through bulk_update_readiness.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_portfolio_summary`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_analytics`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`read_dashboards`}),`, `,_jsx(_components.code,{children:`read_settings_companies`})]}),_jsx(_components.td,{children:`Get portfolio analytics summary, optionally filtered to companies assigned to a specific company role (for example vCIO) or assigned team member.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_readiness_assignment_options`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_readiness`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.strong,{children:`All:`}),` `,_jsx(_components.code,{children:`read_client_readiness`}),`, `,_jsx(_components.code,{children:`read_settings_companies`}),`, `,_jsx(_components.code,{children:`read_settings_users`})]}),_jsx(_components.td,{children:`Find company owner roles and active MSP team members for readiness bulk changes. Returns role IDs and public user IDs. Search matches names and email, up to 50 users; narrow the search to find a person. Only team-menu roles are assignable.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_technician_capacity`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_analytics`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.code,{children:`read_msp_calculators`})]}),_jsxs(_components.td,{children:[`Read technician capacity and utilisation over the last complete weeks: team weekly capacity, available, logged and billable hours, utilisation against target, headroom and a weekly series. Per-technician rows are included only for callers with `,_jsx(_components.code,{children:`read_technician_performance`}),`. Billable figures come from ConnectWise and Autotask; Halo time has no billable split. `,_jsx(_components.code,{children:`companyIds`}),` limits logged time to those clients; capacity always covers the whole team.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_technician_forecast`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_analytics`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.code,{children:`read_msp_calculators`})]}),_jsxs(_components.td,{children:[`Forecast technician capacity against demand for this quarter and the next ones: ticket run rate, remaining project task budget and Planner hours weighted by probability. Work with no dates or more than 90 days overdue is reported as unscheduled. Per-technician rows only for callers with `,_jsx(_components.code,{children:`read_technician_performance`}),`; `,_jsx(_components.code,{children:`companyIds`}),` limits demand, never capacity. vCIO advisory hours are not included.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_team_activity`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_analytics`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_team_activity`})}),_jsx(_components.td,{children:`Get a tenant-scoped record of what the team did in MSPortal. Returns daily totals plus teammate and company rollups; set includeFeed to true for a paginated, redacted who-did-what feed. This is the auditing tool for activity detail; get_user_activity remains useful for engagement trends.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_ticket_trends`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_analytics`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_ticket_trends`})}),_jsx(_components.td,{children:`Get pre-computed weekly ticket trend analytics: created/closed/backlog per week, per-company totals (default top 15 by volume, max 50), per-category totals (same caps), and a deterministic forecast with volume direction, backlog outlook, resolution trend, and the top 10 company/category risk watchlist entries. Data is aggregated weekly; use list_tickets for individual tickets.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_training_analytics`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_analytics`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_training`})}),_jsx(_components.td,{children:`Get training analytics.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_user_activity`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_analytics`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`read_settings_users`}),`, `,_jsx(_components.code,{children:`read_dashboards`})]}),_jsx(_components.td,{children:`Get user activity analytics with optional company, user, company-role, and date filters.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_company_audit`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_readiness`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`read_settings_companies`}),`, `,_jsx(_components.code,{children:`read_dashboards`})]}),_jsx(_components.td,{children:`Superseded by list_company_readiness. List company audit metrics; its auditScore and missingItems are now computed from the tenant’s Account Readiness requirements. Supports filtering by company, assigned company role (for example vCIO), or assigned team member.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_company_readiness`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_readiness`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_client_readiness`})}),_jsx(_components.td,{children:`List Account Readiness state per company: an honest 0-100 score plus every open check with its area, owner and the in-app page that fixes it. Use bulk_update_readiness to propose changes for human review. Confirmations require the approving person to review each company.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`personal-task-lists`,children:`Personal task lists`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`mcp.read`}),`, `,_jsx(_components.code,{children:`mcp.write`})]}),`\n`,_jsx(_components.p,{children:`These MSP staff-only actions use the existing MCP read or write grants and require no task-specific role permission. Use the schemas returned by your connection for the available actions and parameters.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_my_tasks`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_tasks`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` MCP access`]}),_jsxs(_components.td,{children:[`Read your own tasks with `,_jsx(_components.code,{children:`scope: \"mine\"`}),`, or tasks shared on your assigned companies with `,_jsx(_components.code,{children:`scope: \"my_companies\"`}),`. Returns up to 100 tasks in list order; completed tasks are excluded unless requested. Check the result’s truncation indicator.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_tasks`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_tasks`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` MCP access`]}),_jsx(_components.td,{children:`Stage up to 100 new tasks on your own list, optionally with a company tag and source link. A company tag shares the task with colleagues assigned to that company; omit it to keep the task private.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_task`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_tasks`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` MCP access`]}),_jsx(_components.td,{children:`Stage changes to one editable task’s title, description, status, priority, due date or company tag. Use this action to reopen a completed task by changing its status.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`complete_tasks`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_tasks`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` MCP access`]}),_jsxs(_components.td,{children:[`Stage completing up to 100 editable tasks in one atomic batch. Resolve task IDs with `,_jsx(_components.code,{children:`list_my_tasks`}),` before proposing the change.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_tasks`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_tasks`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` MCP access`]}),_jsxs(_components.td,{children:[`Stage permanent deletion of up to 100 editable tasks. Deletion cannot be undone; use `,_jsx(_components.code,{children:`complete_tasks`}),` when the work is finished.`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Ownership, company sharing and tenant boundaries are enforced when a change is committed. Private tasks can also be read by authorized task-list auditors in the portal. Scratch notes are not exposed by these tools. See `,_jsx(_components.a,{href:`/user-guides/tasks/index`,children:`Tasks and notes`}),` for the portal workflow.`]}),`\n`,_jsx(Heading,{level:`2`,id:`planner`,children:`Planner`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`planner.read`}),`, `,_jsx(_components.code,{children:`planner.write`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`archive_planner_item`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_planner`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_planner`})}),_jsx(_components.td,{children:`Stage or archive a planner item.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_planner_item`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_planner`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_planner`})}),_jsx(_components.td,{children:`Stage or create a planner item.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`edit_planner_item`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_planner`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_planner`})}),_jsx(_components.td,{children:`Stage or edit a planner item.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_planner_item`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_planner`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_planner`})}),_jsx(_components.td,{children:`Get one planner item, including its custom field values (label → value).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`link_planner_item_entities`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_planner_links`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_planner`})}),_jsx(_components.td,{children:`Stage or attach existing goals, assigned compliance checks, secure score controls, or devices to a planner item. Idempotent: re-linking the same entity is a no-op.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_planner_item_links`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_planner_links`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_planner`})}),_jsx(_components.td,{children:`List the goals, assigned compliance checks, secure score controls, and devices linked to a planner item.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_planner_items`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_planner`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_planner`})}),_jsx(_components.td,{children:`List planner items with filters.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_planner_types`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_planner`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_planner`})}),_jsx(_components.td,{children:`List planner item types.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`merge_planner_items`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_planner`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_planner`})}),_jsx(_components.td,{children:`Stage or merge similar planner items for one company into a single item. Linked records, cost lines and notes move to the kept item and the merged items are archived. Items kept in sync by a standard or automation rule, or that keep their devices linked by conditions, cannot be merged.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_planner_item_device_criteria`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_planner`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_planner`})}),_jsxs(_components.td,{children:[`Stage or turn on “Keep linked automatically”: the item’s device links become the company’s devices that match the conditions and refresh hourly. `,_jsx(_components.code,{children:`criteria: null`}),` turns it off and keeps the current links. Items managed by Standards or an automation rule are refused.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`suggest_planner_item_devices`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_planner`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_planner`}),`, `,_jsx(_components.code,{children:`read_devices`})]}),_jsx(_components.td,{children:`Preview the item company’s devices that match device conditions (type, manufacturer, OS or model terms, warranty before the due date, age, recent check-in), with the company’s pick-list values.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`unlink_planner_item_entity`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_planner_links`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_planner`})}),_jsx(_components.td,{children:`Stage or remove one linked goal, assigned compliance check, secure score control, or device from a planner item.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`goals`,children:`Goals`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`goals.read`}),`, `,_jsx(_components.code,{children:`goals.write`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_goal`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_goals`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_goals`})}),_jsx(_components.td,{children:`Stage or create a goal.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_goal`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_goals`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_goals`})}),_jsx(_components.td,{children:`Stage or delete a goal.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`edit_goal`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_goals`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_goals`})}),_jsx(_components.td,{children:`Stage or edit a goal.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_goal`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_goals`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_goals`})}),_jsx(_components.td,{children:`Get a goal with tasks, updates, and custom field values (label → value).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_goal_options`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_goals`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_goals`})}),_jsx(_components.td,{children:`List goal status, priority, and category options.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_goals`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_goals`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_goals`})}),_jsx(_components.td,{children:`List goals with filters.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`compliance`,children:`Compliance`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`compliance.read`}),`, `,_jsx(_components.code,{children:`compliance.write`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_compliance_group`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_compliance_groups`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_compliance`}),`, `,_jsx(_components.code,{children:`manage_compliance`})]}),_jsx(_components.td,{children:`Stage or create a tenant-wide compliance group. Optionally provide checkIds to set its exact check-definition membership.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_compliance_risk`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_compliance_risks`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_compliance`})}),_jsx(_components.td,{children:`Stage or promote one eligible unaddressed compliance gap into the risk register. This never creates a standalone risk and requires explicit confirmation.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_compliance_run`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_compliance_runs`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_compliance`})}),_jsx(_components.td,{children:`Stage or commit creating compliance runs (one per company) and enqueue assignment from reusable run templates, compliance groups, and/or individual check definitions. Resolve templateIds with list_compliance_run_templates; list_compliance_templates returns check definitions instead. At least one source is required.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_compliance_run_template`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_compliance_run_templates`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_compliance`}),`, `,_jsx(_components.code,{children:`manage_compliance`})]}),_jsx(_components.td,{children:`Stage or create a reusable compliance run template with exact group and individual-check memberships.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_compliance_template`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_compliance_definitions`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_compliance`}),`, `,_jsx(_components.code,{children:`manage_compliance`})]}),_jsx(_components.td,{children:`Stage or create a base compliance check definition (the records listed by list_compliance_templates / list_compliance_check_definitions). New definitions start pending review. groupIds optionally sets exact group membership.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_compliance_group`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_compliance_groups`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_compliance`})}),_jsx(_components.td,{children:`Stage or permanently delete a compliance group. Its check mappings, device-type mappings, and run-template memberships are removed; historical assignments keep the check but lose the group link.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_compliance_run_template`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_compliance_run_templates`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_compliance`})}),_jsx(_components.td,{children:`Stage or permanently delete a reusable compliance run template. Its group/check memberships and every schedule that references it are also deleted.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_compliance_template`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_compliance_definitions`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_compliance`})}),_jsx(_components.td,{children:`Stage or permanently delete a base compliance check definition. This cascades to its assigned compliance checks and related history, group mappings, run-template memberships, and completed-meeting links. Risk register entries and risk findings derived from the check are kept and detached from it.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`dismiss_compliance_risk_gap`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_compliance_risk_gaps`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_compliance`})}),_jsx(_components.td,{children:`Stage or dismiss one eligible compliance gap with a reason. A later failed run can create a new gap.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`draft_compliance_notes`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`draft_compliance_notes`})}),_jsx(_components.td,{children:`Immediate action`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_compliance`})}),_jsx(_components.td,{children:`Generate sanitized PUBLIC-note drafts from authoritative private-note answers. Pass one to 10 assignedCheckIds, or selection=all_answered to resolve up to 50 active-run answers in scope. This does not save anything. Review suggestedNotesPublicHtml (which preserves existing public notes), then call update_compliance_checks with that exact notesPublic value and confirm the staged update. If selectionCoverage.hasMore is true, continue with selectionCoverage.nextSelectionOffset.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_compliance_check`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_compliance_checks`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_compliance`})}),_jsx(_components.td,{children:`Get one assigned compliance check with its run, company, scope, status, exact note bodies, due date, and completion details. Internal notes are never returned to company users.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_compliance_check_definition`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_compliance_definitions`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_compliance`})}),_jsx(_components.td,{children:`Get a base compliance check definition, including instructions, rationale, remediation, references, scope, priority, and approval state.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_compliance_company_summary`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_compliance_checks`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_compliance`})}),_jsx(_components.td,{children:`Return authoritative active-run compliance totals and scores grouped by company, with explicit tie-aware leaders for most outstanding checks and best/worst simple and weighted percentages. Use this for portfolio comparisons instead of counting paginated check lists.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_compliance_group`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_compliance_groups`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_compliance`})}),_jsx(_components.td,{children:`Get one compliance group with its exact checkIds membership and check count. Use this before replacement edits.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_compliance_risk`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_compliance_risks`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_compliance`})}),_jsx(_components.td,{children:`Get one risk with occurrences, source compliance state, linked remediation work, standards references, and audit history.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_compliance_risk_gap`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_compliance_risk_gaps`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_compliance`})}),_jsx(_components.td,{children:`Get one exact eligible compliance risk gap by assignment id before explaining, promoting, or dismissing it.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_compliance_run`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_compliance_runs`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_compliance`})}),_jsx(_components.td,{children:`Get a compliance run and one paginated page of compact assigned-check summaries. Rich descriptions and note bodies are omitted; follow assignedChecksPagination for more pages and use get_compliance_check for exact detail. Private-note presence is never disclosed to company users.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_compliance_run_template`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_compliance_run_templates`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_compliance`})}),_jsx(_components.td,{children:`Get one reusable compliance run template with the exact groupIds and checkIds it will assign.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_compliance_check_definitions`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_compliance_definitions`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_compliance`})}),_jsx(_components.td,{children:`List base compliance check definitions from compliance_checks. These ids may be used as checkIds when creating a run; they are not run-template ids.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_compliance_checks`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_compliance_checks`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_compliance`})}),_jsx(_components.td,{children:`List compact assigned-check summaries across runs with company, run, status, priority, flag, and search filters. Note bodies are omitted; use get_compliance_check for exact notes. Private-note presence is never disclosed to company users.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_compliance_groups`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_compliance_groups`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_compliance`})}),_jsx(_components.td,{children:`List tenant compliance groups with their type, auto-map setting, and check count. Group ids can be used when creating runs.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_compliance_risk_categories`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_compliance_risks`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_compliance`})}),_jsx(_components.td,{children:`List active tenant-owned risk categories. Use the returned ids when creating or recategorizing a risk.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_compliance_risk_gaps`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_compliance_risk_gaps`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_compliance`})}),_jsx(_components.td,{children:`List latest explicit failed compliance results that are eligible for internal promotion or dismissal. Criticality informs impact; priority informs remediation urgency.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_compliance_risks`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_compliance_risks`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_compliance`})}),_jsx(_components.td,{children:`List compliance-derived risks with company, status, category, severity, owner, target-date, and search filters. Company users receive only explicitly visible risks in their allowed company scope.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_compliance_run_templates`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_compliance_run_templates`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_compliance`})}),_jsx(_components.td,{children:`List reusable run templates from compliance_runs_templates. Pass these returned ids as templateIds to create_compliance_run.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_compliance_runs`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_compliance_runs`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_compliance`})}),_jsx(_components.td,{children:`List compact compliance-run summaries with company, completion, date, note-presence flags, and passed/failed/pending check counts. Full run note bodies are omitted.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_compliance_status_options`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_compliance_checks`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_compliance`})}),_jsx(_components.td,{children:`List the valid statuses for one assigned check. Use a returned id as statusItemId when updating that same assignment.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_compliance_templates`})}),_jsx(_components.td,{children:`Legacy call only`}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_compliance`})}),_jsx(_components.td,{children:`Backward-compatible alias that lists base check definitions from compliance_checks. For reusable run templates, call list_compliance_run_templates.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_compliance_check`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_compliance_checks`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_compliance`})}),_jsx(_components.td,{children:`Stage or commit an assigned check update. Supports status, public/private notes, priority, flag, and due date. Use list_compliance_status_options before changing status.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_compliance_checks`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_compliance_checks`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_compliance`})}),_jsx(_components.td,{children:`Stage or commit exact updates to one to 25 assigned compliance checks. Each item may change status, public/private notes, priority, flag, or due date.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_compliance_group`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_compliance_groups`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_compliance`}),`, `,_jsx(_components.code,{children:`manage_compliance`})]}),_jsx(_components.td,{children:`Stage or update a compliance group’s editable fields. Only provided fields change; checkIds replaces the exact membership and an empty array clears it.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_compliance_risk`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_compliance_risks`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_compliance`})}),_jsx(_components.td,{children:`Stage or update a non-closed risk’s assessment, status, ownership, treatment, target date, category, or client visibility. Closed risks are terminal.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_compliance_run`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_compliance_runs`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_compliance`})}),_jsx(_components.td,{children:`Stage or commit safe edits to a compliance run: name, notes, run date, and completion state.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_compliance_run_template`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_compliance_run_templates`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_compliance`}),`, `,_jsx(_components.code,{children:`manage_compliance`})]}),_jsx(_components.td,{children:`Stage or update a reusable compliance run template. Only provided fields change; groupIds and checkIds each replace their exact membership when supplied.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_compliance_status`})}),_jsx(_components.td,{children:`Legacy call only`}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_compliance`})}),_jsx(_components.td,{children:`Backward-compatible alias for update_compliance_check. Stages or commits status, notes, priority, flag, or due-date changes on one assigned check.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_compliance_template`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_compliance_definitions`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_compliance`}),`, `,_jsx(_components.code,{children:`manage_compliance`})]}),_jsx(_components.td,{children:`Stage or update any editable field on a base compliance check definition. Only provided fields change; null clears nullable fields, and groupIds replaces exact group membership.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`meetings-\u0026-calendar`,children:`Meetings \u0026 Calendar`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`calendar.read`}),`, `,_jsx(_components.code,{children:`calendar.write`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`add_meeting_action_item`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_meeting_action_items`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_calendar`}),`, `,_jsx(_components.code,{children:`write_meetings`}),`, `,_jsx(_components.code,{children:`manage_calendar`}),`, `,_jsx(_components.code,{children:`manage_meetings`})]}),_jsx(_components.td,{children:`Stage or add an action item to a meeting, optionally assigned to a portal user with a due date and priority.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`add_meeting_agenda_items`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_meeting_agenda`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_calendar`}),`, `,_jsx(_components.code,{children:`write_meetings`}),`, `,_jsx(_components.code,{children:`manage_calendar`}),`, `,_jsx(_components.code,{children:`manage_meetings`})]}),_jsx(_components.td,{children:`Stage or append agenda items to a meeting. Link existing planner items, assigned compliance checks (e.g. failed checks from list_compliance_checks), goals, budgets, reports, training courses, or devices, or insert text blocks and dividers.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`add_meeting_participants`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_meeting_participants`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_calendar`}),`, `,_jsx(_components.code,{children:`write_meetings`}),`, `,_jsx(_components.code,{children:`manage_calendar`}),`, `,_jsx(_components.code,{children:`manage_meetings`})]}),_jsx(_components.td,{children:`Stage or add attendees to an existing meeting. Provide a userId (tenant user, from list_users) or an external email per attendee. Idempotent: already-attached attendees are skipped.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`cancel_meeting`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_meetings`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_calendar`}),`, `,_jsx(_components.code,{children:`write_meetings`}),`, `,_jsx(_components.code,{children:`manage_calendar`}),`, `,_jsx(_components.code,{children:`manage_meetings`})]}),_jsx(_components.td,{children:`Stage or cancel an entire meeting series or one recurring occurrence. Published meetings are cancelled through their existing Graph or ICS transport and retain their organizer identity.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_meeting`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_meetings`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_calendar`}),`, `,_jsx(_components.code,{children:`write_meetings`}),`, `,_jsx(_components.code,{children:`manage_calendar`}),`, `,_jsx(_components.code,{children:`manage_meetings`})]}),_jsx(_components.td,{children:`Stage or book a meeting owned by the authenticated MCP user. Omit sendInvitation (or set false) to Save a portal draft; set it true to Save \u0026 Send. Supports attendees, IANA timezones, Teams, RFC 5545 rules, and typed recurrence (quarterly is monthly interval 3). No creator override is accepted.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_meeting`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_meetings`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`read_calendar`}),`, `,_jsx(_components.code,{children:`read_meetings`})]}),_jsx(_components.td,{children:`Get a meeting with participants.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_meeting_action_items`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_meeting_action_items`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`read_calendar`}),`, `,_jsx(_components.code,{children:`read_meetings`})]}),_jsx(_components.td,{children:`List a meeting’s action items, including assignee, status, priority, and due date.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_meeting_agenda`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_meeting_agenda`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`read_calendar`}),`, `,_jsx(_components.code,{children:`read_meetings`})]}),_jsx(_components.td,{children:`List a meeting’s agenda items in order, including linked planner items, assigned compliance checks, goals, budgets, reports, training courses, and devices.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_meeting_participants`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_meeting_participants`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`read_calendar`}),`, `,_jsx(_components.code,{children:`read_meetings`})]}),_jsx(_components.td,{children:`List the attendees on a meeting.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_meeting_types`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_meetings`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`read_calendar`}),`, `,_jsx(_components.code,{children:`read_meetings`})]}),_jsx(_components.td,{children:`List meeting types.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_meetings`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_meetings`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`read_calendar`}),`, `,_jsx(_components.code,{children:`read_meetings`})]}),_jsx(_components.td,{children:`List visible calendar meetings. Set mineOnly to return only meetings organized by the authenticated MCP user.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_business_review_plan`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_meetings`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.code,{children:`manage_meetings`}),`, `,_jsx(_components.code,{children:`manage_calendar`})]}),_jsx(_components.td,{children:`Read the year’s business review plan for every client: cadence, target month or quarter, and the months with reviews held, booked, due or overdue, plus per-month totals. Set includeSuggestions for balanced target months. Needs recurring meetings for the tenant.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_business_review_targets`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_meetings`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.code,{children:`manage_meetings`}),`, `,_jsx(_components.code,{children:`manage_calendar`})]}),_jsx(_components.td,{children:`Stage or apply target months or quarters for clients’ quarterly and annual business reviews; a null target clears it. Other recurring meeting defaults stay as they are. Needs recurring meetings for the tenant.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`remove_meeting_agenda_item`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_meeting_agenda`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_calendar`}),`, `,_jsx(_components.code,{children:`write_meetings`}),`, `,_jsx(_components.code,{children:`manage_calendar`}),`, `,_jsx(_components.code,{children:`manage_meetings`})]}),_jsx(_components.td,{children:`Stage or remove one agenda item from a meeting (remaining items shift up).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`remove_meeting_participant`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_meeting_participants`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_calendar`}),`, `,_jsx(_components.code,{children:`write_meetings`}),`, `,_jsx(_components.code,{children:`manage_calendar`}),`, `,_jsx(_components.code,{children:`manage_meetings`})]}),_jsx(_components.td,{children:`Stage or remove one attendee from a meeting, identified by userId or email.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`reorder_meeting_agenda_item`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_meeting_agenda`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_calendar`}),`, `,_jsx(_components.code,{children:`write_meetings`}),`, `,_jsx(_components.code,{children:`manage_calendar`}),`, `,_jsx(_components.code,{children:`manage_meetings`})]}),_jsx(_components.td,{children:`Stage or move one agenda item to a new zero-based position within its meeting (other items shift).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`retry_meeting_publication`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_meetings`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_calendar`}),`, `,_jsx(_components.code,{children:`write_meetings`}),`, `,_jsx(_components.code,{children:`manage_calendar`}),`, `,_jsx(_components.code,{children:`manage_meetings`})]}),_jsx(_components.td,{children:`Stage or retry the latest failed/retryable Graph or ICS calendar operation. Only the authenticated meeting organizer can retry; the original transport and series/occurrence semantics are preserved.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_meeting`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_meetings`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_calendar`}),`, `,_jsx(_components.code,{children:`write_meetings`}),`, `,_jsx(_components.code,{children:`manage_calendar`}),`, `,_jsx(_components.code,{children:`manage_meetings`})]}),_jsx(_components.td,{children:`Stage or update a meeting or one recurring occurrence, including attendees, timezone, Teams, recurrence, and Save \u0026 Send publication. Use cancel_meeting for cancellation. Published meetings retain their original authenticated organizer.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_meeting_action_item`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_meeting_action_items`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_calendar`}),`, `,_jsx(_components.code,{children:`write_meetings`}),`, `,_jsx(_components.code,{children:`manage_calendar`}),`, `,_jsx(_components.code,{children:`manage_meetings`})]}),_jsx(_components.td,{children:`Stage or update a meeting action item’s description, assignee, due date, status, priority, or notes.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`security-awareness`,children:`Security Awareness`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`training.read`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_security_awareness_summary`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_security_awareness`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_security_awareness`})}),_jsx(_components.td,{children:`Get company-scoped security awareness training and phishing simulation metrics from connected Phin, Breach Secure Now, Huntress, and CyberHoot providers. Includes completion, users behind, provider rollups, and a capped list of users needing attention. Phishing send/click/campaign, breach, and captured-credential metrics that CyberHoot does not provide are returned as null, never zero. This tool is only advertised when the current tenant or company has mapped security-awareness data.`})]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`training`,children:`Training`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`training.read`}),`, `,_jsx(_components.code,{children:`training.write`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`assign_training`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_training`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_training`})}),_jsx(_components.td,{children:`Stage or assign a training course to users.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`edit_training_enrollment`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_training`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_training`})}),_jsx(_components.td,{children:`Stage or edit a training enrollment.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_training_course`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_training`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_training`})}),_jsx(_components.td,{children:`Get one training course.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_training_categories`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_training`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_training`})}),_jsx(_components.td,{children:`List training categories.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_training_courses`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_training`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_training`})}),_jsx(_components.td,{children:`List training courses.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_training_enrollments`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_training`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_training`})}),_jsx(_components.td,{children:`List training enrollments.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`budgets`,children:`Budgets`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`budgets.read`}),`, `,_jsx(_components.code,{children:`budgets.write`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`add_budget_item`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_budgets`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_budgets`})}),_jsx(_components.td,{children:`Stage or add a line item to a Draft or PendingApproval budget.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_budget`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_budgets`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_budgets`})}),_jsx(_components.td,{children:`Stage or create a Draft or PendingApproval budget. Approval uses MSPortal’s managed lifecycle workflow.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_budget`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_budgets`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_budgets`})}),_jsx(_components.td,{children:`Stage or delete a budget.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`edit_budget`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_budgets`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_budgets`})}),_jsx(_components.td,{children:`Stage or edit a Draft or PendingApproval budget. This tool cannot approve, archive, or modify a locked budget.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_budget`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_budgets`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_budgets`})}),_jsx(_components.td,{children:`Get one budget with line items and custom field values (label → value).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_budget_categories`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_budgets`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_budgets`})}),_jsx(_components.td,{children:`List budget categories.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_budget_products`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_budgets`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_budgets`})}),_jsx(_components.td,{children:`List budget products.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_budgets`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_budgets`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_budgets`})}),_jsx(_components.td,{children:`List budgets.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`surveys`,children:`Surveys`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`surveys.read`}),`, `,_jsx(_components.code,{children:`surveys.write`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_survey`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_surveys`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_surveys`})}),_jsx(_components.td,{children:`Stage or create a complete general survey: title, description, and questions with answer types and options. Created inactive by default; chain with set_survey_status to activate, send_survey_invites to dispatch, and list_survey_responses to read results.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_nps_summary`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_surveys`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_surveys`})}),_jsx(_components.td,{children:`Pre-computed NPS analytics rows (promoters/passives/detractors, NPS score, response rate) bucketed by period (daily/weekly/monthly/quarterly/yearly/all_time), tenant-wide and per company. Filter by companyId for ‘NPS by client’, by periodType for trend questions, or by surveyId for one NPS campaign. Returns the newest 200 periods; narrow with periodType or a date window for longer histories.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_survey`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_surveys`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_surveys`})}),_jsx(_components.td,{children:`Get a general survey with questions.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_survey_stats`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_surveys`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_surveys`})}),_jsx(_components.td,{children:`Aggregated stats for one general survey: invites sent, completed responses, response rate, and per-question rollups (average value for numeric/likert/NPS/rating questions, option counts for select questions). Use instead of re-aggregating list_survey_responses.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_survey_responses`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_surveys`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`view_all_survey_answers`}),`, `,_jsx(_components.code,{children:`manage_surveys`})]}),_jsx(_components.td,{children:`List responses for a general survey.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_surveys`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_surveys`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_surveys`})}),_jsx(_components.td,{children:`List general surveys.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`send_survey_invites`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_surveys`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_surveys`})}),_jsx(_components.td,{children:`Stage or send email invitations for an active general survey to a list of recipients. Sends real emails on commit.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_survey_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_surveys`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_surveys`})}),_jsx(_components.td,{children:`Stage or set the active status of a general survey (activate or deactivate).`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`automation`,children:`Automation`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`automation.read`}),`, `,_jsx(_components.code,{children:`automation.write`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_automation_rule`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_automation`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_automation`})}),_jsx(_components.td,{children:`Stage or create an automation rule (trigger + conditions + actions). Actions can open tickets, send email, send surveys, update fields, and more.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_automation_rule`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_automation`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_settings_automation`})}),_jsx(_components.td,{children:`Stage or permanently delete an automation rule.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`edit_automation_rule`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_automation`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_automation`})}),_jsx(_components.td,{children:`Stage or apply a partial update to an existing automation rule.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_automation_rule`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_automation`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_automation`})}),_jsx(_components.td,{children:`Get one automation rule.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_automation_executions`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_automation`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_automation`})}),_jsx(_components.td,{children:`List automation execution history.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_automation_rules`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_automation`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_automation`})}),_jsx(_components.td,{children:`List automation rules.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`toggle_automation_rule`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_automation`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_automation`})}),_jsx(_components.td,{children:`Stage or toggle an automation rule.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`users-\u0026-contacts`,children:`Users \u0026 Contacts`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`users.read`}),`, `,_jsx(_components.code,{children:`users.write`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`invite_user`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_users`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_settings_users`}),`, `,_jsx(_components.code,{children:`write_settings_company_users`})]}),_jsx(_components.td,{children:`Stage or commit inviting a user to the tenant by email. Sends an invitation email (or links an existing account). Provide companyId to invite a company (client portal) user.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_company_contacts`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_users`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_company_users`})}),_jsx(_components.td,{children:`List company users (client portal contacts) with optional search, status, and company filters.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_user_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_users`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_settings_users`}),`, `,_jsx(_components.code,{children:`write_settings_company_users`})]}),_jsx(_components.td,{children:`Stage or commit changing a user’s status (active, disabled, pending, imported). Disabling a user blocks their portal access.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`microsoft-365-\u0026-secure-score`,children:`Microsoft 365 \u0026 Secure Score`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`m365.read`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_m365_license_summary`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_m365`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_m365`})}),_jsx(_components.td,{children:`Get aggregated Microsoft 365 license totals: SKU count, purchased vs consumed vs available units, utilization percent, and company count.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_secure_score_summary`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_m365`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_m365`})}),_jsx(_components.td,{children:`Get the Microsoft Secure Score posture summary: current vs max score, percentage, trend over the recorded history, per-category breakdown, and industry comparison when available. Returns null data when no secure score snapshot exists for the scope.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_secure_score_trend`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_m365`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_m365`})}),_jsx(_components.td,{children:`Get daily Microsoft Secure Score data points (current score, max score, percentage) over a configurable lookback window (default 90 days), for charting or trend analysis.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_m365_domains`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_m365`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_m365`})}),_jsx(_components.td,{children:`List Microsoft 365 domains with verification, default/initial flags, authentication type, and supported services.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_m365_licenses`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_m365`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_m365`})}),_jsx(_components.td,{children:`List Microsoft 365 license SKUs with consumed/enabled units, assigned user counts, renewal dates, and subscription status. One row per company + SKU; optionally filtered to a single company.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_m365_users`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_m365`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_m365`})}),_jsx(_components.td,{children:`List Microsoft 365 users with pagination, free-text search, and filters for department, office, user type, account state, and license SKU.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_secure_score_recommendations`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_m365`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_m365`})}),_jsx(_components.td,{children:`List Microsoft Secure Score improvement actions sorted by points remaining (highest impact first), with category, tier, implementation cost, user impact, remediation guidance, and current state. By default only actions that still have points to gain are returned. Pair with create_planner_item to build a remediation plan.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`backup`,children:`Backup`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`backup.read`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_backup_summary`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_backup`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_backup`})}),_jsx(_components.td,{children:`Get a unified backup protection summary across Cove, Acronis, NinjaOne, Datto BCDR, Slide Backup, Kaseya SaaS Protection, and Spanning Backup, including device protection/storage/alerts plus SaaS workload health, 24-hour service coverage, initial backups, and last full success.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_saas_protection_customer`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_backup`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_backup`})}),_jsx(_components.td,{children:`Read one mapped SaaS backup customer in detail (Kaseya SaaS Protection by default, or Spanning Backup via provider), including all workload metrics and its successful-backup trend (10-30 days for Kaseya, up to 7 for Spanning).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_backup_alerts`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_backup`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_backup`})}),_jsxs(_components.td,{children:[`List backup alerts from Acronis, Datto BCDR and Slide Backup (provider `,_jsx(_components.code,{children:`slide`}),`), newest first, with pagination and severity, status, search and provider filters. Datto BCDR and Slide alerts have no severity and are always active, so a severity filter or a non-active status filter leaves them out. Returns an empty list when none of these providers is connected.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_backup_devices`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_backup`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_backup`})}),_jsxs(_components.td,{children:[`List backed-up devices and resources across all active backup providers (Cove, Acronis, NinjaOne, Datto BCDR, Slide Backup), excluding Microsoft 365 mailbox and site backups. Each page returns at most `,_jsx(_components.code,{children:`limit`}),` rows in provider order; totalCount sums all matching providers.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_saas_protection_customers`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_backup`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_backup`})}),_jsx(_components.td,{children:`List mapped SaaS backup customers (Kaseya SaaS Protection by default, or Spanning Backup via provider) with overall health, Exchange/OneDrive/SharePoint/Teams status, services backed up in the last 24 hours versus active services, initial backups, and last 100% successful backup.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_saas_protection_seats`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_backup`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_backup`})}),_jsx(_components.td,{children:`List Kaseya SaaS Protection seat/service inventory for a portal company, with customer, type, state, billable status, and sync details.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`projects`,children:`Projects`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`projects.read`}),`, `,_jsx(_components.code,{children:`projects.write`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`add_project_ticket_note`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_tickets`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_projects_notes`})}),_jsx(_components.td,{children:`Stage or commit adding a note to a project ticket in the PSA (ConnectWise project ticket notes, attributed to your linked PSA member; Halo ticket actions). Autotask project tasks do not support notes.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`convert_project_action_item_to_ticket`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_tickets`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.strong,{children:`All:`}),` `,_jsx(_components.code,{children:`write_projects`}),`, `,_jsx(_components.code,{children:`write_projects_overlays`}),`, `,_jsx(_components.code,{children:`write_tickets_create`})]}),_jsx(_components.td,{children:`Stage or commit creating a project ticket from a pending action item: a ConnectWise, Halo PSA or Autotask project ticket in the project’s PSA, or a native MSPortal ticket. The ticket is prefilled from the item and links back to it; the item links to the ticket and completes when the ticket closes. The ticket is internal unless showToClient is true. Staging previews the PSA, phase, summary and priority; an item that already has a ticket is refused.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_project_client_action`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_client_actions`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_projects_overlays`})}),_jsx(_components.td,{children:`Stage or commit removing a client action from a project’s overlay. Removing a pending decision that came from a weekly update also removes that decision bullet from the update.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_project_deliverable`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_deliverables`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_projects_overlays`})}),_jsx(_components.td,{children:`Stage or commit removing a deliverable from a project’s overlay.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_project_milestone`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_milestones`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_projects_overlays`})}),_jsx(_components.td,{children:`Stage or commit removing a milestone from a project’s overlay.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_project_weekly_update`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_updates`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_projects_overlays`})}),_jsx(_components.td,{children:`Stage or commit removing a weekly update from a project’s overlay. Pending decision client actions that only existed because of this update are removed as well.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`finalize_project_document_upload`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_documents`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.code,{children:`write_projects`})]}),_jsx(_components.td,{children:`Stage or commit registering a file already sent to the signed URL from prepare_project_document_upload. Pass uploadId, newDocumentId, fileSize and the same metadata used to prepare it. File size, type, current permissions and expectedVersion are checked again before the document or revision is saved. Returns documentId, version and a documentLink.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_project`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_projects`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_projects`})}),_jsx(_components.td,{children:`Get one project with its client-visibility overlay. Heavy overlay detail (deliverables, milestones, client actions, weekly updates) is only returned when explicitly requested. Use get_project_detail for phases, tickets, and time entries.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_project_detail`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_projects`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_projects`})}),_jsx(_components.td,{children:`Full project detail bundle: PSA project fields, the health overlay (outcome, phase, health, contacts, deliverables, milestones, client actions, weekly updates), PSA phases, and bounded slices of tickets (including scheduled start/end dates) and time entries. ticketsTruncated / timeEntriesTruncated tell you when to page with list_project_tickets / list_project_time_entries.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_project_display_settings`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_project_settings`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_projects`})}),_jsx(_components.td,{children:`Tenant-level project display settings (client visibility mode, section/field toggles, status mappings, Kanban configuration). Returns defaults with isDefault=true when nothing has been customized.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_project_document_version_download`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_project_documents`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.code,{children:`read_projects`})]}),_jsx(_components.td,{children:`Get a five-minute signed download URL for one version of a project folder document.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_project_kanban_options`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_projects`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_projects`})}),_jsxs(_components.td,{children:[`Assignable catalogs for a project’s Kanban board: project statuses, ticket statuses per service board (ConnectWise; Autotask returns one board-less entry for its shared task status picklist), and (for callers who can edit projects on ConnectWise/Autotask) the owner roster (ConnectWise: live project team) and priority catalog, each as `,_jsx(_components.code,{children:`{ name, externalId }`}),`. MSPortal-native projects return the fixed ticket statuses in one board-less group; their project lifecycle status is free text, so projectStatuses is empty and update_project_status accepts statusName directly.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_project_assignable_users`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_projects`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_projects`})}),_jsx(_components.td,{children:`Users who can be assigned to a project’s client actions: contacts of the project’s company plus tenant staff. Use the returned ids as assigneeIds in upsert_project_client_action.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_project_document_sharing_targets`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_project_documents`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.strong,{children:`All:`}),` `,_jsx(_components.code,{children:`read_projects`}),`, `,_jsx(_components.code,{children:`read_settings_onboarding`})]}),_jsx(_components.td,{children:`List the client portal and phase IDs this project’s documents can be shared to. Use them as portalId and phaseId when sharing an upload or changing a folder document’s visibility.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_project_document_versions`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_project_documents`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.code,{children:`read_projects`})]}),_jsx(_components.td,{children:`List a project folder document’s versions, newest first. The newest version_number is the expectedVersion for a revision upload or a restore. Version history stays visible to MSP staff only, even when the current file is shared.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_project_documents`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_project_documents`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.code,{children:`read_projects`})]}),_jsx(_components.td,{children:`List a project’s document library with document IDs, sources, visibility and folder IDs. Documents page with page and limit; folders return 100 at a time (continue with foldersOffset while has_more is true). Use the document’s id and source in a deliverable’s documentLinks.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_project_ticket_notes`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_project_tickets`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_projects`})}),_jsx(_components.td,{children:`Notes on one project ticket: synced notes first, otherwise fetched live from the PSA (ConnectWise project ticket notes; Halo actions, cached afterwards). Autotask project tasks have no notes.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_project_tickets`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_project_tickets`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_projects`})}),_jsx(_components.td,{children:`Tickets (PSA project tasks) for one project with status, owner, priority, phase, hours, scheduled start/end dates, and closed state. Filter by status name, owner, phase, closed flag, or search text; paginated.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_project_time_entries`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_projects`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_projects`})}),_jsx(_components.td,{children:`Time entries logged against one project (most recent 500), newest first. Filter by ticket, phase, member, or date range; paginated. Notes are truncated.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_projects`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_projects`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_projects`})}),_jsx(_components.td,{children:`List PSA projects with health overlay data, pagination, and optional filters. Returns lean summaries; use get_project for deliverables, milestones, client actions, and weekly updates.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`prepare_project_document_upload`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_documents`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.code,{children:`write_projects`})]}),_jsx(_components.td,{children:`Stage or commit a signed upload URL for a project folder file up to 10 MiB. Supply fileName and the exact fileSize. Confirming returns uploadUrl, uploadId and newDocumentId; PUT the raw bytes to uploadUrl, then call finalize_project_document_upload. Preparing registers no document.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`restore_project_document_version`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_documents`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.code,{children:`write_projects`})]}),_jsx(_components.td,{children:`Stage or commit making an earlier version current by adding it as a new version. History and the document ID are kept. Existing client portal shares are withdrawn, so the restored file stays internal until you share it again.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_project_document_visibility`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_overlay`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_projects_overlays`})}),_jsx(_components.td,{children:`Stage or commit sharing one of a deliverable’s documents with the client portal, or returning it to internal only. Documents are internal when uploaded and are only ever shared on purpose. This action only changes deliverable attachments; use set_project_library_document_visibility for project folder documents. A shared document still stays hidden while its deliverable is internal; the result reports reachesClient so you can tell the difference.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_project_library_document_visibility`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_documents`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.strong,{children:`All:`}),` `,_jsx(_components.code,{children:`write_projects`}),`, `,_jsx(_components.code,{children:`write_settings_onboarding`})]}),_jsx(_components.td,{children:`Stage or commit sharing a project folder document’s current version in a chosen client portal phase, or returning it to internal only (isClientVisible true or false). Choose IDs with list_project_document_sharing_targets. Version history always stays internal.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_project_client_visibility`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_overlay`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_projects_overlays`})}),_jsx(_components.td,{children:`Stage or commit whether a project (and its overlay) is visible in the client portal (is_client_visible).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_project_display_settings`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_settings`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_projects`})}),_jsx(_components.td,{children:`Stage or commit a partial update of the tenant-level project display settings (client visibility mode and filters, section/field toggles, project and Kanban status mappings, Kanban technician roster). Only provided keys change; the merged settings are validated exactly like the settings page (visibility and roster selections must exist in the tenant’s catalog). Returns the saved settings row.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_project_overlay`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_overlay`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_projects_overlays`})}),_jsx(_components.td,{children:`Stage or commit a partial update of a project’s health overlay: outcome title/description, current phase, health status/reason/override, MSP lead, client sponsor, and internal notes. Only provided fields change; null clears a field. Creates the overlay if the project has none. Use update_project_client_visibility for client visibility toggles.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_project_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_projects`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_projects_status`})}),_jsx(_components.td,{children:`Stage or commit a change of a project’s lifecycle status. PSA-backed projects are written through to the PSA (ConnectWise / Autotask; Halo updates the portal cache only) and then reflected in the portal; MSPortal-native projects are updated in the portal only. Target by PSA status name or external id (get_project_kanban_options projectStatuses), or by Kanban display group (its configured default status is used).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_project_ticket_owner`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_tickets`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_projects`})}),_jsx(_components.td,{children:`Stage or commit assigning (or unassigning with null) the owner of one or more tickets on a project, written through to the PSA (ConnectWise project team members; Autotask assigned resource) and then reflected in the portal cache. Owner ids come from get_project_kanban_options owners.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_project_ticket_priority`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_tickets`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_projects`})}),_jsx(_components.td,{children:`Stage or commit a priority change for one or more tickets on a project, written through to the PSA (ConnectWise / Autotask) and then reflected in the portal cache. Priority ids come from get_project_kanban_options priorities.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_project_ticket_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_tickets`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_projects_status`})}),_jsx(_components.td,{children:`Stage or commit a status change for one or more tickets on a project, written through to the PSA (ConnectWise service-board statuses per ticket board; Autotask task status picklist) and then reflected in the portal cache. Resolve the target by name or PSA external id from get_project_kanban_options.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`upload_project_document`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_documents`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`MSP staff only.`}),` `,_jsx(_components.code,{children:`write_projects`})]}),_jsx(_components.td,{children:`Stage or commit uploading a file (base64, up to 3 MB) into a project folder, optionally linking an existing deliverable. Omit documentId for a new document; pass documentId and the current expectedVersion to add a new version that keeps the history and existing links. folder accepts a folder ID or an unambiguous name. Files are internal by default; isClientVisible true also needs portalId and phaseId. Use prepare_project_document_upload for files up to 10 MiB.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`upsert_project_client_action`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_client_actions`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_projects_overlays`})}),_jsx(_components.td,{children:`Stage or commit creating a client action (decision, approval, question, access request, scheduling item, or action item) on a project’s overlay, or updating one by clientActionId. Assignees are validated against list_project_assignable_users. Pending decisions/approvals stay in sync with the weekly-update decisions list. autoCompleteOnClose completes an action item when its linked ticket closes.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`upsert_project_deliverable`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_deliverables`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_projects_overlays`})}),_jsx(_components.td,{children:`Stage or commit creating a deliverable on a project’s overlay (omit deliverableId) or updating one (pass deliverableId; only provided fields change). Moving status to complete stamps completed_at.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`upsert_project_milestone`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_milestones`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_projects_overlays`})}),_jsx(_components.td,{children:`Stage or commit creating a milestone on a project’s overlay (omit milestoneId) or updating one (pass milestoneId; only provided fields change).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`upsert_project_weekly_update`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_project_updates`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_projects_overlays`})}),_jsx(_components.td,{children:`Stage or commit creating a weekly status update on a project’s overlay (omit weeklyUpdateId; weekOf required) or editing one (pass weeklyUpdateId; only provided fields change). Each decisionsNeeded bullet is mirrored as a pending decision client action.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`client-health`,children:`Client Health`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`customer_success.read`}),`, `,_jsx(_components.code,{children:`devices.read`}),`, `,_jsx(_components.code,{children:`backup.read`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_client_health_history`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_customer_success`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_customer_success`})}),_jsx(_components.td,{children:`Get daily health score snapshots for one company, including per-dimension scores, over a configurable lookback window (default 180 days).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_client_health_summary`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_customer_success`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_customer_success`})}),_jsx(_components.td,{children:`Get portfolio-wide client health summary stats: average health score, counts by risk level, average NPS, tool stack adoption, and overdue invoices.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_csat_summary`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_customer_success`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_customer_success`})}),_jsx(_components.td,{children:`CSAT (customer satisfaction) rollup from ticket-close survey responses: overall stats (total responses, average score, CSAT %, satisfied/neutral/dissatisfied counts, low-score count) plus a per-company breakdown. Filter by date window (periodStart/periodEnd) for ‘CSAT this quarter’ questions, or by a single CSAT survey campaign.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_client_health`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_customer_success`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_customer_success`})}),_jsx(_components.td,{children:`List client health scores across companies with risk level, trend, dimension scores, and key engagement/financial signals. Supports pagination, risk filtering, and search.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_company_benchmarks`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_client_benchmarks`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`read_customer_success`}),`, `,_jsx(_components.code,{children:`read_devices`}),`, `,_jsx(_components.code,{children:`read_backup`})]}),_jsx(_components.td,{children:`Benchmark clients against all of the MSP’s active clients on health, patch and backup scores (0-100, a current snapshot): peer median and quartiles, and each client’s value and percentile. Clients need 5 or more devices or protected items to be ranked, and peer figures need 5 clients. Company users see only their own companies. Metrics the caller cannot read are left out.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`financials`,children:`Financials`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`financial.read`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_invoice`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_financial`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_invoices`})}),_jsx(_components.td,{children:`Get one synced invoice by ID with full amounts, payments, and billing detail.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_invoice_summary`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_financial`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_invoices`})}),_jsx(_components.td,{children:`Get aggregate invoice totals: invoice count, total billed, outstanding balance, open count, and overdue count/amount. Optionally scoped to specific companies.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_quote`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_financial`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_quotes`})}),_jsx(_components.td,{children:`Get one quote by ID with full pricing totals and lifecycle dates.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_revenue_summary`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_financial`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_financial_reporting`})}),_jsx(_components.td,{children:`Get monthly revenue over a lookback window (default 12 months), grouped by classification (managed / other recurring / non-recurring), PSA provider, or line type. One row per month + group. Useful for QBR prep, revenue trend analysis, and profitability conversations.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_invoices`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_financial`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_invoices`})}),_jsx(_components.td,{children:`List PSA-synced invoices with status, type, dates, totals, payments, and balances. Supports pagination, company filtering, status/type/date filters, and search. Invoices are owned by the PSA; this is a read-only view.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_quotes`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_financial`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_quotes`})}),_jsx(_components.td,{children:`List quotes from active quoting integrations with stage, owner, company, and monthly/annual/one-time totals. Supports pagination, company filtering, stage filtering, and search. Quotes are created and managed in the source quoting provider; this is a read-only view.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`integrations`,children:`Integrations`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`integrations.read`}),`, `,_jsx(_components.code,{children:`integrations.write`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_integration`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_integrations`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_integrations`})}),_jsx(_components.td,{children:`Get one integration’s sync health, including a lastRuns map of per-entity last-sync timestamps. Never returns credentials or configuration.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_integrations`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_integrations`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_integrations`})}),_jsxs(_components.td,{children:[`List tenant integrations with sync health (status, derived health, failure counters, last error, per-entity last-sync timestamps). Never returns credentials or configuration. Returns a detail object `,_jsx(_components.code,{children:`{ integrations, companyIntegrations }`}),`; companyIntegrations is null unless includeCompanyIntegrations is true.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`pause_integration`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_integrations`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_integrations`})}),_jsx(_components.td,{children:`Stage or pause an integration. Pausing stops all background syncs for the provider until it is resumed (status becomes ‘paused’ with reason ‘manual_pause’).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`resume_integration`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_integrations`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_integrations`})}),_jsx(_components.td,{children:`Stage or resume a paused integration. Sets status to ‘active’ and clears the pause and failure state (paused_at, paused_reason, last error fields, consecutive failures).`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`documentation`,children:`Documentation`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`documentation.read`}),`, `,_jsx(_components.code,{children:`documentation.write`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_documentation_page`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_documentation`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_settings_documentation`}),`, `,_jsx(_components.code,{children:`write_settings_onboarding`})]}),_jsx(_components.td,{children:`Create a built-in documentation page (inline HTML custom document) in the tenant’s documentation library. Optionally scoped to a company and placed in a custom folder. The page gets a first revision and a visibility rule, like pages created from Settings: shared with all company users by default, or restricted to specific permission-group roles via roleIds (see list_documentation_visibility_roles).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_documentation_document`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_documentation`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_documentation`})}),_jsx(_components.td,{children:`Get one documentation document with its full HTML content: a built-in custom page, a Hudu article (with attachment metadata and public share links where sharing is enabled), or an IT Glue document. Per-item visibility rules are enforced. A built-in page with isClientTemplate: true is a client template: pass companyId to get it filled in for that client (brandedFor names the company). Company users always get their own company’s version.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_documentation_documents`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_documentation`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_documentation`})}),_jsx(_components.td,{children:`List documentation from the merged library: built-in custom pages plus articles synced from Hudu and IT Glue. Returns a short plain-text excerpt per document; use get_documentation_document for full content. Supports search, company, folder, and source filters.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_documentation_folders`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_documentation`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_documentation`})}),_jsx(_components.td,{children:`List documentation folders across all sources (custom, Hudu, IT Glue) with per-folder document counts. Use the returned folderKey to filter list_documentation_documents, and the UUID of custom:\u003cuuid> keys as folderId when creating pages.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_documentation_visibility_roles`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_documentation`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_settings_documentation`}),`, `,_jsx(_components.code,{children:`write_settings_onboarding`})]}),_jsx(_components.td,{children:`List the company permission-group roles (client portal roles) that can be used as visibility targets when creating documentation pages. Pass the returned role ids as roleIds to create_documentation_page to restrict a page to company users in those roles.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`set_documentation_page_visibility`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_documentation`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_settings_documentation`}),`, `,_jsx(_components.code,{children:`write_settings_onboarding`})]}),_jsx(_components.td,{children:`Replace the visibility rules of an existing built-in documentation page: restrict it to specific company permission-group roles (see list_documentation_visibility_roles) or share it with all company users in scope. Use this to share a page that was created from the onboarding page library into the documentation hub for a specific role, or to change who can see a page after creation. Existing rules are replaced, not merged. Only custom pages support this; Hudu and IT Glue articles are managed from Settings.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_documentation_page`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_documentation`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write_settings_documentation`}),`, `,_jsx(_components.code,{children:`write_settings_onboarding`})]}),_jsx(_components.td,{children:`Update the title, HTML body, and/or summary of a built-in documentation page. Creates a new revision (the previous content stays in revision history). Only custom inline pages can be edited; Hudu and IT Glue articles are managed in their source system. contentHtml replaces the entire body, so fetch the current content with get_documentation_document and apply your edit to it.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_intune_policies`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_intune`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_documentation`})}),_jsxs(_components.td,{children:[`List the Intune configuration, compliance, app protection and update policies documented from CIPP for each company: policy type, platform, assigned and excluded groups, number of configured settings, last modified date and when a change was last detected. Needs `,_jsx(_components.strong,{children:`Document Intune policies`}),` on the CIPP integration.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_intune_policy`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_intune`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_documentation`})}),_jsx(_components.td,{children:`Get one documented Intune policy with its configured settings as readable names and values, its assignments and, by default, what changed since the previous documented version. Secrets, certificates and scripts are never included; they appear as hidden values.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`onboarding`,children:`Onboarding`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`onboarding.read`}),`, `,_jsx(_components.code,{children:`onboarding.write`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`add_onboarding_portal_contact`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_portals`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or add a client contact to an onboarding portal. No invite email is sent by this tool; invites are emailed when the portal is started, or from the app via Send invite.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`add_onboarding_portal_phase`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_phases`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or add a phase to an onboarding portal. The phase is appended at the end in pending status.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`add_onboarding_portal_task`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_tasks`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or add a task to an onboarding portal phase. The task is appended at the end of the phase in pending status.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`archive_onboarding_checklist`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_checklists`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or apply archiving (archived: true) or restoring (archived: false) of an onboarding checklist template. Archived templates are hidden from pickers but existing task links keep working.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`archive_onboarding_portal`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_portals`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or archive an onboarding portal (archived: true, revokes all active client portal sessions) or unarchive it back to draft (archived: false; only valid for archived portals).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`complete_onboarding_portal`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_portals`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or mark an active onboarding portal as completed (active → completed). Logs a portal_completed event and fires portal-completion automations on commit.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_onboarding_checklist`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_checklists`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or create a reusable onboarding checklist template with ordered items and optional tags. Link the template to onboarding template tasks in the app to attach it to client portals.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_onboarding_form`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_forms`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or create a reusable client-facing onboarding form, optionally with its fields. Forms are created in draft status by default; active forms can be attached to onboarding form tasks for clients to fill in.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_onboarding_page`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_pages`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or create a standalone onboarding documentation page in the page catalog. The body HTML is sanitized on save. The page is not attached to any template until linked with link_onboarding_page_to_template.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_onboarding_portal`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_portals`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or create a client onboarding portal from a template, with optional client contacts. The portal is created in draft status and no client emails are sent; use start_onboarding_portal to activate it and send invites.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_onboarding_page`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_pages`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or apply deletion (archival) of an onboarding documentation page. On commit the page is archived and removed from every template and portal that references it. This cannot be undone from the API.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_onboarding_portal_task`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_tasks`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or permanently delete an onboarding portal task. This cannot be undone. Requires the manage onboarding permission.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_onboarding_checklist`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_onboarding_checklists`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_onboarding`})}),_jsx(_components.td,{children:`Get one onboarding checklist template with its full ordered items array, tags, and archive status.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_onboarding_form`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_onboarding_forms`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_onboarding`})}),_jsx(_components.td,{children:`Get one onboarding form with its full field definitions (label, field key, type, required flag, help text, placeholder, options, default value, display order).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_onboarding_page`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_onboarding_pages`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_onboarding`})}),_jsx(_components.td,{children:`Get one onboarding documentation page including its full body HTML, summary, icon, section label, and template/portal usage counts.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_onboarding_portal`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_onboarding_portals`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_onboarding`})}),_jsx(_components.td,{children:`Get the full detail of one onboarding portal: phases with tasks, documents, surveys, approvals, contacts, key dates, dependencies, and PSA project links.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`link_onboarding_page_to_template`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_pages`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or apply linking a documentation page into an onboarding template. The page is appended at the end of the template’s page list. Idempotent: linking an already linked page returns the existing link.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_onboarding_checklists`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_onboarding_checklists`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_onboarding`})}),_jsx(_components.td,{children:`List reusable onboarding checklist templates with item counts, tags, and archive status. Use a checklist ID with get_onboarding_checklist to see its items.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_onboarding_forms`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_onboarding_forms`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_onboarding`})}),_jsx(_components.td,{children:`List reusable client-facing onboarding forms with status, field counts, and multiple-entry settings. Filter by status (draft, active, archived).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_onboarding_pages`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_onboarding_pages`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_onboarding`})}),_jsx(_components.td,{children:`List the standalone onboarding documentation page catalog with summaries, icon and section metadata, body length, and usage counts (templates and portals referencing each page). Use get_onboarding_page for the full body HTML.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_onboarding_portals`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_onboarding_portals`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_onboarding`})}),_jsx(_components.td,{children:`List client onboarding portals with status, progress counts (phases, tasks, documents), and contact counts. Filter by company or status (draft, active, completed, converted, archived).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_onboarding_templates`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_onboarding_portals`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_settings_onboarding`})}),_jsx(_components.td,{children:`List client onboarding templates with phase/task counts and estimated duration. Use a template ID with create_onboarding_portal to spin up a portal for a new client.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`start_onboarding_portal`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_portals`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or activate a draft onboarding portal (draft → active). Sends real invite emails to all portal contacts on commit.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`unlink_onboarding_page_from_template`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_pages`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or apply removal of a documentation page link from an onboarding template. The page itself stays in the catalog and remains linked to any other templates.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_onboarding_checklist`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_checklists`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or apply changes to an onboarding checklist template. Only the provided fields change; the items array, when provided, replaces ALL existing items. Use get_onboarding_checklist first to fetch the current items before editing them.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_onboarding_form`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_forms`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or apply changes to an onboarding form: rename it, change its description, status (draft, active, archived), or multiple-entry setting, and add, update, or remove its fields in one call.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_onboarding_page`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_pages`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or apply a partial update to an onboarding documentation page (title, summary, body HTML, icon, section label). At least one field besides pageId is required. Each update records a new page revision.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_onboarding_portal`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_portals`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or apply an update to an onboarding portal’s name and/or description. Pass description: null to clear it.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_onboarding_portal_phase`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_phases`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or update an onboarding portal phase’s name and/or description. Pass description: null to clear it.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_onboarding_portal_task`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_tasks`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or update an onboarding task’s title, description, owner, priority, or due date. Use update_onboarding_task_status to change its status.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_onboarding_task_status`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_tasks`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or update an onboarding task’s status (pending, in_progress, completed, blocked). Completing a task logs an event, fires task-completion automations, and syncs the status to a linked PSA ticket if one exists.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_onboarding_template_page_link`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_onboarding_pages`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_settings_onboarding`})}),_jsx(_components.td,{children:`Stage or apply an update to a template page link: change its display order within the template or toggle client visibility. At least one field besides linkId is required.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`technology-standards`,children:`Technology Standards`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`standards.read`}),`, `,_jsx(_components.code,{children:`standards.write`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_standard_category`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_standards`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_settings_tool_stack`})}),_jsx(_components.td,{children:`Stage or create a Standards catalog category with its description, icon, Planner type, require-one-of behavior, and display order. After creating it, add its standards/subentries with create_standard_item.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`create_standard_item`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_standards`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_settings_tool_stack`})}),_jsx(_components.td,{children:`Stage or create a standard item (the subentry beneath a Standards category) with its vendor, requirement flag, internal default price, description, and display order. Items in a require-one-of category are always optional individually.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_company_standards`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_standards`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_tool_stack`})}),_jsx(_components.td,{children:`Get one company’s standards deployment: every catalog item with its lifecycle status, item-level deploymentOptions, selectedOption, target tier inherited from its PSA company type, and deploymentAlignment (meets_target, below_target, unmapped_target, unclassified, or not_deployed), plus vCIO notes and the linked planner item. Items with no recorded status are not_started.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_standard_adoption`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_standards`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_tool_stack`})}),_jsx(_components.td,{children:`Adoption of standards across all companies, item by item. Without itemId: status counts for every standard (how many companies have each tool deployed / in progress / not started / N/A / declined). With itemId (from list_standards): also lists the company names in each status bucket (capped at 100 per bucket); answers ‘which clients are not on our standard EDR’. Companies excluded from standards tracking are not counted.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_standards_compliance`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_standards`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_tool_stack`})}),_jsx(_components.td,{children:`Per-company standards compliance rollup, scored like the /standards page: each required item that isn’t N/A or declined counts as one check; requireOneOf categories count as one check satisfied by any deployed item. Returns per-company score, status counts, missingRequiredCount, and tenant-wide totals. The missingRequired name list (capped at 25) is only populated when companyId is provided; call again with one companyId to see WHICH checks a company is missing. Companies excluded from standards tracking are flagged and unscored (an excluded companyId returns one flagged record with null score). Ideal for QBR prep and ‘which clients are below our standards’ questions.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_standards`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_standards`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_tool_stack`})}),_jsx(_components.td,{children:`List the tenant’s technology standards catalog (also called the tool stack): categories, standard items, and each item’s named deploymentOptions. Every deployment option includes its tenant-configured Standards tier. Categories marked requireOneOf are satisfied when any one item in them is deployed. Use these IDs with the Standards update tools and get_standard_adoption.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_standard_category`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_standards`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_settings_tool_stack`})}),_jsx(_components.td,{children:`Stage or update any editable Standards category field. Only provided fields change; null clears description, icon, or Planner type. Setting requireOneOf to true also makes every item in the category optional so the category acts as one grouped requirement.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`update_standard_item`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_standards`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_settings_tool_stack`})}),_jsx(_components.td,{children:`Stage or update any editable standard item field, including moving it to another category. Only provided fields change; null clears description or vendor. Use list_standards first to preserve fields you do not intend to change.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`security`,children:`Security`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`security.read`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_security_summary`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_security`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_security`})}),_jsx(_components.td,{children:`Cross-provider security posture summary: Cork (compliance findings, vulnerabilities incl. critical/known-exploited, endpoints), Acronis EDR (incident counts by state/severity/mitigation, endpoint protection), and Huntress (agents, escalations, incident reports, remediations, SAT learner counts), and Avanan email security over the last 30 days (threats by phishing/malware/other, open threats, spam and graymail blocked, protected users). A provider section is null when its data is unavailable; zero counts mean no data synced. Pair with get_secure_score_summary (M365) for the full QBR risk story.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_avanan_email_threats`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_security`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_security`})}),_jsx(_components.td,{children:`List Avanan (Check Point Harmony Email \u0026 Collaboration) email threats from the last 30 days, newest first: threat type (phishing, malware, suspicious, DLP, malicious URL, and so on), state (new/detected/pending are open; remediated and dismissed are closed), severity (critical/high/medium/low), sender, the protected email tenant and mapped company, remediation actions taken, and a link to the Avanan portal. Search matches sender, description, tenant and company name.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_edr_incidents`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_security`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_security`})}),_jsx(_components.td,{children:`List Acronis EDR incidents (newest first) with severity (HIGH/MEDIUM/LOW), state (NOT_STARTED/INVESTIGATING/CLOSED), mitigation state, verdict, and affected host. Search matches host name/domain.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_huntress_items`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_security`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_security`})}),_jsx(_components.td,{children:`List Huntress security items; escalations, incident reports, and remediations; with status, severity, category, the affected company/organization, and a link to the Huntress portal. Filter by itemType to focus on one kind.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_vulnerabilities`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_security`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_security`})}),_jsxs(_components.td,{children:[`List open vulnerability findings from every connected scanner (Cork, Action1 and RoboShadow), sorted by CVSS score (highest first): provider, CVE id/description, affected software and device, CVSS/EPSS scores, normalized severity, the scanner’s own priority (Cork only), known-exploited flag, first/last seen and status. Pass status `,_jsx(_components.code,{children:`resolved`}),` for Cork findings a complete sync stopped reporting, or provider to read one scanner. Search matches CVE id and software fields.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_cloudflare_zone_posture`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_security`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_security`})}),_jsx(_components.td,{children:`Cloudflare domain security posture from the latest sync: zones mapped to companies, zones with findings, Registrar renewals due within 30 days, and the zones needing attention with SSL/TLS mode, minimum TLS version, Always Use HTTPS, DNSSEC, security level and managed WAF state. A null setting means the token could not read it.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_bitdefender_endpoints`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_security`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_security`})}),_jsx(_components.td,{children:`List Bitdefender GravityZone endpoints with agent health from the last sync: online state, agent version, license status, outdated signatures or agent, malware in the last 24 hours, infection, isolation, policy and protection modules. Use issue to find endpoints with a specific problem, or any_issue for all of them, worst first.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_fortinet_firewalls`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_firewalls`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_security`})}),_jsx(_components.td,{children:`List a client’s FortiGate firewalls from FortiGate Cloud with model, serial, FortiOS firmware compared with the branch’s latest release, FortiGate Cloud management connection, and FortiCare and FortiGuard end dates. Use issue to find disconnected, firmware-behind or renewal-due FortiGates.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_petra_incidents`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_identity_threats`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_security`})}),_jsx(_components.td,{children:`List Petra Security Microsoft 365 account compromise incidents, open first and then newest: affected user, remediation status, live or historical detection, dwell time, phishing email subject and sender, mapped company and a Petra dashboard link.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_petra_identity_summary`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_identity_threats`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_security`})}),_jsx(_components.td,{children:`Summarize Petra Security Microsoft 365 identity threats for a period (default 30 days): live and historical account compromises, open and remediated counts, median live dwell time, the most relevant incidents, failed sign-in attacks by type and country, and each tenant’s latest posture score and top risks.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_dns_filtering_summary`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_dns_filtering`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_security`})}),_jsx(_components.td,{children:`Summarize DNS filtering from DNSFilter and ScoutDNS: requests, blocked requests and share, threats blocked, protected sites, roaming clients, top blocked categories and a per-provider breakdown. Counts cover the last 30 days; threat events cover 7 days and come from DNSFilter only. Listed only when a DNS filtering provider is connected.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`broadcasts`,children:`Broadcasts`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`broadcasts.read`}),`, `,_jsx(_components.code,{children:`broadcasts.write`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_broadcast`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_broadcasts`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_broadcasts`})}),_jsx(_components.td,{children:`Get one broadcast including its HTML body and dark-wrapper setting.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_broadcast_groups`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_broadcasts`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_broadcasts`})}),_jsx(_components.td,{children:`List broadcast groups with member counts. Use these group IDs when sending a broadcast. Optionally scoped to one company.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_broadcast_recipients`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_broadcasts`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_broadcasts`})}),_jsx(_components.td,{children:`List the recipients of one broadcast with per-recipient delivery status (paginated).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_broadcasts`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_broadcasts`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_broadcasts`})}),_jsx(_components.td,{children:`List emergency broadcast history with delivery counts and status (paginated). Excludes the HTML body; use get_broadcast for full content.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`send_broadcast`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`manage_broadcasts`})}),_jsx(_components.td,{children:`Write (confirm)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write_broadcasts`})}),_jsx(_components.td,{children:`Stage or send an emergency broadcast email to every member of the selected broadcast groups. The proposal preview shows the resolved recipient count and group names before anything is sent.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`notifications`,children:`Notifications`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`notifications.read`}),`, `,_jsx(_components.code,{children:`notifications.write`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_notifications`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_notifications`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:`MCP access`}),_jsx(_components.td,{children:`List in-app notifications for the calling user (paginated). Defaults to unread only; set includeRead to true for full history.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`mark_notification_read`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`mark_notification_read`})}),_jsx(_components.td,{children:`Immediate action`}),_jsx(_components.td,{children:`MCP access`}),_jsx(_components.td,{children:`Mark one of the calling user’s notifications as read (notificationId), or all of their unread notifications (all: true). Only touches notifications addressed to the caller; tenant-wide notifications (shared by all users) are never modified; already-read notifications are skipped.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`dashboards`,children:`Dashboards`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`dashboards.read`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_external_dashboard`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_dashboards`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_dashboards`})}),_jsx(_components.td,{children:`Get one external dashboard.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_external_dashboards`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_dashboards`})}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read_dashboards`})}),_jsx(_components.td,{children:`List external dashboards.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_internal_dashboards`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_dashboards`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`read_dashboards_internal`}),`, `,_jsx(_components.code,{children:`read_dashboards`})]}),_jsx(_components.td,{children:`List internal dashboards.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`user-directory`,children:`User Directory`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Module scopes:`}),` `,_jsx(_components.code,{children:`users.read`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action / legacy name`}),_jsx(_components.th,{children:`Public tool`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Permissions`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_user`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_users`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`read_settings_users`}),`, `,_jsx(_components.code,{children:`manage_settings_users`})]}),_jsx(_components.td,{children:`Get one tenant user, including their custom field values (label → value).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_users`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`query_users`})}),_jsx(_components.td,{children:`Read`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`read_settings_users`}),`, `,_jsx(_components.code,{children:`manage_settings_users`})]}),_jsx(_components.td,{children:`List tenant users.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`frequently-asked-questions`,children:`Frequently asked questions`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Why does my client list fewer tools than this reference?`,id:`why-does-my-client-list-fewer-tools-than-this-reference`,children:_jsx(_components.p,{children:`The tables list operations, which are grouped into 114 public tools covering 359 operations in the full catalog. Some newer operations are not listed in these tables yet. Your deployed server, consent scopes, permissions, company access, integrations and client filters can reduce that set further. The reference is not a grant of access.`})}),_jsx(Accordion,{title:`Does Read mean a tool can never send anything?`,id:`does-read-mean-a-tool-can-never-send-anything`,children:_jsx(_components.p,{children:`No. Tool results go to your connected client. submit_feedback is a separate sending action, is not marked read-only in the consolidated catalog, and needs an explicit request to send feedback.`})}),_jsx(Accordion,{title:`Do all writes require a server confirmation?`,id:`do-all-writes-require-a-server-confirmation`,children:_jsx(_components.p,{children:`No. Proposal tools stage a confirmation, but immediate actions run directly. Read the access column and exact tool description before authorizing a call.`})}),_jsx(Accordion,{title:`Can a confirmation change its target or payload?`,id:`can-a-confirmation-change-its-target-or-payload`,children:_jsx(_components.p,{children:`A confirmation applies the staged proposal. If you want a different target or change, request a new proposal and review it. Do not reuse an old confirmation for a new request.`})}),_jsx(Accordion,{title:`Does a successful tool response mean every background job finished?`,id:`does-a-successful-tool-response-mean-every-background-job-finished`,children:_jsx(_components.p,{children:`No. Some operations return after scheduling work. Verify the saved record, job status or provider result appropriate to that tool.`})}),_jsx(Accordion,{title:`Does list_compliance_templates list reusable run templates?`,id:`does-list-compliance-templates-list-reusable-run-templates`,children:_jsx(_components.p,{children:`No. It is an alias for check definitions. Use list_compliance_run_templates for reusable run templates and resolve the appropriate records before starting a run.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`related-guides`,children:`Related guides`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/user-guides/mcp-server/index`,children:`MCP Server setup and access`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/user-guides/mcp-server/github-copilot`,children:`Connect GitHub Copilot`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/user-guides/ai-assistant/index`,children:`AI Assistant`})}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"MCP Tools Reference","description":"Find grouped MCP tools, their actions, permissions, confirmations and compatibility with existing connections.","icon":"screwdriver-wrench","href":"/user-guides/mcp-server/tools-reference"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Before you start","slug":"before-you-start","depth":2,"children":[]},{"title":"Call a read tool","slug":"call-a-read-tool","depth":2,"children":[]},{"title":"Change data with a proposal","slug":"change-data-with-a-proposal","depth":2,"children":[]},{"title":"Tool naming","slug":"tool-naming","depth":2,"children":[]},{"title":"Existing connections and legacy names","slug":"existing-connections-and-legacy-names","depth":2,"children":[]},{"title":"Read the access column","slug":"read-the-access-column","depth":2,"children":[]},{"title":"Core","slug":"core","depth":2,"children":[]},{"title":"Tickets","slug":"tickets","depth":2,"children":[]},{"title":"Ticket Templates","slug":"ticket-templates","depth":2,"children":[]},{"title":"Devices","slug":"devices","depth":2,"children":[]},{"title":"Reporting","slug":"reporting","depth":2,"children":[]},{"title":"Analytics","slug":"analytics","depth":2,"children":[]},{"title":"Personal task lists","slug":"personal-task-lists","depth":2,"children":[]},{"title":"Planner","slug":"planner","depth":2,"children":[]},{"title":"Goals","slug":"goals","depth":2,"children":[]},{"title":"Compliance","slug":"compliance","depth":2,"children":[]},{"title":"Meetings \u0026 Calendar","slug":"meetings-\u0026-calendar","depth":2,"children":[]},{"title":"Security Awareness","slug":"security-awareness","depth":2,"children":[]},{"title":"Training","slug":"training","depth":2,"children":[]},{"title":"Budgets","slug":"budgets","depth":2,"children":[]},{"title":"Surveys","slug":"surveys","depth":2,"children":[]},{"title":"Automation","slug":"automation","depth":2,"children":[]},{"title":"Users \u0026 Contacts","slug":"users-\u0026-contacts","depth":2,"children":[]},{"title":"Microsoft 365 \u0026 Secure Score","slug":"microsoft-365-\u0026-secure-score","depth":2,"children":[]},{"title":"Backup","slug":"backup","depth":2,"children":[]},{"title":"Projects","slug":"projects","depth":2,"children":[]},{"title":"Client Health","slug":"client-health","depth":2,"children":[]},{"title":"Financials","slug":"financials","depth":2,"children":[]},{"title":"Integrations","slug":"integrations","depth":2,"children":[]},{"title":"Documentation","slug":"documentation","depth":2,"children":[]},{"title":"Onboarding","slug":"onboarding","depth":2,"children":[]},{"title":"Technology Standards","slug":"technology-standards","depth":2,"children":[]},{"title":"Security","slug":"security","depth":2,"children":[]},{"title":"Broadcasts","slug":"broadcasts","depth":2,"children":[]},{"title":"Notifications","slug":"notifications","depth":2,"children":[]},{"title":"Dashboards","slug":"dashboards","depth":2,"children":[]},{"title":"User Directory","slug":"user-directory","depth":2,"children":[]},{"title":"Frequently asked questions","slug":"frequently-asked-questions","depth":2,"children":[]},{"title":"Related guides","slug":"related-guides","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/msportal/d65dc731b8cde0aa/roadmap-embed.js"],"subdomain":"msportal","siteName":"MSPortal.ai Documentation","title":"MCP Tools Reference - MSPortal.ai Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-22T07:37:44.721Z","originalFileLocation":"user-guides/mcp-server/tools-reference.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Find grouped MCP tools, their actions, permissions, confirmations and compatibility with existing connections.\">\u003cmeta data-mint-head name=\"application-name\" content=\"MSPortal.ai Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"MCP Tools Reference - MSPortal.ai Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Find grouped MCP tools, their actions, permissions, confirmations and compatibility with existing connections.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"MSPortal.ai Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.msportal.ai/user-guides/mcp-server/tools-reference\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://msportal.mintlify.app/_mintlify/api/og/v2?division=AI+and+MCP\u0026amp;title=MCP+Tools+Reference\u0026amp;description=Find+grouped+MCP+tools%2C+their+actions%2C+permissions%2C+confirmations+and+compatibility+with+existing+connections.\u0026amp;theme=601404f1acc62abadd26bc13\u0026amp;signature=22d3b092e323d6a8bacb78457f8da5f3990bb312994a55ff133af7ad56152da2\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"MCP Tools Reference - MSPortal.ai Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Find grouped MCP tools, their actions, permissions, confirmations and compatibility with existing connections.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://msportal.mintlify.app/_mintlify/api/og/v2?division=AI+and+MCP\u0026amp;title=MCP+Tools+Reference\u0026amp;description=Find+grouped+MCP+tools%2C+their+actions%2C+permissions%2C+confirmations+and+compatibility+with+existing+connections.\u0026amp;theme=601404f1acc62abadd26bc13\u0026amp;signature=22d3b092e323d6a8bacb78457f8da5f3990bb312994a55ff133af7ad56152da2\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"MSPortal.ai Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0C8376\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.msportal.ai/user-guides/mcp-server/tools-reference\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/user-guides/mcp-server/tools-reference.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.msportal.ai/#organization\",\"name\":\"MSPortal.ai Documentation\",\"url\":\"https://docs.msportal.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/msportal/KnbwIXtZSTlVJTt6/logo/light.svg?fit=max\u0026auto=format\u0026n=KnbwIXtZSTlVJTt6\u0026q=85\u0026s=eb69f6d6bf16b2c401770aef19ade1d2\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.msportal.ai#website\",\"name\":\"MSPortal.ai Documentation\",\"url\":\"https://docs.msportal.ai\",\"publisher\":{\"@id\":\"https://docs.msportal.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.msportal.ai/user-guides/mcp-server/tools-reference#webpage\",\"url\":\"https://docs.msportal.ai/user-guides/mcp-server/tools-reference\",\"name\":\"MCP Tools Reference\",\"description\":\"Find grouped MCP tools, their actions, permissions, confirmations and compatibility with existing connections.\",\"dateModified\":\"2026-10-22T07:37:44.721Z\",\"isPartOf\":{\"@id\":\"https://docs.msportal.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.msportal.ai/user-guides/mcp-server/tools-reference#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.msportal.ai/user-guides/mcp-server/tools-reference#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"AI and MCP\",\"item\":\"https://docs.msportal.ai/user-guides/ai-assistant/index\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MCP Tools Reference\",\"item\":\"https://docs.msportal.ai/user-guides/mcp-server/tools-reference\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.msportal.ai/user-guides/mcp-server/tools-reference#article\",\"headline\":\"MCP Tools Reference\",\"name\":\"MCP Tools Reference\",\"description\":\"Find grouped MCP tools, their actions, permissions, confirmations and compatibility with existing connections.\",\"url\":\"https://docs.msportal.ai/user-guides/mcp-server/tools-reference\",\"mainEntityOfPage\":{\"@id\":\"https://docs.msportal.ai/user-guides/mcp-server/tools-reference#webpage\"},\"dateModified\":\"2026-10-22T07:37:44.721Z\",\"publisher\":{\"@id\":\"https://docs.msportal.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.msportal.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"MSPortal.ai Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"MSPortal.ai Documentation","nav":{"global":null,"tabs":[{"tab":"Company Guides","pages":[{"title":"Company Guides","href":"/user-guides/account/manage-your-profile"}]},{"tab":"MSP Guides","anchors":[{"anchor":"Getting started","icon":"rocket","groups":[{"group":"Start here","pages":[{"title":"MSP guides","icon":"book-open","href":"/user-guides/getting-started"},{"title":"Quick start for MSP staff","icon":"book-open","href":"/user-guides/getting-started/quick-start"},{"title":"Work through your portal launch plan","icon":"rocket","href":"/user-guides/getting-started/launch-center"}]},{"group":"Navigation and access","pages":[{"title":"How data moves through MSPortal","icon":"diagram-project","href":"/user-guides/getting-started/data-flow"},{"title":"Find pages and records with Search","icon":"magnifying-glass","href":"/user-guides/getting-started/universal-search"},{"title":"Customize the sidebar","icon":"book-open","href":"/user-guides/getting-started/customizing-the-sidebar"},{"title":"Use keyboard shortcuts","icon":"keyboard","href":"/user-guides/getting-started/keyboard-shortcuts"},{"title":"How to Create a New User Role","icon":"shield-halved","href":"/user-guides/getting-started/how-to-create-a-new-user-role"},{"title":"Control what Company users can see","icon":"eye-slash","href":"/user-guides/getting-started/hiding-items-from-clients"}]},{"group":"MSP Setup Playbook","pages":[{"title":"MSP setup playbook","sidebarTitle":"MSP setup playbook","icon":"rocket","href":"/user-guides/getting-started/onboarding/index"},{"title":"Tenant details","sidebarTitle":"Tenant details","icon":"building","href":"/user-guides/getting-started/onboarding/tenant-details"},{"title":"Support identity and AI settings","sidebarTitle":"Support identity and AI settings","icon":"sparkles","href":"/user-guides/getting-started/onboarding/ai-settings"},{"title":"Portal branding","sidebarTitle":"Portal branding","icon":"palette","href":"/user-guides/getting-started/onboarding/branding"},{"title":"Staff access groups","sidebarTitle":"Staff access groups","icon":"users","href":"/user-guides/getting-started/onboarding/tenant-roles"},{"title":"Company access groups","sidebarTitle":"Company access groups","icon":"shield","href":"/user-guides/getting-started/onboarding/company-permission-groups"},{"title":"Account teams and Team Roles","sidebarTitle":"Account teams and Team Roles","icon":"user-cog","href":"/user-guides/getting-started/onboarding/company-roles"},{"title":"Choose launch integrations","sidebarTitle":"Choose launch integrations","icon":"puzzle-piece","href":"/user-guides/getting-started/onboarding/integration-selection"},{"title":"PSA connection","sidebarTitle":"PSA connection","icon":"ticket","href":"/user-guides/getting-started/onboarding/psa-setup"},{"title":"Prepare client ticketing","sidebarTitle":"Prepare client ticketing","icon":"sliders","href":"/user-guides/getting-started/onboarding/ticket-settings"},{"title":"RMM connection","sidebarTitle":"RMM connection","icon":"desktop","href":"/user-guides/getting-started/onboarding/rmm-setup"},{"title":"Import rollout devices","sidebarTitle":"Import rollout devices","icon":"server","href":"/user-guides/getting-started/onboarding/device-import"},{"title":"Set up a sending domain","sidebarTitle":"Set up a sending domain","icon":"envelope","href":"/user-guides/getting-started/onboarding/email-domain"},{"title":"Prepare training for launch","sidebarTitle":"Prepare training for launch","icon":"graduation-cap","href":"/user-guides/getting-started/onboarding/training"},{"title":"Review billing before launch","sidebarTitle":"Review billing before launch","icon":"credit-card","href":"/user-guides/getting-started/onboarding/billing"},{"title":"Connect rollout companies to Microsoft 365","sidebarTitle":"Connect rollout companies to Microsoft 365","icon":"cloud","href":"/user-guides/getting-started/onboarding/company-m365"},{"title":"Prepare Company users","sidebarTitle":"Prepare Company users","icon":"users","href":"/user-guides/getting-started/onboarding/company-users"}]},{"group":"Your account","pages":[{"title":"Manage your profile and email preferences","icon":"user-gear","href":"/msp-guides/account/manage-your-profile"},{"title":"Understand your role and company access","icon":"shield-halved","href":"/msp-guides/account/understand-your-access"},{"title":"Arrange your personal sidebar","icon":"table-columns","href":"/msp-guides/account/arrange-your-sidebar"},{"title":"Tasks and notes","icon":"list-check","href":"/user-guides/tasks/index"},{"title":"Import and add linked tasks","icon":"file-import","href":"/user-guides/tasks/import-tasks"},{"title":"Notes and AI task suggestions","icon":"notebook-pen","href":"/user-guides/tasks/notes"}]},{"group":"AI and MCP","pages":[{"title":"AI Assistant","icon":"sparkles","href":"/user-guides/ai-assistant/index"},{"title":"Use the Home AI Assistant","icon":"sparkles","href":"/msp-guides/ai-assistant/use-home-assistant"},{"title":"MCP Server","icon":"plug","href":"/user-guides/mcp-server/index"},{"title":"Connect GitHub Copilot","description":"Connect GitHub Copilot in VS Code or Copilot CLI to the MSPortal MCP server","icon":"github","href":"/user-guides/mcp-server/github-copilot"},{"title":"MCP Tools Reference","icon":"screwdriver-wrench","href":"/user-guides/mcp-server/tools-reference"}]},{"group":"Notifications","pages":[{"title":"Notifications","description":"Find portal alerts, manage unread items, and locate automation reviews that need a decision.","icon":"bell","href":"/user-guides/notifications/index"},{"title":"Read and manage notifications","icon":"bell","href":"/user-guides/notifications/read-notifications"},{"title":"Review automation approvals","icon":"check-to-slot","href":"/user-guides/notifications/review-approvals"}]}]},{"anchor":"Planning","icon":"compass","pages":[{"title":"Planning","href":"/user-guides/company-overview"}]},{"anchor":"Operations","icon":"briefcase","pages":[{"title":"Operations","href":"/user-guides/client-onboarding"}]},{"anchor":"Protection","icon":"shield-halved","pages":[{"title":"Protection","href":"/user-guides/cloud"}]},{"anchor":"MSP Tools","icon":"toolbox","pages":[{"title":"MSP Tools","href":"/user-guides/msp-tools"}]},{"anchor":"Administration","icon":"gear","pages":[{"title":"Administration","href":"/user-guides/settings"}]},{"anchor":"Integrations","icon":"plug","pages":[{"title":"Integrations","href":"/user-guides/integrations"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/budgets/list-budgets"}]},{"tab":"Release Notes","pages":[{"title":"Release Notes","href":"/release-notes"}]}]},"title":"MCP Tools Reference - MSPortal.ai Documentation","buildId":"dpl_849ArpqvBiCczQiT1Y1stNGpbqHT","deploymentId":"dpl_849ArpqvBiCczQiT1Y1stNGpbqHT","dynamics":[],"chunks":[]}