> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nouxdigital.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Tool reference

> All tools exposed by the Noux MCP server.

All tools require a valid personal MCP token or OAuth access token. Responses are JSON with `structuredContent` and a text `content` field.

## Scopes and tool annotations

| Scope       | What it unlocks                                                     |
| ----------- | ------------------------------------------------------------------- |
| `mcp:read`  | All read tools below (default for personal tokens and Claude OAuth) |
| `mcp:write` | Write tools — only registered when the token includes this scope    |

Call `get_info` after connecting. When write access is granted, `capabilities` includes both `read_only` and `write`.

**Read tools** use MCP annotations `readOnlyHint: true` and `destructiveHint: false`.

**Write tools** use `readOnlyHint: false` and `destructiveHint: false`. They create or queue side effects in your organization (comments, notifications, background jobs). Each write tool also checks your **room role** — the same permissions as in the Noux app.

| Write tool                                 | Room permission required                                                               |
| ------------------------------------------ | -------------------------------------------------------------------------------------- |
| `add_room_comment`                         | **Commenting** — room owner, assisting seller, org member visitor, or external visitor |
| `send_room_invitations`                    | **ShareRoom** — room owner, assisting seller, org member visitor, or external visitor  |
| `send_room_update_notifications`           | **EditRoom** — room owner or assisting seller                                          |
| `add_key_document_to_rooms`                | **EditRoom** on every target room                                                      |
| `create_mutual_action_plan`                | **EditRoom**                                                                           |
| `update_mutual_action_plan`                | **EditRoom**                                                                           |
| `add_mutual_action_plan_item`              | **EditRoom**                                                                           |
| `update_mutual_action_plan_item`           | **EditRoom**                                                                           |
| `set_mutual_action_plan_item_participants` | **EditRoom**                                                                           |
| `set_mutual_action_plan_item_status`       | **EditRoom** for sellers; assignee may toggle their own items                          |

Organization members who can view a room but are not room members (**OrganizationMemberViewer**) can read conversations but cannot post comments via MCP.

## Pagination conventions

Several tools paginate results. Common patterns:

| Pattern      | Tools                                                                                                 | How to continue                                                                            |
| ------------ | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
| Cursor by id | `get_light_rooms`, `get_light_notetaker_meetings`, `get_room_conversation`, `get_mutual_action_plans` | Pass the last item's id as `fromRoomId`, `fromMeetingId`, `fromCommentId`, or `fromPlanId` |
| Cursor pair  | `get_room_comments`, `get_room_activities`                                                            | Pass both `cursorCreatedAt` and `cursorId` from `nextCursor`                               |
| `hasMore`    | Most paginated tools                                                                                  | When `true`, fetch the next page                                                           |

Default `pageSize` is **50** where not specified. Minimum and maximum limits vary per tool.

***

## get\_info

Returns connection metadata for the authenticated token.

**Inputs:** none

**Output highlights:**

| Field            | Description                                                                 |
| ---------------- | --------------------------------------------------------------------------- |
| `organizationId` | Your Noux organization id                                                   |
| `userId`         | Your user id (token acts as you)                                            |
| `mcpVersion`     | MCP API version (e.g. `1.0.0`)                                              |
| `capabilities`   | Includes `read_only`; includes `write` when the token has `mcp:write` scope |

Use this tool first to verify authentication.

***

## get\_organization\_members

Lists users in your organization.

**Inputs:** none

**Output:** `members` — array of `{ id, email, firstName, lastName }`

***

## get\_light\_rooms

Paginated list of sales rooms with owner, editors, visitors, pending invitees, and linked notetaker meeting ids. Sorted newest first.

**Inputs:**

| Field         | Type   | Description                                   |
| ------------- | ------ | --------------------------------------------- |
| `pageSize`    | number | Optional. 2–100, default 50                   |
| `fromRoomId`  | string | Optional. Start from this room id (inclusive) |
| `ownerUserId` | string | Optional. Filter by room owner                |

**Output:** `rooms`, `hasMore`, `pageSize`

Each room includes `roomId`, `roomName`, `owner`, `editors`, `visitors`, `pendingInvitees`, `notetakerMeetingIds`, and timestamps.

Each `pendingInvitee` includes `invitationId`, `inviteeEmail`, `inviteeFirstName`, `inviteeLastName`, and `status` — use `inviteeEmail` with `send_room_update_notifications` when recipients have not joined yet.

***

## get\_light\_notetaker\_meetings

Paginated list of notetaker meetings with creator, light participants, key coaching scores, and playbook summary. Excludes transcript and media.

**Inputs:**

| Field            | Type                  | Description                          |
| ---------------- | --------------------- | ------------------------------------ |
| `pageSize`       | number                | Optional. 2–100, default 50          |
| `fromMeetingId`  | string                | Optional. Pagination cursor          |
| `creatorUserIds` | string\[]             | Optional. Filter by creator user ids |
| `createdAfter`   | string (ISO datetime) | Optional. Lower bound                |
| `createdBefore`  | string (ISO datetime) | Optional. Upper bound                |

**Output:** `meetings`, `hasMore`, `pageSize`

***

## get\_notetaker\_meeting

Full notetaker meeting detail including speaker-attributed transcript, AI summary, and coach analysis. Excludes playbook analysis (use `get_notetaker_playbook_analysis`).

**Inputs:**

| Field       | Type   | Description |
| ----------- | ------ | ----------- |
| `meetingId` | string | Required    |

**Output highlights:** `transcript` (turns with speaker, timing, text), `summary` (short/long summary, action items, next topics), `coaching` (customer and salesperson evaluations)

***

## get\_notetaker\_playbook\_analysis

Playbook analysis for a notetaker meeting, or `null` when not available yet.

**Inputs:**

| Field       | Type   | Description |
| ----------- | ------ | ----------- |
| `meetingId` | string | Required    |

***

## get\_room\_comments

List room comments across your organization with optional filters. Newest first.

**Inputs:**

| Field             | Type                  | Description                                            |
| ----------------- | --------------------- | ------------------------------------------------------ |
| `authorId`        | string                | Optional filter                                        |
| `authorEmail`     | string                | Optional filter                                        |
| `authorFirstName` | string                | Optional filter                                        |
| `authorLastName`  | string                | Optional filter                                        |
| `roomId`          | string                | Optional filter                                        |
| `topLevelOnly`    | boolean               | Optional. Default `false`. Exclude replies when `true` |
| `createdAfter`    | string (ISO datetime) | Optional                                               |
| `createdBefore`   | string (ISO datetime) | Optional                                               |
| `pageSize`        | number                | Optional. 1–200, default 50                            |
| `cursorCreatedAt` | string (ISO datetime) | Pagination — must pair with `cursorId`                 |
| `cursorId`        | string                | Pagination — must pair with `cursorCreatedAt`          |

<Note>
  At least one of `authorId`, `authorEmail`, `authorFirstName`, `authorLastName`, or `roomId` is required.
</Note>

**Output:** `comments`, `hasMore`, `pageSize`, `nextCursor`

***

## get\_room\_conversation

Paginated room conversation: pinned comments on the first page only, then unpinned top-level comments (oldest first) with nested replies, authors, timestamps, pinned/AI flags, and reaction summaries.

**Inputs:**

| Field           | Type   | Description                            |
| --------------- | ------ | -------------------------------------- |
| `roomId`        | string | Required                               |
| `pageSize`      | number | Optional. 2–100, default 50            |
| `fromCommentId` | string | Optional. Fetch more from this comment |

**Output:** `pinnedComments`, `comments`, `totalNumComments`, `hasMore`, `nextFromCommentId`, `pageSize`

***

## get\_room\_invitations

Room invitations filtered by room and/or invitor. Newest first.

**Inputs:**

| Field             | Type                  | Description                                   |
| ----------------- | --------------------- | --------------------------------------------- |
| `roomId`          | string                | Optional filter                               |
| `invitorId`       | string                | Optional filter                               |
| `invitorEmail`    | string                | Optional filter                               |
| `pageSize`        | number                | Optional. 1–200, default 50                   |
| `cursorCreatedAt` | string (ISO datetime) | Pagination — must pair with `cursorId`        |
| `cursorId`        | string                | Pagination — must pair with `cursorCreatedAt` |

<Note>
  At least one of `roomId`, `invitorId`, or `invitorEmail` is required.
</Note>

<Note>
  Invitation message and email subject are only included for invitations **you** sent. Your personal token acts as you.
</Note>

**Output:** invitations list, `hasMore`, `nextCursor`, `pageSize`

***

## get\_room\_invitation\_defaults

Preview the resolved invitation defaults for a room before calling `send_room_invitations`. This is a **read** tool (no `mcp:write` scope required) but still checks **ShareRoom** permission on the target room.

**Inputs:**

| Field          | Type   | Description                                                                               |
| -------------- | ------ | ----------------------------------------------------------------------------------------- |
| `roomId`       | string | Required                                                                                  |
| `inviteeEmail` | string | Optional. When provided, link-type resolution filters to that invitee (reinvite scenario) |

**Output:**

| Field               | Description                                                                                             |
| ------------------- | ------------------------------------------------------------------------------------------------------- |
| `roomId`            | Echo of the requested room                                                                              |
| `linkType`          | `MagicLink` or `VisitorToken` — same resolution as the Share Room form                                  |
| `emailSubject`      | Default subject with merge tags resolved for the actor                                                  |
| `invitationMessage` | Default HTML message body (may still contain per-recipient merge tags such as `{recipient_first_name}`) |

***

## get\_mutual\_action\_plans

Paginated mutual action plans (MAPs) for your organization. Each plan includes nested items with title, `bodyPlainText` (preferred for reading descriptions), stored HTML `body`, status, due dates, assignee, and follower participants. Sorted by most recently updated first.

**Inputs:**

| Field               | Type                                  | Description                                                                |
| ------------------- | ------------------------------------- | -------------------------------------------------------------------------- |
| `pageSize`          | number                                | Optional. 2–100, default 50                                                |
| `fromPlanId`        | string                                | Optional. Pagination cursor — pass `nextFromPlanId` from the previous page |
| `roomId`            | string                                | Optional. Limit to one room                                                |
| `itemStatus`        | `"open"` \| `"done"`                  | Optional. Item-level filter                                                |
| `assigneeUserId`    | string                                | Optional. Item assignee user id                                            |
| `assigneeEmail`     | string                                | Optional. Item assignee email                                              |
| `participantUserId` | string                                | Optional. Follower participant user id                                     |
| `participantEmail`  | string                                | Optional. Follower participant email                                       |
| `involvesUserId`    | string                                | Optional. Assignee or follower user id                                     |
| `involvesUserEmail` | string                                | Optional. Assignee or follower email                                       |
| `dueDateUrgency`    | `"overdue"` \| `"urgent"` \| `"soon"` | Optional. Open items only; see urgency definitions below                   |
| `dueBefore`         | string (ISO datetime)                 | Optional. Open items with due date on or before                            |
| `dueAfter`          | string (ISO datetime)                 | Optional. Open items with due date on or after                             |

<Note>
  Item-level filters return only matching items inside each plan. `progress` and `itemCounts.totalInPlan` always reflect the **full** plan. `itemCounts.returned` is the number of items in the response after filtering.
</Note>

**Output:** `plans`, `hasMore`, `pageSize`, `nextFromPlanId`

Each plan includes `id`, `roomId`, `roomName`, `title`, `sectionDescription`, `sectionOrder`, `createdAt`, `updatedAt`, `progress`, `itemCounts`, and `items`.

**Progress fields:** `doneCount`, `openCount`, `totalCount`, `percentDone`, `overdueOpenCount`

**Item fields:** `id`, `order`, `title`, `bodyParagraphs` (preferred for edits; `""` = blank line), `bodyPlainText`, `body` (stored HTML), `hasBody`, `status` (`open` | `done`), `doneAt`, `dueDateAt`, `dueDateUrgency`, `assignee`, `participants`

Assignees and participants include `id`, `email`, `firstName`, `lastName`, and `roomParticipantRole` (`Owner`, `Editor`, `Visitor`, or `Pending` for invitees not yet in the room).

**Due date urgency** (on items and for the `dueDateUrgency` filter on open items with a due date):

| Value     | Meaning                                                   |
| --------- | --------------------------------------------------------- |
| `overdue` | Due date is in the past                                   |
| `urgent`  | Due within the next 24 hours                              |
| `soon`    | Due between 24 and 48 hours from now                      |
| `none`    | No due date, item is done, or due more than 48 hours away |

***

## get\_mutual\_action\_plan

Returns one mutual action plan by id with all items, section title and description, room context, progress summary, and full item details.

**Inputs:**

| Field    | Type   | Description |
| -------- | ------ | ----------- |
| `planId` | string | Required    |

**Output:** Same plan shape as a single entry in `get_mutual_action_plans` (`plans` array), with all items included (no item-level filters).

***

## list\_key\_document\_folders

Lists organization **key document** folders (Materials, References, and other library folders) with document counts visible to you.

**Inputs:** none

**Output:** `folders` — array of `{ folderId, name, order, documentCount, isEditableByMember }`

Use this before `list_key_documents` to discover folder ids, or before `add_key_document_to_rooms` to understand your organization's document library layout.

***

## list\_key\_documents

Paginated list of organization key documents (the shared library you can spread into rooms). Sorted by attachment order within folders.

**Inputs:**

| Field              | Type   | Description                                                                                                                       |
| ------------------ | ------ | --------------------------------------------------------------------------------------------------------------------------------- |
| `pageSize`         | number | Optional. 2–100, default 50                                                                                                       |
| `fromAttachmentId` | string | Optional. Pagination cursor — pass `nextFromAttachmentId` from the previous page                                                  |
| `folderId`         | string | Optional. Limit to one folder                                                                                                     |
| `search`           | string | Optional. Case-insensitive title search                                                                                           |
| `type`             | string | Optional. Attachment type filter: `FILE_UPLOAD_ATTACHMENT`, `LINK_ATTACHMENT`, `LOOM_VIDEO_ATTACHMENT`, or `REFERENCE_ATTACHMENT` |

**Output:** `documents`, `hasMore`, `pageSize`, `nextFromAttachmentId`

Each document includes `keyDocumentId`, `attachmentId`, `title`, `type`, `folderId`, `folderName`, `order`, `promoted`, `creator`, `roomAttachmentCount` (how many rooms already contain a copy), `aiContext`, and optional `mimeType` / `url` when visible to you.

***

## get\_room\_activities

Low-level activity rows for reporting. Useful for analytics and audit-style queries.

**Inputs:**

| Field                  | Type                  | Description                                   |
| ---------------------- | --------------------- | --------------------------------------------- |
| `createdAfter`         | string (ISO datetime) | Required                                      |
| `createdBefore`        | string (ISO datetime) | Required                                      |
| `pageSize`             | number                | Optional. 1–200, default 50                   |
| `roomIds`              | string\[]             | Optional. Limit to specific rooms             |
| `activityTypes`        | string\[]             | Optional. Filter by activity type             |
| `cursorCreatedAt`      | string (ISO datetime) | Pagination — must pair with `cursorId`        |
| `cursorId`             | string                | Pagination — must pair with `cursorCreatedAt` |
| `includeCommentBodies` | boolean               | Optional. Default `false`                     |

<Warning>
  The time range from `createdAfter` to `createdBefore` must not exceed **400 days**.
</Warning>

**Output:** `activities`, `hasMore`, `nextCursor`, `pageSize`

Each activity includes `type`, `createdAt`, `roomId`, `actor`, and optional `commentValue` when `includeCommentBodies` is enabled.

***

## Write tools

Write tools require the `mcp:write` scope on your token. They are not listed in clients that only have read access. Personal tokens created with write access (or OAuth clients that request `mcp:write`) expose these tools alongside the read tools.

All write tools act **as you** — the authenticated user id from the token is recorded as the actor.

***

### add\_room\_comment

Posts a new top-level comment or a reply in a room conversation. The comment appears immediately in the room; use `get_room_conversation` to read it back.

**Permission:** **Commenting** on the target room.

**Inputs:**

| Field      | Type    | Description                                                                                               |
| ---------- | ------- | --------------------------------------------------------------------------------------------------------- |
| `roomId`   | string  | Required. Target room                                                                                     |
| `value`    | string  | Required. Comment body (1–10,000 characters). Supports the same rich-text / mention syntax as the Noux UI |
| `parentId` | string  | Optional. Reply to this top-level comment id (must belong to `roomId`)                                    |
| `askAi`    | boolean | Optional. Default `false`. When `true`, queues an AI reply job for the new comment                        |

**Output:**

| Field       | Description                         |
| ----------- | ----------------------------------- |
| `commentId` | Id of the created comment           |
| `roomId`    | Echo of the target room             |
| `isReply`   | `true` when `parentId` was provided |

**Side effects:**

* Records an `AddComment` activity and bumps the room's `updatedAt`
* Queues CRM sync (`crm/sendRoomCommentToCrm`)
* When `askAi` is `true`, queues AI reply generation
* When you are an **external visitor**, queues email notifications to sellers (same as posting from the room UI)

Sellers and org member visitors can post comments but do not get automatic email notifications — use `send_room_update_notifications` to notify specific people after posting.

***

### send\_room\_invitations

Queues initial invitation emails to one or more invitees. Returns immediately; sending runs in the background.

**Permission:** **ShareRoom** on the target room (same as sharing from the room UI).

**Inputs:**

| Field               | Type                              | Description                                                                                                                                            |
| ------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `roomId`            | string                            | Required                                                                                                                                               |
| `invitees`          | object\[]                         | Required. 1–50 invitees; each must include `email`, `firstName`, and `lastName` (1–100 characters each). Ask the user for missing names before calling |
| `emailSubject`      | string                            | Optional. 3–200 characters. Omit with `invitationMessage` and `linkType` to use organization/room defaults                                             |
| `invitationMessage` | string                            | Optional. 10–10,000 characters. Omit with `emailSubject` and `linkType` to use defaults                                                                |
| `linkType`          | `"MagicLink"` \| `"VisitorToken"` | Optional. Magic link vs personalized link. Omit to resolve from org default and your invitation history (same as the Share Room form)                  |
| `embedThumbnail`    | boolean                           | Optional. Include room thumbnail in the invitation email                                                                                               |
| `remind`            | boolean                           | Optional. Schedule invitation reminder emails                                                                                                          |

**Output:**

| Field      | Description                                                          |
| ---------- | -------------------------------------------------------------------- |
| `accepted` | Always `true` when the job is queued                                 |
| `traceId`  | Correlation id for the invitation batch (`mcp-<userId>-<timestamp>`) |

**Typical workflow:**

1. `get_light_rooms` — resolve room name to `roomId`, check existing members and `pendingInvitees`
2. `get_room_invitation_defaults` — optional preview of `linkType`, `emailSubject`, and `invitationMessage` before sending (read tool; ShareRoom on the room)
3. `send_room_invitations` — e.g. `{ "roomId": "...", "invitees": [{ "email": "pekka.virtanen@example.com", "firstName": "Pekka", "lastName": "Virtanen" }] }` with no subject, message, or link type for defaults
4. `get_room_invitations` — confirm the new pending invitation after the job completes

***

### send\_room\_update\_notifications

Queues email notifications to selected room members and/or pending invitees about a room update. Returns immediately; delivery runs in the background.

**Permission:** **EditRoom** on the target room.

**Inputs:**

| Field                    | Type      | Description                                                                                                               |
| ------------------------ | --------- | ------------------------------------------------------------------------------------------------------------------------- |
| `roomId`                 | string    | Required                                                                                                                  |
| `recipientUserIds`       | string\[] | Optional. Room member user ids (default `[]`). At least one of `recipientUserIds` or `recipientInviteeEmails` is required |
| `recipientInviteeEmails` | string\[] | Optional. Pending invitee emails (default `[]`). At least one of the two recipient fields is required                     |
| `emailSubject`           | string    | Required. 3–200 characters                                                                                                |
| `emailMessage`           | string    | Required. 10–10,000 characters                                                                                            |
| `embedThumbnail`         | boolean   | Optional. Include room thumbnail in email                                                                                 |
| `remind`                 | boolean   | Optional. Send as a reminder-style notification                                                                           |

**Output:**

| Field      | Description                                                            |
| ---------- | ---------------------------------------------------------------------- |
| `accepted` | Always `true` when the job is queued                                   |
| `traceId`  | Correlation id for the notification batch (`mcp-<userId>-<timestamp>`) |

Use `get_light_rooms` for member user ids (`visitors`, `editors`, `owner`) and pending invitee emails (`pendingInvitees[].inviteeEmail`). You can notify pending invitees only — omit `recipientUserIds` when every recipient is still an invitee.

**Example (pending invitees only):**

```json theme={null}
{
  "roomId": "...",
  "recipientInviteeEmails": ["bill@example.com", "leslie@example.com"],
  "emailSubject": "Updated proposal",
  "emailMessage": "Hi {recipient_first_name}, we added new materials to the room."
}
```

***

### add\_key\_document\_to\_rooms

Queues a background job to copy an organization **key document** into one or more rooms. Returns as soon as the job is accepted; copying runs asynchronously.

**Permission:** **EditRoom** on **every** room in `roomIds`.

**Inputs:**

| Field                          | Type      | Description                                                                                                                                                   |
| ------------------------------ | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `attachmentId`                 | string    | Required. Key document attachment id from `list_key_documents`                                                                                                |
| `roomIds`                      | string\[] | Required. 1–2000 room ids (deduplicated server-side)                                                                                                          |
| `placementBase`                | string    | Optional. `"promoted"` (default) or `"first_materials"` — where to place the copy                                                                             |
| `attachmentPosition`           | string    | Optional. `"first"` (default) or `"last"` within the target folder or promoted area                                                                           |
| `targetFolderNamesPrioritized` | string\[] | Optional. Up to 10 folder names, tried in order when resolving placement                                                                                      |
| `notifyVisitorsAfterAdd`       | boolean   | Optional. When `true`, email visitors after the document is added                                                                                             |
| `visitorNotificationTemplates` | object\[] | Optional. Required when notifying — up to 20 per-language templates with `languageCode`, `subjectTemplate` (3–200 chars), `messageTemplate` (10–10,000 chars) |

**Output:**

| Field   | Description                                                                                 |
| ------- | ------------------------------------------------------------------------------------------- |
| `jobId` | Worker job id — use for support or monitoring; there is no MCP poll tool for job status yet |

**Typical workflow:**

1. `list_key_document_folders` / `list_key_documents` — find `attachmentId`
2. `get_light_rooms` — confirm target `roomIds`
3. `add_key_document_to_rooms` — queue the spread
4. `get_light_rooms` or room UI — verify `roomAttachmentCount` increased after the job completes

***

### create\_mutual\_action\_plan

Creates a new mutual action plan section in a room. Returns the full plan (initially with no items).

**Permission:** **EditRoom** on the target room.

**Inputs:**

| Field          | Type   | Description                                 |
| -------------- | ------ | ------------------------------------------- |
| `roomId`       | string | Required                                    |
| `title`        | string | Optional. Section title, max 120 characters |
| `sectionOrder` | number | Optional. Order among room sections         |

**Output:** Full plan object (same shape as `get_mutual_action_plan`).

***

### update\_mutual\_action\_plan

Updates a mutual action plan section title.

**Permission:** **EditRoom** on the target room.

**Inputs:**

| Field    | Type   | Description                  |
| -------- | ------ | ---------------------------- |
| `roomId` | string | Required                     |
| `planId` | string | Required                     |
| `title`  | string | Required. Max 120 characters |

**Output:** Full updated plan.

***

### add\_mutual\_action\_plan\_item

Adds a task item to a mutual action plan.

**Permission:** **EditRoom** on the target room.

**Inputs:**

| Field    | Type   | Description                                                                                                |
| -------- | ------ | ---------------------------------------------------------------------------------------------------------- |
| `roomId` | string | Required                                                                                                   |
| `planId` | string | Required                                                                                                   |
| `title`  | string | Required. 1–200 characters                                                                                 |
| `body`   | string | Optional. Plain-text description (use blank lines for paragraphs; do not send HTML), max 10,000 characters |

**Output:** Full updated plan including the new item.

***

### update\_mutual\_action\_plan\_item

Updates a MAP item's title, plain-text description (`body`), due date, or assignee. Omit fields to leave them unchanged.

**Permission:** **EditRoom** on the target room.

**Inputs:**

| Field            | Type                                  | Description                                                                                                                                                       |
| ---------------- | ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `roomId`         | string                                | Required                                                                                                                                                          |
| `planId`         | string                                | Required                                                                                                                                                          |
| `itemId`         | string                                | Required                                                                                                                                                          |
| `title`          | string                                | Optional. 1–200 characters                                                                                                                                        |
| `body`           | string                                | Optional. Plain-text description that replaces the current text (do not send HTML), max 10,000 characters                                                         |
| `bodyParagraphs` | string\[]                             | Optional. Preferred. Paragraph list from read response; use `""` for blank lines. Replaces the full description. Mutually exclusive with `body` and `appendBody`. |
| `appendBody`     | string                                | Optional. Plain text appended as a new paragraph at the end. Mutually exclusive with `body` and `bodyParagraphs`.                                                 |
| `dueDateAt`      | string (ISO datetime) \| `null`       | Optional. Set or clear due date                                                                                                                                   |
| `assignee`       | `null` \| `{ userId }` \| `{ email }` | Optional. `null` clears assignee; `email` supports pending invitees                                                                                               |

Assignee values are canonicalized against current room membership (same rules as the Noux UI).

**Output:** Full updated plan.

***

### set\_mutual\_action\_plan\_item\_participants

Replaces follower participants on a MAP item (not the assignee). Pass an empty array to clear all followers.

**Permission:** **EditRoom** on the target room.

**Inputs:**

| Field          | Type      | Description                                                     |
| -------------- | --------- | --------------------------------------------------------------- |
| `roomId`       | string    | Required                                                        |
| `planId`       | string    | Required                                                        |
| `itemId`       | string    | Required                                                        |
| `participants` | object\[] | Required. Up to 40 entries; each is `{ userId }` or `{ email }` |

**Output:** Full updated plan.

***

### set\_mutual\_action\_plan\_item\_status

Marks a MAP item `open` or `done`.

**Permission:** Room **owner** or **assisting seller** may toggle any item. Other room members may only toggle items assigned to them (by user id or email).

**Inputs:**

| Field    | Type                 | Description |
| -------- | -------------------- | ----------- |
| `roomId` | string               | Required    |
| `planId` | string               | Required    |
| `itemId` | string               | Required    |
| `status` | `"open"` \| `"done"` | Required    |

**Output:** Full updated plan.

**Typical workflow:**

1. `get_light_rooms` — resolve `roomId`
2. `get_mutual_action_plans` with `roomId` filter — find `planId` and item ids
3. `update_mutual_action_plan_item` / `set_mutual_action_plan_item_participants` / `set_mutual_action_plan_item_status` — apply changes
4. `get_mutual_action_plan` — confirm final state (write tools also return the updated plan)

***

## Related

* [MCP overview](/mcp/overview)
* [Getting started](/mcp/getting-started)
* [REST API](/api/overview) — additional automation beyond MCP
