KaroStudio via MCP
Connect Claude, Cursor, VS Code or any other MCP client to KaroStudio. Your assistant then creates images, icons and series right in the chat, always in your project's style.
MCP (Model Context Protocol) is an open standard that lets apps like Claude or ChatGPT use external tools as connectors. KaroStudio provides an MCP server. With it, your assistant sees your projects, reads your style and creates new results. Everything lands in your Collection, just like in the app.
- Your style staysEvery image follows the rules of your project and template.
- One sentence is enoughDescribe what you need. The assistant picks the tool.
- Everything in the CollectionYou'll find the results in KaroStudio afterwards, too.
Getting started
Requirements#
- A KaroStudio account with at least one project set up.
- A plan that includes MCP access: [Plan with MCP access].
- An assistant that supports MCP over HTTP, for example Claude, Claude Code, Cursor or VS Code.
Quickstart#
From zero to your first image in the chat in three steps.
- 1
Create a token
In KaroStudio, open your project, then Project settings and MCP. Choose Create token, give it a name (for example "Claude Lena") and pick the scopes.
- 2
Connect your assistant
Enter the server URL and token in your assistant. Step-by-step instructions for each client are under Connect your assistant.
mcp.json{ "mcpServers": { "karostudio": { "url": "https://mcp.karostudio.example/v1", "headers": { "Authorization": "Bearer <YOUR_TOKEN>" } } } } - 3
Give your first request
Restart your assistant and type, for example:
"Create 4 social posts in the Hafenküche style: summer at the harbor, boats, sun and sea."
Setup
Connect your assistant#
Choose your client. Replace <YOUR_TOKEN> with your token.
In Claude (web and desktop), add KaroStudio as a custom connector.
- Open Settings and choose Connectors.
- Click Add custom connector.
- Enter
KaroStudioas the name and the server URL as the address. - Sign in and share the project Claude may access.
https://mcp.karostudio.example/v1Tokens and scopes#
Each token belongs to one person and works for the projects you share when you create it. Grant only the scopes the assistant really needs. The token is sent in a header with every call:
Authorization: Bearer <YOUR_TOKEN>projects:readSee projects and templatesstyle:readRead the style and rules. Changing them isn't possible over MCP.images:writeCreate, match, upscale and vectorize imagescollection:readFind results in the Collection
| Scope | Allows |
|---|---|
projects:read | See projects and templates |
style:read | Read the style and rules. Changing them isn't possible over MCP. |
images:write | Create, match, upscale and vectorize images |
collection:read | Find results in the Collection |
Test the connection#
Ask your assistant about your projects. If the list shows up, you're connected.
To test without an assistant, use the MCP Inspector:
npx @modelcontextprotocol/inspectorIn the Inspector, choose Streamable HTTP as the transport, enter the server URL and set the Authorization header. All tools then show up under Tools.
Reference
Tools#
These are the tools the server provides. The assistant picks them on its own based on your request. You don't need to name them.
- list_projects
- get_style
- create_image
- match_photos
- upscale_image
- vectorize_image
- convert_image
- search_collection
list_projects
projects:readShows every project this token can see. Usually the first call, so the assistant knows the project ID.
No parameters.
{}{
"projects": [
{ "id": "hafenkueche", "name": "Hafenküche", "style_version": 3, "templates": ["website-icons", "illustrations", "social-media"] }
]
}get_style
style:readReturns the basics of the project style (logo, colors, typography, icons) and, if given, the rules of a template.
projectstringyesProject ID, e.g. hafenkuechetemplatestringnoTemplate ID. Includes the template's own rules.
| Parameter | Type | Required | Description |
|---|---|---|---|
project | string | yes | Project ID, e.g. hafenkueche |
template | string | no | Template ID. Includes the template's own rules. |
{ "project": "hafenkueche", "template": "website-icons" }{
"version": 3,
"basics": {
"colors": ["#5B12E8", "#0000E0", "#EC4D38", "#111111", "#FFFFFF", "#F0FF00"],
"typography": { "heading": "Fraunces 600", "body": "Geist 400" },
"icons": "Phosphor, Regular"
},
"rules": [
{ "rule": "strokes", "value": "Even, 2 px", "source": "template" },
{ "rule": "shapes", "value": "Soft, large radii", "source": "project" }
]
}create_image
images:writeCreates an image or a series in the project's style. Results are saved to the Collection.
projectstringyesProject IDtemplatestringyesTemplate whose rules apply, e.g. social-mediasubjectsstring[]yesOne entry per image. Several entries make a series.style_guidestringnoA specific style guide with format and margin. Otherwise the most used one.formatstringnoA different pixel size, e.g. 1080x1350transparentbooleannoRemove the background. Default: false
| Parameter | Type | Required | Description |
|---|---|---|---|
project | string | yes | Project ID |
template | string | yes | Template whose rules apply, e.g. social-media |
subjects | string[] | yes | One entry per image. Several entries make a series. |
style_guide | string | no | A specific style guide with format and margin. Otherwise the most used one. |
format | string | no | A different pixel size, e.g. 1080x1350 |
transparent | boolean | no | Remove the background. Default: false |
{
"project": "hafenkueche",
"template": "social-media",
"subjects": ["Summer at the harbor", "Boats in the evening light", "Fish sandwiches on the pier"],
"format": "1080x1350"
}{
"job": "job_7f3c2a",
"status": "succeeded",
"images": [
{ "id": "img_01", "subject": "Summer at the harbor", "url": "https://…/img_01.png", "style_version": 3 }
]
}match_photos
images:writeAdjusts existing photos to the project's photo look: light, color, contrast.
projectstringyesProject IDimagesstring[]yesURLs or Collection IDsstrengthnumberno0 to 1, how strongly to match. Default: 0.7
| Parameter | Type | Required | Description |
|---|---|---|---|
project | string | yes | Project ID |
images | string[] | yes | URLs or Collection IDs |
strength | number | no | 0 to 1, how strongly to match. Default: 0.7 |
{ "project": "hafenkueche", "images": ["https://example.com/terrace.jpg"], "strength": 0.6 }{ "job": "job_91be04", "status": "succeeded", "images": [{ "id": "img_14", "url": "https://…/img_14.jpg" }] }upscale_image
images:writeEnlarges an image without visible loss of quality.
imagestringyesURL or Collection IDfactornumberno2, 4 or 8. Default: 2
| Parameter | Type | Required | Description |
|---|---|---|---|
image | string | yes | URL or Collection ID |
factor | number | no | 2, 4 or 8. Default: 2 |
{ "image": "img_01", "factor": 4 }{ "id": "img_01_x4", "url": "https://…/img_01_x4.png", "size": "4320x5400" }vectorize_image
images:writeTurns logos, icons and illustrations into clean SVG files.
imagestringyesURL or Collection IDcolorsnumbernoMaximum number of colors in the SVG. Default: from the style
| Parameter | Type | Required | Description |
|---|---|---|---|
image | string | yes | URL or Collection ID |
colors | number | no | Maximum number of colors in the SVG. Default: from the style |
{ "image": "https://example.com/logo.png", "colors": 3 }{ "id": "img_22", "url": "https://…/img_22.svg", "paths": 48 }convert_image
images:writeConverts an image from the Collection or a URL to another format. Ideal for websites: WebP or AVIF instead of large JPEGs.
imagestringyesURL or Collection IDformatstringyeswebp, avif, jpeg, png or svgqualitynumberno40 to 100, only for webp, avif and jpeg. Default: 82max_widthnumbernoWidth in pixels, aspect ratio is kept. Default: original width
| Parameter | Type | Required | Description |
|---|---|---|---|
image | string | yes | URL or Collection ID |
format | string | yes | webp, avif, jpeg, png or svg |
quality | number | no | 40 to 100, only for webp, avif and jpeg. Default: 82 |
max_width | number | no | Width in pixels, aspect ratio is kept. Default: original width |
{ "image": "img_01", "format": "webp", "quality": 82, "max_width": 1920 }{ "id": "img_01_webp", "url": "https://…/img_01.webp", "size_before": "1.8 MB", "size_after": "412 KB" }search_collection
collection:readFinds past results by text, template or favorites, so the assistant can reuse them.
projectstringyesProject IDquerystringnoFree text, e.g. boattemplatestringnoOnly this templatefavoritesbooleannoOnly favoriteslimitnumbernoMaximum number of results. Default: 20
| Parameter | Type | Required | Description |
|---|---|---|---|
project | string | yes | Project ID |
query | string | no | Free text, e.g. boat |
template | string | no | Only this template |
favorites | boolean | no | Only favorites |
limit | number | no | Maximum number of results. Default: 20 |
{ "project": "hafenkueche", "query": "boat", "favorites": true }{ "results": [{ "id": "a-boat", "name": "Boat in the harbor", "url": "https://…/a-boat.png" }] }Resources#
Besides the tools, the assistant can read these resources, for example to bring your style along as context.
karostudio://projectsAll shared projectskarostudio://projects/{project}/styleBasics of the project stylekarostudio://projects/{project}/templates/{template}Rules and style guides of a templatekarostudio://images/{id}A single result with preview and metadata
| URI | Contents |
|---|---|
karostudio://projects | All shared projects |
karostudio://projects/{project}/style | Basics of the project style |
karostudio://projects/{project}/templates/{template} | Rules and style guides of a template |
karostudio://images/{id} | A single result with preview and metadata |
Prompt templates#
Ready-made templates your assistant offers as shortcuts (in Claude Code, for example, as slash commands).
create_seriesPlans matching subjects for the topic and creates the seriesproject, template, topic, countexplain_styleSums up the style in plain wordsprojectphoto_matchingMatches photos and upscales them if you wantproject, images
| Template | Arguments | What it does |
|---|---|---|
create_series | project, template, topic, count | Plans matching subjects for the topic and creates the series |
explain_style | project | Sums up the style in plain words |
photo_matching | project, images | Matches photos and upscales them if you want |
Error codes#
Errors come back as MCP errors with one of these codes and a clear message.
{
"isError": true,
"content": [{ "type": "text", "text": "forbidden: This token can't use the project nordgarten." }]
}unauthenticatedCheck the header: Authorization: Bearer followed by the token. If needed, create a new token.The token is missing, mistyped or revoked.forbiddenIn the project settings under MCP, share the project and grant the scopes.The token can't use this project or tool.project_not_foundCall list_projects first and use the ID from there.The project ID doesn't exist.rule_lockedAdjust the job or unlock the rule in KaroStudio.The job conflicts with a locked rule.quota_exceededCheck your plan in Account settings or try again later.Your quota for this period is used up.rate_limitedWait a moment. The Retry-After header gives the seconds.Too many calls in a short time.timeoutAsk again later with the job ID. Nothing gets lost.The result is taking longer than expected.
| Code | Meaning | Fix |
|---|---|---|
unauthenticated | The token is missing, mistyped or revoked. | Check the header: Authorization: Bearer followed by the token. If needed, create a new token. |
forbidden | The token can't use this project or tool. | In the project settings under MCP, share the project and grant the scopes. |
project_not_found | The project ID doesn't exist. | Call list_projects first and use the ID from there. |
rule_locked | The job conflicts with a locked rule. | Adjust the job or unlock the rule in KaroStudio. |
quota_exceeded | Your quota for this period is used up. | Check your plan in Account settings or try again later. |
rate_limited | Too many calls in a short time. | Wait a moment. The Retry-After header gives the seconds. |
timeout | The result is taking longer than expected. | Ask again later with the job ID. Nothing gets lost. |
Limits#
- Calls per minute[Number] per token
- Images per job[Number]
- Uploaded image size[Size] MB per file
- QuotaPer your plan: [Plan]
| What | Limit |
|---|---|
| Calls per minute | [Number] per token |
| Images per job | [Number] |
| Uploaded image size | [Size] MB per file |
| Quota | Per your plan: [Plan] |
In practice
Example prompts#
Copy and adapt them. Name the project and template so the assistant gets them right.
- "Which projects do I have in KaroStudio?"
- "Read the Hafenküche style and sum it up in three sentences."
- "Create 4 social posts in the Hafenküche style: summer at the harbor, boats, sun and sea. Portrait 1080 × 1350."
- "Create 12 icons for our website navigation with the Website Icons template."
- "Match these three photos to our photo look and upscale them 4x."
- "Turn our logo into an SVG with no more than three colors."
- "Search the Collection for all favorites with boats."
Security#
- Revoke tokensIn the project settings under MCP, you see every token with its last use and can revoke it right away.
- Style is read-onlyThe style can't be changed over MCP. Locked rules always stay locked.
- Shared projects onlyA token only sees the projects you picked when you created it.
- Fully traceableEvery job shows up in the history with token name and time.
Troubleshooting#
The assistant shows no KaroStudio tools.
Fully restart the assistant. Then check that the server URL is exactly right and ends in /v1.
Error unauthenticated even though the token is right.
Check that the token is preceded by "Bearer " with a space and that no line breaks were copied along.
The images don't match the style.
Name the template in your request. Without a template, only the basics of the project style apply.
A job is stuck.
Ask for the status: "How far along is job job_7f3c2a?" Finished images are already in the Collection.
Still have questions? Write to us. We'll help you set things up.
Contact us