Sleekplan MCP
Vendor MCP60 toolsOAuth 2.1/DCRProductivitySleekplan is a customer feedback, feature request, and roadmap management platform.
Sleekplan MCP connector
-
Install the SDK
Section titled “Install the SDK”Terminal window npm install @scalekit-sdk/nodeTerminal window pip install scalekit -
Set your credentials
Section titled “Set your credentials”Add your Scalekit credentials to your
.envfile. 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> -
Authorize and make your first call
Section titled “Authorize and make your first call”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.actionsconst connector = 'sleekplanmcp'const identifier = 'user_123'// Generate an authorization link for the userconst { 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 callconst result = await actions.executeTool({connector,identifier,toolName: 'sleekplanmcp_list_admins',toolInput: {},})console.log(result)quickstart.py import osfrom scalekit.client import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENV_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "sleekplanmcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Sleekplan MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="sleekplanmcp_list_admins",connection_name=connection_name,identifier=identifier,)print(result)
What you can do
Section titled “What you can do”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
Tool list
Section titled “Tool list”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.
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.
titlestringrequiredTitle of the changelog entryannouncementbooleanoptionalShow 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.
commentstringrequiredComment text (Markdown supported)feedback_idintegerrequiredID of the feedback post to comment onparentintegeroptionalOptional 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.
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.
titlestringrequiredTitle of the feedback posttypestringrequiredFeedback 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.
namestringrequiredInternal name for the surveysurveyarrayrequiredArray 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').
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.
changelog_idintegerrequiredID of the changelog entry to deletesleekplanmcp_delete_comment#Permanently delete a comment from a feedback post.2 params
Permanently delete a comment from a feedback post.
comment_idintegerrequiredID of the comment to deletefeedback_idintegerrequiredID of the feedback postsleekplanmcp_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.
document_idintegerrequiredID of the document to delete.sleekplanmcp_delete_feedback#Permanently delete a feedback post.1 param
Permanently delete a feedback post.
feedback_idintegerrequiredID of the feedback post to deletesleekplanmcp_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.
feedback_idintegerrequiredID of the feedback postkeystringrequiredThe 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.
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.
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.
changelog_idintegerrequiredID of the changelog entrysleekplanmcp_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.
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.
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.
feedback_idintegerrequiredID of the feedback postsleekplanmcp_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.
feedback_idintegerrequiredID of the feedback postsleekplanmcp_get_feedback_stats#Get vote and engagement statistics for a feedback post.1 param
Get vote and engagement statistics for a feedback post.
feedback_idintegerrequiredID of the feedback postsleekplanmcp_get_similar_feedback#Find feedback posts similar to the given one.1 param
Find feedback posts similar to the given one.
feedback_idintegerrequiredID of the feedback postsleekplanmcp_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.
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.
question_idstringrequiredQuestion ID (the `qu...`-prefixed id from get_survey or get_survey_summary)survey_idstringrequiredSurvey IDpageintegeroptionalPage number (0-indexed)per_pageintegeroptionalNumber of results per pagesleekplanmcp_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.
response_idstringrequiredResponse ID (from list_survey_responses)survey_idstringrequiredSurvey IDsleekplanmcp_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`.
survey_idstringrequiredSurvey ID to summarizesleekplanmcp_get_user#Get a single user by ID.1 param
Get a single user by ID.
user_idintegerrequiredID of the usersleekplanmcp_get_user_segment#Get the segment/plan information for a user.1 param
Get the segment/plan information for a user.
user_idintegerrequiredID of the usersleekplanmcp_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).
feedback_idintegerrequiredID of the feedback postfilterstringoptionalFilter: 'upvote' (default), 'downvote', 'subscribe', or 'priority'pageintegeroptionalPage number (0-indexed)per_pageintegeroptionalNumber of results per pagesleekplanmcp_link_document_to_feedback#Attach a feedback post to a document, marking the document as informing that request.
The association is many-to-many: one document can inform several posts, and one post
can draw on several documents. Idempotent — linking the same pair twice succeeds.
The link carries no status or progress; execution state never lives in Sleekplan.2 params
Attach a feedback post to a document, marking the document as informing that request. The association is many-to-many: one document can inform several posts, and one post can draw on several documents. Idempotent — linking the same pair twice succeeds. The link carries no status or progress; execution state never lives in Sleekplan.
document_idintegerrequiredID of the document. Get from list_documents.feedback_idintegerrequiredID of the feedback post to attach. Get from list_feedback results.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.
pageintegeroptionalPage number (0-indexed)per_pageintegeroptionalNumber of results per pagesearchstringoptionalFull-text search querystatusstringoptionalStatus 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`.
feedback_idintegerrequiredID of the feedback postpageintegeroptionalPage number (0-indexed)per_pageintegeroptionalNumber of results per pagesortstringoptionalSort 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.
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.
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.
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.
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 pagesearchstringoptionalFull-text search querysegmentstringoptionalFilter 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.
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.
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.
survey_idstringrequiredSurvey IDpageintegeroptionalPage number (0-indexed)per_pageintegeroptionalNumber of results per pagesleekplanmcp_list_surveys#List surveys configured for this workspace.3 params
List surveys configured for this workspace.
pageintegeroptionalPage number (0-indexed)per_pageintegeroptionalNumber of results per pagesearchstringoptionalFull-text search across survey namessleekplanmcp_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.
pageintegeroptionalPage number (0-indexed)per_pageintegeroptionalNumber of results per pagesearchstringoptionalSearch by name or emailsegmentstringoptionalFilter by user segmentsortstringoptionalSort order: 'updated', 'created', 'name'sleekplanmcp_list_votes#List all votes for a feedback post.1 param
List all votes for a feedback post.
feedback_idintegerrequiredID of the feedback postsleekplanmcp_merge_feedback#Merge one feedback post into another, combining votes and comments.2 params
Merge one feedback post into another, combining votes and comments.
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.
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.
feedback_idintegerrequiredID of the feedback postmetaobjectrequiredOne 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.
feedback_idintegerrequiredID of the feedback posttag_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_unlink_document_from_feedback#Remove the link between a document and a feedback post.
Only the association is removed — both the document and the post survive.2 params
Remove the link between a document and a feedback post. Only the association is removed — both the document and the post survive.
document_idintegerrequiredID of the document.feedback_idintegerrequiredID of the feedback post to detach.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).
changelog_idintegerrequiredID of the changelog entry to updateannouncementbooleanoptionalToggle 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 titletypestringoptionalNew 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.
comment_idintegerrequiredID of the comment to updatefeedback_idintegerrequiredID of the feedback postcommentstringoptionalNew 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.
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.
feedback_idintegerrequiredID of the feedback post to updatecomponentstringoptionalComponent 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 titletypestringoptionalNew 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.
namestringrequiredNew internal name for the surveysurvey_idstringrequiredSurvey ID to renamesleekplanmcp_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.
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