The YouTube MCP server for Claude, ChatGPT and Cursor.
https:// runsheet.buildifyapp.in/ api/ mcp. Claude, ChatGPT, Cursor or another client that speaks the Model Context Protocol can use it to read your running order, draft copy and move publish times. Paste the URL, approve it on Runsheet’s own screen and choose what it may do, or give it a key you control. Nothing to install.Claude reads the running order, checks the channel, drafts titles and saves the best as an idea, then moves a video and rewrites its description. Every call is one of the tools on this page.
Most clients need only this address. Paste it in, approve the connection on Runsheet’s own screen, and ask it something. Cursor and some other clients take an API key.
https://runsheet.buildifyapp.in/ api/ mcp
Claude, on the web and in Claude Desktop
- Open Customize, then Connectors.
- Choose Add custom connector and paste the address above.
- Choose Add, then Connect. Runsheet’s approval screen opens: pick the channel, tick what Claude may do, and choose Allow.
On a Team or Enterprise plan an owner adds it first, under Organization settings, then Connectors, then Add, then Custom. Members then find it under Customize, Connectors, and choose Connect.
ChatGPT
- In Settings, open Security and login and turn on Developer mode.
- Go to ChatGPT Plugins, press the plus button and give it a name, such as Runsheet.
- Under Connection, enter the address above and create it. Runsheet’s approval screen opens: pick the channel, tick what ChatGPT may do, and choose Allow.
In a conversation, choose Developer mode from the plus menu and select it. ChatGPT asks you to confirm before a tool that changes something runs.
Claude Code
claude mcp add --transport http runsheet https://runsheet.buildifyapp.in/ api/ mcp
Then run /mcp inside Claude Code and choose runsheet. The approval screen opens in your browser. With a key instead:
claude mcp add --transport http runsheet https://runsheet.buildifyapp.in/ api/ mcp --header "Authorization: Bearer rsk_live_your_key_here"
Add --scope user to have it in every project. In a shared .mcp.json the entry also needs "type": "http" beside the URL; keep keys out of a shared file.
Cursor
{
"mcpServers": {
"runsheet": {
"url": "https:// runsheet.buildifyapp.in/ api/ mcp",
"headers": {
"Authorization": "Bearer rsk_live_your_key_here"
}
}
}
}Make the key in Settings, under API keys. It is shown once, so copy it then. A new key starts with Read; tick the permissions for the tools you want it to reach, and make a new key to change them later.
Any other client
If it supports MCP’s OAuth sign-in, give it the address above and approve it on Runsheet’s screen. Or point it at https:// over Streamable HTTP and send a key as Authorization: Bearer rsk_live_... or as X-Runsheet-Key: rsk_live_....
The sign-in is standard MCP authorization: the server’s 401 names its metadata, clients register themselves or identify with a metadata document, and every sign-in uses PKCE. Claude Desktop can also take a key through the mcp-remote bridge; that config is on the MCP screen inside Runsheet.
Make the key in Settings, under API keys. It is shown once, so copy it then. A new key starts with Read; tick the permissions for the tools you want it to reach, and make a new key to change them later.
Upload from your computer
It streams a video file from your disk straight to YouTube, and forwards every other tool to the hosted server with the same key. In a client that takes a config, use it in place of the hosted entry. The key needs Upload from this machine ticked.
Claude Code:
claude mcp add --env RUNSHEET_API_KEY=rsk_live_your_key_here --transport stdio runsheet -- npx -y runsheet-mcp
Cursor, in ~/.cursor/mcp.json, and Claude Desktop, in claude_desktop_config.json followed by a restart:
{
"mcpServers": {
"runsheet": {
"command": "npx",
"args": ["-y", "runsheet-mcp"],
"env": { "RUNSHEET_API_KEY": "rsk_live_your_key_here" }
}
}
}Each upload is public, unlisted or private, as you choose. Public needs a publish time at least fifteen minutes away: it goes up private and YouTube makes it public at that time. Unlisted and private go up right away. The source is on GitHub.
Then ask it something. “What is in my running order this week?” is a good first one, because the answer proves the connection and is actually useful. More to try.
Paste one into your AI app (Claude, ChatGPT, Cursor). Each says which permissions it needs and what should come back, so it is obvious whether it worked.
Ask what your week looks like
Using Runsheet, show me what I have scheduled over the next fourteen days. Tell me which days are empty and whether my posting gap is getting longer or shorter.
What comes back. A day-by-day list of what is queued, the empty days named, and your median gap between uploads. Nothing is changed.
runsheet_get_schedulerunsheet_get_channelFind the videos that stalled
Look at my Runsheet library and find the five videos that gained the fewest views in the last seven days. For each one tell me its format and how old it is, and say whether the pattern is about format or about age.
What comes back. Five videos with their seven-day gain, and a read on whether shorts or long cuts are the thing slowing down. Measured, not guessed.
runsheet_get_libraryDraft titles for something you have not filmed
I am making a video about the three editing shortcuts that saved me the most time this year. Use Runsheet to write me five title options and a description, then count the characters on each title against YouTube's limit.
What comes back. Five titles under sixty characters, three descriptions, and a character count on each, written by your AI from Runsheet's brief. No Cue credits.
Retitle a video that underperformed
Find my worst performing short from the last month in Runsheet, write three better titles for it, and then set the best one as its actual title on YouTube.
What comes back. The video identified from real numbers, three alternatives, and the title changed on YouTube. Needs a key with the edit permission.
Fill the empty days in your runsheet
My Runsheet has gaps over the next three weeks. Look at what I have published before, suggest a video for each empty slot that fits what already works, and move anything already scheduled so the spacing is even.
What comes back. A suggestion per empty day and the existing queue respaced, every publish time at least fifteen minutes ahead so you can check the plan first.
runsheet_get_schedulerunsheet_get_libraryrunsheet_schedule_videoDesign a thumbnail without opening a design tool
Take my next scheduled video in Runsheet and design a thumbnail for it from its title and description. Then make a second version with the words laid out differently so I can compare them.
What comes back. Two thumbnails with URLs you can open. The drawn one spends your image allowance; the typeset one does not.
Compare yourself to a channel you watch
Using Runsheet, compare my channel's upload rhythm and shorts share to the channels I track. Tell me where I am actually behind rather than where I feel behind.
What comes back. Your uploads per week and shorts share against theirs, from medians rather than averages, with the sample size stated.
runsheet_get_watchlistA standing instruction for every morning
Every time I ask for a channel update: check my Runsheet schedule and library, tell me anything that needs a decision today, name any empty day in the next week, and stop before changing anything.
What comes back. The same briefing every morning without re-typing it. The last clause matters: it keeps a standing instruction read-only.
runsheet_get_schedulerunsheet_get_libraryrunsheet_get_channelGenerated from the server’s own tool table, so this is the list a client is offered. A key or a connected app is shown the tools its permissions cover.
Your channel
runsheet_get_channelThe connected YouTube channel's current state as Runsheet last recorded it: title, handle, subscriber count, total views, video count, and when it was last synced.
runsheet_get_scheduleVideos that are scheduled or ready but not yet published, soonest first.
runsheet_get_libraryPublished videos, most recent first.
runsheet_get_watchlistThe other YouTube channels this channel watches, measured with the same maths as the creator's own: each one's uploads per week, share of Shorts, and its breakout videos, meaning videos that reached two and a half times the median views of their own format on that channel.
runsheet_list_playlistsThe playlists on the connected channel, with their ids and how many videos each holds.
Text, exactly
runsheet_count_charactersCount text against YouTube's limits.
runsheet_preserve_line_breaksInsert the invisible character (U+2060 WORD JOINER) that stops YouTube collapsing blank lines in a description, comment or community post.
runsheet_style_textProduce bold or italic text for YouTube.
Thumbnails, set as type
runsheet_make_thumbnailRender a YouTube thumbnail as a PNG from a headline and a layout.
Writing
runsheet_generate_titlesGenerate five candidate YouTube titles from a description of a video.
runsheet_generate_shorts_hooksGenerate five opening lines for a YouTube Short from a description of it, each designed to stop a swipe within two seconds.
runsheet_generate_descriptionGenerate three YouTube description options from a description of a video.
runsheet_generate_channel_descriptionGenerate three YouTube channel About descriptions from a description of the channel, each stating who it is for, what they get, and how often.
runsheet_generate_tagsGenerate ten to fifteen YouTube tags from a description of a video, ordered from most specific to most general.
runsheet_generate_chaptersGenerate a YouTube chapter list from an outline of what happens in a video.
runsheet_translate_videoTranslate a video's title and description into up to 6 languages at once, for viewers whose YouTube is set to them.
runsheet_write_scriptWrite the spoken script for a planned video or a saved idea: a hook for the first fifteen seconds, the beats in filming order, and an outro.
runsheet_break_down_breakoutBreak down one breakout video on a channel this channel watches: what sets its title and format apart from that channel's usual uploads, and three angles on the same idea for this channel.
runsheet_repurpose_videoWrite four posts that send people to a published video: one for X, one for LinkedIn, an Instagram caption and a YouTube Community tab post.
Publish now and delete
runsheet_publish_nowMake a scheduled video or a private draft public (or unlisted) on YouTube immediately.
runsheet_delete_videoAsk for a video to be deleted from YouTube.
runsheet_cancel_deleteCancel a deletion runsheet_delete_video scheduled, while its 10 minutes are still running.
Changes to your runsheet
runsheet_schedule_videoSet or move the publish time of a video that is already uploaded.
runsheet_update_metadataChange the title, description or tags of a video.
runsheet_file_to_playlistAdd a video to a playlist.
runsheet_set_localizationsSave a video's title and description in other languages to YouTube, so viewers whose YouTube is set to one of them see the video in their language in search, in their feed and on the watch page.
runsheet_create_ideaSave an idea to the channel's Ideas list, where it waits in Saved, newest first, to be put on a date.
Thumbnail artwork
runsheet_draw_thumbnail_artDraw a background image for a thumbnail from a description, and return its id.
runsheet_design_thumbnailDesign a complete YouTube thumbnail from a video's title and description, words drawn in, and return its id and URL.
Uploading
runsheet_start_videoGet the pass for one video made with Runsheet's engine on this computer: a Short (9:16, up to three minutes) or a long video (16:9, up to ten minutes, with chapters).
runsheet_start_shortGet the pass for one Short made with the runsheet-shorts engine on this computer: the same as runsheet_start_video with kind short.
You choose what it may do
A new key starts with Read. Every other permission is a box you tick when you make it, and a connected app gets the same boxes on Runsheet’s approval screen, for the one channel you pick there.
Editing and scheduling are yours to switch on, anything it schedules stays private until the time you set, at least fifteen minutes ahead, and thumbnail artwork is its own box because every call spends your image allowance. The writing tools draft copy; every number Runsheet reports about your channel is measured from its own data, with medians and the sample size stated. See the methodology.
Included on every plan
The server is part of every plan, Free included, and the channel, text, editing and writing tools are free to use: your own AI does the writing from Runsheet’s briefs, so it spends no Cue credits. AI thumbnails use their own monthly allowance.
Questions about the MCP server
What is MCP?
The Model Context Protocol. It is the standard way an AI client like Claude or Cursor connects to an outside service, so the assistant can call real tools instead of guessing. Runsheet runs an MCP server over it, which means you can ask about your own channel from wherever you already work.
Do I need to install anything?
No. It is a remote MCP server. Claude, ChatGPT and Claude Code connect with the server URL and an approval on Runsheet's own screen, and Cursor takes the URL and a key in its config. There is nothing to run locally and nothing to keep up to date. To upload from your computer, Runsheet's local server, runsheet-mcp, runs with npx, which needs Node.js.
What happens when I approve a connection?
The app gets access to one channel, the one you pick on the approval screen, with the permissions you leave ticked there. Read is always on, and anything the app asked for arrives ticked for you to keep or untick. The app holds a token that lasts an hour and renews itself while you use it, and a connection nobody uses for 60 days ends on its own. You can revoke it in Settings, under Connected apps, and it stops working on its next request. The approval screen names the app and shows where it will send you back to, so you can check it is the app you meant.
Can it schedule a video?
Yes, if you tick Edit and schedule when you approve the connection or make the key. It sets or moves the publish time of a video that is already uploaded, at least fifteen minutes ahead. The video stays private until then, and YouTube publishes it at that time, so there is always a window to look at what it did and change it in the runsheet.
Can it upload a video?
Yes, with Runsheet's local server, runsheet-mcp, which runs on your own computer with npx. It streams the file from your disk straight to YouTube, public at a publish time at least fifteen minutes away (private until then, and YouTube publishes it itself), or unlisted or private right away, as you choose. It needs a key with Upload from this machine ticked.
Does it use my Cue credits?
No, not for writing. Your own AI writes the titles, descriptions, scripts, translations and posts on your own plan: Runsheet hands it the brief, the rules and your channel's facts, and spends nothing. Only AI thumbnails are counted, from their own monthly allowance. The channel, text, editing and typeset thumbnail tools are free to use and are not counted either.
What can somebody do with my key if they get it?
Exactly what you ticked when you made it. A read-only key reads the channel data Runsheet holds for you, a key with Edit and schedule can retitle a video and move one in the runsheet, and a key with Draw thumbnail artwork can spend that allowance. Revoke it in Settings and it stops working on its next request. A connected app's tokens work the same way.
Where is the key stored?
Runsheet stores only a SHA-256 hash of it, so the key is shown once, when you create it. If you lose it, revoke it and make another. The tokens a connected app holds are stored the same way, as hashes.
Which clients work?
Claude, on the web and in Claude Desktop, ChatGPT in developer mode, and Claude Code connect with the server URL and sign in on Runsheet's approval screen, with no key to copy. Cursor connects with the URL and a key in its config. Anything else that speaks Streamable HTTP works too: through MCP's OAuth sign-in if it supports it, or with a key sent as Authorization: Bearer or as X-Runsheet-Key. The server is stateless and returns plain JSON, so there is nothing unusual for a client to support.