xhs-mcp 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.en.md +122 -0
- package/README.md +180 -0
- package/dist/cli/xhs-cli.d.ts +6 -0
- package/dist/cli/xhs-cli.d.ts.map +1 -0
- package/dist/cli/xhs-cli.js +300 -0
- package/dist/cli/xhs-cli.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/auth/auth.service.d.ts +12 -0
- package/dist/lib/auth/auth.service.d.ts.map +1 -0
- package/dist/lib/auth/auth.service.js +138 -0
- package/dist/lib/auth/auth.service.js.map +1 -0
- package/dist/lib/auth/auth.types.d.ts +17 -0
- package/dist/lib/auth/auth.types.d.ts.map +1 -0
- package/dist/lib/auth/auth.types.js +5 -0
- package/dist/lib/auth/auth.types.js.map +1 -0
- package/dist/lib/auth/index.d.ts +6 -0
- package/dist/lib/auth/index.d.ts.map +1 -0
- package/dist/lib/auth/index.js +6 -0
- package/dist/lib/auth/index.js.map +1 -0
- package/dist/lib/browser/browser.manager.d.ts +22 -0
- package/dist/lib/browser/browser.manager.d.ts.map +1 -0
- package/dist/lib/browser/browser.manager.js +196 -0
- package/dist/lib/browser/browser.manager.js.map +1 -0
- package/dist/lib/browser/browser.types.d.ts +23 -0
- package/dist/lib/browser/browser.types.d.ts.map +1 -0
- package/dist/lib/browser/browser.types.js +5 -0
- package/dist/lib/browser/browser.types.js.map +1 -0
- package/dist/lib/browser/index.d.ts +6 -0
- package/dist/lib/browser/index.d.ts.map +1 -0
- package/dist/lib/browser/index.js +6 -0
- package/dist/lib/browser/index.js.map +1 -0
- package/dist/lib/feeds/feed.service.d.ts +13 -0
- package/dist/lib/feeds/feed.service.d.ts.map +1 -0
- package/dist/lib/feeds/feed.service.js +224 -0
- package/dist/lib/feeds/feed.service.js.map +1 -0
- package/dist/lib/feeds/feed.types.d.ts +26 -0
- package/dist/lib/feeds/feed.types.d.ts.map +1 -0
- package/dist/lib/feeds/feed.types.js +5 -0
- package/dist/lib/feeds/feed.types.js.map +1 -0
- package/dist/lib/feeds/index.d.ts +6 -0
- package/dist/lib/feeds/index.d.ts.map +1 -0
- package/dist/lib/feeds/index.js +6 -0
- package/dist/lib/feeds/index.js.map +1 -0
- package/dist/lib/index.d.ts +9 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +11 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/publishing/index.d.ts +6 -0
- package/dist/lib/publishing/index.d.ts.map +1 -0
- package/dist/lib/publishing/index.js +6 -0
- package/dist/lib/publishing/index.js.map +1 -0
- package/dist/lib/publishing/publish.service.d.ts +39 -0
- package/dist/lib/publishing/publish.service.d.ts.map +1 -0
- package/dist/lib/publishing/publish.service.js +942 -0
- package/dist/lib/publishing/publish.service.js.map +1 -0
- package/dist/lib/publishing/publish.types.d.ts +37 -0
- package/dist/lib/publishing/publish.types.d.ts.map +1 -0
- package/dist/lib/publishing/publish.types.js +5 -0
- package/dist/lib/publishing/publish.types.js.map +1 -0
- package/dist/lib/shared/base.service.d.ts +22 -0
- package/dist/lib/shared/base.service.d.ts.map +1 -0
- package/dist/lib/shared/base.service.js +28 -0
- package/dist/lib/shared/base.service.js.map +1 -0
- package/dist/lib/shared/config.d.ts +17 -0
- package/dist/lib/shared/config.d.ts.map +1 -0
- package/dist/lib/shared/config.js +133 -0
- package/dist/lib/shared/config.js.map +1 -0
- package/dist/lib/shared/cookies.d.ts +10 -0
- package/dist/lib/shared/cookies.d.ts.map +1 -0
- package/dist/lib/shared/cookies.js +79 -0
- package/dist/lib/shared/cookies.js.map +1 -0
- package/dist/lib/shared/errors.d.ts +51 -0
- package/dist/lib/shared/errors.d.ts.map +1 -0
- package/dist/lib/shared/errors.js +93 -0
- package/dist/lib/shared/errors.js.map +1 -0
- package/dist/lib/shared/index.d.ts +11 -0
- package/dist/lib/shared/index.d.ts.map +1 -0
- package/dist/lib/shared/index.js +18 -0
- package/dist/lib/shared/index.js.map +1 -0
- package/dist/lib/shared/logger.d.ts +16 -0
- package/dist/lib/shared/logger.d.ts.map +1 -0
- package/dist/lib/shared/logger.js +41 -0
- package/dist/lib/shared/logger.js.map +1 -0
- package/dist/lib/shared/types.d.ts +175 -0
- package/dist/lib/shared/types.d.ts.map +1 -0
- package/dist/lib/shared/types.js +6 -0
- package/dist/lib/shared/types.js.map +1 -0
- package/dist/lib/shared/utils.d.ts +78 -0
- package/dist/lib/shared/utils.d.ts.map +1 -0
- package/dist/lib/shared/utils.js +137 -0
- package/dist/lib/shared/utils.js.map +1 -0
- package/dist/server/handlers/index.d.ts +6 -0
- package/dist/server/handlers/index.d.ts.map +1 -0
- package/dist/server/handlers/index.js +6 -0
- package/dist/server/handlers/index.js.map +1 -0
- package/dist/server/handlers/resource.handlers.d.ts +18 -0
- package/dist/server/handlers/resource.handlers.d.ts.map +1 -0
- package/dist/server/handlers/resource.handlers.js +113 -0
- package/dist/server/handlers/resource.handlers.js.map +1 -0
- package/dist/server/handlers/tool.handlers.d.ts +64 -0
- package/dist/server/handlers/tool.handlers.d.ts.map +1 -0
- package/dist/server/handlers/tool.handlers.js +123 -0
- package/dist/server/handlers/tool.handlers.js.map +1 -0
- package/dist/server/http.server.d.ts +21 -0
- package/dist/server/http.server.d.ts.map +1 -0
- package/dist/server/http.server.js +310 -0
- package/dist/server/http.server.js.map +1 -0
- package/dist/server/index.d.ts +7 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +7 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/mcp.server.d.ts +15 -0
- package/dist/server/mcp.server.d.ts.map +1 -0
- package/dist/server/mcp.server.js +61 -0
- package/dist/server/mcp.server.js.map +1 -0
- package/dist/server/schemas/tool.schemas.d.ts +20 -0
- package/dist/server/schemas/tool.schemas.d.ts.map +1 -0
- package/dist/server/schemas/tool.schemas.js +178 -0
- package/dist/server/schemas/tool.schemas.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/xhs.utils.d.ts +14 -0
- package/dist/utils/xhs.utils.d.ts.map +1 -0
- package/dist/utils/xhs.utils.js +84 -0
- package/dist/utils/xhs.utils.js.map +1 -0
- package/docs/HTTP_TRANSPORTS.md +269 -0
- package/package.json +59 -0
package/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
|
+
[](https://www.npmjs.com/package/xhs-mcp)
|
|
14
|
+
[](https://www.npmjs.com/package/xhs-mcp)
|
|
15
|
+
[](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
|
+
[](https://www.npmjs.com/package/xhs-mcp)
|
|
8
|
+
[](https://www.npmjs.com/package/xhs-mcp)
|
|
9
|
+
[](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 @@
|
|
|
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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;GAEG"}
|