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.
Files changed (133) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +122 -0
  3. package/README.md +180 -0
  4. package/dist/cli/xhs-cli.d.ts +6 -0
  5. package/dist/cli/xhs-cli.d.ts.map +1 -0
  6. package/dist/cli/xhs-cli.js +300 -0
  7. package/dist/cli/xhs-cli.js.map +1 -0
  8. package/dist/index.d.ts +6 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +58 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/lib/auth/auth.service.d.ts +12 -0
  13. package/dist/lib/auth/auth.service.d.ts.map +1 -0
  14. package/dist/lib/auth/auth.service.js +138 -0
  15. package/dist/lib/auth/auth.service.js.map +1 -0
  16. package/dist/lib/auth/auth.types.d.ts +17 -0
  17. package/dist/lib/auth/auth.types.d.ts.map +1 -0
  18. package/dist/lib/auth/auth.types.js +5 -0
  19. package/dist/lib/auth/auth.types.js.map +1 -0
  20. package/dist/lib/auth/index.d.ts +6 -0
  21. package/dist/lib/auth/index.d.ts.map +1 -0
  22. package/dist/lib/auth/index.js +6 -0
  23. package/dist/lib/auth/index.js.map +1 -0
  24. package/dist/lib/browser/browser.manager.d.ts +22 -0
  25. package/dist/lib/browser/browser.manager.d.ts.map +1 -0
  26. package/dist/lib/browser/browser.manager.js +196 -0
  27. package/dist/lib/browser/browser.manager.js.map +1 -0
  28. package/dist/lib/browser/browser.types.d.ts +23 -0
  29. package/dist/lib/browser/browser.types.d.ts.map +1 -0
  30. package/dist/lib/browser/browser.types.js +5 -0
  31. package/dist/lib/browser/browser.types.js.map +1 -0
  32. package/dist/lib/browser/index.d.ts +6 -0
  33. package/dist/lib/browser/index.d.ts.map +1 -0
  34. package/dist/lib/browser/index.js +6 -0
  35. package/dist/lib/browser/index.js.map +1 -0
  36. package/dist/lib/feeds/feed.service.d.ts +13 -0
  37. package/dist/lib/feeds/feed.service.d.ts.map +1 -0
  38. package/dist/lib/feeds/feed.service.js +224 -0
  39. package/dist/lib/feeds/feed.service.js.map +1 -0
  40. package/dist/lib/feeds/feed.types.d.ts +26 -0
  41. package/dist/lib/feeds/feed.types.d.ts.map +1 -0
  42. package/dist/lib/feeds/feed.types.js +5 -0
  43. package/dist/lib/feeds/feed.types.js.map +1 -0
  44. package/dist/lib/feeds/index.d.ts +6 -0
  45. package/dist/lib/feeds/index.d.ts.map +1 -0
  46. package/dist/lib/feeds/index.js +6 -0
  47. package/dist/lib/feeds/index.js.map +1 -0
  48. package/dist/lib/index.d.ts +9 -0
  49. package/dist/lib/index.d.ts.map +1 -0
  50. package/dist/lib/index.js +11 -0
  51. package/dist/lib/index.js.map +1 -0
  52. package/dist/lib/publishing/index.d.ts +6 -0
  53. package/dist/lib/publishing/index.d.ts.map +1 -0
  54. package/dist/lib/publishing/index.js +6 -0
  55. package/dist/lib/publishing/index.js.map +1 -0
  56. package/dist/lib/publishing/publish.service.d.ts +39 -0
  57. package/dist/lib/publishing/publish.service.d.ts.map +1 -0
  58. package/dist/lib/publishing/publish.service.js +942 -0
  59. package/dist/lib/publishing/publish.service.js.map +1 -0
  60. package/dist/lib/publishing/publish.types.d.ts +37 -0
  61. package/dist/lib/publishing/publish.types.d.ts.map +1 -0
  62. package/dist/lib/publishing/publish.types.js +5 -0
  63. package/dist/lib/publishing/publish.types.js.map +1 -0
  64. package/dist/lib/shared/base.service.d.ts +22 -0
  65. package/dist/lib/shared/base.service.d.ts.map +1 -0
  66. package/dist/lib/shared/base.service.js +28 -0
  67. package/dist/lib/shared/base.service.js.map +1 -0
  68. package/dist/lib/shared/config.d.ts +17 -0
  69. package/dist/lib/shared/config.d.ts.map +1 -0
  70. package/dist/lib/shared/config.js +133 -0
  71. package/dist/lib/shared/config.js.map +1 -0
  72. package/dist/lib/shared/cookies.d.ts +10 -0
  73. package/dist/lib/shared/cookies.d.ts.map +1 -0
  74. package/dist/lib/shared/cookies.js +79 -0
  75. package/dist/lib/shared/cookies.js.map +1 -0
  76. package/dist/lib/shared/errors.d.ts +51 -0
  77. package/dist/lib/shared/errors.d.ts.map +1 -0
  78. package/dist/lib/shared/errors.js +93 -0
  79. package/dist/lib/shared/errors.js.map +1 -0
  80. package/dist/lib/shared/index.d.ts +11 -0
  81. package/dist/lib/shared/index.d.ts.map +1 -0
  82. package/dist/lib/shared/index.js +18 -0
  83. package/dist/lib/shared/index.js.map +1 -0
  84. package/dist/lib/shared/logger.d.ts +16 -0
  85. package/dist/lib/shared/logger.d.ts.map +1 -0
  86. package/dist/lib/shared/logger.js +41 -0
  87. package/dist/lib/shared/logger.js.map +1 -0
  88. package/dist/lib/shared/types.d.ts +175 -0
  89. package/dist/lib/shared/types.d.ts.map +1 -0
  90. package/dist/lib/shared/types.js +6 -0
  91. package/dist/lib/shared/types.js.map +1 -0
  92. package/dist/lib/shared/utils.d.ts +78 -0
  93. package/dist/lib/shared/utils.d.ts.map +1 -0
  94. package/dist/lib/shared/utils.js +137 -0
  95. package/dist/lib/shared/utils.js.map +1 -0
  96. package/dist/server/handlers/index.d.ts +6 -0
  97. package/dist/server/handlers/index.d.ts.map +1 -0
  98. package/dist/server/handlers/index.js +6 -0
  99. package/dist/server/handlers/index.js.map +1 -0
  100. package/dist/server/handlers/resource.handlers.d.ts +18 -0
  101. package/dist/server/handlers/resource.handlers.d.ts.map +1 -0
  102. package/dist/server/handlers/resource.handlers.js +113 -0
  103. package/dist/server/handlers/resource.handlers.js.map +1 -0
  104. package/dist/server/handlers/tool.handlers.d.ts +64 -0
  105. package/dist/server/handlers/tool.handlers.d.ts.map +1 -0
  106. package/dist/server/handlers/tool.handlers.js +123 -0
  107. package/dist/server/handlers/tool.handlers.js.map +1 -0
  108. package/dist/server/http.server.d.ts +21 -0
  109. package/dist/server/http.server.d.ts.map +1 -0
  110. package/dist/server/http.server.js +310 -0
  111. package/dist/server/http.server.js.map +1 -0
  112. package/dist/server/index.d.ts +7 -0
  113. package/dist/server/index.d.ts.map +1 -0
  114. package/dist/server/index.js +7 -0
  115. package/dist/server/index.js.map +1 -0
  116. package/dist/server/mcp.server.d.ts +15 -0
  117. package/dist/server/mcp.server.d.ts.map +1 -0
  118. package/dist/server/mcp.server.js +61 -0
  119. package/dist/server/mcp.server.js.map +1 -0
  120. package/dist/server/schemas/tool.schemas.d.ts +20 -0
  121. package/dist/server/schemas/tool.schemas.d.ts.map +1 -0
  122. package/dist/server/schemas/tool.schemas.js +178 -0
  123. package/dist/server/schemas/tool.schemas.js.map +1 -0
  124. package/dist/utils/index.d.ts +5 -0
  125. package/dist/utils/index.d.ts.map +1 -0
  126. package/dist/utils/index.js +5 -0
  127. package/dist/utils/index.js.map +1 -0
  128. package/dist/utils/xhs.utils.d.ts +14 -0
  129. package/dist/utils/xhs.utils.d.ts.map +1 -0
  130. package/dist/utils/xhs.utils.js +84 -0
  131. package/dist/utils/xhs.utils.js.map +1 -0
  132. package/docs/HTTP_TRANSPORTS.md +269 -0
  133. 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,7 @@
1
+ /**
2
+ * Server implementation for XHS MCP Server
3
+ */
4
+ export * from './mcp.server.js';
5
+ export * from './http.server.js';
6
+ export * from './handlers/index.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -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,7 @@
1
+ /**
2
+ * Server implementation for XHS MCP Server
3
+ */
4
+ export * from './mcp.server.js';
5
+ export * from './http.server.js';
6
+ export * from './handlers/index.js';
7
+ //# sourceMappingURL=index.js.map
@@ -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