Connect an AI agent to Doodaro
Two ways to let an agent make videos for you. Copy for AI pastes instructions and a key into the chat. Doodaro MCP adds the API as tools the agent can call. Both use the same API and the same keys.
Which one to use
| Copy for AI | Doodaro MCP | |
|---|---|---|
| What it is | Generated text with a key and the agent guide | An MCP endpoint at https://app.doodaro.com/api/mcp |
| Works with | Claude Code, Codex, Cursor and other agents that can run HTTP requests | MCP clients that can send a header today: Claude Code, Codex, Cursor |
| Setup | One click, one paste | One command or config entry |
| How the agent calls Doodaro | It writes HTTP requests to /api/v1 | It calls tools such as create_project |
| Best for | A one-off task in a single session | An agent you use again and again |
Find both in your dashboard: open AI Connect, in the Connect AI group of the sidebar below Your designs → My Templates.
Copy for AI
Copy for AI is text, not a server. It hands a coding agent everything it needs to call the API: who it is working for, the base URL, a key and the instructions.
- Open AI Connect in your dashboard and click Copy for AI.
- The dashboard creates a new API key named
AI agent · <date>. - It fetches the public agent guide from
https://app.doodaro.com/api/v1/agent-guide. - It puts a header with the base URL and the key on top of the guide, copies the text to your clipboard and shows it once, with a warning that it contains a secret.
- Paste it into Claude Code, Codex, Cursor or another coding agent, then ask for a video. For example: "Make a 60-second portrait explainer about how planes fly in a chalkboard style."
What the text contains
The top of the text carries the base URL and the key. The rest is the agent guide, generated from the same operation list as the API, so it is always current. The shape looks like this:
# Doodaro API access
Base URL: https://app.doodaro.com/api/v1
API key: ddr_live_... (secret, revoke it in Developer)
# Doodaro API guide for AI agents
...the agent guide from /api/v1/agent-guide follows... The guide tells the agent:
- Who it is working for, the base URL and how to authenticate.
- The standard flow: list styles and voices → create a project with scenes → generate assets → poll → render → poll → return
videoUrlanddashboardUrl. - Every operation with method, path and body.
- The error format and polling advice (every 3 to 5 seconds).
- Rules: confirm with you before large generations or renders, never print the key back, never invent style or voice ids.
You can read the guide without a key at app.doodaro.com/api/v1/agent-guide. It contains no secret.
Security and revoking
- The copied text contains a live key. Treat it like a password. Do not paste it into shared docs, tickets or public chats.
- Every click creates a separate key, so you can revoke one agent session without breaking anything else.
- To revoke: open Developer in your dashboard, find the key named
AI agent · <date>and click Revoke. The next request with it returns401 unauthorized. - Revoke the key when the task is done. You can always copy a fresh one.
- Coding agents may keep conversation history. If a session log could be shared, revoke the key it used.
Doodaro MCP
Doodaro MCP exposes the API as tools. Add the URL and your key header to your MCP client and the agent can call list_styles, create_project, render_video and the rest directly.
| URL | https://app.doodaro.com/api/mcp |
| Auth header | Authorization: Bearer ddr_live_... |
| Local studio | http://127.0.0.1:4318/api/mcp |
First create a key in Developer and export it in the shell your client starts from:
export DOODARO_API_KEY="ddr_live_..." Client config syntax changes over time. If a format below has changed, check your client's MCP docs.
Claude Code
claude mcp add --transport http doodaro https://app.doodaro.com/api/mcp \
--header "Authorization: Bearer $DOODARO_API_KEY" Then run /mcp inside Claude Code to confirm doodaro is connected.
Codex
# ~/.codex/config.toml
[mcp_servers.doodaro]
url = "https://app.doodaro.com/api/mcp"
bearer_token_env_var = "DOODARO_API_KEY" Codex reads the key from the DOODARO_API_KEY environment variable, so the secret never sits in the config file.
Cursor
// .cursor/mcp.json
{"mcpServers": {"doodaro": {"url": "https://app.doodaro.com/api/mcp",
"headers": {"Authorization": "Bearer ${env:DOODARO_API_KEY}"}}}} ${env:DOODARO_API_KEY} reads the key from your environment. Do not commit a literal key into .cursor/mcp.json.
Transport and auth
- Transport: MCP Streamable HTTP, stateless. Each
POST /api/mcpcarries one JSON-RPC 2.0 message and the response isapplication/json.GETandDELETEreturn405. - Auth: the same API key as the REST API, in
Authorization: Bearer. A missing or bad key returns401withWWW-Authenticate: Bearer. - Methods:
initialize,notifications/initialized,ping,tools/list,tools/call.
Tools
There is one tool per API operation, with the same name and the same JSON Schema input. Path parameters such as projectId become input fields. The discovery routes and get_media are not tools.
| Tool | What it does |
|---|---|
get_account | Returns the plan, the minute counters and the key making the call. Use it to check that a key works. |
list_styles | Lists the 37 curated Doodaro styles and your saved templates. Style ids go into styleId. |
list_voices | Lists narrators from the voice library. Pass the id and name as the project voice or a scene override. |
list_engines | Lists the drawing engine versions a project can pin, and the default. |
list_projects | Lists your projects, including the ones made in the dashboard. |
create_project | Creates a project from your scenes or from a script. Returns the project detail. |
get_project | Returns the project detail. The server syncs finished image, voice and story jobs into the project first. |
update_project | Changes project settings. Changing the style marks scene images stale. |
sync_project | Applies finished jobs to the project now and returns the project detail. get_project and render_video do this for you. |
update_scene | Edits one scene. Changing narration or voice marks that scene's recording stale; changing the picture description marks its image stale. |
add_scene | Adds a scene, placed after afterSceneId when you give one. Returns the project detail. |
delete_scene | Deletes one scene and returns the project detail. |
plan_scenes | Queues a story assistant job that splits the saved script into scenes with picture descriptions. |
apply_plan | Applies a completed story plan to the project and returns the project detail. |
generate_assets | Queues picture and narration generation for the project, or for chosen scenes. |
render_video | Syncs the project, checks it can render, then queues a render with the project's saved engine version. |
list_renders | Lists the renders of a project. |
get_job | Reads a story, image, voice, batch or render job. Poll every 3 to 5 seconds until a terminal status. |
cancel_job | Cancels a job and returns it in the same shape as get_job. |
A successful tools/call returns the API response twice: as a JSON string in content[0].text and as an object in structuredContent. An API error returns isError: true with the same error object the REST API sends (code and message).
Test with curl
You do not need a client to check the endpoint. List the tools:
curl -X POST https://app.doodaro.com/api/mcp \
-H "Authorization: Bearer $DOODARO_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}' Call a tool:
curl -X POST https://app.doodaro.com/api/mcp \
-H "Authorization: Bearer $DOODARO_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc": "2.0", "id": 2, "method": "tools/call",
"params": {"name": "get_project", "arguments": {"projectId": "<projectId>"}}}' {
"jsonrpc": "2.0",
"id": 2,
"result": {
"content": [{"type": "text", "text": "{\"id\":\"<projectId>\",\"title\":\"How planes fly\", ...}"}],
"structuredContent": {"id": "<projectId>", "title": "How planes fly", "...": "..."}
}
} {
"jsonrpc": "2.0",
"id": 3,
"result": {
"isError": true,
"content": [{"type": "text", "text": "{\"error\":{\"code\":\"not_ready\",\"message\":\"...\"}}"}]
}
} ChatGPT and Claude chat
Not yet. ChatGPT and Claude chat add custom connectors through a sign-in flow (OAuth), and Doodaro does not have that yet. It is phase 2.
When it ships, you will add https://app.doodaro.com/api/mcp as a custom connector and click Sign in with Doodaro instead of pasting a key. The tools will be the same. Until then, use Claude Code, Codex or Cursor with a key header, or Copy for AI.