mcp-aoty
MCP server for exploring Album of the Year critic and user scores, reviews, releases, charts, critic lists, and music news.
Attribution
Album data comes from the unofficial Album of the Year API at https://aoty.prigoana.com (https://github.com/edideaur/AOTY-api), which is free to use with attribution. Underlying reviews, scores, and editorial content are the work of Album of the Year (https://www.albumoftheyear.org) and its contributing publications.
- Upstream API: aoty.prigoana.com
- Upstream source: edideaur/AOTY-api
- Data source: Album of the Year
That credit is a condition of use, so it is carried in five places and none of them are
optional: this section, NOTICE, the User-Agent sent with every request,
the instructions string every MCP client receives at handshake, and the
get_attribution tool.
Prerequisites
- Python 3.14+
- uv
Setup
uv sync
Configuration
No API key exists or is needed. The request interval is a deliberate courtesy throttle because the upstream API is a free personal Cloudflare Worker.
| Variable | Required | Default | Purpose |
|---|---|---|---|
AOTY_BASE_URL |
No | https://aoty.prigoana.com |
Unofficial Album of the Year API base URL |
AOTY_MIN_INTERVAL_MS |
No | 250 |
Minimum interval between upstream requests |
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"aoty": {
"command": "uvx",
"args": ["mcp-aoty"],
"env": {
"AOTY_MIN_INTERVAL_MS": "250"
}
}
}
}
Claude Code
claude mcp add aoty -e AOTY_MIN_INTERVAL_MS=250 -- uvx mcp-aoty
Tools
Diagnostics
| Tool | Description |
|---|---|
get_server_version |
Return the installed server version |
get_attribution |
Return upstream API and data-source attribution |
Albums
| Tool | Description |
|---|---|
get_album |
Get album details by authoritative slug, or fuzzy artist and name |
Search
| Tool | Description |
|---|---|
search_all |
Search albums, artists, and labels together |
search_albums |
Search album results |
search_artists |
Search artist results |
search_labels |
Search record-label results |
Charts and releases
| Tool | Description |
|---|---|
get_new_releases |
Get paginated new album releases |
get_new_singles |
Get paginated new single releases |
get_upcoming_releases |
Get paginated upcoming releases |
get_popular_albums |
Get currently popular albums |
get_popular_singles |
Get currently popular singles |
get_anticipated_albums |
Get anticipated upcoming albums |
get_under_radar_albums |
Get under-the-radar albums |
get_must_hear_albums |
Get must-hear albums by optional year or decade |
Lists and news
| Tool | Description |
|---|---|
get_critic_lists |
Get critic best-of lists for an optional year |
get_critic_list |
Get the entries in a critic list by slug |
get_music_news |
Get paginated music-news items by feed type |
Data source and etiquette
albumoftheyear.org has no official API; this server talks only to the unofficial
community API and never requests albumoftheyear.org directly. AOTY's
robots.txt disallows AI crawlers (ClaudeBot, anthropic-ai, GPTBot,
CCBot, Google-Extended) and /search/*, so those directives bind the
upstream Worker rather than this client. The API is a scraper and can break
when AOTY changes its HTML; keep request volume low.
Known limitations
artistplusnamelookup is fuzzy:Cassiusplus1999returns the single instead of the LP. Usesearch_albums, then pass itsslugtoget_album.- Album blocks carry no
id, so this server derives slugs from their URLs. - A
critic_score_rawvalue of"NR"means not rated.critic_scoreisNonein that case, which is distinct from a score being absent entirely. - Search hits often omit scores even when the album page has them. Call
get_albumwith the slug when you need scores. - A missing album is served as HTTP 200 carrying AOTY's generic page, not a 404. This server detects that stub and raises rather than returning a phantom record titled "Album of the Year".
- Scraped text arrives with HTML entities intact; this server decodes them before returning.
- Scores are live and move.
Development
uv sync
uv run pytest tests/ -x -q
uv run ruff check src/ tests/
uv run pyright src/
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mcp_aoty-0.1.0.tar.gz.
File metadata
- Download URL: mcp_aoty-0.1.0.tar.gz
- Upload date:
- Size: 10.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
11060fa8821c7ca42720b140765da9cf9c767efeac3adaaebd9cbf802d76ba03
|
|
| MD5 |
df68d1ff4d66054ec38c48090aa29684
|
|
| BLAKE2b-256 |
d8d2cbdf661f1f9b8b5ded09710c812acb38af35f0458cc1888e7451dff467eb
|
Provenance
The following attestation bundles were made for mcp_aoty-0.1.0.tar.gz:
Publisher:
release.yml on obrien-matthew/mcp-aoty
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcp_aoty-0.1.0.tar.gz -
Subject digest:
11060fa8821c7ca42720b140765da9cf9c767efeac3adaaebd9cbf802d76ba03 - Sigstore transparency entry: 2669336257
- Sigstore integration time:
-
Permalink:
obrien-matthew/mcp-aoty@0aa35db3ed819481a4dca41acd8216e4ada145e4 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/obrien-matthew
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0aa35db3ed819481a4dca41acd8216e4ada145e4 -
Trigger Event:
push
-
Statement type:
File details
Details for the file mcp_aoty-0.1.0-py3-none-any.whl.
File metadata
- Download URL: mcp_aoty-0.1.0-py3-none-any.whl
- Upload date:
- Size: 12.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8910521998f50fd27f7dbb6ae1e0bb207f380ca87ba7ab93f9726610c5ee3abf
|
|
| MD5 |
f5f2cc5629179734c01a55153c5c251b
|
|
| BLAKE2b-256 |
dd7e792f75fc0d0c7d2fa618cf7661d19ca67751ba01a3a0fb318f0975dbfa07
|
Provenance
The following attestation bundles were made for mcp_aoty-0.1.0-py3-none-any.whl:
Publisher:
release.yml on obrien-matthew/mcp-aoty
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcp_aoty-0.1.0-py3-none-any.whl -
Subject digest:
8910521998f50fd27f7dbb6ae1e0bb207f380ca87ba7ab93f9726610c5ee3abf - Sigstore transparency entry: 2669336276
- Sigstore integration time:
-
Permalink:
obrien-matthew/mcp-aoty@0aa35db3ed819481a4dca41acd8216e4ada145e4 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/obrien-matthew
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0aa35db3ed819481a4dca41acd8216e4ada145e4 -
Trigger Event:
push
-
Statement type: