Sign in with OAuth
The client opens your browser. You sign in, pick the team and the scopes, and allow access. The client gets a token and renews it on its own. Clients find the sign-in page at /.well-known/oauth-protected-resource.
Developers / MCP
FoxyLab runs a remote MCP server. Connect your agent, and it can make a film from an ask or a site, follow each stage, give notes and take the files.
https://api.foxylab.ai/mcp/1
Your agent
Claude Code, Claude Desktop, Cursor or your own
2
api.foxylab.ai
Streamable HTTP. OAuth or an API key
3
The studio
The seven stages, then your files
Run the command in a terminal. Put your key in place of <key>.
To sign in with OAuth, leave out --header. Then run /mcp in Claude Code, pick foxylab and sign in.
mcp add http foxylab https://api.foxylab.ai/mcp/ mcp add http foxylab https://api.foxylab.ai/mcp/Claude Desktop connects with OAuth, so you do not need a key.
https://api.foxylab.ai/mcp/ as the URL.Add the server to ~/.cursor/mcp.json for all projects, or to .cursor/mcp.json for one project. Put your key in place of <key>.
To sign in with OAuth, leave out headers. Cursor opens the sign-in page when the agent first uses a tool.
{
"mcpServers": {
"foxylab": {
"url": ,
"headers": { "Authorization": }
}
}
}Any client that speaks Streamable HTTP can connect. Most clients read a config like this one. The key names can be different in your client, so check its docs.
{
"mcpServers": {
"foxylab": {
"type": ,
"url": ,
"headers": { "Authorization": }
}
}
}The server has 6 tools. Each tool needs one scope. The agent sees the same names, texts and input schemas as here.
create_filmStarts a new film from a one-line ask, a site or both.films:writeget_filmGets the film, its current version and the status of each stage.films:readadd_noteGives the film a note in plain words and makes a new version.films:writelist_filmsLists the films of your team, the newest first.films:readget_rendersGets the files of a film for each format and file type.films:readrestore_versionBrings back an earlier version as a new version.films:writefilms:writeStarts a new film from a one-line ask, a site or both.
promptstringprompt, url or both.urlstringformatsstring[]9:16, 4:5, 1:1, 16:9. The default is 9:16.languagestringUkrainian. The default is English.voicestringsulafat, a few words such as warm, slow, or none for music only. Without it, the studio picks a voice for the brand.voice_modestringauto, the default: the studio decides whether a narrator helps this film, and where. parts: it stops where the picture and the music say more. full: every shot is spoken. none: no narrator.musicstringauto, the default: the studio decides whether the film needs a music bed, and picks it from free stock. on: always a bed. off: no music. A CC BY track comes with a credit line for the post; renders return it.music_levelstringlow, normal (the default) or high. The voice always stays at least 15 dB above it.brand_kitstringkit_mossly. It wins over what the studio reads from url.Returns The film id, the status and the stage it is in.
films:readGets the film, its current version and the status of each stage.
film_idstringfilm_8Kq2xV.Returns The title, the status, the seven stages and the time left.
films:writeGives the film a note in plain words and makes a new version.
film_idstringfilm_8Kq2xV.textstringrefsobject[]{ "shot": "s3" }, { "time": 14.7 } in seconds, or { "format": "16:9" }.Returns The new version number and the stages that run again.
films:readLists the films of your team, the newest first.
statusstringworking, ready or failed.limitintegerReturns The id, the title, the status and the version of each film.
films:readGets the files of a film for each format and file type.
film_idstringfilm_8Kq2xV.versionintegerformatstring16:9.typestringmp4, mov, webm or gif.Returns Links to download, good for 24 hours.
films:writeBrings back an earlier version as a new version.
film_idstringfilm_8Kq2xV.versionintegerReturns The new version number.
Each film is a resource at films://{id}. A client can attach it to the conversation, or the agent can read it with resources/read.
The resource is JSON: the film, its script shot by shot, its formats and its page. The list holds the 20 newest films of your team.
{
"id": ,
"title": ,
"status": ,
"version": ,
"seconds": ,
"logline": ,
"shots": [
{ "id": , "says": },
{
"id": ,
"says":
},
{ "id": , "says": }
],
"formats": [, ]
}One run, from the first ask to the files. The agent makes the film, waits for it, takes a note from you and brings back the files of the new version.
You
Make a launch ad for Mossly from example.com. Vertical and wide, with a warm voice.
I will start the film from your site.
The film is ready. “The Diva”, 19 seconds: a peace lily faints on stage until Mossly reads her in one photo. Do you want a change?
You
Shot 3 is too fast. Slow the voice there and keep the offer on screen longer.
Version 2 is ready. Here are the 9:16 and the 16:9 files. Version 1 is kept if you want it back.
An agent with a key can make films and spend your usage limit. Give it only what it needs.
films:readfilms:writeGive each agent only the scopes it needs. An agent with films:read alone can follow films but cannot make or change them.
Make a key for each agent or system and give it a name. Then you can stop one without the others.
Revoke a key or an OAuth connection on the API keys page. The next call with it gets 401.
Keep keys in a secret manager or an environment variable. Do not put a key in a repository, a prompt or a shared config.
Tool calls draw on the usage limit of your plan, the same as the studio and the API.