Adapt Creative Api¶
adapt_creative_api — mvp.adapt_creative_api
Cluster: Creative & Media | Type: component | MCP Tools: 44
Overview¶
Unified gateway to external creative design and image-generation APIs — Figma, Canva, Stability AI, and Replicate — behind a single consistent interface. Discover available providers, check authentication, generate or edit images, export Figma designs, manage Canva documents, run Replicate models, and persist results to a SQLite store. All provider calls are gated on API key presence and log clearly when credentials are missing, making the block safe to include in pipelines before credentials are configured.
When to use:
- Generating images via Stability AI or Replicate from an agent or solver step
- Fetching and exporting assets from a Figma file as part of a design pipeline
- Discovering which creative providers are configured and authenticated at runtime
- Caching and retrieving previously generated creative results by ID
Example:
from mvp.adapt_creative_api import AdaptCreativeAPIBlock, CreativeAPIInput
block = AdaptCreativeAPIBlock(name="creative_api")
result = block.infer(CreativeAPIInput(
op="stability_generate",
provider="stability",
prompt="a watercolour painting of a rainy Tokyo street",
width=512,
height=512,
style="anime",
))
# result.value.image_base64 → generated image; result.value.result_id → saved result id
Works well with: adapt_comfyui, adapt_image, adapt_ui_design
Launch Readiness¶
Status: needs live credential smoke test before first-user or paid-customer use.
The component has unit coverage for schema validation, missing-key behavior, paid-provider consent, MCP forwarding, Figma team_id forwarding, Canva request shapes, and SQLite persistence. It still depends on live third-party provider auth, token scopes, rate limits, and async export behavior, so mock-backed tests are not enough to mark it production-ready.
Run this smoke test with real development or sandbox credentials before launch:
discover_allreturns the expected configured providers.generate_image(..., allow_paid_api=True)completes through Stability AI or Replicate.figma_list_projects(team_id=...)returns projects for a real Figma team.canva_createcreates a design and returns an edit or view URL.canva_exportcreates an export job and returns a job ID or download URL.
Treat failures here as launch blockers for creative-provider workflows, but not for the rest of G6's MCP install path.
Public API¶
AdaptCreativeAPIBlock(AIBlock[CreativeAPIInput, CreativeAPIOutput, dict])¶
Creative API adapter — dispatches to Figma, Canva, Stability AI, Replicate.
| Field | Type | Default |
|---|---|---|
name | str | 'adapt_creative_api' |
state | dict | field(default_factory=dict) |
resource_bounds | ResourceBounds \| None | None |
usage | ResourceUsage | field(default_factory=ResourceUsage) |
Methods:
infer(data: CreativeAPIInput) -> Result[CreativeAPIOutput]¶
CreativeAPIInput(BaseModel)¶
Input to AdaptCreativeAPIBlock.
| Field | Type | Default |
|---|---|---|
op | Literal['discover_all', 'check_auth', 'provider_info', 'generate_image', 'edit_image', 'list_styles', 'figma_get_file', 'figma_export', 'figma_list_projects', 'canva_create', 'canva_list', 'canva_export', 'stability_generate', 'stability_upscale', 'stability_edit', 'replicate_run', 'replicate_list', 'replicate_get', 'envato_search', 'envato_get_item', 'envato_popular', 'envato_account_info', 'envato_collections', 'envato_list_purchases', 'envato_download_purchased', 'envato_list_categories', 'recommend_provider', 'list_patterns', 'discover_capabilities', 'backend_native_op', 'provider_native_op'] | 'discover_all' |
provider | str | '' |
prompt | str | '' |
image_base64 | str | '' |
width | int | 0 |
height | int | 0 |
style | str | '' |
model | str | '' |
file_key | str | '' |
team_id | str | '' |
node_ids | list[str] | [] |
design_id | str | '' |
format | str | 'png' |
result_id | str | '' |
limit | int | 20 |
envato_site | str | '' |
envato_item_id | str | '' |
envato_category | str | '' |
envato_purchase_code | str | '' |
envato_term | str | '' |
envato_filter | str | '' |
envato_page | int | 1 |
envato_page_size | int | 20 |
brief | str | '' |
task | str | '' |
context | str | '' |
allow_paid_api | bool | False |
native_operation | str | '' |
native_params | dict[str, Any] | Field(default_factory=dict) |
request_id | str | '' |
task_id | str | '' |
run_id | str | '' |
CreativeAPIOutput(BaseModel)¶
Output from AdaptCreativeAPIBlock.
| Field | Type | Default |
|---|---|---|
op | str | required |
provider | str | '' |
providers | list[dict] | [] |
image_base64 | str | '' |
output_path | str | '' |
result_id | str | '' |
metadata | dict | {} |
results | list[dict] | [] |
authenticated | bool | False |
available_ops | list[str] | [] |
backend | str | '' |
degraded | bool | False |
degradation_reason | str \| None | None |
available_with | str | '' |
recommendation | dict | {} |
llm_used | bool | False |
completion_state | Literal['verified', 'qualified-draft', 'blocked-escalated'] | 'qualified-draft' |
warning_card | dict[str, Any] | Field(default_factory=dict) |
degradation | dict[str, Any] | Field(default_factory=dict) |
evidence | list[dict[str, Any]] | Field(default_factory=list) |
request_id | str | '' |
task_id | str | '' |
run_id | str | '' |
AdaptCreativeAPIMCPBlock(AIBlock[MCPCreativeAPIInput, MCPCreativeAPIOutput, dict])¶
41-op creative API MCP block with SQLite persistence and FORMA templates.
| Field | Type | Default |
|---|---|---|
name | str | 'adapt_creative_api_mcp' |
state | dict | field(default_factory=dict) |
db_path | str | field(default_factory=lambda: os.environ.get('CREATIVE_API_DB_PATH', _DEFAULT_DB)) |
resource_bounds | ResourceBounds | field(default_factory=ResourceBounds) |
usage | ResourceUsage | field(default_factory=ResourceUsage) |
Methods:
close() -> None¶
Close the backing store (idempotent).
infer(data: MCPCreativeAPIInput) -> Result[MCPCreativeAPIOutput]¶
MCPCreativeAPIRecord(BaseModel)¶
A single metadata record returned from CreativeAPIStore queries.
| Field | Type | Default |
|---|---|---|
id | str | required |
record_type | str | required |
name | str | required |
content | str | required |
tags | str | '' |
timestamp | str | '' |
metadata | dict | {} |
MCPCreativeAPIInput(BaseModel)¶
Input to AdaptCreativeAPIMCPBlock - 41 ops.
| Field | Type | Default |
|---|---|---|
op | Literal['discover_all', 'check_auth', 'provider_info', 'generate_image', 'edit_image', 'list_styles', 'figma_get_file', 'figma_export', 'figma_list_projects', 'canva_create', 'canva_list', 'canva_export', 'stability_generate', 'stability_upscale', 'stability_edit', 'replicate_run', 'replicate_list', 'replicate_get', 'envato_search', 'envato_get_item', 'envato_popular', 'envato_account_info', 'envato_collections', 'envato_list_purchases', 'envato_download_purchased', 'envato_list_categories', 'forma_list_templates', 'forma_describe_template', 'forma_render_template', 'forma_template_variants', 'forma_principles', 'forma_cookbook', 'result_save', 'result_get', 'result_list', 'result_delete', 'provider_list', 'stats', 'get_info', 'recommend_provider', 'list_patterns', 'discover_capabilities', 'backend_native_op', 'provider_native_op'] | required |
provider | str | '' |
prompt | str | '' |
image_base64 | str | '' |
width | int | 0 |
height | int | 0 |
style | str | '' |
model | str | '' |
file_key | str | '' |
team_id | str | '' |
node_ids | list[str] | [] |
design_id | str | '' |
format | str | 'png' |
result_id | str | '' |
limit | int | 20 |
envato_site | str | '' |
envato_item_id | str | '' |
envato_category | str | '' |
envato_purchase_code | str | '' |
envato_term | str | '' |
envato_filter | str | '' |
envato_page | int | 1 |
envato_page_size | int | 20 |
category | str | '' |
template_id | str | '' |
target | str | '' |
inputs_json | str | '' |
variant_count | int | 3 |
name | str | '' |
tags_csv | str | '' |
notes | str | '' |
content_json | str | '' |
query | str | '' |
brief | str | '' |
task | str | '' |
context | str | '' |
allow_paid_api | bool | False |
native_operation | str | '' |
native_params | dict[str, Any] | {} |
request_id | str | '' |
task_id | str | '' |
run_id | str | '' |
MCPCreativeAPIOutput(BaseModel)¶
Output from AdaptCreativeAPIMCPBlock.
| Field | Type | Default |
|---|---|---|
op | str | required |
provider | str | '' |
providers | list[dict] | [] |
image_base64 | str | '' |
output_path | str | '' |
result_id | str | '' |
metadata | dict | {} |
results | list[dict] | [] |
authenticated | bool | False |
available_ops | list[str] | [] |
backend | str | '' |
found | bool | False |
count | int | 0 |
message | str | '' |
records | list[dict] | [] |
summary | dict | {} |
output | str | '' |
format | str | '' |
target | str | '' |
degraded | bool | False |
degradation_reason | str \| None | None |
available_with | str | '' |
recommendation | dict | {} |
llm_used | bool | False |
completion_state | str | 'qualified-draft' |
warning_card | dict[str, Any] | {} |
degradation | dict[str, Any] | {} |
evidence | list[dict[str, Any]] | [] |
request_id | str | '' |
task_id | str | '' |
run_id | str | '' |
CreativeAPIStore¶
SQLite-backed store for the adapt_creative_api MCP sub-package.
Constructor:
| Parameter | Type | Default |
|---|---|---|
db_path | str | ':memory:' |
Methods:
close() -> None¶
Close the database connection (idempotent).
save_result(name: str, provider: str, op: str, content: dict, tags: str = '', notes: str = '') -> str¶
Persist an API result. Returns the assigned id.
get_result(result_id: str) -> dict | None¶
Retrieve a saved result by id.
list_results(provider: str = '', limit: int = 50) -> list[dict]¶
List saved results, optionally filtered by provider.
delete_result(result_id: str) -> bool¶
Delete a saved result by id. Returns True if found and deleted.
register_provider(name: str, config: dict, status: str = 'available') -> str¶
Register or update a provider configuration.
list_providers() -> list[dict]¶
List all registered providers.
count_all() -> dict[str, int]¶
MCP Tools¶
| Operation | Source |
|---|---|
discover_all | creative_api_mcp |
check_auth | creative_api_mcp |
provider_info | creative_api_mcp |
generate_image | creative_api_mcp |
edit_image | creative_api_mcp |
list_styles | creative_api_mcp |
figma_get_file | creative_api_mcp |
figma_export | creative_api_mcp |
figma_list_projects | creative_api_mcp |
canva_create | creative_api_mcp |
canva_list | creative_api_mcp |
canva_export | creative_api_mcp |
stability_generate | creative_api_mcp |
stability_upscale | creative_api_mcp |
stability_edit | creative_api_mcp |
replicate_run | creative_api_mcp |
replicate_list | creative_api_mcp |
replicate_get | creative_api_mcp |
envato_search | creative_api_mcp |
envato_get_item | creative_api_mcp |
envato_popular | creative_api_mcp |
envato_account_info | creative_api_mcp |
envato_collections | creative_api_mcp |
envato_list_purchases | creative_api_mcp |
envato_download_purchased | creative_api_mcp |
envato_list_categories | creative_api_mcp |
forma_list_templates | creative_api_mcp |
forma_describe_template | creative_api_mcp |
forma_render_template | creative_api_mcp |
forma_template_variants | creative_api_mcp |
forma_principles | creative_api_mcp |
forma_cookbook | creative_api_mcp |
result_save | creative_api_mcp |
result_get | creative_api_mcp |
result_list | creative_api_mcp |
result_delete | creative_api_mcp |
provider_list | creative_api_mcp |
stats | creative_api_mcp |
get_info | creative_api_mcp |
recommend_provider | creative_api_mcp |
list_patterns | creative_api_mcp |
discover_capabilities | creative_api_mcp |
backend_native_op | creative_api_mcp |
provider_native_op | creative_api_mcp |