@serpstat/serpstat-mcp-server 1.1.1 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.1.2] - 2025-10-24
4
+
5
+ ### Added
6
+
7
+ - **Category Filtering**: Added support for filtering tools by categories via `SERPSTAT_ENABLED_CATEGORIES` environment variable
8
+ - Enable only specific tool categories to reduce context window usage in AI assistants
9
+ - Comma-separated list of categories: `domain`, `keywords`, `backlinks`, `url`, `projects`, `credits`, `rt`, `audit`, `page-audit`
10
+ - Default behavior (no filter): all 63 tools available across 9 categories
11
+ - Example: `SERPSTAT_ENABLED_CATEGORIES=keywords,domain` loads only keyword research (8 tools) and domain analysis (6 tools) tools
12
+ - Useful for creating specialized configurations focused on specific SEO analysis areas
13
+ - Updated documentation with category filtering examples in README.md and CLAUDE.md
14
+ - Added category-based handler organization in `src/server.ts` for maintainable tool management
15
+
16
+
3
17
  ## [1.1.1] - 2025-10-04
4
18
 
5
19
  ### Added
package/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Serpstat MCP Server
2
2
 
3
3
  [![npm version](https://badge.fury.io/js/@serpstat%2Fserpstat-mcp-server.svg)](https://badge.fury.io/js/@serpstat%2Fserpstat-mcp-server)
4
+ [![MCP Badge](https://lobehub.com/badge/mcp/serpstatglobal-serpstat-mcp-server-js)](https://lobehub.com/mcp/serpstatglobal-serpstat-mcp-server-js)
4
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
6
 
6
7
  A TypeScript server that integrates Serpstat SEO API with Anthropic's Model Context Protocol (MCP), enabling AI assistants like Claude to access comprehensive SEO data and analysis tools.
@@ -66,6 +67,7 @@ Set the following environment variables (can be in .env file):
66
67
  - `SERPSTAT_API_TOKEN` — Your Serpstat API token (required)
67
68
  - `SERPSTAT_API_URL` — Serpstat API URL (default: https://api.serpstat.com/v4)
68
69
  - `LOG_LEVEL` — Logging level: error, warn, info, debug (default: info)
70
+ - `SERPSTAT_ENABLED_CATEGORIES` — Filter tools by categories (optional, comma-separated, default: all categories enabled)
69
71
 
70
72
  ### Claude Desktop & Gemini CLI Configuration
71
73
 
@@ -104,13 +106,69 @@ For local development, use the full path:
104
106
  "command": "node",
105
107
  "args": ["/path/to/node_modules/serpstat-mcp-server/dist/index.js"],
106
108
  "env": {
107
- "SERPSTAT_API_TOKEN": "your_serpstat_api_token_here"
109
+ "SERPSTAT_API_TOKEN": "9184b2aa2328fd93bf002ed4c59e4e8e"
108
110
  }
109
111
  }
110
112
  }
111
113
  }
112
114
  ```
113
115
 
116
+ ### Filtering Tools by Category
117
+
118
+ You can limit which tools are available by specifying `SERPSTAT_ENABLED_CATEGORIES` environment variable. This is useful for:
119
+ - Reducing context window usage in AI assistants
120
+ - Focusing on specific SEO analysis areas
121
+ - Creating specialized configurations for different use cases
122
+
123
+ **Available categories:**
124
+ - `domain` - Domain analysis tools (domain info, competitors, domain keywords, etc.)
125
+ - `keywords` - Keyword research tools (keyword suggestions, search volume, difficulty, etc.)
126
+ - `backlinks` - Backlink analysis tools (backlink summary, anchors, referring domains, etc.)
127
+ - `url` - URL analysis tools (URL traffic, competitors, keywords, etc.)
128
+ - `projects` - Project management tools (create, list, delete projects)
129
+ - `credits` - Credits and usage monitoring tools
130
+ - `rt` - Rank tracking tools (rank history, SERP tracking, etc.)
131
+ - `audit` - Site audit tools (full site SEO audit, error reports, etc.)
132
+ - `page-audit` - One-page audit tools (single page analysis, on-page SEO, etc.)
133
+
134
+ **Example: Enable only keyword and domain tools**
135
+
136
+ ```json
137
+ {
138
+ "mcpServers": {
139
+ "serpstat": {
140
+ "command": "npx",
141
+ "args": ["-y", "@serpstat/serpstat-mcp-server"],
142
+ "env": {
143
+ "SERPSTAT_API_TOKEN": "YOUR_SERPSTAT_API_TOKEN_HERE",
144
+ "SERPSTAT_ENABLED_CATEGORIES": "keywords,domain"
145
+ }
146
+ }
147
+ }
148
+ }
149
+ ```
150
+
151
+ **Example: Enable only backlink analysis**
152
+
153
+ ```json
154
+ {
155
+ "mcpServers": {
156
+ "serpstat": {
157
+ "command": "npx",
158
+ "args": ["-y", "@serpstat/serpstat-mcp-server"],
159
+ "env": {
160
+ "SERPSTAT_API_TOKEN": "YOUR_SERPSTAT_API_TOKEN_HERE",
161
+ "SERPSTAT_ENABLED_CATEGORIES": "backlinks"
162
+ }
163
+ }
164
+ }
165
+ }
166
+ ```
167
+
168
+ **Default behavior (all tools enabled):**
169
+
170
+ If `SERPSTAT_ENABLED_CATEGORIES` is not specified or is empty, all tools are available (63 total tools across all categories).
171
+
114
172
  ## Usage Examples
115
173
 
116
174
  After installation and configuration in Claude Desktop, you can ask Claude:
@@ -0,0 +1,8 @@
1
+ declare module 'express' {
2
+ interface Request {
3
+ serpstatApiToken?: string;
4
+ userId?: string;
5
+ }
6
+ }
7
+ export declare function startHttpServer(): Promise<void>;
8
+ //# sourceMappingURL=http-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAkCA,OAAO,QAAQ,SAAS,CAAC;IACrB,UAAU,OAAO;QACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;KACnB;CACJ;AAiJD,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA2ErD"}
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.startHttpServer = startHttpServer;
7
+ const express_1 = __importDefault(require("express"));
8
+ const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
9
+ const sse_js_1 = require("./transports/sse.js");
10
+ const auth_js_1 = require("./middleware/auth.js");
11
+ const config_js_1 = require("./utils/config.js");
12
+ const logger_js_1 = require("./utils/logger.js");
13
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
14
+ const domain_tools_js_1 = require("./handlers/domain_tools.js");
15
+ const backlinks_tools_js_1 = require("./handlers/backlinks_tools.js");
16
+ const keyword_tools_js_1 = require("./handlers/keyword_tools.js");
17
+ const url_tools_js_1 = require("./handlers/url_tools.js");
18
+ const project_tools_js_1 = require("./handlers/project_tools.js");
19
+ const credits_tools_js_1 = require("./handlers/credits_tools.js");
20
+ const rank_tracking_tools_js_1 = require("./handlers/rank_tracking_tools.js");
21
+ const site_audit_tools_js_1 = require("./handlers/site_audit_tools.js");
22
+ const one_page_audit_tools_js_1 = require("./handlers/one_page_audit_tools.js");
23
+ class HTTPMCPServer {
24
+ server;
25
+ transport;
26
+ handlers;
27
+ apiToken;
28
+ constructor(apiToken) {
29
+ this.apiToken = apiToken;
30
+ this.server = new index_js_1.Server({
31
+ name: 'serpstat-mcp-server',
32
+ version: '1.1.1',
33
+ }, {
34
+ capabilities: {
35
+ tools: {},
36
+ },
37
+ });
38
+ this.transport = new sse_js_1.SSEServerTransport();
39
+ this.handlers = new Map();
40
+ this.setupHandlers();
41
+ this.setupRoutes();
42
+ }
43
+ setupHandlers() {
44
+ const handlers = [
45
+ new domain_tools_js_1.DomainsInfoHandler(this.apiToken),
46
+ new domain_tools_js_1.CompetitorsHandler(this.apiToken),
47
+ new domain_tools_js_1.DomainKeywordsHandler(this.apiToken),
48
+ new domain_tools_js_1.DomainUrlsHandler(this.apiToken),
49
+ new backlinks_tools_js_1.BacklinksSummaryHandler(this.apiToken),
50
+ new backlinks_tools_js_1.GetAnchorsHandler(this.apiToken),
51
+ new backlinks_tools_js_1.GetActiveBacklinksHandler(this.apiToken),
52
+ new backlinks_tools_js_1.GetReferringDomainsHandler(this.apiToken),
53
+ new backlinks_tools_js_1.GetLostBacklinksHandler(this.apiToken),
54
+ new backlinks_tools_js_1.GetTopAnchorsHandler(this.apiToken),
55
+ new backlinks_tools_js_1.GetTopPagesByBacklinksHandler(this.apiToken),
56
+ new backlinks_tools_js_1.GetBacklinksIntersectionHandler(this.apiToken),
57
+ new backlinks_tools_js_1.GetActiveOutlinksHandler(this.apiToken),
58
+ new backlinks_tools_js_1.GetActiveOutlinkDomainsHandler(this.apiToken),
59
+ new backlinks_tools_js_1.GetThreatBacklinksHandler(this.apiToken),
60
+ new domain_tools_js_1.DomainRegionsCountHandler(this.apiToken),
61
+ new domain_tools_js_1.GetDomainUniqKeywordsHandler(this.apiToken),
62
+ new keyword_tools_js_1.GetKeywordsHandler(this.apiToken),
63
+ new keyword_tools_js_1.GetRelatedKeywordsHandler(this.apiToken),
64
+ new keyword_tools_js_1.GetKeywordsInfoHandler(this.apiToken),
65
+ new keyword_tools_js_1.GetKeywordSuggestionsHandler(this.apiToken),
66
+ new keyword_tools_js_1.GetKeywordFullTopHandler(this.apiToken),
67
+ new keyword_tools_js_1.GetKeywordTopUrlsHandler(this.apiToken),
68
+ new keyword_tools_js_1.GetKeywordCompetitorsHandler(this.apiToken),
69
+ new keyword_tools_js_1.GetKeywordTopHandler(this.apiToken),
70
+ new url_tools_js_1.GetUrlSummaryTrafficHandler(this.apiToken),
71
+ new url_tools_js_1.GetUrlCompetitorsHandler(this.apiToken),
72
+ new url_tools_js_1.GetUrlKeywordsHandler(this.apiToken),
73
+ new url_tools_js_1.GetUrlMissingKeywordsHandler(this.apiToken),
74
+ new project_tools_js_1.CreateProjectHandler(this.apiToken),
75
+ new project_tools_js_1.DeleteProjectHandler(this.apiToken),
76
+ new project_tools_js_1.ListProjectsHandler(this.apiToken),
77
+ new credits_tools_js_1.GetAuditStatsHandler(this.apiToken),
78
+ new credits_tools_js_1.GetCreditsStatsHandler(this.apiToken),
79
+ new rank_tracking_tools_js_1.GetRtProjectsListHandler(this.apiToken),
80
+ new rank_tracking_tools_js_1.GetRtProjectStatusHandler(this.apiToken),
81
+ new rank_tracking_tools_js_1.GetRtProjectRegionsListHandler(this.apiToken),
82
+ new rank_tracking_tools_js_1.GetRtProjectKeywordSerpHistoryHandler(this.apiToken),
83
+ new rank_tracking_tools_js_1.GetRtProjectUrlSerpHistoryHandler(this.apiToken),
84
+ new site_audit_tools_js_1.GetSiteAuditSettingsHandler(this.apiToken),
85
+ new site_audit_tools_js_1.SetSiteAuditSettingsHandler(this.apiToken),
86
+ new site_audit_tools_js_1.StartSiteAuditHandler(this.apiToken),
87
+ new site_audit_tools_js_1.StopSiteAuditHandler(this.apiToken),
88
+ new site_audit_tools_js_1.GetCategoriesStatisticHandler(this.apiToken),
89
+ new site_audit_tools_js_1.GetHistoryByCountErrorHandler(this.apiToken),
90
+ new site_audit_tools_js_1.GetSiteAuditsListHandler(this.apiToken),
91
+ new site_audit_tools_js_1.GetScanUserUrlListHandler(this.apiToken),
92
+ new site_audit_tools_js_1.GetDefaultSettingsHandler(this.apiToken),
93
+ new site_audit_tools_js_1.GetBasicInfoHandler(this.apiToken),
94
+ new site_audit_tools_js_1.GetReportWithoutDetailsHandler(this.apiToken),
95
+ new site_audit_tools_js_1.GetErrorElementsHandler(this.apiToken),
96
+ new site_audit_tools_js_1.GetSubElementsByCrcHandler(this.apiToken),
97
+ new one_page_audit_tools_js_1.StartOnePageAuditScanHandler(this.apiToken),
98
+ new one_page_audit_tools_js_1.GetOnePageAuditsListHandler(this.apiToken),
99
+ new one_page_audit_tools_js_1.GetOnePageReportsListHandler(this.apiToken),
100
+ new one_page_audit_tools_js_1.GetOnePageAuditResultsHandler(this.apiToken),
101
+ new one_page_audit_tools_js_1.RescanOnePageAuditHandler(this.apiToken),
102
+ new one_page_audit_tools_js_1.StopOnePageAuditHandler(this.apiToken),
103
+ new one_page_audit_tools_js_1.RemoveOnePageAuditHandler(this.apiToken),
104
+ new one_page_audit_tools_js_1.GetOnePageAuditByCategoriesHandler(this.apiToken),
105
+ new one_page_audit_tools_js_1.GetOnePageAuditErrorRowsHandler(this.apiToken),
106
+ new one_page_audit_tools_js_1.GetOnePageAuditPageNamesHandler(this.apiToken),
107
+ new one_page_audit_tools_js_1.GetOnePageAuditUserLogHandler(this.apiToken),
108
+ ];
109
+ for (const handler of handlers) {
110
+ this.handlers.set(handler.getName(), handler);
111
+ }
112
+ logger_js_1.logger.info(`Registered ${handlers.length} tool handlers`);
113
+ }
114
+ setupRoutes() {
115
+ this.server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
116
+ const tools = Array.from(this.handlers.values()).map(handler => ({
117
+ name: handler.getName(),
118
+ description: handler.getDescription(),
119
+ inputSchema: handler.getInputSchema(),
120
+ }));
121
+ logger_js_1.logger.debug(`Listing ${tools.length} available tools`);
122
+ return { tools };
123
+ });
124
+ this.server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
125
+ const { name, arguments: args } = request.params;
126
+ logger_js_1.logger.info(`Tool call received: ${name}`, { arguments: args });
127
+ const handler = this.handlers.get(name);
128
+ if (!handler) {
129
+ throw new Error(`Unknown tool: ${name}`);
130
+ }
131
+ const result = await handler.handle({ name, arguments: args ?? {} });
132
+ logger_js_1.logger.info(`Tool call completed: ${name}`, {
133
+ success: !result.isError,
134
+ responseLength: result.content?.[0]?.text?.length
135
+ });
136
+ return { ...result };
137
+ });
138
+ }
139
+ async connect() {
140
+ await this.server.connect(this.transport);
141
+ logger_js_1.logger.info('MCP Server connected to SSE transport');
142
+ }
143
+ getTransport() {
144
+ return this.transport;
145
+ }
146
+ }
147
+ async function startHttpServer() {
148
+ const config = (0, config_js_1.loadConfig)();
149
+ const httpPort = config.httpPort || 8081;
150
+ const app = (0, express_1.default)();
151
+ app.use(express_1.default.json());
152
+ app.get('/health', (req, res) => {
153
+ res.json({ status: 'ok', service: 'serpstat-mcp-server', version: '1.1.1' });
154
+ });
155
+ app.get('/sse', auth_js_1.authenticateOAuth, async (req, res) => {
156
+ try {
157
+ const apiToken = req.serpstatApiToken;
158
+ const userId = req.userId;
159
+ logger_js_1.logger.info('SSE connection established', { userId });
160
+ const mcpServer = new HTTPMCPServer(apiToken);
161
+ await mcpServer.connect();
162
+ const transport = mcpServer.getTransport();
163
+ transport.handleSSE(req, res);
164
+ logger_js_1.logger.info('SSE transport initialized', { userId });
165
+ }
166
+ catch (error) {
167
+ logger_js_1.logger.error('SSE connection error', error);
168
+ res.status(500).json({ error: 'server_error', message: 'Failed to establish SSE connection' });
169
+ }
170
+ });
171
+ app.post('/message', auth_js_1.authenticateOAuth, async (req, res) => {
172
+ try {
173
+ const apiToken = req.serpstatApiToken;
174
+ const message = req.body;
175
+ logger_js_1.logger.info('JSON-RPC message received', { method: message.method });
176
+ const mcpServer = new HTTPMCPServer(apiToken);
177
+ await mcpServer.connect();
178
+ const transport = mcpServer.getTransport();
179
+ const responsePromise = new Promise((resolve) => {
180
+ const originalSend = transport.send.bind(transport);
181
+ transport.send = async (response) => {
182
+ resolve(response);
183
+ return Promise.resolve();
184
+ };
185
+ });
186
+ transport.handleMessage(message);
187
+ const response = await responsePromise;
188
+ res.json(response);
189
+ }
190
+ catch (error) {
191
+ logger_js_1.logger.error('Message handling error', error);
192
+ res.status(500).json({ error: 'server_error', message: 'Failed to process message' });
193
+ }
194
+ });
195
+ app.listen(httpPort, () => {
196
+ logger_js_1.logger.info(`Serpstat MCP HTTP Server listening on port ${httpPort}`);
197
+ logger_js_1.logger.info(`Health check: http://localhost:${httpPort}/health`);
198
+ logger_js_1.logger.info(`SSE endpoint: http://localhost:${httpPort}/sse`);
199
+ logger_js_1.logger.info(`Message endpoint: http://localhost:${httpPort}/message`);
200
+ });
201
+ }
202
+ //# sourceMappingURL=http-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":";;;;;AAwLA,0CA2EC;AAnQD,sDAAqD;AACrD,wEAAmE;AACnE,gDAAyD;AACzD,kDAAyD;AACzD,iDAA+C;AAC/C,iDAA2C;AAC3C,iEAG4C;AAE5C,gEAAuL;AACvL,sEAAsV;AACtV,kEAA0P;AAC1P,0DAAqJ;AACrJ,kEAA8G;AAC9G,kEAA2F;AAC3F,8EAAkN;AAClN,wEAA+Y;AAC/Y,gFAY4C;AAU5C,MAAM,aAAa;IACP,MAAM,CAAS;IACf,SAAS,CAAqB;IAC9B,QAAQ,CAA2B;IACnC,QAAQ,CAAU;IAE1B,YAAY,QAAiB;QACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAM,CACpB;YACI,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,OAAO;SACnB,EACD;YACI,YAAY,EAAE;gBACV,KAAK,EAAE,EAAE;aACZ;SACJ,CACJ,CAAC;QAEF,IAAI,CAAC,SAAS,GAAG,IAAI,2BAAkB,EAAE,CAAC;QAC1C,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEO,aAAa;QACjB,MAAM,QAAQ,GAAG;YACb,IAAI,oCAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACrC,IAAI,oCAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACrC,IAAI,uCAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACxC,IAAI,mCAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACpC,IAAI,4CAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC1C,IAAI,sCAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACpC,IAAI,8CAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC5C,IAAI,+CAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC7C,IAAI,4CAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC1C,IAAI,yCAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACvC,IAAI,kDAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAChD,IAAI,oDAA+B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAClD,IAAI,6CAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC3C,IAAI,mDAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC;YACjD,IAAI,8CAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC5C,IAAI,2CAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC5C,IAAI,8CAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC/C,IAAI,qCAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACrC,IAAI,4CAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC5C,IAAI,yCAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACzC,IAAI,+CAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC/C,IAAI,2CAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC3C,IAAI,2CAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC3C,IAAI,+CAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC/C,IAAI,uCAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACvC,IAAI,0CAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC9C,IAAI,uCAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC3C,IAAI,oCAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACxC,IAAI,2CAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC/C,IAAI,uCAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACvC,IAAI,uCAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACvC,IAAI,sCAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACtC,IAAI,uCAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACvC,IAAI,yCAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACzC,IAAI,iDAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC3C,IAAI,kDAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC5C,IAAI,uDAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC;YACjD,IAAI,8DAAqC,CAAC,IAAI,CAAC,QAAQ,CAAC;YACxD,IAAI,0DAAiC,CAAC,IAAI,CAAC,QAAQ,CAAC;YACpD,IAAI,iDAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC9C,IAAI,iDAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC9C,IAAI,2CAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACxC,IAAI,0CAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACvC,IAAI,mDAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAChD,IAAI,mDAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAChD,IAAI,8CAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC3C,IAAI,+CAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC5C,IAAI,+CAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC5C,IAAI,yCAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACtC,IAAI,oDAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC;YACjD,IAAI,6CAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC1C,IAAI,gDAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC7C,IAAI,sDAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC/C,IAAI,qDAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC9C,IAAI,sDAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC/C,IAAI,uDAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAChD,IAAI,mDAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC5C,IAAI,iDAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC1C,IAAI,mDAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC5C,IAAI,4DAAkC,CAAC,IAAI,CAAC,QAAQ,CAAC;YACrD,IAAI,yDAA+B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAClD,IAAI,yDAA+B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAClD,IAAI,uDAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC;SACnD,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;QAED,kBAAM,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,MAAM,gBAAgB,CAAC,CAAC;IAC/D,CAAC;IAEO,WAAW;QACf,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,iCAAsB,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC7D,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE;gBACvB,WAAW,EAAE,OAAO,CAAC,cAAc,EAAE;gBACrC,WAAW,EAAE,OAAO,CAAC,cAAc,EAAE;aACxC,CAAC,CAAC,CAAC;YAEJ,kBAAM,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,MAAM,kBAAkB,CAAC,CAAC;YACxD,OAAO,EAAE,KAAK,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,gCAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACnE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YAEjD,kBAAM,CAAC,IAAI,CAAC,uBAAuB,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEhE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;YAErE,kBAAM,CAAC,IAAI,CAAC,wBAAwB,IAAI,EAAE,EAAE;gBACxC,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO;gBACxB,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM;aACpD,CAAC,CAAC;YAEH,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,OAAO;QACT,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1C,kBAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACzD,CAAC;IAED,YAAY;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;CACJ;AAEM,KAAK,UAAU,eAAe;IACjC,MAAM,MAAM,GAAG,IAAA,sBAAU,GAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC;IAEzC,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAGxB,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;QAC/C,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAGH,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,2BAAiB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QACrE,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,GAAG,CAAC,gBAAgB,CAAC;YACtC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAE1B,kBAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAGtD,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;YAE1B,MAAM,SAAS,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC;YAC3C,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAE9B,kBAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,kBAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC5C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,oCAAoC,EAAE,CAAC,CAAC;QACnG,CAAC;IACL,CAAC,CAAC,CAAC;IAGH,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,2BAAiB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QAC1E,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,GAAG,CAAC,gBAAgB,CAAC;YACtC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC;YAEzB,kBAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAGrE,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;YAE1B,MAAM,SAAS,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC;YAG3C,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC5C,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACpD,SAAS,CAAC,IAAI,GAAG,KAAK,EAAE,QAAQ,EAAE,EAAE;oBAChC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBAClB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC7B,CAAC,CAAC;YACN,CAAC,CAAC,CAAC;YAGH,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAGjC,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC;YACvC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,kBAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAC9C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;QAC1F,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,kBAAM,CAAC,IAAI,CAAC,8CAA8C,QAAQ,EAAE,CAAC,CAAC;QACtE,kBAAM,CAAC,IAAI,CAAC,kCAAkC,QAAQ,SAAS,CAAC,CAAC;QACjE,kBAAM,CAAC,IAAI,CAAC,kCAAkC,QAAQ,MAAM,CAAC,CAAC;QAC9D,kBAAM,CAAC,IAAI,CAAC,sCAAsC,QAAQ,UAAU,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ export declare function authenticateOAuth(req: Request, res: Response, next: NextFunction): Promise<void>;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AA+D1D,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8EtG"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.authenticateOAuth = authenticateOAuth;
7
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
8
+ const axios_1 = __importDefault(require("axios"));
9
+ const logger_js_1 = require("../utils/logger.js");
10
+ const SERPSTAT_API_BASE = process.env.SERPSTAT_API_BASE || 'https://serpstat.com';
11
+ const TEST_MODE = process.env.OAUTH_TEST_MODE === 'true';
12
+ const apiTokenCache = new Map();
13
+ async function getSerpstatApiToken(sessionToken) {
14
+ try {
15
+ const response = await axios_1.default.post(`${SERPSTAT_API_BASE}/node?userProfile.getApiToken`, {
16
+ id: Date.now().toString(),
17
+ jsonrpc: '2.0',
18
+ method: 'userProfile.getApiToken',
19
+ params: {}
20
+ }, {
21
+ headers: {
22
+ 'accept': 'application/json, text/plain, */*',
23
+ 'content-type': 'application/json;charset=UTF-8',
24
+ 'token': `Bearer ${sessionToken}`
25
+ }
26
+ });
27
+ if (!response.data?.result?.token) {
28
+ throw new Error('Invalid response from Serpstat API');
29
+ }
30
+ return response.data.result.token;
31
+ }
32
+ catch (error) {
33
+ if (axios_1.default.isAxiosError(error)) {
34
+ logger_js_1.logger.error('Serpstat API token request failed', {
35
+ status: error.response?.status,
36
+ data: error.response?.data
37
+ });
38
+ }
39
+ else {
40
+ logger_js_1.logger.error('Serpstat API token request error', error);
41
+ }
42
+ throw error;
43
+ }
44
+ }
45
+ async function authenticateOAuth(req, res, next) {
46
+ const authHeader = req.headers.authorization;
47
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
48
+ res.status(401).json({
49
+ error: 'unauthorized',
50
+ message: 'Missing or invalid Authorization header'
51
+ });
52
+ return;
53
+ }
54
+ const sessionToken = authHeader.substring(7);
55
+ try {
56
+ if (TEST_MODE) {
57
+ const testApiToken = process.env.SERPSTAT_API_TOKEN || 'test-token';
58
+ req.serpstatApiToken = testApiToken;
59
+ req.userId = 'test-user';
60
+ next();
61
+ return;
62
+ }
63
+ const decoded = jsonwebtoken_1.default.decode(sessionToken);
64
+ if (!decoded) {
65
+ logger_js_1.logger.warn('Failed to decode JWT token');
66
+ res.status(401).json({
67
+ error: 'invalid_token',
68
+ message: 'Invalid JWT token format'
69
+ });
70
+ return;
71
+ }
72
+ const userId = decoded.userId?.toString() || decoded.email || 'unknown';
73
+ const cached = apiTokenCache.get(userId);
74
+ if (cached && Date.now() < cached.expiresAt) {
75
+ req.serpstatApiToken = cached.apiToken;
76
+ req.userId = userId;
77
+ next();
78
+ return;
79
+ }
80
+ const apiToken = await getSerpstatApiToken(sessionToken);
81
+ const expiresAt = decoded.exp
82
+ ? decoded.exp * 1000 - 10 * 60 * 1000
83
+ : Date.now() + 3600 * 1000;
84
+ apiTokenCache.set(userId, {
85
+ apiToken,
86
+ expiresAt
87
+ });
88
+ req.serpstatApiToken = apiToken;
89
+ req.userId = userId;
90
+ logger_js_1.logger.info('Serpstat API token retrieved successfully', { userId });
91
+ next();
92
+ }
93
+ catch (error) {
94
+ if (axios_1.default.isAxiosError(error)) {
95
+ const status = error.response?.status;
96
+ if (status === 401 || status === 403) {
97
+ logger_js_1.logger.warn('Serpstat session token invalid or expired');
98
+ res.status(401).json({
99
+ error: 'invalid_token',
100
+ message: 'Session token is invalid or expired'
101
+ });
102
+ return;
103
+ }
104
+ }
105
+ logger_js_1.logger.error('Authentication error', error);
106
+ res.status(500).json({
107
+ error: 'server_error',
108
+ message: 'Authentication failed'
109
+ });
110
+ }
111
+ }
112
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AA8BA,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAA2B;;IAoB3C,OAAO,CAAC,aAAa;IA0ErB,OAAO,CAAC,WAAW;IAkCb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK/B"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AA8BA,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAA2B;;IAoB3C,OAAO,CAAC,aAAa;IAyHrB,OAAO,CAAC,WAAW;IAkCb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK/B"}
package/dist/server.js CHANGED
@@ -20,7 +20,7 @@ class SerpstatMCPServer {
20
20
  constructor() {
21
21
  this.server = new index_js_1.Server({
22
22
  name: 'serpstat-mcp-server',
23
- version: '1.1.1',
23
+ version: '1.1.2',
24
24
  }, {
25
25
  capabilities: {
26
26
  tools: {},
@@ -31,71 +31,111 @@ class SerpstatMCPServer {
31
31
  this.setupRoutes();
32
32
  }
33
33
  setupHandlers() {
34
- const handlers = [
35
- new domain_tools_js_1.DomainsInfoHandler(),
36
- new domain_tools_js_1.CompetitorsHandler(),
37
- new domain_tools_js_1.DomainKeywordsHandler(),
38
- new domain_tools_js_1.DomainUrlsHandler(),
39
- new backlinks_tools_js_1.BacklinksSummaryHandler(),
40
- new backlinks_tools_js_1.GetAnchorsHandler(),
41
- new backlinks_tools_js_1.GetActiveBacklinksHandler(),
42
- new backlinks_tools_js_1.GetReferringDomainsHandler(),
43
- new backlinks_tools_js_1.GetLostBacklinksHandler(),
44
- new backlinks_tools_js_1.GetTopAnchorsHandler(),
45
- new backlinks_tools_js_1.GetTopPagesByBacklinksHandler(),
46
- new backlinks_tools_js_1.GetBacklinksIntersectionHandler(),
47
- new backlinks_tools_js_1.GetActiveOutlinksHandler(),
48
- new backlinks_tools_js_1.GetActiveOutlinkDomainsHandler(),
49
- new backlinks_tools_js_1.GetThreatBacklinksHandler(),
50
- new domain_tools_js_1.DomainRegionsCountHandler(),
51
- new domain_tools_js_1.GetDomainUniqKeywordsHandler(),
52
- new keyword_tools_js_1.GetKeywordsHandler(),
53
- new keyword_tools_js_1.GetRelatedKeywordsHandler(),
54
- new keyword_tools_js_1.GetKeywordsInfoHandler(),
55
- new keyword_tools_js_1.GetKeywordSuggestionsHandler(),
56
- new keyword_tools_js_1.GetKeywordFullTopHandler(),
57
- new keyword_tools_js_1.GetKeywordTopUrlsHandler(),
58
- new keyword_tools_js_1.GetKeywordCompetitorsHandler(),
59
- new keyword_tools_js_1.GetKeywordTopHandler(),
60
- new url_tools_js_1.GetUrlSummaryTrafficHandler(),
61
- new url_tools_js_1.GetUrlCompetitorsHandler(),
62
- new url_tools_js_1.GetUrlKeywordsHandler(),
63
- new url_tools_js_1.GetUrlMissingKeywordsHandler(),
64
- new project_tools_js_1.CreateProjectHandler(),
65
- new project_tools_js_1.DeleteProjectHandler(),
66
- new project_tools_js_1.ListProjectsHandler(),
67
- new credits_tools_js_1.GetAuditStatsHandler(),
68
- new credits_tools_js_1.GetCreditsStatsHandler(),
69
- new rank_tracking_tools_js_1.GetRtProjectsListHandler(),
70
- new rank_tracking_tools_js_1.GetRtProjectStatusHandler(),
71
- new rank_tracking_tools_js_1.GetRtProjectRegionsListHandler(),
72
- new rank_tracking_tools_js_1.GetRtProjectKeywordSerpHistoryHandler(),
73
- new rank_tracking_tools_js_1.GetRtProjectUrlSerpHistoryHandler(),
74
- new site_audit_tools_js_1.GetSiteAuditSettingsHandler(),
75
- new site_audit_tools_js_1.SetSiteAuditSettingsHandler(),
76
- new site_audit_tools_js_1.StartSiteAuditHandler(),
77
- new site_audit_tools_js_1.StopSiteAuditHandler(),
78
- new site_audit_tools_js_1.GetCategoriesStatisticHandler(),
79
- new site_audit_tools_js_1.GetHistoryByCountErrorHandler(),
80
- new site_audit_tools_js_1.GetSiteAuditsListHandler(),
81
- new site_audit_tools_js_1.GetScanUserUrlListHandler(),
82
- new site_audit_tools_js_1.GetDefaultSettingsHandler(),
83
- new site_audit_tools_js_1.GetBasicInfoHandler(),
84
- new site_audit_tools_js_1.GetReportWithoutDetailsHandler(),
85
- new site_audit_tools_js_1.GetErrorElementsHandler(),
86
- new site_audit_tools_js_1.GetSubElementsByCrcHandler(),
87
- new one_page_audit_tools_js_1.StartOnePageAuditScanHandler(),
88
- new one_page_audit_tools_js_1.GetOnePageAuditsListHandler(),
89
- new one_page_audit_tools_js_1.GetOnePageReportsListHandler(),
90
- new one_page_audit_tools_js_1.GetOnePageAuditResultsHandler(),
91
- new one_page_audit_tools_js_1.RescanOnePageAuditHandler(),
92
- new one_page_audit_tools_js_1.StopOnePageAuditHandler(),
93
- new one_page_audit_tools_js_1.RemoveOnePageAuditHandler(),
94
- new one_page_audit_tools_js_1.GetOnePageAuditByCategoriesHandler(),
95
- new one_page_audit_tools_js_1.GetOnePageAuditErrorRowsHandler(),
96
- new one_page_audit_tools_js_1.GetOnePageAuditPageNamesHandler(),
97
- new one_page_audit_tools_js_1.GetOnePageAuditUserLogHandler(),
98
- ];
34
+ const enabledCategoriesEnv = process.env.SERPSTAT_ENABLED_CATEGORIES;
35
+ const enabledCategories = enabledCategoriesEnv
36
+ ? enabledCategoriesEnv.split(',').map(c => c.trim().toLowerCase())
37
+ : null;
38
+ const handlersByCategory = {
39
+ domain: [
40
+ new domain_tools_js_1.DomainsInfoHandler(),
41
+ new domain_tools_js_1.CompetitorsHandler(),
42
+ new domain_tools_js_1.DomainKeywordsHandler(),
43
+ new domain_tools_js_1.DomainUrlsHandler(),
44
+ new domain_tools_js_1.DomainRegionsCountHandler(),
45
+ new domain_tools_js_1.GetDomainUniqKeywordsHandler(),
46
+ ],
47
+ keywords: [
48
+ new keyword_tools_js_1.GetKeywordsHandler(),
49
+ new keyword_tools_js_1.GetRelatedKeywordsHandler(),
50
+ new keyword_tools_js_1.GetKeywordsInfoHandler(),
51
+ new keyword_tools_js_1.GetKeywordSuggestionsHandler(),
52
+ new keyword_tools_js_1.GetKeywordFullTopHandler(),
53
+ new keyword_tools_js_1.GetKeywordTopUrlsHandler(),
54
+ new keyword_tools_js_1.GetKeywordCompetitorsHandler(),
55
+ new keyword_tools_js_1.GetKeywordTopHandler(),
56
+ ],
57
+ backlinks: [
58
+ new backlinks_tools_js_1.BacklinksSummaryHandler(),
59
+ new backlinks_tools_js_1.GetAnchorsHandler(),
60
+ new backlinks_tools_js_1.GetActiveBacklinksHandler(),
61
+ new backlinks_tools_js_1.GetReferringDomainsHandler(),
62
+ new backlinks_tools_js_1.GetLostBacklinksHandler(),
63
+ new backlinks_tools_js_1.GetTopAnchorsHandler(),
64
+ new backlinks_tools_js_1.GetTopPagesByBacklinksHandler(),
65
+ new backlinks_tools_js_1.GetBacklinksIntersectionHandler(),
66
+ new backlinks_tools_js_1.GetActiveOutlinksHandler(),
67
+ new backlinks_tools_js_1.GetActiveOutlinkDomainsHandler(),
68
+ new backlinks_tools_js_1.GetThreatBacklinksHandler(),
69
+ ],
70
+ url: [
71
+ new url_tools_js_1.GetUrlSummaryTrafficHandler(),
72
+ new url_tools_js_1.GetUrlCompetitorsHandler(),
73
+ new url_tools_js_1.GetUrlKeywordsHandler(),
74
+ new url_tools_js_1.GetUrlMissingKeywordsHandler(),
75
+ ],
76
+ projects: [
77
+ new project_tools_js_1.CreateProjectHandler(),
78
+ new project_tools_js_1.DeleteProjectHandler(),
79
+ new project_tools_js_1.ListProjectsHandler(),
80
+ ],
81
+ credits: [
82
+ new credits_tools_js_1.GetAuditStatsHandler(),
83
+ new credits_tools_js_1.GetCreditsStatsHandler(),
84
+ ],
85
+ rt: [
86
+ new rank_tracking_tools_js_1.GetRtProjectsListHandler(),
87
+ new rank_tracking_tools_js_1.GetRtProjectStatusHandler(),
88
+ new rank_tracking_tools_js_1.GetRtProjectRegionsListHandler(),
89
+ new rank_tracking_tools_js_1.GetRtProjectKeywordSerpHistoryHandler(),
90
+ new rank_tracking_tools_js_1.GetRtProjectUrlSerpHistoryHandler(),
91
+ ],
92
+ audit: [
93
+ new site_audit_tools_js_1.GetSiteAuditSettingsHandler(),
94
+ new site_audit_tools_js_1.SetSiteAuditSettingsHandler(),
95
+ new site_audit_tools_js_1.StartSiteAuditHandler(),
96
+ new site_audit_tools_js_1.StopSiteAuditHandler(),
97
+ new site_audit_tools_js_1.GetCategoriesStatisticHandler(),
98
+ new site_audit_tools_js_1.GetHistoryByCountErrorHandler(),
99
+ new site_audit_tools_js_1.GetSiteAuditsListHandler(),
100
+ new site_audit_tools_js_1.GetScanUserUrlListHandler(),
101
+ new site_audit_tools_js_1.GetDefaultSettingsHandler(),
102
+ new site_audit_tools_js_1.GetBasicInfoHandler(),
103
+ new site_audit_tools_js_1.GetReportWithoutDetailsHandler(),
104
+ new site_audit_tools_js_1.GetErrorElementsHandler(),
105
+ new site_audit_tools_js_1.GetSubElementsByCrcHandler(),
106
+ ],
107
+ 'page-audit': [
108
+ new one_page_audit_tools_js_1.StartOnePageAuditScanHandler(),
109
+ new one_page_audit_tools_js_1.GetOnePageAuditsListHandler(),
110
+ new one_page_audit_tools_js_1.GetOnePageReportsListHandler(),
111
+ new one_page_audit_tools_js_1.GetOnePageAuditResultsHandler(),
112
+ new one_page_audit_tools_js_1.RescanOnePageAuditHandler(),
113
+ new one_page_audit_tools_js_1.StopOnePageAuditHandler(),
114
+ new one_page_audit_tools_js_1.RemoveOnePageAuditHandler(),
115
+ new one_page_audit_tools_js_1.GetOnePageAuditByCategoriesHandler(),
116
+ new one_page_audit_tools_js_1.GetOnePageAuditErrorRowsHandler(),
117
+ new one_page_audit_tools_js_1.GetOnePageAuditPageNamesHandler(),
118
+ new one_page_audit_tools_js_1.GetOnePageAuditUserLogHandler(),
119
+ ],
120
+ };
121
+ const handlers = [];
122
+ if (enabledCategories === null) {
123
+ for (const categoryHandlers of Object.values(handlersByCategory)) {
124
+ handlers.push(...categoryHandlers);
125
+ }
126
+ logger_js_1.logger.info('All categories enabled');
127
+ }
128
+ else {
129
+ for (const category of enabledCategories) {
130
+ if (handlersByCategory[category]) {
131
+ handlers.push(...handlersByCategory[category]);
132
+ }
133
+ else {
134
+ logger_js_1.logger.warn(`Unknown category: ${category}`);
135
+ }
136
+ }
137
+ logger_js_1.logger.info(`Enabled categories: ${enabledCategories.join(', ')}`);
138
+ }
99
139
  for (const handler of handlers) {
100
140
  this.handlers.set(handler.getName(), handler);
101
141
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
2
+ import { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
3
+ import { Request, Response } from 'express';
4
+ export declare class SSEServerTransport implements Transport {
5
+ private _onclose?;
6
+ private _onerror?;
7
+ private _onmessage?;
8
+ private response?;
9
+ private isConnected;
10
+ constructor();
11
+ start(): Promise<void>;
12
+ close(): Promise<void>;
13
+ send(message: JSONRPCMessage): Promise<void>;
14
+ handleSSE(req: Request, res: Response): void;
15
+ handleMessage(message: JSONRPCMessage): void;
16
+ set onclose(handler: (() => void) | undefined);
17
+ set onerror(handler: ((error: Error) => void) | undefined);
18
+ set onmessage(handler: ((message: JSONRPCMessage) => void) | undefined);
19
+ }
20
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/transports/sse.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE5C,qBAAa,kBAAmB,YAAW,SAAS;IAChD,OAAO,CAAC,QAAQ,CAAC,CAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,CAAyB;IAC1C,OAAO,CAAC,UAAU,CAAC,CAAoC;IACvD,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,WAAW,CAAS;;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlD,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI;IAoB5C,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAK5C,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,EAE5C;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,SAAS,EAExD;IAED,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC,GAAG,SAAS,EAErE;CACJ"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SSEServerTransport = void 0;
4
+ class SSEServerTransport {
5
+ _onclose;
6
+ _onerror;
7
+ _onmessage;
8
+ response;
9
+ isConnected = false;
10
+ constructor() { }
11
+ async start() {
12
+ }
13
+ async close() {
14
+ if (this.response && this.isConnected) {
15
+ this.response.end();
16
+ this.isConnected = false;
17
+ }
18
+ this._onclose?.();
19
+ }
20
+ async send(message) {
21
+ if (!this.response || !this.isConnected) {
22
+ throw new Error('SSE connection not established');
23
+ }
24
+ this.response.write(`data: ${JSON.stringify(message)}\n\n`);
25
+ }
26
+ handleSSE(req, res) {
27
+ res.setHeader('Content-Type', 'text/event-stream');
28
+ res.setHeader('Cache-Control', 'no-cache');
29
+ res.setHeader('Connection', 'keep-alive');
30
+ this.response = res;
31
+ this.isConnected = true;
32
+ req.on('close', () => {
33
+ this.isConnected = false;
34
+ this._onclose?.();
35
+ });
36
+ res.write('data: {"jsonrpc":"2.0","method":"connection","params":{"status":"connected"}}\n\n');
37
+ }
38
+ handleMessage(message) {
39
+ this._onmessage?.(message);
40
+ }
41
+ set onclose(handler) {
42
+ this._onclose = handler;
43
+ }
44
+ set onerror(handler) {
45
+ this._onerror = handler;
46
+ }
47
+ set onmessage(handler) {
48
+ this._onmessage = handler;
49
+ }
50
+ }
51
+ exports.SSEServerTransport = SSEServerTransport;
52
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/transports/sse.ts"],"names":[],"mappings":";;;AAKA,MAAa,kBAAkB;IACnB,QAAQ,CAAc;IACtB,QAAQ,CAA0B;IAClC,UAAU,CAAqC;IAC/C,QAAQ,CAAY;IACpB,WAAW,GAAG,KAAK,CAAC;IAE5B,gBAAe,CAAC;IAEhB,KAAK,CAAC,KAAK;IAEX,CAAC;IAED,KAAK,CAAC,KAAK;QACP,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAuB;QAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACtD,CAAC;QAGD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC;IAGD,SAAS,CAAC,GAAY,EAAE,GAAa;QAEjC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;QACnD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QAC3C,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAE1C,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAGxB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACjB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QAGH,GAAG,CAAC,KAAK,CAAC,mFAAmF,CAAC,CAAC;IACnG,CAAC;IAGD,aAAa,CAAC,OAAuB;QACjC,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAGD,IAAI,OAAO,CAAC,OAAiC;QACzC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC5B,CAAC;IAED,IAAI,OAAO,CAAC,OAA6C;QACrD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC5B,CAAC;IAED,IAAI,SAAS,CAAC,OAAwD;QAClE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;IAC9B,CAAC;CACJ;AAnED,gDAmEC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serpstat/serpstat-mcp-server",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "description": "Serpstat MCP Server for Serpstat API. Allows you to automate your daily SEO tasks and get results in a few seconds.",
5
5
  "license": "MIT",
6
6
  "main": "index.js",