@houtini/seo-crawler-mcp 2.0.1 → 2.0.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/build/cli.d.ts +2 -1
- package/build/cli.d.ts.map +1 -1
- package/build/cli.js +39 -33
- package/build/cli.js.map +1 -1
- package/package.json +1 -1
- package/server.json +29 -24
- package/src/cli.ts +47 -43
package/build/cli.d.ts
CHANGED
package/build/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAUA,QAAA,MAAM,IAAI,UAAwB,CAAC;AAYnC,iBAAe,MAAM,kBA6MpB"}
|
package/build/cli.js
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import { analyzeSeo } from './tools/analyze-seo.js';
|
|
4
|
-
import { listQueries } from './tools/list-queries.js';
|
|
2
|
+
"use strict";
|
|
5
3
|
const args = process.argv.slice(2);
|
|
6
|
-
if (args.length === 0 || args[0] === '--
|
|
7
|
-
|
|
4
|
+
if (args.length === 0 || (args.length === 1 && (args[0] === '--stdio' || args[0] === 'mcp'))) {
|
|
5
|
+
import('./index.js');
|
|
6
|
+
}
|
|
7
|
+
else {
|
|
8
|
+
runCli();
|
|
9
|
+
}
|
|
10
|
+
async function runCli() {
|
|
11
|
+
const { runSeoAudit } = await import('./tools/run-seo-audit.js');
|
|
12
|
+
const { analyzeSeo } = await import('./tools/analyze-seo.js');
|
|
13
|
+
const { listQueries } = await import('./tools/list-queries.js');
|
|
14
|
+
if (args[0] === '--help' || args[0] === '-h') {
|
|
15
|
+
console.log(`
|
|
8
16
|
SEO Crawler MCP - CLI Mode
|
|
9
17
|
|
|
10
18
|
USAGE:
|
|
@@ -41,37 +49,36 @@ WORKFLOW:
|
|
|
41
49
|
3. In Claude Desktop: "Analyze the crawl at <output-path>"
|
|
42
50
|
4. Claude uses MCP tools to query the SQLite database
|
|
43
51
|
`);
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
const command = args[0];
|
|
47
|
-
function parseArgs(args) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
63
|
-
else if (!parsed.url && !parsed.crawlPath) {
|
|
64
|
-
if (command === 'crawl') {
|
|
65
|
-
parsed.url = arg;
|
|
52
|
+
process.exit(0);
|
|
53
|
+
}
|
|
54
|
+
const command = args[0];
|
|
55
|
+
function parseArgs(args) {
|
|
56
|
+
const parsed = {};
|
|
57
|
+
for (const arg of args) {
|
|
58
|
+
if (arg.startsWith('--')) {
|
|
59
|
+
const [key, value] = arg.substring(2).split('=');
|
|
60
|
+
const camelKey = key.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
61
|
+
if (value === undefined) {
|
|
62
|
+
parsed[camelKey] = true;
|
|
63
|
+
}
|
|
64
|
+
else if (!isNaN(Number(value))) {
|
|
65
|
+
parsed[camelKey] = Number(value);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
parsed[camelKey] = value;
|
|
69
|
+
}
|
|
66
70
|
}
|
|
67
|
-
else if (
|
|
68
|
-
|
|
71
|
+
else if (!parsed.url && !parsed.crawlPath) {
|
|
72
|
+
if (command === 'crawl') {
|
|
73
|
+
parsed.url = arg;
|
|
74
|
+
}
|
|
75
|
+
else if (command === 'analyze') {
|
|
76
|
+
parsed.crawlPath = arg;
|
|
77
|
+
}
|
|
69
78
|
}
|
|
70
79
|
}
|
|
80
|
+
return parsed;
|
|
71
81
|
}
|
|
72
|
-
return parsed;
|
|
73
|
-
}
|
|
74
|
-
async function main() {
|
|
75
82
|
try {
|
|
76
83
|
switch (command) {
|
|
77
84
|
case 'crawl': {
|
|
@@ -186,5 +193,4 @@ async function main() {
|
|
|
186
193
|
process.exit(1);
|
|
187
194
|
}
|
|
188
195
|
}
|
|
189
|
-
main();
|
|
190
196
|
//# sourceMappingURL=cli.js.map
|
package/build/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/server.json
CHANGED
|
@@ -1,31 +1,36 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
3
|
"name": "io.github.houtini-ai/seo-crawler-mcp",
|
|
4
|
-
"description": "Crawl and analyse websites for SEO errors
|
|
4
|
+
"description": "Crawl and analyse websites for SEO errors using Crawlee with SQLite storage",
|
|
5
|
+
"repository": {
|
|
6
|
+
"url": "https://github.com/houtini-ai/seo-crawler-mcp",
|
|
7
|
+
"source": "github"
|
|
8
|
+
},
|
|
5
9
|
"version": "2.0.1",
|
|
6
|
-
"license": "Apache-2.0",
|
|
7
|
-
"sourceUrl": "https://github.com/houtini-ai/seo-crawler-mcp",
|
|
8
10
|
"packages": [
|
|
9
11
|
{
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"version": "2.0.1"
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
12
|
+
"registryType": "npm",
|
|
13
|
+
"identifier": "@houtini/seo-crawler-mcp",
|
|
14
|
+
"version": "2.0.1",
|
|
15
|
+
"transport": {
|
|
16
|
+
"type": "stdio"
|
|
17
|
+
},
|
|
18
|
+
"environmentVariables": [
|
|
19
|
+
{
|
|
20
|
+
"name": "OUTPUT_DIR",
|
|
21
|
+
"description": "Directory where crawl results are saved",
|
|
22
|
+
"isRequired": true,
|
|
23
|
+
"format": "string",
|
|
24
|
+
"isSecret": false
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"name": "DEBUG",
|
|
28
|
+
"description": "Enable verbose debug logging (set to 'true' to enable)",
|
|
29
|
+
"isRequired": false,
|
|
30
|
+
"format": "string",
|
|
31
|
+
"isSecret": false
|
|
32
|
+
}
|
|
33
|
+
]
|
|
29
34
|
}
|
|
30
35
|
]
|
|
31
|
-
}
|
|
36
|
+
}
|
package/src/cli.ts
CHANGED
|
@@ -1,25 +1,32 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* SEO Crawler MCP -
|
|
4
|
+
* SEO Crawler MCP - Entry Point
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* npx @houtini/seo-crawler-mcp crawl https://example.com --max-pages=100 --depth=3
|
|
10
|
-
*
|
|
11
|
-
* Then in Claude:
|
|
12
|
-
* "Analyze the crawl at C:/seo-audits/example.com_2026-02-02_abc123"
|
|
6
|
+
* Detects mode automatically:
|
|
7
|
+
* - MCP mode (stdio): When run by Claude Desktop (no args) - launches MCP server
|
|
8
|
+
* - CLI mode: When run with arguments - executes CLI commands
|
|
13
9
|
*/
|
|
14
10
|
|
|
15
|
-
import { runSeoAudit } from './tools/run-seo-audit.js';
|
|
16
|
-
import { analyzeSeo } from './tools/analyze-seo.js';
|
|
17
|
-
import { listQueries } from './tools/list-queries.js';
|
|
18
|
-
|
|
19
11
|
const args = process.argv.slice(2);
|
|
20
12
|
|
|
21
|
-
|
|
22
|
-
|
|
13
|
+
// If NO arguments provided, assume MCP mode (Claude Desktop calling via stdio)
|
|
14
|
+
// If arguments provided, run in CLI mode
|
|
15
|
+
if (args.length === 0 || (args.length === 1 && (args[0] === '--stdio' || args[0] === 'mcp'))) {
|
|
16
|
+
// MCP Server mode - delegate to index.ts
|
|
17
|
+
import('./index.js');
|
|
18
|
+
} else {
|
|
19
|
+
// CLI mode - run commands
|
|
20
|
+
runCli();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async function runCli() {
|
|
24
|
+
const { runSeoAudit } = await import('./tools/run-seo-audit.js');
|
|
25
|
+
const { analyzeSeo } = await import('./tools/analyze-seo.js');
|
|
26
|
+
const { listQueries } = await import('./tools/list-queries.js');
|
|
27
|
+
|
|
28
|
+
if (args[0] === '--help' || args[0] === '-h') {
|
|
29
|
+
console.log(`
|
|
23
30
|
SEO Crawler MCP - CLI Mode
|
|
24
31
|
|
|
25
32
|
USAGE:
|
|
@@ -56,39 +63,38 @@ WORKFLOW:
|
|
|
56
63
|
3. In Claude Desktop: "Analyze the crawl at <output-path>"
|
|
57
64
|
4. Claude uses MCP tools to query the SQLite database
|
|
58
65
|
`);
|
|
59
|
-
|
|
60
|
-
}
|
|
66
|
+
process.exit(0);
|
|
67
|
+
}
|
|
61
68
|
|
|
62
|
-
const command = args[0];
|
|
69
|
+
const command = args[0];
|
|
63
70
|
|
|
64
|
-
function parseArgs(args: string[]): Record<string, any> {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
71
|
+
function parseArgs(args: string[]): Record<string, any> {
|
|
72
|
+
const parsed: Record<string, any> = {};
|
|
73
|
+
|
|
74
|
+
for (const arg of args) {
|
|
75
|
+
if (arg.startsWith('--')) {
|
|
76
|
+
const [key, value] = arg.substring(2).split('=');
|
|
77
|
+
const camelKey = key.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
78
|
+
|
|
79
|
+
if (value === undefined) {
|
|
80
|
+
parsed[camelKey] = true;
|
|
81
|
+
} else if (!isNaN(Number(value))) {
|
|
82
|
+
parsed[camelKey] = Number(value);
|
|
83
|
+
} else {
|
|
84
|
+
parsed[camelKey] = value;
|
|
85
|
+
}
|
|
86
|
+
} else if (!parsed.url && !parsed.crawlPath) {
|
|
87
|
+
if (command === 'crawl') {
|
|
88
|
+
parsed.url = arg;
|
|
89
|
+
} else if (command === 'analyze') {
|
|
90
|
+
parsed.crawlPath = arg;
|
|
91
|
+
}
|
|
84
92
|
}
|
|
85
93
|
}
|
|
94
|
+
|
|
95
|
+
return parsed;
|
|
86
96
|
}
|
|
87
|
-
|
|
88
|
-
return parsed;
|
|
89
|
-
}
|
|
90
97
|
|
|
91
|
-
async function main() {
|
|
92
98
|
try {
|
|
93
99
|
switch (command) {
|
|
94
100
|
case 'crawl': {
|
|
@@ -220,5 +226,3 @@ async function main() {
|
|
|
220
226
|
process.exit(1);
|
|
221
227
|
}
|
|
222
228
|
}
|
|
223
|
-
|
|
224
|
-
main();
|