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 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.
The design: a thin adapter, not a second app
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 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.
Four tools
| Tool | Purpose |
|---|---|
get_video_info(url) | Title, duration and available qualities (read-only) |
download_video(url, quality, audio_only) | Starts a download and waits briefly |
get_download_status(job_id) | Checks a running job |
cancel_download(job_id) | Stops a job |
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.
Errors an agent can act on
A failure returns isError: true with a stable code and a retryable flag:
{"error": {"code": "...", "message": "...", "retryable": false}} That way the model can decide whether to retry, wait, or tell the user what went wrong instead of guessing from a stack trace.
Free access without opening the door
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.
Try it
claude mcp add --transport http video-downloader https://mcp.savedock.pro/mcp 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/
What I learned
- Keep the MCP layer thin. Put business logic behind one API.
- Return structured errors, not just text.
- Design tools for waiting: agents time out sooner than downloads finish.
- Anonymous access needs a per-user limit, or one heavy user blocks everyone.
Only use it on content you have the right to download. Feedback is welcome in the comments, especially from people building MCP servers.

