@channel47/dataforseo-mcp-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +155 -0
- package/dist/api/ai-optimization/index.d.ts +3 -0
- package/dist/api/ai-optimization/index.js +178 -0
- package/dist/api/ai-optimization/index.js.map +1 -0
- package/dist/api/app-data/index.d.ts +3 -0
- package/dist/api/app-data/index.js +115 -0
- package/dist/api/app-data/index.js.map +1 -0
- package/dist/api/backlinks/index.d.ts +3 -0
- package/dist/api/backlinks/index.js +186 -0
- package/dist/api/backlinks/index.js.map +1 -0
- package/dist/api/business-data/index.d.ts +3 -0
- package/dist/api/business-data/index.js +235 -0
- package/dist/api/business-data/index.js.map +1 -0
- package/dist/api/client.d.ts +10 -0
- package/dist/api/client.js +54 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/content-analysis/index.d.ts +3 -0
- package/dist/api/content-analysis/index.js +64 -0
- package/dist/api/content-analysis/index.js.map +1 -0
- package/dist/api/content-generation/index.d.ts +3 -0
- package/dist/api/content-generation/index.js +75 -0
- package/dist/api/content-generation/index.js.map +1 -0
- package/dist/api/domain-analytics/index.d.ts +3 -0
- package/dist/api/domain-analytics/index.js +69 -0
- package/dist/api/domain-analytics/index.js.map +1 -0
- package/dist/api/keywords/index.d.ts +3 -0
- package/dist/api/keywords/index.js +73 -0
- package/dist/api/keywords/index.js.map +1 -0
- package/dist/api/labs/index.d.ts +3 -0
- package/dist/api/labs/index.js +315 -0
- package/dist/api/labs/index.js.map +1 -0
- package/dist/api/localfalcon/index.d.ts +7 -0
- package/dist/api/localfalcon/index.js +109 -0
- package/dist/api/localfalcon/index.js.map +1 -0
- package/dist/api/merchant/index.d.ts +3 -0
- package/dist/api/merchant/index.js +133 -0
- package/dist/api/merchant/index.js.map +1 -0
- package/dist/api/onpage/index.d.ts +3 -0
- package/dist/api/onpage/index.js +68 -0
- package/dist/api/onpage/index.js.map +1 -0
- package/dist/api/serp/index.d.ts +3 -0
- package/dist/api/serp/index.js +99 -0
- package/dist/api/serp/index.js.map +1 -0
- package/dist/api/tools.d.ts +11 -0
- package/dist/api/tools.js +61 -0
- package/dist/api/tools.js.map +1 -0
- package/dist/api/types.d.ts +89 -0
- package/dist/api/types.js +19 -0
- package/dist/api/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export interface DataForSeoResponse<T> {
|
|
2
|
+
version: string;
|
|
3
|
+
status_code: number;
|
|
4
|
+
status_message: string;
|
|
5
|
+
time: string;
|
|
6
|
+
cost: number;
|
|
7
|
+
tasks_count: number;
|
|
8
|
+
tasks_error: number;
|
|
9
|
+
tasks: T[];
|
|
10
|
+
}
|
|
11
|
+
export interface DataForSeoTask<T> {
|
|
12
|
+
id: string;
|
|
13
|
+
status_code: number;
|
|
14
|
+
status_message: string;
|
|
15
|
+
time: string;
|
|
16
|
+
cost: number;
|
|
17
|
+
result_count: number;
|
|
18
|
+
path: string[];
|
|
19
|
+
data: any;
|
|
20
|
+
result: T[];
|
|
21
|
+
}
|
|
22
|
+
export interface DataForSeoErrorResponse {
|
|
23
|
+
version: string;
|
|
24
|
+
status_code: number;
|
|
25
|
+
status_message: string;
|
|
26
|
+
time: string;
|
|
27
|
+
}
|
|
28
|
+
export interface TaskPostResponse<T = any> {
|
|
29
|
+
id: string;
|
|
30
|
+
status_code: number;
|
|
31
|
+
status_message: string;
|
|
32
|
+
time: string;
|
|
33
|
+
cost: number;
|
|
34
|
+
result_count: number;
|
|
35
|
+
path: string[];
|
|
36
|
+
data: T;
|
|
37
|
+
result: null;
|
|
38
|
+
}
|
|
39
|
+
export interface TaskReadyResponse {
|
|
40
|
+
id: string;
|
|
41
|
+
status_code: number;
|
|
42
|
+
status_message: string;
|
|
43
|
+
time: string;
|
|
44
|
+
}
|
|
45
|
+
export interface TaskGetResponse<T = any> {
|
|
46
|
+
id: string;
|
|
47
|
+
status_code: number;
|
|
48
|
+
status_message: string;
|
|
49
|
+
time: string;
|
|
50
|
+
cost: number;
|
|
51
|
+
result_count: number;
|
|
52
|
+
path: string[];
|
|
53
|
+
data: any;
|
|
54
|
+
result: T[];
|
|
55
|
+
}
|
|
56
|
+
export interface LocationParameters {
|
|
57
|
+
location_name?: string;
|
|
58
|
+
location_code?: number;
|
|
59
|
+
language_name?: string;
|
|
60
|
+
language_code?: string;
|
|
61
|
+
}
|
|
62
|
+
export interface PaginationParameters {
|
|
63
|
+
limit?: number;
|
|
64
|
+
offset?: number;
|
|
65
|
+
}
|
|
66
|
+
export interface DateRangeParameters {
|
|
67
|
+
date_from?: string;
|
|
68
|
+
date_to?: string;
|
|
69
|
+
}
|
|
70
|
+
export interface TaskParameters {
|
|
71
|
+
tag?: string;
|
|
72
|
+
priority?: number;
|
|
73
|
+
postback_url?: string;
|
|
74
|
+
postback_data?: string;
|
|
75
|
+
}
|
|
76
|
+
export declare enum StatusCode {
|
|
77
|
+
SUCCESS = 20000,
|
|
78
|
+
TASK_CREATED = 20100,
|
|
79
|
+
NO_RESULTS = 20011,
|
|
80
|
+
ERROR = 40000,
|
|
81
|
+
AUTH_ERROR = 40100,
|
|
82
|
+
INVALID_PARAMETERS = 40200
|
|
83
|
+
}
|
|
84
|
+
export declare enum ApiMethod {
|
|
85
|
+
TASK_POST = "task_post",
|
|
86
|
+
TASKS_READY = "tasks_ready",
|
|
87
|
+
TASK_GET = "task_get",
|
|
88
|
+
LIVE = "live"
|
|
89
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Status codes and messages
|
|
2
|
+
export var StatusCode;
|
|
3
|
+
(function (StatusCode) {
|
|
4
|
+
StatusCode[StatusCode["SUCCESS"] = 20000] = "SUCCESS";
|
|
5
|
+
StatusCode[StatusCode["TASK_CREATED"] = 20100] = "TASK_CREATED";
|
|
6
|
+
StatusCode[StatusCode["NO_RESULTS"] = 20011] = "NO_RESULTS";
|
|
7
|
+
StatusCode[StatusCode["ERROR"] = 40000] = "ERROR";
|
|
8
|
+
StatusCode[StatusCode["AUTH_ERROR"] = 40100] = "AUTH_ERROR";
|
|
9
|
+
StatusCode[StatusCode["INVALID_PARAMETERS"] = 40200] = "INVALID_PARAMETERS";
|
|
10
|
+
})(StatusCode || (StatusCode = {}));
|
|
11
|
+
// API Methods
|
|
12
|
+
export var ApiMethod;
|
|
13
|
+
(function (ApiMethod) {
|
|
14
|
+
ApiMethod["TASK_POST"] = "task_post";
|
|
15
|
+
ApiMethod["TASKS_READY"] = "tasks_ready";
|
|
16
|
+
ApiMethod["TASK_GET"] = "task_get";
|
|
17
|
+
ApiMethod["LIVE"] = "live";
|
|
18
|
+
})(ApiMethod || (ApiMethod = {}));
|
|
19
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"AAuFA,4BAA4B;AAC5B,MAAM,CAAN,IAAY,UAOX;AAPD,WAAY,UAAU;IACpB,qDAAe,CAAA;IACf,+DAAoB,CAAA;IACpB,2DAAkB,CAAA;IAClB,iDAAa,CAAA;IACb,2DAAkB,CAAA;IAClB,2EAA0B,CAAA;AAC5B,CAAC,EAPW,UAAU,KAAV,UAAU,QAOrB;AAED,cAAc;AACd,MAAM,CAAN,IAAY,SAKX;AALD,WAAY,SAAS;IACnB,oCAAuB,CAAA;IACvB,wCAA2B,CAAA;IAC3B,kCAAqB,CAAA;IACrB,0BAAa,CAAA;AACf,CAAC,EALW,SAAS,KAAT,SAAS,QAKpB"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { setupApiClient } from "./api/client.js";
|
|
5
|
+
import { registerKeywordsTools } from "./api/keywords/index.js";
|
|
6
|
+
async function main() {
|
|
7
|
+
// Get authentication credentials from environment variables
|
|
8
|
+
const dataForSeoLogin = process.env.DATAFORSEO_LOGIN;
|
|
9
|
+
const dataForSeoPassword = process.env.DATAFORSEO_PASSWORD;
|
|
10
|
+
if (!dataForSeoLogin || !dataForSeoPassword) {
|
|
11
|
+
console.error("Error: DataForSEO API credentials not provided");
|
|
12
|
+
console.error("Please set DATAFORSEO_LOGIN and DATAFORSEO_PASSWORD environment variables");
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
// Setup API client
|
|
16
|
+
const apiClient = setupApiClient(dataForSeoLogin, dataForSeoPassword);
|
|
17
|
+
// Create an MCP server
|
|
18
|
+
const server = new McpServer({
|
|
19
|
+
name: "DataForSEO Keywords MCP Server",
|
|
20
|
+
version: "1.0.0",
|
|
21
|
+
});
|
|
22
|
+
// Register keyword research tools (Google Ads, Bing Ads, Google Trends)
|
|
23
|
+
registerKeywordsTools(server, apiClient);
|
|
24
|
+
// Start receiving messages on stdin and sending messages on stdout
|
|
25
|
+
const transport = new StdioServerTransport();
|
|
26
|
+
console.error("DataForSEO Keywords MCP Server starting...");
|
|
27
|
+
await server.connect(transport);
|
|
28
|
+
console.error("DataForSEO Keywords MCP Server connected");
|
|
29
|
+
}
|
|
30
|
+
main().catch((error) => {
|
|
31
|
+
console.error("Error in DataForSEO Keywords MCP Server:", error);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,KAAK,UAAU,IAAI;IACjB,4DAA4D;IAC5D,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACrD,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAE3D,IAAI,CAAC,eAAe,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5C,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,2EAA2E,CAAC,CAAC;QAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,mBAAmB;IACnB,MAAM,SAAS,GAAG,cAAc,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;IAEtE,uBAAuB;IACvB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,gCAAgC;QACtC,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,wEAAwE;IACxE,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEzC,mEAAmE;IACnE,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAE5D,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAC5D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAC;IACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@channel47/dataforseo-mcp-server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for keyword research via DataForSEO API - built for search and shopping media buyers",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"dataforseo-mcp-server": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"prepublishOnly": "npm run build",
|
|
18
|
+
"start": "node dist/index.js",
|
|
19
|
+
"dev": "ts-node src/index.ts"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"mcp",
|
|
23
|
+
"model-context-protocol",
|
|
24
|
+
"dataforseo",
|
|
25
|
+
"api",
|
|
26
|
+
"seo",
|
|
27
|
+
"keyword-research",
|
|
28
|
+
"google-ads",
|
|
29
|
+
"bing-ads"
|
|
30
|
+
],
|
|
31
|
+
"author": "channel47",
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git+https://github.com/channel47/dataforseo-mcp-server.git"
|
|
36
|
+
},
|
|
37
|
+
"homepage": "https://github.com/channel47/dataforseo-mcp-server#readme",
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/channel47/dataforseo-mcp-server/issues"
|
|
40
|
+
},
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=18"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@modelcontextprotocol/sdk": "^1.19.1",
|
|
46
|
+
"axios": "^1.6.7",
|
|
47
|
+
"zod": "^3.22.4"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/node": "^20.11.19",
|
|
51
|
+
"ts-node": "^10.9.2",
|
|
52
|
+
"typescript": "^5.3.3"
|
|
53
|
+
}
|
|
54
|
+
}
|