Rainbrand is the brand layer for agents. It provides shared, versioned brand identity, guidance, and files that connected systems can use and update. Retrieve the context relevant to the user's task, then apply it using your own capabilities and connected tools. You can use that context to write, review, or create outputs such as images, videos, slide decks, websites, and code.
What comprises a brand? Its identity (name, logo, palette, typography), its guidance (voice, visual language, messaging, imagery), and its files (logos, images, font files).
What does success look like when you're building something with Rainbrand? Your output needs to be on-brand, and that means knowing what brand context the task requires and applying it correctly.
How brand context works in each output:
- Image, video, and SVG models follow what they see more than what they read. Show the brand with relevant logos, imagery, and font specimens. Use the prompt to say what to make, including exact copy and styling the user requested. Let the brand context and references carry its style; don't reduce it to generic adjectives or add an unrequested style.
- Code, slides, documents, and websites can use the brand's exact files and values. Embed its font files, logos, and palette instead of approximating them.
- Copy and audio carry the brand in words. Follow its voice and messaging guidance.
Use submit_feedback for Rainbrand-related observations that could help improve the product, even when the root cause is uncertain; report each issue once, omit private or unrelated task content, and continue the original task whether submission succeeds or fails.
Discoverability
0/6 passed0 of 6 passed0/100
Client listings and public setup information.
mcp.json or server-card.json
Either mcp.json or an MCP Server Card declaring this endpoint passes.
No matching mcp.json manifest or MCP Server Card was found at the checked URLs.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
Search public Rainbrand documentation for API integration and MCP usage. Returns matching content, page URLs, and metadata. Follow message_for_assistant to fetch relevant full pages as Markdown.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
Question or search terms about public Rainbrand documentation, 1–500 characters after trimming. Do not include secrets or private customer data.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
Report observations that could help improve Rainbrand: bugs or errors, surprises, limitations, workflow friction, misleading documentation, missing capabilities, or disappointing or degraded results. You do not need to establish the root cause when the observation concerns Rainbrand. Report each distinct issue once. Do not report failures wholly unrelated to Rainbrand. Leave out credentials, personal or customer data, transcripts, source files, private prompts, and unrelated task context. Reports are internal product feedback and do not open a support conversation. Continue the original task whether submission succeeds or fails.
The description explains the capability, when to use it, and what to expect.
Inputs80/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
message
What Rainbrand did, what you expected, and the effect on the task. Omit private task content.
Clear enough to supply this argument.
category
Issue type. Defaults to other.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tool_name
Name of the Rainbrand tool involved, if known.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
related_id
Rainbrand-generated ID of the affected resource or operation, if known.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
{
"name": "submit_feedback",
"title": "Submit feedback",
"description": "Report observations that could help improve Rainbrand: bugs or errors, surprises, limitations, workflow friction, misleading documentation, missing capabilities, or disappointing or degraded results. You do not need to establish the root cause when the observation concerns Rainbrand. Report each distinct issue once. Do not report failures wholly unrelated to Rainbrand. Leave out credentials, personal or customer data, transcripts, source files, private prompts, and unrelated task context. Reports are internal product feedback and do not open a support conversation. Continue the original task whether submission succeeds or fails.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"message",
"llm_model"
],
"properties": {
"message": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "What Rainbrand did, what you expected, and the effect on the task. Omit private task content."
},
"category": {
"enum": [
"bug",
"docs_mismatch",
"friction",
"feature_gap",
"quality_degradation",
"other"
],
"type": "string",
"default": "other",
"description": "Issue type. Defaults to other."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"tool_name": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Name of the Rainbrand tool involved, if known."
},
"related_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Rainbrand-generated ID of the affected resource or operation, if known."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"status",
"message_for_assistant"
],
"properties": {
"status": {
"type": "string",
"const": "received"
},
"message_for_assistant": {
"type": "string",
"description": "Guidance for continuing after the feedback submission."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Submit feedback",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description73/100
List supported generation models in Rainbrand’s public API. Filter by output type or search query.
Describe the returned information so the agent knows whether it will answer the request.
Inputs55/100
3 of 5 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
type
Not provided
Missing description. Explain what this value means and how to supply it.
query
Search for a model by name or description.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Not provided
Missing description. Explain what this value means and how to supply it.
cursor
Pass next_cursor from the previous result to get the next page.
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
Return the published input schema for a supported model in Rainbrand’s public API. Follow its field names, limits, and accepted reference formats when constructing generation input.
Describe the returned information so the agent knows whether it will answer the request.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
model
Supported model ID returned by list_models.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
Submit an image generation request through Rainbrand’s public API. Use a supported image model returned by list_models and follow its published input schema from get_model. Default to openai/gpt-image-2.5-sunburst for image generation and editing, including work with reference images, unless the user asks otherwise. Create or use a task-specific Brief for the brand identified by brand_session_id, wait for completion, and inspect it. For supported models, pass brief_id alongside the model input; Rainbrand supplies guidance and references while the prompt remains authoritative for content and exact copy. Without brief_id, include relevant brand guidance and references in the model input. Retrieve and inspect outputs with get_generation, then request a Review when useful.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brand_session_id
Brand this generation belongs to.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
model
Supported model ID returned by list_models whose output type matches this tool.
Clear enough to supply this argument.
input
Request payload validated against the selected model’s published input schema.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
idempotency_key
Optional key for safely retrying this request. Reuse it only with the same arguments.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brief_id
Completed Brief to use for this generation. Rainbrand adds its guidance before your prompt and its visual assets after any references you provide.
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"status"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"status": {
"enum": [
"pending",
"generating",
"completed",
"failed"
],
"type": "string"
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "generate_image",
"title": "Generate image",
"description": "Submit an image generation request through Rainbrand’s public API. Use a supported image model returned by list_models and follow its published input schema from get_model. Default to openai/gpt-image-2.5-sunburst for image generation and editing, including work with reference images, unless the user asks otherwise. Create or use a task-specific Brief for the brand identified by brand_session_id, wait for completion, and inspect it. For supported models, pass brief_id alongside the model input; Rainbrand supplies guidance and references while the prompt remains authoritative for content and exact copy. Without brief_id, include relevant brand guidance and references in the model input. Retrieve and inspect outputs with get_generation, then request a Review when useful.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand_session_id",
"model",
"input",
"llm_model"
],
"properties": {
"input": {
"type": "object",
"description": "Request payload validated against the selected model’s published input schema.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"model": {
"type": "string",
"minLength": 1,
"description": "Supported model ID returned by list_models whose output type matches this tool."
},
"brief_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Completed Brief to use for this generation. Rainbrand adds its guidance before your prompt and its visual assets after any references you provide."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Optional key for safely retrying this request. Reuse it only with the same arguments."
},
"brand_session_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Brand this generation belongs to."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"status"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"status": {
"enum": [
"pending",
"generating",
"completed",
"failed"
],
"type": "string"
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Generate image",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description79/100
Submit a video generation request through Rainbrand’s public API. Use a supported video model returned by list_models and follow its published input schema from get_model. Retrieve and inspect outputs with get_generation.
Describe the returned information so the agent knows whether it will answer the request.
Inputs88/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
brand_session_id
Brand this generation belongs to.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
model
Supported model ID returned by list_models whose output type matches this tool.
Clear enough to supply this argument.
input
Request payload validated against the selected model’s published input schema.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
idempotency_key
Optional key for safely retrying this request. Reuse it only with the same arguments.
Clear enough to supply this argument.
brief_id
Completed Brief to use for this generation. Rainbrand adds its guidance before your prompt and its visual assets after any references you provide.
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"status"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"status": {
"enum": [
"pending",
"generating",
"completed",
"failed"
],
"type": "string"
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "generate_video",
"title": "Generate video",
"description": "Submit a video generation request through Rainbrand’s public API. Use a supported video model returned by list_models and follow its published input schema from get_model. Retrieve and inspect outputs with get_generation.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand_session_id",
"model",
"input",
"llm_model"
],
"properties": {
"input": {
"type": "object",
"description": "Request payload validated against the selected model’s published input schema.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"model": {
"type": "string",
"minLength": 1,
"description": "Supported model ID returned by list_models whose output type matches this tool."
},
"brief_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Completed Brief to use for this generation. Rainbrand adds its guidance before your prompt and its visual assets after any references you provide."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Optional key for safely retrying this request. Reuse it only with the same arguments."
},
"brand_session_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Brand this generation belongs to."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"status"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"status": {
"enum": [
"pending",
"generating",
"completed",
"failed"
],
"type": "string"
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Generate video",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description77/100
Submit a speech generation request through Rainbrand’s public API. Use a supported audio model returned by list_models and follow its published input schema from get_model. Use relevant brand context to write the text to speak. Inspect the result with get_generation.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
brand_session_id
Brand this generation belongs to.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
model
Supported model ID returned by list_models whose output type matches this tool.
Clear enough to supply this argument.
input
Request payload validated against the selected model’s published input schema.
Explain the meaning of this value, not just its name.
idempotency_key
Optional key for safely retrying this request. Reuse it only with the same arguments.
Explain what happens when this optional value is omitted.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"status"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"status": {
"enum": [
"pending",
"generating",
"completed",
"failed"
],
"type": "string"
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "generate_audio",
"title": "Generate audio",
"description": "Submit a speech generation request through Rainbrand’s public API. Use a supported audio model returned by list_models and follow its published input schema from get_model. Use relevant brand context to write the text to speak. Inspect the result with get_generation.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand_session_id",
"model",
"input",
"llm_model"
],
"properties": {
"input": {
"type": "object",
"description": "Request payload validated against the selected model’s published input schema.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"model": {
"type": "string",
"minLength": 1,
"description": "Supported model ID returned by list_models whose output type matches this tool."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Optional key for safely retrying this request. Reuse it only with the same arguments."
},
"brand_session_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Brand this generation belongs to."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"status"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"status": {
"enum": [
"pending",
"generating",
"completed",
"failed"
],
"type": "string"
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Generate audio",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
Read a generation's status, outputs, or failure details. Completed results include all output files in provider order.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Explain what happens when this optional value is omitted.
id
Generation ID returned by a generation tool.
Clear enough to supply this argument.
wait
Wait for completion or failure. A timeout leaves generation running.
Explain what happens when this optional value is omitted.
timeout
Maximum wait in seconds when wait is true.
Explain what happens when this optional value is omitted.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
List your past generations, newest first, with each output's media ID and link. Outputs deleted since stay listed with available false. Use get_generation for a generation that is still running.
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.
brand_session_id
Only list generations for this brand.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
type
Only list generations of this type.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Results per page (1–50, default 20).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
next_cursor from a previous page.
Explain the meaning of this value, not just its name.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description76/100
List videos across your brands, newest first: generated outputs and files added to a Brand Library. Each has a media ID and a stable link.
Describe the returned information so the agent knows whether it will answer the request.
Inputs71/100
5 of 6 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
brand_session_id
Only this brand.
Explain the meaning of this value, not just its name.
source
Only files from this source.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
in_library
Only files in (true) or not in (false) the Library.
Clear enough to supply this argument.
limit
Not provided
Missing description. Explain what this value means and how to supply it.
cursor
next_cursor from a previous page.
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description76/100
Read one video file by media ID, including its stable link.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Explain the meaning of this value, not just its name.
id
Media ID.
Explain the meaning of this value, not just its name.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Permanently delete videos by media ID. Only call after the user explicitly asks; this cannot be undone. IDs that are not videos are skipped.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
ids
Media IDs to delete.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
{
"name": "delete_videos",
"title": "Delete videos",
"description": "Permanently delete videos by media ID. Only call after the user explicitly asks; this cannot be undone. IDs that are not videos are skipped.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ids",
"llm_model"
],
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"maxItems": 50,
"minItems": 1,
"description": "Media IDs to delete."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"deleted_ids"
],
"properties": {
"deleted_ids": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "Delete videos",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
List audio files across your brands, newest first: generated outputs and files added to a Brand Library. Each has a media ID and a stable link.
The description explains the capability, when to use it, and what to expect.
Inputs63/100
5 of 6 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
brand_session_id
Only this brand.
Explain the meaning of this value, not just its name.
source
Only files from this source.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
in_library
Only files in (true) or not in (false) the Library.
Clear enough to supply this argument.
limit
Not provided
Missing description. Explain what this value means and how to supply it.
cursor
next_cursor from a previous page.
Explain the meaning of this value, not just its name.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description75/100
Read one audio file by media ID, including its stable link.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Explain the meaning of this value, not just its name.
id
Media ID.
Explain the meaning of this value, not just its name.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Permanently delete audio files by media ID. Only call after the user explicitly asks; this cannot be undone. IDs that are not audio files are skipped.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ids
Media IDs to delete.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
{
"name": "delete_audio",
"title": "Delete audio files",
"description": "Permanently delete audio files by media ID. Only call after the user explicitly asks; this cannot be undone. IDs that are not audio files are skipped.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ids",
"llm_model"
],
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"maxItems": 50,
"minItems": 1,
"description": "Media IDs to delete."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"deleted_ids"
],
"properties": {
"deleted_ids": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "Delete audio files",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
Review one asset against a brand's active Brand Skill for the requested checks. Linked files are downloaded and uploads are copied when the review is created. Each account can have 20 reviews pending or processing at once. Returns immediately. Then call get_review with the returned review_id and wait: true.
Describe the returned information so the agent knows whether it will answer the request.
Inputs90/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
brand_session_id
Brand to review against.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
assets › items › anyOf › 0 › url
Public HTTPS URL of the image. Downloaded when the Review is created.
Clear enough to supply this argument.
assets › items › anyOf › 0 › filename
Filename for the linked image. Derived from the URL when omitted.
Clear enough to supply this argument.
assets › items › anyOf › 1 › upload_id
ID of a completed temporary upload from create_upload_urls.
Clear enough to supply this argument.
assets › items › anyOf › 2 › image_id
ID of a completed image in the same workspace.
Clear enough to supply this argument.
references › items › anyOf › 0 › url
Public HTTPS URL of the image. Downloaded when the Review is created.
Clear enough to supply this argument.
references › items › anyOf › 0 › filename
Filename for the linked image. Derived from the URL when omitted.
Clear enough to supply this argument.
references › items › anyOf › 1 › upload_id
ID of a completed temporary upload from create_upload_urls.
Clear enough to supply this argument.
references › items › anyOf › 2 › image_id
ID of a completed image in the same workspace.
Clear enough to supply this argument.
checks
Checks to run: any of color, typography, logo, and copy.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Optional. What the asset is for, or what was asked for.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
idempotency_key
Optional key for safely retrying this request. Reuse it only with the same input.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"review_id",
"status"
],
"properties": {
"status": {
"enum": [
"pending",
"processing",
"completed",
"failed"
],
"type": "string"
},
"review_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create_review",
"title": "Create review",
"description": "Review one asset against a brand's active Brand Skill for the requested checks. Linked files are downloaded and uploads are copied when the review is created. Each account can have 20 reviews pending or processing at once. Returns immediately. Then call get_review with the returned review_id and wait: true.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand_session_id",
"assets",
"checks",
"llm_model"
],
"properties": {
"assets": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"title": "Public URL",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"maxLength": 2048,
"description": "Public HTTPS URL of the image. Downloaded when the Review is created."
},
"filename": {
"type": "string",
"maxLength": 240,
"minLength": 1,
"description": "Filename for the linked image. Derived from the URL when omitted."
}
},
"additionalProperties": false
},
{
"type": "object",
"title": "Temporary upload",
"required": [
"upload_id"
],
"properties": {
"upload_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "ID of a completed temporary upload from create_upload_urls."
}
},
"additionalProperties": false
},
{
"type": "object",
"title": "Image ID",
"required": [
"image_id"
],
"properties": {
"image_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "ID of a completed image in the same workspace."
}
},
"additionalProperties": false
}
]
},
"maxItems": 1,
"minItems": 1,
"description": "Image to review. Supported formats: PNG, JPEG, WebP, GIF, and SVG."
},
"checks": {
"type": "array",
"items": {
"enum": [
"color",
"typography",
"logo",
"copy"
],
"type": "string"
},
"minItems": 1,
"description": "Checks to run: any of color, typography, logo, and copy."
},
"context": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"description": "Optional. What the asset is for, or what was asked for."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"references": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"title": "Public URL",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"maxLength": 2048,
"description": "Public HTTPS URL of the image. Downloaded when the Review is created."
},
"filename": {
"type": "string",
"maxLength": 240,
"minLength": 1,
"description": "Filename for the linked image. Derived from the URL when omitted."
}
},
"additionalProperties": false
},
{
"type": "object",
"title": "Temporary upload",
"required": [
"upload_id"
],
"properties": {
"upload_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "ID of a completed temporary upload from create_upload_urls."
}
},
"additionalProperties": false
},
{
"type": "object",
"title": "Image ID",
"required": [
"image_id"
],
"properties": {
"image_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "ID of a completed image in the same workspace."
}
},
"additionalProperties": false
}
]
},
"maxItems": 10,
"description": "Supporting images to compare against, such as a logo or product photo."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Optional key for safely retrying this request. Reuse it only with the same input."
},
"brand_session_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Brand to review against."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"review_id",
"status"
],
"properties": {
"status": {
"enum": [
"pending",
"processing",
"completed",
"failed"
],
"type": "string"
},
"review_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create review",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Get a review's status and, once completed, a verdict, note, and evidence pictures for each requested check. Set wait to true to wait until it completes or fails, up to the timeout. If the result is still pending or processing, repeat the same call with wait: true. After the JSON, each evidence picture has a resource link to the same URL, followed by the picture when it fits the size limit. Only the review's creator can read it.
Describe the returned information so the agent knows whether it will answer the request.
Inputs94/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
review_id
Review ID returned by create_review.
Clear enough to supply this argument.
wait
Wait while the review is pending or processing, until it completes or fails or the timeout expires. Defaults to false.
Clear enough to supply this argument.
timeout
Timeout in seconds for the whole read request, including setup and polling (default 120, maximum 295). Used only when wait is true.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
A Brief is the brand guidance and files Rainbrand selects for the work you're doing. Use one Brief for closely related work that shares the same goal, audience, creative direction, and source material. Request a new Brief when any of those change meaningfully. Use get_brand for a general overview of the brand. Then call get_brief with the returned brief_id and wait: true, and inspect the completed guidance and assets before using them.
Describe the returned information so the agent knows whether it will answer the request.
Inputs81/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
brand_session_id
Brand to prepare the brief from.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
task
What you are about to make, in plain language. Include any context or instructions that would help select the right brand guidance and files.
Clear enough to supply this argument.
idempotency_key
Optional key for safely retrying this request. Reuse it only with the same input.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brief_id",
"status"
],
"properties": {
"status": {
"enum": [
"pending",
"processing",
"completed",
"failed"
],
"type": "string"
},
"brief_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create_brief",
"title": "Create brief",
"description": "A Brief is the brand guidance and files Rainbrand selects for the work you're doing. Use one Brief for closely related work that shares the same goal, audience, creative direction, and source material. Request a new Brief when any of those change meaningfully. Use get_brand for a general overview of the brand. Then call get_brief with the returned brief_id and wait: true, and inspect the completed guidance and assets before using them.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand_session_id",
"task",
"llm_model"
],
"properties": {
"task": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"description": "What you are about to make, in plain language. Include any context or instructions that would help select the right brand guidance and files."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Optional key for safely retrying this request. Reuse it only with the same input."
},
"brand_session_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Brand to prepare the brief from."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brief_id",
"status"
],
"properties": {
"status": {
"enum": [
"pending",
"processing",
"completed",
"failed"
],
"type": "string"
},
"brief_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create brief",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Get a brief's status and, once completed, its guidance and assets. Set wait to true to wait until it completes or fails, up to the timeout. If the result is still pending or processing, repeat the same call with wait: true. After the JSON, each image asset has a resource link to the same URL, followed by the image when it fits the size limit. Only the brief's creator can read it.
Describe the returned information so the agent knows whether it will answer the request.
Inputs94/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brief_id
Brief ID returned by create_brief.
Clear enough to supply this argument.
wait
Wait while the brief is pending or processing, until it completes or fails or the timeout expires. Defaults to false.
Clear enough to supply this argument.
timeout
Timeout in seconds for the whole read request, including setup and polling (default 120, maximum 295). Used only when wait is true.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brief_id",
"status",
"skill_id",
"created_at"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"retryable": {
"type": "boolean"
}
},
"additionalProperties": false
},
"assets": {
"type": "array",
"items": {
"type": "object",
"required": [
"kind",
"media_type",
"url",
"inline"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Stable asset URL with no scheduled expiry. Redirects to fresh storage access while the completed brief, brand, saved Brand Skill version, and asset remain available. Anyone with this link can access the asset without signing in."
},
"kind": {
"enum": [
"logo",
"image",
"font",
"font_render"
],
"type": "string",
"description": "Asset type. A font render is an image preview of a font."
},
"inline": {
"oneOf": [
{
"type": "object",
"required": [
"status"
],
"properties": {
"status": {
"type": "string",
"const": "included"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"status",
"reason"
],
"properties": {
"reason": {
"enum": [
"too_large",
"response_limit",
"not_supported",
"unavailable"
],
"type": "string"
},
"status": {
"type": "string",
"const": "omitted"
}
},
"additionalProperties": false
}
],
"description": "Whether this output's image or audio content follows its resource link in this result. Video is never included. When content is omitted, use the URL."
},
"media_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Media ID when the asset is a Library file. Absent for files inside the Brand Skill, such as fonts."
},
"media_type": {
"enum": [
"image/avif",
"image/gif",
"image/jpeg",
"image/png",
"image/svg+xml",
"image/webp",
"image/x-icon",
"font/otf",
"font/ttf",
"font/woff",
"font/woff2"
],
"type": "string",
"description": "MIME type of the image or font file."
}
},
"additionalProperties": false
}
},
"status": {
"enum": [
"pending",
"processing",
"completed",
"failed"
],
"type": "string"
},
"brief_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"guidance": {
"type": "string"
},
"skill_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
]
},
"failed_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"completed_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get_brief",
"title": "Get brief",
"description": "Get a brief's status and, once completed, its guidance and assets. Set wait to true to wait until it completes or fails, up to the timeout. If the result is still pending or processing, repeat the same call with wait: true. After the JSON, each image asset has a resource link to the same URL, followed by the image when it fits the size limit. Only the brief's creator can read it.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brief_id",
"llm_model"
],
"properties": {
"wait": {
"type": "boolean",
"description": "Wait while the brief is pending or processing, until it completes or fails or the timeout expires. Defaults to false."
},
"timeout": {
"type": "integer",
"maximum": 295,
"minimum": 1,
"description": "Timeout in seconds for the whole read request, including setup and polling (default 120, maximum 295). Used only when wait is true."
},
"brief_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Brief ID returned by create_brief."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brief_id",
"status",
"skill_id",
"created_at"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"retryable": {
"type": "boolean"
}
},
"additionalProperties": false
},
"assets": {
"type": "array",
"items": {
"type": "object",
"required": [
"kind",
"media_type",
"url",
"inline"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Stable asset URL with no scheduled expiry. Redirects to fresh storage access while the completed brief, brand, saved Brand Skill version, and asset remain available. Anyone with this link can access the asset without signing in."
},
"kind": {
"enum": [
"logo",
"image",
"font",
"font_render"
],
"type": "string",
"description": "Asset type. A font render is an image preview of a font."
},
"inline": {
"oneOf": [
{
"type": "object",
"required": [
"status"
],
"properties": {
"status": {
"type": "string",
"const": "included"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"status",
"reason"
],
"properties": {
"reason": {
"enum": [
"too_large",
"response_limit",
"not_supported",
"unavailable"
],
"type": "string"
},
"status": {
"type": "string",
"const": "omitted"
}
},
"additionalProperties": false
}
],
"description": "Whether this output's image or audio content follows its resource link in this result. Video is never included. When content is omitted, use the URL."
},
"media_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Media ID when the asset is a Library file. Absent for files inside the Brand Skill, such as fonts."
},
"media_type": {
"enum": [
"image/avif",
"image/gif",
"image/jpeg",
"image/png",
"image/svg+xml",
"image/webp",
"image/x-icon",
"font/otf",
"font/ttf",
"font/woff",
"font/woff2"
],
"type": "string",
"description": "MIME type of the image or font file."
}
},
"additionalProperties": false
}
},
"status": {
"enum": [
"pending",
"processing",
"completed",
"failed"
],
"type": "string"
},
"brief_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"guidance": {
"type": "string"
},
"skill_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
]
},
"failed_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"completed_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get brief",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description67/100
Read an image from the Brand Library by ID.
Describe the returned information so the agent knows whether it will answer the request.
Inputs95/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
image_id
Image ID (from generate, upload, or list)
Clear enough to supply this argument.
wait
Hold connection until image reaches terminal status. Only applies to generated images. Recommended: true.
Clear enough to supply this argument.
timeout
Max seconds to wait (default 120, max 295)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
include_url
Ignored — the URL is always included because this tool has an attached UI widget that needs it to render. Kept in the schema for backward compatibility with existing callers.
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description83/100
List Brand Library images with pagination and filters, or read known image_ids together. For images that are pending or generating: image_url is absent.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
image_ids
Fetch existing managed or Brand Library image IDs in one call. Max 50 IDs; limit is ignored in this mode. Selected-model generation-job IDs are not accepted.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
workspace_id
Scope results to one workspace by id (from list_workspaces). Omit (or pass null) to span every workspace the caller can see — each result is labeled with its workspace.
Clear enough to supply this argument.
brand_session_id
Optional Brand session ID to filter results. Omit to list across all brands.
Clear enough to supply this argument.
source
Filter by image source. "generated" = AI-created, "uploaded" = user uploads, "scraped" = website images from brand onboarding
Clear enough to supply this argument.
limit
Results per page when browsing (default 10, max 50). Ignored when image_ids is provided.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
status
Filter by generation status (only applies to generated images)
Clear enough to supply this argument.
action_type
Filter by action type (only applies to generated images)
Clear enough to supply this argument.
include_urls
Ignored — image URLs are always included because this tool has an attached UI widget that needs them to render. Kept in the schema for backward compatibility with existing callers.
Clear enough to supply this argument.
wait
Hold the connection until every existing image record referenced by image_ids reaches a terminal status. Selected-model generation-job IDs are not resolved. Defaults to true when image_ids is provided, false otherwise. No-op when image_ids is omitted.
Clear enough to supply this argument.
timeout
Max seconds to wait (default 120, max 295)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Pagination cursor from previous response
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Delete one or more existing image assets that the user can access, including Brand Library images. Use image IDs, not selected-model generation-job IDs.
The images stop appearing in image list, search, and read results. Re-deleting an already-deleted image is a no-op.
Only call this when the user has explicitly asked to delete specific images. For bulk cleanup, first list the candidates with list_images and confirm the exact set with the user.
deleted_count may be lower than the number of IDs passed: images the user cannot delete, or that were already deleted, are skipped rather than erroring.
Args:
- image_ids (string[]): Image IDs to delete (1–50), from list_images or generation outputs' media IDs. Do not pass the job IDs returned by generate_image.
Returns:
{ "deleted_count": number, "message_for_assistant"?: string }
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
image_ids
Image IDs to delete (1–50), from list_images or generation outputs' media IDs. Do not pass selected-model generation-job IDs returned by generate_image.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"deleted_count"
],
"properties": {
"deleted_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "delete_images",
"title": "Delete Images",
"description": "Delete one or more existing image assets that the user can access, including Brand Library images. Use image IDs, not selected-model generation-job IDs.\n\nThe images stop appearing in image list, search, and read results. Re-deleting an already-deleted image is a no-op.\n\nOnly call this when the user has explicitly asked to delete specific images. For bulk cleanup, first list the candidates with list_images and confirm the exact set with the user.\n\ndeleted_count may be lower than the number of IDs passed: images the user cannot delete, or that were already deleted, are skipped rather than erroring.\n\nArgs:\n - image_ids (string[]): Image IDs to delete (1–50), from list_images or generation outputs' media IDs. Do not pass the job IDs returned by generate_image.\n\nReturns:\n { \"deleted_count\": number, \"message_for_assistant\"?: string }",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"image_ids",
"llm_model"
],
"properties": {
"image_ids": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"maxItems": 50,
"minItems": 1,
"description": "Image IDs to delete (1–50), from list_images or generation outputs' media IDs. Do not pass selected-model generation-job IDs returned by generate_image."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"deleted_count"
],
"properties": {
"deleted_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Delete Images",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
Align the title with the capability actually described by this tool.
Description89/100
Find Brand Library images by visual meaning. Search for the pictured subject. In select mode, wait for the user's choice or skip; use display mode only when the choice is delegated. Empty results mean no relevant matches were found.
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.
brand_session_id
Brand session ID to search within
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
Short noun phrase, 1-4 words.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
top_k
Max results to return (default 10)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
mode
Use "select" when the user should choose results, or "display" when the agent can use them directly.
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Create temporary direct-upload instructions for local files.
Rainbrand's MCP tools do not accept file bytes. Use this tool when the client can
read local files and make HTTP requests. If the client cannot execute the
returned PUT request, use `open_upload_ui` when MCP Apps is available. Pass
`workspace_id` to stage files in that workspace, or omit it for the personal
workspace. If neither the picker nor direct upload is usable, ask for a
publicly reachable HTTPS file URL and pass it to the consuming tool. Private
attachment URLs from the host client are not supported.
Uploads belong to one workspace. For an existing brand, pass its
`workspace_id` from `list_brands` or `get_brand`. For a new
brand, pass the same `workspace_id` here and to `onboard_brand`. Omit
it only when both operations use the personal workspace.
This tool reserves private temporary storage. It does not create a Library
image, attach brand evidence, install a font, or otherwise finish the user's
task. Each upload body is the raw file, not a multipart form. Run the returned
`curl_example` after replacing `<local-file-path>`, then pass `upload_id`
unchanged to `onboard_brand`, `create_brand_edit` as source
evidence, `upload_image`, or `upload_brand_font`. Where a generation
model input expects a file URL, pass the upload's temporary `url` instead.
The task is complete only when that consuming tool returns successfully.
Uploads expire at `expires_at`. A completed `upload_id` remains reusable
until expiry. This does not make the consuming operation idempotent—for example,
repeating successful brand onboarding can create another brand. If a PUT
response is unclear, call the consuming tool; it will use completed bytes or
report that they are unavailable. Request new upload instructions after expiry.
Each consuming tool applies its own file-type and size limits.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
workspace_id
Workspace ID. Omit to use the caller's personal workspace.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
files › items › filename
Original filename used when the upload is consumed.
Clear enough to supply this argument.
files › items › byte_length
Exact file size in bytes.
Clear enough to supply this argument.
files › items › content_type
The file's MIME type, such as image/png. Set it before passing the upload's url to a model, so the file is served with that type. Supported types are kept: PNG, JPEG, WebP, AVIF, GIF, MP4, WebM, MOV, MP3, WAV, OGG, FLAC, AAC, M4A, and PDF. SVG, other types, or none are stored as application/octet-stream. Temporary read URLs require recognized supported media bytes; SVG and other files have no temporary read URL. For SVG, use upload_id for Brand or Library processing. For an SVG model input, save it to a Brand Library for a sanitized asset URL.
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"uploads"
],
"properties": {
"uploads": {
"type": "array",
"items": {
"type": "object",
"required": [
"upload_id",
"filename",
"byte_length",
"upload_url",
"method",
"headers",
"expires_at",
"curl_example"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Temporary link to the uploaded file once the PUT completes, valid until expires_at. Pass it where a generation model input expects a file URL, after reserving the upload with its content_type. Use upload_id with every other tool."
},
"method": {
"type": "string",
"const": "PUT"
},
"headers": {
"type": "object",
"required": [
"content-type",
"cache-control",
"x-upsert"
],
"properties": {
"x-upsert": {
"type": "string",
"const": "false"
},
"content-type": {
"type": "string",
"description": "The requested content_type when it is kept, otherwise application/octet-stream."
},
"cache-control": {
"type": "string",
"const": "max-age=3600"
}
},
"additionalProperties": false
},
"filename": {
"type": "string"
},
"upload_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"upload_url": {
"type": "string",
"format": "uri"
},
"byte_length": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"curl_example": {
"type": "string"
}
},
"additionalProperties": false
}
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create_upload_urls",
"title": "Create Upload URLs",
"description": "Create temporary direct-upload instructions for local files.\n\nRainbrand's MCP tools do not accept file bytes. Use this tool when the client can\nread local files and make HTTP requests. If the client cannot execute the\nreturned PUT request, use `open_upload_ui` when MCP Apps is available. Pass\n`workspace_id` to stage files in that workspace, or omit it for the personal\nworkspace. If neither the picker nor direct upload is usable, ask for a\npublicly reachable HTTPS file URL and pass it to the consuming tool. Private\nattachment URLs from the host client are not supported.\n\nUploads belong to one workspace. For an existing brand, pass its\n`workspace_id` from `list_brands` or `get_brand`. For a new\nbrand, pass the same `workspace_id` here and to `onboard_brand`. Omit\nit only when both operations use the personal workspace.\n\nThis tool reserves private temporary storage. It does not create a Library\nimage, attach brand evidence, install a font, or otherwise finish the user's\ntask. Each upload body is the raw file, not a multipart form. Run the returned\n`curl_example` after replacing `<local-file-path>`, then pass `upload_id`\nunchanged to `onboard_brand`, `create_brand_edit` as source\nevidence, `upload_image`, or `upload_brand_font`. Where a generation\nmodel input expects a file URL, pass the upload's temporary `url` instead.\nThe task is complete only when that consuming tool returns successfully.\n\nUploads expire at `expires_at`. A completed `upload_id` remains reusable\nuntil expiry. This does not make the consuming operation idempotent—for example,\nrepeating successful brand onboarding can create another brand. If a PUT\nresponse is unclear, call the consuming tool; it will use completed bytes or\nreport that they are unavailable. Request new upload instructions after expiry.\nEach consuming tool applies its own file-type and size limits.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"files",
"llm_model"
],
"properties": {
"files": {
"type": "array",
"items": {
"type": "object",
"required": [
"filename",
"byte_length"
],
"properties": {
"filename": {
"type": "string",
"maxLength": 240,
"minLength": 1,
"description": "Original filename used when the upload is consumed."
},
"byte_length": {
"type": "integer",
"maximum": 104857600,
"description": "Exact file size in bytes.",
"exclusiveMinimum": 0
},
"content_type": {
"type": "string",
"maxLength": 255,
"description": "The file's MIME type, such as image/png. Set it before passing the upload's url to a model, so the file is served with that type. Supported types are kept: PNG, JPEG, WebP, AVIF, GIF, MP4, WebM, MOV, MP3, WAV, OGG, FLAC, AAC, M4A, and PDF. SVG, other types, or none are stored as application/octet-stream. Temporary read URLs require recognized supported media bytes; SVG and other files have no temporary read URL. For SVG, use upload_id for Brand or Library processing. For an SVG model input, save it to a Brand Library for a sanitized asset URL."
}
},
"additionalProperties": false
},
"maxItems": 30,
"minItems": 1,
"description": "Local files to stage (1–30, at most 100 MiB each and 256 MiB combined)."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"workspace_id": {
"type": "string",
"minLength": 1,
"description": "Workspace ID. Omit to use the caller's personal workspace."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"uploads"
],
"properties": {
"uploads": {
"type": "array",
"items": {
"type": "object",
"required": [
"upload_id",
"filename",
"byte_length",
"upload_url",
"method",
"headers",
"expires_at",
"curl_example"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Temporary link to the uploaded file once the PUT completes, valid until expires_at. Pass it where a generation model input expects a file URL, after reserving the upload with its content_type. Use upload_id with every other tool."
},
"method": {
"type": "string",
"const": "PUT"
},
"headers": {
"type": "object",
"required": [
"content-type",
"cache-control",
"x-upsert"
],
"properties": {
"x-upsert": {
"type": "string",
"const": "false"
},
"content-type": {
"type": "string",
"description": "The requested content_type when it is kept, otherwise application/octet-stream."
},
"cache-control": {
"type": "string",
"const": "max-age=3600"
}
},
"additionalProperties": false
},
"filename": {
"type": "string"
},
"upload_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"upload_url": {
"type": "string",
"format": "uri"
},
"byte_length": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"curl_example": {
"type": "string"
}
},
"additionalProperties": false
}
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create Upload URLs",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description61/100
Reserve temporary uploads for the Rainbrand image-picker widget.
Describe the concrete operation and its scope instead of restating the tool name.
Inputs76/100
4 of 5 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
brand_session_id
Not provided
Missing description. Explain what this value means and how to supply it.
files › items › filename
Original filename used when the upload is consumed.
Clear enough to supply this argument.
files › items › byte_length
Exact file size in bytes.
Clear enough to supply this argument.
files › items › content_type
The file's MIME type, such as image/png. Set it before passing the upload's url to a model, so the file is served with that type. Supported types are kept: PNG, JPEG, WebP, AVIF, GIF, MP4, WebM, MOV, MP3, WAV, OGG, FLAC, AAC, M4A, and PDF. SVG, other types, or none are stored as application/octet-stream. Temporary read URLs require recognized supported media bytes; SVG and other files have no temporary read URL. For SVG, use upload_id for Brand or Library processing. For an SVG model input, save it to a Brand Library for a sanitized asset URL.
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"uploads"
],
"properties": {
"uploads": {
"type": "array",
"items": {
"type": "object",
"required": [
"upload_id",
"filename",
"byte_length",
"upload_url",
"method",
"headers",
"expires_at",
"curl_example"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Temporary link to the uploaded file once the PUT completes, valid until expires_at. Pass it where a generation model input expects a file URL, after reserving the upload with its content_type. Use upload_id with every other tool."
},
"method": {
"type": "string",
"const": "PUT"
},
"headers": {
"type": "object",
"required": [
"content-type",
"cache-control",
"x-upsert"
],
"properties": {
"x-upsert": {
"type": "string",
"const": "false"
},
"content-type": {
"type": "string",
"description": "The requested content_type when it is kept, otherwise application/octet-stream."
},
"cache-control": {
"type": "string",
"const": "max-age=3600"
}
},
"additionalProperties": false
},
"filename": {
"type": "string"
},
"upload_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"upload_url": {
"type": "string",
"format": "uri"
},
"byte_length": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"curl_example": {
"type": "string"
}
},
"additionalProperties": false
}
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create_image_picker_uploads",
"title": "Prepare Image Picker Uploads",
"description": "Reserve temporary uploads for the Rainbrand image-picker widget.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand_session_id",
"files",
"llm_model"
],
"properties": {
"files": {
"type": "array",
"items": {
"type": "object",
"required": [
"filename",
"byte_length"
],
"properties": {
"filename": {
"type": "string",
"maxLength": 240,
"minLength": 1,
"description": "Original filename used when the upload is consumed."
},
"byte_length": {
"type": "integer",
"maximum": 104857600,
"description": "Exact file size in bytes.",
"exclusiveMinimum": 0
},
"content_type": {
"type": "string",
"maxLength": 255,
"description": "The file's MIME type, such as image/png. Set it before passing the upload's url to a model, so the file is served with that type. Supported types are kept: PNG, JPEG, WebP, AVIF, GIF, MP4, WebM, MOV, MP3, WAV, OGG, FLAC, AAC, M4A, and PDF. SVG, other types, or none are stored as application/octet-stream. Temporary read URLs require recognized supported media bytes; SVG and other files have no temporary read URL. For SVG, use upload_id for Brand or Library processing. For an SVG model input, save it to a Brand Library for a sanitized asset URL."
}
},
"additionalProperties": false
},
"maxItems": 30,
"minItems": 1,
"description": "Local files to stage (1–30, at most 100 MiB each and 256 MiB combined)."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"brand_session_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"uploads"
],
"properties": {
"uploads": {
"type": "array",
"items": {
"type": "object",
"required": [
"upload_id",
"filename",
"byte_length",
"upload_url",
"method",
"headers",
"expires_at",
"curl_example"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Temporary link to the uploaded file once the PUT completes, valid until expires_at. Pass it where a generation model input expects a file URL, after reserving the upload with its content_type. Use upload_id with every other tool."
},
"method": {
"type": "string",
"const": "PUT"
},
"headers": {
"type": "object",
"required": [
"content-type",
"cache-control",
"x-upsert"
],
"properties": {
"x-upsert": {
"type": "string",
"const": "false"
},
"content-type": {
"type": "string",
"description": "The requested content_type when it is kept, otherwise application/octet-stream."
},
"cache-control": {
"type": "string",
"const": "max-age=3600"
}
},
"additionalProperties": false
},
"filename": {
"type": "string"
},
"upload_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"upload_url": {
"type": "string",
"format": "uri"
},
"byte_length": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"curl_example": {
"type": "string"
}
},
"additionalProperties": false
}
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Prepare Image Picker Uploads",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description71/100
Reserve temporary upload URLs for files selected in the upload picker. Use the picker’s workspace and each file’s exact byte length. Upload the raw bytes before verifying completion.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs72/100
4 of 5 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
workspace_id
Not provided
Missing description. Explain what this value means and how to supply it.
files › items › filename
Original filename used when the upload is consumed.
Clear enough to supply this argument.
files › items › byte_length
Exact file size in bytes.
Clear enough to supply this argument.
files › items › content_type
The file's MIME type, such as image/png. Set it before passing the upload's url to a model, so the file is served with that type. Supported types are kept: PNG, JPEG, WebP, AVIF, GIF, MP4, WebM, MOV, MP3, WAV, OGG, FLAC, AAC, M4A, and PDF. SVG, other types, or none are stored as application/octet-stream. Temporary read URLs require recognized supported media bytes; SVG and other files have no temporary read URL. For SVG, use upload_id for Brand or Library processing. For an SVG model input, save it to a Brand Library for a sanitized asset URL.
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"uploads"
],
"properties": {
"uploads": {
"type": "array",
"items": {
"type": "object",
"required": [
"upload_id",
"filename",
"byte_length",
"upload_url",
"method",
"headers",
"expires_at",
"curl_example"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Temporary link to the uploaded file once the PUT completes, valid until expires_at. Pass it where a generation model input expects a file URL, after reserving the upload with its content_type. Use upload_id with every other tool."
},
"method": {
"type": "string",
"const": "PUT"
},
"headers": {
"type": "object",
"required": [
"content-type",
"cache-control",
"x-upsert"
],
"properties": {
"x-upsert": {
"type": "string",
"const": "false"
},
"content-type": {
"type": "string",
"description": "The requested content_type when it is kept, otherwise application/octet-stream."
},
"cache-control": {
"type": "string",
"const": "max-age=3600"
}
},
"additionalProperties": false
},
"filename": {
"type": "string"
},
"upload_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"upload_url": {
"type": "string",
"format": "uri"
},
"byte_length": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"curl_example": {
"type": "string"
}
},
"additionalProperties": false
}
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create_file_picker_uploads",
"title": "Prepare file uploads",
"description": "Reserve temporary upload URLs for files selected in the upload picker. Use the picker’s workspace and each file’s exact byte length. Upload the raw bytes before verifying completion.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"workspace_id",
"files",
"llm_model"
],
"properties": {
"files": {
"type": "array",
"items": {
"type": "object",
"required": [
"filename",
"byte_length"
],
"properties": {
"filename": {
"type": "string",
"maxLength": 240,
"minLength": 1,
"description": "Original filename used when the upload is consumed."
},
"byte_length": {
"type": "integer",
"maximum": 104857600,
"description": "Exact file size in bytes.",
"exclusiveMinimum": 0
},
"content_type": {
"type": "string",
"maxLength": 255,
"description": "The file's MIME type, such as image/png. Set it before passing the upload's url to a model, so the file is served with that type. Supported types are kept: PNG, JPEG, WebP, AVIF, GIF, MP4, WebM, MOV, MP3, WAV, OGG, FLAC, AAC, M4A, and PDF. SVG, other types, or none are stored as application/octet-stream. Temporary read URLs require recognized supported media bytes; SVG and other files have no temporary read URL. For SVG, use upload_id for Brand or Library processing. For an SVG model input, save it to a Brand Library for a sanitized asset URL."
}
},
"additionalProperties": false
},
"maxItems": 30,
"minItems": 1,
"description": "Local files to stage (1–30, at most 100 MiB each and 256 MiB combined)."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"workspace_id": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"uploads"
],
"properties": {
"uploads": {
"type": "array",
"items": {
"type": "object",
"required": [
"upload_id",
"filename",
"byte_length",
"upload_url",
"method",
"headers",
"expires_at",
"curl_example"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Temporary link to the uploaded file once the PUT completes, valid until expires_at. Pass it where a generation model input expects a file URL, after reserving the upload with its content_type. Use upload_id with every other tool."
},
"method": {
"type": "string",
"const": "PUT"
},
"headers": {
"type": "object",
"required": [
"content-type",
"cache-control",
"x-upsert"
],
"properties": {
"x-upsert": {
"type": "string",
"const": "false"
},
"content-type": {
"type": "string",
"description": "The requested content_type when it is kept, otherwise application/octet-stream."
},
"cache-control": {
"type": "string",
"const": "max-age=3600"
}
},
"additionalProperties": false
},
"filename": {
"type": "string"
},
"upload_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"upload_url": {
"type": "string",
"format": "uri"
},
"byte_length": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"curl_example": {
"type": "string"
}
},
"additionalProperties": false
}
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Prepare file uploads",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
Verify that the selected workspace’s temporary uploads are complete and unexpired before returning them to the agent. Verification does not create or change a brand or add files to a Brand Library.
Describe the returned information so the agent knows whether it will answer the request.
Inputs33/100
1 of 3 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
workspace_id
Not provided
Missing description. Explain what this value means and how to supply it.
upload_ids
Not provided
Missing description. Explain what this value means and how to supply it.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Verify the selected uploads and save them under a short upload reference for the picker’s explicit Continue action. The agent resolves that reference with get_file_picker_handoff to retrieve the exact upload IDs and workspace. Publishing the reference does not create or change a brand or add assets to a Brand Library.
Describe the returned information so the agent knows whether it will answer the request.
Inputs33/100
1 of 3 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
workspace_id
Not provided
Missing description. Explain what this value means and how to supply it.
upload_ids
Not provided
Missing description. Explain what this value means and how to supply it.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
{
"name": "publish_file_picker_handoff",
"title": "Prepare upload reference",
"description": "Verify the selected uploads and save them under a short upload reference for the picker’s explicit Continue action. The agent resolves that reference with get_file_picker_handoff to retrieve the exact upload IDs and workspace. Publishing the reference does not create or change a brand or add assets to a Brand Library.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"workspace_id",
"upload_ids",
"llm_model"
],
"properties": {
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"upload_ids": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"maxItems": 30,
"minItems": 1
},
"workspace_id": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"reference"
],
"properties": {
"reference": {
"type": "string",
"maxLength": 12,
"minLength": 12
}
},
"additionalProperties": false
},
"annotations": {
"title": "Prepare upload reference",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Resolve an upload reference from the file picker’s Continue message to the verified files and their workspace. Use the returned upload_id values with tools that accept them in that workspace; use each file's temporary url where a generation model input expects a file URL. The reference itself is not an upload_id. Resolving files does not create or change a brand or add assets to a Brand Library.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
1 of 2 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
reference
Not provided
Missing description. Explain what this value means and how to supply it.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"workspace_id",
"files"
],
"properties": {
"files": {
"type": "array",
"items": {
"type": "object",
"required": [
"filename",
"upload_id",
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Temporary link to the uploaded file, valid until the upload expires. Pass it where a generation model input expects a file URL. Use upload_id with every other tool."
},
"filename": {
"type": "string"
},
"upload_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}
},
"workspace_id": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get_file_picker_handoff",
"title": "Get uploaded files",
"description": "Resolve an upload reference from the file picker’s Continue message to the verified files and their workspace. Use the returned upload_id values with tools that accept them in that workspace; use each file's temporary url where a generation model input expects a file URL. The reference itself is not an upload_id. Resolving files does not create or change a brand or add assets to a Brand Library.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"reference",
"llm_model"
],
"properties": {
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"reference": {
"type": "string",
"maxLength": 12,
"minLength": 12
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"workspace_id",
"files"
],
"properties": {
"files": {
"type": "array",
"items": {
"type": "object",
"required": [
"filename",
"upload_id",
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Temporary link to the uploaded file, valid until the upload expires. Pass it where a generation model input expects a file URL. Use upload_id with every other tool."
},
"filename": {
"type": "string"
},
"upload_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}
},
"workspace_id": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get uploaded files",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Save one image in a Brand Library from either a public URL or a completed
temporary upload.
The server validates the image, then reuses an exact match in the brand or
stores a new one. If your client can read the local file and make HTTP requests, first call
`create_upload_urls`, PUT the raw bytes as directed, and pass the
resulting `upload_id` here. In an MCP Apps client, call
`open_upload_ui` with only `brand_session_id` instead; its widget
completes the Library upload and returns final image IDs in widget context.
Read that context before using the images.
Pass exactly one of `image_url` or `upload_id`.
Args:
- `image_url` (string, optional): Public PNG, JPEG, WebP, or AVIF URL.
- `upload_id` (string, optional): Completed temporary upload ID.
- `brand_session_id` (string): Brand session ID that owns the Library image.
Returns the final image ID for generation references, edit references, edit
subjects, or a Brand Skill primary-logo update.
Supported formats: PNG, JPEG, WebP, AVIF. Max file size: 10MB.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
image_url
Public PNG, JPEG, WebP, or AVIF URL, max 10MB. Pass exactly one of image_url or upload_id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
upload_id
Completed temporary upload. Pass exactly one of upload_id or image_url.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brand_session_id
Brand session ID of the brand that owns this image.
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"name": "upload_image",
"title": "Upload Image",
"description": "Save one image in a Brand Library from either a public URL or a completed\ntemporary upload.\n\nThe server validates the image, then reuses an exact match in the brand or\nstores a new one. If your client can read the local file and make HTTP requests, first call\n`create_upload_urls`, PUT the raw bytes as directed, and pass the\nresulting `upload_id` here. In an MCP Apps client, call\n`open_upload_ui` with only `brand_session_id` instead; its widget\ncompletes the Library upload and returns final image IDs in widget context.\nRead that context before using the images.\n\nPass exactly one of `image_url` or `upload_id`.\n\nArgs:\n- `image_url` (string, optional): Public PNG, JPEG, WebP, or AVIF URL.\n- `upload_id` (string, optional): Completed temporary upload ID.\n- `brand_session_id` (string): Brand session ID that owns the Library image.\n\nReturns the final image ID for generation references, edit references, edit\nsubjects, or a Brand Skill primary-logo update.\n\nSupported formats: PNG, JPEG, WebP, AVIF. Max file size: 10MB.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand_session_id",
"llm_model"
],
"properties": {
"image_url": {
"type": "string",
"format": "uri",
"description": "Public PNG, JPEG, WebP, or AVIF URL, max 10MB. Pass exactly one of image_url or upload_id."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"upload_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Completed temporary upload. Pass exactly one of upload_id or image_url."
},
"brand_session_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Brand session ID of the brand that owns this image."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"width",
"height",
"mime_type",
"existing"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"width": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"height": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"existing": {
"type": "boolean"
},
"mime_type": {
"type": "string"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Upload Image",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
Add a file to a Brand Library. Briefs, Brand Edits, and Brand Skills can draw on Library images. Video and audio stay stored with the brand for other workflows; those features do not use them yet. Pass exactly one source:
- `upload_id`: a completed upload from `create_upload_urls`, for local files.
- `media_id`: an existing image, video, or audio ID, such as a generation output. Media from another brand is copied.
- `url`: a public HTTPS URL; a copy is stored.
The type is detected from the file: images (JPEG, PNG, WebP, AVIF, SVG; max 10MB), video (MP4, WebM, MOV), and audio (MP3, WAV, OGG, FLAC, AAC, M4A), max 100 MiB. If the brand already holds identical file contents, returns that item with `existing: true`. URLs are downloaded on every add, so changed contents may return a different item.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
brand_session_id
Brand whose Library to use.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
upload_id
Completed temporary upload.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
media_id
Existing image, video, or audio ID.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
url
Public HTTPS URL of the file.
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description74/100
List the files in a Brand Library, most recently added first. Each item has a media ID, a stable link, and a description when one exists.
Describe the returned information so the agent knows whether it will answer the request.
Inputs65/100
4 of 5 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
brand_session_id
Brand whose Library to use.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
type
Only files of this media family.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Not provided
Missing description. Explain what this value means and how to supply it.
cursor
next_cursor from a previous page.
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
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.
Description89/100
Take a file out of a Brand Library without deleting it. Future Briefs, Brand Edits, and Brand Skill versions stop using it; published Brand Skills keep working. Only call when the user asks.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
brand_session_id
Brand whose Library to use.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
media_id
Media ID of the file to remove.
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
{
"name": "remove_from_library",
"title": "Remove from Library",
"description": "Take a file out of a Brand Library without deleting it. Future Briefs, Brand Edits, and Brand Skill versions stop using it; published Brand Skills keep working. Only call when the user asks.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand_session_id",
"media_id",
"llm_model"
],
"properties": {
"media_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Media ID of the file to remove."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"brand_session_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Brand whose Library to use."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"in_library"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"in_library": {
"type": "boolean",
"const": false
}
},
"additionalProperties": false
},
"annotations": {
"title": "Remove from Library",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
Create or onboard a brand from user-selected website, Instagram, or file sources. This starts asynchronous Brand Skill creation in the selected workspace and stores supplied files in private brand storage. If a website or Instagram source matches an existing brand, the tool returns that match instead unless the user explicitly allows a duplicate.
Describe the returned information so the agent knows whether it will answer the request.
Inputs80/100
13 of 14 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
sources › items › anyOf › 0 › oneOf › 0 › kind
Source type for a public website
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sources › items › anyOf › 0 › oneOf › 0 › url
Public website URL to turn into a Brand Skill
Clear enough to supply this argument.
sources › items › anyOf › 0 › oneOf › 1 › kind
Source type for an Instagram account
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Original filename used for source labels. It defaults from the URL when possible.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sources › items › anyOf › 1 › kind
Not provided
Missing description. Explain what this value means and how to supply it.
sources › items › anyOf › 1 › upload_id
Completed temporary upload ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
instructions
Optional run-specific Brand Agent guidance for source-based creation.
Clear enough to supply this argument.
workspace_id
Workspace ID. Omit (or pass null) to default to the caller's personal workspace.
Clear enough to supply this argument.
idempotency_key
Optional retry key, 1–255 characters after trimming. Reuse with the same request to recover the original Brand session ID. Use a new key for a new creation.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
allow_duplicate
Allow creation when a website or Instagram source matches an existing brand in the selected workspace. Set to true only after explicit user intent to create another brand. Defaults to false.
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
Get a brand's status, profile, guidance, and files. Read any file with view_files. Set wait to true to wait for current brand initialization. A version_id read returns that exact immutable version immediately, even if it is currently the latest. If the result is still analyzing, repeat the same read with wait: true. Use profile.logo_catalog to select among supported logos for the selected version. Follow exact caller selection and relevant Brand Skill guidance before contrasts_best_on visibility hints; use the primary logo as a general fallback. Null means no catalog was published, while an empty items array records no supported logos. Pass the same version_id when refreshing temporary asset URLs to retain the selected version.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brand_session_id
Brand session ID from `list_brands`.
Clear enough to supply this argument.
version_id
Saved brand version to pin. Defaults to the latest version.
Clear enough to supply this argument.
wait
Wait for current brand initialization to finish or the timeout to expire. Defaults to false. Ignored when version_id is provided.
Clear enough to supply this argument.
timeout
Timeout in seconds for the whole read request, including setup and polling (default 120, maximum 295). Used only when wait is true and version_id is omitted.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description74/100
List saved versions of a brand, including which version is latest.
Describe the returned information so the agent knows whether it will answer the request.
Inputs94/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brand_session_id
Brand session ID from `list_brands`.
Clear enough to supply this argument.
limit
Versions per page (default 50).
Clear enough to supply this argument.
cursor
Cursor from the previous page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description71/100
View brand text, images, and font files. Viewing a font file also returns its font specimen, when one exists.
Describe the returned information so the agent knows whether it will answer the request.
Inputs67/100
4 of 6 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
brand_session_id
Brand session ID from `get_brand`.
Clear enough to supply this argument.
version_id
Saved brand version. Defaults to the latest version.
Clear enough to supply this argument.
files › items › path
Brand-root-relative file path.
Clear enough to supply this argument.
files › items › line_range › start
Not provided
Missing description. Explain what this value means and how to supply it.
files › items › line_range › end
Not provided
Missing description. Explain what this value means and how to supply it.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
Create a draft change to an existing brand from instructions, evidence, or exact profile changes. Preparation runs asynchronously and does not change the active brand; exact profile changes may also update related Brand Skill files. When `replaces_edit_id` is supplied, the existing draft is discarded only after its replacement is ready.
The description explains the capability, when to use it, and what to expect.
Inputs61/100
30 of 38 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
brand_session_id
Brand session ID from `list_brands`.
Clear enough to supply this argument.
base_skill_id
Current version_id from get_brand
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
replaces_edit_id
Pending candidate to replace only after this one is ready
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
change › oneOf › 0 › kind
Not provided
Missing description. Explain what this value means and how to supply it.
change › oneOf › 0 › instruction
Describe the requested brand change in up to 4,000 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
change › oneOf › 1 › kind
Not provided
Missing description. Explain what this value means and how to supply it.
change › oneOf › 1 › changes › name
Brand name, 1–120 characters. Line breaks and NUL characters are not allowed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Font family, 1–120 characters, with no line breaks or NUL characters. For a custom font, use the exact family returned by font upload; matching is case-sensitive after trimming.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
evidence › image_ids
Brand Library image IDs to use as evidence. At most 10 submitted IDs across the original request and all follow-up answers; submitting an image again consumes another slot.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
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.
Description87/100
Read a brand edit's progress, requested input, or prepared candidate. Set wait to true to wait while its status is preparing; if the result is still preparing, repeat the same read with wait: true. On supported MCP clients, this call may accept native input and resume preparation when the question and response can be represented completely. Otherwise use continue_brand_edit. Resuming does not change the active brand.
Describe the returned information so the agent knows whether it will answer the request.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
edit_id
Brand edit ID returned by create_brand_edit
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
wait
Wait while the edit is preparing, until its status changes or the timeout expires. Defaults to false.
Clear enough to supply this argument.
timeout
Timeout in seconds for the whole read request, including setup, native-input continuation, and polling (default 120, maximum 295). Used only when wait is true.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
Continue a pending brand edit by submitting its requested selection, answer, evidence, or decline. Use this only when native MCP input is unavailable or cannot represent the response. This resumes draft preparation without changing the active brand; follow the input channels and limits advertised by the pending interaction.
The description explains the capability, when to use it, and what to expect.
Inputs63/100
15 of 19 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
brand_session_id
Brand session ID of the brand being edited.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
edit_id
Brand edit ID returned by create_brand_edit
Clear enough to supply this argument.
interaction_id
Current interaction ID from get_brand_edit
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
response › oneOf › 0 › kind
Not provided
Missing description. Explain what this value means and how to supply it.
response › oneOf › 0 › option_id
Selected option ID from the current interaction, 1–80 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
response › oneOf › 1 › kind
Not provided
Missing description. Explain what this value means and how to supply it.
response › oneOf › 1 › text
Answer text, up to 10,000 characters. Follow the current interaction's advertised text bounds, which may be stricter.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
response › oneOf › 1 › evidence › image_ids
Brand Library image IDs to use as evidence. At most 10 submitted IDs across the original request and all follow-up answers; submitting an image again consumes another slot.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
response › oneOf › 2 › kind
Not provided
Missing description. Explain what this value means and how to supply it.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
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.
Description83/100
Read paginated changed Markdown from a prepared brand edit candidate. Each present side identifies its immutable base or candidate Skill and includes the SHA-256 of the complete file. Follow pagination to read the full content. Available only after a candidate exists.
Describe the returned information so the agent knows whether it will answer the request.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
edit_id
Brand edit ID returned by create_brand_edit
Clear enough to supply this argument.
path
Exact path from change_set.markdownChanges
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
next_cursor returned by the previous page
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description77/100
Activate a prepared brand edit candidate. This is the operation that changes the active brand to the generated candidate.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brand_session_id
Brand session ID of the brand being edited.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
edit_id
Brand edit ID returned by create_brand_edit
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
End a brand edit without changing the active brand. Discarded edits cannot publish a candidate. Cancellation is requested for ongoing preparation, but work already in progress may finish.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brand_session_id
Brand session ID of the brand being edited.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
edit_id
Brand edit ID returned by create_brand_edit
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Stage a single-use custom font for a brand edit. Returns font_asset_id, family, format, weight, variable, and expires_at. The asset expires after 24 hours, and the consuming edit must finish preparing before expires_at. The asset is deleted when the candidate is stored, preparation fails, or the work becomes stale. Upload it again for a later edit.
Pass either a public TTF, OTF, WOFF, or WOFF2 URL, or a completed temporary
upload. For a local file, first call `create_upload_urls`, PUT the raw bytes as
directed, and pass the resulting `upload_id` here. Staging does not change the active brand. To use
the uploaded font, pass its font_asset_id and exact returned family in an exact
profile typography change with create_brand_edit. Family matching is
case-sensitive after trimming.
Pass exactly one of `font_url` or `upload_id`.
Args:
- `brand_session_id` (string): Brand session ID from `list_brands`.
- `font_url` (string, optional): Public font URL, max 5MB.
- `upload_id` (string, optional): Completed temporary upload ID.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brand_session_id
Brand session ID from `list_brands`.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
font_url
Public TTF, OTF, WOFF, or WOFF2 URL, max 5MB. Pass exactly one of font_url or upload_id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
upload_id
Completed temporary font upload. Pass exactly one of upload_id or font_url.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"font_asset_id",
"family",
"format",
"weight",
"variable",
"expires_at"
],
"properties": {
"family": {
"type": "string"
},
"format": {
"enum": [
"ttf",
"otf",
"woff",
"woff2"
],
"type": "string"
},
"weight": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"variable": {
"type": "boolean"
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "Expiry timestamp for this single-use font asset. The consuming brand edit must finish preparing before this time; starting before expiry is not sufficient."
},
"font_asset_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "upload_brand_font",
"title": "Upload Brand Font",
"description": "Stage a single-use custom font for a brand edit. Returns font_asset_id, family, format, weight, variable, and expires_at. The asset expires after 24 hours, and the consuming edit must finish preparing before expires_at. The asset is deleted when the candidate is stored, preparation fails, or the work becomes stale. Upload it again for a later edit.\n\nPass either a public TTF, OTF, WOFF, or WOFF2 URL, or a completed temporary\nupload. For a local file, first call `create_upload_urls`, PUT the raw bytes as\ndirected, and pass the resulting `upload_id` here. Staging does not change the active brand. To use\nthe uploaded font, pass its font_asset_id and exact returned family in an exact\nprofile typography change with create_brand_edit. Family matching is\ncase-sensitive after trimming.\n\nPass exactly one of `font_url` or `upload_id`.\n\nArgs:\n- `brand_session_id` (string): Brand session ID from `list_brands`.\n- `font_url` (string, optional): Public font URL, max 5MB.\n- `upload_id` (string, optional): Completed temporary upload ID.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand_session_id",
"llm_model"
],
"properties": {
"font_url": {
"type": "string",
"format": "uri",
"description": "Public TTF, OTF, WOFF, or WOFF2 URL, max 5MB. Pass exactly one of font_url or upload_id."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"upload_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Completed temporary font upload. Pass exactly one of upload_id or font_url."
},
"brand_session_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Brand session ID from `list_brands`."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"font_asset_id",
"family",
"format",
"weight",
"variable",
"expires_at"
],
"properties": {
"family": {
"type": "string"
},
"format": {
"enum": [
"ttf",
"otf",
"woff",
"woff2"
],
"type": "string"
},
"weight": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"variable": {
"type": "boolean"
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "Expiry timestamp for this single-use font asset. The consuming brand edit must finish preparing before this time; starting before expiry is not sufficient."
},
"font_asset_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Upload Brand Font",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description74/100
Delete a brand from the caller's account.
Only call this when the user has explicitly asked to delete the brand.
Don't infer it from a vague cleanup request — confirm which brand they
mean first (use list_brands to disambiguate by name).
Args:
- brand_session_id (string): Brand session ID from list_brands
Returns:
{
"brand_session_id": string,
"name": string,
"workspace_id": string | null,
"workspace_name": string
}
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs92/100
Input documentation gives an agent enough context to populate the arguments.
brand_session_id
Brand session ID of the brand to delete.
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
{
"name": "delete_brand",
"title": "Delete Brand",
"description": "Delete a brand from the caller's account.\n\nOnly call this when the user has explicitly asked to delete the brand.\nDon't infer it from a vague cleanup request — confirm which brand they\nmean first (use list_brands to disambiguate by name).\n\nArgs:\n - brand_session_id (string): Brand session ID from list_brands\n\nReturns:\n {\n \"brand_session_id\": string,\n \"name\": string,\n \"workspace_id\": string | null,\n \"workspace_name\": string\n }",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand_session_id",
"llm_model"
],
"properties": {
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"brand_session_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Brand session ID of the brand to delete."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand_session_id",
"name",
"workspace_id",
"workspace_name"
],
"properties": {
"name": {
"type": "string"
},
"workspace_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"workspace_name": {
"type": "string"
},
"brand_session_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Delete Brand",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description79/100
List brands you can access, including their Brand session IDs, names, statuses, and workspaces.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
workspace_id
Scope results to one workspace by id (from list_workspaces). Omit (or pass null) to span every workspace the caller can see — each result is labeled with its workspace.
Clear enough to supply this argument.
url
Filter brands by website URL (partial match, e.g. "gumroad.com")
Clear enough to supply this argument.
limit
Results per page (default 50, max 100)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Pagination cursor from previous response
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
List workspaces the caller can access.
The personal workspace (is_personal: true) is listed first. Pass a workspace_id from this list to target a specific workspace. check_credits requires one; create tools such as onboard_brand may default to the personal workspace when their own docs say workspace_id is optional.
Args: (none)
Returns:
{
"workspaces": [
{ "workspace_id": string | null, "workspace_name": string, "is_personal": boolean, "pricing_version": number }
]
}
The caller's personal workspace (auto-created at signup) is listed first and tagged "is_personal": true.
The description explains the capability, when to use it, and what to expect.
Inputs96/100
Input documentation gives an agent enough context to populate the arguments.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
{
"name": "list_workspaces",
"title": "List Workspaces",
"description": "List workspaces the caller can access.\n\nThe personal workspace (is_personal: true) is listed first. Pass a workspace_id from this list to target a specific workspace. check_credits requires one; create tools such as onboard_brand may default to the personal workspace when their own docs say workspace_id is optional.\n\nArgs: (none)\n\nReturns:\n {\n \"workspaces\": [\n { \"workspace_id\": string | null, \"workspace_name\": string, \"is_personal\": boolean, \"pricing_version\": number }\n ]\n }\n\nThe caller's personal workspace (auto-created at signup) is listed first and tagged \"is_personal\": true.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"llm_model"
],
"properties": {
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"workspaces"
],
"properties": {
"workspaces": {
"type": "array",
"items": {
"type": "object",
"required": [
"workspace_id",
"workspace_name",
"is_personal",
"pricing_version"
],
"properties": {
"is_personal": {
"type": "boolean"
},
"workspace_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"workspace_name": {
"type": "string"
},
"pricing_version": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The workspace's pricing version. Credit amounts are comparable only within one version."
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Workspaces",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Check a workspace's remaining credits and what each credit-priced action costs it.
Brand creation, Brand edits, Briefs, and Reviews spend credits when credit_costs lists a nonzero price for them. Prices vary by workspace, so use this workspace's credit_costs when quoting them. free_brand_creations counts Brand creations that won't spend credits. Selected-model AI Gateway image, video, audio, and SVG pricing depends on the model and request; neither the balance nor credit_costs establishes that price or the model's availability.
Args:
- workspace_id (string, required): Workspace ID from list_workspaces. If the intended workspace is unknown, call list_workspaces first rather than choosing one.
Returns:
{ "workspace_id": string, "workspace_name": string, "balance": number, "unlimited": boolean, "pricing_version": number, "credit_costs": { "brand_creation": number, "brand_edit": number, "brief": number, "review": number, "image_2k": number, "image_4k": number }, "free_brand_creations": number, "subscription_paused"?: true, "message_for_assistant": string }
subscription_paused is present (true) when a past_due plan actually blocks
access — the last payment failed, so plan credits are on hold until payment is
completed. Credits remain spendable.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
workspace_id
Required workspace ID from list_workspaces. Call list_workspaces first when the intended workspace is unknown.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"workspace_id",
"workspace_name",
"balance",
"unlimited",
"pricing_version",
"credit_costs",
"free_brand_creations"
],
"properties": {
"balance": {
"type": "number"
},
"unlimited": {
"type": "boolean"
},
"credit_costs": {
"type": "object",
"required": [
"brand_creation",
"brand_edit",
"brief",
"review",
"image_2k",
"image_4k"
],
"properties": {
"brief": {
"type": "number"
},
"review": {
"type": "number"
},
"image_2k": {
"type": "number",
"description": "Compatibility pricing field for 2K images; not a selected-model generation price."
},
"image_4k": {
"type": "number",
"description": "Compatibility pricing field for 4K images; not a selected-model generation price."
},
"brand_edit": {
"type": "number"
},
"brand_creation": {
"type": "number"
}
},
"description": "Credits each action costs this workspace. 0 means the action is free right now. Selected-model generations are priced per request and aren't listed.",
"additionalProperties": false
},
"workspace_id": {
"type": "string"
},
"workspace_name": {
"type": "string"
},
"pricing_version": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The workspace's pricing version. Credit amounts are comparable only within one version."
},
"subscription_paused": {
"type": "boolean",
"const": true
},
"free_brand_creations": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Brand creations the workspace can still make without spending credits"
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "check_credits",
"title": "Check Credits",
"description": "Check a workspace's remaining credits and what each credit-priced action costs it.\n\nBrand creation, Brand edits, Briefs, and Reviews spend credits when credit_costs lists a nonzero price for them. Prices vary by workspace, so use this workspace's credit_costs when quoting them. free_brand_creations counts Brand creations that won't spend credits. Selected-model AI Gateway image, video, audio, and SVG pricing depends on the model and request; neither the balance nor credit_costs establishes that price or the model's availability.\n\nArgs:\n - workspace_id (string, required): Workspace ID from list_workspaces. If the intended workspace is unknown, call list_workspaces first rather than choosing one.\n\nReturns:\n { \"workspace_id\": string, \"workspace_name\": string, \"balance\": number, \"unlimited\": boolean, \"pricing_version\": number, \"credit_costs\": { \"brand_creation\": number, \"brand_edit\": number, \"brief\": number, \"review\": number, \"image_2k\": number, \"image_4k\": number }, \"free_brand_creations\": number, \"subscription_paused\"?: true, \"message_for_assistant\": string }\n\nsubscription_paused is present (true) when a past_due plan actually blocks\naccess — the last payment failed, so plan credits are on hold until payment is\ncompleted. Credits remain spendable.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"workspace_id",
"llm_model"
],
"properties": {
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"workspace_id": {
"type": "string",
"minLength": 1,
"description": "Required workspace ID from list_workspaces. Call list_workspaces first when the intended workspace is unknown."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"workspace_id",
"workspace_name",
"balance",
"unlimited",
"pricing_version",
"credit_costs",
"free_brand_creations"
],
"properties": {
"balance": {
"type": "number"
},
"unlimited": {
"type": "boolean"
},
"credit_costs": {
"type": "object",
"required": [
"brand_creation",
"brand_edit",
"brief",
"review",
"image_2k",
"image_4k"
],
"properties": {
"brief": {
"type": "number"
},
"review": {
"type": "number"
},
"image_2k": {
"type": "number",
"description": "Compatibility pricing field for 2K images; not a selected-model generation price."
},
"image_4k": {
"type": "number",
"description": "Compatibility pricing field for 4K images; not a selected-model generation price."
},
"brand_edit": {
"type": "number"
},
"brand_creation": {
"type": "number"
}
},
"description": "Credits each action costs this workspace. 0 means the action is free right now. Selected-model generations are priced per request and aren't listed.",
"additionalProperties": false
},
"workspace_id": {
"type": "string"
},
"workspace_name": {
"type": "string"
},
"pricing_version": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The workspace's pricing version. Credit amounts are comparable only within one version."
},
"subscription_paused": {
"type": "boolean",
"const": true
},
"free_brand_creations": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Brand creations the workspace can still make without spending credits"
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Check Credits",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Show which Rainbrand account this session is connected to.
Returns the email and name of the authenticated user behind the session's API key or login. Use it to confirm whose account is active.
Args: (none)
Returns:
{ "email": string, "name": string | null }
The description explains the capability, when to use it, and what to expect.
Inputs91/100
Input documentation gives an agent enough context to populate the arguments.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
{
"name": "get_account",
"title": "Account",
"description": "Show which Rainbrand account this session is connected to.\n\nReturns the email and name of the authenticated user behind the session's API key or login. Use it to confirm whose account is active.\n\nArgs: (none)\n\nReturns:\n { \"email\": string, \"name\": string | null }",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"llm_model"
],
"properties": {
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"email",
"name"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"email": {
"type": "string"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Account",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Open the shared upload picker in an MCP Apps client. Pass exactly one destination: brand_session_id to save images directly to an existing Brand Library, or workspace_id to stage files for another tool. Use workspace_id: null for the personal workspace.
With brand_session_id, the widget uploads and saves up to 10 PNG, JPEG, WebP, or AVIF images per batch, up to 10 MiB each. Read the widget's model context to collect the final Library image IDs before using them in another tool. The widget completes the Library upload; there is no Continue step.
With workspace_id, the widget stages local files, including before a Brand exists. It accepts up to 30 files, 100 MiB per file, and 256 MiB combined. Temporary uploads expire after two hours, and the consuming tool may have stricter file requirements.
Wait for the user to choose Continue and send an upload reference. Resolve that reference with get_file_picker_handoff. Use its verified upload IDs with tools that accept them in the returned workspace; use each file's temporary url where a generation model input expects a file URL. The reference itself is not an upload ID. Partial uploads may proceed only after explicit Continue with the successful files. Cancellation or zero successful uploads must not trigger onboarding. Staging alone creates no brand or asset.
If the picker is unavailable and the client can read local files and make HTTP requests, call create_upload_urls and PUT the raw bytes using the returned instructions. Then use the upload IDs with tools that accept them in the same workspace, and each file's temporary url where a generation model input expects a file URL; use upload_image to save Library images. Otherwise, ask for publicly reachable HTTPS file URLs. Never use private host attachment URLs.
Does NOT change the brand's logo. To use an uploaded image as a logo, add it to the Brand Library, then use its image_id in an exact profile change with create_brand_edit. An SVG
or GIF logo must already exist in the Brand Library before it can be assigned.
Public logo replacement is not supported for older Visual DNA brands.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
brand_session_id
Brand session ID to scope the upload to
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
workspace_id
Selected workspace ID from list_workspaces, or null for the personal workspace.
Clear enough to supply this argument.
llm_model
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"mode": {
"type": "string",
"const": "files"
},
"workspace_id": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"workspace_name": {
"type": "string"
},
"brand_session_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "open_upload_ui",
"title": "Upload local files",
"description": "Open the shared upload picker in an MCP Apps client. Pass exactly one destination: brand_session_id to save images directly to an existing Brand Library, or workspace_id to stage files for another tool. Use workspace_id: null for the personal workspace.\n\nWith brand_session_id, the widget uploads and saves up to 10 PNG, JPEG, WebP, or AVIF images per batch, up to 10 MiB each. Read the widget's model context to collect the final Library image IDs before using them in another tool. The widget completes the Library upload; there is no Continue step.\n\nWith workspace_id, the widget stages local files, including before a Brand exists. It accepts up to 30 files, 100 MiB per file, and 256 MiB combined. Temporary uploads expire after two hours, and the consuming tool may have stricter file requirements.\n\nWait for the user to choose Continue and send an upload reference. Resolve that reference with get_file_picker_handoff. Use its verified upload IDs with tools that accept them in the returned workspace; use each file's temporary url where a generation model input expects a file URL. The reference itself is not an upload ID. Partial uploads may proceed only after explicit Continue with the successful files. Cancellation or zero successful uploads must not trigger onboarding. Staging alone creates no brand or asset.\n\nIf the picker is unavailable and the client can read local files and make HTTP requests, call create_upload_urls and PUT the raw bytes using the returned instructions. Then use the upload IDs with tools that accept them in the same workspace, and each file's temporary url where a generation model input expects a file URL; use upload_image to save Library images. Otherwise, ask for publicly reachable HTTPS file URLs. Never use private host attachment URLs.\n\nDoes NOT change the brand's logo. To use an uploaded image as a logo, add it to the Brand Library, then use its image_id in an exact profile change with create_brand_edit. An SVG\nor GIF logo must already exist in the Brand Library before it can be assigned.\nPublic logo replacement is not supported for older Visual DNA brands.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"llm_model"
],
"properties": {
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"workspace_id": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
],
"description": "Selected workspace ID from list_workspaces, or null for the personal workspace."
},
"brand_session_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Brand session ID to scope the upload to"
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"mode": {
"type": "string",
"const": "files"
},
"workspace_id": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"workspace_name": {
"type": "string"
},
"brand_session_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"message_for_assistant": {
"type": "string",
"description": "Context, explanations, or actionable guidance for the calling assistant. Hosts may display it, but it is not copy that must be shown to the user verbatim."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Upload local files",
"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.
01Search Rainbrand documentationSearch public Rainbrand documentation for API integration and MCP usage.
02List modelsList supported generation models in Rainbrand’s public API.
03Get model schemaReturn the published input schema for a supported model in Rainbrand’s public API.
04List ImagesList Brand Library images with pagination and filters, or read known image_ids together.
05Check CreditsCheck a workspace's remaining credits and what each credit-priced action costs it.
Want to run these tasks against your MCP server with us?
Rainbrand setup, tools, quality score, publishing readiness, and alternatives.
How do I add Rainbrand to Claude, ChatGPT, or Cursor?
Add Rainbrand 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://mcp.rainbrand.com/mcp.
Is Rainbrand MCP ready for ChatGPT and Claude?
As of November 9, 2026, Rainbrand scores 95/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 Rainbrand's MCP tool documentation?
As of November 9, 2026, Rainbrand scores 87/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 50 of 50 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What are the best alternatives to Rainbrand?
As of November 10, 2026, alternatives to Rainbrand in design-creative on the Manufact MCP leaderboard include Dayfaro, Vectorize: logo to SVG, MotionVid, Reel Breakdown, and VideoGen.
How can Rainbrand improve its MCP documentation?
publish_file_picker_handoff is the lowest-scoring reviewed tool at 72/100. 1 of 3 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.