---
title: "feedback"
description: "Report a gap or problem with the MCP server to the team that maintains it."
canonical_url: https://developer.onepagecrm.com/mcp/tools/feedback/
source: Markdown mirror of https://developer.onepagecrm.com/mcp/tools/feedback/
---

`feedback` sends a report about the MCP server itself to the team that
maintains it. It is the channel for the problems the other tools cannot
express: a question that cannot be written as an OQL query, a field or
filter that does not exist, results that look wrong, or a schema that
[`describe`](/mcp/tools/describe/) and [`context`](/mcp/tools/context/)
left ambiguous.

It writes nothing to the CRM.

## Signature

```json
{
  "type": "object",
  "properties": {
    "message":         { "type": "string", "minLength": 1, "maxLength": 4000, "description": "What went wrong, in enough detail for someone who cannot see the conversation." },
    "category":        { "type": "string", "enum": ["missing_capability", "wrong_result", "unclear_schema", "tool_error", "other"] },
    "tool":            { "type": ["string", "null"], "description": "Which tool this concerns: describe, context, query, create or update." },
    "entity":          { "type": ["string", "null"], "description": "The entity involved: contacts, companies, deals, actions, notes, calls or meetings." },
    "attempted_query": { "type": ["object", "null"], "description": "For query problems, the OQL object that was tried." }
  },
  "required": ["message", "category"]
}
```

`category` is a closed enum — the five values below are the only ones
the schema accepts.

## Categories

| Category | Use when |
| -------- | -------- |
| `missing_capability` | No field, filter, or tool exists for what was asked. |
| `wrong_result` | The call succeeded but the data looked incorrect. |
| `unclear_schema` | `describe` or `context` was ambiguous or incomplete. |
| `tool_error` | A tool failed and the failure looks like a bug. |
| `other` | None of the above. |

## Example

A sample report:

```json
{
  "message": "Asked for deals closing next month grouped by owner. There was no way to express a date-function bucket alongside a scalar group_by without reading describe twice.",
  "category": "unclear_schema",
  "tool": "query",
  "entity": "deals",
  "attempted_query": {
    "from": "deals",
    "select": ["owner_id", "count()"],
    "group_by": ["owner_id"],
    "where": { "close_date": "NEXT_MONTH()" }
  }
}
```

A sample response — the id is illustrative, not a real report:

```json
{
  "feedback_id": "6a7ae8f2080f3803d57f8618",
  "category": "unclear_schema"
}
```

The `feedback_id` identifies the stored report. Quote it if you follow
up through [support](/support/).

## What happens to a report

Reports are read asynchronously by the team that maintains the server.
Nothing comes back through the tool — there is no reply, and no
notification to the user. Anything actionable becomes a tracked issue.

Including `attempted_query` makes a report far more useful: it turns a
description of a problem into something reproducible.

## Errors

- **Blank or oversized `message`** — rejected against the schema before
  the tool runs. `message` is capped at 4000 characters.
- **Unrecognised `category`** — rejected against the schema, which lists
  the accepted values.

`tool` and `entity` are plain strings with no enum behind them, so an
imprecise value never costs you the report. Both are optional and both
accept `null`.

## Scope

`mcp`. `feedback` writes no CRM data, so it needs only the base scope —
it is available on read-only tokens.
