mcp-server-mcpindex 0.3.7 → 0.3.8
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 +11 -0
- package/README.md +4 -0
- package/manifest.json +55 -0
- package/package.json +6 -3
- package/src/index.mjs +9 -6
- package/src/update-check.mjs +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,17 @@ 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.8] - 2026-07-15
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **Empty `MCPINDEX_API_BASE` no longer breaks every API call.** Some MCPB-bundle hosts substitute an empty string for an unset optional `user_config` field, so `MCPINDEX_API_BASE=""` was being used verbatim as the base URL, turning every request into a broken relative URL. The base now falls back to `https://mcpindex.ai` on an empty value (`||` instead of `??`), so those hosts work out of the box. Source change was already on `main` at 0.3.7 but had not reached npm; this release ships it.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- Swept em-dashes to hyphens in the `check_tool_trust` tool description and the update-check comments (house style).
|
|
16
|
+
- Removed a no-op template expression in the recommendation output (`${r.name}@${r.qualityScore ? '' : ''}` always rendered `${r.name}`).
|
|
17
|
+
|
|
7
18
|
## [0.3.5] - 2026-07-12
|
|
8
19
|
|
|
9
20
|
### Changed
|
package/README.md
CHANGED
|
@@ -215,6 +215,10 @@ MIT.
|
|
|
215
215
|
|
|
216
216
|
- Website: [mcpindex.ai](https://mcpindex.ai)
|
|
217
217
|
- Methodology: [mcpindex.ai/methodology](https://mcpindex.ai/methodology)
|
|
218
|
+
- Screen a server: [mcpindex.ai/screen](https://mcpindex.ai/screen)
|
|
219
|
+
- Guide: [Find the right MCP server by task](https://mcpindex.ai/guides/find-mcp-server-by-task)
|
|
218
220
|
- Source: [github.com/mcpindex-ai](https://github.com/mcpindex-ai)
|
|
219
221
|
|
|
222
|
+
[](https://glama.ai/mcp/servers/mcpindex-ai/mcp-server-mcpindex)
|
|
223
|
+
|
|
220
224
|
Unofficial. Not affiliated with Anthropic.
|
package/manifest.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"manifest_version": "0.2",
|
|
3
|
+
"name": "mcp-server-mcpindex",
|
|
4
|
+
"display_name": "mcpindex",
|
|
5
|
+
"version": "0.3.8",
|
|
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
|
+
"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
|
+
"author": {
|
|
9
|
+
"name": "Bhartis LLC",
|
|
10
|
+
"email": "hello@mcpindex.ai",
|
|
11
|
+
"url": "https://mcpindex.ai"
|
|
12
|
+
},
|
|
13
|
+
"homepage": "https://mcpindex.ai",
|
|
14
|
+
"documentation": "https://mcpindex.ai/methodology",
|
|
15
|
+
"support": "https://github.com/mcpindex-ai/mcpindex-web/issues",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "https://github.com/mcpindex-ai/mcpindex-web"
|
|
19
|
+
},
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"keywords": [
|
|
22
|
+
"mcp",
|
|
23
|
+
"model-context-protocol",
|
|
24
|
+
"discovery",
|
|
25
|
+
"trust",
|
|
26
|
+
"tool-safety",
|
|
27
|
+
"registry"
|
|
28
|
+
],
|
|
29
|
+
"server": {
|
|
30
|
+
"type": "node",
|
|
31
|
+
"entry_point": "src/index.mjs",
|
|
32
|
+
"mcp_config": {
|
|
33
|
+
"command": "node",
|
|
34
|
+
"args": ["${__dirname}/src/index.mjs"],
|
|
35
|
+
"env": {
|
|
36
|
+
"MCPINDEX_API_BASE": "${user_config.api_base}"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"tools_generated": true,
|
|
41
|
+
"user_config": {
|
|
42
|
+
"api_base": {
|
|
43
|
+
"type": "string",
|
|
44
|
+
"title": "API base URL",
|
|
45
|
+
"description": "Override the mcpindex API base if you self-host. Leave as the default otherwise.",
|
|
46
|
+
"default": "https://mcpindex.ai",
|
|
47
|
+
"required": false
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"compatibility": {
|
|
51
|
+
"runtimes": {
|
|
52
|
+
"node": ">=18.0.0"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-server-mcpindex",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.8",
|
|
4
4
|
"mcpName": "io.github.gautamgb/mcp-server-mcpindex",
|
|
5
|
-
"description": "
|
|
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, Zed.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"mcp",
|
|
8
8
|
"model-context-protocol",
|
|
@@ -38,12 +38,15 @@
|
|
|
38
38
|
"src/",
|
|
39
39
|
"README.md",
|
|
40
40
|
"CHANGELOG.md",
|
|
41
|
-
"LICENSE"
|
|
41
|
+
"LICENSE",
|
|
42
|
+
"manifest.json"
|
|
42
43
|
],
|
|
43
44
|
"scripts": {
|
|
44
45
|
"build": "node --check src/index.mjs && node --check src/trust.mjs && node --check src/update-check.mjs",
|
|
45
46
|
"test": "node --test test/*.test.mjs",
|
|
46
47
|
"check-published": "node scripts/check-published.mjs",
|
|
48
|
+
"sync-glama": "node scripts/sync-glama-repo.mjs",
|
|
49
|
+
"bundle": "node scripts/bundle-mcpb.mjs",
|
|
47
50
|
"release": "node scripts/release.mjs"
|
|
48
51
|
},
|
|
49
52
|
"dependencies": {
|
package/src/index.mjs
CHANGED
|
@@ -12,15 +12,18 @@ import { createRequire } from 'node:module';
|
|
|
12
12
|
export { checkToolTrust, assessServer, VERDICT_CONTRACT_VERSION, V1_HONEST_LIMITS } from './trust.mjs';
|
|
13
13
|
import { notifyUpdateIfAvailable } from './update-check.mjs';
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
//
|
|
15
|
+
// `||` (not `??`) so an empty MCPINDEX_API_BASE - which some MCPB hosts substitute
|
|
16
|
+
// for an unset optional user_config field - falls back to the default instead of
|
|
17
|
+
// becoming "" and breaking every fetch with a relative URL.
|
|
18
|
+
const API_BASE = process.env.MCPINDEX_API_BASE || 'https://mcpindex.ai';
|
|
19
|
+
// Single source of truth for the running version - read from package.json so the
|
|
17
20
|
// User-Agent and the update-check can never drift from what npm actually shipped.
|
|
18
21
|
const PKG_VERSION = createRequire(import.meta.url)('../package.json').version;
|
|
19
22
|
|
|
20
23
|
const server = new Server(
|
|
21
24
|
{ name: 'mcp-server-mcpindex', version: PKG_VERSION },
|
|
22
25
|
// Tools only. We do NOT advertise `logging`: the update notice goes to stderr (which
|
|
23
|
-
// every host surfaces), not via `notifications/message` (rendered inconsistently
|
|
26
|
+
// every host surfaces), not via `notifications/message` (rendered inconsistently - Cursor
|
|
24
27
|
// logs it as a bare ` undefined`). stderr is the universal, clean channel.
|
|
25
28
|
{ capabilities: { tools: {} } },
|
|
26
29
|
);
|
|
@@ -106,7 +109,7 @@ const TOOLS = [
|
|
|
106
109
|
{
|
|
107
110
|
name: 'check_tool_trust',
|
|
108
111
|
description:
|
|
109
|
-
'Pre-invocation advisory screen for a specific tool on an MCP server. Returns an advisory verdict object (directive ALLOW | DENY | REVIEW | UNVERIFIED, dimensions, freshness). At v1 the public screen produces REVIEW or UNVERIFIED only
|
|
112
|
+
'Pre-invocation advisory screen for a specific tool on an MCP server. Returns an advisory verdict object (directive ALLOW | DENY | REVIEW | UNVERIFIED, dimensions, freshness). At v1 the public screen produces REVIEW or UNVERIFIED only - ALLOW/DENY are reserved. Not the in-path gate (mcpindex-gate). Agents SHOULD treat UNVERIFIED as "human review required", never as ALLOW.',
|
|
110
113
|
inputSchema: {
|
|
111
114
|
type: 'object',
|
|
112
115
|
properties: {
|
|
@@ -227,7 +230,7 @@ function formatRecommend(data) {
|
|
|
227
230
|
const lines = [`Top ${data.recommendations.length} for: "${data.task}"`, ''];
|
|
228
231
|
for (const r of data.recommendations) {
|
|
229
232
|
lines.push(`[${r.rank}] ${r.title} · QS ${r.qualityScore}/100 · ${r.category}`);
|
|
230
|
-
lines.push(` ${r.name}
|
|
233
|
+
lines.push(` ${r.name}`);
|
|
231
234
|
lines.push(` ${r.reasoning}`);
|
|
232
235
|
const install = r.installs.npm
|
|
233
236
|
? `npx -y ${r.installs.npm}`
|
|
@@ -292,7 +295,7 @@ const transport = new StdioServerTransport();
|
|
|
292
295
|
await server.connect(transport);
|
|
293
296
|
console.error('[mcp-server-mcpindex] connected via stdio');
|
|
294
297
|
|
|
295
|
-
// Fire-and-forget: tell the user if a newer version exists (stderr only
|
|
298
|
+
// Fire-and-forget: tell the user if a newer version exists (stderr only - the channel
|
|
296
299
|
// every host renders cleanly). Dropped onto the event loop AFTER connect so it can never
|
|
297
300
|
// delay or crash startup; all errors are swallowed inside.
|
|
298
301
|
notifyUpdateIfAvailable({ currentVersion: PKG_VERSION }).catch(() => {});
|
package/src/update-check.mjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
// update-check.mjs
|
|
1
|
+
// update-check.mjs - best-effort "a newer mcp-server-mcpindex exists" notice.
|
|
2
2
|
//
|
|
3
3
|
// Why this is safe to ship in a server that already egresses:
|
|
4
4
|
// - outbound to the PINNED npm registry host only, https, no redirect-following
|
|
5
5
|
// (no SSRF pivot), time-boxed, and fail-silent on ANY error;
|
|
6
|
-
// - fire-and-forget
|
|
6
|
+
// - fire-and-forget - it never blocks or crashes startup (the caller drops it
|
|
7
7
|
// onto the event loop after connect and ignores rejections);
|
|
8
8
|
// - no telemetry beyond the standard registry GET (no version of the user, no
|
|
9
|
-
// machine id
|
|
9
|
+
// machine id - just "what's the latest published version of this package");
|
|
10
10
|
// - opt-out via MCPINDEX_NO_UPDATE_CHECK.
|
|
11
11
|
//
|
|
12
12
|
// Pure + injectable (fetchImpl) so it is unit-testable with no network.
|
|
@@ -88,11 +88,11 @@ export async function fetchLatestVersion({
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
/** Orchestration: check, and if a newer version exists, emit the notice to STDERR only.
|
|
91
|
-
* stderr is the UNIVERSAL channel
|
|
91
|
+
* stderr is the UNIVERSAL channel - every MCP host (Cursor, Claude Desktop/Code, Gemini
|
|
92
92
|
* CLI, …) surfaces a spawned server's stderr in its per-server log. We deliberately do NOT
|
|
93
93
|
* emit an MCP `notifications/message`: hosts render it inconsistently (Cursor logs it as a
|
|
94
94
|
* bare ` undefined`, swallowing the text), so it only adds noise where stderr already
|
|
95
|
-
* carries the message cleanly. Returns the message it emitted (or null)
|
|
95
|
+
* carries the message cleanly. Returns the message it emitted (or null) - handy for
|
|
96
96
|
* tests/callers. Never throws; never blocks the caller (caller fire-and-forgets). */
|
|
97
97
|
export async function notifyUpdateIfAvailable({
|
|
98
98
|
currentVersion,
|
|
@@ -106,7 +106,7 @@ export async function notifyUpdateIfAvailable({
|
|
|
106
106
|
const latest = await fetchLatestVersion({ pkg, fetchImpl });
|
|
107
107
|
if (!latest || !isOlder(currentVersion, latest)) return null;
|
|
108
108
|
const msg = formatUpdateMessage(currentVersion, latest);
|
|
109
|
-
log(msg); // stderr
|
|
109
|
+
log(msg); // stderr - the one channel every host renders cleanly
|
|
110
110
|
return msg;
|
|
111
111
|
} catch {
|
|
112
112
|
return null; // belt-and-suspenders: this path must never surface an error
|