runsheet-mcp
Summary: Runsheet MCP connects an MCP client to your YouTube channel — it reads your channel data and writes copy/thumbnails, and uploads video files from your own disk straight to YouTube as scheduled private uploads.
Upload from your machine: stream a local video file to YouTube (private only, optional
publish_at≥15 min out, title, description, tags, thumbnail), never through Runsheet's servers.Inspect local folders: list video files with size, duration, orientation and nearby thumbnails before uploading.
Read your channel: current channel stats (title, handle, subscribers, views, video count, last sync).
Read your running order: scheduled/ready-but-unpublished videos, soonest first, up to 90 days ahead.
Read your library: published videos with view counts, 7-day gains and video_ids.
Watch competitors: other channels' uploads per week, Shorts share and breakout videos, plus your own for comparison.
List playlists with ids and video counts, for filing videos.
Craft copy: count characters against YouTube limits, preserve blank lines (U+2060), and produce bold/italic/mono text (native syntax plus Unicode fallback).
Make thumbnails: render 16:9 and 9:16 PNGs from a headline, layout, tone, kicker, foot, brand and highlight words.
Schedule and edit: set publish times, retitle, retag, update metadata and file videos to playlists (subject to your key's permissions).
Guardrails: nothing publishes immediately, deletion is a separate opt-in permission, and uploads are capped at 25/day per account and 80/day overall until the YouTube audit clears.
Uploads video files from your local machine directly to YouTube as private or scheduled uploads, and manages YouTube channel content such as titles, descriptions, tags, thumbnails, and scheduling through Runsheet.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@runsheet-mcpUpload the file ./videos/launch.mp4 and schedule it for tomorrow at 9 AM"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
runsheet-mcp
The local MCP server for Runsheet, a YouTube scheduling app. It connects Claude, Cursor or any MCP client to your YouTube channel, and uploads videos from your own machine straight to YouTube.
npx -y runsheet-mcpPublished on npm as runsheet-mcp. No install step,
no dependencies, Node 20 or newer.
What it does
Uploads a video file from your disk to YouTube and schedules it. The file is streamed from your machine straight to Google. It never touches Runsheet's servers.
Lists the video files in a folder, with size, duration, orientation and whether a thumbnail sits next to each one, so the model can see what there is to upload.
Forwards every other Runsheet tool to the hosted server with the same key: reading your channel and running order, writing titles, descriptions, tags and chapters, thumbnails, and scheduling.
Why a local server as well as the hosted one
Runsheet also has a hosted MCP server at https://runsheet.buildifyapp.in/api/mcp. For reading
your channel, writing copy and scheduling, that is the simpler option: nothing to run on your
machine. Setup is at https://runsheet.buildifyapp.in/mcp.
This package exists for the one thing a hosted server cannot do. MCP carries JSON-RPC messages and has no file channel, and a remote server cannot read your disk, so uploading a video is impossible over a hosted endpoint. A process running on your own machine can do both.
Your video never touches Runsheet's servers
To upload, this server asks Runsheet to open a YouTube resumable upload session, then streams the file from your disk directly to Google. Runsheet sees the title, description, tags and a session URL. It never receives a byte of the video. That is the same path the upload in Runsheet's website takes.
Related MCP server: youtube-mcp-server
Setup
1. Make an API key
Sign in at https://runsheet.buildifyapp.in, open Settings, then API keys, and create a key.
To upload, tick the Upload from this machine permission. Without it, uploads are refused.
Tick any other permissions you want the forwarded tools to have. New keys are read only unless you tick more.
The key starts with
rsk_live_and is shown once. Permissions are fixed when a key is made, so a leaked read-only key can never gain write access. To change permissions, make a new key.
2. Add the server to your client
The key goes in the RUNSHEET_API_KEY environment variable.
Claude Code
claude mcp add --env RUNSHEET_API_KEY=rsk_live_your_key_here --transport stdio runsheet -- npx -y runsheet-mcpCursor: add this to ~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project).
Claude Desktop: add this to claude_desktop_config.json, found through Settings, Developer,
Edit Config. It lives at ~/Library/Application Support/Claude/ on macOS and %APPDATA%\Claude\ on
Windows. Restart Claude Desktop afterwards.
{
"mcpServers": {
"runsheet": {
"command": "npx",
"args": ["-y", "runsheet-mcp"],
"env": { "RUNSHEET_API_KEY": "rsk_live_your_key_here" }
}
}
}Any other MCP client that can launch a stdio server takes the same command, arguments and environment variable.
The tool list is fetched from Runsheet when the server starts, so a tool added to Runsheet appears here without a new version of this package.
Requirements
Node 20 or newer.
ffprobeis optional. It ships with ffmpeg. With it, Short versus long video is detected from the file's dimensions. Without it, passkindyourself.
Tools
Local, only in this package:
Tool | What it does |
| Lists video files in a folder with size, duration, orientation and whether a thumbnail sits next to each |
| Streams a file from your disk to YouTube, private, with an optional publish time and thumbnail |
A thumbnail is picked up automatically if an image sits next to the video with the same name, or is
named thumbnail or thumbnail_16x9 (.png, .jpg, .jpeg or .webp, under 2MB).
Forwarded to the hosted server, subject to your key's permissions:
Reading your channel, running order, library and playlists
Character counting, line breaks and bold text
Titles, hooks, descriptions, channel descriptions, tags and chapters
Typeset thumbnails, and generated thumbnail artwork with its own permission
Scheduling, retitling, retagging, playlist filing, and saving ideas to the Ideas list
Two things it will not do
It cannot publish anything immediately. An upload always goes up private. Either you give it a publish time at least fifteen minutes away and YouTube publishes it itself at that moment, or it stays a private draft. This is enforced on Runsheet's server, not by a prompt, because a model that publishes the wrong file to a real audience cannot take it back.
It deletes nothing on its own. Deleting a video is a separate permission on the hosted server, never ticked by default: it needs the video's exact title and always waits ten minutes with an Undo emailed to the creator.
Upload limits
Until Runsheet's YouTube API compliance audit clears, uploads are capped at:
25 a day per Runsheet account, and
80 a day across all of Runsheet.
A large batch uploads up to the limit and then stops, with a message saying when the allowance returns. YouTube's quota resets at midnight Pacific time.
A channel connected with its own Google client, under Advanced on Runsheet's connect screen, spends its own YouTube allowance and is exempt from both limits.
Environment variables
Variable | Required | Default |
| yes | none |
| no |
|
RUNSHEET_URL exists for development against a local copy of Runsheet. You will not need it. Your
key is sent to whatever address it names, so never point it at a server you do not trust.
Troubleshooting
"RUNSHEET_API_KEY is not set": the key is not reaching the process. Most clients need it under
env in the server config rather than in your shell.
"This API key does not have the upload permission": make a new key with Upload from this machine ticked. Existing keys cannot be upgraded.
"That API key is not valid, or it has been revoked": the key was mistyped or deleted. Make a new one under Settings, API keys.
The client shows no tools: check your client's MCP logs. This server writes its diagnostics to stderr and never to stdout, because anything on stdout that is not a JSON-RPC message corrupts the stream.
npx is not found on Windows: some clients cannot launch npx directly. Use
"command": "cmd" and "args": ["/c", "npx", "-y", "runsheet-mcp"].
Privacy Policy
The full policy is at https://runsheet.buildifyapp.in/privacy. In short, for this extension:
What it collects. Nothing of its own. It runs on your machine and sends your API key, and the arguments of the tools you call, to Runsheet at https://runsheet.buildifyapp.in. When you upload, the video file is streamed from your disk straight to YouTube through a Runsheet upload session; the file itself never passes through or is stored on Runsheet's servers.
How it is used and stored. Runsheet stores your email, the metadata of videos you plan or publish (titles, descriptions, tags, schedule times), a daily count of views on your own videos, and your API key only as a SHA-256 hash. It records that an AI generation happened and what it cost in credits, to keep your balance, but not the text you sent. Thumbnails the AI designer draws are stored so you can attach them later.
Third parties. YouTube (Google) receives the uploads and metadata changes you make, through the YouTube Data API. Google's Gemini API receives the text of drafting and thumbnail requests to produce them. Runsheet does not sell or share your data, and does not use YouTube data for advertising.
Retention. Disconnecting a channel in Runsheet deletes its tokens and what Runsheet recorded for it. Your account and everything in it are deleted within seven days of asking. A revoked API key stops working immediately.
Contact. kalpesh@buildifyapp.in
Links
Runsheet: https://runsheet.buildifyapp.in
MCP setup guide: https://runsheet.buildifyapp.in/mcp
Issues: https://github.com/KalpeshMahida0212/runsheet-mcp/issues
License
MIT. See LICENSE.
Available Tools
11 toolsrunsheet_count_charactersCount charactersARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The text to count. | |
| field | Yes | Which YouTube field this text is for. Determines the limits reported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real context beyond that: 'No cost, no allowance used' (quota behavior) and the code-point vs UTF-16 measurement nuance, which is non-obvious behavior for emoji-containing text.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core measurement claim front-loaded; each clause carries information. Slightly dense with three numeric examples, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the return-value burden — and it does, describing both the limit outputs and the dual code-point/UTF-16 measurement. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds concrete semantics for the 'field' enum by giving actual limit values (title 100/search ~60, description 5000/~120 visible), which enriches the choice beyond the bare enum labels.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: counts text against YouTube's limits, and names the exact metrics reported (hard cap, softer cutoff, code points vs UTF-16 units). Clearly distinguishes from siblings like runsheet_style_text or runsheet_preserve_line_breaks, which transform rather than measure text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when you'd use it (to check whether text fits YouTube's display limits), but never states prerequisites, when-not-to-use, or how it relates to alternatives such as style_text. Usage context is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
runsheet_get_channelGet the channelARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the 'Read only' line is largely redundant. However, the description adds genuinely useful behavioral context beyond the annotations: the data is a snapshot 'as Runsheet last recorded it' with a 'when it was last synced' field, telling the agent results may be stale rather than live.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences that are front-loaded with the core purpose and the returned fields. The trailing 'Read only' is a minor redundancy against the readOnlyHint annotation, but nothing is wasted overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned fields and flags the cached nature of the data, which is what an agent needs for a zero-parameter read. The only gap is the lack of routing guidance relative to sibling getters, which is minor for such a simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline is 4. No parameter meaning is needed or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (the connected YouTube channel) and enumerates the exact fields returned (title, handle, subscriber count, total views, video count, last sync), so the purpose is unambiguous. It does not explicitly differentiate itself from siblings like runsheet_get_schedule or runsheet_get_library, but the 'channel' resource is distinct enough that an agent can separate it from the other getters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: it's a read of the channel's recorded state, but there is no statement of when to call it versus the sibling getters or of any prerequisites. The phrase 'as Runsheet last recorded it' hints at cached/local data as opposed to a live API call, which is mildly useful, but no explicit when/when-not guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
runsheet_get_libraryGet the libraryARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Filter by format. Default both. | |
| limit | No | How many to return. Default 20, maximum 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: a 50-item cap, snapshot cadence (twice a day), the fact that counts are not live from YouTube, that history begins at channel connection and is bounded by the plan's window. These constraints materially affect how an agent should interpret the numbers, and nothing contradicts the readOnly/openWorld hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what is listed and in what order, then the per-line contents, then the caveats. It runs several clauses long, but each clause carries a distinct fact (order, fields, snapshot provenance, history limits) rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-format burden and does so: it explains each line contains views, seven-day gain (with the short-history caveat), and the video_id. Combined with the snapshot/history provenance notes, an agent has everything needed to call and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% – both 'kind' and 'limit' are fully documented with their defaults and the enum. The description only restates the 50-item maximum already present in the limit field, adding no new filtering or formatting semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource precisely ('Published videos, most recent first'), which separates it from siblings like runsheet_get_watchlist and runsheet_get_schedule. The verb is implicit (the title's 'Get'), but the scope and ordering are concrete enough for an agent to know what it returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: it notes the output includes 'the video_id that the write tools take' and that it is read only, which hints at a read-then-write workflow. There is no explicit when-to-use statement and no sibling named as an alternative, so the agent must infer routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
runsheet_get_scheduleGet the scheduleARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | How many days ahead to look. Default 28, maximum 90. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered; the description's 'Read only' repeats that rather than adding to it. What it does add beyond structured fields is a hard result cap ('Returns at most 50'), which is real behavioral information an agent needs for pagination reasoning, though it omits what happens when the cap is hit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what the list contains before moving to the consumer note and the cap. Every sentence carries information, though the 'Read only' fragment adds little given the annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description steps in to characterize the return ('each line ends with the video_id') and the 50-item limit, which is enough for an agent to call and consume it. It could go one step further on what a 'line' contains besides video_id, but nothing critical is missing for a single-optional-param read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter and schema coverage is 100% – 'days' with its default 28 and maximum 90 are fully documented in the schema. The description adds no syntax or format detail for 'days' beyond what the schema states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact resource subset ('scheduled or ready but not yet published'), states ordering ('soonest first'), and clarifies why the tool exists ('the running order: what is going out and when'). This is specific enough to separate it from siblings like runsheet_get_library and runsheet_get_watchlist without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives downstream chaining guidance by naming runsheet_schedule_video, runsheet_update_metadata and runsheet_file_to_playlist as consumers of the returned video_id, which tells the agent where this tool fits in a workflow. It does not, however, state when to prefer this over other listing tools (e.g. get_library) or any exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
runsheet_get_watchlistGet the watchlistARead-only
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. Each watched channel carries a watch_id and each breakout a video_id, which runsheet_break_down_breakout takes. 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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description's closing 'Read only' restates that rather than adding to it. It does add genuinely useful non-obvious context: the numbers are Runsheet's stored copy of public YouTube data, refreshed in the background and held for at most 30 days, so results may be stale rather than live. That is solid disclosure, but it says nothing about empty watchlists, error behavior, or cost.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool returns, and the definition of 'breakout videos' earns its space because no output schema exists to explain it. Three dense sentences with little waste, though the parenthetical definition is slightly long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of describing returns, and it does so well: per-channel metrics, the creator's own baseline numbers, and the watch_id/video_id handles. It still omits edge cases such as what an empty watchlist returns or any access prerequisites.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a parameterless tool applies. The description instead documents the shape of the returned IDs, which is a reasonable substitute.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('the other YouTube channels this channel watches') and enumerates the exact metrics returned (uploads/week, Shorts share, breakout videos). It is clearly distinguishable from siblings like runsheet_get_channel because it describes the comparison against the creator's own numbers and names the downstream consumer of the IDs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly establishes the context of use: it returns watch_id and video_id values that runsheet_break_down_breakout takes, effectively routing the agent to the next tool. However, it gives no explicit exclusions or when-not-to-use guidance relative to siblings such as runsheet_get_channel.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
runsheet_list_local_videosA
List video files in a folder on THIS machine, with their size, duration and whether each is vertical or landscape. Use this before runsheet_upload_video to see what is there and to spot the matching thumbnail files. Reads nothing except file metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | Yes | Absolute path to a folder. | |
| recursive | No | Look in subfolders too. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden, and it does establish the read-only safety profile ('Reads nothing except file metadata'). However, it says nothing about behavior on a nonexistent path, permission requirements, or result size for large/recursive folders.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first delivers purpose and return shape, the second delivers usage and the read-only guarantee. No filler, and the key scope constraint ('THIS machine') is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description compensates by naming the returned fields (size, duration, vertical/landscape) plus the thumbnail-spotting benefit. Combined with full schema coverage on the two inputs, this is nearly complete, only missing error/edge-case behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the folder and recursive parameters are already well documented in the schema. The description adds no additional meaning about path formats or what 'recursive' changes in the output, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) plus resource (video files in a folder) and scopes it to 'THIS machine', which cleanly separates it from remote-library siblings like runsheet_get_library. It also enumerates the returned attributes (size, duration, orientation), so an agent knows exactly what it gets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly positions the tool in a workflow: 'Use this before runsheet_upload_video' and notes the thumbnail-matching use case. That is clear situational context with a named sibling, though it does not explicitly state when not to use it or name the alternative for remote files.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
runsheet_list_playlistsList playlistsARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true and openWorldHint=true already declare the safety profile, so 'Read only' is largely redundant with the annotation. The description does add useful behavioral context by describing the shape of what comes back (ids plus per-playlist video counts), but it says nothing about pagination, limits, or auth requirements on a potentially large remote listing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences that lead with what the tool returns and follow with the downstream use case. The trailing 'Read only' is a minor redundancy with the annotation rather than wasted space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by summarizing the return payload (playlist ids and video counts) and the intended follow-up tool. For a zero-parameter read tool this is nearly complete, though it omits any note on result size or pagination for an open-world channel listing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. The description correctly implies no input is needed and instead points at the returned id field the caller will want to consume.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource (list the playlists on the connected channel) and even summarizes the payload (ids and video counts), which is more than the title conveys. It is clear enough to distinguish from the other runsheet_get_* readers, though it does not explicitly contrast with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete trigger: 'Use this to find the id for runsheet_file_to_playlist.' That tells the agent exactly when to reach for this tool over the other listing/reading siblings. It stops short of stating when not to use it or naming alternative listers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
runsheet_make_thumbnailFree YouTube thumbnail makerARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| art | No | Optional. An art id from runsheet_draw_thumbnail_art, to use as the background. Anything that is not one of those ids is ignored and the thumbnail renders on its plain ground. | |
| foot | No | A short concrete detail along the bottom. | |
| tone | No | bad is red and for a problem, good is green and for an answer, neutral is gold. | |
| brand | No | Channel name, along the very bottom. | |
| kicker | No | The small line above the headline. | |
| layout | No | statement: A flat claim in the largest type that fits. The workhorse; start here. question: The headline as the thing the viewer is already wondering, with the mark oversized. number: A numeral doing the work. For counts, lists, days, and anything with a figure in it. band: Type in a solid band across the lower third. The highest contrast option. | |
| headline | Yes | Three or four words, upper case or not. This is the whole thumbnail. | |
| highlight | No | Comma separated words inside the headline to set in the accent colour. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint and openWorldHint already covering the safety profile, the description adds genuinely useful behavioral context: the return value is a URL, two aspect-ratio files are produced, and they are non-interchangeable on YouTube. It stops short of covering failure modes or what happens when layout is omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, front-loaded with the action and result before the caveat. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter rendering tool with no output schema, the description supplies the missing return-shape information (URLs, two aspect ratios) that an agent otherwise could not infer. Minor gap: it does not say what layout is used when the optional layout parameter is omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including the enum vocabularies for tone and layout is already fully documented in the schema. The description only names headline and layout as the drivers, adding nothing the schema does not already say.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and output ('Render a YouTube thumbnail as a PNG') plus the two inputs it is driven by (headline, layout), and distinguishes itself from every sibling, which are all get/list/upload/style tools. The 16:9 vs 9:16 output split further pins down exactly what this produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the purpose but never stated: there is no 'use this when...' or 'do not use this for...' clause, and no named alternative or prerequisite. The relationship to runsheet_draw_thumbnail_art only appears in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
runsheet_preserve_line_breaksPreserve line breaksARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text containing blank lines to preserve. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true and openWorldHint=false, so the description adds real value: it discloses the exact character used (U+2060), states it returns paste-ready text, guarantees idempotency (no stacking), and notes no cost/allowance is consumed. It stops short of describing edge cases such as input with no blank lines, but the behavioral picture is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences, each earning its place: what it does, what it returns, and the idempotency/no-cost guarantees. The purpose is front-loaded with no preamble.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter transform with no output schema, the description covers purpose, the exact mechanism, the return value ('text ready to paste'), idempotency, and cost. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter at 100% schema description coverage, which already documents 'text'. The description implies the input is text containing blank lines but adds no format or syntax detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Insert the invisible character (U+2060 WORD JOINER)') and names the exact problem it solves for YouTube descriptions, comments and community posts. This is clearly distinguishable from siblings like runsheet_style_text or runsheet_count_characters without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use it: text destined for YouTube that contains blank lines. It does not explicitly name alternative tools or state when NOT to use it, but the trigger condition is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
runsheet_style_textBold or italic textARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The text to style. | |
| style | Yes | Which style. Note that 'mono' has no native syntax and italic has no Unicode digits. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already covering safety, the description adds real behavioral context: it returns both native markdown-ish syntax and Unicode mathematical letters, warns that Unicode variants are not searchable and are problematic for screen readers, and notes there is no cost or allowance consumed. It does not describe the exact response payload, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each load-bearing: the capability, the dual output format with usage preference, and the cost note. The most decision-relevant fact (what it returns) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must carry the return-value burden; it explains the two output formats conceptually but not the response structure (field names/shape). Given the low complexity and only two required params, this is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters and the enum values are already documented in the schema. The description reinforces style behavior (which styles lack native syntax or Unicode digits) but adds little tool-call syntax beyond the schema's baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Produce bold or italic text for YouTube') and immediately contrasts itself with tools like runsheet_count_characters or runsheet_preserve_line_breaks by being the styling transform. An agent can identify the function without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance on output choice: prefer native syntax where it works, Unicode only where syntax renders literally (titles/descriptions). It does not name an alternative styling sibling (there is none) or state exclusions for when not to call it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
runsheet_upload_videoA
Upload a video file from THIS machine to YouTube through Runsheet, and schedule it. The file is read from local disk and streamed straight to YouTube; it is never sent to Runsheet's servers. The upload always goes up PRIVATE and can never be published immediately: either give it a publish_at at least fifteen minutes in the future, in which case YouTube publishes it itself at that time, or leave it out and it stays a private draft. Short versus long is detected from the file's dimensions when ffprobe is available, so you usually do not need to pass kind. If a thumbnail image sits next to the video with the same name, or is named thumbnail.png, it is picked up automatically. IMPORTANT: until Runsheet's YouTube compliance audit clears, uploads are capped at 25 a day per account and 80 a day across all of Runsheet, so a large batch stops partway through with a message saying when the allowance returns. A channel connected with its own Google client spends its own allowance instead.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Overrides the detected format. | |
| path | Yes | Absolute path to the video file on this machine. | |
| tags | No | Up to 60 tags. | |
| title | Yes | The YouTube title. Under 100 characters, no angle brackets. | |
| publish_at | No | ISO 8601 timestamp at least fifteen minutes from now, for example 2026-09-24T18:00:00Z. Omit to leave it as a private draft. | |
| description | No | The YouTube description. Under 5000 characters. | |
| thumbnail_path | No | Absolute path to a thumbnail image. Under 2MB. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so richly: local disk read streamed directly to YouTube (never touching Runsheet servers), always PRIVATE, never published immediately, the 15-minute publish_at floor, ffprobe-based kind detection, automatic thumbnail pickup, and explicit rate limits (25/day per account, 80/day global, channel-specific allowance).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is on the long side, but nearly every sentence carries a distinct behavioral fact and the core action is front-loaded. The quota paragraph is flagged IMPORTANT, which is justified given the operational consequence of a batch silently stopping.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-param mutation tool with no annotations and no output schema, it covers behavior, scheduling semantics, and quota constraints thoroughly. The one gap is that it never says what the call returns or how partial-batch failure is surfaced programmatically, which matters without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real semantics the schema lacks: that kind is usually unnecessary because it is auto-detected, and that thumbnail_path is often unnecessary because a co-located/thumbnail.png image is auto-adopted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with scope: 'Upload a video file from THIS machine to YouTube through Runsheet, and schedule it.' It also names the key distinction from siblings, which are read/list/utility tools (list_local_videos, make_thumbnail), leaving no ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance: pass publish_at to schedule, omit to leave a private draft, pass kind only to override detection, and thumbnails are auto-picked-up when named or co-located. It does not explicitly name an alternative sibling to use instead, but for an upload tool the main usage decisions are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
- First observed
runsheet_count_characters - First observed
runsheet_get_channel - First observed
runsheet_get_library - First observed
runsheet_get_schedule - First observed
runsheet_get_watchlist - First observed
runsheet_list_local_videos - First observed
runsheet_list_playlists - First observed
runsheet_make_thumbnail - First observed
runsheet_preserve_line_breaks - First observed
runsheet_style_text - First observed
runsheet_upload_video
TDQS
Scored across 11 tools
Each tool targets a distinct resource or action: reads are separated by channel, schedule, library, and watchlist, while local listing, text utilities, thumbnail generation, and upload have non-overlapping purposes. The descriptions make the boundaries clear, so an agent should not confuse them.
All tools use the same runsheet_ prefix and snake_case verb_noun convention (get_*, list_*, count_*, preserve_*, style_*, make_*, upload_*), with no deviations or mixed styles.
Eleven tools is well within the typical 3-15 range for a focused YouTube channel management server. Each tool appears to earn its place by covering a distinct read, utility, or upload operation.
Several descriptions reference write tools that are not present in the surface (runsheet_schedule_video, runsheet_update_metadata, runsheet_file_to_playlist, runsheet_break_down_breakout), creating dead ends for scheduling existing videos, updating metadata, filing to playlists, and breakout analysis. Missing core write operations beyond upload means agents will fail on common workflows.
Maintenance
Related MCP Connectors
Build, run, schedule, and publish AI video pipelines to YouTube and TikTok from any MCP client.
YouTube transcripts, search, channel browsing, and playlists for AI agents via MCP.
Schedule, publish and retitle YouTube videos, plan the month with AI, and upload from your machine.
Hosted MCP for YouTube Studio: uploads, metadata, playlists, comments, analytics, captions.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenance- Upload videos to YouTube from MCP - Client(Claude/Cursor/VS Code) - OAuth2 authentication flow - Access token and refresh token management - Multi Channel Support55MIT
- AlicenseAqualityDmaintenanceA local stdio MCP server that gives Claude (or any MCP client) full programmatic control over a single YouTube channel, including video upload, channel management, comments, analytics, and more.4618 npmMIT
- FlicenseNot gradedqualityBmaintenanceEnables managing a YouTube channel through natural language: upload videos, edit metadata, set thumbnails, run pseudo A/B thumbnail tests, and pull analytics.-
- AlicenseAqualityCmaintenanceEnables Claude to control a YouTube channel through MCP, including uploading and editing videos, scheduling releases, and reading channel and video analytics via official APIs.8MIT