mcp-lyricscom 1.4.1 → 2.0.1

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,141 @@
1
+ # Changelog
2
+
3
+ ## 2.0.1
4
+
5
+ - **Every tool is documented, with its arguments and what its answer carries.**
6
+ The README is written for a person deciding whether to install and for a
7
+ program installing on its own, and a test holds both halves to what the server
8
+ registers.
9
+ - **The privacy policy travels in the package.** It states the hosts contacted,
10
+ what a request carries, what is held and for how long.
11
+ - **The manifest names every tool the server registers**, which a host reads
12
+ before installing anything.
13
+
14
+ ## 2.0.0
15
+
16
+ - **This server now needs node 24 or later.** Node 20 reached its end of
17
+ support on 2026-04-30 and node 22 is no longer what this code is built and
18
+ typed against. That is what makes this a major version: an install on an
19
+ older node is refused rather than left to fail somewhere later.
20
+ - **Every refusal of an argument opens with `invalid_input`.** A value outside
21
+ its bounds, of the wrong type, or outside the set an argument reads used to
22
+ come back in the validator's own words, with no code to branch on.
23
+ - **A container image is published for each version**, on ghcr, for amd64 and
24
+ arm64. The readme carries the configuration that runs it.
25
+ - The published package carries its changelog, and the entry point it declares
26
+ for the package root now publishes its types.
27
+
28
+ ## 1.4.1
29
+
30
+ - The README carries the same badge row as every server here: npm, CI, the
31
+ licence, the MCP registry entry, the Glama score, and one-click installs for
32
+ Cursor and VS Code. Each install link encodes this package. npm serves the
33
+ README frozen at publish time, so a release is what puts it there.
34
+
35
+ ## 1.4.0
36
+
37
+ - Refuse an argument no tool declares, instead of reading it and dropping it.
38
+ Every tool's schema already announced `additionalProperties: false`, but the
39
+ server accepted an undeclared argument silently, computed the answer on the
40
+ default for it, and returned that answer as if it had honored what was
41
+ asked. Now the call is refused under the `invalid_input` code, the message
42
+ names the argument, and offers the declared name when one is close: passing
43
+ `limt` to `search_lyrics` gets "did you mean 'limit'?", and passing `art` to
44
+ `search_songs` gets "did you mean 'artist'?".
45
+
46
+ ## 1.3.0
47
+
48
+ - Say that an offset landed past the end of the words. An empty body under the
49
+ word "Complete." reads as a song with nothing on file, which is a different
50
+ fact from the one that happened.
51
+ - Stop calling the site's own suggestions matches. A loose title search returns
52
+ what lyrics.com guessed at, and a row whose title is not the one asked for sits
53
+ among them: announcing the list as songs "matching" the query is how one song's
54
+ words come to be quoted for another. The wording says who chose them, and a
55
+ note says how to ask for an exact title instead.
56
+ - Never offer a page the schema refuses. A search that reached the last accepted
57
+ page advertised the next one, sending a caller into an argument that is turned
58
+ away.
59
+ - Carry the notes into the text block, and keep published text from producing a
60
+ line shaped like one.
61
+
62
+ ## 1.2.0
63
+
64
+ - Ship a `.mcpb` bundle on every release, so the server can be installed by
65
+ opening a file rather than by having npm and a client configuration. The
66
+ dependencies are compiled into a single file, which makes the bundle 164 kB
67
+ and five files instead of 3 MB and two thousand: a bundle is unpacked, not
68
+ resolved, so a copy of `node_modules` would only be dead weight. The npm build
69
+ still keeps its dependencies external, and the two builds are separate
70
+ configurations for that reason.
71
+ - Declare the bundle in `server.json`, with the hash the registry requires
72
+ computed from the released file at publish time rather than committed as a
73
+ value that goes stale on every build.
74
+
75
+ ## 1.1.1
76
+
77
+ Housekeeping, with no change to what any tool returns.
78
+
79
+ - Declare the tool schemas as objects rather than as the raw shape the SDK now
80
+ deprecates. The emitted `tools/list` is byte for byte what it was.
81
+ - Add an icon and a `websiteUrl` to `server.json`, so the registry has something
82
+ to show next to the entry.
83
+
84
+ ## 1.1.0
85
+
86
+ - Cache a response only once it has been read successfully. The cache stored
87
+ the raw response before parsing, so a page lyrics.com served but this client could
88
+ not understand stayed pinned for the cache lifetime and was replayed on every
89
+ retry: the tool could not recover even after the site was healthy again. It
90
+ now holds the parsed result, which also keeps the raw payload out of memory.
91
+
92
+ ## 1.0.2
93
+
94
+ - Claim a pacing slot per request instead of per task. A task runs a whole
95
+ retry chain, so stamping only its start let the next task follow the chain's
96
+ last request with no gap, below the interval the configuration promises.
97
+ - Honour `Retry-After` when lyrics.com sends one, in both its seconds and its
98
+ HTTP-date form, instead of guessing a delay. The wait is spent between
99
+ attempts rather than after the last one, where nobody would use it.
100
+ - Treat HTTP 403 as a refusal to back off from. It was reported as a plain
101
+ error, so the client kept its pace in the one situation where slowing down is
102
+ the remedy.
103
+ - Bound the pacing wait by the interval. A clock stepped backwards, by NTP or a
104
+ resumed virtual machine, made the next request wait for the size of the step,
105
+ and the queue is serial so every pending call waited behind it.
106
+ - Enforce the pacing floor and the identifying User-Agent in the client rather
107
+ than only when reading the environment. The client is published through the
108
+ `./client` export and accepts a caller-built config, so both promises were
109
+ previously optional for anyone importing the library.
110
+
111
+ ## 1.0.1
112
+
113
+ - Refresh the packaged README, which now carries one-click install links for
114
+ Cursor and VS Code and a link to the entry in the official MCP registry.
115
+ - Keep LICENSE to the plain MIT text. License detectors match the file against
116
+ the canonical template, so the trailing scope note made the package read as
117
+ unlicensed; that note lives in the README.
118
+
119
+ ## 1.0.0
120
+
121
+ First stable release. The tool contracts are now considered settled: tool names,
122
+ their parameters and the shape of their structured output will only change in a
123
+ future major version.
124
+
125
+ Every tool has been exercised end to end against the live site, including the
126
+ paths that are easy to get wrong: pagination continuity in `get_lyrics`, pages
127
+ that carry no lyrics, rejection of non-lyrics.com URLs, and rate limiting
128
+ surfacing as an explicit error.
129
+
130
+ ## 0.1.1
131
+
132
+ - Enforce a floor on the request interval. `LYRICSCOM_MIN_INTERVAL_MS` is now
133
+ refused below 500 ms; a lower value falls back to the default 1100 ms and warns
134
+ on stderr. The pacing that keeps this client polite towards lyrics.com no
135
+ longer depends on every installation configuring it correctly.
136
+
137
+ ## 0.1.0
138
+
139
+ Initial release. Three tools over stdio, no API key: `search_lyrics` (word or
140
+ phrase inside the lyrics), `search_songs` (by title), `get_lyrics` (full text by
141
+ 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/PRIVACY.md ADDED
@@ -0,0 +1,152 @@
1
+ # Privacy
2
+
3
+ This server collects nothing about you, and sends nothing to its author.
4
+
5
+ _[Version française](#confidentialité)_
6
+
7
+ ---
8
+
9
+ ## What this server is
10
+
11
+ `mcp-lyricscom` is a read-only client for [lyrics.com](https://www.lyrics.com). It runs on your
12
+ own machine, as a process your MCP host starts, and it speaks over stdio. It
13
+ listens on no port.
14
+
15
+ It needs no API key and no account, so there is no credential for it to hold and none for it to send.
16
+
17
+ ## What leaves your machine, and where it goes
18
+
19
+ **One host is contacted: `www.lyrics.com`.** Nothing else.
20
+
21
+ | Host | What is read there |
22
+ | ---------------- | ------------------ |
23
+ | `www.lyrics.com` | the site's pages |
24
+
25
+ What a request carries:
26
+
27
+ | What | Why it is there |
28
+ | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
29
+ | The question you asked | A search term or an identifier reaches the site as you wrote it. |
30
+ | A `User-Agent` | `mcp-lyricscom/<version> (+https://github.com/smeet666/mcp-lyricscom)`, so the site can reach a person about the traffic it receives. |
31
+ | Your IP address | Sent by your network to any host you contact, as with any web request. |
32
+
33
+ Your requests reach lyrics.com. What is done with them there is governed by that site's own privacy policy, which this project does not control.
34
+
35
+ ## What is kept, and for how long
36
+
37
+ **Answers are held in memory only, and only while the server runs.** The cache is
38
+ a table in the process: it holds what was read so that reading the same page
39
+ twice costs one request instead of two. Closing the server empties it.
40
+
41
+ **Nothing is written to disk.** The server creates no file, no database and no
42
+ log file.
43
+
44
+ ## What is never collected
45
+
46
+ - No analytics, no telemetry, no usage counter.
47
+ - Nothing is sent to the author of this project or to any third party.
48
+ - No account, no profile, no identifier is created for you.
49
+ - Your questions are not stored, forwarded, or used to train anything.
50
+
51
+ ## Logs
52
+
53
+ The server writes diagnostics to **stderr**, where your MCP host decides what
54
+ becomes of them. `LYRICSCOM_LOG_LEVEL` governs how much is written and defaults to `error`. These lines stay on your machine.
55
+
56
+ ## The settings that change any of this
57
+
58
+ | Variable | What it changes |
59
+ | ------------------------ | ---------------------------------------------------------------------------------------------------------------- |
60
+ | `LYRICSCOM_USER_AGENT` | Adds your own identifier in front of this project's, which stays appended so the site can always reach a person. |
61
+ | `LYRICSCOM_CACHE_TTL_MS` | How long an answer is held in memory. `0` turns the cache off. |
62
+ | `LYRICSCOM_LOG_LEVEL` | How much is written to stderr. |
63
+
64
+ ## Children
65
+
66
+ This server is a tool for developers and it is not directed at children.
67
+
68
+ ## Changes
69
+
70
+ A change to this policy travels in a release, and the changelog names it.
71
+
72
+ ## Contact
73
+
74
+ Open an issue on [the repository](https://github.com/smeet666/mcp-lyricscom/issues). For something exploitable,
75
+ follow [SECURITY.md](./SECURITY.md) instead.
76
+
77
+ ---
78
+
79
+ # Confidentialité
80
+
81
+ Ce serveur ne collecte rien sur vous et n'envoie rien à son auteur.
82
+
83
+ ## Ce qu'est ce serveur
84
+
85
+ `mcp-lyricscom` est un client en lecture seule pour [lyrics.com](https://www.lyrics.com). Il
86
+ tourne sur votre machine, comme un processus que votre hôte MCP démarre, et il
87
+ parle en stdio. Il n'écoute sur aucun port.
88
+
89
+ Il ne demande ni clé d'API ni compte, donc il ne détient aucun identifiant et n'en envoie aucun.
90
+
91
+ ## Ce qui quitte votre machine, et où cela va
92
+
93
+ **Un seul hôte est joint : `www.lyrics.com`.** Rien d'autre.
94
+
95
+ | Hôte | Ce qui y est lu |
96
+ | ---------------- | ----------------- |
97
+ | `www.lyrics.com` | les pages du site |
98
+
99
+ Ce qu'une requête emporte :
100
+
101
+ | Quoi | Pourquoi |
102
+ | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
103
+ | La question posée | Un terme de recherche ou un identifiant atteint le site tel que vous l'avez écrit. |
104
+ | Un `User-Agent` | `mcp-lyricscom/<version> (+https://github.com/smeet666/mcp-lyricscom)`, pour que le site puisse joindre une personne au sujet du trafic qu'il reçoit. |
105
+ | Votre adresse IP | Transmise par votre réseau à tout hôte que vous joignez, comme pour n'importe quelle requête web. |
106
+
107
+ Vos requêtes atteignent lyrics.com. Ce qui en est fait là-bas relève de la politique de confidentialité de ce site, que ce projet ne contrôle pas.
108
+
109
+ ## Ce qui est conservé, et combien de temps
110
+
111
+ **Les réponses sont gardées en mémoire seulement, et seulement pendant que le
112
+ serveur tourne.** Le cache est une table dans le processus : il retient ce qui a
113
+ été lu pour que lire deux fois la même page coûte une requête plutôt que deux.
114
+ Fermer le serveur le vide.
115
+
116
+ **Rien n'est écrit sur le disque.** Le serveur ne crée aucun fichier, aucune base
117
+ et aucun journal.
118
+
119
+ ## Ce qui n'est jamais collecté
120
+
121
+ - Aucune analyse d'audience, aucune télémétrie, aucun compteur d'usage.
122
+ - Rien n'est envoyé à l'auteur de ce projet ni à un tiers.
123
+ - Aucun compte, aucun profil, aucun identifiant n'est créé pour vous.
124
+ - Vos questions ne sont ni stockées, ni transmises, ni utilisées pour entraîner
125
+ quoi que ce soit.
126
+
127
+ ## Les journaux
128
+
129
+ Le serveur écrit ses diagnostics sur **stderr**, où votre hôte MCP décide de ce
130
+ qu'ils deviennent. `LYRICSCOM_LOG_LEVEL` règle leur quantité et vaut `error` par défaut. Ces lignes restent sur votre machine.
131
+
132
+ ## Les réglages qui changent tout cela
133
+
134
+ | Variable | Ce qu'elle change |
135
+ | ------------------------ | ------------------------------------------------------------------------------------------------------------------------ |
136
+ | `LYRICSCOM_USER_AGENT` | Ajoute votre identifiant devant celui du projet, qui reste accolé pour que le site puisse toujours joindre une personne. |
137
+ | `LYRICSCOM_CACHE_TTL_MS` | Combien de temps une réponse est gardée en mémoire. `0` éteint le cache. |
138
+ | `LYRICSCOM_LOG_LEVEL` | La quantité écrite sur stderr. |
139
+
140
+ ## Les enfants
141
+
142
+ Ce serveur est un outil pour développeurs et ne s'adresse pas aux enfants.
143
+
144
+ ## Les évolutions
145
+
146
+ Une modification de cette politique voyage dans une version, et le changelog la
147
+ nomme.
148
+
149
+ ## Contact
150
+
151
+ Ouvrez une issue sur [le dépôt](https://github.com/smeet666/mcp-lyricscom/issues). Pour quelque chose
152
+ d'exploitable, suivez plutôt [SECURITY.md](./SECURITY.md).