Connecting an MCP client
The MCP server is OAuth-only — a plain API key won't authenticate here, even though it works everywhere else on /v1/*. Point any MCP-compatible client (Claude Desktop, Claude Code, Cursor, etc.) at the server URL below; the client discovers the OAuth endpoints automatically and prompts you to sign in and consent. Full OAuth endpoint details are in the API reference.
https://app.frameline.io/v1/mcp
Example configuration for a client that takes a raw server list:
{
"mcpServers": {
"frameline": {
"url": "https://app.frameline.io/v1/mcp"
}
}
}On first connection you'll be redirected to sign in (if needed) and approve the client for a specific workspace. Every tool call after that acts on that workspace only.
Available tools
Every tool is a thin wrapper over the same services the dashboard and machine API use — a template created through MCP is identical to one created by hand.
list_templatesList templates in the caller's workspace, with tags, description and a per-page summary — enough to match a request against a template's purpose without opening its draft.
| Param | Type | Notes |
|---|---|---|
| search | string | Optional free-text filter. |
| tags | string[] | Optional tag filter. |
| page | number | Defaults to 1. |
| limit | number | 1–100. |
get_templateFetch a template's metadata by id.
| Param | Type | Notes |
|---|---|---|
| id* | string |
get_template_draftFetch a template's full editable design document (pages, layers, tags).
| Param | Type | Notes |
|---|---|---|
| id* | string |
list_template_parametersList the variables derived from a template's canvas layers.
| Param | Type | Notes |
|---|---|---|
| id* | string |
create_templatescope: template:writeCreate a new template with one blank page of a given size.
| Param | Type | Notes |
|---|---|---|
| name* | string | 1–120 chars. |
| description | string | Up to 500 chars. |
| tags | string[] | Up to 20 tags. |
| width | number | 1–20000. |
| height | number | 1–20000. |
update_templatescope: template:writeRename, re-describe or re-tag a template.
| Param | Type | Notes |
|---|---|---|
| id* | string | |
| name | string | 1–120 chars. |
| description | string | Up to 500 chars. |
| tags | string[] | Up to 20 tags. |
duplicate_templatescope: template:writeCopy a template and its current draft.
| Param | Type | Notes |
|---|---|---|
| id* | string | |
| name | string | Name for the copy. |
save_template_draftscope: template:writeReplace a template's design document — the same shape the studio editor authors.
| Param | Type | Notes |
|---|---|---|
| id* | string | |
| design* | object | { version, designName, activePageId, pages[] }. |
render_templatescope: render:writeRasterize a template's current draft to an image or PDF, optionally substituting variable values first. Costs one credit per rendered file unless identical output was already rendered.
| Param | Type | Notes |
|---|---|---|
| id* | string | |
| format | "png" | "jpeg" | "pdf" | Defaults to png. |
| modifications | Record<string,string> | Variable overrides. |
| pageId | string | Defaults to the active page. |
| allPages | boolean | Render every page. |
get_brand_kitFetch the workspace brand kit — logo, fonts, color palette and style-guide text — to keep generated designs on-brand.
search_stock_photosSearch royalty-free stock photos (Pexels/Unsplash) to drop straight into a template's image layer.
| Param | Type | Notes |
|---|---|---|
| query | string | Up to 200 chars. Omit for a curated feed. |
| provider | "pexels" | "unsplash" | Omit to search all sources. |
| page | number | Defaults to 1. |
| perPage | number | 1–80. |