Skip to main content
Glama

Sending feedback to Nansen

submit_feedback
Idempotent

Submit product feedback for the authenticated Nansen account. Costs zero credits, including with zero balance.

Send when the user requests or approves this report. Before a new automatic report, call get_feedback_preferences for a fresh account preference. If it is off, unconfigured or unavailable, show the report and ask before sending. If the user refuses or you cannot ask, do not send. Enabled permits sending subject to host controls. One report approval does not change the preference. Never enable it yourself. Host denial means no submission. A feedback_not_enabled refusal means stop automatic retries and tell the user the feature is not enabled for this account. Approval and saved preferences do not override rollout. Seven accepted reports per account per week across all clients, resetting Monday 00:00 UTC. Generate submission_id once per new report; reuse it and the exact report for retries and re-invocations. Never replace an ID after a timeout. Limits: description/goal/expected/observed/workaround 2,000 Unicode characters each; endpoint/tool 256; 10 distinct request IDs of 128 characters; client name/version 64; total JSON body 16 KiB UTF-8. Use category missing_capability for a feature request or a product gap. Missing capabilities need no endpoint, tool, or request ID. Omit secrets. Received means saved, not fixed. Failures preserve recovery guidance. No alternate-account or server-key fallback. Do not redirect failed submissions to unrelated feedback channels.

Input Schema

NameRequiredDescriptionDefault
requestYesOne product feedback report and the submission ID that makes retries safe.

Output Schema

NameRequiredDescriptionDefault
errorNo
receiptNo
successYes
next_actionYes
preferencesNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed14 schema fields changed
    • changedInput schema / properties / request / description
      Previous value: -"The S4 report fields plus the caller's stable retry identity."New value: +"One product feedback report and the submission ID that makes retries safe."
    • addedInput schema / properties / request / examples
      Added value: +[
      +  {
      +    "category": "missing_capability",
      +    "description": "I need to compare labels for 50 wallets, but I cannot find a bulk lookup.",
      +    "goal": "Compare labels across a list of wallets.",
      +    "submission_id": "5f0c1d2e-3a4b-4c5d-8e6f-7a8b9c0d1e2f"
      +  }
      +]
    • addedInput schema / properties / request / properties / category / description
      Added value: +"The type of problem. Use missing_capability for a feature request or a product gap."
    • addedInput schema / properties / request / properties / client / description
      Added value: +"The name and version of the client that sends the report. Nansen uses it for attribution only."
    • addedInput schema / properties / request / properties / description / description
      Added value: +"What occurred and what you needed."
    • addedInput schema / properties / request / properties / endpoint / description
      Added value: +"The API endpoint path that the report is about. Do not include a query string or credentials."
    • addedInput schema / properties / request / properties / expected_behavior / description
      Added value: +"What you expected to occur."
    • addedInput schema / properties / request / properties / goal / description
      Added value: +"What you tried to do."
    • addedInput schema / properties / request / properties / observed_behavior / description
      Added value: +"What occurred instead."
    • addedInput schema / properties / request / properties / request_ids / description
      Added value: +"Request IDs from your own requests that show the problem. Each ID must be different."
    • addedInput schema / properties / request / properties / submission_id / description
      Added value: +"Your ID for this report. Make a new ID for each new report. Use the same ID when you send the same report again."
    • addedInput schema / properties / request / properties / tool / description
      Added value: +"The name of the tool that the report is about."
    • addedInput schema / properties / request / properties / workaround / description
      Added value: +"A workaround that you used, if you used one."
    • changedOutput schema / properties / error / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "code": {
      -        "title": "Code",
      -        "type": "string"
      -      },
      -      "quota": {
      -        "anyOf": [
      -          {
      -            "properties": {
      -              "limit": {
      -                "const": 7,
      -                "title": "Limit",
      -                "type": "integer"
      -              },
      -              "remaining": {
      -                "maximum": 7,
      -                "minimum": 0,
      -                "title": "Remaining",
      -                "type": "integer"
      -              },
      -              "resets_at": {
      -                "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$",
      -                "title": "Resets At",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "limit",
      -              "remaining",
      -              "resets_at"
      -            ],
      -            "title": "FeedbackQuota",
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null
      -      },
      -      "reason": {
      -        "title": "Reason",
      -        "type": "string"
      -      },
      -      "request_id": {
      -        "anyOf": [
      -          {
      -            "maxLength": 128,
      -            "minLength": 1,
      -            "pattern": "^[A-Za-z0-9_-]+$",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "title": "Request Id"
      -      },
      -      "retry_after": {
      -        "anyOf": [
      -          {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "title": "Retry After"
      -      },
      -      "status": {
      -        "anyOf": [
      -          {
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "title": "Status"
      -      },
      -      "submission_id": {
      -        "anyOf": [
      -          {
      -            "maxLength": 128,
      -            "minLength": 1,
      -            "pattern": "^[A-Za-z0-9_-]+$",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "title": "Submission Id"
      -      }
      -    },
      -    "required": [
      -      "code",
      -      "reason"
      -    ],
      -    "title": "FeedbackError",
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "code": {
      +        "title": "Code",
      +        "type": "string"
      +      },
      +      "errors": {
      +        "anyOf": [
      +          {
      +            "items": {
      +              "description": "One field that failed validation. It never contains the field value.",
      +              "properties": {
      +                "code": {
      +                  "title": "Code",
      +                  "type": "string"
      +                },
      +                "field": {
      +                  "title": "Field",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "field",
      +                "code"
      +              ],
      +              "title": "FeedbackFieldError",
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Errors"
      +      },
      +      "quota": {
      +        "anyOf": [
      +          {
      +            "properties": {
      +              "limit": {
      +                "const": 7,
      +                "title": "Limit",
      +                "type": "integer"
      +              },
      +              "remaining": {
      +                "maximum": 7,
      +                "minimum": 0,
      +                "title": "Remaining",
      +                "type": "integer"
      +              },
      +              "resets_at": {
      +                "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$",
      +                "title": "Resets At",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "limit",
      +              "remaining",
      +              "resets_at"
      +            ],
      +            "title": "FeedbackQuota",
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null
      +      },
      +      "reason": {
      +        "title": "Reason",
      +        "type": "string"
      +      },
      +      "request_id": {
      +        "anyOf": [
      +          {
      +            "maxLength": 128,
      +            "minLength": 1,
      +            "pattern": "^[A-Za-z0-9_-]+$",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Request Id"
      +      },
      +      "retry_after": {
      +        "anyOf": [
      +          {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Retry After"
      +      },
      +      "status": {
      +        "anyOf": [
      +          {
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Status"
      +      },
      +      "submission_id": {
      +        "anyOf": [
      +          {
      +            "maxLength": 128,
      +            "minLength": 1,
      +            "pattern": "^[A-Za-z0-9_-]+$",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Submission Id"
      +      }
      +    },
      +    "required": [
      +      "code",
      +      "reason"
      +    ],
      +    "title": "FeedbackError",
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  2. Added

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes far beyond the annotations: zero-credit cost, a concrete rate limit (seven accepted reports per account per week, Monday 00:00 UTC reset), idempotency semantics for submission_id including the timeout rule, and the meaning of the feedback_not_enabled refusal. It also discloses side-effect limits ('Received means saved, not fixed', 'No alternate-account or server-key fallback') and a privacy rule ('Omit secrets').

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and cost are front-loaded, but the body is a dense block of policy prose without grouping, and the per-field character limits duplicate the schema's maxLength constraints. Several sentences (rollout, host denial, preference persistence) are individually useful but not separated by topic, making the operative rules hard to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a nested-object mutation with consent, rollout, rate-limit, and idempotency concerns, the description covers everything the schema and annotations cannot: consent gating, credit cost, quota, retry identity, refusal handling, and PII hygiene. An output schema exists, so return values need not be described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the field definitions already carry the load; the description adds genuine semantics on top: generate submission_id once per report and reuse the exact same ID and report on retries, use category missing_capability for feature requests, and missing_capability needs no endpoint/tool/request ID. The character-limit list largely restates schema maxLengths, capping the score below 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource ('Submit product feedback') scoped to 'the authenticated Nansen account', and adds the cost model ('Costs zero credits') immediately. The naming and framing make it clearly distinct from the sibling read tools get_feedback and get_feedback_preferences.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('Send when the user requests or approves this report'), prerequisites (call get_feedback_preferences first and check the preference), and when-not-to-use ('If the user refuses or you cannot ask, do not send', 'Never enable it yourself'). It also routes the agent back to the sibling while keeping submission separate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources