I gave AI agents a video downloader: building a remote MCP server in Python
AI assistants can write code and summarise articles, but when I asked one to "download this video" it had no way to do it. I had already built SaveDock , a free video and audio downloader on Django, yt-dlp and Celery, so I gave agents a way to use it: an MCP server. What is MCP? The Model Context P

AI assistants can write code and summarise articles, but when I asked one to "download this video" it had no way to do it. I had already built SaveDock, a free video and audio downloader on Django, yt-dlp and Celery, so I gave agents a way to use it: an MCP server.
The Model Context Protocol (MCP) is an open standard that lets an AI client, such as Claude or Cursor, call tools that live on a server. The client lists the tools, reads their descriptions, and decides when to use them. You don't write a plugin for each assistant. You write one server.
My first idea was to put yt-dlp inside the MCP server. I dropped it. The download logic, rate limits and storage already existed behind a REST API, so the MCP server only talks to that API:
agent --MCP--> mcp_server --REST--> /api/v1 --> Celery worker --> storage Enter fullscreen mode Exit fullscreen mode The MCP process has no Django, no yt-dlp and no database. Rate limits, quotas and error handling stay in one place, so the website, the API and MCP cannot drift apart.
Downloads can take longer than an agent wants to wait, so download_video waits up to 25 seconds and then returns a job id. The agent can poll with get_download_status. The result is a temporary link: the file itself is never put into the conversation.
A failure returns isError: true with a stable code and a retryable flag:
{ "error": { "code": "...", "message": "...", "retryable": false }} Enter fullscreen mode Exit fullscreen mode That way the model can decide whether to retry, wait, or tell the user what went wrong instead of guessing from a stack trace.
There is no signup, but there is a limit: 10 downloads per hour per IP. The catch is that all MCP callers arrive from the MCP server's own address. So the server forwards each caller's IP to the API (only when a trusted proxy sits in front), and the limit applies per user, not per server. A caller who passes a wrong API key gets a 401, not a silent downgrade.
claude mcp add --transport http video-downloader https://mcp.savedock.pro/mcp Enter fullscreen mode Exit fullscreen mode Then ask your assistant: "What qualities are available for this video?" or "Save the audio of this video as MP3."
Docs and a hosted endpoint: https://savedock.pro/mcp-server/
Only use it on content you have the right to download. Feedback is welcome in the comments, especially from people building MCP servers.