@toolsdk.ai/registry 1.0.167 → 1.0.169

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/README.md CHANGED
@@ -12,14 +12,14 @@
12
12
  <a href="https://github.com/toolsdk-ai/toolsdk-mcp-registry/actions/workflows/test.yaml">
13
13
  <img src="https://github.com/toolsdk-ai/toolsdk-mcp-registry/actions/workflows/test.yaml/badge.svg" alt="Build Status" />
14
14
  </a>
15
- <img src="https://img.shields.io/badge/MCP_Servers-4545-blue?style=flat-square" alt="MCP Servers Count" />
15
+ <img src="https://img.shields.io/badge/MCP_Servers-4547-blue?style=flat-square" alt="MCP Servers Count" />
16
16
  <img src="https://img.shields.io/badge/LICENSE-MIT-ff69b4?style=flat-square" alt="License" />
17
17
  <br />
18
18
  <a href="https://www.producthunt.com/products/toolsdk-ai">
19
19
  <img src="https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=997428&theme=light&period=daily" alt="Product Hunt" height="40" />
20
20
  </a>
21
21
 
22
- <a href="#mcp-servers">🔍 <b>Browse 4545+ Tools</b></a>
22
+ <a href="#mcp-servers">🔍 <b>Browse 4547+ Tools</b></a>
23
23
  &nbsp;&nbsp;•&nbsp;&nbsp;
24
24
  <a href="#quick-start">🐳 <b>Self-hosted</b></a>
25
25
  &nbsp;&nbsp;•&nbsp;&nbsp;
@@ -75,7 +75,7 @@ docker compose up -d
75
75
  - *See [Configuration Guide](./docs/DEVELOPMENT.md) for full details.*
76
76
 
77
77
  > [!TIP]
78
- > **Tip for Private Deployment**: This registry contains 4545+ public MCP servers. If you only need a specific subset for your private environment, you can prune the `packages/` directory.
78
+ > **Tip for Private Deployment**: This registry contains 4547+ public MCP servers. If you only need a specific subset for your private environment, you can prune the `packages/` directory.
79
79
  > 📖 See [Package Management Guide](./docs/DEVELOPMENT.md#5--package-management-for-private-deployment) for details.
80
80
 
81
81
  That's it! Your self-hosted MCP registry is now running with:
@@ -87,7 +87,7 @@ That's it! Your self-hosted MCP registry is now running with:
87
87
 
88
88
  - 🌐 **Local Web Interface**: http://localhost:3003
89
89
  - 📚 **Swagger API Docs**: http://localhost:3003/swagger
90
- - 🔍 **Search & Execute** 4545+ MCP Servers remotely
90
+ - 🔍 **Search & Execute** 4547+ MCP Servers remotely
91
91
  - 🤖 **Integrate** with your AI agents, chatbots, and LLM applications
92
92
 
93
93
  #### 🌐 Remote Tool Execution Example
@@ -221,7 +221,7 @@ graph TD
221
221
 
222
222
  This open-source project provides:
223
223
 
224
- - **Structured Registry** - 4545+ MCP servers with metadata
224
+ - **Structured Registry** - 4547+ MCP servers with metadata
225
225
  - **Unified Gateway** - HTTP API to query and execute tools remotely
226
226
  - **Auto-Generated Docs** - Always up-to-date README and API documentation
227
227
 
@@ -320,12 +320,12 @@ Your MCP server will be:
320
320
 
321
321
  ## MCP Servers Directory
322
322
 
323
- **4545+ AI Agent Tools, LLM Integrations & Automation Servers**
323
+ **4547+ AI Agent Tools, LLM Integrations & Automation Servers**
324
324
 
325
325
  > [!NOTE]
326
326
  > ⭐ **Featured below**: Hand-picked, production-ready MCP servers verified by our team.
327
327
  >
328
- > 📚 **Looking for all 4545+ servers?** Check out [**All MCP Servers**](./docs/ALL-MCP-SERVERS.md) for the complete list.
328
+ > 📚 **Looking for all 4547+ servers?** Check out [**All MCP Servers**](./docs/ALL-MCP-SERVERS.md) for the complete list.
329
329
 
330
330
  > [!TIP]
331
331
  > If a package is marked as `validated: true` in the index, you can usually wire it up in minutes via ToolSDK (e.g. `getAISDKTool(toolKey)`).
@@ -996,6 +996,7 @@ Work with financial data, market info, and trading platforms using AI tools.
996
996
  - [✅ setu_mcp_kyc](https://github.com/setuhq/setu-mcps/tree/HEAD/kyc): Integrates Setu's Digital Gateway APIs to provide KYC verification tools for PAN, GST, and name matching, enabling automated identity checks and regulatory compliance. (3 tools) (python)
997
997
  - [✅ setu_mcp_upi_deeplinks](https://github.com/setuhq/setu-mcps/tree/HEAD/upi-deeplinks): Integrates Setu's UPI payment infrastructure to enable seamless generation and management of payment links for applications. (5 tools) (python)
998
998
  - [✅ square-mcp-server](https://github.com/square/square-mcp-server): Provides a bridge between Square's complete API ecosystem and conversational interfaces, enabling comprehensive e-commerce and payment processing capabilities including payments, orders, inventory, and customer management. (3 tools) (node)
999
+ - [✅ supercolony-mcp](https://github.com/TheSuperColony/supercolony-mcp): Real-time intelligence from 140+ autonomous AI agents publishing on-chain observations, analyses, and predictions on Demos blockchain. Tools for feed reading, search, consensus signals, agent profiles, leaderboard, and network stats. (7 tools) (node)
999
1000
  - [✅ tesouro-direto-mcp](https://github.com/atilioa/tesouro-direto-mcp): Provides real-time access to Brazil's Treasury Direct bond market data, enabling users to retrieve market status, search bonds by type and maturity date, and access detailed information for investment analysis. (3 tools) (node)
1000
1001
  - [✅ xero-mcp](https://github.com/john-zhang-dev/xero-mcp): Integrates with Xero Accounting Software to access financial data including accounts, transactions, contacts, invoices, and more through authenticated API connections for financial analysis and bookkeeping tasks. (12 tools) (node)
1001
1002
  - [✅ yfmcp](https://github.com/narumiruna/yfinance-mcp): Provides real-time financial data from Yahoo Finance through specialized tools for retrieving stock information, market trends, and news for investment research and analysis. (5 tools) (python)
package/dist/api/index.js CHANGED
@@ -1,9 +1,11 @@
1
1
  import { readFileSync } from "node:fs";
2
+ import { createServer } from "node:http";
2
3
  import { join } from "node:path";
3
- import { serve } from "@hono/node-server";
4
+ import { getRequestListener } from "@hono/node-server";
4
5
  import { swaggerUI } from "@hono/swagger-ui";
5
6
  import { OpenAPIHono } from "@hono/zod-openapi";
6
7
  import { configRoutes } from "../domains/config/config-route";
8
+ import { createMcpGatewayHandler } from "../domains/mcp-gateway/mcp-gateway";
7
9
  import { oauthDemoRoutes, oauthRoutes } from "../domains/oauth/oauth-route";
8
10
  import { repository } from "../domains/package/package-handler";
9
11
  import { packageRoutes } from "../domains/package/package-route";
@@ -76,9 +78,44 @@ app.onError((err, c) => {
76
78
  }, 500);
77
79
  });
78
80
  const port = getServerPort();
79
- serve({
80
- fetch: app.fetch,
81
- port,
81
+ // MCP Gateway handler — intercepts /mcp/:packageName before Hono
82
+ const mcpGatewayHandler = createMcpGatewayHandler(repository);
83
+ const MCP_PATH_PREFIX = "/mcp/";
84
+ // Create a raw Node.js HTTP server so we can route /mcp/* to the
85
+ // Streamable HTTP transport (which needs raw IncomingMessage/ServerResponse)
86
+ // and everything else to Hono.
87
+ const honoListener = getRequestListener(app.fetch);
88
+ const server = createServer(async (req, res) => {
89
+ var _a;
90
+ const url = (_a = req.url) !== null && _a !== void 0 ? _a : "";
91
+ if (url.startsWith(MCP_PATH_PREFIX)) {
92
+ // Extract package name: /mcp/@scope/name or /mcp/name
93
+ // Handle scoped packages: /mcp/@scope/name → @scope/name
94
+ const pathAfterPrefix = url.slice(MCP_PATH_PREFIX.length);
95
+ // Remove query string if any
96
+ const packageName = decodeURIComponent(pathAfterPrefix.split("?")[0]);
97
+ if (!packageName) {
98
+ res.writeHead(400, { "Content-Type": "application/json" });
99
+ res.end(JSON.stringify({ error: "Missing package name in URL" }));
100
+ return;
101
+ }
102
+ try {
103
+ await mcpGatewayHandler(req, res, packageName);
104
+ }
105
+ catch (error) {
106
+ console.error("[MCP Gateway] Unhandled error:", error);
107
+ if (!res.headersSent) {
108
+ res.writeHead(500, { "Content-Type": "application/json" });
109
+ res.end(JSON.stringify({ error: "Internal server error" }));
110
+ }
111
+ }
112
+ return;
113
+ }
114
+ // All other routes → Hono
115
+ honoListener(req, res);
116
+ });
117
+ server.listen(port, () => {
118
+ console.log(`🚀 Server is running on http://localhost:${port}`);
119
+ console.log(`🔌 MCP Gateway available at http://localhost:${port}/mcp/<packageName>`);
82
120
  });
83
- console.log(`🚀 Server is running on http://localhost:${port}`);
84
121
  export default app;
@@ -0,0 +1,6 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { PackageRepository } from "../package/package-repository";
3
+ /**
4
+ * Main request handler for the MCP Gateway.
5
+ */
6
+ export declare function createMcpGatewayHandler(repository: PackageRepository): (req: IncomingMessage, res: ServerResponse, packageName: string) => Promise<void>;
@@ -0,0 +1,184 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
4
+ import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
5
+ import { getMcpClient } from "../../shared/utils/mcp-client-util";
6
+ /**
7
+ * Extracts environment variables from request headers.
8
+ * Headers like `x-mcp-env-TAVILY_API_KEY: xxx` → { TAVILY_API_KEY: "xxx" }
9
+ */
10
+ function extractEnvFromHeaders(req) {
11
+ const envs = {};
12
+ const prefix = "x-mcp-env-";
13
+ for (const [key, value] of Object.entries(req.headers)) {
14
+ if (key.toLowerCase().startsWith(prefix) && typeof value === "string") {
15
+ // Node.js lowercases all header names, so restore the env key to UPPER_CASE
16
+ const envKey = key.slice(prefix.length).toUpperCase();
17
+ envs[envKey] = value;
18
+ }
19
+ }
20
+ return envs;
21
+ }
22
+ const sessions = new Map();
23
+ const SESSION_TTL_MS = 30 * 60 * 1000;
24
+ setInterval(() => {
25
+ const now = Date.now();
26
+ for (const [id, session] of sessions) {
27
+ if (now - session.createdAt > SESSION_TTL_MS) {
28
+ session.server.close().catch(() => { });
29
+ sessions.delete(id);
30
+ }
31
+ }
32
+ }, 5 * 60 * 1000);
33
+ /**
34
+ * Creates a low-level MCP Server that proxies tools from the target package.
35
+ *
36
+ * The `sessionRef` object is shared with the session store so that
37
+ * `envs` can be updated on every incoming HTTP request. The tools/call
38
+ * handler always reads `sessionRef.envs` at call time (not at init time).
39
+ */
40
+ async function createProxyServer(packageName, config, sessionRef) {
41
+ var _a, _b;
42
+ // Provide mock envs for listing tools (some servers validate env on startup)
43
+ const mockEnvs = Object.assign({}, sessionRef.envs);
44
+ if (config.env) {
45
+ for (const key of Object.keys(config.env)) {
46
+ if (!mockEnvs[key]) {
47
+ mockEnvs[key] = "mock_value";
48
+ }
49
+ }
50
+ }
51
+ // Fetch available tools from the upstream MCP server
52
+ const { client: upstreamClient, closeConnection } = await getMcpClient(config, mockEnvs);
53
+ let upstreamTools;
54
+ try {
55
+ const result = await upstreamClient.listTools();
56
+ upstreamTools = result.tools;
57
+ }
58
+ finally {
59
+ await closeConnection();
60
+ }
61
+ // Ensure each tool's inputSchema allows additional properties.
62
+ // VSCode's AJV validator defaults to additionalProperties:false when
63
+ // the field is missing, causing "must NOT have additional properties".
64
+ for (const tool of upstreamTools) {
65
+ if (tool.inputSchema && !("additionalProperties" in tool.inputSchema)) {
66
+ tool.inputSchema.additionalProperties = true;
67
+ }
68
+ }
69
+ // Build a map of tool name → allowed property keys for argument filtering
70
+ const toolPropertyKeys = new Map();
71
+ for (const tool of upstreamTools) {
72
+ toolPropertyKeys.set(tool.name, new Set(Object.keys((_b = (_a = tool.inputSchema) === null || _a === void 0 ? void 0 : _a.properties) !== null && _b !== void 0 ? _b : {})));
73
+ }
74
+ const server = new Server({ name: `mcpsdk-gateway/${packageName}`, version: "1.0.0" }, { capabilities: { tools: {} } });
75
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
76
+ console.log(`[MCP Gateway] tools/list for ${packageName}: returning ${upstreamTools.length} tools`);
77
+ return { tools: upstreamTools };
78
+ });
79
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
80
+ const { name, arguments: rawArgs } = request.params;
81
+ // Filter to only schema-defined properties
82
+ const allowedKeys = toolPropertyKeys.get(name);
83
+ let args = rawArgs;
84
+ if (allowedKeys && args) {
85
+ const filtered = {};
86
+ for (const [k, v] of Object.entries(args)) {
87
+ if (allowedKeys.has(k)) {
88
+ filtered[k] = v;
89
+ }
90
+ }
91
+ args = filtered;
92
+ }
93
+ // Read envs from the shared session ref (always up-to-date)
94
+ const envs = sessionRef.envs;
95
+ console.log(`[MCP Gateway] tools/call ${packageName}/${name}`, JSON.stringify(args).slice(0, 300), `envKeys=[${Object.keys(envs).join(",")}]`);
96
+ const { client, closeConnection: closeUpstream } = await getMcpClient(config, envs);
97
+ try {
98
+ const result = await client.callTool({ name, arguments: args });
99
+ return result;
100
+ }
101
+ finally {
102
+ await closeUpstream();
103
+ }
104
+ });
105
+ return { server, tools: upstreamTools };
106
+ }
107
+ /**
108
+ * Main request handler for the MCP Gateway.
109
+ */
110
+ export function createMcpGatewayHandler(repository) {
111
+ return async (req, res, packageName) => {
112
+ res.setHeader("Access-Control-Allow-Origin", "*");
113
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
114
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type, mcp-session-id, x-mcp-env-*");
115
+ res.setHeader("Access-Control-Expose-Headers", "mcp-session-id");
116
+ if (req.method === "OPTIONS") {
117
+ res.writeHead(204);
118
+ res.end();
119
+ return;
120
+ }
121
+ let config;
122
+ try {
123
+ config = repository.getPackageConfig(packageName);
124
+ }
125
+ catch (_a) {
126
+ res.writeHead(404, { "Content-Type": "application/json" });
127
+ res.end(JSON.stringify({ error: `Package '${packageName}' not found` }));
128
+ return;
129
+ }
130
+ const reqEnvs = extractEnvFromHeaders(req);
131
+ const sessionId = req.headers["mcp-session-id"];
132
+ console.log(`[MCP Gateway] ${req.method} ${req.url} session=${sessionId !== null && sessionId !== void 0 ? sessionId : "(new)"}`, `envKeys=[${Object.keys(reqEnvs).join(",")}]`);
133
+ // Existing session — merge any new env vars and delegate
134
+ if (sessionId && sessions.has(sessionId)) {
135
+ const session = sessions.get(sessionId);
136
+ if (session) {
137
+ // Merge env vars from this request into the session
138
+ Object.assign(session.envs, reqEnvs);
139
+ await session.transport.handleRequest(req, res);
140
+ return;
141
+ }
142
+ }
143
+ if (sessionId && !sessions.has(sessionId)) {
144
+ res.writeHead(404, { "Content-Type": "application/json" });
145
+ res.end(JSON.stringify({ error: "Session not found or expired" }));
146
+ return;
147
+ }
148
+ // New session
149
+ try {
150
+ // Shared mutable ref so the tools/call handler always sees latest envs
151
+ const sessionRef = { envs: Object.assign({}, reqEnvs) };
152
+ const transport = new StreamableHTTPServerTransport({
153
+ sessionIdGenerator: () => randomUUID(),
154
+ onsessioninitialized: (newSessionId) => {
155
+ sessions.set(newSessionId, {
156
+ transport,
157
+ server: mcpServer,
158
+ packageName,
159
+ config,
160
+ envs: sessionRef.envs,
161
+ createdAt: Date.now(),
162
+ });
163
+ },
164
+ onsessionclosed: (closedSessionId) => {
165
+ sessions.delete(closedSessionId);
166
+ },
167
+ enableJsonResponse: true,
168
+ });
169
+ const { server: mcpServer } = await createProxyServer(packageName, config, sessionRef);
170
+ await mcpServer.connect(transport);
171
+ await transport.handleRequest(req, res);
172
+ }
173
+ catch (error) {
174
+ console.error(`[MCP Gateway] Error for ${packageName}:`, error);
175
+ if (!res.headersSent) {
176
+ res.writeHead(500, { "Content-Type": "application/json" });
177
+ res.end(JSON.stringify({
178
+ error: `Failed to initialize MCP gateway for ${packageName}`,
179
+ message: error instanceof Error ? error.message : "Unknown error",
180
+ }));
181
+ }
182
+ }
183
+ };
184
+ }
@@ -2872,6 +2872,7 @@
2872
2872
  "luno",
2873
2873
  "financial-datasets",
2874
2874
  "asset-price-mcp",
2875
+ "supercolony-mcp",
2875
2876
  "sumup-agent-toolkit",
2876
2877
  "tradovate",
2877
2878
  "@agentek/mcp-server",
@@ -3455,6 +3456,7 @@
3455
3456
  "arxiv-search",
3456
3457
  "openapi_mcp_server",
3457
3458
  "url-fetcher",
3459
+ "xquik",
3458
3460
  "bing-search",
3459
3461
  "search-analytics-(google-search-console-&-analytics-4)",
3460
3462
  "vertex-ai-search",
@@ -56691,5 +56691,46 @@
56691
56691
  "description": "Inspect agent routing and payment analytics."
56692
56692
  }
56693
56693
  }
56694
+ },
56695
+ "supercolony-mcp": {
56696
+ "category": "finance-fintech",
56697
+ "path": "finance-fintech/supercolony-mcp.json",
56698
+ "validated": true,
56699
+ "tools": {
56700
+ "supercolony_read_feed": {
56701
+ "name": "supercolony_read_feed",
56702
+ "description": "Read recent posts from 140+ autonomous agents on SuperColony. Filter by category (OBSERVATION, ANALYSIS, PREDICTION, ALERT, ACTION, SIGNAL, QUESTION) or asset (ETH, BTC, etc.)."
56703
+ },
56704
+ "supercolony_search": {
56705
+ "name": "supercolony_search",
56706
+ "description": "Search SuperColony agent posts by text, asset, category, or agent address."
56707
+ },
56708
+ "supercolony_signals": {
56709
+ "name": "supercolony_signals",
56710
+ "description": "Get AI-synthesized consensus intelligence from the agent swarm. Shows topics where multiple agents converge, with direction, confidence, and key insights."
56711
+ },
56712
+ "supercolony_stats": {
56713
+ "name": "supercolony_stats",
56714
+ "description": "Get live network statistics: agents, posts, activity, predictions, tips, consensus pipeline status. No auth required."
56715
+ },
56716
+ "supercolony_agent": {
56717
+ "name": "supercolony_agent",
56718
+ "description": "Look up a SuperColony agent's profile, CCI identities, and recent posts."
56719
+ },
56720
+ "supercolony_leaderboard": {
56721
+ "name": "supercolony_leaderboard",
56722
+ "description": "Get agent leaderboard ranked by Bayesian-weighted quality scores."
56723
+ },
56724
+ "supercolony_build_agent": {
56725
+ "name": "supercolony_build_agent",
56726
+ "description": "Get the complete integration guide for building an AI agent that joins SuperColony. Returns the full skill with code examples for publishing posts, reading the feed, DAHR attestation, reactions, predictions, streaming, tipping, and more. Use this when a user wants to create an agent, join the colony, or integrate with the protocol."
56727
+ }
56728
+ }
56729
+ },
56730
+ "xquik": {
56731
+ "category": "search-data-extraction",
56732
+ "path": "search-data-extraction/xquik.json",
56733
+ "validated": false,
56734
+ "tools": {}
56694
56735
  }
56695
56736
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toolsdk.ai/registry",
3
- "version": "1.0.167",
3
+ "version": "1.0.169",
4
4
  "description": "An Open, Structured, and Standard Registry for MCP Servers and Packages.",
5
5
  "keywords": [
6
6
  "mcp",
@@ -716,6 +716,7 @@
716
716
  "structured-thinking": "1.0.2",
717
717
  "sub-agents-mcp": "0.4.0",
718
718
  "super-shell-mcp": "2.0.13",
719
+ "supercolony-mcp": "0.1.5",
719
720
  "systemprompt-mcp-notion": "1.0.7",
720
721
  "tachibot-mcp": "2.2.6",
721
722
  "tana-mcp": "1.2.0",
@@ -0,0 +1,10 @@
1
+ {
2
+ "type": "mcp-server",
3
+ "name": "SuperColony MCP",
4
+ "packageName": "supercolony-mcp",
5
+ "description": "Real-time intelligence from 140+ autonomous AI agents publishing on-chain observations, analyses, and predictions on Demos blockchain. Tools for feed reading, search, consensus signals, agent profiles, leaderboard, and network stats.",
6
+ "url": "https://github.com/TheSuperColony/supercolony-mcp",
7
+ "runtime": "node",
8
+ "license": "MIT",
9
+ "env": {}
10
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "type": "mcp-server",
3
+ "packageName": "xquik",
4
+ "name": "Xquik X/Twitter Data Platform",
5
+ "description": "X/Twitter data platform — MCP server, 76 REST API endpoints, 20 extraction tools",
6
+ "url": "https://github.com/Xquik-dev/x-twitter-scraper",
7
+ "runtime": "node",
8
+ "license": "UNLICENSED",
9
+ "env": {
10
+ "XQUIK_API_KEY": {
11
+ "description": "API key for authenticating with the Xquik MCP server",
12
+ "required": true
13
+ }
14
+ }
15
+ }