allmcps-server
Advanced tools
+26
-98
@@ -7,3 +7,3 @@ #!/usr/bin/env node | ||
| name: "allmcps-server", | ||
| version: "1.0.2", | ||
| version: "2.0.0", | ||
| }, { | ||
@@ -14,102 +14,30 @@ capabilities: { | ||
| }); | ||
| // The human-facing /api/submit requires a Turnstile CAPTCHA token that a headless | ||
| // agent has no way to solve. /api/v1/submit is the agent-facing counterpart: same | ||
| // insert path, no Turnstile, but it requires an email (for the claim/verify | ||
| // notification) since there's no browser session to fall back on. | ||
| const DIRECTORY_API_URL = process.env.ALLMCPS_API_URL || "https://allmcps.com/api/v1/submit"; | ||
| // This package is a thin stdio<->HTTP bridge to https://allmcps.com/api/mcp, the | ||
| // same JSON-RPC endpoint remote MCP clients call directly. Tool definitions and | ||
| // behavior (search, install configs, categories, boosting, submission, claim | ||
| // verification) live server-side and are fetched fresh on every request, so this | ||
| // package never goes stale relative to the live tool set and needs no republish | ||
| // when tools are added or changed remotely. | ||
| const MCP_ENDPOINT = process.env.ALLMCPS_MCP_URL || "https://allmcps.com/api/mcp"; | ||
| async function callRemote(method, params) { | ||
| const response = await fetch(MCP_ENDPOINT, { | ||
| method: "POST", | ||
| headers: { "Content-Type": "application/json" }, | ||
| body: JSON.stringify({ jsonrpc: "2.0", id: 1, method, params }), | ||
| }); | ||
| const data = (await response.json()); | ||
| if (data.error) { | ||
| throw new Error(data.error.message || "Remote MCP request failed."); | ||
| } | ||
| return data.result; | ||
| } | ||
| server.setRequestHandler(ListToolsRequestSchema, async () => { | ||
| return { | ||
| tools: [ | ||
| { | ||
| name: "submit_mcp", | ||
| description: "Submit a new Model Context Protocol (MCP) server to the AllMCPs directory.", | ||
| inputSchema: { | ||
| type: "object", | ||
| properties: { | ||
| url: { | ||
| type: "string", | ||
| description: "The GitHub repository URL or website of the MCP server.", | ||
| }, | ||
| name: { | ||
| type: "string", | ||
| description: "The name of the MCP server.", | ||
| }, | ||
| email: { | ||
| type: "string", | ||
| description: "Email address for the submission confirmation and listing claim/verify link. Not published on the listing.", | ||
| }, | ||
| description: { | ||
| type: "string", | ||
| description: "Optional. A brief description of what the server does. If omitted, it will try to pull from the GitHub repo description.", | ||
| }, | ||
| category: { | ||
| type: "string", | ||
| description: "Optional. The category of the server (e.g., 'Database', 'File System', 'Web Search', 'Development', 'Productivity').", | ||
| }, | ||
| }, | ||
| required: ["url", "name", "email"], | ||
| }, | ||
| }, | ||
| ], | ||
| }; | ||
| return await callRemote("tools/list"); | ||
| }); | ||
| server.setRequestHandler(CallToolRequestSchema, async (request) => { | ||
| if (request.params.name !== "submit_mcp") { | ||
| throw new Error(`Unknown tool: ${request.params.name}`); | ||
| } | ||
| const args = request.params.arguments; | ||
| if (!args.url) { | ||
| throw new Error("The 'url' argument is required."); | ||
| } | ||
| if (!args.name) { | ||
| throw new Error("The 'name' argument is required."); | ||
| } | ||
| if (!args.email) { | ||
| throw new Error("The 'email' argument is required (used for the submission confirmation and claim link)."); | ||
| } | ||
| try { | ||
| const response = await fetch(DIRECTORY_API_URL, { | ||
| method: "POST", | ||
| headers: { | ||
| "Content-Type": "application/json", | ||
| }, | ||
| body: JSON.stringify({ | ||
| url: args.url, | ||
| name: args.name, | ||
| email: args.email, | ||
| description: args.description, | ||
| category: args.category, | ||
| }), | ||
| return await callRemote("tools/call", { | ||
| name: request.params.name, | ||
| arguments: request.params.arguments, | ||
| }); | ||
| const data = await response.json(); | ||
| if (!response.ok) { | ||
| return { | ||
| content: [ | ||
| { | ||
| type: "text", | ||
| text: `Failed to submit MCP server. Error: ${JSON.stringify(data.error || data)}`, | ||
| }, | ||
| ], | ||
| isError: true, | ||
| }; | ||
| } | ||
| const lines = [ | ||
| `Successfully submitted "${args.name}" to AllMCPs.com!`, | ||
| `Message: ${data.message}`, | ||
| `The server is now in the 'pending' queue for review.`, | ||
| ]; | ||
| if (data.claim_url) { | ||
| lines.push(`\nClaim & verify this listing (get verified instantly by adding the badge below): ${data.claim_url}`); | ||
| } | ||
| if (data.badge_markdown) { | ||
| lines.push(`\nBadge markdown for your README:\n${data.badge_markdown}`); | ||
| } | ||
| return { | ||
| content: [ | ||
| { | ||
| type: "text", | ||
| text: lines.join("\n"), | ||
| }, | ||
| ], | ||
| }; | ||
| } | ||
@@ -121,3 +49,3 @@ catch (error) { | ||
| type: "text", | ||
| text: `Network error while submitting to the directory: ${error.message}`, | ||
| text: `Error calling AllMCPs: ${error.message}`, | ||
| }, | ||
@@ -132,3 +60,3 @@ ], | ||
| await server.connect(transport); | ||
| console.error("AllMCPs Meta Server running on stdio"); | ||
| console.error(`AllMCPs MCP Server running on stdio (proxying ${MCP_ENDPOINT})`); | ||
| } | ||
@@ -135,0 +63,0 @@ main().catch((error) => { |
+3
-2
| { | ||
| "name": "allmcps-server", | ||
| "version": "1.0.2", | ||
| "description": "The official MCP server for AllMCPs.com - submit and manage tools directly from your AI.", | ||
| "version": "2.0.0", | ||
| "mcpName": "io.github.jackalope-dev/allmcps-server", | ||
| "description": "The official MCP server for AllMCPs.com - search, browse, get install configs, and submit MCP servers directly from your AI agent.", | ||
| "main": "dist/index.js", | ||
@@ -6,0 +7,0 @@ "type": "module", |
+47
-16
@@ -1,8 +0,26 @@ | ||
| # allmcps-server | ||
| <p align="center"> | ||
| <img src="assets/logo.png" alt="AllMCPs logo" width="96" height="96"> | ||
| </p> | ||
| The official local MCP server for [AllMCPs.com](https://allmcps.com) — submit a Model Context Protocol (MCP) server to the directory directly from Claude, Cursor, or any MCP-compatible agent. | ||
| <h1 align="center">allmcps-server</h1> | ||
| <p align="center"> | ||
| <a href="https://allmcps.com/mcp/allmcps-server?verify=04aa8bd4-c85f-4470-b5b4-19d690d1cc11"><img src="https://allmcps.com/api/badge/allmcps-server" alt="AllMCPs Verified"></a> | ||
| <a href="https://www.npmjs.com/package/allmcps-server"><img src="https://img.shields.io/npm/v/allmcps-server.svg" alt="npm version"></a> | ||
| <a href="https://www.npmjs.com/package/allmcps-server"><img src="https://img.shields.io/npm/dm/allmcps-server.svg" alt="npm downloads"></a> | ||
| <a href="https://github.com/Jackalope-Dev/allmcps-server/blob/master/LICENSE"><img src="https://img.shields.io/npm/l/allmcps-server.svg" alt="MIT license"></a> | ||
| </p> | ||
| The official local MCP server for [AllMCPs.com](https://allmcps.com) — search, browse, get install configs for, and submit Model Context Protocol (MCP) servers directly from Claude, Cursor, or any MCP-compatible agent. | ||
| This package is a thin stdio bridge to the [AllMCPs remote MCP endpoint](https://allmcps.com/api/mcp). Tool | ||
| behavior lives server-side, so this package always exposes the current live tool set with no need to | ||
| upgrade the package when a tool is added or changed. | ||
| > **v2.0.0** replaces the single `submit_mcp` tool with the full tool set below, including a renamed | ||
| > `submit_mcp_server` (previously `submit_mcp`). If you depend on the old tool name, pin `allmcps-server@1`. | ||
| ## Install | ||
| Add to your MCP client config (e.g. `claude_desktop_config.json`): | ||
| Requires Node.js 18+. Add to your MCP client config (e.g. `claude_desktop_config.json`): | ||
@@ -22,21 +40,34 @@ ```json | ||
| ### `submit_mcp` | ||
| | Tool | Required arguments | Description | | ||
| | ----------------------- | --------------------- | ------------------------------------------------------------------------- | | ||
| | `search_mcp_servers` | — | Search the directory by keyword and/or category. | | ||
| | `get_mcp_install_config`| `id` | Get the install config snippet and docs for a server by ID. | | ||
| | `list_mcp_categories` | — | List all categories with server counts. | | ||
| | `get_boost_pricing` | — | Get pricing and features for boosting/featuring a listing. | | ||
| | `boost_mcp_server` | `id` | Start a sponsorship/boost order — returns a Stripe checkout URL and x402 invoice. | | ||
| | `get_boost_status` | `id` | Check boost and verified-badge status for a listing. | | ||
| | `submit_mcp_server` | `name`, `url`, `email`| Submit a new MCP server to the directory. | | ||
| | `verify_mcp_claim` | `id` | Verify ownership and claim a listing via GitHub README, site badge, or DNS. | | ||
| Submit a new MCP server to the AllMCPs directory. | ||
| `submit_mcp_server` submissions land in the `pending` review queue at [allmcps.com](https://allmcps.com). | ||
| The response includes a `claim_url` and a ready-to-paste `badge_markdown` snippet — adding that badge to | ||
| your repo's README verifies the listing instantly instead of waiting on manual review. | ||
| | Argument | Required | Description | | ||
| | ------------- | -------- | ------------------------------------------------------------------ | | ||
| | `url` | yes | GitHub repository URL or website of the MCP server | | ||
| | `name` | yes | Server name | | ||
| | `email` | yes | Where the claim/verify link and submission confirmation are sent — not published on the listing | | ||
| | `description` | no | Short summary (pulled from the repo description if omitted) | | ||
| | `category` | no | e.g. `Database`, `File System`, `Web Search`, `Development` | | ||
| Every tool's full input schema (including optional arguments like `category`, `description`, `sku`, and | ||
| `method`) is available at runtime via the standard MCP `tools/list` call, or by inspecting | ||
| [`/api/mcp`](https://allmcps.com/api/mcp) directly. | ||
| Submissions land in the `pending` review queue at [allmcps.com](https://allmcps.com). The response | ||
| includes a `claim_url` and a ready-to-paste `badge_markdown` snippet — adding that badge to your | ||
| repo's README verifies the listing instantly instead of waiting on manual review. | ||
| ## Configuration | ||
| | Environment variable | Default | Purpose | | ||
| | --------------------- | ------------------------------ | ----------------------------------------- | | ||
| | `ALLMCPS_MCP_URL` | `https://allmcps.com/api/mcp` | Override the remote endpoint this package bridges to. | | ||
| ## Related | ||
| - Directory API docs: https://allmcps.com/docs/api | ||
| - Remote MCP server (search, install configs, categories): https://allmcps.com/api/mcp | ||
| - Remote MCP server (same tools, called directly over HTTP): https://allmcps.com/api/mcp | ||
| ## License | ||
| MIT © [Jackalope Digital](https://jackalope.digital) — see [LICENSE](LICENSE). |
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
73
73.81%8561
-2.72%62
-53.73%