# MCP tools for projects, feedback, and context

Create or select an MCP project, read its business context, and submit bounded feedback without confusing these actions with publication.

Available on the Grow, Scale, and Pro plans.

Use these MCP tools to create or select a project, read its business context, or send feedback about MCP usage. To discover projects, read the [configuration overview resource](https://rightmessage.com/help/mcp-prompts-and-resources). There is no `list-projects` tool.

Examples are illustrative and were not executed. Requests show parameters for MCP `tools/call`; responses show decoded JSON or text content.

## MCP project selection and access

For project-specific operations, `project_id` is the public project ID, represented as a string. Calls follow the [shared MCP authorization and project-selection rules](https://rightmessage.com/help/mcp-authorization-reference). Pass an explicit ID when working across projects.

The authenticated user must belong to the project and have MCP access. Expired fixed-end trials are excluded. Errors include `Authentication required.`, `Invalid project_id: ...`, `Team not found for project_id: ...`, `You do not have access to this team.`, and `MCP access is not enabled for this team.` If no project can be resolved, the error asks for `project_id` or `set-active-project`.

## `create-project`

Creates a new project owned by the authenticated user and initializes its configuration.

| Argument  | Type   | Required | Rules                                                                                                                                                                                                              |
| --------- | ------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `name`    | string | Yes      | Nonempty, normalized project name, at most 80 characters. No links, email addresses, or mixed-alphabet lookalike words. A plain domain is allowed.                                                                 |
| `website` | string | Yes      | Domain, optionally prefixed with `http://` or `https://` and an optional trailing slash. At most 255 characters before normalization. No page path, query, fragment, port, credentials, whitespace, or IP address. |

There is no `project_id` argument because the project does not exist yet.

```json
{"name":"create-project","arguments":{"name":"WorkForge","website":"example.com"}}
```

```json
{"project_id":"123456789","name":"WorkForge","website":"example.com","message":"Project \"WorkForge\" created successfully. Use project_id \"123456789\" with other tools."}
```

The stored website is normalized to lowercase HTTPS, including ASCII conversion of internationalized domains. The response omits the scheme, so the example above returns `example.com`.

This immediately creates the project, attaches you as owner, creates or retrieves your billing customer record, and sets an account trial date when none exists. It doesn't start the project's own 14-day trial; publishing the project in RightMessage asks you to start it. It does not automatically set the MCP active project, install a snippet, or establish provider connections. Creation is not a draft operation.

Missing arguments and invalid names/domains return validation messages. Other failures return `Failed to create project. Please try again.` Some records can already have been created before a later step fails. Check the overview resource before repeating a failed request to avoid duplicate projects.

## `set-active-project`

Sets the default project for later calls that omit `project_id`.

**Argument:** required `project_id` string.

```json
{"name":"set-active-project","arguments":{"project_id":"123456789"}}
```

Illustrative text response:

```text
Active project set to: WorkForge (project_id: 123456789). You no longer need to pass project_id for subsequent tool calls. Integration-specific tools follow this project. If they do not appear, start a new chat.
```

The selection is cached for 24 hours and also persisted in supported token metadata, so it can survive that cache expiry. It is scoped to the current MCP token when one is available, otherwise the user. An explicit `project_id` still takes precedence on an individual call.

The server emits `notifications/tools/list_changed`, because connected-app tools depend on the selected project. Clients that do not refresh the tool list may need a new chat. This changes session selection, not the website configuration. Access is checked before selection is stored.

## `get-project-context`

Returns the stored business context and audience counts used to inform recommendations.

| Argument     | Type    | Required | Default                                          |
| ------------ | ------- | -------- | ------------------------------------------------ |
| `project_id` | string  | No       | Active or eligible project.                      |
| `no_cache`   | boolean | No       | `false`; set `true` to bypass the context cache. |

```json
{"name":"get-project-context","arguments":{"project_id":"123456789","no_cache":true}}
```

Illustrative response, with business context shortened:

```json
{"ai_context":"WorkForge helps teams plan client projects.","segment_counts":[{"id":"dim_example","name":"Business type","question":"What kind of business do you run?","segments":[{"id":"seg_agency","name":"Agency","count":120,"otherAnswers":[]}]}]}
```

`ai_context` contains the project's stored context. `segment_counts` is an array of published dimensions with `id`, `name`, nullable rendered `question`, and `segments`. Each segment contains `id`, `name`, `count`, and an `otherAnswers` array of associated open-ended responses. The retrieval path requests up to 1,000 such answers.

Counts use a recent 30-day audience window. The cache is keyed to the live configuration and retained for one hour. This is not a full configuration export, a draft inspection endpoint, or a request to generate new business research. A cache bypass refreshes retrieved context; it does not publish anything. Source answers may contain personal or sensitive information, so avoid forwarding the response to an unrelated service.

## `submit-feedback`

Submits a bug report, feature request, or success report about MCP usage. Submission queues delivery; it does not create a support conversation or prove final delivery.

| Argument             | Type   | Required | Limit and meaning                                             |
| -------------------- | ------ | -------- | ------------------------------------------------------------- |
| `project_id`         | string | No       | Active or eligible project.                                   |
| `kind`               | string | Yes      | `bug`, `feature`, or `success`.                               |
| `summary`            | string | Yes      | At most 240 characters.                                       |
| `details`            | string | Yes      | At most 4,000 characters.                                     |
| `evidence_type`      | string | Yes      | `user_reported`, `agent_observed`, or `agent_inferred`.       |
| `affected_tool`      | string | No       | At most 120 characters.                                       |
| `affected_resource`  | string | No       | At most 120 characters.                                       |
| `product_area`       | string | No       | At most 120 characters.                                       |
| `reported_model`     | string | No       | At most 120 characters.                                       |
| `reproduction`       | string | No       | At most 2,000 characters.                                     |
| `workaround`         | string | No       | At most 2,000 characters.                                     |
| `desired_outcome`    | string | No       | At most 2,000 characters.                                     |
| `related_request_id` | string | No       | At most 128 characters.                                       |
| `correlation_id`     | string | No       | At most 128 characters.                                       |
| `idempotency_key`    | string | No       | At most 128 characters; reuse for a retry of the same report. |

Text is trimmed; empty optional values are omitted, while empty required values fail. There are no nested objects or attachment arguments. Use `agent_inferred` for a hypothesis, not `agent_observed`.

```json
{"name":"submit-feedback","arguments":{"project_id":"123456789","kind":"feature","summary":"Add a filter to email listings","details":"WorkForge would like to find stored emails by name.","evidence_type":"user_reported","affected_tool":"list-personalized-emails","desired_outcome":"Search by email name.","idempotency_key":"workforge-email-filter-2026-10-13"}}
```

```json
{"status":"accepted","delivery":"queued","feedback_id":"example-feedback-id"}
```

The report includes your identity, project context, and an account snapshot. Do not include credentials or unnecessary visitor data. Submission has no draft or publication stage.

The default rate limit is 10 new reports per user per hour. The server can configure a different limit. Rate-limit errors include a retry delay. The same user's idempotency key is retained for 24 hours and returns the same accepted result on a retry. Use a new key for a different report. Duplicate requests still being processed, interrupted retry tracking, unavailable delivery configuration, invalid enums, excessive text, or queue failure return an error rather than claiming successful delivery.
