mylar3-mcp
mylar3-mcp
Part of the arr-mcps collection. MCP server exposing Mylar3's HTTP API as tools, so an LLM can read and manage your comic library: watchlist, wanted issues, pull-list/upcoming, history, logs, story arcs, and providers.
Built with FastMCP.
Enabling the API on your Mylar3 server
Mylar3's API is opt-in and disabled by default. You must enable it and obtain an
API key in Mylar's web UI (or bootstrap it with cmd=getAPI if HTTP basic auth
is configured). This is server-side configuration specific to how you run
Mylar3, and out of scope for this project - see Mylar3's own settings for
API_ENABLED and API_KEY.
Install
Download a wheel from the latest release
and install it as a uv tool (no repo checkout needed):
uv tool install mylar3_mcp-*.whlThis puts a mylar3-mcp command on your PATH. Register it with Claude Code:
claude mcp add mylar3 \
--env MYLAR_URL=http://your-mylar-host:8090 \
--env MYLAR_API_KEY=<32-char key> \
-- mylar3-mcpFrom source
uv sync
cp .env.example .env # fill in MYLAR_URL and MYLAR_API_KEYclaude mcp add mylar3 \
--env MYLAR_URL=http://your-mylar-host:8090 \
--env MYLAR_API_KEY=<32-char key> \
-- uv run --directory /path/to/mylar3-mcp mylar3-mcpConfig
Env var | Required | Default |
| yes | - |
| yes (except | none (no |
| no |
|
Tools
5 resource-scoped tools, each covering multiple Mylar3 ?cmd= API
commands (40 total) via an operation parameter. Reads use GET, writes use
POST. Call a tool with operation set to one of its listed commands and an
arguments dict matching that command's params — the tool's own description
(visible to your MCP client) lists every operation, its signature, and a
one-line doc.
Tool | Operations | Covers |
| 12 | Add/get/pause/resume/refresh/delete comics, book type, status, recheck files, index, find |
| 7 | Issue info, queue/unqueue, force search/process, regenerate covers, refresh seriesjson |
| 7 | Read list, upcoming, wanted, story arcs, seriesjson listing, annual series |
| 4 | List/add/change/delete providers |
| 10 | Version, API, history, logs, config, GitHub check, update, restart, shutdown |
Example: mylar_comics(operation="mylar_del_comic", arguments={"id": "12345", "directory": True}).
Command-level naming (mylar_<verb>_<resource>, matching the underlying
?cmd= API command) is preserved as the operation value:
Operation | cmd |
| getIndex |
| getComic |
| getComicInfo |
| getIssueInfo |
| getReadList |
| getUpcoming |
| getWanted |
| getHistory |
| getLogs |
| findComic |
| getStoryArc |
| getVersion |
| listProviders |
| seriesjsonListing |
| listAnnualSeries |
| getAPI |
| addComic |
| pauseComic |
| resumeComic |
| refreshComic |
| changeBookType |
| changeStatus |
| recheckFiles |
| queueIssue |
| unqueueIssue |
| regenerateCovers |
| refreshSeriesjson |
| addStoryArc |
| forceSearch |
| forceProcess |
| addProvider |
| changeProvider |
| checkGithub |
| update |
| restart |
| clearLogs |
| delComic ( |
| delProvider |
| shutdown (stops the server) |
| configUpdate (session-cookie auth, see AGENTS.md) |
Notes
Mylar3's API responses are inconsistently enveloped: some wrap in
{"success": true, "data": ...}, some return the payload raw, and some return the bare string"OK". The server unwraps all of these so tools return just the meaningful data.mylar_queue_issueandmylar_force_searchcan actually snatch/download issues - treat them as state-changing.Binary endpoints (
getArt,downloadIssue,downloadNZB) are deliberately not exposed - they stream bytes, not JSON, which isn't useful over MCP.idparams are ComicVine ComicIDs; issue IDs are separate. Bulk-capable cmds (refreshComic,recheckFiles,regenerateCovers,refreshSeriesjson) accept comma-separated lists orall/missing.
Development
make help # list all commandsCommand | Does |
|
|
| Offline tests - one per endpoint, mocked HTTP |
| Tests against the live instance (needs |
| Build wheel + sdist into |
| Bump the version in |
| Remove build artifacts |
The release workflow (.github/workflows/release.yml) builds and publishes to
Releases whenever a v* tag
is pushed - so the usual flow is make bump-patch, commit, then tag and push.
The integration suite only reads data, plus a single reversible write test that
pauses and resumes an existing series (set via MYLAR_TEST_COMIC_ID) - it never
snatches, deletes, or modifies your library.