xhs-mcp 0.6.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.en.md +122 -0
- package/README.md +180 -0
- package/dist/cli/xhs-cli.d.ts +6 -0
- package/dist/cli/xhs-cli.d.ts.map +1 -0
- package/dist/cli/xhs-cli.js +300 -0
- package/dist/cli/xhs-cli.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/auth/auth.service.d.ts +12 -0
- package/dist/lib/auth/auth.service.d.ts.map +1 -0
- package/dist/lib/auth/auth.service.js +138 -0
- package/dist/lib/auth/auth.service.js.map +1 -0
- package/dist/lib/auth/auth.types.d.ts +17 -0
- package/dist/lib/auth/auth.types.d.ts.map +1 -0
- package/dist/lib/auth/auth.types.js +5 -0
- package/dist/lib/auth/auth.types.js.map +1 -0
- package/dist/lib/auth/index.d.ts +6 -0
- package/dist/lib/auth/index.d.ts.map +1 -0
- package/dist/lib/auth/index.js +6 -0
- package/dist/lib/auth/index.js.map +1 -0
- package/dist/lib/browser/browser.manager.d.ts +22 -0
- package/dist/lib/browser/browser.manager.d.ts.map +1 -0
- package/dist/lib/browser/browser.manager.js +196 -0
- package/dist/lib/browser/browser.manager.js.map +1 -0
- package/dist/lib/browser/browser.types.d.ts +23 -0
- package/dist/lib/browser/browser.types.d.ts.map +1 -0
- package/dist/lib/browser/browser.types.js +5 -0
- package/dist/lib/browser/browser.types.js.map +1 -0
- package/dist/lib/browser/index.d.ts +6 -0
- package/dist/lib/browser/index.d.ts.map +1 -0
- package/dist/lib/browser/index.js +6 -0
- package/dist/lib/browser/index.js.map +1 -0
- package/dist/lib/feeds/feed.service.d.ts +13 -0
- package/dist/lib/feeds/feed.service.d.ts.map +1 -0
- package/dist/lib/feeds/feed.service.js +224 -0
- package/dist/lib/feeds/feed.service.js.map +1 -0
- package/dist/lib/feeds/feed.types.d.ts +26 -0
- package/dist/lib/feeds/feed.types.d.ts.map +1 -0
- package/dist/lib/feeds/feed.types.js +5 -0
- package/dist/lib/feeds/feed.types.js.map +1 -0
- package/dist/lib/feeds/index.d.ts +6 -0
- package/dist/lib/feeds/index.d.ts.map +1 -0
- package/dist/lib/feeds/index.js +6 -0
- package/dist/lib/feeds/index.js.map +1 -0
- package/dist/lib/index.d.ts +9 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +11 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/publishing/index.d.ts +6 -0
- package/dist/lib/publishing/index.d.ts.map +1 -0
- package/dist/lib/publishing/index.js +6 -0
- package/dist/lib/publishing/index.js.map +1 -0
- package/dist/lib/publishing/publish.service.d.ts +39 -0
- package/dist/lib/publishing/publish.service.d.ts.map +1 -0
- package/dist/lib/publishing/publish.service.js +942 -0
- package/dist/lib/publishing/publish.service.js.map +1 -0
- package/dist/lib/publishing/publish.types.d.ts +37 -0
- package/dist/lib/publishing/publish.types.d.ts.map +1 -0
- package/dist/lib/publishing/publish.types.js +5 -0
- package/dist/lib/publishing/publish.types.js.map +1 -0
- package/dist/lib/shared/base.service.d.ts +22 -0
- package/dist/lib/shared/base.service.d.ts.map +1 -0
- package/dist/lib/shared/base.service.js +28 -0
- package/dist/lib/shared/base.service.js.map +1 -0
- package/dist/lib/shared/config.d.ts +17 -0
- package/dist/lib/shared/config.d.ts.map +1 -0
- package/dist/lib/shared/config.js +133 -0
- package/dist/lib/shared/config.js.map +1 -0
- package/dist/lib/shared/cookies.d.ts +10 -0
- package/dist/lib/shared/cookies.d.ts.map +1 -0
- package/dist/lib/shared/cookies.js +79 -0
- package/dist/lib/shared/cookies.js.map +1 -0
- package/dist/lib/shared/errors.d.ts +51 -0
- package/dist/lib/shared/errors.d.ts.map +1 -0
- package/dist/lib/shared/errors.js +93 -0
- package/dist/lib/shared/errors.js.map +1 -0
- package/dist/lib/shared/index.d.ts +11 -0
- package/dist/lib/shared/index.d.ts.map +1 -0
- package/dist/lib/shared/index.js +18 -0
- package/dist/lib/shared/index.js.map +1 -0
- package/dist/lib/shared/logger.d.ts +16 -0
- package/dist/lib/shared/logger.d.ts.map +1 -0
- package/dist/lib/shared/logger.js +41 -0
- package/dist/lib/shared/logger.js.map +1 -0
- package/dist/lib/shared/types.d.ts +175 -0
- package/dist/lib/shared/types.d.ts.map +1 -0
- package/dist/lib/shared/types.js +6 -0
- package/dist/lib/shared/types.js.map +1 -0
- package/dist/lib/shared/utils.d.ts +78 -0
- package/dist/lib/shared/utils.d.ts.map +1 -0
- package/dist/lib/shared/utils.js +137 -0
- package/dist/lib/shared/utils.js.map +1 -0
- package/dist/server/handlers/index.d.ts +6 -0
- package/dist/server/handlers/index.d.ts.map +1 -0
- package/dist/server/handlers/index.js +6 -0
- package/dist/server/handlers/index.js.map +1 -0
- package/dist/server/handlers/resource.handlers.d.ts +18 -0
- package/dist/server/handlers/resource.handlers.d.ts.map +1 -0
- package/dist/server/handlers/resource.handlers.js +113 -0
- package/dist/server/handlers/resource.handlers.js.map +1 -0
- package/dist/server/handlers/tool.handlers.d.ts +64 -0
- package/dist/server/handlers/tool.handlers.d.ts.map +1 -0
- package/dist/server/handlers/tool.handlers.js +123 -0
- package/dist/server/handlers/tool.handlers.js.map +1 -0
- package/dist/server/http.server.d.ts +21 -0
- package/dist/server/http.server.d.ts.map +1 -0
- package/dist/server/http.server.js +310 -0
- package/dist/server/http.server.js.map +1 -0
- package/dist/server/index.d.ts +7 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +7 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/mcp.server.d.ts +15 -0
- package/dist/server/mcp.server.d.ts.map +1 -0
- package/dist/server/mcp.server.js +61 -0
- package/dist/server/mcp.server.js.map +1 -0
- package/dist/server/schemas/tool.schemas.d.ts +20 -0
- package/dist/server/schemas/tool.schemas.d.ts.map +1 -0
- package/dist/server/schemas/tool.schemas.js +178 -0
- package/dist/server/schemas/tool.schemas.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/xhs.utils.d.ts +14 -0
- package/dist/utils/xhs.utils.d.ts.map +1 -0
- package/dist/utils/xhs.utils.js +84 -0
- package/dist/utils/xhs.utils.js.map +1 -0
- package/docs/HTTP_TRANSPORTS.md +269 -0
- package/package.json +59 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Main entry point for XHS MCP Server
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { XHSMCPServer } from './server/mcp.server.js';
|
|
7
|
+
import { XHSHTTPMCPServer } from './server/http.server.js';
|
|
8
|
+
import { getConfig } from './lib/shared/config.js';
|
|
9
|
+
async function main() {
|
|
10
|
+
const config = getConfig();
|
|
11
|
+
const program = new Command();
|
|
12
|
+
program
|
|
13
|
+
.name('xhs-mcp')
|
|
14
|
+
.description(`XHS MCP Server v${config.server.version}`)
|
|
15
|
+
.version(config.server.version)
|
|
16
|
+
.option('-m, --mode <mode>', 'Server mode: stdio or http', 'stdio')
|
|
17
|
+
.option('-p, --port <port>', 'HTTP server port (only for http mode)', '3000')
|
|
18
|
+
.parse();
|
|
19
|
+
const options = program.opts();
|
|
20
|
+
try {
|
|
21
|
+
if (options.mode === 'http') {
|
|
22
|
+
const port = parseInt(options.port, 10);
|
|
23
|
+
const httpServer = new XHSHTTPMCPServer(port);
|
|
24
|
+
await httpServer.start();
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
// In stdio mode, we must not output anything to stdout/stderr except MCP protocol messages
|
|
28
|
+
// This prevents interference with MCP communication
|
|
29
|
+
const server = new XHSMCPServer();
|
|
30
|
+
await server.start();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
// Only log to stderr if logging is explicitly enabled
|
|
35
|
+
if (process.env.XHS_ENABLE_LOGGING === 'true') {
|
|
36
|
+
process.stderr.write(`Server failed to start: ${error}\n`);
|
|
37
|
+
}
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Handle graceful shutdown
|
|
42
|
+
process.on('SIGINT', () => {
|
|
43
|
+
// Don't log to stderr in stdio mode to avoid interfering with MCP protocol
|
|
44
|
+
process.exit(0);
|
|
45
|
+
});
|
|
46
|
+
process.on('SIGTERM', () => {
|
|
47
|
+
// Don't log to stderr in stdio mode to avoid interfering with MCP protocol
|
|
48
|
+
process.exit(0);
|
|
49
|
+
});
|
|
50
|
+
// Start the server
|
|
51
|
+
main().catch((error) => {
|
|
52
|
+
// Only log to stderr if logging is explicitly enabled
|
|
53
|
+
if (process.env.XHS_ENABLE_LOGGING === 'true') {
|
|
54
|
+
process.stderr.write(`Fatal error: ${error}\n`);
|
|
55
|
+
}
|
|
56
|
+
process.exit(1);
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,mBAAmB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;SACvD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;SAC9B,MAAM,CAAC,mBAAmB,EAAE,4BAA4B,EAAE,OAAO,CAAC;SAClE,MAAM,CAAC,mBAAmB,EAAE,uCAAuC,EAAE,MAAM,CAAC;SAC5E,KAAK,EAAE,CAAC;IAEX,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE/B,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACxC,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,2FAA2F;YAC3F,oDAAoD;YACpD,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAClC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sDAAsD;QACtD,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,MAAM,EAAE,CAAC;YAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,KAAK,IAAI,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,2BAA2B;AAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,2EAA2E;IAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,2EAA2E;IAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,mBAAmB;AACnB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,sDAAsD;IACtD,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,MAAM,EAAE,CAAC;QAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication service for XHS MCP Server
|
|
3
|
+
*/
|
|
4
|
+
import { Config, LoginResult, StatusResult } from '../shared/types.js';
|
|
5
|
+
import { BaseService } from '../shared/base.service.js';
|
|
6
|
+
export declare class AuthService extends BaseService {
|
|
7
|
+
constructor(config: Config);
|
|
8
|
+
login(browserPath?: string, timeout?: number): Promise<LoginResult>;
|
|
9
|
+
logout(): Promise<LoginResult>;
|
|
10
|
+
checkStatus(browserPath?: string): Promise<StatusResult>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=auth.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.service.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/auth.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAMxD,qBAAa,WAAY,SAAQ,WAAW;gBAC9B,MAAM,EAAE,MAAM;IAIpB,KAAK,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,MAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IA+ExE,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC;IA+B9B,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAwB/D"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication service for XHS MCP Server
|
|
3
|
+
*/
|
|
4
|
+
import { LoginTimeoutError, LoginFailedError, XHSError } from '../shared/errors.js';
|
|
5
|
+
import { BaseService } from '../shared/base.service.js';
|
|
6
|
+
import { deleteCookiesFile } from '../shared/cookies.js';
|
|
7
|
+
import { isLoggedIn } from '../../utils/xhs.utils.js';
|
|
8
|
+
import { logger } from '../shared/logger.js';
|
|
9
|
+
import { sleep } from '../shared/utils.js';
|
|
10
|
+
export class AuthService extends BaseService {
|
|
11
|
+
constructor(config) {
|
|
12
|
+
super(config);
|
|
13
|
+
}
|
|
14
|
+
async login(browserPath, timeout = 300) {
|
|
15
|
+
try {
|
|
16
|
+
const page = await this.getBrowserManager().createPage(false, browserPath, true);
|
|
17
|
+
try {
|
|
18
|
+
// Navigate to explore page
|
|
19
|
+
await this.getBrowserManager().navigateWithRetry(page, this.getConfig().xhs.exploreUrl);
|
|
20
|
+
// Check if already logged in
|
|
21
|
+
if (await isLoggedIn(page)) {
|
|
22
|
+
return {
|
|
23
|
+
success: true,
|
|
24
|
+
message: 'Already logged in',
|
|
25
|
+
status: 'logged_in',
|
|
26
|
+
action: 'none',
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// Wait for login completion
|
|
30
|
+
const checkInterval = 5; // Check every 5 seconds
|
|
31
|
+
const maxChecks = timeout / checkInterval;
|
|
32
|
+
for (let checkCount = 0; checkCount < maxChecks; checkCount++) {
|
|
33
|
+
try {
|
|
34
|
+
// Check if login completed with short timeout
|
|
35
|
+
await page.waitForSelector(this.getConfig().xhs.loginOkSelector, {
|
|
36
|
+
timeout: checkInterval * 1000,
|
|
37
|
+
});
|
|
38
|
+
// Login completed successfully
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
// Login not yet complete, continue checking
|
|
43
|
+
const elapsed = (checkCount + 1) * checkInterval;
|
|
44
|
+
const remaining = timeout - elapsed;
|
|
45
|
+
if (checkCount === maxChecks - 1) {
|
|
46
|
+
// Final timeout reached
|
|
47
|
+
throw new LoginTimeoutError(`Login timed out after ${timeout} seconds. Please complete QR code scanning or manual login in the browser window.`, {
|
|
48
|
+
timeout,
|
|
49
|
+
url: this.getConfig().xhs.exploreUrl,
|
|
50
|
+
elapsedTime: elapsed,
|
|
51
|
+
suggestion: 'Increase timeout parameter or complete login faster',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Save cookies after successful login
|
|
57
|
+
await this.getBrowserManager().saveCookiesFromPage(page);
|
|
58
|
+
// Verify login success
|
|
59
|
+
await sleep(1000); // Brief wait for page to update
|
|
60
|
+
if (await isLoggedIn(page)) {
|
|
61
|
+
return {
|
|
62
|
+
success: true,
|
|
63
|
+
message: 'Login successful',
|
|
64
|
+
status: 'logged_in',
|
|
65
|
+
action: 'logged_in',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
throw new LoginFailedError('Login process completed but authentication verification failed');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
await page.close();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (error instanceof LoginTimeoutError || error instanceof LoginFailedError) {
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
logger.error(`Login failed with unexpected error: ${error}`);
|
|
81
|
+
throw new XHSError(`Login failed: ${error}`, 'LoginError', { timeout }, error);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async logout() {
|
|
85
|
+
try {
|
|
86
|
+
const success = deleteCookiesFile();
|
|
87
|
+
if (success) {
|
|
88
|
+
return {
|
|
89
|
+
success: true,
|
|
90
|
+
message: 'Logged out successfully (cookies deleted)',
|
|
91
|
+
status: 'logged_out',
|
|
92
|
+
action: 'logged_out',
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
return {
|
|
97
|
+
success: false,
|
|
98
|
+
message: 'Failed to delete cookies file',
|
|
99
|
+
status: 'logged_out',
|
|
100
|
+
action: 'none',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
logger.error(`Logout failed: ${error}`);
|
|
106
|
+
return {
|
|
107
|
+
success: false,
|
|
108
|
+
message: `Logout failed: ${error}`,
|
|
109
|
+
status: 'logged_out',
|
|
110
|
+
action: 'none',
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async checkStatus(browserPath) {
|
|
115
|
+
try {
|
|
116
|
+
const page = await this.getBrowserManager().createPage(true, browserPath, true);
|
|
117
|
+
try {
|
|
118
|
+
await this.getBrowserManager().navigateWithRetry(page, this.getConfig().xhs.exploreUrl);
|
|
119
|
+
await sleep(1000); // Wait for page to load
|
|
120
|
+
const loggedIn = await isLoggedIn(page);
|
|
121
|
+
return {
|
|
122
|
+
success: true,
|
|
123
|
+
loggedIn,
|
|
124
|
+
status: loggedIn ? 'logged_in' : 'logged_out',
|
|
125
|
+
urlChecked: this.getConfig().xhs.exploreUrl,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
await page.close();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
logger.error(`Status check failed: ${error}`);
|
|
134
|
+
throw new XHSError(`Status check failed: ${error}`, 'StatusCheckError', {}, error);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=auth.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../../src/lib/auth/auth.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication-related types for XHS MCP Server
|
|
3
|
+
*/
|
|
4
|
+
export interface AuthServiceConfig {
|
|
5
|
+
config: any;
|
|
6
|
+
}
|
|
7
|
+
export interface LoginOptions {
|
|
8
|
+
browserPath?: string;
|
|
9
|
+
timeout?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface StatusCheckOptions {
|
|
12
|
+
browserPath?: string;
|
|
13
|
+
quick?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export type AuthStatus = 'logged_in' | 'logged_out' | 'unknown';
|
|
16
|
+
export type AuthAction = 'none' | 'logged_in' | 'logged_out' | 'failed';
|
|
17
|
+
//# sourceMappingURL=auth.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.types.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/auth.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,GAAG,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC;AAChE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,WAAW,GAAG,YAAY,GAAG,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.types.js","sourceRoot":"","sources":["../../../src/lib/auth/auth.types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Manager for XHS Operations
|
|
3
|
+
*/
|
|
4
|
+
import { Page } from 'puppeteer';
|
|
5
|
+
import { Config } from '../shared/types.js';
|
|
6
|
+
export declare class BrowserManager {
|
|
7
|
+
private config;
|
|
8
|
+
private browser;
|
|
9
|
+
constructor(config?: Config);
|
|
10
|
+
createPage(headless?: boolean, executablePath?: string, loadCookiesFlag?: boolean): Promise<Page>;
|
|
11
|
+
private launchBrowser;
|
|
12
|
+
private loadCookiesIntoPage;
|
|
13
|
+
saveCookiesFromPage(page: Page): Promise<void>;
|
|
14
|
+
navigateWithRetry(page: Page, url: string, waitUntil?: 'load' | 'domcontentloaded' | 'networkidle0' | 'networkidle2', maxRetries?: number): Promise<void>;
|
|
15
|
+
waitForSelectorSafe(page: Page, selector: string, timeout?: number, visible?: boolean): Promise<boolean>;
|
|
16
|
+
waitForElementVisible(page: Page, selector: string, timeout?: number): Promise<boolean>;
|
|
17
|
+
waitForElementHidden(page: Page, selector: string, timeout?: number): Promise<boolean>;
|
|
18
|
+
cleanup(): Promise<void>;
|
|
19
|
+
private handlePuppeteerError;
|
|
20
|
+
}
|
|
21
|
+
export declare function getBrowserManager(): BrowserManager;
|
|
22
|
+
//# sourceMappingURL=browser.manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.manager.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/browser.manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAkB,EAAW,IAAI,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,MAAM,EAAU,MAAM,oBAAoB,CAAC;AAOpD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAwB;gBAE3B,MAAM,CAAC,EAAE,MAAM;IAIrB,UAAU,CACd,QAAQ,CAAC,EAAE,OAAO,EAClB,cAAc,CAAC,EAAE,MAAM,EACvB,eAAe,GAAE,OAAc,GAC9B,OAAO,CAAC,IAAI,CAAC;YA0BF,aAAa;YAmCb,mBAAmB;IA4B3B,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB9C,iBAAiB,CACrB,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,MAAM,EACX,SAAS,GAAE,MAAM,GAAG,kBAAkB,GAAG,cAAc,GAAG,cAAuB,EACjF,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IA4BV,mBAAmB,CACvB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,GAAE,OAAc,GACtB,OAAO,CAAC,OAAO,CAAC;IAeb,qBAAqB,CACzB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC;IAIb,oBAAoB,CACxB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC;IAIb,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAY9B,OAAO,CAAC,oBAAoB;CAoC7B;AAKD,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Manager for XHS Operations
|
|
3
|
+
*/
|
|
4
|
+
import puppeteer from 'puppeteer';
|
|
5
|
+
import { BrowserLaunchError, BrowserNavigationError, XHSError } from '../shared/errors.js';
|
|
6
|
+
import { getConfig } from '../shared/config.js';
|
|
7
|
+
import { loadCookies, saveCookies } from '../shared/cookies.js';
|
|
8
|
+
import { logger } from '../shared/logger.js';
|
|
9
|
+
import { sleep } from '../shared/utils.js';
|
|
10
|
+
export class BrowserManager {
|
|
11
|
+
config;
|
|
12
|
+
browser = null;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.config = config || getConfig();
|
|
15
|
+
}
|
|
16
|
+
async createPage(headless, executablePath, loadCookiesFlag = true) {
|
|
17
|
+
try {
|
|
18
|
+
// Launch browser if not already launched
|
|
19
|
+
if (!this.browser) {
|
|
20
|
+
this.browser = await this.launchBrowser(headless, executablePath);
|
|
21
|
+
}
|
|
22
|
+
// Create new page
|
|
23
|
+
const page = await this.browser.newPage();
|
|
24
|
+
// Configure page timeouts
|
|
25
|
+
page.setDefaultTimeout(this.config.browser.defaultTimeout);
|
|
26
|
+
page.setDefaultNavigationTimeout(this.config.browser.navigationTimeout);
|
|
27
|
+
// Load cookies if requested
|
|
28
|
+
if (loadCookiesFlag) {
|
|
29
|
+
await this.loadCookiesIntoPage(page);
|
|
30
|
+
}
|
|
31
|
+
return page;
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
logger.error(`Browser page creation error: ${error}`);
|
|
35
|
+
throw this.handlePuppeteerError(error, 'create_page');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async launchBrowser(headless, executablePath) {
|
|
39
|
+
const isHeadless = headless !== undefined ? headless : this.config.browser.headlessDefault;
|
|
40
|
+
try {
|
|
41
|
+
const launchOptions = {
|
|
42
|
+
headless: isHeadless,
|
|
43
|
+
slowMo: this.config.browser.slowmo,
|
|
44
|
+
args: [
|
|
45
|
+
'--no-sandbox',
|
|
46
|
+
'--disable-setuid-sandbox',
|
|
47
|
+
'--disable-dev-shm-usage',
|
|
48
|
+
'--disable-accelerated-2d-canvas',
|
|
49
|
+
'--no-first-run',
|
|
50
|
+
'--no-zygote',
|
|
51
|
+
'--disable-gpu'
|
|
52
|
+
]
|
|
53
|
+
};
|
|
54
|
+
if (executablePath) {
|
|
55
|
+
launchOptions.executablePath = executablePath;
|
|
56
|
+
}
|
|
57
|
+
const browser = await puppeteer.launch(launchOptions);
|
|
58
|
+
return browser;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
logger.error(`Failed to launch browser: ${error}`);
|
|
62
|
+
throw new BrowserLaunchError(`Failed to launch browser: ${error}`, { headless: isHeadless, executablePath }, error);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async loadCookiesIntoPage(page) {
|
|
66
|
+
try {
|
|
67
|
+
const cookies = loadCookies();
|
|
68
|
+
if (!cookies) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
// Convert our cookie format to Puppeteer format
|
|
72
|
+
const puppeteerCookies = cookies.map(cookie => ({
|
|
73
|
+
name: cookie.name,
|
|
74
|
+
value: cookie.value,
|
|
75
|
+
domain: cookie.domain,
|
|
76
|
+
path: cookie.path,
|
|
77
|
+
expires: cookie.expires,
|
|
78
|
+
httpOnly: cookie.httpOnly,
|
|
79
|
+
secure: cookie.secure,
|
|
80
|
+
sameSite: cookie.sameSite
|
|
81
|
+
}));
|
|
82
|
+
await page.setCookie(...puppeteerCookies);
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
logger.warn(`Failed to load cookies: ${error}`);
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async saveCookiesFromPage(page) {
|
|
91
|
+
try {
|
|
92
|
+
const cookies = await page.cookies();
|
|
93
|
+
// Convert Puppeteer cookie format to our format
|
|
94
|
+
const ourCookies = cookies.map(cookie => ({
|
|
95
|
+
name: cookie.name,
|
|
96
|
+
value: cookie.value,
|
|
97
|
+
domain: cookie.domain,
|
|
98
|
+
path: cookie.path,
|
|
99
|
+
expires: cookie.expires,
|
|
100
|
+
httpOnly: cookie.httpOnly,
|
|
101
|
+
secure: cookie.secure,
|
|
102
|
+
sameSite: cookie.sameSite
|
|
103
|
+
}));
|
|
104
|
+
saveCookies(ourCookies);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
logger.error(`Failed to save cookies: ${error}`);
|
|
108
|
+
throw this.handlePuppeteerError(error, 'save_cookies');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async navigateWithRetry(page, url, waitUntil = 'load', maxRetries) {
|
|
112
|
+
const retries = maxRetries || this.config.xhs.maxRetries;
|
|
113
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
114
|
+
try {
|
|
115
|
+
await page.goto(url, {
|
|
116
|
+
waitUntil,
|
|
117
|
+
timeout: this.config.browser.navigationTimeout
|
|
118
|
+
});
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
if (error instanceof Error && error.name === 'TimeoutError') {
|
|
123
|
+
if (attempt === retries) {
|
|
124
|
+
throw new BrowserNavigationError(`Failed to navigate to ${url} after ${retries + 1} attempts`, { url, attempts: attempt + 1 }, error);
|
|
125
|
+
}
|
|
126
|
+
await sleep(this.config.xhs.retryDelay * 1000);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async waitForSelectorSafe(page, selector, timeout, visible = true) {
|
|
135
|
+
try {
|
|
136
|
+
await page.waitForSelector(selector, {
|
|
137
|
+
timeout: timeout || this.config.browser.defaultTimeout,
|
|
138
|
+
visible
|
|
139
|
+
});
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
if (error instanceof Error && error.name === 'TimeoutError') {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
throw error;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async waitForElementVisible(page, selector, timeout) {
|
|
150
|
+
return this.waitForSelectorSafe(page, selector, timeout, true);
|
|
151
|
+
}
|
|
152
|
+
async waitForElementHidden(page, selector, timeout) {
|
|
153
|
+
return this.waitForSelectorSafe(page, selector, timeout, false);
|
|
154
|
+
}
|
|
155
|
+
async cleanup() {
|
|
156
|
+
if (this.browser) {
|
|
157
|
+
try {
|
|
158
|
+
await this.browser.close();
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
logger.warn(`Error closing browser: ${error}`);
|
|
162
|
+
}
|
|
163
|
+
finally {
|
|
164
|
+
this.browser = null;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
handlePuppeteerError(error, operation) {
|
|
169
|
+
const context = { operation };
|
|
170
|
+
if (error.name === 'TimeoutError') {
|
|
171
|
+
if (operation.toLowerCase().includes('login')) {
|
|
172
|
+
return new XHSError(`Login operation timed out during ${operation}`, 'LoginTimeoutError', context, error);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
return new XHSError(`Browser operation timed out: ${operation}`, 'BrowserError', context, error);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
if (error.message.toLowerCase().includes('navigation')) {
|
|
180
|
+
return new BrowserNavigationError(`Navigation failed during ${operation}: ${error.message}`, context, error);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
return new XHSError(`Browser error during ${operation}: ${error.message}`, 'BrowserError', context, error);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Global browser manager instance
|
|
189
|
+
let globalBrowserManager = null;
|
|
190
|
+
export function getBrowserManager() {
|
|
191
|
+
if (!globalBrowserManager) {
|
|
192
|
+
globalBrowserManager = new BrowserManager();
|
|
193
|
+
}
|
|
194
|
+
return globalBrowserManager;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=browser.manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.manager.js","sourceRoot":"","sources":["../../../src/lib/browser/browser.manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-related types for XHS MCP Server
|
|
3
|
+
*/
|
|
4
|
+
import { Browser } from 'puppeteer';
|
|
5
|
+
import { Config } from '../shared/types';
|
|
6
|
+
export interface BrowserManagerConfig {
|
|
7
|
+
config: Config;
|
|
8
|
+
browser: Browser | null;
|
|
9
|
+
}
|
|
10
|
+
export interface BrowserLaunchOptions {
|
|
11
|
+
headless?: boolean;
|
|
12
|
+
executablePath?: string;
|
|
13
|
+
slowMo?: number;
|
|
14
|
+
args?: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface PageOptions {
|
|
17
|
+
loadCookies?: boolean;
|
|
18
|
+
headless?: boolean;
|
|
19
|
+
executablePath?: string;
|
|
20
|
+
timeout?: number;
|
|
21
|
+
navigationTimeout?: number;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=browser.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.types.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/browser.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAQ,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAU,MAAM,iBAAiB,CAAC;AAEjD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.types.js","sourceRoot":"","sources":["../../../src/lib/browser/browser.types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/browser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feed operations service for XHS MCP Server
|
|
3
|
+
*/
|
|
4
|
+
import { Config, FeedListResult, SearchResult, FeedDetailResult, CommentResult } from '../shared/types.js';
|
|
5
|
+
import { BaseService } from '../shared/base.service.js';
|
|
6
|
+
export declare class FeedService extends BaseService {
|
|
7
|
+
constructor(config: Config);
|
|
8
|
+
getFeedList(browserPath?: string): Promise<FeedListResult>;
|
|
9
|
+
searchFeeds(keyword: string, browserPath?: string): Promise<SearchResult>;
|
|
10
|
+
getFeedDetail(feedId: string, xsecToken: string, browserPath?: string): Promise<FeedDetailResult>;
|
|
11
|
+
commentOnFeed(feedId: string, xsecToken: string, note: string, browserPath?: string): Promise<CommentResult>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=feed.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feed.service.d.ts","sourceRoot":"","sources":["../../../src/lib/feeds/feed.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAY,MAAM,oBAAoB,CAAC;AAErH,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAKxD,qBAAa,WAAY,SAAQ,WAAW;gBAC9B,MAAM,EAAE,MAAM;IAIpB,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAgE1D,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA+CzE,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmDjG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CA4EnH"}
|