MCP server

Your YouTube channel, from Claude or Cursor.

Runsheet runs a remote MCP server at https://runsheet.buildifyapp.in/api/mcp. Claude, Cursor or another client that speaks the Model Context Protocol and can send a request header can use it to read your running order, draft copy and move publish times, with a key you control. Nothing to install in Claude Code or Cursor.

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 listed below.

Set it up

Make a key, add it to your client, ask it something. The key is the only part that differs from any other MCP server.

First, make a key

It is shown once, so copy it then.

Make one in Settings, under API keys. A new key is read only; tick more permissions only for the tools you want it to reach, because a key cannot be widened afterwards.

Claude Code

One command in a terminal.

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 and headers.

Cursor

In ~/.cursor/mcp.json, or .cursor/mcp.json for one project.

{
  "mcpServers": {
    "runsheet": {
      "url": "https://runsheet.buildifyapp.in/api/mcp",
      "headers": {
        "Authorization": "Bearer rsk_live_your_key_here"
      }
    }
  }
}

Claude Desktop

Through a small bridge, because its config file only launches local servers.

  1. In Claude Desktop, open Settings, then Developer, then Edit Config.
  2. Paste this into claude_desktop_config.json with your key in place of the placeholder.
  3. Quit Claude Desktop completely and open it again.
{
  "mcpServers": {
    "runsheet": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://runsheet.buildifyapp.in/api/mcp",
        "--transport",
        "http-only",
        "--header",
        "X-Runsheet-Key:${RUNSHEET_API_KEY}"
      ],
      "env": {
        "RUNSHEET_API_KEY": "rsk_live_your_key_here"
      }
    }
  }
}

It runs mcp-remote through npx, so it needs Node.js installed. The key sits in env rather than in the arguments, which avoids a Windows bug with spaces inside them.

Any other client

Point it at https://runsheet.buildifyapp.in/api/mcp over Streamable HTTP and send the key as Authorization: Bearer rsk_live_..., or as X-Runsheet-Key: rsk_live_... if the client cannot set Authorization.

Custom connectors in ChatGPT sign in with OAuth, which Runsheet does not offer yet, so they cannot connect for now. Custom connectors in Claude are the same, apart from a request-header option that is in beta for organisation administrators, which is why Claude Desktop goes through the bridge above.

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. There are more below.

Things to ask it

Paste one into your client. Each says which permissions its key needs and what should come back, so it is obvious whether it worked.

Ask what your week looks like

The first thing to try. Read-only, works with a default key, answers from real data.

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.

Readrunsheet_get_schedulerunsheet_get_channel

Find the videos that stalled

Your library, read by something that can actually compare the rows.

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.

Readrunsheet_get_library

Draft titles for something you have not filmed

Cue's writing tools, reachable from wherever you already work.

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. Counts against your daily generation allowance.

Retitle a video that underperformed

The first one that changes something. Reversible: run it again with a different title.

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.

ReadWrite copyEdit and schedulerunsheet_get_libraryrunsheet_generate_titlesrunsheet_update_metadata

Fill the empty days in your runsheet

Planning, done conversationally, without opening the board.

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. It can never set a publish time less than fifteen minutes away.

ReadEdit and schedulerunsheet_get_schedulerunsheet_get_libraryrunsheet_schedule_video

Design a thumbnail without opening a design tool

The one that costs real money per call, which is why it has its own permission.

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.

ReadDraw thumbnail artworkrunsheet_get_schedulerunsheet_design_thumbnailrunsheet_make_thumbnail

Compare yourself to a channel you watch

The same measurements applied to somebody else, so the comparison means something.

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.

Readrunsheet_get_watchlist

A standing instruction for every morning

Where the toolkit stops being a novelty. Save this as a project instruction.

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.

Readrunsheet_get_schedulerunsheet_get_libraryrunsheet_get_channel

Every tool

Generated from the server’s own tool table, so this list is what a client is offered. A key is only shown the tools its permissions cover.

Your channel

Read. Costs nothing.

  • runsheet_get_channel

    The 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. Read only.

  • runsheet_get_schedule

    Videos that are scheduled or ready but not yet published, soonest first. This is the running order: what is going out and when. Each line ends with the video's video_id, which is what runsheet_schedule_video, runsheet_update_metadata and runsheet_file_to_playlist take. Read only. Returns at most 50.

  • runsheet_get_library

    Published videos, most recent first. Each line has the video's views as of Runsheet's latest snapshot, how many it gained over the last seven days where Runsheet has that much history (fewer days are stated as such), and the video_id that the write tools take. Read only. Returns at most 50. View counts come from Runsheet's snapshots, taken twice a day, and are not live from YouTube; history starts on the day the channel was connected and is limited to the plan's history window.

  • runsheet_get_watchlist

    The 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. Also returns this channel's own uploads per week and Shorts share, so the comparison is like for like. Their numbers are Runsheet's stored copy of public YouTube data, refreshed in the background and held for at most 30 days, not live. Read only.

  • runsheet_list_playlists

    The playlists on the connected channel, with their ids and how many videos each holds. Use this to find the id for runsheet_file_to_playlist. Read only.

Text, exactly

No model involved. Costs nothing.

  • runsheet_count_characters

    Count text against YouTube's limits. Reports the hard cap and the softer cutoff that matters more: a title may be 100 characters but search truncates around 60, and a description may be 5000 but only about 120 show before the more button. Also reports both code points and UTF-16 units, which differ when emoji are present and which is what YouTube's field actually measures. No cost, no allowance used.

  • runsheet_preserve_line_breaks

    Insert the invisible character (U+2060 WORD JOINER) that stops YouTube collapsing blank lines in a description, comment or community post. Returns the text ready to paste. Idempotent: running it on already-processed text does not stack characters. No cost, no allowance used.

  • runsheet_style_text

    Produce bold or italic text for YouTube. Returns BOTH the native asterisk or underscore syntax, which YouTube interprets in comments and community posts, AND Unicode mathematical letters, which are the only option in titles and descriptions where the syntax is shown literally. Prefer the native syntax wherever it works: the Unicode letters are not matched by search and are read letter by letter or skipped by screen readers. No cost, no allowance used.

Thumbnails, set as type

No model involved. Costs nothing.

  • runsheet_make_thumbnail

    Render a YouTube thumbnail as a PNG from a headline and a layout. Returns a URL for the 16:9 version used by long cuts and the 9:16 version used by Shorts, which are different files on YouTube and cannot be substituted for each other.

Writing

Counts against your daily allowance.

  • runsheet_generate_titles

    Generate five candidate YouTube titles from a description of a video. Each is under 60 characters so search does not truncate it. Will not invent statistics or claims about performance. Counts against the account's daily generation allowance.

  • runsheet_generate_shorts_hooks

    Generate five opening lines for a YouTube Short from a description of it, each designed to stop a swipe within two seconds. Counts against the account's daily generation allowance.

  • runsheet_generate_description

    Generate three YouTube description options from a description of a video. Each has a first line under 120 characters that works on its own above the fold, plus a body. Counts against the account's daily generation allowance.

  • runsheet_generate_channel_description

    Generate three YouTube channel About descriptions from a description of the channel, each stating who it is for, what they get, and how often. Counts against the account's daily generation allowance.

  • runsheet_generate_tags

    Generate ten to fifteen YouTube tags from a description of a video, ordered from most specific to most general. Counts against the account's daily generation allowance.

  • runsheet_generate_chapters

    Generate a YouTube chapter list from an outline of what happens in a video. Always starts at 0:00, which YouTube requires, and uses only the moments described. Counts against the account's daily generation allowance.

Changes to your runsheet

Off unless you tick it when you make the key. Nothing here publishes immediately.

  • runsheet_schedule_video

    Set or move the publish time of a video that is already uploaded. The video is kept private and YouTube publishes it itself at the given time, so there is no job that can miss the slot. The time must be at least fifteen minutes in the future: this tool cannot publish anything immediately, by design. Pass null to unschedule, which leaves the video private with no publish time. Use runsheet_get_schedule first to get the video id.

  • runsheet_update_metadata

    Change the title, description or tags of a video. If the video is already on YouTube the change is pushed there too. Titles cap at 100 characters and cannot contain angle brackets; descriptions cap at 5000; at most 60 tags and 500 characters across all of them. Only the fields you pass are changed. Does not touch the publish time or privacy.

  • runsheet_file_to_playlist

    Add a video to a playlist. Checks first, so calling it twice does not create a duplicate entry. Requires the channel to have been connected with the playlist permission; it will say so clearly if not.

  • runsheet_create_idea

    Save an idea to the channel's Ideas list, where it waits in Saved, newest first, to be put on a date. Runsheet only: nothing is sent to YouTube.

Thumbnail artwork

Its own permission, because every call costs real money.

  • runsheet_draw_thumbnail_art

    Draw a background image for a thumbnail from a description, and return its id. Costs one image from the account's allowance every time it is called, so ask once and reuse the id. Pass the id to runsheet_make_thumbnail as `art` to put words over it. The model is told not to draw any text, but it sometimes does anyway, so the result should be looked at.

  • runsheet_design_thumbnail

    Design a complete YouTube thumbnail from a video's title and description, words drawn in, and return its id and URL. One call, about twelve seconds, and it costs one image from the account's allowance every time. Unlike runsheet_make_thumbnail this needs no layout and no headline: it reads the title and decides. Use runsheet_make_thumbnail instead when the exact words and layout matter and the type must be crisp.

What a key can and cannot do

A new key is read only. Every permission above that is a checkbox you tick when you make it, and a key cannot be upgraded afterwards.

This card used to say there were no write tools at all. That was true when it was written and stopped being true when the scheduling tools shipped, which is a worse failure than the thing it was claiming to avoid: the page a person reads to decide what a key is allowed to do has to be right on the day they read it. The list above is generated from the server’s own tool table, so it cannot drift again.

The care behind the original decision is still here, in the shape of the permissions rather than in their absence. A model holding a token that can publish is a model that can publish the wrong video to a real audience, and that mistake is public. So writing is off by default, scheduling through a key is held to at least fifteen minutes in the future so there is time to catch it, artwork is a separate permission because it is the one that spends money on every call, and nothing over MCP can delete a video, reach your billing or read your YouTube credentials.

The generation tools also never produce a finding. They draft copy. Every number Runsheet reports about your channel is measured, uses medians rather than means, and refuses to answer when the sample is too small to support one. No model touches that path. See the methodology.

Included on every plan

free too

The server itself is not a paid add-on. The channel, text and editing tools cost nothing on any plan, including Free. The writing tools count against the same daily generation allowance as the website, so a plan with more generations gets more of them here too, and thumbnail artwork counts against the image allowance.

See what each plan includes

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?

Not for Claude Code or Cursor. It is a remote MCP server, so there it is a URL and a key in your client's config. There is nothing to run locally and nothing to keep up to date. Claude Desktop is the exception: its config file only launches local programs, so it connects through mcp-remote, a small bridge that npx downloads and runs for you, which needs Node.js installed.

Can it publish or schedule a video?

It can schedule one, if you tick Edit and schedule when you make the key. A new key is read only and cannot be upgraded later, so this is a decision you make once, deliberately. Scheduling through a key is also held to at least fifteen minutes in the future, so there is always a window in which you can look at what it did and change your mind in the runsheet. What it cannot do, with any permission, is publish a video immediately or delete one.

Can it upload a video?

Not yet. MCP carries messages and has no way to send a file, so a remote server cannot receive one. Runsheet's local server, which would read the file from your own disk, is not published yet. For now a new video is uploaded from the runsheet in your browser.

Does it use my generation allowance?

The writing tools do, through exactly the same counter as the website, so there is one number for what you have left rather than two. Thumbnail artwork counts against the separate image allowance. The channel, text, editing and typeset thumbnail tools cost nothing and are not counted.

What can somebody do with my key if they get it?

Exactly what you ticked when you made it, and nothing else. 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; a key with Draw thumbnail artwork can spend that allowance. No key can delete a video, see your YouTube credentials, reach your billing or change your plan. Revoke it in Settings and it stops working on the next request, and revoking cannot be undone.

Where is the key stored?

Only a SHA-256 hash of it is in our database, so the key itself is shown once when you create it and cannot be recovered afterwards. If you lose it, revoke it and make another.

Which clients work?

Claude Code and Cursor connect directly, with a URL and a request header. Claude Desktop connects through the mcp-remote bridge, because its config file only launches local servers. Anything else that speaks Streamable HTTP and lets you set a header works too, with the key sent as Authorization: Bearer or as X-Runsheet-Key. Custom connectors in ChatGPT sign in with OAuth, which Runsheet does not offer yet, so they cannot connect; Claude's custom connectors are the same apart from a request-header beta for organisation administrators. The server is stateless and returns plain JSON, so there is nothing unusual for a client to support.

Connect it in a minute.

Free accounts get a key and a few generations a day. No card.

The demo needs no email and no card. It is a sandbox of your own with a filled channel in it, and it deletes itself.