mcp-server-mcpindex 0.3.10 → 0.3.12
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 +13 -0
- package/README.md +17 -5
- package/manifest.json +4 -2
- package/package.json +1 -1
- package/src/tools-meta.json +1 -1
- package/src/trust.mjs +18 -3
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,19 @@ All notable changes to `mcp-server-mcpindex` are recorded here.
|
|
|
4
4
|
|
|
5
5
|
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [0.3.12] - 2026-07-27
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **`search_mcp_servers` no longer claims to search "the full MCP server registry".** The advertised description promised registry-wide coverage, but the tool queries mcpindex's own indexed snapshot (`loadServers()`), which is a subset. The description now says it searches "every MCP server mcpindex indexes" - the same claim the site makes, and one the tool actually delivers. Copy-only; no behaviour change.
|
|
12
|
+
|
|
13
|
+
## [0.3.11] - 2026-07-18
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- **Verdict `status` no longer overstates screening completeness.** The live API emits `status: "PARTIAL"` for a description-level screen, but the client's `VALID_STATUSES` omitted `PARTIAL` and coerced it *up* to `EVALUATED` (a full screen) — dishonest for a trust tool. `PARTIAL` now passes through verbatim, an unknown status is coerced *down* to `STALE` (never up to `EVALUATED`), and the `granularity` field (e.g. `"description-level"`) is now preserved instead of dropped.
|
|
18
|
+
- **README:** documents the `PARTIAL` status + `granularity`, and clarifies that `status: "ERROR"` also covers "no verdict on file yet" (not only endpoint failures).
|
|
19
|
+
|
|
7
20
|
## [0.3.10] - 2026-07-18
|
|
8
21
|
|
|
9
22
|
### Fixed
|
package/README.md
CHANGED
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
# mcp-server-mcpindex
|
|
2
2
|
|
|
3
|
+
[](https://mcpindex.ai/server/io-github-gautamgb-mcp-server-mcpindex)
|
|
4
|
+
[](https://www.npmjs.com/package/mcp-server-mcpindex)
|
|
5
|
+
[](https://www.npmjs.com/package/mcp-server-mcpindex)
|
|
6
|
+
[](https://mcpindex.ai/stats)
|
|
7
|
+
[](https://mcpindex.ai/stats)
|
|
8
|
+
[](https://github.com/mcpindex-ai/mcp-server-mcpindex/commits/main)
|
|
9
|
+
[](https://smithery.ai/servers/gautamgb/mcpindex)
|
|
10
|
+
[](https://glama.ai/mcp/servers/mcpindex-ai/mcp-server-mcpindex)
|
|
11
|
+
|
|
3
12
|
> An MCP server for finding MCP servers, plus advisory trust verdicts agent frameworks can call before invoking a tool.
|
|
4
13
|
|
|
5
|
-
A drop-in MCP server that lets your agent discover, compare, install, and pre-flight other MCP servers from inside the agent loop. Backed by [mcpindex.ai](https://mcpindex.ai) - the agent-native index of
|
|
14
|
+
A drop-in MCP server that lets your agent discover, compare, install, and pre-flight other MCP servers from inside the agent loop. Backed by [mcpindex.ai](https://mcpindex.ai) - the agent-native index of the official MCP registry (live count at [mcpindex.ai/stats](https://mcpindex.ai/stats)), screened and drift-monitored daily.
|
|
15
|
+
|
|
16
|
+
[Live site](https://mcpindex.ai) · [`npx mcp-server-mcpindex`](https://www.npmjs.com/package/mcp-server-mcpindex) · [Remote MCP](https://mcpindex.ai/api/mcp) · [Install gate](https://mcpindex.ai/#install) · [Docs](https://mcpindex.ai/docs) · [Trust](https://mcpindex.ai/trust)
|
|
6
17
|
|
|
7
18
|
## Install
|
|
8
19
|
|
|
@@ -104,7 +115,8 @@ npx -y mcp-server-mcpindex@latest
|
|
|
104
115
|
```jsonc
|
|
105
116
|
{
|
|
106
117
|
"directive": "ALLOW" | "DENY" | "REVIEW" | "UNVERIFIED",
|
|
107
|
-
"status": "EVALUATED" | "STALE" | "ERROR",
|
|
118
|
+
"status": "EVALUATED" | "PARTIAL" | "STALE" | "ERROR",
|
|
119
|
+
"granularity": "description-level" | null, // scope of a PARTIAL screen
|
|
108
120
|
"dimensions": [
|
|
109
121
|
{ "id": "tool_safety", "verdict": "PASS", "severity": "INFO" }
|
|
110
122
|
],
|
|
@@ -192,7 +204,9 @@ async function gateToolCall({ serverId, toolName, invoke, askHuman }) {
|
|
|
192
204
|
|
|
193
205
|
### The load-bearing rule: never fail-open
|
|
194
206
|
|
|
195
|
-
If the verdict endpoint is unreachable, returns 404, times out,
|
|
207
|
+
If the verdict endpoint is unreachable, returns 404, times out, returns malformed JSON, **or has no verdict on file yet for that server**, `check_tool_trust` returns `directive: "UNVERIFIED"` + `status: "ERROR"`. It never silently coerces to ALLOW. Your gate code SHOULD treat UNVERIFIED as "human review required", never as "looks fine, ship it."
|
|
208
|
+
|
|
209
|
+
`status` is telemetry about screen completeness, distinct from the `directive` trust decision: `EVALUATED` (full screen), `PARTIAL` (only part of the surface, e.g. description-level — see `granularity`), `STALE` (verdict past its freshness window), `ERROR` (unreachable / no verdict on file). A `PARTIAL` screen is never reported as `EVALUATED`.
|
|
196
210
|
|
|
197
211
|
This is tested. See `test/trust.test.mjs`.
|
|
198
212
|
|
|
@@ -243,6 +257,4 @@ MIT.
|
|
|
243
257
|
- Guide: [Find the right MCP server by task](https://mcpindex.ai/guides/find-mcp-server-by-task)
|
|
244
258
|
- Source: [github.com/mcpindex-ai](https://github.com/mcpindex-ai)
|
|
245
259
|
|
|
246
|
-
[](https://glama.ai/mcp/servers/mcpindex-ai/mcp-server-mcpindex)
|
|
247
|
-
|
|
248
260
|
Unofficial. Not affiliated with Anthropic.
|
package/manifest.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"manifest_version": "0.2",
|
|
3
3
|
"name": "mcp-server-mcpindex",
|
|
4
4
|
"display_name": "mcpindex",
|
|
5
|
-
"version": "0.3.
|
|
5
|
+
"version": "0.3.12",
|
|
6
6
|
"description": "The MCP directory that vets servers, not just lists them: search by task, then get an advisory screen on a server before an agent calls its tools. Advisory, conformance monitored not enforced, not a safety verdict.",
|
|
7
7
|
"long_description": "mcpindex is the MCP directory that vets servers, not just lists them. Search by task to find the right server (ranked picks with install commands and quality scores), then get an advisory screen on a specific tool or a whole server before your agent calls it: whether each tool does what it claims. check_tool_trust and assess_server return an advisory verdict (REVIEW / UNVERIFIED at v1), backed by conformance monitoring and a live drift ledger, and fail closed to human review. Zero-config: queries the public mcpindex.ai API, no credentials. Monitored, not enforced; not a safety verdict and not an in-path gate.",
|
|
8
8
|
"author": {
|
|
@@ -31,7 +31,9 @@
|
|
|
31
31
|
"entry_point": "src/index.mjs",
|
|
32
32
|
"mcp_config": {
|
|
33
33
|
"command": "node",
|
|
34
|
-
"args": [
|
|
34
|
+
"args": [
|
|
35
|
+
"${__dirname}/src/index.mjs"
|
|
36
|
+
],
|
|
35
37
|
"env": {
|
|
36
38
|
"MCPINDEX_API_BASE": "${user_config.api_base}"
|
|
37
39
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-server-mcpindex",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.12",
|
|
4
4
|
"mcpName": "io.github.gautamgb/mcp-server-mcpindex",
|
|
5
5
|
"description": "The MCP directory that vets servers, not just lists them. Search by task, then get an advisory screen on a server before your agent calls its tools: whether each tool does what it claims, backed by conformance monitoring and a public drift ledger. Advisory (REVIEW / UNVERIFIED), monitored not enforced, not a safety verdict. Drop-in for Claude Desktop, Claude Code, Cursor, Gemini CLI, Cline.",
|
|
6
6
|
"keywords": [
|
package/src/tools-meta.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
{
|
|
8
8
|
"name": "search_mcp_servers",
|
|
9
9
|
"title": "Search MCP servers",
|
|
10
|
-
"description": "Keyword + semantic search across
|
|
10
|
+
"description": "Keyword + semantic search across every MCP server mcpindex indexes. Use when the user knows what tool category they want but not which server."
|
|
11
11
|
},
|
|
12
12
|
{
|
|
13
13
|
"name": "get_install_command",
|
package/src/trust.mjs
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
// Contract (v1 advisory, free tier):
|
|
4
4
|
// {
|
|
5
5
|
// directive: "ALLOW" | "DENY" | "REVIEW" | "UNVERIFIED",
|
|
6
|
-
// status: "EVALUATED" | "STALE" | "ERROR",
|
|
6
|
+
// status: "EVALUATED" | "PARTIAL" | "STALE" | "ERROR",
|
|
7
|
+
// granularity: string | null, // e.g. "description-level" for a PARTIAL screen
|
|
7
8
|
// dimensions: [{ id, verdict, severity }],
|
|
8
9
|
// expires_at: string | null,
|
|
9
10
|
// honest_limits: string[],
|
|
@@ -14,6 +15,12 @@
|
|
|
14
15
|
// Fail-CLOSED: if the upstream endpoint is unreachable, returns 404, or
|
|
15
16
|
// returns malformed data, we return directive=UNVERIFIED, status=ERROR.
|
|
16
17
|
// We NEVER fake an ALLOW. This is the load-bearing safety invariant.
|
|
18
|
+
//
|
|
19
|
+
// status is TELEMETRY about screen completeness (not the trust decision — that is
|
|
20
|
+
// `directive`). PARTIAL means the screen only covered part of the surface (e.g.
|
|
21
|
+
// description-level, not the live tool); it must NEVER be reported as EVALUATED. An
|
|
22
|
+
// unexpected/unknown status is coerced DOWN to STALE (conservative), never up to
|
|
23
|
+
// EVALUATED — overstating completeness is the one direction a trust tool must not drift.
|
|
17
24
|
|
|
18
25
|
export const VERDICT_CONTRACT_VERSION = '1.0.0';
|
|
19
26
|
|
|
@@ -24,7 +31,7 @@ export const V1_HONEST_LIMITS = Object.freeze([
|
|
|
24
31
|
]);
|
|
25
32
|
|
|
26
33
|
const VALID_DIRECTIVES = new Set(['ALLOW', 'DENY', 'REVIEW', 'UNVERIFIED']);
|
|
27
|
-
const VALID_STATUSES = new Set(['EVALUATED', 'STALE', 'ERROR']);
|
|
34
|
+
const VALID_STATUSES = new Set(['EVALUATED', 'PARTIAL', 'STALE', 'ERROR']);
|
|
28
35
|
const VALID_VERDICTS = new Set(['PASS', 'FAIL', 'UNVERIFIED']);
|
|
29
36
|
const VALID_SEVERITIES = new Set(['INFO', 'LOW', 'MEDIUM', 'HIGH', 'CRITICAL']);
|
|
30
37
|
|
|
@@ -34,6 +41,7 @@ function unverifiedResponse({ serverId, toolName, sourceUrl, reason }) {
|
|
|
34
41
|
return {
|
|
35
42
|
directive: 'UNVERIFIED',
|
|
36
43
|
status: 'ERROR',
|
|
44
|
+
granularity: null,
|
|
37
45
|
dimensions: [],
|
|
38
46
|
expires_at: null,
|
|
39
47
|
honest_limits: [...V1_HONEST_LIMITS, `unverified_reason:${reason}`],
|
|
@@ -66,11 +74,17 @@ function shapeVerdict({ raw, serverId, toolName, sourceUrl }) {
|
|
|
66
74
|
}
|
|
67
75
|
|
|
68
76
|
const directive = VALID_DIRECTIVES.has(raw.directive) ? raw.directive : 'UNVERIFIED';
|
|
77
|
+
// Known status passes through verbatim (incl. PARTIAL). An UNKNOWN status is coerced
|
|
78
|
+
// conservatively: ERROR when there's no directive, else STALE — NEVER 'EVALUATED',
|
|
79
|
+
// which would falsely claim a complete screen.
|
|
69
80
|
const status = VALID_STATUSES.has(raw.status)
|
|
70
81
|
? raw.status
|
|
71
82
|
: directive === 'UNVERIFIED'
|
|
72
83
|
? 'ERROR'
|
|
73
|
-
: '
|
|
84
|
+
: 'STALE';
|
|
85
|
+
// Screen granularity (e.g. "description-level"); pass through so callers can see a
|
|
86
|
+
// PARTIAL screen's scope instead of silently losing it.
|
|
87
|
+
const granularity = typeof raw.granularity === 'string' ? raw.granularity : null;
|
|
74
88
|
const dimensions = normalizeDimensions(raw.dimensions);
|
|
75
89
|
const expires_at = typeof raw.expires_at === 'string' ? raw.expires_at : null;
|
|
76
90
|
|
|
@@ -84,6 +98,7 @@ function shapeVerdict({ raw, serverId, toolName, sourceUrl }) {
|
|
|
84
98
|
return {
|
|
85
99
|
directive,
|
|
86
100
|
status,
|
|
101
|
+
granularity,
|
|
87
102
|
dimensions,
|
|
88
103
|
expires_at,
|
|
89
104
|
honest_limits,
|