[{"data":1,"prerenderedAt":39},["ShallowReactive",2],{"$f1af1ch9nf3t93":3},{"href":4,"title":5,"description":6,"kind":7,"mark":8,"planned":9,"contributors":10,"provenance":8,"express":9,"html":11,"headings":12},"\u002Fdocs\u002Ftools\u002Fyoutube","YouTube","Uploads videos and thumbnails to your own YouTube channel through a Zero Human bridge, signed in with Google.","integrates",null,false,[],"\u003Cp>YouTube is a Zero Human bridge: an MCP server Zero Human hosts in front of YouTube's own API, because YouTube offers\nno MCP server a connection can use. You connect it on \u003Cstrong>Tools\u003C\u002Fstrong> in the portal by signing in with the Google account\nthat owns your channel. Each upload goes to that channel, with your own sign-in.\u003C\u002Fp>\n\u003Ch2 id=\"what-a-member-can-do\">What a member can do\u003C\u002Fh2>\n\u003Cp>With YouTube connected, a member can list the channels it uploads to, upload a video, and set a video's thumbnail.\nA video is never sent through the chat or the run itself: the member gives the bridge a public address of the file,\nsuch as the one a task's \u003Ccode>workspace.share_file\u003C\u002Fcode> answers, and the bridge streams it from there into YouTube.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Tool\u003C\u002Fth>\n\u003Cth>What it does\u003C\u002Fth>\n\u003Cth>Reads or writes\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>channels_list\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The channels this sign-in uploads to: each one's id, title and handle\u003C\u002Ftd>\n\u003Ctd>Reads\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>video_upload\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Uploads a video (mp4, mov or webm) with its title, description and tags, public unless the call says unlisted or private\u003C\u002Ftd>\n\u003Ctd>Writes: a video on your channel\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>thumbnail_set\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Sets a video's thumbnail from a PNG or JPEG of at most 2 MB\u003C\u002Ftd>\n\u003Ctd>Writes: a video's thumbnail\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>What it writes is public by default: a video uploaded as public appears on your channel as soon as YouTube has\nprocessed it. Every upload says it is not made for children, and declares synthetic content when the task says\nthe voice or picture was generated, as YouTube requires.\u003C\u002Fp>\n\u003Cp>It cannot change or delete a video after upload, read comments or analytics, or manage the channel. Those need\nGoogle's broader YouTube permission, which this bridge never asks for; change or remove a video in YouTube Studio.\u003C\u002Fp>\n\u003Cp>Name each YouTube tool a task needs, such as \u003Ccode>youtube.video_upload\u003C\u002Fcode>, or \u003Ccode>youtube\u003C\u002Fcode> for all three. A tool the task\ndoes not name is refused, whatever the connection allows.\u003C\u002Fp>\n\u003Ch2 id=\"who-connects-it\">Who connects it\u003C\u002Fh2>\n\u003Cp>A YouTube connection acts as \u003Cstrong>the Google account that signed in\u003C\u002Fstrong>, and uploads to the channel that account owns or\nmanages. To upload to a brand channel, sign in with an account that manages it, and pick the brand channel on\nGoogle's screen when it asks which one.\u003C\u002Fp>\n\u003Cp>You connect it by signing in with Google, with two permissions: \u003Ccode>youtube.upload\u003C\u002Fcode>, to upload videos and set\nthumbnails, and \u003Ccode>youtube.readonly\u003C\u002Fcode>, to list your channels. Neither lets the connection edit, delete or manage\nanything already on the channel.\u003C\u002Fp>\n\u003Cp>A connection can sit on the enterprise, a team, a member, a role or a task, and the one further down replaces the\none above. A connection on anything but a task also reaches the \u003Ca href=\"\u002Fdocs\u002Fwork\u002Fchat\">chat\u003C\u002Fa> of every member it covers.\nConnect YouTube \u003Cstrong>on the task that uploads\u003C\u002Fstrong> unless you want members to upload from chat too.\u003C\u002Fp>\n\u003Ch2 id=\"what-waits-for-you\">What waits for you\u003C\u002Fh2>\n\u003Cp>In a run, an upload waits for you only when the task gates it, and a Marketing task that uploads gates every video,\nwith the rendered file as the gate's preview: you watch the actual video before it goes up, and a video you reject\nis never uploaded. To approve each upload yourself, gate \u003Ccode>video_upload\u003C\u002Fcode>; see\n\u003Ca href=\"\u002Fdocs\u002Fcontrol\u002Fgates\">Gates and tool scopes\u003C\u002Fa>. In a chat, both writes ask you before they run, unless you chose\n\u003Cstrong>Always allow\u003C\u002Fstrong> for that member and tool. \u003Ccode>channels_list\u003C\u002Fcode> only reads, and never waits.\u003C\u002Fp>\n\u003Ch2 id=\"setup\">Setup\u003C\u002Fh2>\n\u003Ch3 id=\"register-a-google-oauth-client\">Register a Google OAuth client\u003C\u002Fh3>\n\u003Cp>Until Zero Human's own Google app is approved for YouTube, a connection uses a Google OAuth client your company\nregisters. One client serves your whole company.\u003C\u002Fp>\n\u003Col>\n\u003Cli>In the \u003Ca href=\"https:\u002F\u002Fconsole.cloud.google.com\">Google Cloud console\u003C\u002Fa>, create a project, or pick one.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>APIs &amp; Services → Library:\u003C\u002Fstrong> enable \u003Cstrong>YouTube Data API v3\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>APIs &amp; Services → OAuth consent screen:\u003C\u002Fstrong> set it up for your company, and add the two scopes\n\u003Ccode>https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fyoutube.upload\u003C\u002Fcode> and \u003Ccode>https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fyoutube.readonly\u003C\u002Fcode>. While\nthe app is in testing, add the Google account that owns the channel as a test user.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>APIs &amp; Services → Credentials → Create credentials → OAuth client ID\u003C\u002Fstrong>, type \u003Cstrong>Web application\u003C\u002Fstrong>, with the\nauthorised redirect URI \u003Ccode>https:\u002F\u002Fportal.zerohuman.com\u002Fv1\u002Ftools\u002Foauth\u002Fcallback\u003C\u002Fcode> exactly. The \u003Cstrong>Add tool\u003C\u002Fstrong> form in\nthe portal shows the right value.\u003C\u002Fli>\n\u003Cli>Copy the \u003Cstrong>Client ID\u003C\u002Fstrong> and \u003Cstrong>Client secret\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"connect-it\">Connect it\u003C\u002Fh3>\n\u003Cp>Work in one browser window throughout: Google returns to the portal in the window you started from.\u003C\u002Fp>\n\u003Col>\n\u003Cli>In the portal, on \u003Cstrong>Tools\u003C\u002Fstrong>, choose \u003Cstrong>Add tool\u003C\u002Fstrong>. \u003Cstrong>Layer:\u003C\u002Fstrong> Task, and \u003Cstrong>Bind on:\u003C\u002Fstrong> the task that uploads.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Kind:\u003C\u002Fstrong> MCP. \u003Cstrong>Tool type:\u003C\u002Fstrong> \u003Ccode>youtube\u003C\u002Fcode>. \u003Cstrong>MCP server URL:\u003C\u002Fstrong> \u003Ccode>https:\u002F\u002Fbridges.zerohuman.com\u002Fyoutube\u002Fmcp\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Auth:\u003C\u002Fstrong> OAuth, with your client's ID and secret. Keep the two permissions the form offers.\u003C\u002Fli>\n\u003Cli>Choose \u003Cstrong>Connect with OAuth\u003C\u002Fstrong>, sign in with the account that owns the channel, pick the channel if Google asks,\nand allow both permissions.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Check it.\u003C\u002Fstrong> Run a task that calls \u003Ccode>channels_list\u003C\u002Fcode>. The run page shows your channel.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>To disconnect YouTube, delete the connection on \u003Cstrong>Tools\u003C\u002Fstrong>, or remove the app from your Google Account's list of\nconnected apps. \u003Cstrong>Reconnect\u003C\u002Fstrong> keeps the connection and has you sign in again.\u003C\u002Fp>\n\u003Ch2 id=\"limits-and-cost\">Limits and cost\u003C\u002Fh2>\n\u003Cp>YouTube limits uploads per Google project: by default 100 uploads a day for the project your client belongs to,\nshared by every connection made with that client. More needs a quota request to Google. A video is at most 2 GB\nhere, and its address must say how large the file is.\u003C\u002Fp>\n\u003Cp>YouTube makes no charge for uploading. The bridge has no Zero Human charge of its own. Its calls happen inside runs,\nand your plan counts those runs as it counts any other.\u003C\u002Fp>\n\u003Ch2 id=\"troubleshooting\">Troubleshooting\u003C\u002Fh2>\n\u003Cp>What a call returns shows on the run page. The quoted words are taken from each message, so you can search this page\nfor the words on your screen.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>What you see\u003C\u002Fth>\n\u003Cth>Why\u003C\u002Fth>\n\u003Cth>What to do\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>The run stops and asks you to sign in again\u003C\u002Ftd>\n\u003Ctd>The access was removed in your Google Account, or the sign-in expired\u003C\u002Ftd>\n\u003Ctd>Choose \u003Cstrong>Reconnect\u003C\u002Fstrong> and sign in again\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>The result says the account &quot;has no YouTube channel&quot;\u003C\u002Ftd>\n\u003Ctd>The Google account that signed in owns no channel\u003C\u002Ftd>\n\u003Ctd>Create a channel in YouTube, or reconnect with the account that owns one\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>The result says &quot;the upload quota for this account or project is used up&quot;\u003C\u002Ftd>\n\u003Ctd>The project's daily uploads ran out\u003C\u002Ftd>\n\u003Ctd>Try again tomorrow, or ask Google for more quota\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>The result says the sign-in &quot;did not grant YouTube upload access&quot;\u003C\u002Ftd>\n\u003Ctd>A permission was left unticked on Google's screen\u003C\u002Ftd>\n\u003Ctd>Choose \u003Cstrong>Reconnect\u003C\u002Fstrong> and allow both permissions\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>The result says \u003Ccode>videoUrl\u003C\u002Fcode> &quot;redirects&quot;, &quot;must be a public https address&quot; or &quot;does not say how large the file is&quot;\u003C\u002Ftd>\n\u003Ctd>The video's address is not a direct, public https address of the file\u003C\u002Ftd>\n\u003Ctd>Use the address \u003Ccode>workspace.share_file\u003C\u002Fcode> answered, or another direct link to the file\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>A thumbnail is refused\u003C\u002Ftd>\n\u003Ctd>YouTube allows custom thumbnails only on a verified channel, and only a PNG or JPEG of at most 2 MB\u003C\u002Ftd>\n\u003Ctd>Verify the channel in YouTube, or use a smaller image\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Google says the app is not verified, or only test users may sign in\u003C\u002Ftd>\n\u003Ctd>Your OAuth consent screen is in testing\u003C\u002Ftd>\n\u003Ctd>Add the account as a test user, or publish the consent screen\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n",[13,17,20,23,26,30,33,36],{"id":14,"text":15,"level":16,"planned":9},"what-a-member-can-do","What a member can do",2,{"id":18,"text":19,"level":16,"planned":9},"who-connects-it","Who connects it",{"id":21,"text":22,"level":16,"planned":9},"what-waits-for-you","What waits for you",{"id":24,"text":25,"level":16,"planned":9},"setup","Setup",{"id":27,"text":28,"level":29,"planned":9},"register-a-google-oauth-client","Register a Google OAuth client",3,{"id":31,"text":32,"level":29,"planned":9},"connect-it","Connect it",{"id":34,"text":35,"level":16,"planned":9},"limits-and-cost","Limits and cost",{"id":37,"text":38,"level":16,"planned":9},"troubleshooting","Troubleshooting",1793448875878]