Sleekplan MCP connector
OAuth2.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:
- Create changelog, comment, feedback — Create a new changelog entry
- Delete changelog, comment, feedback — Permanently delete a changelog entry
- Get category template, changelog, feedback — Get the title/description preset template for a feedback type
- List admins, changelog, comments — List admin users (team members) with access to this workspace
- Feedback merge, tag — Merge one feedback post into another, combining votes and comments
- Update changelog, comment, feedback — Update an existing changelog entry
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_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_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).
meta_origin/meta_service tag where the post came from for later filtering.6 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). meta_origin/meta_service tag where the post came from for later filtering.
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.descriptionstringoptionalOptional detailed description. Markdown is supported.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_feedback#Permanently delete a feedback post.1 param
Permanently delete a feedback post.
feedback_idintegerrequiredID of the feedback post to deletesleekplanmcp_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 (from sleekplan://tags or list_tags)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_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_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_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_feedback#List feedback posts with optional filtering and sorting.
Before filtering by type/status/tag/segment/owner, read the corresponding resource
(sleekplan://feedback-types, sleekplan://feedback-statuses, sleekplan://tags,
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_segments, list_admins).11 params
List feedback posts with optional filtering and sorting. Before filtering by type/status/tag/segment/owner, read the corresponding resource (sleekplan://feedback-types, sleekplan://feedback-statuses, sleekplan://tags, 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_segments, list_admins).
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.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_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 id/name per tag; use `id` with tag_feedback
to attach a tag to a post, or with 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 id/name per tag; use `id` with tag_feedback to attach a tag to a post, or with 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_tag_feedback#Add or remove a tag on a feedback post.3 params
Add or remove a tag on a feedback post.
feedback_idintegerrequiredID of the feedback posttag_idstringrequiredID of the tag to add or removeactionstringoptionalAction 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).
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_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), and sleekplan://admins (or list_admins) first to pick valid
keys/IDs for type/status/owner_id.8 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), and sleekplan://admins (or list_admins) first to pick valid keys/IDs for type/status/owner_id.
feedback_idintegerrequiredID of the feedback post to updatedescriptionstringoptionalNew 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