Skip to content
Scalekit Docs

Sleekplan MCP

Vendor MCP60 toolsOAuth 2.1/DCRProductivity

Sleekplan is a customer feedback, feature request, and roadmap management platform.

Sleekplan MCP connector

  1. Terminal window
    npm install @scalekit-sdk/node

    Full SDK reference: Node.js | Python

  2. Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. quickstart.ts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENV_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'sleekplanmcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Sleekplan MCP:', link)
    process.stdout.write('Press Enter after authorizing...')
    await new Promise(r => process.stdin.once('data', r))
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'sleekplanmcp_list_admins',
    toolInput: {},
    })
    console.log(result)

Connect this agent connector to let your agent:

  • Update document, survey questions, survey name — Update a document
  • Feedback unlink document from, link document to, tag — Remove the link between a document and a feedback post
  • Meta set feedback — Add or update custom meta on an existing feedback post
  • Version restore document — Restore an earlier version, replacing the document’s current title, body, type, and tags
  • List feedback documents, documents, document versions — List the documents that inform one feedback post — the thinking behind that request
  • Get feedback meta, document version, document — Read the custom meta key/value pairs attached to a feedback post

Use the exact tool names from the Tool list below when you call execute_tool. If you’re not sure which name to use, list the tools available for the current user first.

sleekplanmcp_compare_document_versions#Show what changed between two versions of a document. Returns {from, to, diff}. The diff is block-level over the Markdown source: `hunks` are {op: 'equal'|'insert'|'delete', text} entries and `summary` counts blocks added/removed/equal. Very large documents come back with `truncated: true` and no hunks — fall back to reading both versions in that case.3 params

Show what changed between two versions of a document. Returns {from, to, diff}. The diff is block-level over the Markdown source: `hunks` are {op: 'equal'|'insert'|'delete', text} entries and `summary` counts blocks added/removed/equal. Very large documents come back with `truncated: true` and no hunks — fall back to reading both versions in that case.

NameTypeRequiredDescription
document_idintegerrequiredID of the document.
from_versionintegerrequiredOne version number to compare, 1 or higher. Get from list_document_versions.
to_versionintegerrequiredThe other version number, 1 or higher. Order does not matter — the server sorts the pair.
sleekplanmcp_create_changelog#Create a new changelog entry. To pick a valid `type`, read sleekplan://feedback-types (or call list_feedback_types) and filter to entries whose `disable_changelog` is falsy. To target a cohort, read sleekplan://segments (or call list_segments) first for the `segment` slug. Set `draft=True` to create without publishing; set `scheduled=<unix timestamp>` to publish automatically at a future time.8 params

Create a new changelog entry. To pick a valid `type`, read sleekplan://feedback-types (or call list_feedback_types) and filter to entries whose `disable_changelog` is falsy. To target a cohort, read sleekplan://segments (or call list_segments) first for the `segment` slug. Set `draft=True` to create without publishing; set `scheduled=<unix timestamp>` to publish automatically at a future time.

NameTypeRequiredDescription
titlestringrequiredTitle of the changelog entry
announcementbooleanoptionalShow as an in-app announcement when this entry publishes. Default False.
descriptionstringoptionalBody of the changelog entry (HTML or Markdown — sanitized server-side)
draftbooleanoptionalCreate as a draft instead of publishing immediately. Default False.
notifybooleanoptionalEmail-notify changelog subscribers when this entry publishes. Default False.
scheduledintegeroptionalUnix timestamp (seconds) for when the entry should publish. 0 or omitted means publish now. Only meaningful when `draft` is False.
segmentstringoptionalSegment slug (NOT segment_id) to restrict the announcement to a user cohort. Read sleekplan://segments or call list_segments for valid slugs. Omit or empty to target all users.
typestringoptionalCategory key (e.g. 'feature', 'improvement'). Read sleekplan://feedback-types or call list_feedback_types first and pick an entry whose `disable_changelog` is falsy — the `key` string on that entry is what goes here.
sleekplanmcp_create_comment#Add a comment to a feedback post. Use `parent` to post a reply in an existing thread. Use `pinned=True` to promote the comment to the top — typically for moderator answers or resolution summaries.4 params

Add a comment to a feedback post. Use `parent` to post a reply in an existing thread. Use `pinned=True` to promote the comment to the top — typically for moderator answers or resolution summaries.

NameTypeRequiredDescription
commentstringrequiredComment text (Markdown supported)
feedback_idintegerrequiredID of the feedback post to comment on
parentintegeroptionalOptional parent comment_id — set this to reply to an existing comment. Call `list_comments` first to find the parent's id. Omit for a top-level comment.
pinnedbooleanoptionalPin the comment to the top of the thread. Default false.
sleekplanmcp_create_document#Create a document — a plan, spec, research note, or decision record. Read sleekplan://document-types (or call list_document_types) first so the `document_type` key is one the workspace actually defines. To connect the document to the requests it informs, follow up with link_document_to_feedback.5 params

Create a document — a plan, spec, research note, or decision record. Read sleekplan://document-types (or call list_document_types) first so the `document_type` key is one the workspace actually defines. To connect the document to the requests it informs, follow up with link_document_to_feedback.

NameTypeRequiredDescription
titlestringrequiredDocument title, 3-500 characters. Write it as the conclusion rather than the topic — 'Why we keep one feedback queue' beats 'Feedback queues'.
contentstringoptionalDocument body as MARKDOWN (headings, lists, tables, fenced code all work). Max 2MB. Omit to create an empty document.
document_typestringoptionalDocument type key (e.g. 'prd', 'spec', 'plan'). Types are workspace-defined and renameable — read sleekplan://document-types or call list_document_types for the real keys instead of guessing. Omit to default to 'knowledge-base'.
statusstringoptionalInitial status: 'draft' (still being written), 'published' (finished and shared), or 'archived' (kept for the record, out of the way). Omit to default to 'draft'.
tagsarrayoptionalFree-text labels stored on the document, max 50. These are document-local strings, NOT the workspace feedback tags from sleekplan://tags — do not pass tag_id hashes here.
sleekplanmcp_create_feedback#Create a new feedback post. Requires a feedback type — read sleekplan://feedback-types or call list_feedback_types first for available keys. Optional status lets you set the initial state (call update_feedback afterwards if you need to set owner, effort, or estimated fields — the backend ignores those on create). Optional component records which part of the product the post concerns — read sleekplan://components or call list_components for available keys. meta_origin/meta_service tag where the post came from for later filtering, and `meta` carries any other key/value pairs you want to attribute the post with.8 params

Create a new feedback post. Requires a feedback type — read sleekplan://feedback-types or call list_feedback_types first for available keys. Optional status lets you set the initial state (call update_feedback afterwards if you need to set owner, effort, or estimated fields — the backend ignores those on create). Optional component records which part of the product the post concerns — read sleekplan://components or call list_components for available keys. meta_origin/meta_service tag where the post came from for later filtering, and `meta` carries any other key/value pairs you want to attribute the post with.

NameTypeRequiredDescription
titlestringrequiredTitle of the feedback post
typestringrequiredFeedback type key (e.g. 'feature', 'bug'). Read sleekplan://feedback-types or call list_feedback_types first to see available keys — filter to entries whose `disable_feedback` is falsy.
componentstringoptionalOptional component key — which part of the product this post concerns, e.g. 'mobile-app' (from sleekplan://components or list_components). Independent of `type`: component is the product area, type is the kind of request. A post carries at most one. Omit for none. Unknown keys are silently dropped by the backend, so read the component list first rather than inventing a key.
descriptionstringoptionalOptional detailed description. Markdown is supported.
metaobjectoptionalOptional custom meta as arbitrary key/value pairs, e.g. {"reporter": "u_1024", "channel": "slack"}. Use this for keys beyond origin/service; those two have their own arguments and win if you pass them both ways. Meta set here is stored verbatim and is filterable later via list_feedback's `advanced` `meta` filter. To change meta on a post that already exists, use set_feedback_meta instead.
meta_originstringoptionalOptional meta.origin tag — use this to mark who/what created the post (e.g. "mcp", "intelligence", "zapier"). Paired with meta_service.
meta_servicestringoptionalOptional meta.service tag (e.g. "agent", "chat").
statusstringoptionalOptional initial status key (from sleekplan://feedback-statuses or list_feedback_statuses). Omit to use the workspace default.
sleekplanmcp_create_survey#Create a new survey. The `survey` array defines question order and content.2 params

Create a new survey. The `survey` array defines question order and content.

NameTypeRequiredDescription
namestringrequiredInternal name for the survey
surveyarrayrequiredArray of question dicts. EVERY question MUST include ALL of the following fields — the frontend edit screen crashes if any field is missing. The backend also normalizes missing fields defensively, but produce the full shape to be safe: - `type` (required): 'text', 'multiple', 'single', 'free', or 'scale' - `text` (required): the question text, or markdown for type='text' blocks - `options` (required, ALWAYS an array): list of choice strings for 'multiple'/'single'; use `[]` for other types. Never omit. - `min` (required, ALWAYS a number): scale minimum. Use `0` when type != 'scale'. Never omit. - `max` (required, ALWAYS a number): scale maximum. Use `10` when type != 'scale'. Never omit. - `required` (required, ALWAYS a bool): whether the answer is required. Default `false`. Never omit. - `showIf` (required, ALWAYS an object): conditional display. Use `{'questionIndex': '', 'condition': 'contains', 'value': ''}` when the question has no condition. When conditional: `{'questionIndex': <int>, 'condition': 'contains'|'is'|'greater'|'less', 'value': <str>}`. Never omit. - `question_id` (required ONLY when updating existing questions): the 'qu...'-prefixed ID returned by `get_survey`/`create_survey`. OMIT on create; on update you MUST preserve existing `question_id` values or response history is lost. Do NOT include a top-level `options` field in the payload — the backend manages that registry internally.
sleekplanmcp_create_tag#Create a new workspace-level tag. Tags can then be attached to feedback posts with tag_feedback(tag_id, action='add').1 param

Create a new workspace-level tag. Tags can then be attached to feedback posts with tag_feedback(tag_id, action='add').

NameTypeRequiredDescription
namestringrequiredTag name. Only letters, numbers, and spaces are allowed (^[A-Za-z0-9 ]+$). Check sleekplan://tags or call list_tags first to avoid creating a duplicate.
sleekplanmcp_delete_changelog#Permanently delete a changelog entry.1 param

Permanently delete a changelog entry.

NameTypeRequiredDescription
changelog_idintegerrequiredID of the changelog entry to delete
sleekplanmcp_delete_comment#Permanently delete a comment from a feedback post.2 params

Permanently delete a comment from a feedback post.

NameTypeRequiredDescription
comment_idintegerrequiredID of the comment to delete
feedback_idintegerrequiredID of the feedback post
sleekplanmcp_delete_document#Permanently delete a document, its entire version history, and its feedback links. This cannot be undone. To take a document out of circulation while keeping it, set its status to 'archived' with update_document instead.1 param

Permanently delete a document, its entire version history, and its feedback links. This cannot be undone. To take a document out of circulation while keeping it, set its status to 'archived' with update_document instead.

NameTypeRequiredDescription
document_idintegerrequiredID of the document to delete.
sleekplanmcp_delete_feedback#Permanently delete a feedback post.1 param

Permanently delete a feedback post.

NameTypeRequiredDescription
feedback_idintegerrequiredID of the feedback post to delete
sleekplanmcp_delete_feedback_meta#Remove a single custom meta key from a feedback post. Deleting a key that isn't set is a no-op, not an error. Returns the post's remaining meta.2 params

Remove a single custom meta key from a feedback post. Deleting a key that isn't set is a no-op, not an error. Returns the post's remaining meta.

NameTypeRequiredDescription
feedback_idintegerrequiredID of the feedback post
keystringrequiredThe meta key to remove (from get_feedback_meta). Other keys are left alone.
sleekplanmcp_delete_tag#Permanently delete a workspace-level tag. Removes it from every feedback post it was attached to.1 param

Permanently delete a workspace-level tag. Removes it from every feedback post it was attached to.

NameTypeRequiredDescription
tag_idstringrequiredID of the tag to delete, taken verbatim from sleekplan://tags or list_tags. Tag IDs are opaque hash STRINGS like 'tb059acd19eb4d8943916f547c04d98b9', never integers.
sleekplanmcp_get_category_template#Get the title/description preset template for a feedback type. Mirrors the sleekplan://category-template/{type_key} resource — use this tool when your MCP client doesn't auto-read resource templates. Returns `{title, description}` or an empty response when no template is configured. Read before create_feedback so posts of this category follow the workspace's preferred structure.1 param

Get the title/description preset template for a feedback type. Mirrors the sleekplan://category-template/{type_key} resource — use this tool when your MCP client doesn't auto-read resource templates. Returns `{title, description}` or an empty response when no template is configured. Read before create_feedback so posts of this category follow the workspace's preferred structure.

NameTypeRequiredDescription
type_keystringrequiredFeedback type key from list_feedback_types / sleekplan://feedback-types (e.g. 'bug', 'feature'). Strings only — not numeric IDs.
sleekplanmcp_get_changelog#Get a single changelog entry by ID.1 param

Get a single changelog entry by ID.

NameTypeRequiredDescription
changelog_idintegerrequiredID of the changelog entry
sleekplanmcp_get_document#Get one document, including its full Markdown `content` and `current_version` number.1 param

Get one document, including its full Markdown `content` and `current_version` number.

NameTypeRequiredDescription
document_idintegerrequiredDocument ID. Get from list_documents or list_feedback_documents results.
sleekplanmcp_get_document_version#Read what a document said at one specific version, body included.2 params

Read what a document said at one specific version, body included.

NameTypeRequiredDescription
document_idintegerrequiredID of the document.
versionintegerrequiredVersion number (1 or higher). Get from list_document_versions.
sleekplanmcp_get_feedback#Get a single feedback post by ID.1 param

Get a single feedback post by ID.

NameTypeRequiredDescription
feedback_idintegerrequiredID of the feedback post
sleekplanmcp_get_feedback_meta#Read the custom meta key/value pairs attached to a feedback post. Meta is free-form attribution (reporter, source channel, account id, campaign …) that list_feedback can filter on via its `advanced` `meta` filter. Read this before set_feedback_meta or delete_feedback_meta so you know which keys already exist. Returns `{"meta": {...}}`, or `{"meta": false}` when the post has no meta at all.1 param

Read the custom meta key/value pairs attached to a feedback post. Meta is free-form attribution (reporter, source channel, account id, campaign …) that list_feedback can filter on via its `advanced` `meta` filter. Read this before set_feedback_meta or delete_feedback_meta so you know which keys already exist. Returns `{"meta": {...}}`, or `{"meta": false}` when the post has no meta at all.

NameTypeRequiredDescription
feedback_idintegerrequiredID of the feedback post
sleekplanmcp_get_feedback_stats#Get vote and engagement statistics for a feedback post.1 param

Get vote and engagement statistics for a feedback post.

NameTypeRequiredDescription
feedback_idintegerrequiredID of the feedback post
sleekplanmcp_get_similar_feedback#Find feedback posts similar to the given one.1 param

Find feedback posts similar to the given one.

NameTypeRequiredDescription
feedback_idintegerrequiredID of the feedback post
sleekplanmcp_get_survey#Get a single survey by ID, including its `settings` (question array) and `options` registry. Call this before `update_survey_questions` to retrieve existing `question_id` values, which must be preserved to keep response history linked to questions.1 param

Get a single survey by ID, including its `settings` (question array) and `options` registry. Call this before `update_survey_questions` to retrieve existing `question_id` values, which must be preserved to keep response history linked to questions.

NameTypeRequiredDescription
survey_idstringrequiredSurvey ID, e.g. 'su67a1b2c3d'
sleekplanmcp_get_survey_question_feed#Paginated feed of individual answers for one question, including user info per answer. Essential for reading free-text responses: `get_survey_summary` tells you a free-text question has N responses but not what they said — this tool returns them. Each entry has `answer`, `question`, `type`, `created`, and a `user` object.4 params

Paginated feed of individual answers for one question, including user info per answer. Essential for reading free-text responses: `get_survey_summary` tells you a free-text question has N responses but not what they said — this tool returns them. Each entry has `answer`, `question`, `type`, `created`, and a `user` object.

NameTypeRequiredDescription
question_idstringrequiredQuestion ID (the `qu...`-prefixed id from get_survey or get_survey_summary)
survey_idstringrequiredSurvey ID
pageintegeroptionalPage number (0-indexed)
per_pageintegeroptionalNumber of results per page
sleekplanmcp_get_survey_response#Fetch a single full response by its id — contains every answer the user gave.2 params

Fetch a single full response by its id — contains every answer the user gave.

NameTypeRequiredDescription
response_idstringrequiredResponse ID (from list_survey_responses)
survey_idstringrequiredSurvey ID
sleekplanmcp_get_survey_summary#Aggregated response stats per question — the at-a-glance 'what did people answer' view. Returns a dict keyed by `question_id`. Each value has `question`, `type`, `total` (response count), and (for multiple/single/scale questions) an `answers` dict mapping each answer option to its count. Free-text questions expose only `total` — follow up with `get_survey_question_feed` to read the actual free-text answers. Start here when a user asks "how did people answer this survey?" Pick specific questions to drill into with `get_survey_question_feed`.1 param

Aggregated response stats per question — the at-a-glance 'what did people answer' view. Returns a dict keyed by `question_id`. Each value has `question`, `type`, `total` (response count), and (for multiple/single/scale questions) an `answers` dict mapping each answer option to its count. Free-text questions expose only `total` — follow up with `get_survey_question_feed` to read the actual free-text answers. Start here when a user asks "how did people answer this survey?" Pick specific questions to drill into with `get_survey_question_feed`.

NameTypeRequiredDescription
survey_idstringrequiredSurvey ID to summarize
sleekplanmcp_get_user#Get a single user by ID.1 param

Get a single user by ID.

NameTypeRequiredDescription
user_idintegerrequiredID of the user
sleekplanmcp_get_user_segment#Get the segment/plan information for a user.1 param

Get the segment/plan information for a user.

NameTypeRequiredDescription
user_idintegerrequiredID of the user
sleekplanmcp_get_voters#Get the list of users who voted on a feedback post (with vote direction).4 params

Get the list of users who voted on a feedback post (with vote direction).

NameTypeRequiredDescription
feedback_idintegerrequiredID of the feedback post
filterstringoptionalFilter: 'upvote' (default), 'downvote', 'subscribe', or 'priority'
pageintegeroptionalPage number (0-indexed)
per_pageintegeroptionalNumber of results per page
sleekplanmcp_list_admins#List admin users (team members) with access to this workspace. Mirrors the sleekplan://admins resource — use this tool when your MCP client doesn't auto-read resources. Returns id/name/email/role per admin; use `id` when filtering feedback by owner or setting a post's owner.0 params

List admin users (team members) with access to this workspace. Mirrors the sleekplan://admins resource — use this tool when your MCP client doesn't auto-read resources. Returns id/name/email/role per admin; use `id` when filtering feedback by owner or setting a post's owner.

sleekplanmcp_list_changelog#List changelog entries with optional filtering.5 params

List changelog entries with optional filtering.

NameTypeRequiredDescription
pageintegeroptionalPage number (0-indexed)
per_pageintegeroptionalNumber of results per page
searchstringoptionalFull-text search query
statusstringoptionalStatus filter: 'published', 'scheduled', 'draft', or 'all'
typestringoptionalCategory filter — a key from sleekplan://feedback-types or list_feedback_types (filter to entries whose `disable_changelog` is falsy). Use 'all' for no filter.
sleekplanmcp_list_comments#List comments on a feedback post, with pagination and sort order. Each returned entry includes a `comment_id`. Use that id as the `parent` value on `create_comment` to post a threaded reply, or as the `comment_id` on `update_comment` / `delete_comment`.4 params

List comments on a feedback post, with pagination and sort order. Each returned entry includes a `comment_id`. Use that id as the `parent` value on `create_comment` to post a threaded reply, or as the `comment_id` on `update_comment` / `delete_comment`.

NameTypeRequiredDescription
feedback_idintegerrequiredID of the feedback post
pageintegeroptionalPage number (0-indexed)
per_pageintegeroptionalNumber of results per page
sortstringoptionalSort order: 'old' or 'new'
sleekplanmcp_list_components#List component definitions for this workspace. Mirrors the sleekplan://components resource — use this tool when your MCP client doesn't auto-read resources. Returns a dict keyed by component key (e.g. 'mobile-app', 'billing') with `key`, `name`, `color`, `order`, `segment` per component. Use the `key` string (not the human name) when setting a post's component via create_feedback or update_feedback. A component says which part of the product a post concerns — an independent axis from the type/category, which says what kind of request it is. A post carries at most one component. An empty result means this workspace has not defined any components yet, so leave the component unset on posts.0 params

List component definitions for this workspace. Mirrors the sleekplan://components resource — use this tool when your MCP client doesn't auto-read resources. Returns a dict keyed by component key (e.g. 'mobile-app', 'billing') with `key`, `name`, `color`, `order`, `segment` per component. Use the `key` string (not the human name) when setting a post's component via create_feedback or update_feedback. A component says which part of the product a post concerns — an independent axis from the type/category, which says what kind of request it is. A post carries at most one component. An empty result means this workspace has not defined any components yet, so leave the component unset on posts.

sleekplanmcp_list_document_feedback#List the feedback posts one document informs — useful when a plan or spec covers several requests. Returns {items, total}, each item carrying `feedback_id` plus the post's title, status, and type. For the opposite direction, use list_feedback_documents.1 param

List the feedback posts one document informs — useful when a plan or spec covers several requests. Returns {items, total}, each item carrying `feedback_id` plus the post's title, status, and type. For the opposite direction, use list_feedback_documents.

NameTypeRequiredDescription
document_idintegerrequiredID of the document whose linked posts you want.
sleekplanmcp_list_document_types#List the document types this workspace defines. Mirrors the sleekplan://document-types resource — use this tool when your MCP client doesn't auto-read resources. Returns {items, total}; pass an item's `key` (not its display `name`) as `document_type` on create_document or update_document. Workspaces rename and add types freely, so read this rather than assuming the defaults.0 params

List the document types this workspace defines. Mirrors the sleekplan://document-types resource — use this tool when your MCP client doesn't auto-read resources. Returns {items, total}; pass an item's `key` (not its display `name`) as `document_type` on create_document or update_document. Workspaces rename and add types freely, so read this rather than assuming the defaults.

sleekplanmcp_list_document_versions#List a document's saved versions, newest first. Summaries only — no body text — so this is cheap to call. Each entry carries the `version` number to pass to get_document_version, compare_document_versions, or restore_document_version.3 params

List a document's saved versions, newest first. Summaries only — no body text — so this is cheap to call. Each entry carries the `version` number to pass to get_document_version, compare_document_versions, or restore_document_version.

NameTypeRequiredDescription
document_idintegerrequiredID of the document whose history you want.
pageintegeroptionalPage number, ZERO-based. Omit for the first page.
per_pageintegeroptionalResults per page. Default 20, capped server-side at 100.
sleekplanmcp_list_documents#List documents in the workspace, newest first, with optional filtering. Returns {items, total, page, per_page}. Each item carries the full `content` body, so prefer a narrow filter over paging through everything.5 params

List documents in the workspace, newest first, with optional filtering. Returns {items, total, page, per_page}. Each item carries the full `content` body, so prefer a narrow filter over paging through everything.

NameTypeRequiredDescription
pageintegeroptionalPage number, ZERO-based. Omit for the first page.
per_pageintegeroptionalResults per page. Default 20, capped server-side at 100.
searchstringoptionalFree-text search across document titles. Omit for no search.
statusstringoptionalFilter by status: 'draft' (still being written), 'published' (finished and shared), or 'archived' (kept for the record, out of the way). Omit for all statuses.
typestringoptionalDocument type key (e.g. 'prd', 'spec', 'plan'). Types are workspace-defined and renameable — read sleekplan://document-types or call list_document_types for the real keys instead of guessing. Omit for all types.
sleekplanmcp_list_feedback#List feedback posts with optional filtering and sorting. Before filtering by type/status/tag/component/segment/owner, read the corresponding resource (sleekplan://feedback-types, sleekplan://feedback-statuses, sleekplan://tags, sleekplan://components, sleekplan://segments, sleekplan://admins) so you pick real keys/slugs/IDs. If your MCP client doesn't auto-read resources, call the equivalent list_* tools (list_feedback_types, list_feedback_statuses, list_tags, list_components, list_segments, list_admins). `type` and `component` are independent axes — type is the kind of request, component is the part of the product it concerns — so combining them narrows on both at once.12 params

List feedback posts with optional filtering and sorting. Before filtering by type/status/tag/component/segment/owner, read the corresponding resource (sleekplan://feedback-types, sleekplan://feedback-statuses, sleekplan://tags, sleekplan://components, sleekplan://segments, sleekplan://admins) so you pick real keys/slugs/IDs. If your MCP client doesn't auto-read resources, call the equivalent list_* tools (list_feedback_types, list_feedback_statuses, list_tags, list_components, list_segments, list_admins). `type` and `component` are independent axes — type is the kind of request, component is the part of the product it concerns — so combining them narrows on both at once.

NameTypeRequiredDescription
advancedstringoptionalAdvanced filter as a STRINGIFIED JSON object. Top-level keys (all optional, combined with AND): `meta` and `meta_system` = {key: str, value: str|'NULL'|'', condition: str} filter by custom meta / system-integration meta; pass value 'NULL' or '' with condition 'eq' to match posts missing that meta key. `votes` and `comments` = {value: int, condition: str, interval?: int} filter by vote/comment count; optional `interval` limits the count to the last N days. `created` and `updated` = {value: int, condition: 'lt'|'gt', interval: '1'|'30'|'365'} filter by age where interval 1=DAY, 30=MONTH, 365=YEAR (value is how many units ago). `eta_q` = {value: 'YYYY-QN' like '2026-Q2', condition: str} filter by ETA quarter. `eta_m` = {value: 'YYYY-MM' like '2026-04', condition: str} filter by ETA month. `feedback_id` = {value: int|str, condition: str} filter by feedback id. Valid `condition` values: 'eq', 'neq', 'gt', 'lt', 'gte', 'lte', 'like', 'contains', 'ncontains', 'in', 'notin', 'bw' (begins with), 'ew' (ends with). Example: '{"votes": {"value": 10, "condition": "gte", "interval": 30}, "created": {"value": 7, "condition": "gt", "interval": "1"}}' finds posts created in the last 7 days with >=10 votes in the last 30 days.
componentstringoptionalFilter by component key — which part of the product a post concerns (from sleekplan://components or list_components). Pass a single key like 'mobile-app', a comma-separated list like 'mobile-app,billing', 'all' for no filter, or the literal 'none' to find posts with no component set. Omit for no filter.
filterstringoptionalFilter by status key (from sleekplan://feedback-statuses or list_feedback_statuses). Pass a single key like 'planned', a comma-separated list, or 'all'. Read the resource first to see available keys.
ownerstringoptionalFilter by owner admin user_id (from sleekplan://admins or list_admins), or 'all'. Omit for no filter.
pageintegeroptionalPage number (0-indexed)
per_pageintegeroptionalNumber of results per page
searchstringoptionalFull-text search query
segmentstringoptionalFilter by segment slug (from sleekplan://segments or list_segments). Use the segment's `slug` string, not `segment_id`.
sortstringoptionalSort order. One of: 'trend', 'top', 'fewest', 'new', 'old', 'updated', 'updated_asc', 'scoring', 'priority', 'precedence', 'eta'.
tagsstringoptionalTag filter. Accepts a single tag key, a JSON object like {"tag_key": true} for multi-tag AND, or the literal "empty" to find untagged posts. Omit for no filter.
typestringoptionalFilter by feedback type key (from sleekplan://feedback-types or list_feedback_types). Pass a single key like 'feature', a comma-separated list like 'feature,bug', or 'all'. Read the resource first to see available keys.
userstringoptionalFilter to posts created by this end-user_id.
sleekplanmcp_list_feedback_documents#List the documents that inform one feedback post — the thinking behind that request. Returns {items, total} with each document's full content. Call this before working on a request, so any existing plan, spec, or decision record is taken into account.1 param

List the documents that inform one feedback post — the thinking behind that request. Returns {items, total} with each document's full content. Call this before working on a request, so any existing plan, spec, or decision record is taken into account.

NameTypeRequiredDescription
feedback_idintegerrequiredID of the feedback post. Get from list_feedback results.
sleekplanmcp_list_feedback_statuses#List feedback status definitions for this workspace. Mirrors the sleekplan://feedback-statuses resource — use this tool when your MCP client doesn't auto-read resources. Returns a dict keyed by status key (e.g. 'open', 'planned', 'in-progress', 'done', 'closed') with `key`, `name`, `color`, `order`, `roadmap`, `disable_feedback` per status. Use the `key` string in feedback payloads.0 params

List feedback status definitions for this workspace. Mirrors the sleekplan://feedback-statuses resource — use this tool when your MCP client doesn't auto-read resources. Returns a dict keyed by status key (e.g. 'open', 'planned', 'in-progress', 'done', 'closed') with `key`, `name`, `color`, `order`, `roadmap`, `disable_feedback` per status. Use the `key` string in feedback payloads.

sleekplanmcp_list_feedback_types#List feedback type (category) definitions for this workspace. Mirrors the sleekplan://feedback-types resource — use this tool when your MCP client doesn't auto-read resources. Returns a dict keyed by type key (e.g. 'feature', 'bug') with `key`, `name`, `color`, `order`, `disable_feedback`, `disable_changelog` per type. Use the `key` string (not the human name) in feedback/changelog payloads. Filter by `disable_feedback` / `disable_changelog` based on which surface you're creating for.0 params

List feedback type (category) definitions for this workspace. Mirrors the sleekplan://feedback-types resource — use this tool when your MCP client doesn't auto-read resources. Returns a dict keyed by type key (e.g. 'feature', 'bug') with `key`, `name`, `color`, `order`, `disable_feedback`, `disable_changelog` per type. Use the `key` string (not the human name) in feedback/changelog payloads. Filter by `disable_feedback` / `disable_changelog` based on which surface you're creating for.

sleekplanmcp_list_segments#List user segments (named cohorts) configured for this workspace. Mirrors the sleekplan://segments resource — use this tool when your MCP client doesn't auto-read resources. Returns segment_id/slug/name per segment. Use the `slug` string (not `segment_id`) when targeting a segment in feedback or changelog payloads.0 params

List user segments (named cohorts) configured for this workspace. Mirrors the sleekplan://segments resource — use this tool when your MCP client doesn't auto-read resources. Returns segment_id/slug/name per segment. Use the `slug` string (not `segment_id`) when targeting a segment in feedback or changelog payloads.

sleekplanmcp_list_sub_topics#List sub-topics under a parent topic — a more detailed breakdown of the posts it contains.1 param

List sub-topics under a parent topic — a more detailed breakdown of the posts it contains.

NameTypeRequiredDescription
topic_idintegerrequiredID of the parent topic (from list_topics)
sleekplanmcp_list_survey_responses#Paginated list of every full response to a survey — all questions per row. Use this only when you need the cross-question picture for each respondent (e.g. "show me every answer from user X"). For per-question analysis prefer `get_survey_question_feed` which is narrower and easier to reason over.3 params

Paginated list of every full response to a survey — all questions per row. Use this only when you need the cross-question picture for each respondent (e.g. "show me every answer from user X"). For per-question analysis prefer `get_survey_question_feed` which is narrower and easier to reason over.

NameTypeRequiredDescription
survey_idstringrequiredSurvey ID
pageintegeroptionalPage number (0-indexed)
per_pageintegeroptionalNumber of results per page
sleekplanmcp_list_surveys#List surveys configured for this workspace.3 params

List surveys configured for this workspace.

NameTypeRequiredDescription
pageintegeroptionalPage number (0-indexed)
per_pageintegeroptionalNumber of results per page
searchstringoptionalFull-text search across survey names
sleekplanmcp_list_tags#List workspace-level tags. Mirrors the sleekplan://tags resource — use this tool when your MCP client doesn't auto-read resources. Returns `tag_id`/`name` per tag. `tag_id` is an opaque hash STRING (e.g. 'tb059acd19eb4d8943916f547c04d98b9'), not a number — pass it verbatim to tag_feedback to attach a tag to a post, or to delete_tag to remove it from the workspace.0 params

List workspace-level tags. Mirrors the sleekplan://tags resource — use this tool when your MCP client doesn't auto-read resources. Returns `tag_id`/`name` per tag. `tag_id` is an opaque hash STRING (e.g. 'tb059acd19eb4d8943916f547c04d98b9'), not a number — pass it verbatim to tag_feedback to attach a tag to a post, or to delete_tag to remove it from the workspace.

sleekplanmcp_list_topics#List feedback topics — the top-level clusters Sleekplan's intelligence derives from posts. Each topic typically includes an `id`, `name`, post count, and optional metadata. Use `list_sub_topics` to drill into a specific topic for sub-clusters.0 params

List feedback topics — the top-level clusters Sleekplan's intelligence derives from posts. Each topic typically includes an `id`, `name`, post count, and optional metadata. Use `list_sub_topics` to drill into a specific topic for sub-clusters.

sleekplanmcp_list_users#List users in the workspace with optional search and filtering.5 params

List users in the workspace with optional search and filtering.

NameTypeRequiredDescription
pageintegeroptionalPage number (0-indexed)
per_pageintegeroptionalNumber of results per page
searchstringoptionalSearch by name or email
segmentstringoptionalFilter by user segment
sortstringoptionalSort order: 'updated', 'created', 'name'
sleekplanmcp_list_votes#List all votes for a feedback post.1 param

List all votes for a feedback post.

NameTypeRequiredDescription
feedback_idintegerrequiredID of the feedback post
sleekplanmcp_merge_feedback#Merge one feedback post into another, combining votes and comments.2 params

Merge one feedback post into another, combining votes and comments.

NameTypeRequiredDescription
source_idintegerrequiredID of the feedback post to merge from (will be closed)
target_idintegerrequiredID of the feedback post to merge into (will remain)
sleekplanmcp_restore_document_version#Restore an earlier version, replacing the document's current title, body, type, and tags. History is append-only: this does not rewind, it writes the old content as a NEW version on top, so the state you are replacing stays recoverable too. Returns the document as it now stands.2 params

Restore an earlier version, replacing the document's current title, body, type, and tags. History is append-only: this does not rewind, it writes the old content as a NEW version on top, so the state you are replacing stays recoverable too. Returns the document as it now stands.

NameTypeRequiredDescription
document_idintegerrequiredID of the document.
versionintegerrequiredVersion number to restore, 1 or higher. Get from list_document_versions.
sleekplanmcp_set_feedback_meta#Add or update custom meta on an existing feedback post. Use this to enrich or correct a post after creation — backfilling a reporter, a source channel, an account id. Call get_feedback_meta first to see the current keys. Returns the post's full meta after the change.2 params

Add or update custom meta on an existing feedback post. Use this to enrich or correct a post after creation — backfilling a reporter, a source channel, an account id. Call get_feedback_meta first to see the current keys. Returns the post's full meta after the change.

NameTypeRequiredDescription
feedback_idintegerrequiredID of the feedback post
metaobjectrequiredOne or more meta key/value pairs to set, e.g. {"reporter": "u_1024", "channel": "slack"}. Keys you pass are added or overwritten; keys you leave out are untouched. Neither key nor value may be empty (the backend also rejects the value "0") — use delete_feedback_meta to remove a key instead. Values are normalised by the backend: spaces become hyphens and anything that is not a letter, digit, or hyphen is stripped, so "ops@acme.com" is stored as "opsacmecom". Prefer stable identifiers/slugs over free text or e-mail addresses.
sleekplanmcp_tag_feedback#Add or remove a tag on a feedback post. Read sleekplan://tags (or call list_tags) first and pass the `tag_id` string exactly as returned — the workspace only recognises tags that already exist, and create_tag returns the id for new ones.3 params

Add or remove a tag on a feedback post. Read sleekplan://tags (or call list_tags) first and pass the `tag_id` string exactly as returned — the workspace only recognises tags that already exist, and create_tag returns the id for new ones.

NameTypeRequiredDescription
feedback_idintegerrequiredID of the feedback post
tag_idstringrequiredID of the tag to add or remove, taken verbatim from sleekplan://tags or list_tags. Tag IDs are opaque hash STRINGS like 'tb059acd19eb4d8943916f547c04d98b9', never integers.
actionstringoptionalAction to perform: 'add' or 'remove'
sleekplanmcp_update_changelog#Update an existing changelog entry. Only fields you pass are changed — omit to leave them alone. To CLEAR `type` or `segment`, pass an empty string (the backend treats empty-string differently from an omitted field, per class.changelog::update).9 params

Update an existing changelog entry. Only fields you pass are changed — omit to leave them alone. To CLEAR `type` or `segment`, pass an empty string (the backend treats empty-string differently from an omitted field, per class.changelog::update).

NameTypeRequiredDescription
changelog_idintegerrequiredID of the changelog entry to update
announcementbooleanoptionalToggle in-app announcement. None = leave unchanged.
descriptionstringoptionalNew body (HTML or Markdown — sanitized server-side)
draftbooleanoptionalToggle draft state. True=draft, False=published, None=leave unchanged.
notifybooleanoptionalToggle email notification. None = leave unchanged.
scheduledintegeroptionalUnix timestamp for publish. 0 = publish now. None = leave unchanged.
segmentstringoptionalSegment slug from sleekplan://segments or list_segments. Pass empty string to clear targeting. None = leave unchanged.
titlestringoptionalNew title
typestringoptionalNew category key. Read sleekplan://feedback-types or call list_feedback_types and pick an entry whose `disable_changelog` is falsy. Pass empty string to clear.
sleekplanmcp_update_comment#Update an existing comment. You can update text only, pin state only, or both — pass just the fields you want to change.4 params

Update an existing comment. You can update text only, pin state only, or both — pass just the fields you want to change.

NameTypeRequiredDescription
comment_idintegerrequiredID of the comment to update
feedback_idintegerrequiredID of the feedback post
commentstringoptionalNew comment text (Markdown supported). Omit to keep existing text.
pinnedbooleanoptionalSet to true/false to pin or unpin. Omit to keep current pin state.
sleekplanmcp_update_document#Update a document. Only the fields you pass change; omitted fields are left alone. Every update that actually changes something appends a version, so the previous text stays recoverable through list_document_versions and restore_document_version.6 params

Update a document. Only the fields you pass change; omitted fields are left alone. Every update that actually changes something appends a version, so the previous text stays recoverable through list_document_versions and restore_document_version.

NameTypeRequiredDescription
document_idintegerrequiredID of the document to update.
contentstringoptionalNew body as MARKDOWN, max 2MB. This REPLACES the whole body — read the document first and send the complete new text, not just the changed part. Omit to keep unchanged.
document_typestringoptionalDocument type key (e.g. 'prd', 'spec', 'plan'). Types are workspace-defined and renameable — read sleekplan://document-types or call list_document_types for the real keys instead of guessing. Omit to keep unchanged.
statusstringoptionalNew status: 'draft' (still being written), 'published' (finished and shared), or 'archived' (kept for the record, out of the way). Omit to keep unchanged.
tagsarrayoptionalReplacement tag list, max 50. Pass [] to clear. Omit to keep unchanged.
titlestringoptionalNew title, 3-500 characters. Omit to keep unchanged.
sleekplanmcp_update_feedback#Update fields on an existing feedback post. Only the fields you pass are changed. Read sleekplan://feedback-types (or list_feedback_types), sleekplan://feedback-statuses (or list_feedback_statuses), sleekplan://components (or list_components), and sleekplan://admins (or list_admins) first to pick valid keys/IDs for type/status/component/owner_id. Component is the one field with a distinct "clear" value: an empty string removes the post's component, while omitting the argument leaves it as it is.9 params

Update fields on an existing feedback post. Only the fields you pass are changed. Read sleekplan://feedback-types (or list_feedback_types), sleekplan://feedback-statuses (or list_feedback_statuses), sleekplan://components (or list_components), and sleekplan://admins (or list_admins) first to pick valid keys/IDs for type/status/component/owner_id. Component is the one field with a distinct "clear" value: an empty string removes the post's component, while omitting the argument leaves it as it is.

NameTypeRequiredDescription
feedback_idintegerrequiredID of the feedback post to update
componentstringoptionalComponent key — which part of the product this post concerns (from sleekplan://components or list_components). A post carries at most one component: pass a key to set or replace it, pass an empty string "" to remove it. Omit to leave the component unchanged. Unknown keys are silently dropped by the backend, so read the component list first rather than inventing a key.
descriptionstringoptionalNew description. Markdown is supported.
effortintegeroptionalInternal team precedence. Integer 0–3 where 0 is unset and 3 is highest. Independent of user votes.
estimatedstringoptionalEstimated delivery date. Must be "{FullEnglishMonth}, {YYYY}" — the full English month name, a comma, a single space, and the 4-digit year (e.g. "March, 2026"). Abbreviations ("Mar 2026"), ISO formats ("2026-03"), and non-English month names are rejected. The backend stores this as the first of that month.
owner_idintegeroptionalNew owner admin user_id (from sleekplan://admins or list_admins).
statusstringoptionalNew status key (from sleekplan://feedback-statuses or list_feedback_statuses).
titlestringoptionalNew title
typestringoptionalNew type/category key (from sleekplan://feedback-types or list_feedback_types).
sleekplanmcp_update_survey_name#Rename a survey without touching its questions. Internally fetches the survey's current questions and re-submits them alongside the new name, because the backend requires both `name` and `survey` on every update. Use this for pure renames so existing `question_id` values are preserved verbatim.2 params

Rename a survey without touching its questions. Internally fetches the survey's current questions and re-submits them alongside the new name, because the backend requires both `name` and `survey` on every update. Use this for pure renames so existing `question_id` values are preserved verbatim.

NameTypeRequiredDescription
namestringrequiredNew internal name for the survey
survey_idstringrequiredSurvey ID to rename
sleekplanmcp_update_survey_questions#Replace the question set of an existing survey while keeping its name. Internally fetches the current `name` and re-submits it alongside the new questions — required because the backend rejects partial PUTs.2 params

Replace the question set of an existing survey while keeping its name. Internally fetches the current `name` and re-submits it alongside the new questions — required because the backend rejects partial PUTs.

NameTypeRequiredDescription
surveyarrayrequiredNew question array. Call `get_survey` first to see existing `question_id` values, then preserve them for any question that should retain its response history. Omit `question_id` only for genuinely new questions. Array of question dicts. EVERY question MUST include ALL of the following fields — the frontend edit screen crashes if any field is missing. The backend also normalizes missing fields defensively, but produce the full shape to be safe: - `type` (required): 'text', 'multiple', 'single', 'free', or 'scale' - `text` (required): the question text, or markdown for type='text' blocks - `options` (required, ALWAYS an array): list of choice strings for 'multiple'/'single'; use `[]` for other types. Never omit. - `min` (required, ALWAYS a number): scale minimum. Use `0` when type != 'scale'. Never omit. - `max` (required, ALWAYS a number): scale maximum. Use `10` when type != 'scale'. Never omit. - `required` (required, ALWAYS a bool): whether the answer is required. Default `false`. Never omit. - `showIf` (required, ALWAYS an object): conditional display. Use `{'questionIndex': '', 'condition': 'contains', 'value': ''}` when the question has no condition. When conditional: `{'questionIndex': <int>, 'condition': 'contains'|'is'|'greater'|'less', 'value': <str>}`. Never omit. - `question_id` (required ONLY when updating existing questions): the 'qu...'-prefixed ID returned by `get_survey`/`create_survey`. OMIT on create; on update you MUST preserve existing `question_id` values or response history is lost. Do NOT include a top-level `options` field in the payload — the backend manages that registry internally.
survey_idstringrequiredSurvey ID whose questions to replace