---
title: "MCP server"
description: "Transport, scope-filtered tools, two-phase destructive calls, refusals and authentication for the Cadae MCP server."
language: en-GB
canonical: https://cadae.ai/en-GB/docs/mcp
---

# MCP server

Transport, scope-filtered tools, two-phase destructive calls, refusals and authentication for the Cadae MCP server.


`https://api.cadae.ai/mcp` — one endpoint, every Cadae tool, scoped to the
caller's permissions.

## Transport

Streamable HTTP (the MCP standard). The server responds to `initialize`,
`tools/list` and `tools/call`. Unauthenticated calls get a 401 with a
`WWW-Authenticate` header pointing at the protected-resource metadata, so
clients can discover OAuth automatically.

## Tools

Tools are scope-filtered: a credential sees only the tools its scopes allow.

A tool marked **destructive** is two-phase. The first call writes nothing and
answers with a one-shot `confirmToken`; repeat the call with that token and the
same arguments to run it. A token minted for different arguments does not
authorise the call.

{/* parity:doors — generated. Do not edit by hand. */}

| Tool | Scope | What | Notes |
| --- | --- | --- | --- |
| `access_events_list` | `activities.read` | Access and membership audit events | read-only |
| `activities_list` | `activities.read` | Portfolio audit feed | read-only |
| `annual_confirmation_confirm` | `phi.write` | Answer an annual property-model confirmation |  |
| `annual_confirmation_pending` | `phi.read` | The hotel's annual property-model confirmations | read-only |
| `applicability_overrides_list` | `phi.read` | The hotel's applicability overrides | read-only |
| `asset_types_list` | `projects.read` | Asset types this Portfolio can use, with their active configurable fields | read-only |
| `assumptions_approved` | `phi.read` | The hotel's approved assumptions for a period | read-only |
| `assumptions_list` | `phi.read` | The hotel's assumption needs and values | read-only |
| `assumptions_propose_need` | `phi.write` | Propose that an assumption is needed |  |
| `bills_address` | `phi.read` | The hotel's bill forwarding address | read-only |
| `bills_archive` | `phi.write` | Archive an inbound bill |  |
| `bills_attach_manually` | `phi.write` | Attach a bill to a source and a draft month by hand |  |
| `bills_confirm_match` | `phi.write` | Confirm a suggested match |  |
| `bills_decline_match` | `phi.write` | Decline a suggested match |  |
| `bills_ensure_address` | `phi.write` | Mint the hotel's bill forwarding address |  |
| `bills_get` | `phi.read` | One inbound bill and its suggested matches | read-only |
| `bills_list` | `phi.read` | The hotel's bill inbox | read-only |
| `bills_retry_extraction` | `phi.write` | Read an inbound bill again |  |
| `bills_suggestions` | `phi.read` | The suggested matches for one bill | read-only |
| `bills_upload` | `phi.write` | Add a finalised document to the bill inbox |  |
| `boundary_rules_approved` | `phi.read` | The hotel's boundary rules in force on a date (approved, or superseded after it) | read-only |
| `boundary_rules_list` | `phi.read` | The hotel's calculation-boundary rules | read-only |
| `boundary_rules_propose` | `phi.write` | Propose a calculation-boundary rule |  |
| `budgets_ledger` | `projects.read` | The append-only budget ledger for one hotel and budget year | read-only |
| `budgets_position` | `projects.read` | The delegated budget position for one hotel and budget year | read-only |
| `budgets_set` | `budgets.write` | Set a hotel's delegated budget for one budget year |  |
| `building_sections_remove` | `phi.write` | Remove a building section from the hotel's draft property model | **destructive**, needs `confirmToken` |
| `building_sections_upsert` | `phi.write` | Create or change a building section of the hotel's draft property model |  |
| `context_landing` | `viewer.read` | Where the signed-in user lands | read-only |
| `context_resolve` | `viewer.read` | Resolve and re-authorise a route context | read-only |
| `context_tree` | `viewer.read` | Authorised Portfolios and hotels for the switcher | read-only |
| `corrections_list` | `phi.read` | The hotel's correction requests and Cadae's answers | read-only |
| `data_gaps_acknowledge` | `phi.write` | Acknowledge a data gap |  |
| `data_gaps_list` | `phi.read` | The hotel's open data gaps | read-only |
| `data_sources_active` | `phi.read` | The hotel's data sources active on a date | read-only |
| `data_sources_close` | `phi.write` | Close a data source of the hotel |  |
| `data_sources_create` | `phi.write` | Register a data source for the hotel |  |
| `data_sources_list` | `phi.read` | The hotel's data-source register | read-only |
| `data_sources_replace` | `phi.write` | Replace a meter of the hotel, with its closing and opening readings |  |
| `data_sources_update` | `phi.write` | Change an active data source of the hotel |  |
| `documents_create_download_url` | `documents.read` | Mint a signed download URL for a document version | read-only |
| `documents_create_reference` | `documents.write` | Record reference-only evidence and link it to the record it supports |  |
| `documents_create_upload_url` | `documents.write` | Reserve a document and mint a signed upload URL |  |
| `documents_create_version` | `documents.write` | Replace a document with a new version |  |
| `documents_download` | `documents.read` | Download a document version (REST streams the file) | read-only |
| `documents_finalise_upload` | `documents.write` | Finalise an uploaded document version |  |
| `documents_get` | `documents.read` | One document, with its versions and links | read-only |
| `documents_link` | `documents.write` | Attach a document to a record |  |
| `documents_list` | `documents.read` | Documents attached to a record, or held at a scope | read-only |
| `documents_mark` | `documents.write` | Mark a version superseded or added in error | **destructive**, needs `confirmToken` |
| `documents_requirements_status` | `documents.read` | The document categories one of a Project's gates requires, each with whether a live document satisfies it | read-only |
| `documents_unlink` | `documents.write` | Detach a document from a record | **destructive**, needs `confirmToken` |
| `facility_closures_remove` | `phi.write` | Remove a closure from the hotel's draft property model | **destructive**, needs `confirmToken` |
| `facility_closures_upsert` | `phi.write` | Record or change a closure in the hotel's draft property model |  |
| `facility_presence_set` | `phi.write` | Answer whether the hotel has a facility |  |
| `facility_systems_close` | `phi.write` | Close a facility system of the hotel's draft property model |  |
| `facility_systems_link_areas` | `phi.write` | Set the usage areas a facility system serves |  |
| `facility_systems_upsert` | `phi.write` | Record or change a facility system in the hotel's draft property model |  |
| `hotel_activity` | `activities.read` | A hotel's activity | read-only |
| `hotel_check_name` | `hotel.write` | Would this hotel name be refused as a duplicate? | read-only |
| `hotel_create` | `hotel.write` | Create hotel |  |
| `hotel_get` | `hotel.read` | One hotel | read-only |
| `hotel_list` | `hotel.read` | Hotels I can access | read-only |
| `hotel_members_grant` | `members.write` | Grant hotel access |  |
| `hotel_members_list` | `members.read` | Hotel members | read-only |
| `hotel_members_revoke` | `members.write` | Revoke hotel access | **destructive**, needs `confirmToken` |
| `hotel_modules` | `hotel.read` | Modules enabled for a hotel | read-only |
| `hotel_set_lifecycle` | `hotel.write` | Set hotel lifecycle status | **destructive**, needs `confirmToken` |
| `hotel_set_primary_contact` | `members.write` | Set a hotel's primary contact |  |
| `hotel_update` | `hotel.write` | Update hotel |  |
| `invites_cancel` | `invites.write` | Cancel an invitation | **destructive**, needs `confirmToken` |
| `invites_create` | `invites.write` | Invite a member |  |
| `invites_create_batch` | `invites.write` | Invite several people |  |
| `invites_list` | `members.read` | List invitations | read-only |
| `invites_resend` | `invites.write` | Resend an invitation |  |
| `invites_retry_delivery` | `invites.write` | Retry a failed invitation delivery |  |
| `invites_update` | `invites.write` | Edit and resend an invitation | **destructive**, needs `confirmToken` |
| `members_list` | `members.read` | Portfolio members | read-only |
| `members_removal_preview` | `members.read` | Open work and assignments a removal would affect | read-only |
| `members_remove` | `members.write` | Remove a member from the Portfolio | **destructive**, needs `confirmToken` |
| `members_restore` | `members.write` | Restore a suspended Portfolio membership |  |
| `members_send_access_instructions` | `members.write` | Email a member their sign-in instructions |  |
| `members_suspend` | `members.write` | Suspend a Portfolio membership | **destructive**, needs `confirmToken` |
| `members_update_access` | `members.write` | Change a member's role, department or hotels |  |
| `notifications_list` | `notifications.read` | My notifications | read-only |
| `organisation_get` | `organisation.read` | Portfolio detail | read-only |
| `organisation_list` | `organisation.read` | Portfolios I can open | read-only |
| `organisation_update` | `organisation.write` | Update a Portfolio |  |
| `people_check_contacts` | `members.read` | Check contacts before inviting | read-only |
| `people_get` | `members.read` | One person's access | read-only |
| `people_list` | `members.read` | People and access | read-only |
| `people_summary` | `members.read` | People and access summary counts | read-only |
| `period_findings_explain` | `phi.write` | Explain a validation finding |  |
| `periods_ensure_baseline` | `phi.write` | Create the hotel's baseline reporting months |  |
| `periods_get` | `phi.read` | One reporting month | read-only |
| `periods_history` | `phi.read` | The input versions of one reporting month | read-only |
| `periods_list` | `phi.read` | The hotel's reporting months | read-only |
| `periods_readiness` | `phi.read` | The month's ready-to-submit checklist | read-only |
| `periods_request_correction` | `phi.write` | Ask Cadae to correct a locked or published month |  |
| `periods_save_draft` | `phi.write` | Save a month's draft data |  |
| `periods_submit` | `phi.write` | Submit a month to Cadae |  |
| `periods_submitted_version` | `phi.read` | The submitted input version of a month | read-only |
| `periods_validate` | `phi.write` | Re-run the validation catalogue over a month |  |
| `phi_contacts_for` | `phi.read` | The hotel's PHI data contacts | read-only |
| `phi_contacts_set` | `phi.write` | Set the hotel's PHI data contacts |  |
| `phi_dashboard_category_drivers` | `phi.read` | The hotel's largest PHI category drivers | read-only |
| `phi_dashboard_coverage` | `phi.read` | The hotel's PHI data coverage | read-only |
| `phi_dashboard_intensity` | `phi.read` | The hotel's operational intensity measures | read-only |
| `phi_dashboard_point_detail` | `phi.read` | One point of the PHI series, in detail | read-only |
| `phi_dashboard_resource_trend` | `phi.read` | One resource's monthly trend | read-only |
| `phi_dashboard_series` | `phi.read` | The hotel's PHI over time | read-only |
| `phi_dashboard_summary` | `phi.read` | The hotel dashboard's headline cards and notices | read-only |
| `phi_dashboard_yearly_totals` | `phi.read` | One resource's published calendar-year totals | read-only |
| `phi_events_archive` | `events.write` | Archive a PHI event | **destructive**, needs `confirmToken` |
| `phi_events_create` | `events.write` | Create a PHI event as a draft |  |
| `phi_events_get` | `events.read` | One PHI event | read-only |
| `phi_events_list` | `events.read` | PHI events I can see, filtered | read-only |
| `phi_events_publish` | `events.write` | Publish a PHI event |  |
| `phi_events_set_date` | `events.write` | Move a PHI event's date |  |
| `phi_events_timeline` | `events.read` | The PHI event markers for a chart | read-only |
| `phi_events_update` | `events.write` | Edit a PHI event |  |
| `phi_import_confirm` | `phi.write` | Apply a validated import to the hotel's drafts |  |
| `phi_import_discard` | `phi.write` | Discard a staged import |  |
| `phi_import_get` | `phi.read` | One staged import | read-only |
| `phi_import_mappings` | `phi.read` | A hotel's saved import source mappings | read-only |
| `phi_import_remap` | `phi.write` | Map several source labels to registered meters |  |
| `phi_import_resolve` | `phi.write` | Decide what to do with one staged row |  |
| `phi_import_rows` | `phi.read` | The staged rows of one import | read-only |
| `phi_import_stage` | `phi.write` | Open a staged import over an uploaded workbook |  |
| `phi_import_validate` | `phi.write` | Parse and classify a staged import |  |
| `phi_imports_list` | `phi.read` | A hotel's staged imports | read-only |
| `phi_results_breakdown` | `phi.read` | One result's category totals and intensity measures | read-only |
| `phi_results_carbon` | `phi.read` | One published month's CO₂ outputs | read-only |
| `phi_results_confidence` | `phi.read` | One result's confidence level and reason | read-only |
| `phi_results_correction_history` | `phi.read` | The correction history of a published window | read-only |
| `phi_results_cost` | `phi.read` | One published month's eligible cost and theoretical cost gap | read-only |
| `phi_results_for_projects` | `phi.read` | Published PHI quantities with their publication ids | read-only |
| `phi_results_get` | `phi.read` | One PHI publication and the windows it published | read-only |
| `phi_results_latest` | `phi.read` | The hotel's latest published PHI result | read-only |
| `phi_results_list` | `phi.read` | The hotel's published PHI results | read-only |
| `phi_source_selections_list` | `phi.read` | The source selections recorded for a hotel | read-only |
| `phi_summary_actions` | `phi.read` | The Portfolio's action progress: Savings Task buckets, Projects by stage and what completed in the period | read-only |
| `phi_summary_hotel_actions` | `phi.read` | A hotel's action progress: Savings Task buckets, Projects by stage and what completed in the period | read-only |
| `phi_summary_hotel_money` | `phi.read` | A hotel's money story: savings realised in the period, the remaining opportunity and the investment return — three figures, never added | read-only |
| `phi_summary_hotel_risks` | `phi.read` | A hotel's risk summary: open findings by severity, the oldest unresolved and the top types | read-only |
| `phi_summary_money` | `phi.read` | The Portfolio's money story: savings realised in the period, the remaining opportunity and the investment return — three figures, never added | read-only |
| `phi_summary_risks` | `phi.read` | The Portfolio's risk summary: open findings by severity, the oldest unresolved, the top types and the hotels affected | read-only |
| `phi_template` | `phi.read` | The hotel's PHI data template (REST streams the .xlsx workbook) | read-only |
| `portfolio_category_breakdown` | `phi.read` | The Portfolio's PHI category breakdown | read-only |
| `portfolio_compare_hotels` | `phi.read` | Up to five hotels side by side | read-only |
| `portfolio_comparison_groups` | `phi.read` | The Portfolio dashboard's four hotel comparison groups | read-only |
| `portfolio_confidence_breakdown` | `phi.read` | Each hotel's PHI confidence, behind the Portfolio counts | read-only |
| `portfolio_context_markers` | `phi.read` | The Portfolio's cohort context markers | read-only |
| `portfolio_data_coverage` | `phi.read` | The Portfolio's PHI data coverage | read-only |
| `portfolio_export_league_table` | `phi.read` | The Portfolio's hotels league table as CSV (REST streams the file) | read-only |
| `portfolio_intensity` | `phi.read` | The Portfolio's intensity measures, as ratios of totals | read-only |
| `portfolio_league_table` | `phi.read` | The Portfolio's hotels league table | read-only |
| `portfolio_phi_trend` | `phi.read` | PHI over time, one line per hotel | read-only |
| `portfolio_resource_trend` | `phi.read` | One resource's monthly totals across the Portfolio | read-only |
| `portfolio_summary` | `phi.read` | The Portfolio's PHI headline cards | read-only |
| `programmes_archive` | `projects.write` | Archive a programme label |  |
| `programmes_create` | `projects.write` | Create a programme label |  |
| `programmes_list` | `projects.read` | The Portfolio's programme labels | read-only |
| `programmes_update` | `projects.write` | Rename a programme or change its description |  |
| `project_adjusted_pipeline_set` | `projects.write` | Choose which Projects of an overlap group count in the adjusted pipeline |  |
| `project_assets_archive` | `projects.write` | Archive an asset record (kept, read-only) | **destructive**, needs `confirmToken` |
| `project_assets_create` | `projects.write` | Create an asset record, with its first configured answers |  |
| `project_assets_get` | `projects.read` | One asset record, with its answers and (optionally) their history | read-only |
| `project_assets_list` | `projects.read` | A hotel's asset records, with their configured field answers | read-only |
| `project_assets_set_field_values` | `projects.write` | Answer an asset record's configured fields |  |
| `project_assets_update` | `projects.write` | Change an asset record's name, location, quantity or details |  |
| `project_business_case_export` | `projects.write` | Generate a Project's business case as a PDF, filed in its Documents as Generated by Cadae — answers the export request and its state (stored, pending or failed) |  |
| `project_business_case_export_status` | `projects.read` | The state of a business-case PDF export you requested: stored (with a download URL), pending or failed | read-only |
| `project_business_case_get` | `projects.read` | A Project's business case: Cadae's calculated summary and the hotel team's sections | read-only |
| `project_business_case_mark_reviewed` | `projects.write` | Mark a Project's business-case sections reviewed against its current figures |  |
| `project_business_case_print` | `projects.read` | A Project's business case as a printable HTML document, in the hotel's language — about 350 KB, most of it the inlined typeface | read-only |
| `project_business_case_section_update` | `projects.write` | Write one section of a Project's business case |  |
| `project_collaborators_add` | `projects.write` | Put somebody on this Project, or change the role they hold |  |
| `project_collaborators_list` | `projects.read` | Who is on this Project, and which of the hotel's people may be added | read-only |
| `project_collaborators_remove` | `projects.write` | Take somebody off this Project | **destructive**, needs `confirmToken` |
| `project_comments_create` | `projects.write` | Post a comment, mentioning colleagues with @name |  |
| `project_comments_list` | `projects.read` | A Project's comments, newest first | read-only |
| `project_complete` | `projects.write` | Complete a Project — refused 412 until every item of the completion checklist is met | **destructive**, needs `confirmToken` |
| `project_completion_readiness` | `projects.read` | The Complete checklist, over the stored answers or a draft of them — nothing is saved | read-only |
| `project_confidence_list` | `projects.read` | The confidence judgements recorded on this Project | read-only |
| `project_confidence_record` | `projects.write` | Record a confidence judgement, with its reason |  |
| `project_costs_add` | `projects.write` | Record an actual cost (VAT-exclusive) — posted to the hotel's budget ledger as actual spend |  |
| `project_costs_confirm_proposal` | `projects.write` | Confirm a supplier invoice the bill inbox proposed — recorded as an actual cost and posted to the ledger, as the person confirming; the document's figures may be corrected |  |
| `project_costs_dismiss_proposal` | `projects.write` | Dismiss a supplier invoice the bill inbox proposed, with the reason — nothing is recorded or posted |  |
| `project_costs_list` | `projects.read` | A Project's actual costs, the cost to date, the forecast and the variances against the approved amount and the preferred quote | read-only |
| `project_costs_update` | `projects.write` | Correct an actual cost — a changed amount posts its difference to the ledger |  |
| `project_delivery_readiness` | `projects.read` | The Start delivery checklist: every item with whether it is satisfied and why not | read-only |
| `project_delivery_start` | `projects.write` | Start delivery — refused 412 until every item of the delivery checklist is met | **destructive**, needs `confirmToken` |
| `project_financials_accept_recalculation` | `projects.write` | Accept a Project's recalculation: re-pin a stale PHI baseline and recompute its figures |  |
| `project_financials_snapshot` | `projects.write` | Save this Project's figures as a new immutable version |  |
| `project_financials_summary` | `projects.read` | A Project's financial position, computed now, with its stored version | read-only |
| `project_financials_versions` | `projects.read` | The immutable financial versions, newest first | read-only |
| `project_funding_delete` | `projects.write` | Remove one external funding row from the live set |  |
| `project_funding_list` | `projects.read` | A Project's external funding, confirmed and potential | read-only |
| `project_funding_upsert` | `projects.write` | Create or replace one external funding row |  |
| `project_inbox_proposals_list` | `projects.read` | The supplier invoices and quotes the bill inbox proposed to a Project, pending first — none is a recorded cost or quote until confirmed | read-only |
| `project_investment_lines_delete` | `projects.write` | Remove one investment line from the live set |  |
| `project_investment_lines_list` | `projects.read` | A Project's investment lines | read-only |
| `project_investment_lines_upsert` | `projects.write` | Create or replace one investment line (VAT-exclusive) |  |
| `project_milestones_assign` | `projects.write` | Assign or clear a milestone's owner (an active person with access to the hotel) |  |
| `project_milestones_complete` | `projects.write` | Complete a milestone on a date (the go-live milestone raises project.went_live) |  |
| `project_milestones_create` | `projects.write` | Add a milestone to a Project's plan |  |
| `project_milestones_delete` | `projects.write` | Take a milestone out of the plan (a completed one stays) |  |
| `project_milestones_list` | `projects.read` | A Project's milestones, with overdue derived in the hotel's time zone and owner access shown | read-only |
| `project_milestones_set_go_live` | `projects.write` | Make this milestone the Project's one operational go-live |  |
| `project_milestones_update` | `projects.write` | Replace a milestone's fields (a date change keeps the previous date in history) |  |
| `project_overlap_groups_list` | `projects.read` | The overlap groups this Project sits in, and which options count in the adjusted pipeline | read-only |
| `project_overview_get` | `projects.read` | A Project's identity, scope and dates | read-only |
| `project_overview_update` | `projects.write` | Edit a Project's scope, dates and narrative |  |
| `project_quote_required_set` | `projects.write` | Say whether Start delivery needs a preferred quote; “no quote required” carries its reason |  |
| `project_quotes_compare` | `projects.read` | The live quotes side by side, with missing-document, expired and scope-mismatch warnings | read-only |
| `project_quotes_confirm_financials` | `projects.write` | Confirm the preferred quote into a new financial version (investment lines, recurring cost, ROI) |  |
| `project_quotes_confirm_proposal` | `projects.write` | Confirm a supplier's quote the bill inbox proposed — recorded as a received quote, as the person confirming; nothing is preferred or confirmed into the figures |  |
| `project_quotes_create` | `projects.write` | Record a supplier's quote (received; nothing about the Project moves) |  |
| `project_quotes_dismiss_proposal` | `projects.write` | Dismiss a supplier's quote the bill inbox proposed, with the reason — no quote is recorded |  |
| `project_quotes_link_investment_lines` | `projects.write` | Set the investment lines a quote supports (replaces the set) |  |
| `project_quotes_list` | `projects.read` | A Project's quotes, each with its displayed status (Expired derived in the hotel's time zone) | read-only |
| `project_quotes_set_preferred` | `projects.write` | Prefer a quote, with a reason — answers the proposed financial changes and writes none of them |  |
| `project_quotes_update` | `projects.write` | Replace a quote's typed fields (a confirmed quote's total and recurring cost are fixed) |  |
| `project_quotes_withdraw` | `projects.write` | Withdraw a quote from the running; its figures and file stay |  |
| `project_relationships_clear` | `projects.write` | Make two Projects independent again |  |
| `project_relationships_list` | `projects.read` | Projects this one depends on, overlaps or is an alternative to | read-only |
| `project_relationships_set` | `projects.write` | State how this Project relates to another |  |
| `project_saving_lines_delete` | `projects.write` | Remove one saving line from the live set |  |
| `project_saving_lines_list` | `projects.read` | A Project's saving lines | read-only |
| `project_saving_lines_preview` | `projects.read` | Price one saving line against this Project's assumptions, without saving it | read-only |
| `project_saving_lines_upsert` | `projects.write` | Create or replace one saving line |  |
| `project_templates_get` | `projects.read` | One Project template version and everything it gives a Project | read-only |
| `project_templates_list` | `projects.read` | Project templates this Portfolio can create a Project from | read-only |
| `project_utility_assumptions` | `projects.read` | The prices this Project is costed at, per resource and budget year, with their basis | read-only |
| `project_utility_overrides_delete` | `projects.write` | Drop a Project price override, so the hotel's forecast answers again |  |
| `project_utility_overrides_upsert` | `projects.write` | Set a Project-only unit price for one resource and year |  |
| `project_verification_accept` | `projects.write` | Accept the verification: the verified saving becomes the realised saving, derived once | needs `confirmToken` |
| `project_verification_draft` | `projects.write` | Record the verified annual saving per resource, with its method, period and evidence |  |
| `project_verification_get` | `projects.read` | A Project's savings verification, its variance against the estimate, and what a reopen kept | read-only |
| `project_verification_mark_unable` | `projects.write` | Record that the saving could not be verified, with the reason — it contributes no verified saving |  |
| `project_versions_list` | `projects.read` | A Project's scope and narrative snapshots, newest first | read-only |
| `projects_approve_under_delegation` | `projects.approve` | Approve (or re-approve) a Project within the hotel's delegated authority | **destructive**, needs `confirmToken` |
| `projects_assets_link` | `projects.write` | File one of the hotel's asset records under this Project |  |
| `projects_assets_unlink` | `projects.write` | Take an asset record out of this Project (it stays with the hotel) |  |
| `projects_assign_owner` | `projects.write` | Assign or clear a Project's owner |  |
| `projects_copy_to_draft` | `projects.write` | Restart a cancelled Project as a new Draft in its own hotel |  |
| `projects_copy_to_draft_preview` | `projects.write` | Preview restarting a cancelled Project as a new Draft in its own hotel | read-only |
| `projects_copy_to_hotel` | `projects.write` | Copy this Project into another hotel of the Portfolio as a new Draft (an Owner's) |  |
| `projects_copy_to_hotel_preview` | `projects.write` | Preview a copy of this Project into another hotel of the Portfolio: what travels and what stays | read-only |
| `projects_create` | `projects.write` | Create a Project in Draft |  |
| `projects_create_from_template` | `projects.write` | Create a Project in Draft from a Project template |  |
| `projects_dashboard_analytics` | `projects.read` | The Projects Analytics panels — status, type, hotel, return, budget, confidence and exceptions, over the filtered set | read-only |
| `projects_dashboard_board` | `projects.read` | The Projects Pipeline board — six lifecycle columns, their totals and the exception lane | read-only |
| `projects_dashboard_board_reorder` | `projects.write` | Move a Project within its column of the Pipeline board's manual order |  |
| `projects_dashboard_filter_options` | `projects.read` | The Projects dashboard's filter options, from the Projects the caller can read | read-only |
| `projects_dashboard_list` | `projects.read` | One page of the Projects List — filtered, sorted and paged on the server | read-only |
| `projects_dashboard_summary` | `projects.read` | The Projects dashboard's five headline cards, with the Projects behind each figure | read-only |
| `projects_dashboard_timeline` | `projects.read` | The Projects Timeline — planned bars, milestone markers and the Projects whose dates are required | read-only |
| `projects_decide` | `projects.approve` | Record an approval decision on a submitted Project, or re-approve an outgrown one | **destructive**, needs `confirmToken` |
| `projects_get` | `projects.read` | One Project, with its governance answer, its action bar and its owner | read-only |
| `projects_governance` | `projects.read` | Approval requirement, approval state and budget position | read-only |
| `projects_history` | `projects.read` | A Project's lifecycle events and approval decisions | read-only |
| `projects_list` | `projects.read` | Projects I can see, filtered | read-only |
| `projects_open_work` | `projects.read` | The open work one person still holds: the Projects they own and the Savings Tasks they own or contribute to | read-only |
| `projects_reassign_open_work` | `projects.write` | Reassign one person's open work — the Projects and Savings Tasks they own, their open task contributions and the milestones they own | **destructive**, needs `confirmToken` |
| `projects_set_budget_year` | `projects.write` | Move a Project to another budget year |  |
| `projects_set_owner_approval_required` | `projects.approve` | Require (or stop requiring) Owner approval for this Project |  |
| `projects_setup_baselines_list` | `projects.read` | A hotel's annual Energy and Water baselines, with what PHI proposes | read-only |
| `projects_setup_baselines_upsert` | `projects.write` | Accept PHI's baseline, or override it with a reason |  |
| `projects_setup_get` | `projects.read` | A hotel's Projects setup: baselines, price forecasts, delegated budget and readiness | read-only |
| `projects_setup_prices_list` | `projects.read` | A hotel's utility prices for this budget year and the next three, VAT-exclusive | read-only |
| `projects_setup_prices_upsert` | `projects.write` | Set utility prices, or a yearly % increase, for the current budget year and the next three |  |
| `projects_setup_readiness` | `projects.read` | Whether a hotel's Projects setup is ready, and what is missing | read-only |
| `projects_setup_update` | `projects.write` | Save a hotel's Projects baselines and price forecasts |  |
| `projects_summary_hotel_pipeline` | `projects.read` | One hotel's remaining opportunity: gross, adjusted for overlaps, on hold and awaiting verification | read-only |
| `projects_summary_pipeline` | `projects.read` | The Portfolio's remaining opportunity: gross, adjusted for overlaps, on hold and awaiting verification | read-only |
| `projects_transition` | `projects.write` | Take a lifecycle action on a Project | **destructive**, needs `confirmToken` |
| `projects_update` | `projects.write` | Update a Project's details (never its status) |  |
| `projects_update_forecast` | `projects.write` | Record a Project's revised final cost |  |
| `property_model_approved_on` | `phi.read` | The approved property model on a date or across a period | read-only |
| `property_model_field_history` | `phi.read` | Every value one property-model field has held | read-only |
| `property_model_get` | `phi.read` | The hotel's property model, with every record | read-only |
| `property_model_list_versions` | `phi.read` | The hotel's property-model versions | read-only |
| `property_model_review` | `phi.read` | The property model's review: section states, totals and submission blockers | read-only |
| `property_model_save_draft` | `phi.write` | Save one section of the hotel's draft property model |  |
| `property_model_sections` | `phi.read` | The property model's sections, fields and answers | read-only |
| `property_model_setup_overview` | `phi.read` | The hotel's PHI setup overview: workstreams, readiness and blockers | read-only |
| `property_model_submit` | `phi.write` | Submit the hotel's property model for Cadae review |  |
| `risk_findings_create` | `risks.write` | Open a risk finding |  |
| `risk_findings_create_event` | `risks.write` | Put a risk finding on the PHI timeline |  |
| `risk_findings_get` | `risks.read` | One risk finding | read-only |
| `risk_findings_list` | `risks.read` | Risk findings I can see, filtered | read-only |
| `risk_findings_promote_from_gap` | `risks.write` | Promote a data gap into a risk finding |  |
| `risk_findings_transition` | `risks.write` | Move a risk finding to another status | **destructive**, needs `confirmToken` |
| `risk_findings_update` | `risks.write` | Edit a risk finding |  |
| `savings_tasks_assign` | `tasks.write` | Assign or clear a task's owner and, when given, replace its contributors (active people with access to the hotel) |  |
| `savings_tasks_block` | `tasks.write` | Block a task — the reason, what is needed, and who is responsible where known |  |
| `savings_tasks_cancel` | `tasks.write` | Cancel a task with a reason (a required task is a documented exception only with an exception note) | **destructive**, needs `confirmToken` |
| `savings_tasks_complete` | `tasks.write` | Complete a task — refused until every required answer and document is there and its dependency is complete or overridden; what it proposes waits for confirmation |  |
| `savings_tasks_create` | `tasks.write` | Add a Savings Task to a Project, with its owner, contributors and completion fields |  |
| `savings_tasks_fields_set` | `tasks.write` | Replace a task's completion fields (eight types, no conditions; an answered field keeps its type) |  |
| `savings_tasks_get` | `tasks.read` | One Savings Task, with its fields, answers and readiness to complete | read-only |
| `savings_tasks_list` | `tasks.read` | A hotel's Savings Tasks across its Projects, with overdue derived in the hotel's time zone | read-only |
| `savings_tasks_list_for_portfolio` | `tasks.read` | Savings Tasks across the Portfolio's hotels where Savings Tasks is on (an Owner's view) | read-only |
| `savings_tasks_list_for_project` | `tasks.read` | A Project's Savings Tasks — fields, answers, readiness to complete and what each waits on | read-only |
| `savings_tasks_override_dependency` | `tasks.write` | Let a task complete past an open dependency — an Owner's or an Administrator's, with a reason kept in history |  |
| `savings_tasks_proposals_accept` | `projects.write` | Confirm a task's proposal — the target's own command applies it (a quote is created, a milestone completed, an asset answer saved, a document filed) |  |
| `savings_tasks_proposals_list` | `tasks.read` | What completed tasks propose to change on a Project — current beside proposed, pending until confirmed | read-only |
| `savings_tasks_proposals_reject` | `projects.write` | Reject a task's proposal — kept as history; nothing about the Project changes |  |
| `savings_tasks_responses_submit` | `tasks.write` | Answer one completion field of an open task — a document for a photograph or a file; a blank answer clears it |  |
| `savings_tasks_start` | `tasks.write` | Start a task (Not started → In progress) |  |
| `savings_tasks_unblock` | `tasks.write` | Unblock a task — it returns to the status it had |  |
| `savings_tasks_update` | `tasks.write` | Replace an open task's details (a changed dependency drops an earlier override) |  |
| `source_record_charges_list` | `phi.read` | The charge lines of a set of records | read-only |
| `source_records_mark_duplicate` | `phi.write` | Mark a record as a duplicate of another |  |
| `source_records_resolve_duplicate` | `phi.write` | Clear a record's duplicate flag |  |
| `source_records_void` | `phi.write` | Void a utility source record |  |
| `usage_areas_remove` | `phi.write` | Remove a usage area from the hotel's draft property model | **destructive**, needs `confirmToken` |
| `usage_areas_upsert` | `phi.write` | Create or change a usage area of the hotel's draft property model |  |
| `viewer_me` | `viewer.read` | Current user profile | read-only |
{/* parity:doors — end generated. */}

Every tool takes an optional `organisationId`. Leave it out and the credential's
own Portfolio is used; a credential bound to one Portfolio may not name another.

## Refusals

A refused tool call comes back as a tool error whose text is a sentence. When the
refusal is one you may want to tell apart, a second line carries a machine-readable
token:

```
this hotel does not have that module enabled
reason: MODULE_DISABLED
```

`MODULE_DISABLED` means the Hotel does not have that module enabled — it is **not**
an empty result and must never be reported as a zero. Call `hotel_modules` for the
Hotel's own flags. A refusal with no `reason:` line is an access refusal, and says
nothing about the Hotel's modules.

## Authentication

- **OAuth** (recommended) — the client walks the standard flow and receives
  per-user tools.
- **Bearer token** — `cad_osk_…` / `cad_pat_…` for automation.

## Clients

- Claude: `claude mcp add --transport http cadae https://api.cadae.ai/mcp`
- ChatGPT: Settings → Connectors → Create → paste the URL
- Cursor: one-click deep link on [the MCP page](https://cadae.ai/en-GB/mcp/cursor)

