mcp-metacritic 1.2.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 +126 -0
- package/LICENSE +1 -1
- package/README.md +37 -0
- package/dist/index.js +420 -172
- package/dist/index.js.map +1 -1
- package/dist/mc/client.js +225 -91
- package/dist/mc/client.js.map +1 -1
- package/package.json +15 -11
- package/server.json +6 -10
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
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.2.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.2.0
|
|
25
|
+
|
|
26
|
+
- Refuse an argument no tool declares, instead of reading it and dropping it.
|
|
27
|
+
Every tool's published schema already marked `additionalProperties: false`,
|
|
28
|
+
but the server accepted an argument outside that schema and silently
|
|
29
|
+
ignored it, so a caller who mistyped a name got a confident answer computed
|
|
30
|
+
on the defaults rather than on what they asked for. Every tool now refuses
|
|
31
|
+
such a call under the `invalid_input` code, names the argument, and offers
|
|
32
|
+
the declared name when one is close: `search_titles` called with `limt`
|
|
33
|
+
points to `limit`, and `get_title` called with `chars` points to
|
|
34
|
+
`max_chars`.
|
|
35
|
+
|
|
36
|
+
## 1.1.2
|
|
37
|
+
|
|
38
|
+
- Stop reporting an entry Metacritic has not scored as an entry scored zero.
|
|
39
|
+
The listing routes write 0 where the detail route writes null, so a search for
|
|
40
|
+
Angel's Egg came back with "0/100" for a film that holds three positive
|
|
41
|
+
reviews and no Metascore. A score of 0 is now read as the absence it stands
|
|
42
|
+
for, in search rows, in browse rows and in the score breakdown, and the same
|
|
43
|
+
applies to a runtime of 0 minutes on an entry that has not opened.
|
|
44
|
+
|
|
45
|
+
## 1.1.1
|
|
46
|
+
|
|
47
|
+
- Stop published text from producing a line shaped like one this server writes.
|
|
48
|
+
The text block ends with lines opening "Note:" and "Source:", and anyone who
|
|
49
|
+
publishes on the site can put those same words at the start of a line in a
|
|
50
|
+
title or a description, where a reader has no way to tell the two apart. Such
|
|
51
|
+
a line is indented in the text block. The structured output carries the text
|
|
52
|
+
exactly as published, as it did.
|
|
53
|
+
|
|
54
|
+
## 1.1.0
|
|
55
|
+
|
|
56
|
+
- Ship a `.mcpb` bundle on every release, so the server can be installed by
|
|
57
|
+
opening a file rather than by having npm and a client configuration. The
|
|
58
|
+
dependencies are compiled into a single file, which makes the bundle 164 kB
|
|
59
|
+
and five files instead of 3 MB and two thousand: a bundle is unpacked, not
|
|
60
|
+
resolved, so a copy of `node_modules` would only be dead weight. The npm build
|
|
61
|
+
still keeps its dependencies external, and the two builds are separate
|
|
62
|
+
configurations for that reason.
|
|
63
|
+
- Declare the bundle in `server.json`, with the hash the registry requires
|
|
64
|
+
computed from the released file at publish time rather than committed as a
|
|
65
|
+
value that goes stale on every build.
|
|
66
|
+
|
|
67
|
+
## 1.0.3
|
|
68
|
+
|
|
69
|
+
Housekeeping, with no change to what any tool returns.
|
|
70
|
+
|
|
71
|
+
- Declare the tool schemas as objects rather than as the raw shape the SDK now
|
|
72
|
+
deprecates. The emitted `tools/list` is byte for byte what it was.
|
|
73
|
+
- Add an icon and a `websiteUrl` to `server.json`, so the registry has something
|
|
74
|
+
to show next to the entry.
|
|
75
|
+
|
|
76
|
+
## 1.0.2
|
|
77
|
+
|
|
78
|
+
- Carry the notes into the text block of every tool. They are what qualifies an
|
|
79
|
+
answer: that a list was capped, that a score could not be read and is missing
|
|
80
|
+
rather than absent, that streaming offers do not apply to a game, that a
|
|
81
|
+
description continues at a further offset. A client rendering only the text
|
|
82
|
+
read the unqualified answer, so `get_title` on a game showed "Where to watch:
|
|
83
|
+
nothing listed" with nothing to say the section does not apply, and a cut
|
|
84
|
+
description ended with no sign there was more. The notes sit alongside the
|
|
85
|
+
attribution so they survive truncation, and a long run of them is trimmed from
|
|
86
|
+
the tail rather than crowding out the answer.
|
|
87
|
+
- Render `production` in the text block. The section was returned in the
|
|
88
|
+
structured output and nowhere in the text.
|
|
89
|
+
|
|
90
|
+
## 1.0.1
|
|
91
|
+
|
|
92
|
+
- Build the text block from the same sections as the structured output. It
|
|
93
|
+
printed the genres even when 'basic' had not been requested, contradicting a
|
|
94
|
+
payload that correctly returned none, and it never printed the streaming
|
|
95
|
+
offers at all: a client rendering only text paid an extra request for
|
|
96
|
+
'where_to_watch' and saw nothing come back. Awards and networks are rendered
|
|
97
|
+
too, and the runtime alongside the genres.
|
|
98
|
+
|
|
99
|
+
## 1.0.0
|
|
100
|
+
|
|
101
|
+
First stable release. The tool contracts are settled: tool names, argument names
|
|
102
|
+
and the shape of the structured output will not change without a major version.
|
|
103
|
+
|
|
104
|
+
Four tools over Metacritic, with no API key and no account:
|
|
105
|
+
|
|
106
|
+
- `search_titles` finds films, shows and games by title and returns compact rows
|
|
107
|
+
carrying the critic Metascore, so a question about the critical verdict is
|
|
108
|
+
answered in one call.
|
|
109
|
+
- `get_title` reads one entry section by section. A detail response is 46 KB for
|
|
110
|
+
a film, so `basic` and `scores` are the default and everything else costs a
|
|
111
|
+
request only when asked for.
|
|
112
|
+
- `get_reviews` returns individual critic or audience reviews, filtered by
|
|
113
|
+
verdict, each with the publication that ran it and a link to the article.
|
|
114
|
+
- `browse_titles` lists by score, release date or current popularity, which is
|
|
115
|
+
what answers "the best horror films" when there is no title to look up.
|
|
116
|
+
|
|
117
|
+
Two things this release is careful about.
|
|
118
|
+
|
|
119
|
+
The critic score runs to 100 and the audience score to 10. Every score is
|
|
120
|
+
returned with its own `max`, and the tool descriptions say so, because
|
|
121
|
+
averaging the two is the easiest mistake to make with this data.
|
|
122
|
+
|
|
123
|
+
A failure is never reported as an empty result. Metacritic answers with either
|
|
124
|
+
a `data` object or an `errors` array, and this server reads that distinction: a
|
|
125
|
+
missing entry produces an error with a code, and a request that could not be
|
|
126
|
+
made says so rather than claiming Metacritic publishes nothing.
|
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -5,8 +5,10 @@
|
|
|
5
5
|
[](./LICENSE)
|
|
6
6
|
[](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.smeet666/mcp-metacritic)
|
|
7
7
|
[](https://glama.ai/mcp/servers/smeet666/mcp-metacritic)
|
|
8
|
+
[](https://m8ven.ai/mcp/smeet666-mcp-metacritic-1yvblv)
|
|
8
9
|
[](https://cursor.com/en/install-mcp?name=metacritic&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIm1jcC1tZXRhY3JpdGljIl19)
|
|
9
10
|
[](https://insiders.vscode.dev/redirect/mcp/install?name=metacritic&config=%7B%22name%22%3A%22metacritic%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22mcp-metacritic%22%5D%7D)
|
|
11
|
+
<!-- m8ven-verify: 01151bc5a8514e55175f063339bedc6f -->
|
|
10
12
|
|
|
11
13
|
An [MCP](https://modelcontextprotocol.io) server for
|
|
12
14
|
[Metacritic](https://www.metacritic.com). Search films, shows and games, read
|
|
@@ -44,6 +46,23 @@ claude mcp add metacritic -- npx -y mcp-metacritic
|
|
|
44
46
|
}
|
|
45
47
|
```
|
|
46
48
|
|
|
49
|
+
### With Docker
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"mcpServers": {
|
|
54
|
+
"metacritic": {
|
|
55
|
+
"command": "docker",
|
|
56
|
+
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-metacritic:2.0.0"]
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
`-i` keeps stdin open, which is where the protocol travels, and no `-t` is
|
|
63
|
+
passed: a TTY rewrites the stream and breaks it. The container needs outbound
|
|
64
|
+
HTTPS to `www.metacritic.com` and `backend.metacritic.com`, and nothing else: no volume, no port, no environment variable, no credential.
|
|
65
|
+
|
|
47
66
|
**Bundle, without npm**
|
|
48
67
|
|
|
49
68
|
Download `mcp-metacritic-<version>.mcpb` from
|
|
@@ -235,6 +254,24 @@ claude mcp add metacritic -- npx -y mcp-metacritic
|
|
|
235
254
|
}
|
|
236
255
|
```
|
|
237
256
|
|
|
257
|
+
### Avec Docker
|
|
258
|
+
|
|
259
|
+
```json
|
|
260
|
+
{
|
|
261
|
+
"mcpServers": {
|
|
262
|
+
"metacritic": {
|
|
263
|
+
"command": "docker",
|
|
264
|
+
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-metacritic:2.0.0"]
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
`-i` garde l'entrée standard ouverte, qui est le canal du protocole, et aucun
|
|
271
|
+
`-t` n'est passé : un terminal réécrit le flux et le casse. Le conteneur a besoin
|
|
272
|
+
d'un accès HTTPS sortant vers `www.metacritic.com` et `backend.metacritic.com`, et de rien d'autre :
|
|
273
|
+
aucun volume, aucun port, aucune variable d'environnement, aucun identifiant.
|
|
274
|
+
|
|
238
275
|
**Bundle, sans npm**
|
|
239
276
|
|
|
240
277
|
Téléchargez `mcp-metacritic-<version>.mcpb` depuis
|