submit_feedback tool inside your server, and gives you an inbox in the Notra dashboard to triage what comes in.
How it works
- Copy your feedback URL from the Feedback page in your dashboard (in the GEO sidebar under Visibility).
- Register the feedback tool in your MCP server with
@usenotra/geo/feedback, or POST to the URL from your own tool implementation. - Feedback shows up in the Feedback inbox, where you can filter by status and kind and mark items as triaged, resolved or archived.
Your feedback URL
Every organization has its own feedback URL:feedback.read or feedback.write. POST /v1/feedback (without a slug) also accepts an API key with feedback.write for server-side integrations that already hold one.
Add the tool to your MCP server
server.ts
registerFeedbackTool adds a submit_feedback tool that accepts message, title, kind, sentiment and contextUrl, posts it to Notra and returns a short confirmation the agent can relay to the user (“Thanks, the feedback was sent to the team.” or “This feedback was already recorded.”). Options:
The package also exports
createFeedbackToolHandler(options) and feedbackToolInputSchema if you register tools yourself, and submitFeedback(input, { url }) for use outside MCP. submitFeedback posts a single entry and resolves with { id, deduplicated }; failures throw a FeedbackSubmitError with a status property.
REST endpoint
202 Accepted with the stored entry:
idempotencyKey to make retries safe: submitting the same key twice for the same organization returns the original entry with deduplicated: true. An unknown organization slug returns 404.
Automatic classification
Onlymessage is required. When title, kind or sentiment are omitted, Notra fills them in with a small model before storing the feedback, so the inbox stays readable and filterable even if the agent only sends free text. Values you pass explicitly are always kept. Classification runs through the same model gateway as the rest of Notra, so your organization’s zero data retention setting applies to it. If classification fails or no eligible model is available, the feedback is still stored, with kind: "other" and no title or sentiment.
Fields
Read and triage feedback
With an API key that hasfeedback.read, list entries with optional status, kind and projectId filters. Results are newest first and paginate with page and limit (default 25, max 100). See Pagination.
GET /v1/feedback/{feedbackId} returns one entry as { "feedback": ... }. To move an item through triage, PATCH /v1/feedback/{feedbackId} with feedback.write and a status of new, triaged, resolved or archived. Setting resolved stamps resolvedAt.
Rate limits
Submissions to your feedback URL are limited to 30 requests per 10 minutes per IP address and 200 requests per hour per organization. Because your MCP server is the one posting, a hosted server that serves many users from a single IP shares the IP budget; local (stdio) servers get a budget per user machine.POST /v1/feedback with an API key is limited to 120 requests per minute per key instead. Responses include the standard RateLimit-* headers described in Rate limits.