The feedback board your AI agents work from: users vote, agents build over MCP. 22 tools.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
FeatureJet API key as a Bearer token (a read-scope key enables read-only tools).
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Attach implementation evidence to a post (shown publicly). kind is one of branch|commit|pr|transcript|url; ref is the branch name, commit sha, or URL. Voters see these in the post page's "Implementation" section.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Attach implementation evidence to a post (shown publicly). kind is one of branch|commit|pr|transcript|url; ref is the branch name, commit sha, or URL. Voters see these in the post page's "Implementation" section.
| Argument | Type | Description |
|---|---|---|
| ref* | string | |
| kind* | string | |
| slug* | string | |
| label | any | |
| post_id* | integer | |
| action_key | any |
{
"type": "object",
"title": "add_evidenceArguments",
"required": [
"slug",
"post_id",
"kind",
"ref"
],
"properties": {
"ref": {
"type": "string",
"title": "Ref"
},
"kind": {
"type": "string",
"title": "Kind"
},
"slug": {
"type": "string",
"title": "Slug"
},
"label": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Label",
"default": null
},
"post_id": {
"type": "integer",
"title": "Post Id"
},
"action_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Action Key",
"default": null
}
}
}Atomically claim a post before working on it (double-work guard). ttl_seconds defaults to 3600 (max 86400); re-claiming with the same key extends the lease. Returns 409 if another key holds a live claim.
| Argument | Type | Description |
|---|---|---|
| slug* | string | |
| post_id* | integer | |
| agent_label | any | |
| ttl_seconds | any |
{
"type": "object",
"title": "claim_postArguments",
"required": [
"slug",
"post_id"
],
"properties": {
"slug": {
"type": "string",
"title": "Slug"
},
"post_id": {
"type": "integer",
"title": "Post Id"
},
"agent_label": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Agent Label",
"default": null
},
"ttl_seconds": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Ttl Seconds",
"default": null
}
}
}Create a new feedback board, as a DRAFT. `slug` is the board's URL path segment (lowercase, hyphenated, unique); `name` is the display name. The new board's public URL 404s until a human publishes it from the dashboard -- `publish_board` is off by default (403 `publish_disabled`).
| Argument | Type | Description |
|---|---|---|
| name* | string | |
| slug* | string | |
| description | any |
{
"type": "object",
"title": "create_boardArguments",
"required": [
"name",
"slug"
],
"properties": {
"name": {
"type": "string",
"title": "Name"
},
"slug": {
"type": "string",
"title": "Slug"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Description",
"default": null
}
}
}Comment on a post as the board team, optionally replying to a comment.
| Argument | Type | Description |
|---|---|---|
| body* | string | |
| slug* | string | |
| post_id* | integer | |
| parent_comment_id | any |
{
"type": "object",
"title": "create_commentArguments",
"required": [
"slug",
"post_id",
"body"
],
"properties": {
"body": {
"type": "string",
"title": "Body"
},
"slug": {
"type": "string",
"title": "Slug"
},
"post_id": {
"type": "integer",
"title": "Post Id"
},
"parent_comment_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Parent Comment Id",
"default": null
}
}
}Create a post on a board.
| Argument | Type | Description |
|---|---|---|
| body | any | |
| slug* | string | |
| tags | any | |
| title* | string | |
| status | any |
{
"type": "object",
"title": "create_postArguments",
"required": [
"slug",
"title"
],
"properties": {
"body": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Body",
"default": null
},
"slug": {
"type": "string",
"title": "Slug"
},
"tags": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"title": "Tags",
"default": null
},
"title": {
"type": "string",
"title": "Title"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Status",
"default": null
}
}
}Delete a post by hiding it through the developer API.
| Argument | Type | Description |
|---|---|---|
| slug* | string | |
| post_id* | integer |
{
"type": "object",
"title": "delete_postArguments",
"required": [
"slug",
"post_id"
],
"properties": {
"slug": {
"type": "string",
"title": "Slug"
},
"post_id": {
"type": "integer",
"title": "Post Id"
}
}
}Get read-only analytics for a board.
| Argument | Type | Description |
|---|---|---|
| slug* | string | |
| period | any |
{
"type": "object",
"title": "get_analyticsArguments",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"title": "Slug"
},
"period": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Period",
"default": null
}
}
}Get one board by slug.
| Argument | Type | Description |
|---|---|---|
| slug* | string |
{
"type": "object",
"title": "get_boardArguments",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"title": "Slug"
}
}
}List shipped posts for a board.
| Argument | Type | Description |
|---|---|---|
| slug* | string |
{
"type": "object",
"title": "get_changelogArguments",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"title": "Slug"
}
}
}Get one post by board slug and post id.
| Argument | Type | Description |
|---|---|---|
| slug* | string | |
| post_id* | integer |
{
"type": "object",
"title": "get_postArguments",
"required": [
"slug",
"post_id"
],
"properties": {
"slug": {
"type": "string",
"title": "Slug"
},
"post_id": {
"type": "integer",
"title": "Post Id"
}
}
}Top UNCLAIMED posts in the owner's curated build order. Owner-ranked posts (queue_rank, lower = sooner) come first, then unranked planned posts by votes. Call this to find the next thing to build, then claim_post before starting work.
| Argument | Type | Description |
|---|---|---|
| slug* | string | |
| limit | any |
{
"type": "object",
"title": "get_queueArguments",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"title": "Slug"
},
"limit": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Limit",
"default": null
}
}
}List boards available to the caller's FeatureJet API key.
No arguments.
{
"type": "object",
"title": "list_boardsArguments",
"properties": {}
}List comments for a post.
| Argument | Type | Description |
|---|---|---|
| slug* | string | |
| post_id* | integer |
{
"type": "object",
"title": "list_commentsArguments",
"required": [
"slug",
"post_id"
],
"properties": {
"slug": {
"type": "string",
"title": "Slug"
},
"post_id": {
"type": "integer",
"title": "Post Id"
}
}
}List posts for a board, optionally filtered by status, search, or tag.
| Argument | Type | Description |
|---|---|---|
| q | any | |
| tag | any | |
| slug* | string | |
| limit | any | |
| offset | any | |
| status | any |
{
"type": "object",
"title": "list_postsArguments",
"required": [
"slug"
],
"properties": {
"q": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Q",
"default": null
},
"tag": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Tag",
"default": null
},
"slug": {
"type": "string",
"title": "Slug"
},
"limit": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Limit",
"default": null
},
"offset": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Offset",
"default": null
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Status",
"default": null
}
}
}List vote metadata for a post.
| Argument | Type | Description |
|---|---|---|
| slug* | string | |
| post_id* | integer |
{
"type": "object",
"title": "list_votesArguments",
"required": [
"slug",
"post_id"
],
"properties": {
"slug": {
"type": "string",
"title": "Slug"
},
"post_id": {
"type": "integer",
"title": "Post Id"
}
}
}Check MCP and FeatureJet API reachability for the caller's key.
No arguments.
{
"type": "object",
"title": "pingArguments",
"properties": {}
}Propose a status change for the board owner to confirm. The agent-honest way to mark work done: nothing changes on the public board and no voter is notified until a human confirms the proposal from the dashboard. status is one of open|planned|in_progress|shipped|declined; a new proposal replaces any pending one. Prefer this over update_post's direct status flip.
| Argument | Type | Description |
|---|---|---|
| note | any | |
| slug* | string | |
| status* | string | |
| post_id* | integer | |
| action_key | any |
{
"type": "object",
"title": "propose_statusArguments",
"required": [
"slug",
"post_id",
"status"
],
"properties": {
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Note",
"default": null
},
"slug": {
"type": "string",
"title": "Slug"
},
"status": {
"type": "string",
"title": "Status"
},
"post_id": {
"type": "integer",
"title": "Post Id"
},
"action_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Action Key",
"default": null
}
}
}Publish a board so it is live at its public URL. OFF BY DEFAULT. Putting a board on the public internet is a human decision: unless the FeatureJet deployment has opted in, this returns 403 `publish_disabled` and the owner publishes from the dashboard. Where it is enabled it needs a `write` (or `admin`) scoped key and an active subscription -- an org without one gets 403 `subscription_required`.
| Argument | Type | Description |
|---|---|---|
| slug* | string |
{
"type": "object",
"title": "publish_boardArguments",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"title": "Slug"
}
}
}Release a post's claim so other agents can pick it up.
| Argument | Type | Description |
|---|---|---|
| slug* | string | |
| post_id* | integer |
{
"type": "object",
"title": "release_postArguments",
"required": [
"slug",
"post_id"
],
"properties": {
"slug": {
"type": "string",
"title": "Slug"
},
"post_id": {
"type": "integer",
"title": "Post Id"
}
}
}Return a board to draft so its public URL stops serving it. Nothing is deleted; publish it again to bring it back.
| Argument | Type | Description |
|---|---|---|
| slug* | string |
{
"type": "object",
"title": "unpublish_boardArguments",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"title": "Slug"
}
}
}Update mutable post fields; null queue_rank explicitly un-ranks.
| Argument | Type | Description |
|---|---|---|
| body | any | |
| slug* | string | |
| tags | any | |
| title | any | |
| pinned | any | |
| status | any | |
| post_id* | integer | |
| queue_rank | any |
{
"type": "object",
"title": "update_postArguments",
"required": [
"slug",
"post_id"
],
"properties": {
"body": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Body",
"default": null
},
"slug": {
"type": "string",
"title": "Slug"
},
"tags": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"title": "Tags",
"default": null
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Title",
"default": null
},
"pinned": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Pinned",
"default": null
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Status",
"default": null
},
"post_id": {
"type": "integer",
"title": "Post Id"
},
"queue_rank": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Queue Rank"
}
}
}Confirm the caller's API key by listing accessible boards.
No arguments.
{
"type": "object",
"title": "whoamiArguments",
"properties": {}
}