@mcp-box/mcpscore 0.8.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/README.md +30 -0
- package/bin/mcpscore.js +48 -0
- package/package.json +41 -0
package/README.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# mcpscore
|
|
2
|
+
|
|
3
|
+
**Lighthouse for MCP** — audit any [Model Context Protocol](https://modelcontextprotocol.io)
|
|
4
|
+
server and get a scored, actionable report in seconds.
|
|
5
|
+
|
|
6
|
+
```bash
|
|
7
|
+
npx @mcp-box/mcpscore https://your-server.example/mcp
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
This npm package is a thin wrapper around the Python
|
|
11
|
+
[mcpscore](https://pypi.org/project/mcpscore/) CLI, pinned to the matching
|
|
12
|
+
version — `npx @mcp-box/mcpscore` and `uvx mcpscore` behave identically. It requires
|
|
13
|
+
[uv](https://docs.astral.sh/uv/) or [pipx](https://pipx.pypa.io/) on your PATH
|
|
14
|
+
(no packages are installed into your environment).
|
|
15
|
+
|
|
16
|
+
## What you get
|
|
17
|
+
|
|
18
|
+
- A severity-weighted quality score across protocol compliance, server
|
|
19
|
+
metadata, capabilities, tools, security, and transport — deterministic,
|
|
20
|
+
no API keys, CI-ready (`--json`).
|
|
21
|
+
- A separate readiness score for the upcoming MCP spec revision
|
|
22
|
+
(2026-07-28, stateless lifecycle).
|
|
23
|
+
- Actionable messages: every failed check says what to fix, and every rule
|
|
24
|
+
is anchored to the spec.
|
|
25
|
+
|
|
26
|
+
## Documentation
|
|
27
|
+
|
|
28
|
+
- [docs.mcpscore.dev](https://docs.mcpscore.dev) — quick start, scoring
|
|
29
|
+
methodology, full rules reference
|
|
30
|
+
- [GitHub](https://github.com/mcp-box/mcpscore) — source, issues, contributing
|
package/bin/mcpscore.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// mcpscore npm wrapper: runs the Python mcpscore CLI at the exact version
|
|
3
|
+
// this package pins (package.json -> mcpscore.pythonVersion), so
|
|
4
|
+
// `npx mcpscore <target>` and `uvx mcpscore <target>` behave identically.
|
|
5
|
+
//
|
|
6
|
+
// Resolution order: uvx (uv) -> pipx. No implicit installs into the user's
|
|
7
|
+
// environment; if neither runner exists, print clear instructions and exit 1.
|
|
8
|
+
"use strict";
|
|
9
|
+
|
|
10
|
+
const { spawnSync } = require("node:child_process");
|
|
11
|
+
|
|
12
|
+
const pkg = require("../package.json");
|
|
13
|
+
const spec = `mcpscore==${pkg.mcpscore.pythonVersion}`;
|
|
14
|
+
const args = process.argv.slice(2);
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Run the CLI through one Python runner; returns only if the runner is absent.
|
|
18
|
+
* @param {string} cmd - runner executable name
|
|
19
|
+
* @param {string[]} prefix - runner arguments placed before the mcpscore args
|
|
20
|
+
*/
|
|
21
|
+
function tryRun(cmd, prefix) {
|
|
22
|
+
const result = spawnSync(cmd, [...prefix, ...args], { stdio: "inherit" });
|
|
23
|
+
if (result.error) {
|
|
24
|
+
if (result.error.code === "ENOENT") return; // runner not installed — try the next one
|
|
25
|
+
console.error(`mcpscore: failed to run ${cmd}: ${result.error.message}`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
// Propagate the CLI's exit code (mcpscore's codes are a documented contract:
|
|
29
|
+
// 0 ok, 1 usage error, 2 connection failure).
|
|
30
|
+
process.exit(result.status === null ? 1 : result.status);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
tryRun("uvx", [spec]);
|
|
34
|
+
tryRun("pipx", ["run", spec]);
|
|
35
|
+
|
|
36
|
+
console.error(
|
|
37
|
+
[
|
|
38
|
+
`mcpscore is a Python CLI (this npm package is a thin wrapper for ${spec}).`,
|
|
39
|
+
"It needs one of these Python runners on your PATH:",
|
|
40
|
+
"",
|
|
41
|
+
" uv https://docs.astral.sh/uv/ (then this command just works)",
|
|
42
|
+
" pipx https://pipx.pypa.io/",
|
|
43
|
+
"",
|
|
44
|
+
"Or install it directly: pip install mcpscore",
|
|
45
|
+
"Docs: https://docs.mcpscore.dev",
|
|
46
|
+
].join("\n"),
|
|
47
|
+
);
|
|
48
|
+
process.exit(1);
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mcp-box/mcpscore",
|
|
3
|
+
"version": "0.8.0",
|
|
4
|
+
"description": "Lighthouse for MCP — audit any MCP server and get a scored, actionable report in seconds. Node wrapper for the Python mcpscore CLI.",
|
|
5
|
+
"bin": {
|
|
6
|
+
"mcpscore": "bin/mcpscore.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin/"
|
|
10
|
+
],
|
|
11
|
+
"engines": {
|
|
12
|
+
"node": ">=18"
|
|
13
|
+
},
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"author": "Alex Akimov",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/mcp-box/mcpscore.git",
|
|
19
|
+
"directory": "npm"
|
|
20
|
+
},
|
|
21
|
+
"homepage": "https://mcpscore.dev",
|
|
22
|
+
"bugs": "https://github.com/mcp-box/mcpscore/issues",
|
|
23
|
+
"keywords": [
|
|
24
|
+
"mcp",
|
|
25
|
+
"model-context-protocol",
|
|
26
|
+
"mcp-server",
|
|
27
|
+
"audit",
|
|
28
|
+
"quality",
|
|
29
|
+
"lint",
|
|
30
|
+
"cli",
|
|
31
|
+
"score",
|
|
32
|
+
"compliance",
|
|
33
|
+
"developer-tools"
|
|
34
|
+
],
|
|
35
|
+
"mcpscore": {
|
|
36
|
+
"pythonVersion": "0.8.0"
|
|
37
|
+
},
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public"
|
|
40
|
+
}
|
|
41
|
+
}
|