mcp-server-mcpindex 0.3.8 → 0.3.10
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 +14 -0
- package/README.md +24 -0
- package/manifest.json +2 -2
- package/package.json +3 -3
- package/src/index.mjs +28 -10
- package/src/tools-meta.json +32 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,20 @@ 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.10] - 2026-07-18
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **`get_install_command` no longer advertises or mislabels a `zed` client.** `zed` was in the client enum but the install builder never produced a zed config, so a zed request silently returned a different client's config under a `zed` header. Removed `zed` from the enum, and `formatInstall` now labels any fallback honestly (never presents one client's config under another client's name).
|
|
12
|
+
- **`check_tool_trust` schema example uses a real registry slug.** The `server_id` example was `"github"`, a short name that never resolves (always ERROR/UNVERIFIED); it now shows a real long-form slug (e.g. `io-github-microsoft-playwright-mcp`) and states it is not a short name.
|
|
13
|
+
- **`compare_servers` description no longer promises "transport types"** that the output table never contained.
|
|
14
|
+
|
|
15
|
+
## [0.3.9] - 2026-07-15
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
- **Tool descriptions now have a single source of truth (`src/tools-meta.json`).** The stdio CLI (`src/index.mjs`) and the hosted remote endpoint both import the shared name/title/description for the 6 tools, so their copy can no longer drift. Description text is byte-identical to 0.3.8; this is an internal refactor with no change to the advertised tool copy. Bumped so the refactored source is releasable to npm.
|
|
20
|
+
|
|
7
21
|
## [0.3.8] - 2026-07-15
|
|
8
22
|
|
|
9
23
|
### Fixed
|
package/README.md
CHANGED
|
@@ -12,6 +12,16 @@ npm install -g mcp-server-mcpindex
|
|
|
12
12
|
|
|
13
13
|
This is the **directory / advisory** client (recommend, search, trust). It does **not** install the in-path drift gate — that is `curl -fsSL https://mcpindex.ai/install.sh | sh`.
|
|
14
14
|
|
|
15
|
+
### Or connect remotely (no install)
|
|
16
|
+
|
|
17
|
+
Prefer not to install anything? mcpindex is also a **hosted remote MCP server**. Point any client that supports remote MCP (Claude connectors, Cursor, etc.) at:
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
https://mcpindex.ai/api/mcp
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Streamable HTTP, no credentials. Same six tools as the npm package.
|
|
24
|
+
|
|
15
25
|
### Claude Code
|
|
16
26
|
|
|
17
27
|
```bash
|
|
@@ -87,6 +97,8 @@ npx -y mcp-server-mcpindex@latest
|
|
|
87
97
|
|
|
88
98
|
`check_tool_trust` is the **directory client** integration surface (not the in-path `mcpindex-gate`). It lets agent frameworks (Composio, Mastra, LangChain, DSPy, raw LLM-tool-call loops) ask for an advisory screen verdict before dispatching a call. At v1 you will see REVIEW or UNVERIFIED — not a safety clearance.
|
|
89
99
|
|
|
100
|
+
> **Using Mastra?** The sibling package `@mcp-index/mastra` ships this exact screen as a ready-made `beforeToolCall` hook - `npm i @mcp-index/mastra`, no wiring required.
|
|
101
|
+
|
|
90
102
|
### Verdict contract (v1)
|
|
91
103
|
|
|
92
104
|
```jsonc
|
|
@@ -207,6 +219,18 @@ By default, calls go to `https://mcpindex.ai`. Override with `MCPINDEX_API_BASE=
|
|
|
207
219
|
|
|
208
220
|
The free tier is rate-limited to 60 req/min/IP. Paid keys are coming for higher throughput and the full evidence-bearing verdict (evidence quotes, LLM rationale, chain history).
|
|
209
221
|
|
|
222
|
+
## Related packages
|
|
223
|
+
|
|
224
|
+
Three ways to bring mcpindex into an agent, for different surfaces:
|
|
225
|
+
|
|
226
|
+
| Package | Install | What it does |
|
|
227
|
+
| --- | --- | --- |
|
|
228
|
+
| **`mcp-server-mcpindex`** *(this package)* | `npm i -g mcp-server-mcpindex` | Directory + advisory screen as an MCP server: find servers by task, and `check_tool_trust` before a call. |
|
|
229
|
+
| **`@mcp-index/mastra`** | `npm i @mcp-index/mastra` | The same advisory screen wired into Mastra as a `beforeToolCall` hook (warn / enforce). |
|
|
230
|
+
| **`@mcp-index/sdk`** | `npm i @mcp-index/sdk` | In-path drift gate: `wrap()` an MCP session and HOLD a call when a tool's contract drifts from your pin. |
|
|
231
|
+
|
|
232
|
+
**Advisory screen vs drift gate:** this package and `@mcp-index/mastra` ask mcpindex "has this tool been vetted?" (a network verdict). `@mcp-index/sdk` asks a different question locally: "did this tool's contract change since I pinned it?" Complementary, and none depends on another.
|
|
233
|
+
|
|
210
234
|
## License
|
|
211
235
|
|
|
212
236
|
MIT.
|
package/manifest.json
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
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.10",
|
|
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": {
|
|
9
|
-
"name": "
|
|
9
|
+
"name": "mcpindex.ai",
|
|
10
10
|
"email": "hello@mcpindex.ai",
|
|
11
11
|
"url": "https://mcpindex.ai"
|
|
12
12
|
},
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-server-mcpindex",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.10",
|
|
4
4
|
"mcpName": "io.github.gautamgb/mcp-server-mcpindex",
|
|
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
|
|
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": [
|
|
7
7
|
"mcp",
|
|
8
8
|
"model-context-protocol",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"bugs": {
|
|
25
25
|
"url": "https://github.com/mcpindex-ai/mcpindex-web/issues"
|
|
26
26
|
},
|
|
27
|
-
"author": "
|
|
27
|
+
"author": "mcpindex.ai <hello@mcpindex.ai>",
|
|
28
28
|
"license": "MIT",
|
|
29
29
|
"type": "module",
|
|
30
30
|
"main": "src/index.mjs",
|
package/src/index.mjs
CHANGED
|
@@ -19,6 +19,10 @@ const API_BASE = process.env.MCPINDEX_API_BASE || 'https://mcpindex.ai';
|
|
|
19
19
|
// Single source of truth for the running version - read from package.json so the
|
|
20
20
|
// User-Agent and the update-check can never drift from what npm actually shipped.
|
|
21
21
|
const PKG_VERSION = createRequire(import.meta.url)('../package.json').version;
|
|
22
|
+
// Single source of truth for tool name/description, shared with the hosted
|
|
23
|
+
// remote endpoint (mcpindex-web/app/api/[transport]/route.ts) so copy can't drift.
|
|
24
|
+
const TOOL_META = createRequire(import.meta.url)('./tools-meta.json');
|
|
25
|
+
const TOOL_DESC = Object.fromEntries(TOOL_META.map((m) => [m.name, m.description]));
|
|
22
26
|
|
|
23
27
|
const server = new Server(
|
|
24
28
|
{ name: 'mcp-server-mcpindex', version: PKG_VERSION },
|
|
@@ -32,7 +36,7 @@ const TOOLS = [
|
|
|
32
36
|
{
|
|
33
37
|
name: 'recommend_mcp_for_task',
|
|
34
38
|
description:
|
|
35
|
-
|
|
39
|
+
TOOL_DESC.recommend_mcp_for_task,
|
|
36
40
|
inputSchema: {
|
|
37
41
|
type: 'object',
|
|
38
42
|
properties: {
|
|
@@ -48,7 +52,7 @@ const TOOLS = [
|
|
|
48
52
|
{
|
|
49
53
|
name: 'search_mcp_servers',
|
|
50
54
|
description:
|
|
51
|
-
|
|
55
|
+
TOOL_DESC.search_mcp_servers,
|
|
52
56
|
inputSchema: {
|
|
53
57
|
type: 'object',
|
|
54
58
|
properties: {
|
|
@@ -70,7 +74,7 @@ const TOOLS = [
|
|
|
70
74
|
{
|
|
71
75
|
name: 'get_install_command',
|
|
72
76
|
description:
|
|
73
|
-
|
|
77
|
+
TOOL_DESC.get_install_command,
|
|
74
78
|
inputSchema: {
|
|
75
79
|
type: 'object',
|
|
76
80
|
properties: {
|
|
@@ -81,7 +85,11 @@ const TOOLS = [
|
|
|
81
85
|
},
|
|
82
86
|
client: {
|
|
83
87
|
type: 'string',
|
|
84
|
-
|
|
88
|
+
// Only clients the API actually generates a config for. 'zed' was advertised
|
|
89
|
+
// but never produced (buildInstalls has no zed branch), so a zed request silently
|
|
90
|
+
// fell back to another client's config; dropped until a real zed generator exists.
|
|
91
|
+
// formatInstall also labels any fallback honestly as defense-in-depth.
|
|
92
|
+
enum: ['claude-desktop', 'claude-code', 'cursor', 'gemini-cli', 'cline'],
|
|
85
93
|
description: 'Target client.',
|
|
86
94
|
},
|
|
87
95
|
},
|
|
@@ -91,7 +99,7 @@ const TOOLS = [
|
|
|
91
99
|
{
|
|
92
100
|
name: 'compare_servers',
|
|
93
101
|
description:
|
|
94
|
-
|
|
102
|
+
TOOL_DESC.compare_servers,
|
|
95
103
|
inputSchema: {
|
|
96
104
|
type: 'object',
|
|
97
105
|
properties: {
|
|
@@ -109,13 +117,14 @@ const TOOLS = [
|
|
|
109
117
|
{
|
|
110
118
|
name: 'check_tool_trust',
|
|
111
119
|
description:
|
|
112
|
-
|
|
120
|
+
TOOL_DESC.check_tool_trust,
|
|
113
121
|
inputSchema: {
|
|
114
122
|
type: 'object',
|
|
115
123
|
properties: {
|
|
116
124
|
server_id: {
|
|
117
125
|
type: 'string',
|
|
118
|
-
description:
|
|
126
|
+
description:
|
|
127
|
+
'Registry slug from search_mcp_servers / recommend results, e.g. "io-github-microsoft-playwright-mcp" (NOT a short name like "github").',
|
|
119
128
|
},
|
|
120
129
|
tool_name: {
|
|
121
130
|
type: 'string',
|
|
@@ -128,7 +137,7 @@ const TOOLS = [
|
|
|
128
137
|
{
|
|
129
138
|
name: 'assess_server',
|
|
130
139
|
description:
|
|
131
|
-
|
|
140
|
+
TOOL_DESC.assess_server,
|
|
132
141
|
inputSchema: {
|
|
133
142
|
type: 'object',
|
|
134
143
|
properties: {
|
|
@@ -262,15 +271,24 @@ function formatSearch(data) {
|
|
|
262
271
|
function formatInstall(server, client) {
|
|
263
272
|
// server here is the per-server JSON we expose at /api/v1/server/<slug>.
|
|
264
273
|
// Returns a code block with the appropriate install snippet.
|
|
265
|
-
const
|
|
274
|
+
const exact = (server.installs ?? []).find((i) => i.client === client);
|
|
275
|
+
const target = exact ?? server.installs?.[0];
|
|
266
276
|
if (!target) return `No install path available for ${server.name}`;
|
|
277
|
+
// Never mislabel a fallback as the requested client: if this server publishes no
|
|
278
|
+
// config for `client`, show the header for the config we're ACTUALLY returning and
|
|
279
|
+
// say so, so an agent doesn't paste (e.g.) a claude-desktop block into another client.
|
|
280
|
+
const shownClient = exact ? client : (target.client ?? client);
|
|
281
|
+
const fallbackNote = exact
|
|
282
|
+
? ''
|
|
283
|
+
: `\n(No ${client}-specific config published for this server; showing the ${shownClient} config.)`;
|
|
267
284
|
return [
|
|
268
|
-
`${server.title} (${server.name}) - ${
|
|
285
|
+
`${server.title} (${server.name}) - ${shownClient}`,
|
|
269
286
|
'',
|
|
270
287
|
target.json
|
|
271
288
|
? '```json\n' + target.json + '\n```'
|
|
272
289
|
: '```bash\n' + target.command + '\n```',
|
|
273
290
|
target.notes ? '\n' + target.notes : '',
|
|
291
|
+
fallbackNote,
|
|
274
292
|
`\n${server.url ?? `https://mcpindex.ai/server/${server.slug}`}`,
|
|
275
293
|
].join('\n');
|
|
276
294
|
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"name": "recommend_mcp_for_task",
|
|
4
|
+
"title": "Recommend MCP servers for a task",
|
|
5
|
+
"description": "Recommend the best MCP servers for a natural-language task. Returns top 3 ranked picks with reasoning, install commands, and quality scores. Use this when the user asks for the right MCP server for a task they want to do."
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"name": "search_mcp_servers",
|
|
9
|
+
"title": "Search MCP servers",
|
|
10
|
+
"description": "Keyword + semantic search across the full MCP server registry. Use when the user knows what tool category they want but not which server."
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "get_install_command",
|
|
14
|
+
"title": "Get install command",
|
|
15
|
+
"description": "Get the exact install command for a given MCP server and client. Returns a JSON block ready to paste into the client config."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "compare_servers",
|
|
19
|
+
"title": "Compare MCP servers",
|
|
20
|
+
"description": "Side-by-side comparison of 2-5 MCP servers - quality scores, install paths, env vars."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "check_tool_trust",
|
|
24
|
+
"title": "Check tool trust (advisory)",
|
|
25
|
+
"description": "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."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"name": "assess_server",
|
|
29
|
+
"title": "Assess server trust (advisory)",
|
|
30
|
+
"description": "Aggregated pre-flight trust assessment across all tools on an MCP server. Same verdict shape as check_tool_trust. Use for \"is THIS server worth integrating?\" decisions. v1 advisory; conformance monitored not enforced; verdicts may be UNVERIFIED if not yet probed."
|
|
31
|
+
}
|
|
32
|
+
]
|