Skip to main content
Glama
FrancoSbaffi

xhs-mcp

by FrancoSbaffi
README.md
# xhs-mcp 🍠

An MCP server that lets your AI agent publish notes to Xiaohongshu (RedNote / 小纒书) automatically using Playwright browser automation.

## Features

- πŸ“Έ Publish photo notes with title, body, and image
- πŸ€– MCP-compatible β€” works with Claude, Cursor, and any MCP-supported agent
- πŸ” Session persistence β€” log in once, post forever
- 🧠 Human-like typing to avoid bot detection

## Requirements

- Python 3.10+
- macOS (tested on macOS with Apple Silicon)

## Installation

### 1. Clone the repo
```bash
git clone https://github.com/FrancoSbaffi/xhs-mcp.git
cd xhs-mcp
```

### 2. Install dependencies
```bash
pip install -r requirements.txt
```

### 3. Install Chromium
```bash
python -m playwright install chromium
```

### 4. Set up your session (first time only)

Run the login script and log in manually in the browser that opens:
```bash
python post.py
```

Once logged in, press ENTER in the terminal. Your session will be saved to `session/auth.json`.

## Usage

### Option A β€” Run standalone

Edit `content/texto.txt` with your post content (first line = title, rest = body).
Add your image as `content/imagen.jpg`. Then run:
```bash
python post.py
```

### Option B β€” Use as MCP server with Claude

Add this to your Claude MCP config (`claude_desktop_config.json`):
```json
{
  "mcpServers": {
    "xiaohongshu": {
      "command": "python3.11",
      "args": ["/absolute/path/to/xhs-mcp/server.py"]
    }
  }
}
```

Then in Claude, you can say:

> "Post this to my Xiaohongshu: title 'Hello World', body 'This is my first automated post', image at /path/to/image.jpg"

### MCP Tool Reference

**`post_note`**

| Parameter | Type | Description |
|---|---|---|
| `title` | string | Post title (max 20 characters) |
| `body` | string | Post body text |
| `image_path` | string | Absolute path to image (jpg/png) |

## Project Structure
```
xhs-mcp/
β”œβ”€β”€ post.py          # Standalone posting script
β”œβ”€β”€ server.py        # MCP server
β”œβ”€β”€ requirements.txt # Dependencies
β”œβ”€β”€ content/         # Default content folder
β”‚   β”œβ”€β”€ texto.txt    # Post text (title on first line)
β”‚   └── imagen.jpg   # Post image
└── session/         # Saved login session (git ignored)
    └── auth.json
```

## Important Notes

- ⚠️ This project uses browser automation and is not affiliated with Xiaohongshu
- ⚠️ Use responsibly β€” avoid posting at high frequency
- ⚠️ Session may expire and require re-login
- πŸ”’ Never commit `session/auth.json` to GitHub β€” it contains your login credentials

## .gitignore

Make sure to add this before pushing:
```
session/
.env
```

## License

MIT