Search song lyrics on lyrics.com by word or by title, and fetch full lyrics. No API key required.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent — or use 1-click editor setup below.
💡 Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
lyrics.com is a large public catalogue of song lyrics. It files a song under its title, its artist, the album it appeared on and the year, and it holds the words themselves. Its search reaches inside those words.
This server connects a chat client to that catalogue. You can search for a song by a line you remember, search by title and artist, and read the words of one song, a slice at a time, with the words you were looking for located in the text. It needs no API key and no account.
One-click install
Claude Code
Claude Desktop, Cursor, and any client using the standard config format
Node 24 or later is required, and no environment variable has to be set.
-i keeps stdin open, which is where the protocol travels, and -t is left out
because a TTY rewrites the stream. The container needs outbound HTTPS to
www.lyrics.com, and nothing else: no volume, no port, no credential.
Download mcp-lyricscom-2.0.1.mcpb from
the latest release
and open it. A client that supports MCP bundles installs it on its own, with no
npm and no configuration file to edit. The bundle carries its dependencies, so
nothing is fetched at install time.
The ordinary path runs from a search to a reading: a row carries an id, and
get_lyrics takes that id.
| Tool | What it does |
|---|---|
search_lyrics | Finds a song from a line inside its words. |
search_songs | Finds songs by title, narrowed by artist. |
get_lyrics | Reads the words of one song, a slice at a time. |
search_lyricsFinds a song from words inside its lyrics. The site ranks loosely, so a match is checked before it is served.
| Argument | Type | Required | What it does |
|---|---|---|---|
query | string, 1 to 120 characters | yes | The line, or part of it, to look for. |
limit | integer, 1 to 50, default 10 | no | Rows to serve. |
page | integer, 1 to 20, default 1 | no | Which page of rows. |
verify | snippet, full or none, default snippet | no | How to confirm the words really appear. |
include_excerpt | boolean, default true | no | Carry the matching line with each row. |
verify decides what a row is worth. snippet checks the excerpt the site
already returned and costs nothing. full fetches up to five song pages and
checks the complete words, which is slow and can bring on rate limiting. none
serves what the site ranked, unchecked.
In return: rows carrying id, which get_lyrics takes; title; artist;
album and year, null where the catalogue states none; source_url; and
excerpt, the matching line. raw_result_count is what the site returned and
filtered_out how many rows the check removed, so the two together say how loose
the ranking was. has_more and next_page continue.
search_songsFinds songs by title, narrowed by artist.
| Argument | Type | Required | What it does |
|---|---|---|---|
title | string, 1 to 120 characters | yes | The song title, or part of it. |
artist | string, up to 120 characters | no | Keep the songs credited to this artist. |
limit | integer, 1 to 50, default 10 | no | Rows to serve. |
page | integer, 1 to 20, default 1 | no | Which page of rows. |
match | loose or strict, default loose | no | How closely the artist has to match. |
In return: the rows search_lyrics returns, with artist_filter echoing
what was asked for and filtered_out counting what the artist restriction
removed. strict keeps the artists whose name matches as written; loose
accepts a name written differently.
get_lyricsReads the words of one song. Long lyrics are served a slice at a time.
| Argument | Type | Required | What it does |
|---|---|---|---|
id | string | one of two | The song id a search row carries. |
url | a lyrics.com URL | one of two | The address of the song page. |
max_chars | integer, 200 to 20000, default 6000 | no | Characters of text to serve in this call. |
offset | integer, 0 or more, default 0 | no | Character offset to resume from. |
highlight | string, up to 120 characters | no | Words to locate inside the text. |
In return: status, reading ok or no_lyrics for a page the site holds
without words; title, artist and source_url; and lyrics, the slice
itself. The reading is described by total_chars, returned_chars, offset,
next_offset and truncated: pass next_offset back to read on, and null
there means the end. line_count counts the lines of the slice, and highlight
answers for each word whether it was found and on which line_number, which is
null when it was not.
Every variable is optional. Set them in the env block of your client config.
| Variable | Default | What it does |
|---|---|---|
LYRICSCOM_USER_AGENT | the project identity | Names your application to the site, with an address where a person can be reached. |
LYRICSCOM_MIN_INTERVAL_MS | 1100 | Gap between two requests, from 500 to 60000. |
LYRICSCOM_TIMEOUT_MS | 15000 | Deadline for one request, from 1000 to 120000. |
LYRICSCOM_MAX_RETRIES | 3 | Attempts after a transient failure, from 0 to 10. |
LYRICSCOM_CACHE_TTL_MS | 900000 | How long an answer stays in memory, from 0 to 86400000. |
LYRICSCOM_CACHE_MAX_ENTRIES | 200 | Answers held in memory at once, from 0 to 10000. |
LYRICSCOM_LOG_LEVEL | error | silent, error, info or debug, written to stderr. |
A value outside its range falls back to the default, and the reason is written to stderr.
No reviews yet — be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/mcp-lyricscom)<a href="https://allmcps.com/mcp/mcp-lyricscom"><img src="https://allmcps.com/api/badge/mcp-lyricscom?style=directory" alt="MCP Lyricscom on AllMCPs" /></a>