@toolsdk.ai/registry 1.0.82 → 1.0.83

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
@@ -1,12 +1,12 @@
1
1
  # Awesome MCP Registry
2
2
 
3
- ![How many MCP Servers in Awesome MCP Registry](https://img.shields.io/badge/MCP_Servers-70-blue)
3
+ ![How many MCP Servers in Awesome MCP Registry](https://img.shields.io/badge/MCP_Servers-72-blue)
4
4
  ![awesome-mcp-registry License](https://img.shields.io/badge/LICENSE-MIT-ff69b4)
5
5
 
6
6
 
7
7
  Welcome to the Awesome MCP Registry.
8
8
 
9
- An open, high-quality, well-structured and developer-friendly list of 70+ MCP servers.
9
+ An open, high-quality, well-structured and developer-friendly list of 72+ MCP servers.
10
10
 
11
11
 
12
12
 
@@ -95,9 +95,9 @@ For more detail please see [the guide](./docs/guide.md).
95
95
 
96
96
  # MCP Servers
97
97
 
98
- ✅: Validated and runnable tools (37)
98
+ ✅: Validated and runnable tools (40)
99
99
 
100
- ❌: Cannot be run by the MCP client (with mock environments variables (33))
100
+ ❌: Cannot be run by the MCP client (with mock environments variables (32))
101
101
 
102
102
 
103
103
 
@@ -136,7 +136,7 @@ Tools for browsing, scraping, and automating web content in AI-compatible format
136
136
  - [✅ hyperbrowser-mcp](https://github.com/hyperbrowserai/mcp/tree/main): An MCP server for Hyperbrowser - Hyperbrowser is the next-generation platform empowering AI agents and enabling effortless, scalable browser automation (10 tools) (node)
137
137
  - [✅ @modelcontextprotocol/server-puppeteer](https://github.com/modelcontextprotocol/servers/blob/main/src/puppeteer): MCP server for browser automation using Puppeteer (7 tools) (node)
138
138
  - [❌ mcp-server-fetch](https://github.com/modelcontextprotocol/servers/blob/main/src/fetch): A Model Context Protocol server providing tools to fetch and convert web content for usage by LLMs (python)
139
- - [✅ @executeautomation/playwright-mcp-server](https://github.com/executeautomation/mcp-playwright/tree/main/src): A Model Context Protocol server for Playwright for Browser Automation and Web Scraping. (31 tools) (node)
139
+ - [✅ @executeautomation/playwright-mcp-server](https://github.com/executeautomation/mcp-playwright/tree/main/src): A Model Context Protocol server for Playwright for Browser Automation and Web Scraping. (32 tools) (node)
140
140
  - [✅ tavily-mcp](https://github.com/tavily-ai/tavily-mcp/tree/main): Providing seamless integration with Tavily's search and extract tools for real-time web search and intelligent data extraction. (4 tools) (node)
141
141
  - [✅ exa-mcp-server](https://github.com/exa-labs/exa-mcp-server): A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way. (8 tools) (node)
142
142
 
@@ -149,7 +149,7 @@ Integrate with cloud services to manage and interact with cloud infrastructure.
149
149
  - [✅ @strowk/mcp-k8s](https://github.com/strowk/mcp-k8s-go): MCP server connecting to Kubernetes (8 tools) (node)
150
150
  - [❌ kubernetes-mcp-server](https://github.com/manusa/kubernetes-mcp-server): Powerful and flexible Kubernetes MCP server implementation with additional features for OpenShift. Besides the typical CRUD operations on any Kubernetes resource, this implementation adds specialized features for Pods and other resources. (go)
151
151
  - [❌ @cloudflare/mcp-server-cloudflare](https://github.com/cloudflare/mcp-server-cloudflare): MCP server for interacting with Cloudflare API (node)
152
- - [✅ mcp-server-kubernetes](https://github.com/Flux159/mcp-server-kubernetes): MCP server for managing Kubernetes clusters, enabling LLMs to interact with and control Kubernetes resources. (20 tools) (node)
152
+ - [✅ mcp-server-kubernetes](https://github.com/Flux159/mcp-server-kubernetes): MCP server for managing Kubernetes clusters, enabling LLMs to interact with and control Kubernetes resources. (21 tools) (node)
153
153
 
154
154
 
155
155
  <a id="code-execution"></a>
@@ -238,7 +238,7 @@ Manage files and directories with tools for reading, writing, and organizing fil
238
238
 
239
239
  Work with financial data, market info, and trading platforms using AI tools.
240
240
 
241
- - [❌ @dragonkhoi/mercury-mcp](https://github.com/dragonkhoi/mercury-mcp/tree/main/src): Simple MCP server that interfaces with the Mercury API, allowing you to talk to your Mercury banking data from any MCP client like Cursor or Claude Desktop. (node)
241
+ - [❌ @toolsdk.ai/mcp-mercury](https://github.com/dragonkhoi/mercury-mcp/tree/main/src): Simple MCP server that interfaces with the Mercury API, allowing you to talk to your Mercury banking data from any MCP client like Cursor or Claude Desktop. (node)
242
242
 
243
243
 
244
244
  <a id="knowledge-memory"></a>
@@ -264,8 +264,8 @@ Work with maps, weather, and location-based data for analytics and insights.
264
264
 
265
265
  Create and edit marketing content, manage metadata, and refine product positioning.
266
266
 
267
- - [ mcp-server-google-analytics](https://github.com/Seey215/mcp-server-google-analytics): An MCP server implementation for accessing Google Analytics 4 (GA4) data, built using the Model Context Protocol TypeScript SDK. (node)
268
- - [ @AshDevFr/discourse-mcp-server](https://github.com/AshDevFr/discourse-mcp-server/tree/main/src): Node.js server implementing Model Context Protocol (MCP) for Discourse search operation. (node)
267
+ - [ @toolsdk.ai/mcp-server-google-analytics](https://github.com/smithery-ai/mcp-server-google-analytics): An MCP server implementation for accessing Google Analytics 4 (GA4) data, built using the Model Context Protocol TypeScript SDK. (2 tools) (node)
268
+ - [ @ashdev/discourse-mcp-server](https://github.com/AshDevFr/discourse-mcp-server/tree/main/src): Node.js server implementing Model Context Protocol (MCP) for Discourse search operation. (1 tools) (node)
269
269
 
270
270
 
271
271
  <a id="monitoring"></a>
package/dist/helper.d.ts CHANGED
@@ -39,3 +39,8 @@ export declare function getMcpClient(mcpServerConfig: MCPServerPackageConfig, en
39
39
  transport: StdioClientTransport;
40
40
  closeConnection: () => Promise<void>;
41
41
  }>;
42
+ export declare function updatePackageJsonDependencies({ packageDeps, enableValidation, }: {
43
+ packageDeps: Record<string, string>;
44
+ enableValidation?: boolean;
45
+ }): void;
46
+ export declare function getActualVersion(packageName: string, configuredVersion?: string): string;
package/dist/helper.js CHANGED
@@ -1,4 +1,37 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
36
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
37
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -16,9 +49,12 @@ exports.typedAllPackagesList = void 0;
16
49
  exports.getPackageConfigByKey = getPackageConfigByKey;
17
50
  exports.getPackageJSON = getPackageJSON;
18
51
  exports.getMcpClient = getMcpClient;
52
+ exports.updatePackageJsonDependencies = updatePackageJsonDependencies;
53
+ exports.getActualVersion = getActualVersion;
19
54
  const stdio_js_1 = require("@modelcontextprotocol/sdk/client/stdio.js");
20
55
  const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
21
56
  const fs_1 = __importDefault(require("fs"));
57
+ const path = __importStar(require("path"));
22
58
  const packages_list_json_1 = __importDefault(require("../indexes/packages-list.json"));
23
59
  const assert_1 = __importDefault(require("assert"));
24
60
  const schema_1 = require("./schema");
@@ -27,13 +63,13 @@ function getPackageConfigByKey(packageKey) {
27
63
  const value = exports.typedAllPackagesList[packageKey];
28
64
  const jsonFile = value.path;
29
65
  // read the JSON file and convert it to MCPServerPackageConfig
30
- const jsonStr = fs_1.default.readFileSync(__dirname + '/../packages/' + jsonFile, 'utf-8');
66
+ const jsonStr = fs_1.default.readFileSync(__dirname + "/../packages/" + jsonFile, "utf-8");
31
67
  const mcpServerConfig = schema_1.MCPServerPackageConfigSchema.parse(JSON.parse(jsonStr));
32
68
  return mcpServerConfig;
33
69
  }
34
70
  function getPackageJSON(packageName) {
35
- const packageJSONFilePath = __dirname + '/../node_modules/' + packageName + '/package.json';
36
- const packageJSONStr = fs_1.default.readFileSync(packageJSONFilePath, 'utf8');
71
+ const packageJSONFilePath = __dirname + "/../node_modules/" + packageName + "/package.json";
72
+ const packageJSONStr = fs_1.default.readFileSync(packageJSONFilePath, "utf8");
37
73
  const packageJSON = JSON.parse(packageJSONStr);
38
74
  return packageJSON;
39
75
  }
@@ -41,12 +77,12 @@ function getMcpClient(mcpServerConfig, env) {
41
77
  return __awaiter(this, void 0, void 0, function* () {
42
78
  const { packageName } = mcpServerConfig;
43
79
  const packageJSON = getPackageJSON(packageName);
44
- let binFilePath = '';
80
+ let binFilePath = "";
45
81
  let binPath;
46
- if (typeof packageJSON.bin === 'string') {
82
+ if (typeof packageJSON.bin === "string") {
47
83
  binPath = packageJSON.bin;
48
84
  }
49
- else if (typeof packageJSON.bin === 'object') {
85
+ else if (typeof packageJSON.bin === "object") {
50
86
  binPath = Object.values(packageJSON.bin)[0];
51
87
  }
52
88
  else {
@@ -54,7 +90,7 @@ function getMcpClient(mcpServerConfig, env) {
54
90
  }
55
91
  (0, assert_1.default)(binPath, `Package ${packageName} does not have a valid bin path in package.json.`);
56
92
  // binFilePath = 'plugin_packages/' + packageName + `/${binPath}`;
57
- binFilePath = __dirname + '/../node_modules/' + packageName + `/${binPath}`;
93
+ binFilePath = __dirname + "/../node_modules/" + packageName + `/${binPath}`;
58
94
  const mcpServerBinPath = mcpServerConfig.bin || binFilePath;
59
95
  const binArgs = mcpServerConfig.binArgs || [];
60
96
  const transport = new stdio_js_1.StdioClientTransport({
@@ -64,7 +100,7 @@ function getMcpClient(mcpServerConfig, env) {
64
100
  });
65
101
  const client = new index_js_1.Client({
66
102
  name: `mcp-server-${mcpServerConfig.name}-client`,
67
- version: '1.0.0',
103
+ version: "1.0.0",
68
104
  }, {
69
105
  capabilities: {
70
106
  tools: {},
@@ -82,3 +118,37 @@ function getMcpClient(mcpServerConfig, env) {
82
118
  return { client, transport, closeConnection };
83
119
  });
84
120
  }
121
+ function updatePackageJsonDependencies({ packageDeps, enableValidation = false, }) {
122
+ var _a;
123
+ // Write package.json dependencies
124
+ const packageJsonFile = "./package.json";
125
+ const packageJSONStr = fs_1.default.readFileSync(packageJsonFile, "utf-8");
126
+ const newDeps = {
127
+ "@modelcontextprotocol/sdk": "^1.12.0",
128
+ lodash: "^4.17.21",
129
+ zod: "^3.23.30",
130
+ };
131
+ for (const [depName, depVer] of Object.entries(packageDeps)) {
132
+ if (!enableValidation || ((_a = exports.typedAllPackagesList[depName]) === null || _a === void 0 ? void 0 : _a.validated)) {
133
+ newDeps[depName] = depVer || "latest";
134
+ }
135
+ }
136
+ const packageJSON = JSON.parse(packageJSONStr);
137
+ packageJSON.dependencies = newDeps;
138
+ fs_1.default.writeFileSync(packageJsonFile, JSON.stringify(packageJSON, null, 2), "utf-8");
139
+ console.log(`Generated new package.json file at ${packageJsonFile}`);
140
+ }
141
+ function getActualVersion(packageName, configuredVersion) {
142
+ if (configuredVersion && configuredVersion !== "latest") {
143
+ return configuredVersion;
144
+ }
145
+ try {
146
+ const packageJsonPath = path.join(__dirname, "../node_modules", packageName, "package.json");
147
+ const packageJson = JSON.parse(fs_1.default.readFileSync(packageJsonPath, "utf-8"));
148
+ return packageJson.version;
149
+ }
150
+ catch (e) {
151
+ console.warn(`Failed to read version for ${packageName}, using 'latest' by default`, e.message);
152
+ return "latest";
153
+ }
154
+ }
@@ -188,7 +188,7 @@
188
188
  "description": "Work with financial data, market info, and trading platforms using AI tools."
189
189
  },
190
190
  "packagesList": [
191
- "@dragonkhoi/mercury-mcp"
191
+ "@toolsdk.ai/mcp-mercury"
192
192
  ]
193
193
  },
194
194
  "gaming": {
@@ -228,8 +228,8 @@
228
228
  "description": "Create and edit marketing content, manage metadata, and refine product positioning."
229
229
  },
230
230
  "packagesList": [
231
- "mcp-server-google-analytics",
232
- "@AshDevFr/discourse-mcp-server"
231
+ "@toolsdk.ai/mcp-server-google-analytics",
232
+ "@ashdev/discourse-mcp-server"
233
233
  ]
234
234
  },
235
235
  "monitoring": {
@@ -171,6 +171,10 @@
171
171
  "name": "playwright_hover",
172
172
  "description": "Hover an element on the page"
173
173
  },
174
+ "playwright_upload_file": {
175
+ "name": "playwright_upload_file",
176
+ "description": "Upload a file to an input[type='file'] element on the page"
177
+ },
174
178
  "playwright_evaluate": {
175
179
  "name": "playwright_evaluate",
176
180
  "description": "Execute JavaScript in the browser console"
@@ -221,7 +225,7 @@
221
225
  },
222
226
  "playwright_get_visible_html": {
223
227
  "name": "playwright_get_visible_html",
224
- "description": "Get the HTML content of the current page"
228
+ "description": "Get the HTML content of the current page. By default, all <script> tags are removed from the output unless removeScripts is explicitly set to false."
225
229
  },
226
230
  "playwright_go_back": {
227
231
  "name": "playwright_go_back",
@@ -471,10 +475,6 @@
471
475
  "name": "kubectl_describe",
472
476
  "description": "Describe Kubernetes resources by resource type, name, and optionally namespace"
473
477
  },
474
- "kubectl_list": {
475
- "name": "kubectl_list",
476
- "description": "List Kubernetes resources by resource type and optionally namespace"
477
- },
478
478
  "kubectl_apply": {
479
479
  "name": "kubectl_apply",
480
480
  "description": "Apply a Kubernetes YAML manifest from a string or file"
@@ -531,6 +531,10 @@
531
531
  "name": "stop_port_forward",
532
532
  "description": "Stop a port-forward process"
533
533
  },
534
+ "exec_in_pod": {
535
+ "name": "exec_in_pod",
536
+ "description": "Execute a command in a Kubernetes pod or container and return the output"
537
+ },
534
538
  "list_api_resources": {
535
539
  "name": "list_api_resources",
536
540
  "description": "List the API resources available in the cluster"
@@ -538,6 +542,10 @@
538
542
  "kubectl_generic": {
539
543
  "name": "kubectl_generic",
540
544
  "description": "Execute any kubectl command with the provided arguments and flags"
545
+ },
546
+ "ping": {
547
+ "name": "ping",
548
+ "description": "Verify that the counterpart is still responsive and the connection is alive."
541
549
  }
542
550
  }
543
551
  },
@@ -1483,79 +1491,79 @@
1483
1491
  },
1484
1492
  "ingestSharePointFiles": {
1485
1493
  "name": "ingestSharePointFiles",
1486
- "description": "Ingests files from SharePoint library into Graphlit knowledge base.\n Accepts a SharePoint libraryId and an optional folderId to ingest files from a specific SharePoint folder.\n Libraries can be enumerated with listSharePointLibraries and library folders with listSharePointFolders.\n Requires environment variables to be configured: SHAREPOINT_ACCOUNT_NAME, SHAREPOINT_CLIENT_ID, SHAREPOINT_CLIENT_SECRET, SHAREPOINT_REFRESH_TOKEN.\n Accepts an optional read limit for the number of files to ingest.\n Executes asynchronously, creates SharePoint feed, and returns the feed identifier."
1494
+ "description": "Ingests files from SharePoint library into Graphlit knowledge base.\n Accepts a SharePoint libraryId and an optional folderId to ingest files from a specific SharePoint folder.\n Libraries can be enumerated with listSharePointLibraries and library folders with listSharePointFolders.\n Requires environment variables to be configured: SHAREPOINT_ACCOUNT_NAME, SHAREPOINT_CLIENT_ID, SHAREPOINT_CLIENT_SECRET, SHAREPOINT_REFRESH_TOKEN.\n Accepts an optional read limit for the number of files to ingest.\n Executes asynchronously, creates SharePoint feed, and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1487
1495
  },
1488
1496
  "ingestOneDriveFiles": {
1489
1497
  "name": "ingestOneDriveFiles",
1490
- "description": "Ingests files from OneDrive into Graphlit knowledge base.\n Accepts optional OneDrive folder identifier, and an optional read limit for the number of files to ingest.\n If no folder identifier provided, ingests files from root OneDrive folder.\n Requires environment variables to be configured: ONEDRIVE_CLIENT_ID, ONEDRIVE_CLIENT_SECRET, ONEDRIVE_REFRESH_TOKEN.\n Executes asynchronously, creates OneDrive feed, and returns the feed identifier."
1498
+ "description": "Ingests files from OneDrive into Graphlit knowledge base.\n Accepts optional OneDrive folder identifier, and an optional read limit for the number of files to ingest.\n If no folder identifier provided, ingests files from root OneDrive folder.\n Requires environment variables to be configured: ONEDRIVE_CLIENT_ID, ONEDRIVE_CLIENT_SECRET, ONEDRIVE_REFRESH_TOKEN.\n Executes asynchronously, creates OneDrive feed, and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1491
1499
  },
1492
1500
  "ingestGoogleDriveFiles": {
1493
1501
  "name": "ingestGoogleDriveFiles",
1494
- "description": "Ingests files from Google Drive into Graphlit knowledge base.\n Accepts optional Google Drive folder identifier, and an optional read limit for the number of files to ingest.\n For example, with Google Drive URI (https://drive.google.com/drive/u/0/folders/32tzhRD12KDh2hXABY8OZRFv7Smy8WBkQ), the folder identifier is 32tzhRD12KDh2hXABY8OZRFv7Smy8WBkQ.\n If no folder identifier provided, ingests files from root Google Drive folder.\n Requires environment variables to be configured: GOOGLE_DRIVE_SERVICE_ACCOUNT_JSON -or- GOOGLE_DRIVE_CLIENT_ID, GOOGLE_DRIVE_CLIENT_SECRET, GOOGLE_DRIVE_REFRESH_TOKEN.\n If service account JSON is provided, uses service account authentication. Else, uses user authentication.\n Executes asynchronously, creates Google Drive feed, and returns the feed identifier."
1502
+ "description": "Ingests files from Google Drive into Graphlit knowledge base.\n Accepts optional Google Drive folder identifier, and an optional read limit for the number of files to ingest.\n For example, with Google Drive URI (https://drive.google.com/drive/u/0/folders/32tzhRD12KDh2hXABY8OZRFv7Smy8WBkQ), the folder identifier is 32tzhRD12KDh2hXABY8OZRFv7Smy8WBkQ.\n If no folder identifier provided, ingests files from root Google Drive folder.\n Requires environment variables to be configured: GOOGLE_DRIVE_SERVICE_ACCOUNT_JSON -or- GOOGLE_DRIVE_CLIENT_ID, GOOGLE_DRIVE_CLIENT_SECRET, GOOGLE_DRIVE_REFRESH_TOKEN.\n If service account JSON is provided, uses service account authentication. Else, uses user authentication.\n Executes asynchronously, creates Google Drive feed, and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1495
1503
  },
1496
1504
  "ingestDropboxFiles": {
1497
1505
  "name": "ingestDropboxFiles",
1498
- "description": "Ingests files from Dropbox into Graphlit knowledge base.\n Accepts optional relative path to Dropbox folder (i.e. /Pictures), and an optional read limit for the number of files to ingest.\n If no path provided, ingests files from root Dropbox folder.\n Requires environment variables to be configured: DROPBOX_APP_KEY, DROPBOX_APP_SECRET, DROPBOX_REDIRECT_URI, DROPBOX_REFRESH_TOKEN.\n Executes asynchronously, creates Dropbox feed, and returns the feed identifier."
1506
+ "description": "Ingests files from Dropbox into Graphlit knowledge base.\n Accepts optional relative path to Dropbox folder (i.e. /Pictures), and an optional read limit for the number of files to ingest.\n If no path provided, ingests files from root Dropbox folder.\n Requires environment variables to be configured: DROPBOX_APP_KEY, DROPBOX_APP_SECRET, DROPBOX_REDIRECT_URI, DROPBOX_REFRESH_TOKEN.\n Executes asynchronously, creates Dropbox feed, and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1499
1507
  },
1500
1508
  "ingestBoxFiles": {
1501
1509
  "name": "ingestBoxFiles",
1502
- "description": "Ingests files from Box into Graphlit knowledge base.\n Accepts optional Box folder identifier, and an optional read limit for the number of files to ingest.\n If no folder identifier provided, ingests files from root Box folder (i.e. \"0\").\n Folder identifier can be inferred from Box URL. https://app.box.com/folder/123456 -> folder identifier is \"123456\".\n Requires environment variables to be configured: BOX_CLIENT_ID, BOX_CLIENT_SECRET, BOX_REDIRECT_URI, BOX_REFRESH_TOKEN.\n Executes asynchronously, creates Box feed, and returns the feed identifier."
1510
+ "description": "Ingests files from Box into Graphlit knowledge base.\n Accepts optional Box folder identifier, and an optional read limit for the number of files to ingest.\n If no folder identifier provided, ingests files from root Box folder (i.e. \"0\").\n Folder identifier can be inferred from Box URL. https://app.box.com/folder/123456 -> folder identifier is \"123456\".\n Requires environment variables to be configured: BOX_CLIENT_ID, BOX_CLIENT_SECRET, BOX_REDIRECT_URI, BOX_REFRESH_TOKEN.\n Executes asynchronously, creates Box feed, and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1503
1511
  },
1504
1512
  "ingestGitHubFiles": {
1505
1513
  "name": "ingestGitHubFiles",
1506
- "description": "Ingests files from GitHub repository into Graphlit knowledge base.\n Accepts GitHub repository owner and repository name and an optional read limit for the number of files to ingest.\n For example, for GitHub repository (https://github.com/openai/tiktoken), 'openai' is the repository owner, and 'tiktoken' is the repository name.\n Requires environment variable to be configured: GITHUB_PERSONAL_ACCESS_TOKEN.\n Executes asynchronously, creates GitHub feed, and returns the feed identifier."
1514
+ "description": "Ingests files from GitHub repository into Graphlit knowledge base.\n Accepts GitHub repository owner and repository name and an optional read limit for the number of files to ingest.\n For example, for GitHub repository (https://github.com/openai/tiktoken), 'openai' is the repository owner, and 'tiktoken' is the repository name.\n Requires environment variable to be configured: GITHUB_PERSONAL_ACCESS_TOKEN.\n Executes asynchronously, creates GitHub feed, and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1507
1515
  },
1508
1516
  "ingestNotionPages": {
1509
1517
  "name": "ingestNotionPages",
1510
- "description": "Ingests pages from Notion database into Graphlit knowledge base.\n Accepts Notion database identifier and an optional read limit for the number of pages to ingest.\n You can list the available Notion database identifiers with listNotionDatabases.\n Or, for a Notion URL, https://www.notion.so/Example/Engineering-Wiki-114abc10cb38487e91ec906fc6c6f350, 'Engineering-Wiki-114abc10cb38487e91ec906fc6c6f350' is an example of a Notion database identifier.\n Requires environment variable to be configured: NOTION_API_KEY.\n Executes asynchronously, creates Notion feed, and returns the feed identifier."
1518
+ "description": "Ingests pages from Notion database into Graphlit knowledge base.\n Accepts Notion database identifier and an optional read limit for the number of pages to ingest.\n You can list the available Notion database identifiers with listNotionDatabases.\n Or, for a Notion URL, https://www.notion.so/Example/Engineering-Wiki-114abc10cb38487e91ec906fc6c6f350, 'Engineering-Wiki-114abc10cb38487e91ec906fc6c6f350' is an example of a Notion database identifier.\n Requires environment variable to be configured: NOTION_API_KEY.\n Executes asynchronously, creates Notion feed, and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1511
1519
  },
1512
1520
  "ingestMicrosoftTeamsMessages": {
1513
1521
  "name": "ingestMicrosoftTeamsMessages",
1514
- "description": "Ingests messages from Microsoft Teams channel into Graphlit knowledge base.\n Accepts Microsoft Teams team identifier and channel identifier, and an optional read limit for the number of messages to ingest.\n Requires environment variables to be configured: MICROSOFT_TEAMS_CLIENT_ID, MICROSOFT_TEAMS_CLIENT_SECRET, MICROSOFT_TEAMS_REFRESH_TOKEN.\n Executes asynchronously, creates Microsoft Teams feed, and returns the feed identifier."
1522
+ "description": "Ingests messages from Microsoft Teams channel into Graphlit knowledge base.\n Accepts Microsoft Teams team identifier and channel identifier, and an optional read limit for the number of messages to ingest.\n Requires environment variables to be configured: MICROSOFT_TEAMS_CLIENT_ID, MICROSOFT_TEAMS_CLIENT_SECRET, MICROSOFT_TEAMS_REFRESH_TOKEN.\n Executes asynchronously, creates Microsoft Teams feed, and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1515
1523
  },
1516
1524
  "ingestSlackMessages": {
1517
1525
  "name": "ingestSlackMessages",
1518
- "description": "Ingests messages from Slack channel into Graphlit knowledge base.\n Accepts Slack channel name and an optional read limit for the number of messages to ingest.\n Requires environment variable to be configured: SLACK_BOT_TOKEN.\n Executes asynchronously, creates Slack feed, and returns the feed identifier."
1526
+ "description": "Ingests messages from Slack channel into Graphlit knowledge base.\n Accepts Slack channel name and an optional read limit for the number of messages to ingest.\n Requires environment variable to be configured: SLACK_BOT_TOKEN.\n Executes asynchronously, creates Slack feed, and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1519
1527
  },
1520
1528
  "ingestDiscordMessages": {
1521
1529
  "name": "ingestDiscordMessages",
1522
- "description": "Ingests messages from Discord channel into Graphlit knowledge base.\n Accepts Discord channel name and an optional read limit for the number of messages to ingest.\n Requires environment variable to be configured: DISCORD_BOT_TOKEN.\n Executes asynchronously, creates Discord feed, and returns the feed identifier."
1530
+ "description": "Ingests messages from Discord channel into Graphlit knowledge base.\n Accepts Discord channel name and an optional read limit for the number of messages to ingest.\n Requires environment variable to be configured: DISCORD_BOT_TOKEN.\n Executes asynchronously, creates Discord feed, and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1523
1531
  },
1524
1532
  "ingestTwitterPosts": {
1525
1533
  "name": "ingestTwitterPosts",
1526
- "description": "Ingests posts by user from Twitter/X into Graphlit knowledge base.\n Accepts Twitter/X user name, without the leading @ symbol, and an optional read limit for the number of posts to ingest.\n Requires environment variable to be configured: TWITTER_TOKEN.\n Executes asynchronously, creates Twitter feed, and returns the feed identifier."
1534
+ "description": "Ingests posts by user from Twitter/X into Graphlit knowledge base.\n Accepts Twitter/X user name, without the leading @ symbol, and an optional read limit for the number of posts to ingest.\n Requires environment variable to be configured: TWITTER_TOKEN.\n Executes asynchronously, creates Twitter feed, and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1527
1535
  },
1528
1536
  "ingestTwitterSearch": {
1529
1537
  "name": "ingestTwitterSearch",
1530
- "description": "Searches for recent posts from Twitter/X, and ingests them into Graphlit knowledge base.\n Accepts search query, and an optional read limit for the number of posts to ingest.\n Requires environment variable to be configured: TWITTER_TOKEN.\n Executes asynchronously, creates Twitter feed, and returns the feed identifier."
1538
+ "description": "Searches for recent posts from Twitter/X, and ingests them into Graphlit knowledge base.\n Accepts search query, and an optional read limit for the number of posts to ingest.\n Requires environment variable to be configured: TWITTER_TOKEN.\n Executes asynchronously, creates Twitter feed, and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1531
1539
  },
1532
1540
  "ingestRedditPosts": {
1533
1541
  "name": "ingestRedditPosts",
1534
- "description": "Ingests posts from Reddit subreddit into Graphlit knowledge base.\n Accepts a subreddit name and an optional read limit for the number of posts to ingest.\n Executes asynchronously, creates Reddit feed, and returns the feed identifier."
1542
+ "description": "Ingests posts from Reddit subreddit into Graphlit knowledge base.\n Accepts a subreddit name and an optional read limit for the number of posts to ingest.\n Executes asynchronously, creates Reddit feed, and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1535
1543
  },
1536
1544
  "ingestGoogleEmail": {
1537
1545
  "name": "ingestGoogleEmail",
1538
- "description": "Ingests emails from Google Email account into Graphlit knowledge base.\n Accepts an optional read limit for the number of emails to ingest.\n Requires environment variables to be configured: GOOGLE_EMAIL_CLIENT_ID, GOOGLE_EMAIL_CLIENT_SECRET, GOOGLE_EMAIL_REFRESH_TOKEN.\n Executes asynchronously, creates Google Email feed, and returns the feed identifier."
1546
+ "description": "Ingests emails from Google Email account into Graphlit knowledge base.\n Accepts an optional read limit for the number of emails to ingest.\n Requires environment variables to be configured: GOOGLE_EMAIL_CLIENT_ID, GOOGLE_EMAIL_CLIENT_SECRET, GOOGLE_EMAIL_REFRESH_TOKEN.\n Executes asynchronously, creates Google Email feed, and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1539
1547
  },
1540
1548
  "ingestMicrosoftEmail": {
1541
1549
  "name": "ingestMicrosoftEmail",
1542
- "description": "Ingests emails from Microsoft Email account into Graphlit knowledge base.\n Accepts an optional read limit for the number of emails to ingest.\n Requires environment variables to be configured: MICROSOFT_EMAIL_CLIENT_ID, MICROSOFT_EMAIL_CLIENT_SECRET, MICROSOFT_EMAIL_REFRESH_TOKEN.\n Executes asynchronously, creates Microsoft Email feed, and returns the feed identifier."
1550
+ "description": "Ingests emails from Microsoft Email account into Graphlit knowledge base.\n Accepts an optional read limit for the number of emails to ingest.\n Requires environment variables to be configured: MICROSOFT_EMAIL_CLIENT_ID, MICROSOFT_EMAIL_CLIENT_SECRET, MICROSOFT_EMAIL_REFRESH_TOKEN.\n Executes asynchronously, creates Microsoft Email feed, and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1543
1551
  },
1544
1552
  "ingestLinearIssues": {
1545
1553
  "name": "ingestLinearIssues",
1546
- "description": "Ingests issues from Linear project into Graphlit knowledge base.\n Accepts Linear project name and an optional read limit for the number of issues to ingest.\n Requires environment variable to be configured: LINEAR_API_KEY.\n Executes asynchronously, creates Linear issue feed, and returns the feed identifier."
1554
+ "description": "Ingests issues from Linear project into Graphlit knowledge base.\n Accepts Linear project name and an optional read limit for the number of issues to ingest.\n Requires environment variable to be configured: LINEAR_API_KEY.\n Executes asynchronously, creates Linear issue feed, and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1547
1555
  },
1548
1556
  "ingestGitHubIssues": {
1549
1557
  "name": "ingestGitHubIssues",
1550
- "description": "Ingests issues from GitHub repository into Graphlit knowledge base.\n Accepts GitHub repository owner and repository name and an optional read limit for the number of issues to ingest.\n For example, for GitHub repository (https://github.com/openai/tiktoken), 'openai' is the repository owner, and 'tiktoken' is the repository name.\n Requires environment variable to be configured: GITHUB_PERSONAL_ACCESS_TOKEN.\n Executes asynchronously, creates GitHub issue feed, and returns the feed identifier."
1558
+ "description": "Ingests issues from GitHub repository into Graphlit knowledge base.\n Accepts GitHub repository owner and repository name and an optional read limit for the number of issues to ingest.\n For example, for GitHub repository (https://github.com/openai/tiktoken), 'openai' is the repository owner, and 'tiktoken' is the repository name.\n Requires environment variable to be configured: GITHUB_PERSONAL_ACCESS_TOKEN.\n Executes asynchronously, creates GitHub issue feed, and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1551
1559
  },
1552
1560
  "ingestJiraIssues": {
1553
1561
  "name": "ingestJiraIssues",
1554
- "description": "Ingests issues from Atlassian Jira repository into Graphlit knowledge base.\n Accepts Atlassian Jira server URL and project name, and an optional read limit for the number of issues to ingest.\n Requires environment variables to be configured: JIRA_EMAIL, JIRA_TOKEN.\n Executes asynchronously, creates Atlassian Jira issue feed, and returns the feed identifier."
1562
+ "description": "Ingests issues from Atlassian Jira repository into Graphlit knowledge base.\n Accepts Atlassian Jira server URL and project name, and an optional read limit for the number of issues to ingest.\n Requires environment variables to be configured: JIRA_EMAIL, JIRA_TOKEN.\n Executes asynchronously, creates Atlassian Jira issue feed, and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1555
1563
  },
1556
1564
  "webCrawl": {
1557
1565
  "name": "webCrawl",
1558
- "description": "Crawls web pages from web site into Graphlit knowledge base.\n Accepts a URL and an optional read limit for the number of pages to crawl.\n Uses sitemap.xml to discover pages to be crawled from website.\n Executes asynchronously and returns the feed identifier."
1566
+ "description": "Crawls web pages from web site into Graphlit knowledge base.\n Accepts a URL and an optional read limit for the number of pages to crawl.\n Uses sitemap.xml to discover pages to be crawled from website.\n Executes asynchronously and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1559
1567
  },
1560
1568
  "webMap": {
1561
1569
  "name": "webMap",
@@ -1567,7 +1575,7 @@
1567
1575
  },
1568
1576
  "ingestRSS": {
1569
1577
  "name": "ingestRSS",
1570
- "description": "Ingests posts from RSS feed into Graphlit knowledge base.\n For podcast RSS feeds, audio will be downloaded, transcribed and ingested into Graphlit knowledge base.\n Accepts RSS URL and an optional read limit for the number of posts to read.\n Executes asynchronously and returns the feed identifier."
1578
+ "description": "Ingests posts from RSS feed into Graphlit knowledge base.\n For podcast RSS feeds, audio will be downloaded, transcribed and ingested into Graphlit knowledge base.\n Accepts RSS URL and an optional read limit for the number of posts to read.\n Executes asynchronously and returns the feed identifier. Optionally creates a recurring feed that checks for new content every 15 minutes when 'recurring' is set to true."
1571
1579
  },
1572
1580
  "ingestUrl": {
1573
1581
  "name": "ingestUrl",
@@ -1889,19 +1897,54 @@
1889
1897
  "mcp-server-google-analytics": {
1890
1898
  "category": "marketing",
1891
1899
  "path": "marketing/mcp-server-google-analytics.json",
1892
- "validated": false,
1893
- "tools": {}
1900
+ "validated": true,
1901
+ "tools": {
1902
+ "get_report": {
1903
+ "name": "get_report",
1904
+ "description": "Get a report from Google Analytics Data API"
1905
+ },
1906
+ "get_realtime_data": {
1907
+ "name": "get_realtime_data",
1908
+ "description": "Get realtime data from Google Analytics Data API"
1909
+ }
1910
+ }
1894
1911
  },
1895
- "@AshDevFr/discourse-mcp-server": {
1912
+ "@ashdev/discourse-mcp-server": {
1896
1913
  "category": "marketing",
1897
1914
  "path": "marketing/ashdevfr-discourse-mcp-server.json",
1915
+ "validated": true,
1916
+ "tools": {
1917
+ "search_posts": {
1918
+ "name": "search_posts",
1919
+ "description": "Search Discourse posts"
1920
+ }
1921
+ }
1922
+ },
1923
+ "@toolsdk.ai/mcp-server-google-analytics": {
1924
+ "category": "marketing",
1925
+ "path": "marketing/mcp-server-google-analytics.json",
1926
+ "validated": true,
1927
+ "tools": {
1928
+ "get_report": {
1929
+ "name": "get_report",
1930
+ "description": "Get a report from Google Analytics Data API"
1931
+ },
1932
+ "get_realtime_data": {
1933
+ "name": "get_realtime_data",
1934
+ "description": "Get realtime data from Google Analytics Data API"
1935
+ }
1936
+ }
1937
+ },
1938
+ "@toolsdk.ai/mcp-mercury": {
1939
+ "category": "finance-fintech",
1940
+ "path": "finance-fintech/mercury-mcp.json",
1898
1941
  "validated": false,
1899
1942
  "tools": {}
1900
1943
  },
1901
1944
  "@dragonkhoi/mercury-mcp": {
1902
1945
  "category": "finance-fintech",
1903
1946
  "path": "finance-fintech/mercury-mcp.json",
1904
- "tools": {},
1905
- "validated": false
1947
+ "validated": false,
1948
+ "tools": {}
1906
1949
  }
1907
1950
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toolsdk.ai/registry",
3
- "version": "1.0.82",
3
+ "version": "1.0.83",
4
4
  "description": "An Open, Structured, and Standard Registry for MCP Servers and Packages.",
5
5
  "exports": {
6
6
  "./config/*": "./config/*",
@@ -29,43 +29,45 @@
29
29
  "@modelcontextprotocol/sdk": "^1.12.0",
30
30
  "lodash": "^4.17.21",
31
31
  "zod": "^3.23.30",
32
- "@kazuph/mcp-screenshot": "latest",
33
- "@modelcontextprotocol/server-everything": "latest",
34
- "mcp-server-stability-ai": "latest",
35
- "@executeautomation/playwright-mcp-server": "latest",
36
- "tavily-mcp": "latest",
37
- "@automatalabs/mcp-server-playwright": "latest",
38
- "hyperbrowser-mcp": "latest",
39
- "exa-mcp-server": "latest",
40
- "@modelcontextprotocol/server-puppeteer": "latest",
41
- "mcp-server-kubernetes": "latest",
42
- "@strowk/mcp-k8s": "latest",
43
- "mcp-shell": "latest",
44
- "mcp-server-commands": "latest",
45
- "@enescinar/twitter-mcp": "latest",
46
- "@modelcontextprotocol/server-slack": "latest",
47
- "airtable-mcp-server": "latest",
48
- "@niledatabase/nile-mcp-server": "latest",
49
- "@llmindset/mcp-hfspace": "latest",
50
- "@mcp-get-community/server-macos": "latest",
51
- "@mcp-get-community/server-llm-txt": "latest",
52
- "@modelcontextprotocol/server-memory": "latest",
53
- "@modelcontextprotocol/server-google-maps": "latest",
54
- "@raygun.io/mcp-server-raygun": "latest",
55
- "brave-search-mcp": "latest",
56
- "@modelcontextprotocol/server-brave-search": "latest",
57
- "anilist-mcp": "latest",
58
- "@chanmeng666/google-news-server": "latest",
59
- "graphlit-mcp-server": "latest",
60
- "@kimtaeyoon83/mcp-server-youtube-transcript": "latest",
61
- "@modelcontextprotocol/server-aws-kb-retrieval": "latest",
62
- "@mcp-get-community/server-curl": "latest",
63
- "@anaisbetts/mcp-youtube": "latest",
64
- "@modelcontextprotocol/server-gitlab": "latest",
65
- "@modelcontextprotocol/server-github": "latest",
66
- "@chargebee/mcp": "latest",
67
- "mcp-server-flomo": "latest",
68
- "@modelcontextprotocol/server-sequential-thinking": "latest"
32
+ "@kazuph/mcp-screenshot": "1.0.4",
33
+ "@modelcontextprotocol/server-everything": "2025.5.12",
34
+ "mcp-server-stability-ai": "0.2.0",
35
+ "@executeautomation/playwright-mcp-server": "1.0.6",
36
+ "tavily-mcp": "0.2.4",
37
+ "@automatalabs/mcp-server-playwright": "1.2.1",
38
+ "hyperbrowser-mcp": "1.0.25",
39
+ "exa-mcp-server": "0.3.10",
40
+ "@modelcontextprotocol/server-puppeteer": "2025.5.12",
41
+ "mcp-server-kubernetes": "2.4.3",
42
+ "@strowk/mcp-k8s": "0.3.6",
43
+ "mcp-shell": "0.1.3",
44
+ "mcp-server-commands": "0.5.0",
45
+ "@enescinar/twitter-mcp": "0.2.0",
46
+ "@modelcontextprotocol/server-slack": "2025.4.25",
47
+ "airtable-mcp-server": "1.4.1",
48
+ "@niledatabase/nile-mcp-server": "1.4.0",
49
+ "@llmindset/mcp-hfspace": "0.5.4",
50
+ "@mcp-get-community/server-macos": "0.1.0",
51
+ "@mcp-get-community/server-llm-txt": "0.6.2",
52
+ "@modelcontextprotocol/server-memory": "2025.4.25",
53
+ "@modelcontextprotocol/server-google-maps": "0.6.2",
54
+ "@raygun.io/mcp-server-raygun": "0.1.0",
55
+ "brave-search-mcp": "0.7.5",
56
+ "@modelcontextprotocol/server-brave-search": "0.6.2",
57
+ "anilist-mcp": "1.2.4",
58
+ "@chanmeng666/google-news-server": "1.0.0",
59
+ "graphlit-mcp-server": "1.0.20250625001",
60
+ "@kimtaeyoon83/mcp-server-youtube-transcript": "0.1.1",
61
+ "@modelcontextprotocol/server-aws-kb-retrieval": "0.6.2",
62
+ "@mcp-get-community/server-curl": "0.1.0",
63
+ "@anaisbetts/mcp-youtube": "0.6.0",
64
+ "@modelcontextprotocol/server-gitlab": "2025.4.25",
65
+ "@modelcontextprotocol/server-github": "2025.4.8",
66
+ "@chargebee/mcp": "0.0.4",
67
+ "mcp-server-flomo": "0.0.11",
68
+ "@modelcontextprotocol/server-sequential-thinking": "0.6.2",
69
+ "@toolsdk.ai/mcp-server-google-analytics": "0.1.0",
70
+ "@ashdev/discourse-mcp-server": "1.0.2"
69
71
  },
70
72
  "devDependencies": {
71
73
  "@eslint/js": "^9.27.0",
@@ -2,7 +2,7 @@
2
2
  "type": "mcp-server",
3
3
  "name": "Mercury",
4
4
  "logo": "https://pbs.twimg.com/profile_images/1651255375352721409/TP4SN0Nz_400x400.png",
5
- "packageName": "@dragonkhoi/mercury-mcp",
5
+ "packageName": "@toolsdk.ai/mcp-mercury",
6
6
  "description": "Simple MCP server that interfaces with the Mercury API, allowing you to talk to your Mercury banking data from any MCP client like Cursor or Claude Desktop.",
7
7
  "url": "https://github.com/dragonkhoi/mercury-mcp/tree/main/src",
8
8
  "runtime": "node",
@@ -13,4 +13,4 @@
13
13
  "required": true
14
14
  }
15
15
  }
16
- }
16
+ }
@@ -2,7 +2,7 @@
2
2
  "type": "mcp-server",
3
3
  "name": "Discourse",
4
4
  "logo": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Discourse_icon.svg/60px-Discourse_icon.svg.png",
5
- "packageName": "@AshDevFr/discourse-mcp-server",
5
+ "packageName": "@ashdev/discourse-mcp-server",
6
6
  "description": "Node.js server implementing Model Context Protocol (MCP) for Discourse search operation.",
7
7
  "url": "https://github.com/AshDevFr/discourse-mcp-server/tree/main/src",
8
8
  "runtime": "node",
@@ -2,9 +2,9 @@
2
2
  "type": "mcp-server",
3
3
  "name": "Google-Analytics",
4
4
  "logo": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/77/GAnalytics.svg/1024px-GAnalytics.svg.png",
5
- "packageName": "mcp-server-google-analytics",
5
+ "packageName": "@toolsdk.ai/mcp-server-google-analytics",
6
6
  "description": "An MCP server implementation for accessing Google Analytics 4 (GA4) data, built using the Model Context Protocol TypeScript SDK.",
7
- "url": "https://github.com/Seey215/mcp-server-google-analytics",
7
+ "url": "https://github.com/smithery-ai/mcp-server-google-analytics",
8
8
  "runtime": "node",
9
9
  "license": "MIT",
10
10
  "env": {