@agentage/find-mcp 0.1.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/LICENSE +21 -0
- package/README.md +106 -0
- package/dist/bin/bootstrap.d.ts +10 -0
- package/dist/bin/bootstrap.d.ts.map +1 -0
- package/dist/bin/bootstrap.js +44 -0
- package/dist/bin/bootstrap.js.map +1 -0
- package/dist/bin/find-mcp.d.ts +3 -0
- package/dist/bin/find-mcp.d.ts.map +1 -0
- package/dist/bin/find-mcp.js +36 -0
- package/dist/bin/find-mcp.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/server/create-find-proxy.d.ts +6 -0
- package/dist/server/create-find-proxy.d.ts.map +1 -0
- package/dist/server/create-find-proxy.js +22 -0
- package/dist/server/create-find-proxy.js.map +1 -0
- package/dist/server/forward.d.ts +9 -0
- package/dist/server/forward.d.ts.map +1 -0
- package/dist/server/forward.js +53 -0
- package/dist/server/forward.js.map +1 -0
- package/dist/upstream.d.ts +17 -0
- package/dist/upstream.d.ts.map +1 -0
- package/dist/upstream.js +67 -0
- package/dist/upstream.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +7 -0
- package/dist/version.js.map +1 -0
- package/package.json +75 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Agentage
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# @agentage/find-mcp
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Give your AI a directory of 12,000+ tools. One command connects Claude, Cursor, or VS Code to
|
|
6
|
+
the public [agentage MCP directory](https://catalog.agentage.io/mcp), and your AI finds the
|
|
7
|
+
right tool in seconds - free, read-only, no sign-up.
|
|
8
|
+
|
|
9
|
+
## What is this?
|
|
10
|
+
|
|
11
|
+
AI apps like Claude and Cursor can use outside tools - for reading databases, sending email,
|
|
12
|
+
searching the web, and thousands of other things - through an open standard called
|
|
13
|
+
[MCP](https://modelcontextprotocol.io). The hard part is finding the right tool.
|
|
14
|
+
|
|
15
|
+
This package solves that: it gives your AI a searchable directory of 12,000+ of those tools,
|
|
16
|
+
so you can simply ask for what you need and let the AI find it. Nothing to install permanently,
|
|
17
|
+
no account, and it can only read the directory - it never changes anything on your machine.
|
|
18
|
+
|
|
19
|
+
Prefer to look around yourself? The same directory is browsable at
|
|
20
|
+
[catalog.agentage.io/mcp](https://catalog.agentage.io/mcp).
|
|
21
|
+
|
|
22
|
+
## Get started
|
|
23
|
+
|
|
24
|
+
Add this to your AI app, then ask away.
|
|
25
|
+
|
|
26
|
+
### Claude Desktop / Cursor / VS Code (`mcp.json`)
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
{
|
|
30
|
+
"mcpServers": {
|
|
31
|
+
"find-mcp": {
|
|
32
|
+
"command": "npx",
|
|
33
|
+
"args": ["-y", "@agentage/find-mcp"]
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Claude Code
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
claude mcp add find-mcp -- npx -y @agentage/find-mcp
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Then ask your AI things like
|
|
46
|
+
|
|
47
|
+
- "Find me a tool that connects you to Postgres."
|
|
48
|
+
- "Is there an MCP server for Notion? How do I install it?"
|
|
49
|
+
- "What are the most popular tools for browser automation?"
|
|
50
|
+
|
|
51
|
+
## Tools
|
|
52
|
+
|
|
53
|
+
The tool set is served by the remote directory (this proxy forwards it as-is):
|
|
54
|
+
|
|
55
|
+
| Tool | What it does |
|
|
56
|
+
| ---------------- | --------------------------------------------------------------------- |
|
|
57
|
+
| `mcp_search` | Find MCP servers by keyword, with category/language/license filters |
|
|
58
|
+
| `mcp_get` | Return one server's full packages, tools, and install command by slug |
|
|
59
|
+
| `mcp_categories` | List the category/language/license values you can filter on |
|
|
60
|
+
|
|
61
|
+
## How it works
|
|
62
|
+
|
|
63
|
+
This is the **npm client for the agentage MCP directory** - a thin stdio proxy that bridges
|
|
64
|
+
stdio-only MCP clients to the public remote endpoint `https://catalog.agentage.io/mcp`.
|
|
65
|
+
|
|
66
|
+
It is intentionally **tiny**: it holds no tool logic. On start it connects to the remote
|
|
67
|
+
directory over Streamable HTTP and forwards `tools/list` and `tools/call` verbatim, so upstream
|
|
68
|
+
tool changes flow through without republishing this package. Forwarding is bounded by the pinned
|
|
69
|
+
MCP SDK schemas, so a brand-new upstream tool field may need an SDK bump here to pass through.
|
|
70
|
+
The directory is **public and read-only** - no auth, no keys, nothing installed or executed.
|
|
71
|
+
|
|
72
|
+
### Remote clients don't need this package
|
|
73
|
+
|
|
74
|
+
Clients that support **remote** MCP servers can point straight at the Streamable HTTP endpoint:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
https://catalog.agentage.io/mcp
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
This package exists only to bridge **stdio-only** clients to that same endpoint.
|
|
81
|
+
|
|
82
|
+
## Configuration
|
|
83
|
+
|
|
84
|
+
| Env | Default | Purpose |
|
|
85
|
+
| ----------------- | ----------------------------------- | ---------------------------------------------------- |
|
|
86
|
+
| `FIND_MCP_URL` | `https://catalog.agentage.io/mcp` | Override the upstream endpoint (dev) |
|
|
87
|
+
| `CATALOG_MCP_URL` | - | Deprecated alias for `FIND_MCP_URL`, still accepted |
|
|
88
|
+
|
|
89
|
+
## Develop
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
npm install
|
|
93
|
+
npm test # vitest: in-process mock-upstream contract + forwarding tests
|
|
94
|
+
LIVE_SMOKE=1 npm test # also runs the live smoke against the real endpoint
|
|
95
|
+
npm run verify # type-check + lint + format:check + test + build
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Release
|
|
99
|
+
|
|
100
|
+
Releases publish to npm via GitHub Actions when a `chore(release): vX.Y.Z` commit that touches
|
|
101
|
+
`package.json` lands on `master` (the squash-merge subject of a release PR). The workflow skips
|
|
102
|
+
any version already on npm.
|
|
103
|
+
|
|
104
|
+
## License
|
|
105
|
+
|
|
106
|
+
MIT - see [LICENSE](./LICENSE).
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
2
|
+
import { UpstreamClient } from '../upstream.js';
|
|
3
|
+
export declare const HELP: string;
|
|
4
|
+
export declare const flagOutput: (argv: readonly string[]) => string | null;
|
|
5
|
+
export interface Bootstrapped {
|
|
6
|
+
upstream: UpstreamClient;
|
|
7
|
+
close: () => Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export declare const bootstrap: (transport: Transport) => Promise<Bootstrapped>;
|
|
10
|
+
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/bin/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAwB,MAAM,gBAAgB,CAAC;AAItE,eAAO,MAAM,IAAI,QAgBhB,CAAC;AAGF,eAAO,MAAM,UAAU,GAAI,MAAM,SAAS,MAAM,EAAE,KAAG,MAAM,GAAG,IAI7D,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAID,eAAO,MAAM,SAAS,GAAU,WAAW,SAAS,KAAG,OAAO,CAAC,YAAY,CAY1E,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { UpstreamClient, DEFAULT_FIND_MCP_URL } from '../upstream.js';
|
|
2
|
+
import { createFindProxyServer } from '../server/create-find-proxy.js';
|
|
3
|
+
import { PACKAGE_VERSION } from '../version.js';
|
|
4
|
+
export const HELP = `@agentage/find-mcp v${PACKAGE_VERSION}
|
|
5
|
+
|
|
6
|
+
A thin stdio MCP proxy that bridges stdio-only MCP clients (Claude Desktop,
|
|
7
|
+
Cursor, VS Code) to the public agentage MCP directory at ${DEFAULT_FIND_MCP_URL}.
|
|
8
|
+
It forwards tools/list and tools/call verbatim - no auth, read-only.
|
|
9
|
+
|
|
10
|
+
Usage:
|
|
11
|
+
npx -y @agentage/find-mcp Start the stdio server (default)
|
|
12
|
+
npx -y @agentage/find-mcp --help Show this help
|
|
13
|
+
npx -y @agentage/find-mcp --version
|
|
14
|
+
|
|
15
|
+
Env:
|
|
16
|
+
FIND_MCP_URL Override the upstream endpoint (default above)
|
|
17
|
+
CATALOG_MCP_URL Deprecated alias for FIND_MCP_URL (still accepted)
|
|
18
|
+
|
|
19
|
+
Docs: https://catalog.agentage.io/mcp
|
|
20
|
+
`;
|
|
21
|
+
// Resolve a --help/--version flag to the text to print, or null to start the server.
|
|
22
|
+
export const flagOutput = (argv) => {
|
|
23
|
+
if (argv.includes('--help') || argv.includes('-h'))
|
|
24
|
+
return HELP;
|
|
25
|
+
if (argv.includes('--version') || argv.includes('-v'))
|
|
26
|
+
return `${PACKAGE_VERSION}\n`;
|
|
27
|
+
return null;
|
|
28
|
+
};
|
|
29
|
+
// Wire a catalog proxy server onto the given transport and report readiness to
|
|
30
|
+
// stderr (stdout is the JSON-RPC wire). Returns a teardown for clean shutdown.
|
|
31
|
+
export const bootstrap = async (transport) => {
|
|
32
|
+
const upstream = new UpstreamClient();
|
|
33
|
+
const server = createFindProxyServer(upstream);
|
|
34
|
+
await server.connect(transport);
|
|
35
|
+
process.stderr.write(`[find-mcp] stdio ready, proxying to ${upstream.target}\n`);
|
|
36
|
+
return {
|
|
37
|
+
upstream,
|
|
38
|
+
close: async () => {
|
|
39
|
+
await server.close();
|
|
40
|
+
await upstream.close();
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/bin/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,CAAC,MAAM,IAAI,GAAG,uBAAuB,eAAe;;;2DAGC,oBAAoB;;;;;;;;;;;;;CAa9E,CAAC;AAEF,qFAAqF;AACrF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAuB,EAAiB,EAAE;IACnE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAChE,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,GAAG,eAAe,IAAI,CAAC;IACrF,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAOF,+EAA+E;AAC/E,+EAA+E;AAC/E,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,SAAoB,EAAyB,EAAE;IAC7E,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;IACjF,OAAO;QACL,QAAQ;QACR,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QACzB,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-mcp.d.ts","sourceRoot":"","sources":["../../src/bin/find-mcp.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @agentage/find-mcp - the stdio MCP client for the agentage MCP directory.
|
|
3
|
+
// `npx @agentage/find-mcp` bridges a stdio MCP client (Claude Desktop, Cursor,
|
|
4
|
+
// VS Code) to the public remote endpoint catalog.agentage.io/mcp, forwarding
|
|
5
|
+
// tools/list and tools/call verbatim. No auth - the directory is public, read-only.
|
|
6
|
+
//
|
|
7
|
+
// stdout is the JSON-RPC wire; ALL diagnostics MUST go to stderr.
|
|
8
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
9
|
+
import { bootstrap, flagOutput } from './bootstrap.js';
|
|
10
|
+
const main = async () => {
|
|
11
|
+
const out = flagOutput(process.argv.slice(2));
|
|
12
|
+
if (out !== null) {
|
|
13
|
+
process.stdout.write(out);
|
|
14
|
+
process.exit(0);
|
|
15
|
+
}
|
|
16
|
+
const app = await bootstrap(new StdioServerTransport());
|
|
17
|
+
// The SDK stdio transport doesn't exit when the host closes stdin, so drive a
|
|
18
|
+
// clean shutdown ourselves. Guarded so overlapping signals tear down once.
|
|
19
|
+
let closing = false;
|
|
20
|
+
const shutdown = async () => {
|
|
21
|
+
if (closing)
|
|
22
|
+
return;
|
|
23
|
+
closing = true;
|
|
24
|
+
await app.close();
|
|
25
|
+
process.exit(0);
|
|
26
|
+
};
|
|
27
|
+
process.stdin.on('end', () => void shutdown());
|
|
28
|
+
process.on('SIGINT', () => void shutdown());
|
|
29
|
+
process.on('SIGTERM', () => void shutdown());
|
|
30
|
+
};
|
|
31
|
+
main().catch((err) => {
|
|
32
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
33
|
+
process.stderr.write(`[find-mcp] fatal: ${message}\n`);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=find-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-mcp.js","sourceRoot":"","sources":["../../src/bin/find-mcp.ts"],"names":[],"mappings":";AACA,4EAA4E;AAC5E,+EAA+E;AAC/E,6EAA6E;AAC7E,oFAAoF;AACpF,EAAE;AACF,kEAAkE;AAElE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;IACrC,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IAExD,8EAA8E;IAC9E,2EAA2E;IAC3E,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,QAAQ,GAAG,KAAK,IAAmB,EAAE;QACzC,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,OAAO,IAAI,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { UpstreamClient, DEFAULT_FIND_MCP_URL, type UpstreamOptions } from './upstream.js';
|
|
2
|
+
export { createFindProxyServer, SERVER_NAME, SERVER_TITLE } from './server/create-find-proxy.js';
|
|
3
|
+
export { forward } from './server/forward.js';
|
|
4
|
+
export { PACKAGE_VERSION } from './version.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// @agentage/find-mcp public API - a thin stdio MCP proxy to the agentage MCP directory.
|
|
2
|
+
export { UpstreamClient, DEFAULT_FIND_MCP_URL } from './upstream.js';
|
|
3
|
+
export { createFindProxyServer, SERVER_NAME, SERVER_TITLE } from './server/create-find-proxy.js';
|
|
4
|
+
export { forward } from './server/forward.js';
|
|
5
|
+
export { PACKAGE_VERSION } from './version.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAwB,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import type { UpstreamClient } from '../upstream.js';
|
|
3
|
+
export declare const SERVER_NAME = "find-mcp";
|
|
4
|
+
export declare const SERVER_TITLE = "Find MCP \u2014 Agentage MCP Directory";
|
|
5
|
+
export declare const createFindProxyServer: (upstream: UpstreamClient) => Server;
|
|
6
|
+
//# sourceMappingURL=create-find-proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-find-proxy.d.ts","sourceRoot":"","sources":["../../src/server/create-find-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAOnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIrD,eAAO,MAAM,WAAW,aAAa,CAAC;AACtC,eAAO,MAAM,YAAY,2CAAsC,CAAC;AAQhE,eAAO,MAAM,qBAAqB,GAAI,UAAU,cAAc,KAAG,MAmBhE,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { CallToolRequestSchema, CallToolResultSchema, ListToolsRequestSchema, ListToolsResultSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import { forward } from './forward.js';
|
|
4
|
+
import { PACKAGE_VERSION } from '../version.js';
|
|
5
|
+
export const SERVER_NAME = 'find-mcp';
|
|
6
|
+
export const SERVER_TITLE = 'Find MCP — Agentage MCP Directory';
|
|
7
|
+
const INSTRUCTIONS = 'A public directory of Model Context Protocol (MCP) servers, crawled from the official registry. Use it to discover, compare, and look up MCP servers on request ("is there an MCP for X", "which MCP server does Y"). mcp_search finds servers by keyword and filters; mcp_get returns one server\'s full packages, tools, and install command by slug; mcp_categories lists the category/language/license values you can filter on. Read-only - it never installs or runs anything. This package is a thin stdio proxy to catalog.agentage.io/mcp; the tool set is served by the remote and may evolve.';
|
|
8
|
+
// A low-level MCP Server that forwards tools/list and tools/call to the remote
|
|
9
|
+
// directory verbatim - tools are NOT hard-coded, so upstream changes flow through
|
|
10
|
+
// without republishing this package.
|
|
11
|
+
export const createFindProxyServer = (upstream) => {
|
|
12
|
+
const server = new Server({
|
|
13
|
+
name: SERVER_NAME,
|
|
14
|
+
title: SERVER_TITLE,
|
|
15
|
+
version: PACKAGE_VERSION,
|
|
16
|
+
websiteUrl: 'https://catalog.agentage.io/mcp',
|
|
17
|
+
}, { capabilities: { tools: {} }, instructions: INSTRUCTIONS });
|
|
18
|
+
server.setRequestHandler(ListToolsRequestSchema, (req) => forward(upstream, { method: 'tools/list', params: req.params }, ListToolsResultSchema));
|
|
19
|
+
server.setRequestHandler(CallToolRequestSchema, (req) => forward(upstream, { method: 'tools/call', params: req.params }, CallToolResultSchema));
|
|
20
|
+
return server;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=create-find-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-find-proxy.js","sourceRoot":"","sources":["../../src/server/create-find-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,mCAAmC,CAAC;AAEhE,MAAM,YAAY,GAChB,0kBAA0kB,CAAC;AAE7kB,+EAA+E;AAC/E,kFAAkF;AAClF,qCAAqC;AACrC,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,QAAwB,EAAU,EAAE;IACxE,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;QACE,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,eAAe;QACxB,UAAU,EAAE,iCAAiC;KAC9C,EACD,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,CAC5D,CAAC;IAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,CAAC,GAAG,EAAE,EAAE,CACvD,OAAO,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CACvF,CAAC;IACF,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,CAAC,GAAG,EAAE,EAAE,CACtD,OAAO,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CACtF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AnySchema, SchemaOutput } from '@modelcontextprotocol/sdk/server/zod-compat.js';
|
|
2
|
+
import type { UpstreamClient } from '../upstream.js';
|
|
3
|
+
interface ForwardRequest {
|
|
4
|
+
method: string;
|
|
5
|
+
params?: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
export declare const forward: <T extends AnySchema>(upstream: UpstreamClient, request: ForwardRequest, resultSchema: T) => Promise<SchemaOutput<T>>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=forward.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forward.d.ts","sourceRoot":"","sources":["../../src/server/forward.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gDAAgD,CAAC;AAC9F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AA0CD,eAAO,MAAM,OAAO,GAAU,CAAC,SAAS,SAAS,EAC/C,UAAU,cAAc,EACxB,SAAS,cAAc,EACvB,cAAc,CAAC,KACd,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAazB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { StreamableHTTPError } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
3
|
+
const isDisconnect = (err) => err instanceof McpError && err.code === ErrorCode.ConnectionClosed;
|
|
4
|
+
// Recover an embedded JSON-RPC error ({ code, message }) from an HTTP-error body,
|
|
5
|
+
// so the upstream rate-limit envelope (HTTP 429 + code -32000) passes through.
|
|
6
|
+
const embeddedRpcError = (message) => {
|
|
7
|
+
const start = message.indexOf('{');
|
|
8
|
+
if (start === -1)
|
|
9
|
+
return null;
|
|
10
|
+
try {
|
|
11
|
+
const body = JSON.parse(message.slice(start));
|
|
12
|
+
const code = body.error?.code;
|
|
13
|
+
if (typeof code !== 'number')
|
|
14
|
+
return null;
|
|
15
|
+
return new McpError(code, body.error?.message ?? 'upstream error');
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
// Upstream JSON-RPC errors pass through verbatim; an HTTP error surfaces its
|
|
22
|
+
// embedded JSON-RPC code (e.g. -32000 rate limit) or a clear InternalError.
|
|
23
|
+
// Transport/unreachable errors become an InternalError - never a crash.
|
|
24
|
+
const toRpcError = (err) => {
|
|
25
|
+
if (err instanceof McpError)
|
|
26
|
+
return err;
|
|
27
|
+
if (err instanceof StreamableHTTPError) {
|
|
28
|
+
return (embeddedRpcError(err.message) ??
|
|
29
|
+
new McpError(ErrorCode.InternalError, `catalog upstream error (HTTP ${err.code}): ${err.message}`));
|
|
30
|
+
}
|
|
31
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
32
|
+
return new McpError(ErrorCode.InternalError, `catalog upstream unreachable: ${message}`);
|
|
33
|
+
};
|
|
34
|
+
// Forward one request to the upstream client and return the response verbatim.
|
|
35
|
+
// A dropped connection reconnects once before giving up.
|
|
36
|
+
export const forward = async (upstream, request, resultSchema) => {
|
|
37
|
+
const client = await upstream.get();
|
|
38
|
+
try {
|
|
39
|
+
return await client.request(request, resultSchema);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
if (!isDisconnect(err))
|
|
43
|
+
throw toRpcError(err);
|
|
44
|
+
upstream.reset(client);
|
|
45
|
+
try {
|
|
46
|
+
return await (await upstream.get()).request(request, resultSchema);
|
|
47
|
+
}
|
|
48
|
+
catch (retryErr) {
|
|
49
|
+
throw toRpcError(retryErr);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=forward.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forward.js","sourceRoot":"","sources":["../../src/server/forward.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oDAAoD,CAAC;AASzF,MAAM,YAAY,GAAG,CAAC,GAAY,EAAW,EAAE,CAC7C,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,gBAAgB,CAAC;AAErE,kFAAkF;AAClF,+EAA+E;AAC/E,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAmB,EAAE;IAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAE3C,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;QAC9B,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1C,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,gBAAgB,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,6EAA6E;AAC7E,4EAA4E;AAC5E,wEAAwE;AACxE,MAAM,UAAU,GAAG,CAAC,GAAY,EAAY,EAAE;IAC5C,IAAI,GAAG,YAAY,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxC,IAAI,GAAG,YAAY,mBAAmB,EAAE,CAAC;QACvC,OAAO,CACL,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;YAC7B,IAAI,QAAQ,CACV,SAAS,CAAC,aAAa,EACvB,gCAAgC,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,CAC5D,CACF,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,IAAI,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,iCAAiC,OAAO,EAAE,CAAC,CAAC;AAC3F,CAAC,CAAC;AAEF,+EAA+E;AAC/E,yDAAyD;AACzD,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC1B,QAAwB,EACxB,OAAuB,EACvB,YAAe,EACW,EAAE;IAC5B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;YAAE,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QAC9C,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvB,IAAI,CAAC;YACH,OAAO,MAAM,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,QAAQ,EAAE,CAAC;YAClB,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
export declare const DEFAULT_FIND_MCP_URL = "https://catalog.agentage.io/mcp";
|
|
3
|
+
export interface UpstreamOptions {
|
|
4
|
+
url?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class UpstreamClient {
|
|
7
|
+
private client;
|
|
8
|
+
private connecting;
|
|
9
|
+
private readonly url;
|
|
10
|
+
constructor(opts?: UpstreamOptions);
|
|
11
|
+
get target(): string;
|
|
12
|
+
get(): Promise<Client>;
|
|
13
|
+
reset(client: Client): void;
|
|
14
|
+
close(): Promise<void>;
|
|
15
|
+
private connect;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=upstream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upstream.d.ts","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAInE,eAAO,MAAM,oBAAoB,oCAAoC,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAaD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;gBAEd,IAAI,GAAE,eAAoB;IAItC,IAAI,MAAM,IAAI,MAAM,CAEnB;IAEK,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;IAc5B,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAYd,OAAO;CAatB"}
|
package/dist/upstream.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
3
|
+
import { PACKAGE_VERSION } from './version.js';
|
|
4
|
+
export const DEFAULT_FIND_MCP_URL = 'https://catalog.agentage.io/mcp';
|
|
5
|
+
// Resolve the upstream endpoint: explicit option -> FIND_MCP_URL env -> the deprecated
|
|
6
|
+
// CATALOG_MCP_URL env (still accepted) -> default.
|
|
7
|
+
const resolveUrl = (opts) => new URL(opts.url ?? process.env.FIND_MCP_URL ?? process.env.CATALOG_MCP_URL ?? DEFAULT_FIND_MCP_URL);
|
|
8
|
+
// A lazily-connected SDK Client to the remote catalog over Streamable HTTP. One
|
|
9
|
+
// in-flight connect is shared across concurrent calls; a dropped connection is
|
|
10
|
+
// reconnected on the next get(). All slot mutations are identity-guarded so a
|
|
11
|
+
// concurrent reset()+reconnect never double-connects or orphans a socket.
|
|
12
|
+
export class UpstreamClient {
|
|
13
|
+
client = null;
|
|
14
|
+
connecting = null;
|
|
15
|
+
url;
|
|
16
|
+
constructor(opts = {}) {
|
|
17
|
+
this.url = resolveUrl(opts);
|
|
18
|
+
}
|
|
19
|
+
get target() {
|
|
20
|
+
return this.url.href;
|
|
21
|
+
}
|
|
22
|
+
async get() {
|
|
23
|
+
if (this.client)
|
|
24
|
+
return this.client;
|
|
25
|
+
if (!this.connecting) {
|
|
26
|
+
const pending = this.connect().finally(() => {
|
|
27
|
+
// Only clear the slot this exact attempt still owns.
|
|
28
|
+
if (this.connecting === pending)
|
|
29
|
+
this.connecting = null;
|
|
30
|
+
});
|
|
31
|
+
this.connecting = pending;
|
|
32
|
+
}
|
|
33
|
+
return this.connecting;
|
|
34
|
+
}
|
|
35
|
+
// Drop a client known to be dead so the next get() reconnects. Identity-guarded:
|
|
36
|
+
// a concurrent caller that already installed a newer client is left untouched.
|
|
37
|
+
reset(client) {
|
|
38
|
+
if (this.client === client)
|
|
39
|
+
this.client = null;
|
|
40
|
+
}
|
|
41
|
+
// Tear down the live client (if any); tolerant of a never-connected instance.
|
|
42
|
+
async close() {
|
|
43
|
+
const client = this.client;
|
|
44
|
+
this.client = null;
|
|
45
|
+
this.connecting = null;
|
|
46
|
+
if (!client)
|
|
47
|
+
return;
|
|
48
|
+
try {
|
|
49
|
+
await client.close();
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// best-effort teardown - never throw on shutdown.
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async connect() {
|
|
56
|
+
const client = new Client({ name: 'agentage-find-mcp', version: PACKAGE_VERSION }, { capabilities: {} });
|
|
57
|
+
client.onclose = () => {
|
|
58
|
+
// Forget this client only if a newer one has not replaced it.
|
|
59
|
+
if (this.client === client)
|
|
60
|
+
this.client = null;
|
|
61
|
+
};
|
|
62
|
+
await client.connect(new StreamableHTTPClientTransport(this.url));
|
|
63
|
+
this.client = client;
|
|
64
|
+
return client;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=upstream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upstream.js","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,iCAAiC,CAAC;AAMtE,uFAAuF;AACvF,mDAAmD;AACnD,MAAM,UAAU,GAAG,CAAC,IAAqB,EAAO,EAAE,CAChD,IAAI,GAAG,CACL,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,oBAAoB,CAC5F,CAAC;AAEJ,gFAAgF;AAChF,+EAA+E;AAC/E,8EAA8E;AAC9E,0EAA0E;AAC1E,MAAM,OAAO,cAAc;IACjB,MAAM,GAAkB,IAAI,CAAC;IAC7B,UAAU,GAA2B,IAAI,CAAC;IACjC,GAAG,CAAM;IAE1B,YAAY,OAAwB,EAAE;QACpC,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,GAAG;QACP,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,OAAO,GAAoB,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC3D,qDAAqD;gBACrD,IAAI,IAAI,CAAC,UAAU,KAAK,OAAO;oBAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YAC1D,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,iFAAiF;IACjF,+EAA+E;IAC/E,KAAK,CAAC,MAAc;QAClB,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACjD,CAAC;IAED,8EAA8E;IAC9E,KAAK,CAAC,KAAK;QACT,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,eAAe,EAAE,EACvD,EAAE,YAAY,EAAE,EAAE,EAAE,CACrB,CAAC;QACF,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE;YACpB,8DAA8D;YAC9D,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;gBAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACjD,CAAC,CAAC;QACF,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,6BAA6B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,eAAe,QAAc,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
// Read the package version at runtime; a static import of package.json would break
|
|
3
|
+
// tsc's rootDir:src. `../` climbs to the package root from both src (tests) and dist.
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
const pkg = require('../package.json');
|
|
6
|
+
export const PACKAGE_VERSION = pkg.version;
|
|
7
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,mFAAmF;AACnF,sFAAsF;AACtF,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@agentage/find-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"mcpName": "io.agentage/find-mcp",
|
|
5
|
+
"description": "Find MCP - the npm client for the agentage MCP directory: thin stdio MCP proxy bridging stdio-only clients (Claude Desktop, Cursor, VS Code) to catalog.agentage.io/mcp - search 12,000+ MCP servers from any MCP client.",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"mcp",
|
|
8
|
+
"mcp-server",
|
|
9
|
+
"model-context-protocol",
|
|
10
|
+
"find-mcp",
|
|
11
|
+
"mcp-catalog",
|
|
12
|
+
"mcp-registry",
|
|
13
|
+
"claude",
|
|
14
|
+
"cursor",
|
|
15
|
+
"agentage"
|
|
16
|
+
],
|
|
17
|
+
"type": "module",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/agentage/find-mcp.git"
|
|
22
|
+
},
|
|
23
|
+
"homepage": "https://catalog.agentage.io/mcp",
|
|
24
|
+
"main": "dist/index.js",
|
|
25
|
+
"types": "dist/index.d.ts",
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"default": "./dist/index.js"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public"
|
|
34
|
+
},
|
|
35
|
+
"bin": {
|
|
36
|
+
"agentage-find-mcp": "dist/bin/find-mcp.js"
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist"
|
|
40
|
+
],
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=22.0.0",
|
|
43
|
+
"npm": ">=10.0.0"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "tsc -p tsconfig.build.json",
|
|
47
|
+
"type-check": "tsc --noEmit",
|
|
48
|
+
"lint": "eslint src test",
|
|
49
|
+
"lint:fix": "eslint src test --fix",
|
|
50
|
+
"format": "prettier --write \"{src,test}/**/*.ts\"",
|
|
51
|
+
"format:check": "prettier --check \"{src,test}/**/*.ts\"",
|
|
52
|
+
"test": "vitest run",
|
|
53
|
+
"test:watch": "vitest",
|
|
54
|
+
"test:coverage": "vitest run --coverage",
|
|
55
|
+
"clean": "rm -rf dist *.tsbuildinfo coverage",
|
|
56
|
+
"verify": "npm run type-check && npm run lint && npm run format:check && npm run test && npm run build",
|
|
57
|
+
"prepublishOnly": "npm run verify"
|
|
58
|
+
},
|
|
59
|
+
"dependencies": {
|
|
60
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
61
|
+
"zod": "^4.4.3"
|
|
62
|
+
},
|
|
63
|
+
"devDependencies": {
|
|
64
|
+
"@types/node": "^26.1.1",
|
|
65
|
+
"@typescript-eslint/eslint-plugin": "^8.18.0",
|
|
66
|
+
"@typescript-eslint/parser": "^8.18.0",
|
|
67
|
+
"@vitest/coverage-v8": "^4.1.10",
|
|
68
|
+
"eslint": "^10.7.0",
|
|
69
|
+
"eslint-config-prettier": "^10.1.8",
|
|
70
|
+
"eslint-plugin-prettier": "^5.2.1",
|
|
71
|
+
"prettier": "^3.4.2",
|
|
72
|
+
"typescript": "^6.0.3",
|
|
73
|
+
"vitest": "^4.1.10"
|
|
74
|
+
}
|
|
75
|
+
}
|