MCP server
heedback runs an MCP server, so an AI assistant such as Claude Code, Cursor or Claude Desktop can work with your feedback directly. You can ask "what are the top open requests on the Mobile board?", move a post to Planned, merge a duplicate or draft a changelog entry from a release note, all without opening the dashboard.
The MCP server is on the Team plan, like the public API. It uses the same API keys, and it stops working when they do: if your workspace leaves Team, or the Team trial ends, requests are refused.
What you need
-
An API key, created under Settings → API in the dashboard. Keys are shown once, so copy yours when you create it.
-
The server address:
https://heedback.frugalsaas.com/api/mcp
Your assistant sends the key as a bearer token in the Authorization header,
exactly as the API does.
Which key to use
| Key scope | What the assistant can do |
|---|---|
read ("Read only") | Read boards, posts, comments and the changelog. Write tools don't appear. |
write ("Read & write") | Everything below, including changing statuses and merging posts. |
write_only | Refused. The MCP server always needs to read. |
Use a read key for an assistant that only reads feedback. Anyone can write a post on your portal, and your assistant reads that text. A post could contain instructions aimed at the assistant. With a read key, the assistant can't act on them.
If you do give an assistant a write key, keep your client's approval prompt on for write tools, so you see each change before it happens. Changing a status emails the post's followers, and a merge can't be undone.
Connect your assistant
Claude Code
claude mcp add --transport http heedback https://heedback.frugalsaas.com/api/mcp \
--header "Authorization: Bearer $HEEDBACK_API_KEY"Cursor
Add this to .cursor/mcp.json (one project) or ~/.cursor/mcp.json (all
projects). ${env:HEEDBACK_API_KEY} reads the key from your environment, so it
never sits in the file:
{
"mcpServers": {
"heedback": {
"url": "https://heedback.frugalsaas.com/api/mcp",
"headers": { "Authorization": "Bearer ${env:HEEDBACK_API_KEY}" }
}
}
}Claude Desktop
Option 1: a custom connector. Open Settings → Connectors → Add custom
connector, enter the server address, and add a request header named
Authorization with the value Bearer followed by your key. The request
headers field is still rolling out, so your account may not have it yet. If it
doesn't, use option 2.
Option 2: mcp-remote. Add this to claude_desktop_config.json and
restart Claude Desktop. The header is passed through an environment variable
because the space in Bearer … would otherwise be split:
{
"mcpServers": {
"heedback": {
"command": "npx",
"args": [
"mcp-remote",
"https://heedback.frugalsaas.com/api/mcp",
"--header",
"Authorization:${HEEDBACK_AUTH}"
],
"env": { "HEEDBACK_AUTH": "Bearer YOUR_API_KEY" }
}
}
}ChatGPT
Not supported yet. ChatGPT only connects to servers that sign in with OAuth or need no sign-in at all, and heedback's server uses API keys.
Tools
| Tool | What it does | Key needed |
|---|---|---|
list_boards | Your boards, and your statuses with their id, key and label | read |
list_posts | Approved posts, most-voted first. Filter by board, status or text. Up to 50 at a time | read |
get_post | One post with its public comments (up to 50), and whether it has been approved by moderation | read |
list_changelog | Published changelog entries, newest first. Up to 50 | read |
create_post | Create a post on a board. Fires your post.created webhook and Slack message | write |
add_comment | Add a public comment to a post. Fires your comment.created webhook | write |
add_internal_note | Add a private internal note for your team only | write |
update_post_status | Move a post to another status. Emails the post's followers, as it does from the dashboard | write |
merge_posts | Merge a duplicate into another post. Votes and comments move over and the duplicate is closed | write |
create_changelog_draft | Create a changelog draft. Publishing stays in the dashboard | write |
A few things to know:
- Internal notes are write-only. An assistant can add one, but no tool ever returns a note, so notes never leave your dashboard. Adding one sends nothing: no email, webhook or Slack message.
- Statuses are matched by id or key, never by label. Labels can be renamed
and two can be the same, and a wrong match would email followers about the
wrong thing.
list_boardsgives the assistant both. - Merging is only available over MCP, not the REST API. It can't be undone.
- Long text is shortened. Post, comment and changelog bodies are cut at 4,000 characters, and the reply says when that happened.
- Posts made over MCP have no author.
create_postdoesn't accept a name or an email address, so a post can never be filed in someone else's name.
Limits
The MCP server and the API share one budget of 120 requests per minute per key. Every message the assistant sends counts, including the start of a session, which costs 2–3 requests with most clients today.
Troubleshooting
| Response | Meaning and fix |
|---|---|
401 unauthorized | The key is missing, mistyped or revoked. Check the Authorization header is Bearer followed by the full key. |
403 not_entitled | The workspace isn't on Team (or its trial has ended). See plans. |
403 insufficient_scope | A write_only key. The MCP server always needs to read, so use a read or read & write key. |
Tool error insufficient_scope | The assistant called a write tool with a read key. Use a read & write key if it should be able to make changes. |
403 origin_not_allowed | The request came from a web page. The MCP server only accepts requests from assistants and tools, not browsers. |
429 rate_limited | Over 120 requests a minute on this key, counting API calls too. Wait for the time in Retry-After (60 seconds). |