{"endpoint":"https://ninacast.com/api/mcp","tools":[{"name":"list_podcasts","scopes":"podcasts:read","description":"List podcasts you own or collaborate on. Returns IDs, summaries and your role.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"offset":{"default":0,"type":"integer","minimum":0,"maximum":1000000},"limit":{"default":20,"type":"integer","minimum":1,"maximum":50}},"additionalProperties":false}},{"name":"list_episodes","scopes":"podcasts:read","description":"List episode summaries, including drafts. Filter by status or search. Returns the current feed version.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"podcastId":{"type":"string","minLength":1,"maxLength":2048,"description":"The podcastId returned by list_podcasts."},"offset":{"default":0,"type":"integer","minimum":0,"maximum":1000000},"limit":{"default":20,"type":"integer","minimum":1,"maximum":50},"status":{"default":"all","type":"string","enum":["all","draft","published"]},"search":{"default":"","type":"string","maxLength":200}},"required":["podcastId"],"additionalProperties":false}},{"name":"get_episode","scopes":"podcasts:read","description":"Fetch full episode content and media metadata using its original GUID. Returns the current feed version.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"podcastId":{"type":"string","minLength":1,"maxLength":2048,"description":"The podcastId returned by list_podcasts."},"guid":{"type":"string","minLength":1,"maxLength":2048,"description":"The original, full episode GUID returned by list_episodes."}},"required":["podcastId","guid"],"additionalProperties":false}},{"name":"create_episode","scopes":"podcasts:read podcasts:write","description":"Create a draft in an existing podcast with a server-generated GUID.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"podcastId":{"type":"string","minLength":1,"maxLength":2048},"expectedVersion":{"type":"integer","minimum":0,"maximum":9007199254740990,"description":"Current feed version from list_episodes or get_episode. Fetch it again after a conflict."},"requestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"A new UUID for this operation. Reuse it with identical inputs only when retrying the same request."},"episode":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":1000},"description":{"type":"string","maxLength":20000},"contentHtml":{"type":"string","maxLength":30000},"pubDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"enclosure":{"type":"object","properties":{"url":{"type":"string","maxLength":4096,"format":"uri"},"length":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"type":{"type":"string","enum":["audio/mpeg","audio/mp4","audio/x-m4a","audio/aac","audio/ogg","audio/wav","audio/x-wav","audio/flac","video/mp4"]}},"required":["url","length","type"],"additionalProperties":false},"itunes":{"type":"object","properties":{"duration":{"type":"string","maxLength":32,"pattern":"^(?:\\d+|\\d+:[0-5]\\d|\\d+:[0-5]\\d:[0-5]\\d)$"},"image":{"type":"string","maxLength":4096,"format":"uri"},"explicit":{"type":"boolean"},"subtitle":{"type":"string","maxLength":1000},"summary":{"type":"string","maxLength":20000},"author":{"type":"string","maxLength":1000}},"additionalProperties":false}},"required":["title"],"additionalProperties":false}},"required":["podcastId","expectedVersion","requestId","episode"],"additionalProperties":false}},{"name":"update_episode","scopes":"podcasts:read podcasts:write","description":"Patch an episode. Editing a published episode also requires podcasts:publish and updates hosted RSS.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"podcastId":{"type":"string","minLength":1,"maxLength":2048},"expectedVersion":{"type":"integer","minimum":0,"maximum":9007199254740990,"description":"Current feed version from list_episodes or get_episode. Fetch it again after a conflict."},"requestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"A new UUID for this operation. Reuse it with identical inputs only when retrying the same request."},"guid":{"type":"string","minLength":1,"maxLength":2048,"description":"The original full episode GUID, not a website slug."},"changes":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":1000},"description":{"type":"string","maxLength":20000},"contentHtml":{"type":"string","maxLength":30000},"pubDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"enclosure":{"type":"object","properties":{"url":{"type":"string","maxLength":4096,"format":"uri"},"length":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"type":{"type":"string","enum":["audio/mpeg","audio/mp4","audio/x-m4a","audio/aac","audio/ogg","audio/wav","audio/x-wav","audio/flac","video/mp4"]}},"required":["url","length","type"],"additionalProperties":false},"itunes":{"type":"object","properties":{"duration":{"type":"string","maxLength":32,"pattern":"^(?:\\d+|\\d+:[0-5]\\d|\\d+:[0-5]\\d:[0-5]\\d)$"},"image":{"type":"string","maxLength":4096,"format":"uri"},"explicit":{"type":"boolean"},"subtitle":{"type":"string","maxLength":1000},"summary":{"type":"string","maxLength":20000},"author":{"type":"string","maxLength":1000}},"additionalProperties":false}},"additionalProperties":false}},"required":["podcastId","expectedVersion","requestId","guid","changes"],"additionalProperties":false}},{"name":"prepare_audio_upload","scopes":"podcasts:read podcasts:write","description":"Reserve a short-lived, create-only direct audio upload URL and required headers.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"podcastId":{"type":"string","minLength":1,"maxLength":2048},"requestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"A new UUID for this operation. Reuse it with identical inputs only when retrying the same request."},"filename":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[^/\\\\\\x00-\\x1f]+$"},"contentType":{"type":"string","enum":["audio/mpeg","audio/mp4"]},"sizeBytes":{"type":"integer","exclusiveMinimum":0,"maximum":209715200},"contentMd5":{"type":"string","pattern":"^[A-Za-z0-9+/]{22}==$","description":"Base64-encoded MD5 digest of the exact file bytes, used as a transport checksum."}},"required":["podcastId","requestId","filename","contentType","sizeBytes","contentMd5"],"additionalProperties":false}},{"name":"complete_audio_upload","scopes":"podcasts:read podcasts:write","description":"Verify uploaded audio and attach it to an episode. Public episodes also require podcasts:publish.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"podcastId":{"type":"string","minLength":1,"maxLength":2048},"expectedVersion":{"type":"integer","minimum":0,"maximum":9007199254740990,"description":"Current feed version from list_episodes or get_episode. Fetch it again after a conflict."},"requestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"A new UUID for this operation. Reuse it with identical inputs only when retrying the same request."},"guid":{"type":"string","minLength":1,"maxLength":2048,"description":"The original full episode GUID, not a website slug."},"uploadId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"duration":{"type":"string","maxLength":32,"pattern":"^(?:\\d+|\\d+:[0-5]\\d|\\d+:[0-5]\\d:[0-5]\\d)$"}},"required":["podcastId","expectedVersion","requestId","guid","uploadId","duration"],"additionalProperties":false}},{"name":"unpublish_episode","scopes":"podcasts:read podcasts:write podcasts:publish","description":"Return an episode to draft and remove it from hosted RSS, retaining its media.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"podcastId":{"type":"string","minLength":1,"maxLength":2048},"expectedVersion":{"type":"integer","minimum":0,"maximum":9007199254740990,"description":"Current feed version from list_episodes or get_episode. Fetch it again after a conflict."},"requestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"A new UUID for this operation. Reuse it with identical inputs only when retrying the same request."},"guid":{"type":"string","minLength":1,"maxLength":2048,"description":"The original full episode GUID, not a website slug."}},"required":["podcastId","expectedVersion","requestId","guid"],"additionalProperties":false}},{"name":"delete_episode","scopes":"podcasts:read podcasts:write podcasts:delete","description":"Permanently remove an episode entry, retaining media. Public episodes also require podcasts:publish.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"podcastId":{"type":"string","minLength":1,"maxLength":2048},"expectedVersion":{"type":"integer","minimum":0,"maximum":9007199254740990,"description":"Current feed version from list_episodes or get_episode. Fetch it again after a conflict."},"requestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"A new UUID for this operation. Reuse it with identical inputs only when retrying the same request."},"guid":{"type":"string","minLength":1,"maxLength":2048,"description":"The original full episode GUID, not a website slug."}},"required":["podcastId","expectedVersion","requestId","guid"],"additionalProperties":false}},{"name":"publish_episode","scopes":"podcasts:read podcasts:write podcasts:publish","description":"Validate a draft and publish it to hosted RSS now.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"podcastId":{"type":"string","minLength":1,"maxLength":2048},"expectedVersion":{"type":"integer","minimum":0,"maximum":9007199254740990,"description":"Current feed version from list_episodes or get_episode. Fetch it again after a conflict."},"requestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"A new UUID for this operation. Reuse it with identical inputs only when retrying the same request."},"guid":{"type":"string","minLength":1,"maxLength":2048,"description":"The original full episode GUID, not a website slug."}},"required":["podcastId","expectedVersion","requestId","guid"],"additionalProperties":false}}]}