Install
openclaw skills install stitchManage Stitch UI design projects and screens remotely, including creating projects, listing and retrieving screens, and generating or editing UI screens via...
openclaw skills install stitchStitch is Google's AI-powered UI design tool (Beta). This skill covers how to interact with Stitch projects and screens via its Remote MCP server using the HTTP API.
Generate your API key at: https://stitch.withgoogle.com/settings (API Keys section)
Set it as an environment variable: export STITCH_API_KEY=YOUR_STITCH_API_KEY
All requests go to: https://stitch.googleapis.com/mcp
Pass the key via header: X-Goog-Api-Key: $STITCH_API_KEY
Stitch exposes a standard MCP HTTP endpoint. To call a tool, POST to the MCP endpoint with the tool name and arguments.
curl -X POST https://stitch.googleapis.com/mcp \
-H "Content-Type: application/json" \
-H "X-Goog-Api-Key: YOUR_STITCH_API_KEY" \
-d '{
"method": "tools/call",
"params": {
"name": "list_projects",
"arguments": {}
}
}'
Note: Stitch is a Remote MCP server (cloud-hosted), unlike local file-based MCP servers. API Keys persist indefinitely; OAuth tokens expire every ~1 hour.
list_projectsLists all Stitch projects accessible to the user.
filter (optional, string): AIP-160 filter on view field. Values: view=owned (default), view=sharedProject objects# List all owned projects
curl -X POST https://stitch.googleapis.com/mcp \
-H "Content-Type: application/json" \
-H "X-Goog-Api-Key: YOUR_STITCH_API_KEY" \
-d '{"method":"tools/call","params":{"name":"list_projects","arguments":{}}}'
create_projectCreates a new Stitch project (container for UI designs).
title (optional, string): Display name of the projectProject resource with name, title, and metadatacurl -X POST https://stitch.googleapis.com/mcp \
-H "Content-Type: application/json" \
-H "X-Goog-Api-Key: YOUR_STITCH_API_KEY" \
-d '{"method":"tools/call","params":{"name":"create_project","arguments":{"title":"My Ad Landing Page"}}}'
get_projectRetrieves details of a specific project.
name (required, string): Resource name. Format: projects/{project}. Example: projects/4044680601076201931Project resource objectlist_screensLists all screens within a Stitch project.
projectId (required, string): Project ID without projects/ prefixScreen objectscurl -X POST https://stitch.googleapis.com/mcp \
-H "Content-Type: application/json" \
-H "X-Goog-Api-Key: YOUR_STITCH_API_KEY" \
-d '{"method":"tools/call","params":{"name":"list_screens","arguments":{"projectId":"4044680601076201931"}}}'
get_screenRetrieves details of a specific screen including HTML, screenshot, and Figma export.
name (required): projects/{project}/screens/{screen}projectId (required, deprecated): Project ID without prefixscreenId (required, deprecated): Screen ID without prefixAll three are currently required even though
projectId/screenIdare deprecated.
Screen object with htmlCode, screenshot, figmaExport download URLsgenerate_screen_from_textGenerates a new UI screen from a text prompt. Takes a few minutes.
get_screen after a few minutes to check.projectId (required, string)prompt (required, string): Describe the screen to generatedeviceType (optional): MOBILE | DESKTOP | TABLET | AGNOSTICmodelId (optional): GEMINI_3_FLASH | GEMINI_3_1_PRO (GEMINI_3_PRO is deprecated)Screen objects + SessionOutputComponent entries (may include suggestions)
output_components has suggestions, present them to user. If accepted, call again with the suggestion as the new prompt.curl -X POST https://stitch.googleapis.com/mcp \
-H "Content-Type: application/json" \
-H "X-Goog-Api-Key: YOUR_STITCH_API_KEY" \
-d '{
"method": "tools/call",
"params": {
"name": "generate_screen_from_text",
"arguments": {
"projectId": "YOUR_PROJECT_ID",
"prompt": "A mobile landing page for a Medicare insurance offer with a bold headline, trust badges, and a prominent CTA button",
"deviceType": "MOBILE",
"modelId": "GEMINI_3_1_PRO"
}
}
}'
edit_screensEdits existing screens using a text prompt. Takes a few minutes.
projectId (required, string)selectedScreenIds (required, string[]): Screen IDs without screens/ prefixprompt (required, string): Edit instructiondeviceType (optional)modelId (optional): GEMINI_3_FLASH | GEMINI_3_1_PROScreen objectsgenerate_variantsGenerates design variants of existing screens.
projectId (required, string)selectedScreenIds (required, string[])prompt (required, string): Guide variant generationvariantOptions (required, object): See VariantOptions belowdeviceType (optional)modelId (optional)Screen objectsVariantOptions schema:
{
"variantCount": 3,
"creativeRange": "EXPLORE",
"aspects": ["COLOR_SCHEME", "LAYOUT"]
}
variantCount: 1–5 (default: 3)creativeRange: REFINE | EXPLORE | REIMAGINEaspects: LAYOUT | COLOR_SCHEME | IMAGES | TEXT_FONT | TEXT_CONTENT| Field | Type | Description |
|---|---|---|
name | string | Resource name: projects/{project}/screens/{screen} |
id | string | (Deprecated) Screen ID |
title | string | Screen title |
prompt | string | Prompt used to generate |
screenshot | File | Screenshot image |
htmlCode | File | HTML code of the screen |
figmaExport | File | Figma export file |
theme | DesignTheme | Theme used |
deviceType | DeviceType | Device target |
screenMetadata | ScreenMetadata | Status, agent type, display mode |
width / height | string | Screen dimensions |
groupId | string | Group ID for variants |
| Field | Type | Description |
|---|---|---|
name | string | projects/{project}/files/{file} |
downloadUrl | string | Direct download URL |
mimeType | string | e.g. image/png, text/html |
| Field | Values |
|---|---|
status | IN_PROGRESS | COMPLETE | FAILED |
agentType | TURBO_AGENT, PRO_AGENT, GEMINI_3_AGENT, etc. |
displayMode | SCREENSHOT | HTML | CODE | MARKDOWN | STICKY_NOTE |
import requests
import json
API_KEY = "YOUR_STITCH_API_KEY"
MCP_URL = "https://stitch.googleapis.com/mcp"
HEADERS = {
"Content-Type": "application/json",
"X-Goog-Api-Key": API_KEY
}
def stitch_call(tool_name, args):
payload = {
"method": "tools/call",
"params": {"name": tool_name, "arguments": args}
}
r = requests.post(MCP_URL, headers=HEADERS, json=payload)
r.raise_for_status()
return r.json()
# 1. Create a project
project = stitch_call("create_project", {"title": "Medicare Q4 Campaign"})
project_id = project["result"]["name"].split("/")[1]
# 2. Generate initial screen
result = stitch_call("generate_screen_from_text", {
"projectId": project_id,
"prompt": "Mobile landing page for Medicare Advantage with emotional headline, plan comparison table, and green CTA button",
"deviceType": "MOBILE",
"modelId": "GEMINI_3_1_PRO"
})
# 3. Get screen details once complete
# (generation takes a few minutes — poll with get_screen)
screens = result["result"].get("screens", [])
if screens:
screen_name = screens[0]["name"]
# screen_name format: projects/{id}/screens/{screen_id}
parts = screen_name.split("/")
project_id = parts[1]
screen_id = parts[3]
screen = stitch_call("get_screen", {
"name": screen_name,
"projectId": project_id,
"screenId": screen_id
})
# Download HTML
html_url = screen["result"]["htmlCode"]["downloadUrl"]
print(f"HTML download URL: {html_url}")
# Download screenshot
screenshot_url = screen["result"]["screenshot"]["downloadUrl"]
print(f"Screenshot URL: {screenshot_url}")
# After generating a base screen, create variants
variants = stitch_call("generate_variants", {
"projectId": project_id,
"selectedScreenIds": [screen_id],
"prompt": "Test different color schemes and CTA button styles",
"variantOptions": {
"variantCount": 3,
"creativeRange": "EXPLORE",
"aspects": ["COLOR_SCHEME", "TEXT_CONTENT"]
},
"deviceType": "MOBILE",
"modelId": "GEMINI_3_FLASH"
})
htmlCode.downloadUrl to grab the actual HTML — hand it to Marcus for landing page deploymentfigmaExport.downloadUrl for design reviewget_screen → screenMetadata.statusGEMINI_3_1_PRO for highest quality, GEMINI_3_FLASH for faster iteration{
"mcpServers": {
"stitch": {
"url": "https://stitch.googleapis.com/mcp",
"headers": {
"X-Goog-Api-Key": "YOUR_STITCH_API_KEY"
}
}
}
}
Or via Claude Code CLI:
claude mcp add stitch --transport http https://stitch.googleapis.com/mcp \
--header "X-Goog-Api-Key: YOUR_STITCH_API_KEY" -s user