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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 XiaoHongShu MCP Server
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.en.md ADDED
@@ -0,0 +1,122 @@
1
+ ---
2
+ noteId: "de25fbc0988c11f0a5c2e10de4f705bc"
3
+ tags: []
4
+
5
+ ---
6
+
7
+ # xhs-mcp
8
+
9
+ English | [简体中文](./README.md)
10
+
11
+ Unified CLI `xhs-cli` with built-in MCP server subcommand. Automate XiaoHongShu (xiaohongshu.com) with Puppeteer: login, publishing, search, feed discovery, and commenting via MCP and CLI.
12
+
13
+ [![npm version](https://img.shields.io/npm/v/xhs-mcp.svg)](https://www.npmjs.com/package/xhs-mcp)
14
+ [![npm downloads](https://img.shields.io/npm/dm/xhs-mcp.svg)](https://www.npmjs.com/package/xhs-mcp)
15
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
16
+
17
+ ## 📦 NPM
18
+
19
+ - Package: `xhs-mcp`
20
+ - Run CLI: `npx xhs-cli <subcommand>`
21
+ - Start MCP: `npx xhs-cli mcp [--mode stdio|http] [--port 3000]`
22
+
23
+ ## ✨ Features
24
+
25
+ - Auth: login, logout, status check
26
+ - Publish: unified content publishing (images: 1-18 files, videos: exactly 1 file)
27
+ - Discover: home feeds, keyword search, note detail, comment
28
+ - Automation: Puppeteer-driven, headless mode, cookie management
29
+
30
+ ## 📋 Tools
31
+
32
+ - `xhs_auth_login`, `xhs_auth_logout`, `xhs_auth_status`
33
+ - `xhs_discover_feeds`, `xhs_search_note`, `xhs_get_note_detail`
34
+ - `xhs_comment_on_note`
35
+ - `xhs_publish_content` (unified interface: `type`, `title`, `content`, `media_paths`, `tags`)
36
+ - Images: 1-18 image files
37
+ - Videos: exactly 1 video file
38
+
39
+ ## 🚀 Quick Start (MCP)
40
+
41
+ ```bash
42
+ npx xhs-cli mcp
43
+
44
+ # Debug logs
45
+ XHS_ENABLE_LOGGING=true npx xhs-cli mcp
46
+ ```
47
+
48
+ > First run tip: if Puppeteer browsers are not installed yet, run
49
+ >
50
+ > ```bash
51
+ > npx xhs-cli browser # auto-check and install Chromium, shows executable path
52
+ > # or
53
+ > npx puppeteer browsers install chrome
54
+ > ```
55
+ >
56
+ > Output example:
57
+ > ```json
58
+ > {
59
+ > "success": true,
60
+ > "message": "Chromium is ready",
61
+ > "data": {
62
+ > "installed": true,
63
+ > "executablePath": "/path/to/chromium"
64
+ > }
65
+ > }
66
+ > ```
67
+
68
+ Verify MCP connection:
69
+
70
+ ```bash
71
+ echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}' | npx xhs-cli mcp
72
+ ```
73
+
74
+ ## 🧰 CLI
75
+
76
+ ```bash
77
+ npx xhs-cli login --timeout 120
78
+ npx xhs-cli logout
79
+ npx xhs-cli status
80
+ npx xhs-cli browser # check and install Chromium, shows executable path
81
+ npx xhs-cli feeds
82
+ npx xhs-cli search -k keyword
83
+ npx xhs-cli note-detail --feed-id <id> --xsec-token <token>
84
+ npx xhs-cli comment --feed-id <id> --xsec-token <token> -n "Nice!"
85
+ npx xhs-cli publish --type image --title Title --content Content -m path1.jpg,path2.png --tags a,b
86
+ npx xhs-cli publish --type video --title Title --content Content -m video.mp4 --tags a,b
87
+ npx xhs-cli tools [--detailed] [--json]
88
+ npx xhs-cli mcp --mode http --port 3000
89
+ ```
90
+
91
+ ## 🔧 Client Integration (Cursor)
92
+
93
+ `.cursor/mcp.json`:
94
+
95
+ ```json
96
+ {
97
+ "mcpServers": {
98
+ "xhs-mcp": {
99
+ "command": "npx",
100
+ "args": ["xhs-cli", "mcp"],
101
+ "env": { "XHS_ENABLE_LOGGING": "true" }
102
+ }
103
+ }
104
+ }
105
+ ```
106
+
107
+ ## ⚠️ Notes
108
+
109
+ - Title≤20, content≤1000, images: 1-18 files, videos: exactly 1 file
110
+ - Avoid multiple web logins for the same account simultaneously
111
+ - Keep reasonable posting frequency
112
+
113
+ ## 🙏 Acknowledgments
114
+
115
+ Based on and extended from [xiaohongshu-mcp](https://github.com/xpzouying/xiaohongshu-mcp) (refactored to TypeScript, improved MCP implementation, log cleanup, published to NPM).
116
+
117
+ ## 📚 Docs
118
+
119
+ - HTTP Transports: `docs/HTTP_TRANSPORTS.md`
120
+ - Publish Features: `docs/PUBLISH_FEATURES.md`
121
+ - Architecture Design: `docs/PUBLISH_ARCHITECTURE.md`
122
+
package/README.md ADDED
@@ -0,0 +1,180 @@
1
+ # xhs-mcp
2
+
3
+ 简体中文 | [English](./README.en.md)
4
+
5
+ `xhs-mcp` 提供统一的命令行入口 `xhs-cli`,并内置 MCP 服务器子命令。用于小红书(xiaohongshu.com)的 Model Context Protocol(MCP)服务器与 CLI 工具,支持登录、发布、搜索、推荐等自动化能力(基于 Puppeteer)。
6
+
7
+ [![npm version](https://img.shields.io/npm/v/xhs-mcp.svg)](https://www.npmjs.com/package/xhs-mcp)
8
+ [![npm downloads](https://img.shields.io/npm/dm/xhs-mcp.svg)](https://www.npmjs.com/package/xhs-mcp)
9
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
10
+
11
+ ## 📦 NPM 信息
12
+
13
+ - 包名: `xhs-mcp`
14
+ - 运行 CLI(推荐): `npx xhs-cli <subcommand>`
15
+ - 启动 MCP:`npx xhs-cli mcp [--mode stdio|http] [--port 3000]`
16
+
17
+ ## ✨ 功能
18
+
19
+ - 认证:登录、登出、状态检查
20
+ - 发布:图文发布(标题≤20、内容≤1000、最多18图)
21
+ - 发现:推荐、搜索、详情、评论
22
+ - 自动化:Puppeteer 驱动、无头模式、Cookie 管理
23
+
24
+ ## 📋 可用工具
25
+
26
+ - `xhs_auth_login`、`xhs_auth_logout`、`xhs_auth_status`
27
+ - `xhs_discover_feeds`、`xhs_search_note`、`xhs_get_note_detail`
28
+ - `xhs_comment_on_note`
29
+ - `xhs_publish_content`(统一发布接口:`type`、`title`、`content`、`media_paths`、`tags`)
30
+ - 图片:1-18个图片文件
31
+ - 视频:恰好1个视频文件
32
+
33
+ ## 🚀 快速开始(MCP)
34
+
35
+ ### Stdio 模式(默认)
36
+
37
+ ```bash
38
+ npx xhs-cli mcp
39
+
40
+ # 调试日志
41
+ XHS_ENABLE_LOGGING=true npx xhs-cli mcp
42
+ ```
43
+
44
+ > 首次运行提示:如果未安装 Puppeteer 浏览器,先执行
45
+ >
46
+ > ```bash
47
+ > npx xhs-cli browser # 自动检查并安装 Chromium,显示可执行路径
48
+ > # 或
49
+ > npx puppeteer browsers install chrome
50
+ > ```
51
+ >
52
+ > 输出示例:
53
+ > ```json
54
+ > {
55
+ > "success": true,
56
+ > "message": "Chromium is ready",
57
+ > "data": {
58
+ > "installed": true,
59
+ > "executablePath": "/path/to/chromium"
60
+ > }
61
+ > }
62
+ > ```
63
+
64
+ 验证 MCP 连接:
65
+
66
+ ```bash
67
+ echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}' | npx xhs-cli mcp
68
+ ```
69
+
70
+ ### HTTP 模式
71
+
72
+ ```bash
73
+ # 启动 HTTP 服务器(默认端口 3000)
74
+ npx xhs-cli mcp --mode http
75
+
76
+ # 指定端口
77
+ npx xhs-cli mcp --mode http --port 8080
78
+
79
+ # 调试模式
80
+ XHS_ENABLE_LOGGING=true npx xhs-cli mcp --mode http
81
+ ```
82
+
83
+ HTTP 服务器支持:
84
+ - **Streamable HTTP** (协议版本 2025-03-26) - 端点:`/mcp`
85
+ - **SSE** (协议版本 2024-11-05) - 端点:`/sse` 和 `/messages`
86
+ - **健康检查** - 端点:`/health`
87
+
88
+ 详细文档请参考:[HTTP Transports](./docs/HTTP_TRANSPORTS.md)
89
+
90
+ ## 🧰 CLI 子命令
91
+
92
+ ```bash
93
+ # 认证
94
+ npx xhs-cli login --timeout 120
95
+ npx xhs-cli logout
96
+ npx xhs-cli status
97
+
98
+ # 浏览器依赖
99
+ npx xhs-cli browser [--with-deps] # 检查并安装 Chromium,显示可执行路径
100
+
101
+ # 发现与检索
102
+ npx xhs-cli feeds [-b /path/to/chromium]
103
+ npx xhs-cli search -k 关键字 [-b /path/to/chromium]
104
+ npx xhs-cli note-detail --feed-id <id> --xsec-token <token> [-b /path/to/chromium]
105
+
106
+ # 互动
107
+ npx xhs-cli comment --feed-id <id> --xsec-token <token> -n "Nice!" [-b /path/to/chromium]
108
+
109
+ # 发布
110
+ npx xhs-cli publish --type image --title 标题 --content 内容 -m path1.jpg,path2.png --tags a,b [-b /path/to/chromium]
111
+ npx xhs-cli publish --type video --title 视频标题 --content 视频描述 -m path/to/video.mp4 --tags a,b [-b /path/to/chromium]
112
+
113
+ # 查看可用工具
114
+ npx xhs-cli tools [--detailed] [--json]
115
+
116
+ # 启动 MCP
117
+ npx xhs-cli mcp [--mode stdio|http] [--port 3000]
118
+ ```
119
+
120
+ ## 🔧 客户端接入(Cursor)
121
+
122
+ ### Stdio 模式
123
+
124
+ `.cursor/mcp.json`:
125
+
126
+ ```json
127
+ {
128
+ "mcpServers": {
129
+ "xhs-mcp": {
130
+ "command": "npx",
131
+ "args": ["xhs-cli", "mcp"],
132
+ "env": { "XHS_ENABLE_LOGGING": "true" }
133
+ }
134
+ }
135
+ }
136
+ ```
137
+
138
+ ### HTTP 模式
139
+
140
+ `.cursor/mcp.json`:
141
+
142
+ ```json
143
+ {
144
+ "mcpServers": {
145
+ "xhs-mcp-http": {
146
+ "command": "npx",
147
+ "args": ["xhs-cli", "mcp", "--mode", "http", "--port", "3000"],
148
+ "env": { "XHS_ENABLE_LOGGING": "true" }
149
+ }
150
+ }
151
+ }
152
+ ```
153
+
154
+ 或者使用 HTTP 客户端直接连接:
155
+
156
+ ```json
157
+ {
158
+ "mcpServers": {
159
+ "xhs-mcp-http": {
160
+ "url": "http://localhost:3000/mcp"
161
+ }
162
+ }
163
+ }
164
+ ```
165
+
166
+ ## ⚠️ 注意事项
167
+
168
+ - 标题≤20、内容≤1000、图片≤18
169
+ - 避免同账号多端同时网页登录
170
+ - 合理控制发帖频率
171
+
172
+ ## 🙏 致谢
173
+
174
+ 基于 [xiaohongshu-mcp](https://github.com/xpzouying/xiaohongshu-mcp) 重构与扩展(TypeScript、Puppeteer、MCP 优化、日志清理、NPM 发布)。
175
+
176
+ ## 📚 文档
177
+
178
+ - HTTP Transports:`docs/HTTP_TRANSPORTS.md`
179
+ - 发布功能:`docs/PUBLISH_FEATURES.md`
180
+ - 架构设计:`docs/PUBLISH_ARCHITECTURE.md`
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Unified CLI for XiaoHongShu operations
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=xhs-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xhs-cli.d.ts","sourceRoot":"","sources":["../../src/cli/xhs-cli.ts"],"names":[],"mappings":";AAEA;;GAEG"}
@@ -0,0 +1,300 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Unified CLI for XiaoHongShu operations
4
+ */
5
+ import { Command } from 'commander';
6
+ import { getConfig } from '../lib/shared/config.js';
7
+ import { AuthService } from '../lib/auth/auth.service.js';
8
+ import puppeteer from 'puppeteer';
9
+ import { spawnSync } from 'node:child_process';
10
+ import { XHSMCPServer, XHSHTTPMCPServer } from '../server/index.js';
11
+ import { XHS_TOOL_SCHEMAS } from '../server/schemas/tool.schemas.js';
12
+ import { FeedService } from '../lib/feeds/feed.service.js';
13
+ import { PublishService } from '../lib/publishing/publish.service.js';
14
+ async function main() {
15
+ const config = getConfig();
16
+ const program = new Command();
17
+ function formatErrorMessage(error) {
18
+ const raw = error instanceof Error ? (error.stack ?? error.message) : String(error);
19
+ const condensed = raw
20
+ .replace(/[\s\S]*?Looks like Puppeteer[\s\S]*?Please run the following command to download new browsers:[\s\S]*?npx puppeteer browsers install[\s\S]*?(Puppeteer Team[\s\S]*?)*?/m, '')
21
+ .replace(/[\u2500-\u257F]+/g, '') // box-drawing characters
22
+ .trim();
23
+ if (/Executable doesn't exist|puppeteer browsers install/i.test(raw)) {
24
+ return 'Chromium is not installed. Run: npx puppeteer browsers install chrome or xhs-cli browser';
25
+ }
26
+ return condensed || (error instanceof Error ? error.message : String(error));
27
+ }
28
+ function writeJson(output, exitCode = 0) {
29
+ const compact = program.getOptionValue?.('compact') === true;
30
+ const json = compact ? JSON.stringify(output) : JSON.stringify(output, null, 2);
31
+ process.stdout.write(`${json}\n`);
32
+ process.exit(exitCode);
33
+ }
34
+ function printSuccess(result, message) {
35
+ const payload = {
36
+ success: true,
37
+ message: message ?? result?.message ?? undefined,
38
+ data: result,
39
+ };
40
+ writeJson(payload, 0);
41
+ }
42
+ function printError(error, code) {
43
+ const message = formatErrorMessage(error);
44
+ const payload = { success: false, message, code: code ?? undefined, status: 'error' };
45
+ writeJson(payload, 1);
46
+ }
47
+ program
48
+ .name('xhs-cli')
49
+ .description('XiaoHongShu CLI with subcommands')
50
+ .option('--compact', 'Output compact one-line JSON (no pretty print)')
51
+ .showHelpAfterError();
52
+ program
53
+ .command('login')
54
+ .description('Start XiaoHongShu login flow (opens browser, saves cookies)')
55
+ .option('-t, --timeout <seconds>', 'Login timeout in seconds', `${config.browser.loginTimeout}`)
56
+ .action(async (opts) => {
57
+ const browserPath = undefined;
58
+ const timeoutSec = opts.timeout ? parseInt(opts.timeout, 10) : config.browser.loginTimeout;
59
+ const authService = new AuthService(config);
60
+ try {
61
+ const result = await authService.login(browserPath, timeoutSec);
62
+ printSuccess(result);
63
+ }
64
+ catch (error) {
65
+ printError(error);
66
+ }
67
+ });
68
+ program
69
+ .command('logout')
70
+ .description('Logout from XiaoHongShu and clear saved cookies')
71
+ .action(async () => {
72
+ const authService = new AuthService(config);
73
+ try {
74
+ const result = await authService.logout();
75
+ printSuccess(result);
76
+ }
77
+ catch (error) {
78
+ printError(error);
79
+ }
80
+ });
81
+ program
82
+ .command('status')
83
+ .description('Check current XiaoHongShu login status')
84
+ .action(async () => {
85
+ const browserPath = undefined;
86
+ const authService = new AuthService(config);
87
+ try {
88
+ const result = await authService.checkStatus(browserPath);
89
+ printSuccess(result);
90
+ }
91
+ catch (error) {
92
+ printError(error);
93
+ }
94
+ });
95
+ program
96
+ .command('browser')
97
+ .description('Ensure Puppeteer Chromium is installed and launchable; installs if missing')
98
+ .option('--with-deps', 'Install OS-level dependencies as well (may require sudo)')
99
+ .action(async (opts) => {
100
+ async function canLaunchChromium() {
101
+ try {
102
+ // Get the executable path before launching
103
+ const executablePath = puppeteer.executablePath();
104
+ const browser = await puppeteer.launch({ headless: true });
105
+ await browser.close();
106
+ return { canLaunch: true, executablePath };
107
+ }
108
+ catch {
109
+ return { canLaunch: false };
110
+ }
111
+ }
112
+ const browserInfo = await canLaunchChromium();
113
+ if (browserInfo.canLaunch) {
114
+ printSuccess({
115
+ installed: true,
116
+ executablePath: browserInfo.executablePath
117
+ }, 'Chromium is ready');
118
+ return;
119
+ }
120
+ const args = ['puppeteer', 'browsers', 'install', 'chrome'];
121
+ if (opts.withDeps)
122
+ args.push('--with-deps');
123
+ const result = spawnSync('npx', args, { stdio: 'inherit', env: process.env });
124
+ const afterInstallInfo = await canLaunchChromium();
125
+ if (afterInstallInfo.canLaunch) {
126
+ printSuccess({
127
+ installed: true,
128
+ executablePath: afterInstallInfo.executablePath,
129
+ exitCode: result.status ?? null
130
+ }, 'Chromium installed and ready');
131
+ }
132
+ else {
133
+ printError(new Error('Failed to install or launch Chromium'));
134
+ }
135
+ });
136
+ // Feeds: discover
137
+ program
138
+ .command('feeds')
139
+ .description('Discover home page feeds')
140
+ .option('-b, --browser-path <path>', 'Custom browser binary path')
141
+ .action(async (opts) => {
142
+ const feedService = new FeedService(config);
143
+ try {
144
+ const result = await feedService.getFeedList(opts.browserPath);
145
+ printSuccess(result);
146
+ }
147
+ catch (error) {
148
+ printError(error);
149
+ }
150
+ });
151
+ // Feeds: search note
152
+ program
153
+ .command('search')
154
+ .description('Search notes by keyword')
155
+ .requiredOption('-k, --keyword <keyword>', 'Search keyword')
156
+ .option('-b, --browser-path <path>', 'Custom browser binary path')
157
+ .action(async (opts) => {
158
+ const feedService = new FeedService(config);
159
+ try {
160
+ const result = await feedService.searchFeeds(opts.keyword, opts.browserPath);
161
+ printSuccess(result);
162
+ }
163
+ catch (error) {
164
+ printError(error);
165
+ }
166
+ });
167
+ // Feeds: get note detail
168
+ program
169
+ .command('note-detail')
170
+ .description('Get detailed information about a specific note')
171
+ .requiredOption('--feed-id <id>', 'Feed ID')
172
+ .requiredOption('--xsec-token <token>', 'Security token for the feed')
173
+ .option('-b, --browser-path <path>', 'Custom browser binary path')
174
+ .action(async (opts) => {
175
+ const feedService = new FeedService(config);
176
+ try {
177
+ const result = await feedService.getFeedDetail(opts.feedId, opts.xsecToken, opts.browserPath);
178
+ printSuccess(result);
179
+ }
180
+ catch (error) {
181
+ printError(error);
182
+ }
183
+ });
184
+ // Feeds: comment on note
185
+ program
186
+ .command('comment')
187
+ .description('Comment on a note')
188
+ .requiredOption('--feed-id <id>', 'Feed ID')
189
+ .requiredOption('--xsec-token <token>', 'Security token for the feed')
190
+ .requiredOption('-n, --note <text>', 'Comment content')
191
+ .option('-b, --browser-path <path>', 'Custom browser binary path')
192
+ .action(async (opts) => {
193
+ const feedService = new FeedService(config);
194
+ try {
195
+ const result = await feedService.commentOnFeed(opts.feedId, opts.xsecToken, opts.note, opts.browserPath);
196
+ printSuccess(result);
197
+ }
198
+ catch (error) {
199
+ printError(error);
200
+ }
201
+ });
202
+ // Publishing: unified publish command
203
+ program
204
+ .command('publish')
205
+ .description('Publish content to XiaoHongShu (supports both images and videos)')
206
+ .requiredOption('-t, --type <type>', 'Content type: "image" for images, "video" for videos')
207
+ .requiredOption('--title <title>', 'Content title (<= 20 chars)')
208
+ .requiredOption('--content <content>', 'Content description (<= 1000 chars)')
209
+ .requiredOption('-m, --media <paths>', 'Comma-separated media file paths (1-18 images for image posts, exactly 1 video for videos)')
210
+ .option('--tags <tags>', 'Comma-separated tags')
211
+ .option('-b, --browser-path <path>', 'Custom browser binary path')
212
+ .action(async (opts) => {
213
+ const publishService = new PublishService(config);
214
+ try {
215
+ if (opts.type !== 'image' && opts.type !== 'video') {
216
+ printError(new Error('Type must be "image" or "video"'));
217
+ return;
218
+ }
219
+ const mediaPaths = opts.media.split(',').map(s => s.trim()).filter(Boolean);
220
+ const result = await publishService.publishContent(opts.type, opts.title, opts.content, mediaPaths, opts.tags, opts.browserPath);
221
+ printSuccess(result);
222
+ }
223
+ catch (error) {
224
+ printError(error);
225
+ }
226
+ });
227
+ program
228
+ .command('mcp')
229
+ .description('Start XHS MCP server (stdio or http mode)')
230
+ .option('-m, --mode <mode>', 'Server mode: stdio or http', 'stdio')
231
+ .option('-p, --port <port>', 'HTTP server port (only for http mode)', '3000')
232
+ .action(async (opts) => {
233
+ try {
234
+ if (opts.mode === 'http') {
235
+ const port = opts.port ? parseInt(opts.port, 10) : 3000;
236
+ const httpServer = new XHSHTTPMCPServer(port);
237
+ await httpServer.start();
238
+ }
239
+ else {
240
+ const server = new XHSMCPServer();
241
+ await server.start();
242
+ }
243
+ }
244
+ catch (error) {
245
+ // Avoid polluting stdio mode; only emit minimal error info
246
+ printError(error);
247
+ }
248
+ });
249
+ // List MCP tools
250
+ program
251
+ .command('tools')
252
+ .description('List available MCP tools')
253
+ .option('-j, --json', 'Output in JSON format')
254
+ .option('-d, --detailed', 'Show detailed tool information')
255
+ .action(async (opts) => {
256
+ try {
257
+ const toolSchemas = XHS_TOOL_SCHEMAS;
258
+ if (opts.json) {
259
+ if (opts.detailed) {
260
+ console.log(JSON.stringify(toolSchemas, null, 2));
261
+ }
262
+ else {
263
+ const toolNames = toolSchemas.map(tool => ({
264
+ name: tool.name,
265
+ description: tool.description
266
+ }));
267
+ console.log(JSON.stringify(toolNames, null, 2));
268
+ }
269
+ }
270
+ else {
271
+ console.log('\n📋 Available MCP Tools:\n');
272
+ toolSchemas.forEach((tool, index) => {
273
+ console.log(`${index + 1}. ${tool.name}`);
274
+ console.log(` ${tool.description}`);
275
+ if (opts.detailed) {
276
+ const required = tool.inputSchema.required || [];
277
+ const properties = tool.inputSchema.properties || {};
278
+ if (Object.keys(properties).length > 0) {
279
+ console.log(' Parameters:');
280
+ Object.entries(properties).forEach(([key, prop]) => {
281
+ const requiredMark = required.includes(key) ? ' (required)' : ' (optional)';
282
+ console.log(` - ${key}: ${prop.description || 'No description'}${requiredMark}`);
283
+ });
284
+ }
285
+ }
286
+ console.log('');
287
+ });
288
+ console.log(`Total: ${toolSchemas.length} tools available`);
289
+ console.log('\nUse --detailed for parameter information');
290
+ console.log('Use --json for machine-readable output');
291
+ }
292
+ }
293
+ catch (error) {
294
+ printError(error);
295
+ }
296
+ });
297
+ program.parseAsync(process.argv);
298
+ }
299
+ main();
300
+ //# sourceMappingURL=xhs-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xhs-cli.js","sourceRoot":"","sources":["../../src/cli/xhs-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Main entry point for XHS MCP Server
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;GAEG"}