The Sleekplan MCP connector routes your AI agent's tool calls to Sleekplan's own MCP server through Scalekit. Each user signs in to Sleekplan once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 60 tools.
- Tools
- 60
- What they doRead · write · destructive
- 36 · 7 · 1736 read7 write17 destructive
- Users sign in with
- OAuth
- OAuth app
- Scalekit's or your own
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet 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>Create the Sleekplan MCP connection
In AgentKit > Connections, create a Sleekplan MCP connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Scalekit credentials are available for Sleekplan MCP server, so you don't need to register an OAuth app.
Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_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)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'sleekplanmcp_list_admins',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_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)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolsleekplanmcp_compare_document_versionsShow what changed between two versions of a document.Read-onlyCompareDocumentVersions
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.
Inputs
document_idintegerrequired- ID of the document.
from_versionintegerrequired- One version number to compare, 1 or higher. Get from list_document_versions.
to_versionintegerrequired- The other version number, 1 or higher. Order does not matter — the server sorts the pair.
sleekplanmcp_get_category_templateGet the title/description preset template for a feedback type.Read-onlyGetCategoryTemplate
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.
Inputs
type_keystringrequired- Feedback type key from list_feedback_types / sleekplan://feedback-types (e.g. 'bug', 'feature'). Strings only — not numeric IDs.
sleekplanmcp_get_changelogGet a single changelog entry by ID.Read-onlyGetChangelog
Get a single changelog entry by ID.
Inputs
changelog_idintegerrequired- ID of the changelog entry
sleekplanmcp_get_documentGet one document, including its full Markdown `content` and `current_version` number.Read-onlyGetDocument
Get one document, including its full Markdown `content` and `current_version` number.
Inputs
document_idintegerrequired- Document ID. Get from list_documents or list_feedback_documents results.
sleekplanmcp_get_document_versionRead what a document said at one specific version, body included.Read-onlyGetDocumentVersion
Read what a document said at one specific version, body included.
Inputs
document_idintegerrequired- ID of the document.
versionintegerrequired- Version number (1 or higher). Get from list_document_versions.
sleekplanmcp_get_feedbackGet a single feedback post by ID.Read-onlyGetFeedback
Get a single feedback post by ID.
Inputs
feedback_idintegerrequired- ID of the feedback post
sleekplanmcp_get_feedback_metaRead the custom meta key/value pairs attached to a feedback post.Read-onlyGetFeedbackMeta
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.
Inputs
feedback_idintegerrequired- ID of the feedback post
sleekplanmcp_get_feedback_statsGet vote and engagement statistics for a feedback post.Read-onlyGetFeedbackStats
Get vote and engagement statistics for a feedback post.
Inputs
feedback_idintegerrequired- ID of the feedback post
sleekplanmcp_get_similar_feedbackFind feedback posts similar to the given one.Read-onlyGetSimilarFeedback
Find feedback posts similar to the given one.
Inputs
feedback_idintegerrequired- ID of the feedback post
sleekplanmcp_get_surveyGet a single survey by ID, including its `settings` (question array) and `options` registry.Read-onlyGetSurvey
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.
Inputs
survey_idstringrequired- Survey ID, e.g. 'su67a1b2c3d'
sleekplanmcp_get_survey_question_feedPaginated feed of individual answers for one question, including user info per answer.Read-onlyGetSurveyQuestionFeed
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.
Inputs
question_idstringrequired- Question ID (the `qu...`-prefixed id from get_survey or get_survey_summary)
survey_idstringrequired- Survey ID
pageinteger- Page number (0-indexed)default
0 per_pageinteger- Number of results per pagedefault
50
sleekplanmcp_get_survey_responseFetch a single full response by its id — contains every answer the user gave.Read-onlyGetSurveyResponse
Fetch a single full response by its id — contains every answer the user gave.
Inputs
response_idstringrequired- Response ID (from list_survey_responses)
survey_idstringrequired- Survey ID
sleekplanmcp_get_survey_summaryAggregated response stats per question — the at-a-glance 'what did people answer' view.Read-onlyGetSurveySummary
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`.
Inputs
survey_idstringrequired- Survey ID to summarize
sleekplanmcp_get_userGet a single user by ID.Read-onlyGetUser
Get a single user by ID.
Inputs
user_idintegerrequired- ID of the user
sleekplanmcp_get_user_segmentGet the segment/plan information for a user.Read-onlyGetUserSegment
Get the segment/plan information for a user.
Inputs
user_idintegerrequired- ID of the user
sleekplanmcp_get_votersGet the list of users who voted on a feedback post (with vote direction).Read-onlyGetVoters
Get the list of users who voted on a feedback post (with vote direction).
Inputs
feedback_idintegerrequired- ID of the feedback post
filterstring- Filter: 'upvote' (default), 'downvote', 'subscribe', or 'priority'one of
upvotedownvotesubscribeprioritydefaultupvote pageinteger- Page number (0-indexed)default
0 per_pageinteger- Number of results per pagedefault
100
sleekplanmcp_list_adminsList admin users (team members) with access to this workspace.Read-onlyListAdmins
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.
Inputs
This tool takes no inputs.
sleekplanmcp_list_changelogList changelog entries with optional filtering.Read-onlyListChangelog
List changelog entries with optional filtering.
Inputs
pageinteger- Page number (0-indexed)default
0 per_pageinteger- Number of results per pagedefault
30 searchstring- Full-text search query
statusstring- Status filter: 'published', 'scheduled', 'draft', or 'all'one of
publishedscheduleddraftall typestring- Category filter — a key from sleekplan://feedback-types or list_feedback_types (filter to entries whose `disable_changelog` is falsy). Use 'all' for no filter.default
all
sleekplanmcp_list_commentsList comments on a feedback post, with pagination and sort order.Read-onlyListComments
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`.
Inputs
feedback_idintegerrequired- ID of the feedback post
pageinteger- Page number (0-indexed)default
0 per_pageinteger- Number of results per pagedefault
30 sortstring- Sort order: 'old' or 'new'one of
oldnewdefaultold
sleekplanmcp_list_componentsList component definitions for this workspace.Read-onlyListComponents
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.
Inputs
This tool takes no inputs.
sleekplanmcp_list_document_feedbackList the feedback posts one document informs — useful when a plan or spec covers several requests.Read-onlyListDocumentFeedback
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.
Inputs
document_idintegerrequired- ID of the document whose linked posts you want.
sleekplanmcp_list_document_typesList the document types this workspace defines.Read-onlyListDocumentTypes
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.
Inputs
This tool takes no inputs.
sleekplanmcp_list_document_versionsList a document's saved versions, newest first.Read-onlyListDocumentVersions
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.
Inputs
document_idintegerrequired- ID of the document whose history you want.
pageinteger- Page number, ZERO-based. Omit for the first page.
per_pageinteger- Results per page. Default 20, capped server-side at 100.
sleekplanmcp_list_documentsList documents in the workspace, newest first, with optional filtering.Read-onlyListDocuments
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.
Inputs
pageinteger- Page number, ZERO-based. Omit for the first page.
per_pageinteger- Results per page. Default 20, capped server-side at 100.
searchstring- Free-text search across document titles. Omit for no search.
statusstring- Filter by status: 'draft' (still being written), 'published' (finished and shared), or 'archived' (kept for the record, out of the way). Omit for all statuses.
typestring- Document 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_feedbackList feedback posts with optional filtering and sorting.Read-onlyListFeedback
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.
Inputs
advancedstring- Advanced 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.
componentstring- Filter 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.
filterstring- Filter 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.default
open ownerstring- Filter by owner admin user_id (from sleekplan://admins or list_admins), or 'all'. Omit for no filter.
pageinteger- Page number (0-indexed)default
0 per_pageinteger- Number of results per pagedefault
10 searchstring- Full-text search query
segmentstring- Filter by segment slug (from sleekplan://segments or list_segments). Use the segment's `slug` string, not `segment_id`.
sortstring- Sort order. One of: 'trend', 'top', 'fewest', 'new', 'old', 'updated', 'updated_asc', 'scoring', 'priority', 'precedence', 'eta'.one of
trendtopfewestnewoldupdatedupdated_ascscoringpriorityprecedenceetadefaulttrend tagsstring- Tag 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.
typestring- Filter 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.
userstring- Filter to posts created by this end-user_id.
sleekplanmcp_list_feedback_documentsList the documents that inform one feedback post — the thinking behind that request.Read-onlyListFeedbackDocuments
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.
Inputs
feedback_idintegerrequired- ID of the feedback post. Get from list_feedback results.
sleekplanmcp_list_feedback_statusesList feedback status definitions for this workspace.Read-onlyListFeedbackStatuses
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.
Inputs
This tool takes no inputs.
sleekplanmcp_list_feedback_typesList feedback type (category) definitions for this workspace.Read-onlyListFeedbackTypes
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.
Inputs
This tool takes no inputs.
sleekplanmcp_list_segmentsList user segments (named cohorts) configured for this workspace.Read-onlyListSegments
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.
Inputs
This tool takes no inputs.
sleekplanmcp_list_sub_topicsList sub-topics under a parent topic — a more detailed breakdown of the posts it contains.Read-onlyListSubTopics
List sub-topics under a parent topic — a more detailed breakdown of the posts it contains.
Inputs
topic_idintegerrequired- ID of the parent topic (from list_topics)
sleekplanmcp_list_survey_responsesPaginated list of every full response to a survey — all questions per row.Read-onlyListSurveyResponses
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.
Inputs
survey_idstringrequired- Survey ID
pageinteger- Page number (0-indexed)default
0 per_pageinteger- Number of results per pagedefault
50
sleekplanmcp_list_surveysList surveys configured for this workspace.Read-onlyListSurveys
List surveys configured for this workspace.
Inputs
pageinteger- Page number (0-indexed)default
0 per_pageinteger- Number of results per pagedefault
20 searchstring- Full-text search across survey names
sleekplanmcp_list_topicsList feedback topics — the top-level clusters Sleekplan's intelligence derives from posts.Read-onlyListTopics
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.
Inputs
This tool takes no inputs.
sleekplanmcp_list_usersList users in the workspace with optional search and filtering.Read-onlyListUsers
List users in the workspace with optional search and filtering.
Inputs
pageinteger- Page number (0-indexed)default
0 per_pageinteger- Number of results per pagedefault
20 searchstring- Search by name or email
segmentstring- Filter by user segment
sortstring- Sort order: 'updated', 'created', 'name'one of
updatedcreatednamedefaultupdated
sleekplanmcp_list_votesList all votes for a feedback post.Read-onlyListVotes
List all votes for a feedback post.
Inputs
feedback_idintegerrequired- ID of the feedback post
sleekplanmcp_create_changelogCreate a new changelog entry.WriteCreateChangelog
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.
Inputs
titlestringrequired- Title of the changelog entry
announcementboolean- Show as an in-app announcement when this entry publishes. Default False.default
false descriptionstring- Body of the changelog entry (HTML or Markdown — sanitized server-side)
draftboolean- Create as a draft instead of publishing immediately. Default False.default
false notifyboolean- Email-notify changelog subscribers when this entry publishes. Default False.default
false scheduledinteger- Unix timestamp (seconds) for when the entry should publish. 0 or omitted means publish now. Only meaningful when `draft` is False.
segmentstring- Segment 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.
typestring- Category 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_commentAdd a comment to a feedback post.WriteCreateComment
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.
Inputs
commentstringrequired- Comment text (Markdown supported)
feedback_idintegerrequired- ID of the feedback post to comment on
parentinteger- Optional 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.
pinnedboolean- Pin the comment to the top of the thread. Default false.default
false
sleekplanmcp_create_documentCreate a document — a plan, spec, research note, or decision record.WriteCreateDocument
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.
Inputs
titlestringrequired- Document title, 3-500 characters. Write it as the conclusion rather than the topic — 'Why we keep one feedback queue' beats 'Feedback queues'.
contentstring- Document body as MARKDOWN (headings, lists, tables, fenced code all work). Max 2MB. Omit to create an empty document.
document_typestring- Document 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'.
statusstring- Initial status: 'draft' (still being written), 'published' (finished and shared), or 'archived' (kept for the record, out of the way). Omit to default to 'draft'.
tagsarray- Free-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_feedbackCreate a new feedback post.WriteCreateFeedback
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.
Inputs
titlestringrequired- Title of the feedback post
typestringrequired- Feedback 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.
componentstring- Optional 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.
descriptionstring- Optional detailed description. Markdown is supported.
metaobject- Optional 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_originstring- Optional meta.origin tag — use this to mark who/what created the post (e.g. "mcp", "intelligence", "zapier"). Paired with meta_service.
meta_servicestring- Optional meta.service tag (e.g. "agent", "chat").
statusstring- Optional initial status key (from sleekplan://feedback-statuses or list_feedback_statuses). Omit to use the workspace default.
sleekplanmcp_create_surveyCreate a new survey.WriteCreateSurvey
Create a new survey. The `survey` array defines question order and content.
Inputs
namestringrequired- Internal name for the survey
surveyarrayrequired- 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.
sleekplanmcp_create_tagCreate a new workspace-level tag.WriteCreateTag
Create a new workspace-level tag. Tags can then be attached to feedback posts with tag_feedback(tag_id, action='add').
Inputs
namestringrequired- Tag 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_link_document_to_feedbackAttach a feedback post to a document, marking the document as informing that request.WriteLinkDocumentToFeedback
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.
Inputs
document_idintegerrequired- ID of the document. Get from list_documents.
feedback_idintegerrequired- ID of the feedback post to attach. Get from list_feedback results.
sleekplanmcp_delete_changelogPermanently delete a changelog entry.DestructiveDeleteChangelog
Permanently delete a changelog entry.
Inputs
changelog_idintegerrequired- ID of the changelog entry to delete
sleekplanmcp_delete_commentPermanently delete a comment from a feedback post.DestructiveDeleteComment
Permanently delete a comment from a feedback post.
Inputs
comment_idintegerrequired- ID of the comment to delete
feedback_idintegerrequired- ID of the feedback post
sleekplanmcp_delete_documentPermanently delete a document, its entire version history, and its feedback links.DestructiveDeleteDocument
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.
Inputs
document_idintegerrequired- ID of the document to delete.
sleekplanmcp_delete_feedbackPermanently delete a feedback post.DestructiveDeleteFeedback
Permanently delete a feedback post.
Inputs
feedback_idintegerrequired- ID of the feedback post to delete
sleekplanmcp_delete_feedback_metaRemove a single custom meta key from a feedback post.DestructiveDeleteFeedbackMeta
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.
Inputs
feedback_idintegerrequired- ID of the feedback post
keystringrequired- The meta key to remove (from get_feedback_meta). Other keys are left alone.
sleekplanmcp_delete_tagPermanently delete a workspace-level tag.DestructiveDeleteTag
Permanently delete a workspace-level tag. Removes it from every feedback post it was attached to.
Inputs
tag_idstringrequired- ID of the tag to delete, taken verbatim from sleekplan://tags or list_tags. Tag IDs are opaque hash STRINGS like 'tb059acd19eb4d8943916f547c04d98b9', never integers.
sleekplanmcp_merge_feedbackMerge one feedback post into another, combining votes and comments.DestructiveMergeFeedback
Merge one feedback post into another, combining votes and comments.
Inputs
source_idintegerrequired- ID of the feedback post to merge from (will be closed)
target_idintegerrequired- ID of the feedback post to merge into (will remain)
sleekplanmcp_restore_document_versionRestore an earlier version, replacing the document's current title, body, type, and tags.DestructiveRestoreDocumentVersion
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.
Inputs
document_idintegerrequired- ID of the document.
versionintegerrequired- Version number to restore, 1 or higher. Get from list_document_versions.
sleekplanmcp_set_feedback_metaAdd or update custom meta on an existing feedback post.DestructiveSetFeedbackMeta
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.
Inputs
feedback_idintegerrequired- ID of the feedback post
metaobjectrequired- One 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_feedbackAdd or remove a tag on a feedback post.DestructiveTagFeedback
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.
Inputs
feedback_idintegerrequired- ID of the feedback post
tag_idstringrequired- ID 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.
actionstring- Action to perform: 'add' or 'remove'one of
addremovedefaultadd
sleekplanmcp_unlink_document_from_feedbackRemove the link between a document and a feedback post.DestructiveUnlinkDocumentFromFeedback
Remove the link between a document and a feedback post. Only the association is removed — both the document and the post survive.
Inputs
document_idintegerrequired- ID of the document.
feedback_idintegerrequired- ID of the feedback post to detach.
sleekplanmcp_update_changelogUpdate an existing changelog entry.DestructiveUpdateChangelog
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).
Inputs
changelog_idintegerrequired- ID of the changelog entry to update
announcementboolean- Toggle in-app announcement. None = leave unchanged.
descriptionstring- New body (HTML or Markdown — sanitized server-side)
draftboolean- Toggle draft state. True=draft, False=published, None=leave unchanged.
notifyboolean- Toggle email notification. None = leave unchanged.
scheduledinteger- Unix timestamp for publish. 0 = publish now. None = leave unchanged.
segmentstring- Segment slug from sleekplan://segments or list_segments. Pass empty string to clear targeting. None = leave unchanged.
titlestring- New title
typestring- New 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_commentUpdate an existing comment.DestructiveUpdateComment
Update an existing comment. You can update text only, pin state only, or both — pass just the fields you want to change.
Inputs
comment_idintegerrequired- ID of the comment to update
feedback_idintegerrequired- ID of the feedback post
commentstring- New comment text (Markdown supported). Omit to keep existing text.
pinnedboolean- Set to true/false to pin or unpin. Omit to keep current pin state.
sleekplanmcp_update_documentUpdate a document.DestructiveUpdateDocument
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.
Inputs
document_idintegerrequired- ID of the document to update.
contentstring- New 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_typestring- Document 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.
statusstring- New status: 'draft' (still being written), 'published' (finished and shared), or 'archived' (kept for the record, out of the way). Omit to keep unchanged.
tagsarray- Replacement tag list, max 50. Pass [] to clear. Omit to keep unchanged.
titlestring- New title, 3-500 characters. Omit to keep unchanged.
sleekplanmcp_update_feedbackUpdate fields on an existing feedback post.DestructiveUpdateFeedback
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.
Inputs
feedback_idintegerrequired- ID of the feedback post to update
componentstring- Component 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.
descriptionstring- New description. Markdown is supported.
effortinteger- Internal team precedence. Integer 0–3 where 0 is unset and 3 is highest. Independent of user votes.
estimatedstring- Estimated 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_idinteger- New owner admin user_id (from sleekplan://admins or list_admins).
statusstring- New status key (from sleekplan://feedback-statuses or list_feedback_statuses).
titlestring- New title
typestring- New type/category key (from sleekplan://feedback-types or list_feedback_types).
sleekplanmcp_update_survey_nameRename a survey without touching its questions.DestructiveUpdateSurveyName
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.
Inputs
namestringrequired- New internal name for the survey
survey_idstringrequired- Survey ID to rename
sleekplanmcp_update_survey_questionsReplace the question set of an existing survey while keeping its name.DestructiveUpdateSurveyQuestions
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.
Inputs
surveyarrayrequired- New 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_idstringrequired- Survey ID whose questions to replace
No tools match.