mcp-lyricscom 1.4.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,130 @@
1
+ # Changelog
2
+
3
+ ## 2.0.0
4
+
5
+ - **This server now needs node 24 or later.** Node 20 reached its end of
6
+ support on 2026-04-30 and node 22 is no longer what this code is built and
7
+ typed against. That is what makes this a major version: an install on an
8
+ older node is refused rather than left to fail somewhere later.
9
+ - **Every refusal of an argument opens with `invalid_input`.** A value outside
10
+ its bounds, of the wrong type, or outside the set an argument reads used to
11
+ come back in the validator's own words, with no code to branch on.
12
+ - **A container image is published for each version**, on ghcr, for amd64 and
13
+ arm64. The readme carries the configuration that runs it.
14
+ - The published package carries its changelog, and the entry point it declares
15
+ for the package root now publishes its types.
16
+
17
+ ## 1.4.1
18
+
19
+ - The README carries the same badge row as every server here: npm, CI, the
20
+ licence, the MCP registry entry, the Glama score, and one-click installs for
21
+ Cursor and VS Code. Each install link encodes this package. npm serves the
22
+ README frozen at publish time, so a release is what puts it there.
23
+
24
+ ## 1.4.0
25
+
26
+ - Refuse an argument no tool declares, instead of reading it and dropping it.
27
+ Every tool's schema already announced `additionalProperties: false`, but the
28
+ server accepted an undeclared argument silently, computed the answer on the
29
+ default for it, and returned that answer as if it had honored what was
30
+ asked. Now the call is refused under the `invalid_input` code, the message
31
+ names the argument, and offers the declared name when one is close: passing
32
+ `limt` to `search_lyrics` gets "did you mean 'limit'?", and passing `art` to
33
+ `search_songs` gets "did you mean 'artist'?".
34
+
35
+ ## 1.3.0
36
+
37
+ - Say that an offset landed past the end of the words. An empty body under the
38
+ word "Complete." reads as a song with nothing on file, which is a different
39
+ fact from the one that happened.
40
+ - Stop calling the site's own suggestions matches. A loose title search returns
41
+ what lyrics.com guessed at, and a row whose title is not the one asked for sits
42
+ among them: announcing the list as songs "matching" the query is how one song's
43
+ words come to be quoted for another. The wording says who chose them, and a
44
+ note says how to ask for an exact title instead.
45
+ - Never offer a page the schema refuses. A search that reached the last accepted
46
+ page advertised the next one, sending a caller into an argument that is turned
47
+ away.
48
+ - Carry the notes into the text block, and keep published text from producing a
49
+ line shaped like one.
50
+
51
+ ## 1.2.0
52
+
53
+ - Ship a `.mcpb` bundle on every release, so the server can be installed by
54
+ opening a file rather than by having npm and a client configuration. The
55
+ dependencies are compiled into a single file, which makes the bundle 164 kB
56
+ and five files instead of 3 MB and two thousand: a bundle is unpacked, not
57
+ resolved, so a copy of `node_modules` would only be dead weight. The npm build
58
+ still keeps its dependencies external, and the two builds are separate
59
+ configurations for that reason.
60
+ - Declare the bundle in `server.json`, with the hash the registry requires
61
+ computed from the released file at publish time rather than committed as a
62
+ value that goes stale on every build.
63
+
64
+ ## 1.1.1
65
+
66
+ Housekeeping, with no change to what any tool returns.
67
+
68
+ - Declare the tool schemas as objects rather than as the raw shape the SDK now
69
+ deprecates. The emitted `tools/list` is byte for byte what it was.
70
+ - Add an icon and a `websiteUrl` to `server.json`, so the registry has something
71
+ to show next to the entry.
72
+
73
+ ## 1.1.0
74
+
75
+ - Cache a response only once it has been read successfully. The cache stored
76
+ the raw response before parsing, so a page lyrics.com served but this client could
77
+ not understand stayed pinned for the cache lifetime and was replayed on every
78
+ retry: the tool could not recover even after the site was healthy again. It
79
+ now holds the parsed result, which also keeps the raw payload out of memory.
80
+
81
+ ## 1.0.2
82
+
83
+ - Claim a pacing slot per request instead of per task. A task runs a whole
84
+ retry chain, so stamping only its start let the next task follow the chain's
85
+ last request with no gap, below the interval the configuration promises.
86
+ - Honour `Retry-After` when lyrics.com sends one, in both its seconds and its
87
+ HTTP-date form, instead of guessing a delay. The wait is spent between
88
+ attempts rather than after the last one, where nobody would use it.
89
+ - Treat HTTP 403 as a refusal to back off from. It was reported as a plain
90
+ error, so the client kept its pace in the one situation where slowing down is
91
+ the remedy.
92
+ - Bound the pacing wait by the interval. A clock stepped backwards, by NTP or a
93
+ resumed virtual machine, made the next request wait for the size of the step,
94
+ and the queue is serial so every pending call waited behind it.
95
+ - Enforce the pacing floor and the identifying User-Agent in the client rather
96
+ than only when reading the environment. The client is published through the
97
+ `./client` export and accepts a caller-built config, so both promises were
98
+ previously optional for anyone importing the library.
99
+
100
+ ## 1.0.1
101
+
102
+ - Refresh the packaged README, which now carries one-click install links for
103
+ Cursor and VS Code and a link to the entry in the official MCP registry.
104
+ - Keep LICENSE to the plain MIT text. License detectors match the file against
105
+ the canonical template, so the trailing scope note made the package read as
106
+ unlicensed; that note lives in the README.
107
+
108
+ ## 1.0.0
109
+
110
+ First stable release. The tool contracts are now considered settled: tool names,
111
+ their parameters and the shape of their structured output will only change in a
112
+ future major version.
113
+
114
+ Every tool has been exercised end to end against the live site, including the
115
+ paths that are easy to get wrong: pagination continuity in `get_lyrics`, pages
116
+ that carry no lyrics, rejection of non-lyrics.com URLs, and rate limiting
117
+ surfacing as an explicit error.
118
+
119
+ ## 0.1.1
120
+
121
+ - Enforce a floor on the request interval. `LYRICSCOM_MIN_INTERVAL_MS` is now
122
+ refused below 500 ms; a lower value falls back to the default 1100 ms and warns
123
+ on stderr. The pacing that keeps this client polite towards lyrics.com no
124
+ longer depends on every installation configuring it correctly.
125
+
126
+ ## 0.1.0
127
+
128
+ Initial release. Three tools over stdio, no API key: `search_lyrics` (word or
129
+ phrase inside the lyrics), `search_songs` (by title), `get_lyrics` (full text by
130
+ id or URL).
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 smeet666
3
+ Copyright (c) 2026 Damien Bouissou
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -5,8 +5,10 @@
5
5
  [![license](https://img.shields.io/npm/l/mcp-lyricscom.svg)](./LICENSE)
6
6
  [![MCP Registry](https://img.shields.io/badge/MCP_Registry-listed-6E56CF)](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.smeet666/mcp-lyricscom)
7
7
  [![Glama](https://glama.ai/mcp/servers/smeet666/mcp-lyricscom/badges/score.svg)](https://glama.ai/mcp/servers/smeet666/mcp-lyricscom)
8
+ [![M8ven](https://m8ven.ai/badge/mcp/smeet666-mcp-lyricscom-pptp4t?variant=verified)](https://m8ven.ai/mcp/smeet666-mcp-lyricscom-pptp4t)
8
9
  [![Install in Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en/install-mcp?name=lyricscom&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIm1jcC1seXJpY3Njb20iXX0%3D)
9
10
  [![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat&logo=visualstudiocode&logoColor=white)](https://insiders.vscode.dev/redirect/mcp/install?name=lyricscom&config=%7B%22name%22%3A%22lyricscom%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22mcp-lyricscom%22%5D%7D)
11
+ <!-- m8ven-verify: 3c4d434dcafaac3c25dc86631fb1393b -->
10
12
 
11
13
  An [MCP](https://modelcontextprotocol.io) server for [lyrics.com](https://www.lyrics.com).
12
14
  Search songs by a word in their lyrics, by title, and read the full text.
@@ -42,6 +44,23 @@ claude mcp add lyricscom -- npx -y mcp-lyricscom
42
44
  }
43
45
  ```
44
46
 
47
+ ### With Docker
48
+
49
+ ```json
50
+ {
51
+ "mcpServers": {
52
+ "lyricscom": {
53
+ "command": "docker",
54
+ "args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-lyricscom:2.0.0"]
55
+ }
56
+ }
57
+ }
58
+ ```
59
+
60
+ `-i` keeps stdin open, which is where the protocol travels, and no `-t` is
61
+ passed: a TTY rewrites the stream and breaks it. The container needs outbound
62
+ HTTPS to `www.lyrics.com`, and nothing else: no volume, no port, no environment variable, no credential.
63
+
45
64
  That is the whole setup. There is nothing to sign up for.
46
65
 
47
66
  **Bundle, without npm**
@@ -112,6 +131,24 @@ Every variable is optional. Set them in the `env` block of your MCP client confi
112
131
  }
113
132
  ```
114
133
 
134
+ ### Avec Docker
135
+
136
+ ```json
137
+ {
138
+ "mcpServers": {
139
+ "lyricscom": {
140
+ "command": "docker",
141
+ "args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-lyricscom:2.0.0"]
142
+ }
143
+ }
144
+ }
145
+ ```
146
+
147
+ `-i` garde l'entrée standard ouverte, qui est le canal du protocole, et aucun
148
+ `-t` n'est passé : un terminal réécrit le flux et le casse. Le conteneur a besoin
149
+ d'un accès HTTPS sortant vers `www.lyrics.com`, et de rien d'autre :
150
+ aucun volume, aucun port, aucune variable d'environnement, aucun identifiant.
151
+
115
152
  ### About the User-Agent
116
153
 
117
154
  This server identifies itself honestly by default, naming the project and linking