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
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool request handlers for XHS MCP Server
|
|
3
|
+
*/
|
|
4
|
+
export declare class ToolHandlers {
|
|
5
|
+
private authService;
|
|
6
|
+
private feedService;
|
|
7
|
+
private publishService;
|
|
8
|
+
constructor();
|
|
9
|
+
handleAuthLogin(browserPath?: string): Promise<{
|
|
10
|
+
content: Array<{
|
|
11
|
+
type: string;
|
|
12
|
+
text: string;
|
|
13
|
+
}>;
|
|
14
|
+
}>;
|
|
15
|
+
handleAuthLogout(): Promise<{
|
|
16
|
+
content: Array<{
|
|
17
|
+
type: string;
|
|
18
|
+
text: string;
|
|
19
|
+
}>;
|
|
20
|
+
}>;
|
|
21
|
+
handleAuthStatus(browserPath?: string): Promise<{
|
|
22
|
+
content: Array<{
|
|
23
|
+
type: string;
|
|
24
|
+
text: string;
|
|
25
|
+
}>;
|
|
26
|
+
}>;
|
|
27
|
+
handleDiscoverFeeds(browserPath?: string): Promise<{
|
|
28
|
+
content: Array<{
|
|
29
|
+
type: string;
|
|
30
|
+
text: string;
|
|
31
|
+
}>;
|
|
32
|
+
}>;
|
|
33
|
+
handleSearchNote(keyword?: string, browserPath?: string): Promise<{
|
|
34
|
+
content: Array<{
|
|
35
|
+
type: string;
|
|
36
|
+
text: string;
|
|
37
|
+
}>;
|
|
38
|
+
}>;
|
|
39
|
+
handleGetNoteDetail(feedId?: string, xsecToken?: string, browserPath?: string): Promise<{
|
|
40
|
+
content: Array<{
|
|
41
|
+
type: string;
|
|
42
|
+
text: string;
|
|
43
|
+
}>;
|
|
44
|
+
}>;
|
|
45
|
+
handleCommentOnNote(feedId?: string, xsecToken?: string, note?: string, browserPath?: string): Promise<{
|
|
46
|
+
content: Array<{
|
|
47
|
+
type: string;
|
|
48
|
+
text: string;
|
|
49
|
+
}>;
|
|
50
|
+
}>;
|
|
51
|
+
handlePublishContent(type?: string, title?: string, content?: string, mediaPaths?: string[], tags?: string, browserPath?: string): Promise<{
|
|
52
|
+
content: Array<{
|
|
53
|
+
type: string;
|
|
54
|
+
text: string;
|
|
55
|
+
}>;
|
|
56
|
+
}>;
|
|
57
|
+
handleToolRequest(name: string, args: any): Promise<{
|
|
58
|
+
content: Array<{
|
|
59
|
+
type: string;
|
|
60
|
+
text: string;
|
|
61
|
+
}>;
|
|
62
|
+
}>;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=tool.handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.handlers.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/tool.handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,cAAc,CAAiB;;IASjC,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IA6BlG,gBAAgB,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAK/E,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAMnG,mBAAmB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAKtG,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAMrH,mBAAmB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAM3I,mBAAmB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAO1J,oBAAoB,CACxB,IAAI,CAAC,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,EAAE,EACrB,IAAI,CAAC,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IA6BxD,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;CA8C9G"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool request handlers for XHS MCP Server
|
|
3
|
+
*/
|
|
4
|
+
import { AuthService } from '../../lib/auth/auth.service.js';
|
|
5
|
+
import { FeedService } from '../../lib/feeds/feed.service.js';
|
|
6
|
+
import { PublishService } from '../../lib/publishing/publish.service.js';
|
|
7
|
+
import { getConfig } from '../../lib/shared/config.js';
|
|
8
|
+
import { XHSError } from '../../lib/shared/errors.js';
|
|
9
|
+
import { validateRequiredParams, safeErrorHandler, createToolResponse, createErrorResponse } from '../../lib/shared/utils.js';
|
|
10
|
+
import { logger } from '../../lib/shared/logger.js';
|
|
11
|
+
export class ToolHandlers {
|
|
12
|
+
authService;
|
|
13
|
+
feedService;
|
|
14
|
+
publishService;
|
|
15
|
+
constructor() {
|
|
16
|
+
const config = getConfig();
|
|
17
|
+
this.authService = new AuthService(config);
|
|
18
|
+
this.feedService = new FeedService(config);
|
|
19
|
+
this.publishService = new PublishService(config);
|
|
20
|
+
}
|
|
21
|
+
async handleAuthLogin(browserPath) {
|
|
22
|
+
// Start login process in background and return immediately
|
|
23
|
+
// This follows the "instant response" pattern described in README
|
|
24
|
+
this.authService.login(browserPath).catch(error => {
|
|
25
|
+
safeErrorHandler(error, 'Background login error', logger);
|
|
26
|
+
});
|
|
27
|
+
return {
|
|
28
|
+
content: [
|
|
29
|
+
{
|
|
30
|
+
type: 'text',
|
|
31
|
+
text: JSON.stringify({
|
|
32
|
+
success: true,
|
|
33
|
+
message: 'Login process started. A browser window will open for you to complete the login.',
|
|
34
|
+
status: 'login_started',
|
|
35
|
+
action: 'browser_opened',
|
|
36
|
+
instructions: [
|
|
37
|
+
'1. Complete the login process in the opened browser window',
|
|
38
|
+
'2. Scan QR code or enter your credentials',
|
|
39
|
+
'3. Login will be automatically verified and cookies saved',
|
|
40
|
+
'4. Use xhs_auth_status to check if login completed'
|
|
41
|
+
],
|
|
42
|
+
note: 'The login process runs in the background. You can continue using other tools while login completes.'
|
|
43
|
+
}, null, 2),
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
async handleAuthLogout() {
|
|
49
|
+
const result = await this.authService.logout();
|
|
50
|
+
return createToolResponse(result);
|
|
51
|
+
}
|
|
52
|
+
async handleAuthStatus(browserPath) {
|
|
53
|
+
const result = await this.authService.checkStatus(browserPath);
|
|
54
|
+
return createToolResponse(result);
|
|
55
|
+
}
|
|
56
|
+
async handleDiscoverFeeds(browserPath) {
|
|
57
|
+
const result = await this.feedService.getFeedList(browserPath);
|
|
58
|
+
return createToolResponse(result);
|
|
59
|
+
}
|
|
60
|
+
async handleSearchNote(keyword, browserPath) {
|
|
61
|
+
validateRequiredParams({ keyword }, ['keyword']);
|
|
62
|
+
const result = await this.feedService.searchFeeds(keyword, browserPath);
|
|
63
|
+
return createToolResponse(result);
|
|
64
|
+
}
|
|
65
|
+
async handleGetNoteDetail(feedId, xsecToken, browserPath) {
|
|
66
|
+
validateRequiredParams({ feedId, xsecToken }, ['feedId', 'xsecToken']);
|
|
67
|
+
const result = await this.feedService.getFeedDetail(feedId, xsecToken, browserPath);
|
|
68
|
+
return createToolResponse(result);
|
|
69
|
+
}
|
|
70
|
+
async handleCommentOnNote(feedId, xsecToken, note, browserPath) {
|
|
71
|
+
validateRequiredParams({ feedId, xsecToken, note }, ['feedId', 'xsecToken', 'note']);
|
|
72
|
+
const result = await this.feedService.commentOnFeed(feedId, xsecToken, note, browserPath);
|
|
73
|
+
return createToolResponse(result);
|
|
74
|
+
}
|
|
75
|
+
async handlePublishContent(type, title, content, mediaPaths, tags, browserPath) {
|
|
76
|
+
validateRequiredParams({ type, title, content, mediaPaths }, ['type', 'title', 'content', 'mediaPaths']);
|
|
77
|
+
// Validate content type
|
|
78
|
+
if (type !== 'image' && type !== 'video') {
|
|
79
|
+
throw new Error('Content type must be "image" or "video"');
|
|
80
|
+
}
|
|
81
|
+
// Validate parameter constraints
|
|
82
|
+
if (title.length > 20) {
|
|
83
|
+
throw new Error('Title must be 20 characters or less');
|
|
84
|
+
}
|
|
85
|
+
if (content.length > 1000) {
|
|
86
|
+
throw new Error('Content must be 1000 characters or less');
|
|
87
|
+
}
|
|
88
|
+
// Execute unified publishing process
|
|
89
|
+
const result = await this.publishService.publishContent(type, title, content, mediaPaths, tags, browserPath);
|
|
90
|
+
return createToolResponse(result);
|
|
91
|
+
}
|
|
92
|
+
async handleToolRequest(name, args) {
|
|
93
|
+
try {
|
|
94
|
+
switch (name) {
|
|
95
|
+
case 'xhs_auth_login':
|
|
96
|
+
return await this.handleAuthLogin(args?.browser_path);
|
|
97
|
+
case 'xhs_auth_logout':
|
|
98
|
+
return await this.handleAuthLogout();
|
|
99
|
+
case 'xhs_auth_status':
|
|
100
|
+
return await this.handleAuthStatus(args?.browser_path);
|
|
101
|
+
case 'xhs_discover_feeds':
|
|
102
|
+
return await this.handleDiscoverFeeds(args?.browser_path);
|
|
103
|
+
case 'xhs_search_note':
|
|
104
|
+
return await this.handleSearchNote(args?.keyword, args?.browser_path);
|
|
105
|
+
case 'xhs_get_note_detail':
|
|
106
|
+
return await this.handleGetNoteDetail(args?.feed_id, args?.xsec_token, args?.browser_path);
|
|
107
|
+
case 'xhs_comment_on_note':
|
|
108
|
+
return await this.handleCommentOnNote(args?.feed_id, args?.xsec_token, args?.note, args?.browser_path);
|
|
109
|
+
case 'xhs_publish_content':
|
|
110
|
+
return await this.handlePublishContent(args?.type, args?.title, args?.content, args?.media_paths, args?.tags, args?.browser_path);
|
|
111
|
+
default:
|
|
112
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
if (error instanceof XHSError) {
|
|
117
|
+
return createToolResponse(error.toDict());
|
|
118
|
+
}
|
|
119
|
+
return createErrorResponse(error);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=tool.handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.handlers.js","sourceRoot":"","sources":["../../../src/server/handlers/tool.handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Server with SSE and Streamable HTTP Transport Support
|
|
3
|
+
*/
|
|
4
|
+
export declare class XHSHTTPMCPServer {
|
|
5
|
+
private app;
|
|
6
|
+
private config;
|
|
7
|
+
private toolHandlers;
|
|
8
|
+
private resourceHandlers;
|
|
9
|
+
private transports;
|
|
10
|
+
private port;
|
|
11
|
+
constructor(port?: number);
|
|
12
|
+
private setupMiddleware;
|
|
13
|
+
private setupRoutes;
|
|
14
|
+
private handleStreamableHTTP;
|
|
15
|
+
private handleSSEConnection;
|
|
16
|
+
private handleSSEMessage;
|
|
17
|
+
private createMCPServer;
|
|
18
|
+
start(): Promise<void>;
|
|
19
|
+
stop(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=http.server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.server.d.ts","sourceRoot":"","sources":["../../src/server/http.server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoBH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,UAAU,CAA8E;IAChG,OAAO,CAAC,IAAI,CAAS;gBAET,IAAI,GAAE,MAAa;IAW/B,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,WAAW;YAmBL,oBAAoB;YA+EpB,mBAAmB;YA4BnB,gBAAgB;IAkC9B,OAAO,CAAC,eAAe;IAyCjB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiFtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAW5B"}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Server with SSE and Streamable HTTP Transport Support
|
|
3
|
+
*/
|
|
4
|
+
import express from 'express';
|
|
5
|
+
import cors from 'cors';
|
|
6
|
+
import { randomUUID } from 'node:crypto';
|
|
7
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
8
|
+
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
|
|
9
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
10
|
+
import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
11
|
+
import { getConfig } from '../lib/shared/config.js';
|
|
12
|
+
import { ToolHandlers } from './handlers/tool.handlers.js';
|
|
13
|
+
import { ResourceHandlers } from './handlers/resource.handlers.js';
|
|
14
|
+
import { XHS_TOOL_SCHEMAS, XHS_RESOURCE_SCHEMAS } from './schemas/tool.schemas.js';
|
|
15
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
16
|
+
export class XHSHTTPMCPServer {
|
|
17
|
+
app;
|
|
18
|
+
config;
|
|
19
|
+
toolHandlers;
|
|
20
|
+
resourceHandlers;
|
|
21
|
+
transports = new Map();
|
|
22
|
+
port;
|
|
23
|
+
constructor(port = 3000) {
|
|
24
|
+
this.port = port;
|
|
25
|
+
this.config = getConfig();
|
|
26
|
+
this.toolHandlers = new ToolHandlers();
|
|
27
|
+
this.resourceHandlers = new ResourceHandlers();
|
|
28
|
+
this.app = express();
|
|
29
|
+
this.setupMiddleware();
|
|
30
|
+
this.setupRoutes();
|
|
31
|
+
}
|
|
32
|
+
setupMiddleware() {
|
|
33
|
+
// Parse JSON bodies
|
|
34
|
+
this.app.use(express.json());
|
|
35
|
+
// Configure CORS to expose Mcp-Session-Id header for browser-based clients
|
|
36
|
+
this.app.use(cors({
|
|
37
|
+
origin: '*', // Allow all origins - adjust as needed for production
|
|
38
|
+
exposedHeaders: ['Mcp-Session-Id']
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
setupRoutes() {
|
|
42
|
+
// Streamable HTTP Transport (Protocol version 2025-03-26)
|
|
43
|
+
this.app.all('/mcp', this.handleStreamableHTTP.bind(this));
|
|
44
|
+
// Deprecated HTTP+SSE Transport (Protocol version 2024-11-05)
|
|
45
|
+
this.app.get('/sse', this.handleSSEConnection.bind(this));
|
|
46
|
+
this.app.post('/messages', this.handleSSEMessage.bind(this));
|
|
47
|
+
// Health check endpoint
|
|
48
|
+
this.app.get('/health', (req, res) => {
|
|
49
|
+
res.json({
|
|
50
|
+
status: 'healthy',
|
|
51
|
+
server: this.config.server.name,
|
|
52
|
+
version: this.config.server.version,
|
|
53
|
+
transports: ['streamable-http', 'sse']
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
async handleStreamableHTTP(req, res) {
|
|
58
|
+
console.log(`Received ${req.method} request to /mcp`);
|
|
59
|
+
try {
|
|
60
|
+
// Check for existing session ID
|
|
61
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
62
|
+
let transport;
|
|
63
|
+
if (sessionId && this.transports.has(sessionId)) {
|
|
64
|
+
const existingTransport = this.transports.get(sessionId);
|
|
65
|
+
if (existingTransport instanceof StreamableHTTPServerTransport) {
|
|
66
|
+
transport = existingTransport;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
res.status(400).json({
|
|
70
|
+
jsonrpc: '2.0',
|
|
71
|
+
error: {
|
|
72
|
+
code: -32000,
|
|
73
|
+
message: 'Bad Request: Session exists but uses a different transport protocol',
|
|
74
|
+
},
|
|
75
|
+
id: null,
|
|
76
|
+
});
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else if (!sessionId && req.method === 'POST' && isInitializeRequest(req.body)) {
|
|
81
|
+
// Create new Streamable HTTP transport
|
|
82
|
+
transport = new StreamableHTTPServerTransport({
|
|
83
|
+
sessionIdGenerator: () => randomUUID(),
|
|
84
|
+
onsessioninitialized: (sessionId) => {
|
|
85
|
+
console.log(`StreamableHTTP session initialized with ID: ${sessionId}`);
|
|
86
|
+
this.transports.set(sessionId, transport);
|
|
87
|
+
},
|
|
88
|
+
onsessionclosed: (sessionId) => {
|
|
89
|
+
console.log(`StreamableHTTP session closed: ${sessionId}`);
|
|
90
|
+
this.transports.delete(sessionId);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
// Set up onclose handler to clean up transport when closed
|
|
94
|
+
transport.onclose = () => {
|
|
95
|
+
const sid = transport.sessionId;
|
|
96
|
+
if (sid && this.transports.has(sid)) {
|
|
97
|
+
console.log(`Transport closed for session ${sid}, removing from transports map`);
|
|
98
|
+
this.transports.delete(sid);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
// Connect the transport to the MCP server
|
|
102
|
+
const server = this.createMCPServer();
|
|
103
|
+
await server.connect(transport);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
// Invalid request - no session ID or not initialization request
|
|
107
|
+
res.status(400).json({
|
|
108
|
+
jsonrpc: '2.0',
|
|
109
|
+
error: {
|
|
110
|
+
code: -32000,
|
|
111
|
+
message: 'Bad Request: No valid session ID provided',
|
|
112
|
+
},
|
|
113
|
+
id: null,
|
|
114
|
+
});
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// Handle the request with the transport
|
|
118
|
+
await transport.handleRequest(req, res, req.body);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error('Error handling Streamable HTTP request:', error);
|
|
122
|
+
if (!res.headersSent) {
|
|
123
|
+
res.status(500).json({
|
|
124
|
+
jsonrpc: '2.0',
|
|
125
|
+
error: {
|
|
126
|
+
code: -32603,
|
|
127
|
+
message: 'Internal server error',
|
|
128
|
+
},
|
|
129
|
+
id: null,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async handleSSEConnection(req, res) {
|
|
135
|
+
console.log('Received GET request to /sse (deprecated SSE transport)');
|
|
136
|
+
try {
|
|
137
|
+
const transport = new SSEServerTransport('/messages', res);
|
|
138
|
+
this.transports.set(transport.sessionId, transport);
|
|
139
|
+
res.on('close', () => {
|
|
140
|
+
this.transports.delete(transport.sessionId);
|
|
141
|
+
});
|
|
142
|
+
const server = this.createMCPServer();
|
|
143
|
+
await server.connect(transport);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
console.error('Error handling SSE connection:', error);
|
|
147
|
+
if (!res.headersSent) {
|
|
148
|
+
res.status(500).json({
|
|
149
|
+
jsonrpc: '2.0',
|
|
150
|
+
error: {
|
|
151
|
+
code: -32603,
|
|
152
|
+
message: 'Internal server error',
|
|
153
|
+
},
|
|
154
|
+
id: null,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
async handleSSEMessage(req, res) {
|
|
160
|
+
const sessionId = req.query.sessionId;
|
|
161
|
+
try {
|
|
162
|
+
const transport = this.transports.get(sessionId);
|
|
163
|
+
if (!transport || !(transport instanceof SSEServerTransport)) {
|
|
164
|
+
res.status(400).json({
|
|
165
|
+
jsonrpc: '2.0',
|
|
166
|
+
error: {
|
|
167
|
+
code: -32000,
|
|
168
|
+
message: 'Bad Request: Session exists but uses a different transport protocol',
|
|
169
|
+
},
|
|
170
|
+
id: null,
|
|
171
|
+
});
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
await transport.handlePostMessage(req, res, req.body);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
console.error('Error handling SSE message:', error);
|
|
178
|
+
if (!res.headersSent) {
|
|
179
|
+
res.status(500).json({
|
|
180
|
+
jsonrpc: '2.0',
|
|
181
|
+
error: {
|
|
182
|
+
code: -32603,
|
|
183
|
+
message: 'Internal server error',
|
|
184
|
+
},
|
|
185
|
+
id: null,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
createMCPServer() {
|
|
191
|
+
const server = new Server({
|
|
192
|
+
name: this.config.server.name,
|
|
193
|
+
version: this.config.server.version,
|
|
194
|
+
}, {
|
|
195
|
+
capabilities: {
|
|
196
|
+
tools: {},
|
|
197
|
+
resources: {},
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
// Setup tool handlers
|
|
201
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
202
|
+
const { name, arguments: args } = request.params;
|
|
203
|
+
return await this.toolHandlers.handleToolRequest(name, args);
|
|
204
|
+
});
|
|
205
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
206
|
+
return {
|
|
207
|
+
tools: XHS_TOOL_SCHEMAS,
|
|
208
|
+
};
|
|
209
|
+
});
|
|
210
|
+
// Setup resource handlers
|
|
211
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
212
|
+
return {
|
|
213
|
+
resources: XHS_RESOURCE_SCHEMAS,
|
|
214
|
+
};
|
|
215
|
+
});
|
|
216
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
217
|
+
const { uri } = request.params;
|
|
218
|
+
return await this.resourceHandlers.handleResourceRequest(uri);
|
|
219
|
+
});
|
|
220
|
+
return server;
|
|
221
|
+
}
|
|
222
|
+
async start() {
|
|
223
|
+
return new Promise((resolve, reject) => {
|
|
224
|
+
const server = this.app.listen(this.port, (error) => {
|
|
225
|
+
if (error) {
|
|
226
|
+
console.error('Failed to start HTTP server:', error);
|
|
227
|
+
reject(error);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
console.log(`XHS MCP HTTP Server listening on port ${this.port}`);
|
|
231
|
+
console.log(`
|
|
232
|
+
==============================================
|
|
233
|
+
SUPPORTED TRANSPORT OPTIONS:
|
|
234
|
+
|
|
235
|
+
1. Streamable HTTP (Protocol version: 2025-03-26)
|
|
236
|
+
Endpoint: /mcp
|
|
237
|
+
Methods: GET, POST, DELETE
|
|
238
|
+
Usage:
|
|
239
|
+
- Initialize with POST to /mcp
|
|
240
|
+
- Establish SSE stream with GET to /mcp
|
|
241
|
+
- Send requests with POST to /mcp
|
|
242
|
+
- Terminate session with DELETE to /mcp
|
|
243
|
+
|
|
244
|
+
2. HTTP + SSE (Protocol version: 2024-11-05)
|
|
245
|
+
Endpoints: /sse (GET) and /messages (POST)
|
|
246
|
+
Usage:
|
|
247
|
+
- Establish SSE stream with GET to /sse
|
|
248
|
+
- Send requests with POST to /messages?sessionId=<id>
|
|
249
|
+
|
|
250
|
+
3. Health Check
|
|
251
|
+
Endpoint: /health
|
|
252
|
+
Method: GET
|
|
253
|
+
Usage: Check server status and supported transports
|
|
254
|
+
==============================================
|
|
255
|
+
`);
|
|
256
|
+
resolve();
|
|
257
|
+
});
|
|
258
|
+
// Handle server shutdown
|
|
259
|
+
process.on('SIGINT', async () => {
|
|
260
|
+
console.log('Shutting down HTTP server...');
|
|
261
|
+
// Close all active transports to properly clean up resources
|
|
262
|
+
for (const [sessionId, transport] of this.transports) {
|
|
263
|
+
try {
|
|
264
|
+
console.log(`Closing transport for session ${sessionId}`);
|
|
265
|
+
await transport.close();
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
console.error(`Error closing transport for session ${sessionId}:`, error);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
this.transports.clear();
|
|
272
|
+
server.close(() => {
|
|
273
|
+
console.log('HTTP server shutdown complete');
|
|
274
|
+
process.exit(0);
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
process.on('SIGTERM', async () => {
|
|
278
|
+
console.log('Shutting down HTTP server...');
|
|
279
|
+
// Close all active transports to properly clean up resources
|
|
280
|
+
for (const [sessionId, transport] of this.transports) {
|
|
281
|
+
try {
|
|
282
|
+
console.log(`Closing transport for session ${sessionId}`);
|
|
283
|
+
await transport.close();
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
console.error(`Error closing transport for session ${sessionId}:`, error);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
this.transports.clear();
|
|
290
|
+
server.close(() => {
|
|
291
|
+
console.log('HTTP server shutdown complete');
|
|
292
|
+
process.exit(0);
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
async stop() {
|
|
298
|
+
// Close all active transports
|
|
299
|
+
for (const [sessionId, transport] of this.transports) {
|
|
300
|
+
try {
|
|
301
|
+
await transport.close();
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
console.error(`Error closing transport for session ${sessionId}:`, error);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
this.transports.clear();
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=http.server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.server.js","sourceRoot":"","sources":["../../src/server/http.server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server for XiaoHongShu Operations
|
|
3
|
+
*/
|
|
4
|
+
export declare class XHSMCPServer {
|
|
5
|
+
private server;
|
|
6
|
+
private toolHandlers;
|
|
7
|
+
private resourceHandlers;
|
|
8
|
+
private config;
|
|
9
|
+
private static instance;
|
|
10
|
+
constructor();
|
|
11
|
+
private setupToolHandlers;
|
|
12
|
+
private setupResourceHandlers;
|
|
13
|
+
start(): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=mcp.server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.server.d.ts","sourceRoot":"","sources":["../../src/server/mcp.server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA6B;;IAuBpD,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,qBAAqB;IAavB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server for XiaoHongShu Operations
|
|
3
|
+
*/
|
|
4
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
5
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
6
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
7
|
+
import { getConfig } from '../lib/shared/config.js';
|
|
8
|
+
import { ToolHandlers } from './handlers/tool.handlers.js';
|
|
9
|
+
import { ResourceHandlers } from './handlers/resource.handlers.js';
|
|
10
|
+
import { XHS_TOOL_SCHEMAS, XHS_RESOURCE_SCHEMAS } from './schemas/tool.schemas.js';
|
|
11
|
+
export class XHSMCPServer {
|
|
12
|
+
server;
|
|
13
|
+
toolHandlers;
|
|
14
|
+
resourceHandlers;
|
|
15
|
+
config;
|
|
16
|
+
static instance = null;
|
|
17
|
+
constructor() {
|
|
18
|
+
this.config = getConfig();
|
|
19
|
+
this.toolHandlers = new ToolHandlers();
|
|
20
|
+
this.resourceHandlers = new ResourceHandlers();
|
|
21
|
+
this.server = new Server({
|
|
22
|
+
name: this.config.server.name,
|
|
23
|
+
version: this.config.server.version,
|
|
24
|
+
}, {
|
|
25
|
+
capabilities: {
|
|
26
|
+
tools: {},
|
|
27
|
+
resources: {},
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
this.setupToolHandlers();
|
|
31
|
+
this.setupResourceHandlers();
|
|
32
|
+
}
|
|
33
|
+
setupToolHandlers() {
|
|
34
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
35
|
+
const { name, arguments: args } = request.params;
|
|
36
|
+
return await this.toolHandlers.handleToolRequest(name, args);
|
|
37
|
+
});
|
|
38
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
39
|
+
return {
|
|
40
|
+
tools: XHS_TOOL_SCHEMAS,
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
setupResourceHandlers() {
|
|
45
|
+
this.server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
46
|
+
return {
|
|
47
|
+
resources: XHS_RESOURCE_SCHEMAS,
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
51
|
+
const { uri } = request.params;
|
|
52
|
+
return await this.resourceHandlers.handleResourceRequest(uri);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
async start() {
|
|
56
|
+
const transport = new StdioServerTransport();
|
|
57
|
+
await this.server.connect(transport);
|
|
58
|
+
// Don't log to stderr in stdio mode to avoid interfering with MCP protocol
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=mcp.server.js.map
|