Sleek turns a plain-language brief into real, editable mobile app screens, and renders them as images you can show inline.
Flow: create_project (or list_projects to reuse one), then design, then screenshot, then share the projectUrl the tools return. That URL is where your user opens, edits, and exports the designs; send it every time, do not just describe what was made.
Send the whole request as ONE design message. The agent plans a screen set together, so a single call for 'onboarding, home, item detail, cart, and profile for a plant shop app' produces a coherent app. Five separate calls produce five unrelated screens and charge for each one.
Design runs spend the workspace's AI credits; listing, reading, and rendering are free. Free accounts can try the API with their one-time trial credits (about one design run); sustained use requires the Pro plan or higher ($69/month, or $30/month billed yearly at $360/year, including 20,000 monthly AI credits).
One design run at a time per project. On CONFLICT, poll get_design_run until the current run settles (completed or failed), then retry. cancel_design_run asks a run to stop sooner; the project stays locked until the run settles.
If a tool returns a URL, send your user there. The API includes one exactly when a human has to act (sign in, upgrade, top up credits), and relaying it is how they unblock you.
Auth: connect over OAuth, or send an API key created at https://sleek.design/agents/setup as an "Authorization: Bearer [redacted]" header.
Protocol
Pass100/10020 / 20 pts
Connection, authentication, and protocol compatibility.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description82/100
List the workspace's projects, newest first. Each project holds one app's screens, theme, and design chat. Check here before create_project to avoid duplicates.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Number of items to return.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
offset
Number of items to skip before this page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description81/100
Create an empty project, then call design and screenshot. Creation is free and instant. Only design runs spend credits. Share projectUrl so your user can watch and edit the designs.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Display name for the new project.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"data",
"projectUrl"
],
"properties": {
"data": {
"type": "object",
"required": [
"id",
"name",
"slug",
"createdAt",
"updatedAt"
],
"properties": {
"id": {
"type": "string",
"description": "Use as projectId to access this project."
},
"name": {
"type": "string"
},
"slug": {
"type": "string",
"description": "Slugified project name. Use id to address the project."
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
},
"additionalProperties": false
},
"projectUrl": {
"type": "string",
"description": "Open link for the project. Share it with your user."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get_project",
"title": "Get a project",
"description": "Fetch a project and its projectUrl. Use it to confirm the project exists and share the URL with your user. Use list_components to see its screens.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"projectId"
],
"properties": {
"projectId": {
"type": "string",
"description": "Project id from an item's id in list_projects, or data.id in create_project."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"data",
"projectUrl"
],
"properties": {
"data": {
"type": "object",
"required": [
"id",
"name",
"slug",
"createdAt",
"updatedAt"
],
"properties": {
"id": {
"type": "string",
"description": "Use as projectId to access this project."
},
"name": {
"type": "string"
},
"slug": {
"type": "string",
"description": "Slugified project name. Use id to address the project."
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
},
"additionalProperties": false
},
"projectUrl": {
"type": "string",
"description": "Open link for the project. Share it with your user."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Permanently delete a project and all its screens. Designs cannot be recovered. Call only after your user confirms the exact project by name. Never delete projects to tidy up on your own initiative.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
projectId
Project id from an item's id in list_projects, or data.id in create_project.
Clear enough to supply this argument.
confirm
Set only after your user confirms this exact project by name. Deletion is irreversible.
{
"name": "delete_project",
"title": "Delete a project",
"description": "Permanently delete a project and all its screens. Designs cannot be recovered. Call only after your user confirms the exact project by name. Never delete projects to tidy up on your own initiative.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"projectId",
"confirm"
],
"properties": {
"confirm": {
"type": "boolean",
"const": true,
"description": "Set only after your user confirms this exact project by name. Deletion is irreversible."
},
"projectId": {
"type": "string",
"description": "Project id from an item's id in list_projects, or data.id in create_project."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"deleted",
"projectId"
],
"properties": {
"deleted": {
"type": "boolean",
"const": true
},
"projectId": {
"type": "string"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
Align the title with the capability actually described by this tool.
Description92/100
List a project's screen names and active version numbers without generated HTML. Pass each item's screenId to design. Pass its id as componentId to get_component or in componentIds to screenshot. Use get_component only when you need a screen's code.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
Project id from an item's id in list_projects, or data.id in create_project.
Clear enough to supply this argument.
limit
Number of items to return.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
offset
Number of items to skip before this page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"data",
"pagination"
],
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"screenId",
"name",
"activeVersion",
"createdAt",
"updatedAt"
],
"properties": {
"id": {
"type": "string",
"description": "Use as componentId to fetch HTML or in componentIds to render screenshots."
},
"name": {
"type": "string"
},
"screenId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The id of the screen this component renders on the canvas. It is the value target.screenId takes when you edit this screen with a chat message, and the same screenId run results report. Null when the component is not placed on a canvas."
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
},
"activeVersion": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Version number the screen currently shows. Null before the screen has a version."
}
},
"additionalProperties": false
}
},
"pagination": {
"type": "object",
"required": [
"total",
"limit",
"offset"
],
"properties": {
"limit": {
"type": "number"
},
"total": {
"type": "number",
"description": "Total items across all pages."
},
"offset": {
"type": "number"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list_components",
"title": "List screens",
"description": "List a project's screen names and active version numbers without generated HTML. Pass each item's screenId to design. Pass its id as componentId to get_component or in componentIds to screenshot. Use get_component only when you need a screen's code.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"projectId"
],
"properties": {
"limit": {
"type": "integer",
"default": 50,
"maximum": 100,
"minimum": 1,
"description": "Number of items to return."
},
"offset": {
"type": "integer",
"default": 0,
"maximum": 9007199254740991,
"minimum": 0,
"description": "Number of items to skip before this page."
},
"projectId": {
"type": "string",
"description": "Project id from an item's id in list_projects, or data.id in create_project."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"data",
"pagination"
],
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"screenId",
"name",
"activeVersion",
"createdAt",
"updatedAt"
],
"properties": {
"id": {
"type": "string",
"description": "Use as componentId to fetch HTML or in componentIds to render screenshots."
},
"name": {
"type": "string"
},
"screenId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The id of the screen this component renders on the canvas. It is the value target.screenId takes when you edit this screen with a chat message, and the same screenId run results report. Null when the component is not placed on a canvas."
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
},
"activeVersion": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Version number the screen currently shows. Null before the screen has a version."
}
},
"additionalProperties": false
}
},
"pagination": {
"type": "object",
"required": [
"total",
"limit",
"offset"
],
"properties": {
"limit": {
"type": "number"
},
"total": {
"type": "number",
"description": "Total items across all pages."
},
"offset": {
"type": "number"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
Align the title with the capability actually described by this tool.
Description92/100
Fetch a screen's generated HTML. Returns only the version the screen currently shows. Use allVersions for the full history, which can be large. The returned screenId is the value design takes. Use this for a build handoff, not to check whether a design run worked.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
projectId
Project id from an item's id in list_projects, or data.id in create_project.
Clear enough to supply this argument.
componentId
Component id from an item's id in list_components, or a componentId in a run's data.result.operations. Not a screenId.
Clear enough to supply this argument.
inlineIcons
Inline icons as SVG so the HTML works without loading Iconify.
Clear enough to supply this argument.
allVersions
Return every stored version instead of just the active one. Payloads grow quickly; leave it off unless you need the history.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"data"
],
"properties": {
"data": {
"type": "object",
"required": [
"id",
"screenId",
"name",
"activeVersion",
"versions",
"createdAt",
"updatedAt"
],
"properties": {
"id": {
"type": "string",
"description": "Use as componentId to fetch HTML or in componentIds to render screenshots."
},
"name": {
"type": "string"
},
"screenId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The id of the screen this component renders on the canvas. It is the value target.screenId takes when you edit this screen with a chat message, and the same screenId run results report. Null when the component is not placed on a canvas."
},
"versions": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"version",
"code",
"createdAt"
],
"properties": {
"id": {
"type": "string"
},
"code": {
"type": "string",
"description": "Generated HTML for this screen revision."
},
"version": {
"type": "number"
},
"createdAt": {
"type": "string"
}
},
"additionalProperties": false
},
"description": "Stored screen revisions with their generated HTML."
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
},
"activeVersion": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Version number the screen currently shows. Null before the screen has a version."
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get_component",
"title": "Get a screen's HTML",
"description": "Fetch a screen's generated HTML. Returns only the version the screen currently shows. Use allVersions for the full history, which can be large. The returned screenId is the value design takes. Use this for a build handoff, not to check whether a design run worked.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"projectId",
"componentId"
],
"properties": {
"projectId": {
"type": "string",
"description": "Project id from an item's id in list_projects, or data.id in create_project."
},
"allVersions": {
"type": "boolean",
"default": false,
"description": "Return every stored version instead of just the active one. Payloads grow quickly; leave it off unless you need the history."
},
"componentId": {
"type": "string",
"description": "Component id from an item's id in list_components, or a componentId in a run's data.result.operations. Not a screenId."
},
"inlineIcons": {
"type": "boolean",
"default": false,
"description": "Inline icons as SVG so the HTML works without loading Iconify."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"data"
],
"properties": {
"data": {
"type": "object",
"required": [
"id",
"screenId",
"name",
"activeVersion",
"versions",
"createdAt",
"updatedAt"
],
"properties": {
"id": {
"type": "string",
"description": "Use as componentId to fetch HTML or in componentIds to render screenshots."
},
"name": {
"type": "string"
},
"screenId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The id of the screen this component renders on the canvas. It is the value target.screenId takes when you edit this screen with a chat message, and the same screenId run results report. Null when the component is not placed on a canvas."
},
"versions": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"version",
"code",
"createdAt"
],
"properties": {
"id": {
"type": "string"
},
"code": {
"type": "string",
"description": "Generated HTML for this screen revision."
},
"version": {
"type": "number"
},
"createdAt": {
"type": "string"
}
},
"additionalProperties": false
},
"description": "Stored screen revisions with their generated HTML."
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
},
"activeVersion": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Version number the screen currently shows. Null before the screen has a version."
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
List curated app styles and their preview images. When your user asks for a look such as Airbnb, brutalist, or dark fintech, pass the closest reference's id as referenceId to design. Without a reference, the agent picks a style.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Number of items to return.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
offset
Number of items to skip before this page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Run Sleek's design agent to create or edit screens from a plain-language brief. Send the whole request as ONE message, such as 'a food delivery app with onboarding, restaurants, dish detail, cart, tracking, and profile'. The agent plans the screens together, so separate calls produce mismatched screens. A run spends workspace credits when it completes or saves changes. By default this waits for the run to finish. If it returns 'queued' or 'running', poll get_design_run. Only one run can be active per project. On CONFLICT, poll get_design_run until the run settles, then retry. cancel_design_run stops it sooner. If a failed run has data.error.url, your user has to act there, such as topping up credits, before you retry. On completion, share projectUrl with your user and call screenshot.
The description explains the capability, when to use it, and what to expect.
Inputs86/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
Project id from an item's id in list_projects, or data.id in create_project.
Clear enough to supply this argument.
message
The full design brief, as one message. Name every screen you want in this single request.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
imageUrls
HTTPS image URLs for visual input, such as screenshots, logos, or style references.
Clear enough to supply this argument.
screenId
Edit this existing screen instead of creating new ones. Use the screenId from list_components, or from a previous run's data.result.operations (via design or get_design_run). It is not the component id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
referenceId
Design reference to imitate, from list_references.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
wait
Wait for the run to finish before returning. The wait is capped at 270 seconds, after which you get status 'running' back and poll get_design_run. Set false to return immediately and poll from the start, which is the better choice if your client times tool calls out sooner than that.
Clear enough to supply this argument.
idempotencyKey
Pick a unique key for each new design request, such as a UUID. Reuse it for retries to return the original run without a second charge.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"data",
"projectUrl"
],
"properties": {
"data": {
"type": "object",
"required": [
"runId",
"status",
"statusUrl"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message"
],
"properties": {
"url": {
"type": "string",
"description": "Where the caller's user can resolve this error (e.g. top up credits). Relay it to the user."
},
"code": {
"type": "string",
"description": "Failure reason, such as out_of_credits, cancelled, execution_timeout, execution_failed, or request_message_persist_failed."
},
"message": {
"type": "string"
}
},
"additionalProperties": false
},
"runId": {
"type": "string",
"description": "Use as runId to poll or cancel this run."
},
"result": {
"type": "object",
"required": [
"assistantText",
"operations"
],
"properties": {
"operations": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"required": [
"type",
"screenId",
"screenName",
"componentId"
],
"properties": {
"type": {
"type": "string",
"const": "screen_created"
},
"screenId": {
"type": "string",
"description": "Id of the screen. Pass it to a later run to edit this screen."
},
"screenName": {
"type": "string"
},
"componentId": {
"type": "string",
"description": "Use as componentId to fetch HTML or in componentIds to render screenshots."
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"type",
"screenId",
"componentId"
],
"properties": {
"type": {
"type": "string",
"const": "screen_updated"
},
"screenId": {
"type": "string",
"description": "Id of the screen. Pass it to a later run to edit this screen."
},
"componentId": {
"type": "string",
"description": "Use as componentId to fetch HTML or in componentIds to render screenshots."
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"type": "string",
"const": "theme_updated"
}
},
"additionalProperties": false
}
]
},
"description": "Screen creations, screen updates, and theme changes saved by the run."
},
"assistantText": {
"type": "string",
"description": "The design agent's reply text."
}
},
"description": "Failed runs can include changes saved before failure.",
"additionalProperties": false
},
"status": {
"enum": [
"queued",
"running",
"completed",
"failed"
],
"type": "string"
},
"statusUrl": {
"type": "string",
"description": "Relative REST path for polling this run."
}
},
"additionalProperties": false
},
"projectUrl": {
"type": "string",
"description": "Open link for the project. Share it with your user."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "design",
"title": "Design screens with AI",
"description": "Run Sleek's design agent to create or edit screens from a plain-language brief. Send the whole request as ONE message, such as 'a food delivery app with onboarding, restaurants, dish detail, cart, tracking, and profile'. The agent plans the screens together, so separate calls produce mismatched screens. A run spends workspace credits when it completes or saves changes. By default this waits for the run to finish. If it returns 'queued' or 'running', poll get_design_run. Only one run can be active per project. On CONFLICT, poll get_design_run until the run settles, then retry. cancel_design_run stops it sooner. If a failed run has data.error.url, your user has to act there, such as topping up credits, before you retry. On completion, share projectUrl with your user and call screenshot.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"projectId",
"message"
],
"properties": {
"wait": {
"type": "boolean",
"default": true,
"description": "Wait for the run to finish before returning. The wait is capped at 270 seconds, after which you get status 'running' back and poll get_design_run. Set false to return immediately and poll from the start, which is the better choice if your client times tool calls out sooner than that."
},
"message": {
"type": "string",
"minLength": 1,
"description": "The full design brief, as one message. Name every screen you want in this single request."
},
"screenId": {
"type": "string",
"minLength": 1,
"description": "Edit this existing screen instead of creating new ones. Use the screenId from list_components, or from a previous run's data.result.operations (via design or get_design_run). It is not the component id."
},
"imageUrls": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
},
"default": [],
"description": "HTTPS image URLs for visual input, such as screenshots, logos, or style references."
},
"projectId": {
"type": "string",
"minLength": 1,
"description": "Project id from an item's id in list_projects, or data.id in create_project."
},
"referenceId": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "Design reference to imitate, from list_references."
},
"idempotencyKey": {
"type": "string",
"maxLength": 255,
"description": "Pick a unique key for each new design request, such as a UUID. Reuse it for retries to return the original run without a second charge."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"data",
"projectUrl"
],
"properties": {
"data": {
"type": "object",
"required": [
"runId",
"status",
"statusUrl"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message"
],
"properties": {
"url": {
"type": "string",
"description": "Where the caller's user can resolve this error (e.g. top up credits). Relay it to the user."
},
"code": {
"type": "string",
"description": "Failure reason, such as out_of_credits, cancelled, execution_timeout, execution_failed, or request_message_persist_failed."
},
"message": {
"type": "string"
}
},
"additionalProperties": false
},
"runId": {
"type": "string",
"description": "Use as runId to poll or cancel this run."
},
"result": {
"type": "object",
"required": [
"assistantText",
"operations"
],
"properties": {
"operations": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"required": [
"type",
"screenId",
"screenName",
"componentId"
],
"properties": {
"type": {
"type": "string",
"const": "screen_created"
},
"screenId": {
"type": "string",
"description": "Id of the screen. Pass it to a later run to edit this screen."
},
"screenName": {
"type": "string"
},
"componentId": {
"type": "string",
"description": "Use as componentId to fetch HTML or in componentIds to render screenshots."
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"type",
"screenId",
"componentId"
],
"properties": {
"type": {
"type": "string",
"const": "screen_updated"
},
"screenId": {
"type": "string",
"description": "Id of the screen. Pass it to a later run to edit this screen."
},
"componentId": {
"type": "string",
"description": "Use as componentId to fetch HTML or in componentIds to render screenshots."
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"type": "string",
"const": "theme_updated"
}
},
"additionalProperties": false
}
]
},
"description": "Screen creations, screen updates, and theme changes saved by the run."
},
"assistantText": {
"type": "string",
"description": "The design agent's reply text."
}
},
"description": "Failed runs can include changes saved before failure.",
"additionalProperties": false
},
"status": {
"enum": [
"queued",
"running",
"completed",
"failed"
],
"type": "string"
},
"statusUrl": {
"type": "string",
"description": "Relative REST path for polling this run."
}
},
"additionalProperties": false
},
"projectUrl": {
"type": "string",
"description": "Open link for the project. Share it with your user."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Poll a run that design returned as 'queued' or 'running'. Wait a few seconds between polls. On 'completed', data.result.operations lists the saved screens and theme changes. Share projectUrl and call screenshot. On 'failed', read data.error.message and send your user to data.error.url if present. A failed run, including a cancelled one, keeps what it saved in that same list and is charged only when the list is not empty. Check it before resending the brief.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
projectId
Project id from an item's id in list_projects, or data.id in create_project.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"data",
"projectUrl"
],
"properties": {
"data": {
"type": "object",
"required": [
"runId",
"status",
"statusUrl"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message"
],
"properties": {
"url": {
"type": "string",
"description": "Where the caller's user can resolve this error (e.g. top up credits). Relay it to the user."
},
"code": {
"type": "string",
"description": "Failure reason, such as out_of_credits, cancelled, execution_timeout, execution_failed, or request_message_persist_failed."
},
"message": {
"type": "string"
}
},
"additionalProperties": false
},
"runId": {
"type": "string",
"description": "Use as runId to poll or cancel this run."
},
"result": {
"type": "object",
"required": [
"assistantText",
"operations"
],
"properties": {
"operations": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"required": [
"type",
"screenId",
"screenName",
"componentId"
],
"properties": {
"type": {
"type": "string",
"const": "screen_created"
},
"screenId": {
"type": "string",
"description": "Id of the screen. Pass it to a later run to edit this screen."
},
"screenName": {
"type": "string"
},
"componentId": {
"type": "string",
"description": "Use as componentId to fetch HTML or in componentIds to render screenshots."
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"type",
"screenId",
"componentId"
],
"properties": {
"type": {
"type": "string",
"const": "screen_updated"
},
"screenId": {
"type": "string",
"description": "Id of the screen. Pass it to a later run to edit this screen."
},
"componentId": {
"type": "string",
"description": "Use as componentId to fetch HTML or in componentIds to render screenshots."
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"type": "string",
"const": "theme_updated"
}
},
"additionalProperties": false
}
]
},
"description": "Screen creations, screen updates, and theme changes saved by the run."
},
"assistantText": {
"type": "string",
"description": "The design agent's reply text."
}
},
"description": "Failed runs can include changes saved before failure.",
"additionalProperties": false
},
"status": {
"enum": [
"queued",
"running",
"completed",
"failed"
],
"type": "string"
},
"statusUrl": {
"type": "string",
"description": "Relative REST path for polling this run."
}
},
"additionalProperties": false
},
"projectUrl": {
"type": "string",
"description": "Open link for the project. Share it with your user."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get_design_run",
"title": "Get a design run",
"description": "Poll a run that design returned as 'queued' or 'running'. Wait a few seconds between polls. On 'completed', data.result.operations lists the saved screens and theme changes. Share projectUrl and call screenshot. On 'failed', read data.error.message and send your user to data.error.url if present. A failed run, including a cancelled one, keeps what it saved in that same list and is charged only when the list is not empty. Check it before resending the brief.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"projectId",
"runId"
],
"properties": {
"runId": {
"type": "string",
"minLength": 1,
"description": "Run id from data.runId in a design result."
},
"projectId": {
"type": "string",
"minLength": 1,
"description": "Project id from an item's id in list_projects, or data.id in create_project."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"data",
"projectUrl"
],
"properties": {
"data": {
"type": "object",
"required": [
"runId",
"status",
"statusUrl"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message"
],
"properties": {
"url": {
"type": "string",
"description": "Where the caller's user can resolve this error (e.g. top up credits). Relay it to the user."
},
"code": {
"type": "string",
"description": "Failure reason, such as out_of_credits, cancelled, execution_timeout, execution_failed, or request_message_persist_failed."
},
"message": {
"type": "string"
}
},
"additionalProperties": false
},
"runId": {
"type": "string",
"description": "Use as runId to poll or cancel this run."
},
"result": {
"type": "object",
"required": [
"assistantText",
"operations"
],
"properties": {
"operations": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"required": [
"type",
"screenId",
"screenName",
"componentId"
],
"properties": {
"type": {
"type": "string",
"const": "screen_created"
},
"screenId": {
"type": "string",
"description": "Id of the screen. Pass it to a later run to edit this screen."
},
"screenName": {
"type": "string"
},
"componentId": {
"type": "string",
"description": "Use as componentId to fetch HTML or in componentIds to render screenshots."
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"type",
"screenId",
"componentId"
],
"properties": {
"type": {
"type": "string",
"const": "screen_updated"
},
"screenId": {
"type": "string",
"description": "Id of the screen. Pass it to a later run to edit this screen."
},
"componentId": {
"type": "string",
"description": "Use as componentId to fetch HTML or in componentIds to render screenshots."
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"type": "string",
"const": "theme_updated"
}
},
"additionalProperties": false
}
]
},
"description": "Screen creations, screen updates, and theme changes saved by the run."
},
"assistantText": {
"type": "string",
"description": "The design agent's reply text."
}
},
"description": "Failed runs can include changes saved before failure.",
"additionalProperties": false
},
"status": {
"enum": [
"queued",
"running",
"completed",
"failed"
],
"type": "string"
},
"statusUrl": {
"type": "string",
"description": "Relative REST path for polling this run."
}
},
"additionalProperties": false
},
"projectUrl": {
"type": "string",
"description": "Open link for the project. Share it with your user."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Ask a design run to stop, for example when the brief was wrong. A queued run never starts. A running run stops at its next step and stays 'running' until it settles. A run cut short settles as 'failed' with error code 'cancelled', or 'execution_failed' if saving its changes failed. It keeps any screens and theme changes it saved, listed in data.result.operations, and is charged only when that list is not empty. A run that had already finished settles as 'completed'. The project stays locked until the run settles, so poll get_design_run before starting another run. A run that stopped responding settles as 'failed' with error code 'execution_timeout' 15 minutes after creation.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
projectId
Project id from an item's id in list_projects, or data.id in create_project.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"data",
"projectUrl"
],
"properties": {
"data": {
"type": "object",
"required": [
"runId",
"status",
"statusUrl"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message"
],
"properties": {
"url": {
"type": "string",
"description": "Where the caller's user can resolve this error (e.g. top up credits). Relay it to the user."
},
"code": {
"type": "string",
"description": "Failure reason, such as out_of_credits, cancelled, execution_timeout, execution_failed, or request_message_persist_failed."
},
"message": {
"type": "string"
}
},
"additionalProperties": false
},
"runId": {
"type": "string",
"description": "Use as runId to poll or cancel this run."
},
"result": {
"type": "object",
"required": [
"assistantText",
"operations"
],
"properties": {
"operations": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"required": [
"type",
"screenId",
"screenName",
"componentId"
],
"properties": {
"type": {
"type": "string",
"const": "screen_created"
},
"screenId": {
"type": "string",
"description": "Id of the screen. Pass it to a later run to edit this screen."
},
"screenName": {
"type": "string"
},
"componentId": {
"type": "string",
"description": "Use as componentId to fetch HTML or in componentIds to render screenshots."
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"type",
"screenId",
"componentId"
],
"properties": {
"type": {
"type": "string",
"const": "screen_updated"
},
"screenId": {
"type": "string",
"description": "Id of the screen. Pass it to a later run to edit this screen."
},
"componentId": {
"type": "string",
"description": "Use as componentId to fetch HTML or in componentIds to render screenshots."
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"type": "string",
"const": "theme_updated"
}
},
"additionalProperties": false
}
]
},
"description": "Screen creations, screen updates, and theme changes saved by the run."
},
"assistantText": {
"type": "string",
"description": "The design agent's reply text."
}
},
"description": "Failed runs can include changes saved before failure.",
"additionalProperties": false
},
"status": {
"enum": [
"queued",
"running",
"completed",
"failed"
],
"type": "string"
},
"statusUrl": {
"type": "string",
"description": "Relative REST path for polling this run."
}
},
"additionalProperties": false
},
"projectUrl": {
"type": "string",
"description": "Open link for the project. Share it with your user."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "cancel_design_run",
"title": "Cancel a design run",
"description": "Ask a design run to stop, for example when the brief was wrong. A queued run never starts. A running run stops at its next step and stays 'running' until it settles. A run cut short settles as 'failed' with error code 'cancelled', or 'execution_failed' if saving its changes failed. It keeps any screens and theme changes it saved, listed in data.result.operations, and is charged only when that list is not empty. A run that had already finished settles as 'completed'. The project stays locked until the run settles, so poll get_design_run before starting another run. A run that stopped responding settles as 'failed' with error code 'execution_timeout' 15 minutes after creation.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"projectId",
"runId"
],
"properties": {
"runId": {
"type": "string",
"minLength": 1,
"description": "Run id from data.runId in a design result."
},
"projectId": {
"type": "string",
"minLength": 1,
"description": "Project id from an item's id in list_projects, or data.id in create_project."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"data",
"projectUrl"
],
"properties": {
"data": {
"type": "object",
"required": [
"runId",
"status",
"statusUrl"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message"
],
"properties": {
"url": {
"type": "string",
"description": "Where the caller's user can resolve this error (e.g. top up credits). Relay it to the user."
},
"code": {
"type": "string",
"description": "Failure reason, such as out_of_credits, cancelled, execution_timeout, execution_failed, or request_message_persist_failed."
},
"message": {
"type": "string"
}
},
"additionalProperties": false
},
"runId": {
"type": "string",
"description": "Use as runId to poll or cancel this run."
},
"result": {
"type": "object",
"required": [
"assistantText",
"operations"
],
"properties": {
"operations": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"required": [
"type",
"screenId",
"screenName",
"componentId"
],
"properties": {
"type": {
"type": "string",
"const": "screen_created"
},
"screenId": {
"type": "string",
"description": "Id of the screen. Pass it to a later run to edit this screen."
},
"screenName": {
"type": "string"
},
"componentId": {
"type": "string",
"description": "Use as componentId to fetch HTML or in componentIds to render screenshots."
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"type",
"screenId",
"componentId"
],
"properties": {
"type": {
"type": "string",
"const": "screen_updated"
},
"screenId": {
"type": "string",
"description": "Id of the screen. Pass it to a later run to edit this screen."
},
"componentId": {
"type": "string",
"description": "Use as componentId to fetch HTML or in componentIds to render screenshots."
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"type": "string",
"const": "theme_updated"
}
},
"additionalProperties": false
}
]
},
"description": "Screen creations, screen updates, and theme changes saved by the run."
},
"assistantText": {
"type": "string",
"description": "The design agent's reply text."
}
},
"description": "Failed runs can include changes saved before failure.",
"additionalProperties": false
},
"status": {
"enum": [
"queued",
"running",
"completed",
"failed"
],
"type": "string"
},
"statusUrl": {
"type": "string",
"description": "Relative REST path for polling this run."
}
},
"additionalProperties": false
},
"projectUrl": {
"type": "string",
"description": "Open link for the project. Share it with your user."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description82/100
Render up to four project screens as one inline image, after a design run completes. Rendering is free. Send projectUrl with the image so your user can open and edit the designs.
Describe the returned information so the agent knows whether it will answer the request.
Inputs96/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
Project id from an item's id in list_projects, or data.id in create_project.
Clear enough to supply this argument.
componentIds
Component id from an item's id in list_components, or a componentId in a run's data.result.operations. Not a screenId. Screens render left to right. Render more than 4 in separate calls.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
format
Image encoding for the screenshot.
Clear enough to supply this argument.
scale
Pixel density. 1 is right for showing a design in chat; raise it only when the user asked for a high-resolution export.
Clear enough to supply this argument.
fullHeight
Expand each frame to the full height of its content before capturing, so scrollable screens are rendered fully extended rather than cut off at the bottom of the frame. Frames are capped at 4x the default frame height.
Clear enough to supply this argument.
background
CSS background behind the frames, such as "#ffffff" or "transparent".
Clear enough to supply this argument.
padding
Space in pixels on each side of the row of frames.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "screenshot",
"title": "Render screens to an image",
"description": "Render up to four project screens as one inline image, after a design run completes. Rendering is free. Send projectUrl with the image so your user can open and edit the designs.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"projectId",
"componentIds"
],
"properties": {
"scale": {
"type": "integer",
"default": 1,
"maximum": 3,
"minimum": 1,
"description": "Pixel density. 1 is right for showing a design in chat; raise it only when the user asked for a high-resolution export."
},
"format": {
"enum": [
"png",
"webp"
],
"type": "string",
"default": "png",
"description": "Image encoding for the screenshot."
},
"padding": {
"type": "integer",
"default": 40,
"maximum": 9007199254740991,
"minimum": 0,
"description": "Space in pixels on each side of the row of frames."
},
"projectId": {
"type": "string",
"minLength": 1,
"description": "Project id from an item's id in list_projects, or data.id in create_project."
},
"background": {
"type": "string",
"default": "transparent",
"description": "CSS background behind the frames, such as \"#ffffff\" or \"transparent\"."
},
"fullHeight": {
"type": "boolean",
"default": false,
"description": "Expand each frame to the full height of its content before capturing, so scrollable screens are rendered fully extended rather than cut off at the bottom of the frame. Frames are capped at 4x the default frame height."
},
"componentIds": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 4,
"minItems": 1,
"description": "Component id from an item's id in list_components, or a componentId in a run's data.result.operations. Not a screenId. Screens render left to right. Render more than 4 in separate calls."
}
}
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
Loading score analytics…
Put your MCP to the test
A few tasks worth trying with this server, chosen from its reviewed tools. These have not been run.
01List projectsList the workspace's projects, newest first.
02List design referencesList curated app styles and their preview images.
03Get a projectFetch a project and its projectUrl.
04List screensList a project's screen names and active version numbers without generated HTML.
05Render screens to an imageRender up to four project screens as one inline image, after a design run completes.
Want to run these tasks against your MCP server with us?
Sleek setup, tools, quality score, publishing readiness, and alternatives.
How do I add Sleek to Claude, ChatGPT, or Cursor?
Add Sleek to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://sleek.design/api/mcp.
Is Sleek MCP ready for ChatGPT and Claude?
As of October 15, 2026, Sleek scores 100/100 on Manufact's MCP publishing checklist. The scan meets ChatGPT publishing checks and meets Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is Sleek's MCP tool documentation?
As of October 15, 2026, Sleek scores 90/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 11 of 11 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What are the best alternatives to Sleek?
As of October 15, 2026, alternatives to Sleek in design-creative on the Manufact MCP catalog include Motion, Image Generation, streamloop-mcp, Runway, and pmw-mcp.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.