halo-mcp-server


Namehalo-mcp-server JSON
Version 0.1.6 PyPI version JSON
download
home_pageNone
SummaryMCP for Halo blog system - AI-powered content management
upload_time2025-10-27 10:31:02
maintainerNone
docs_urlNone
authorHalo MCP Contributors
requires_python>=3.10
licenseMIT
keywords mcp halo blog ai claude content-management
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Halo MCP Server

<div align="center">

[![Python Version](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/)
[![MCP](https://img.shields.io/badge/MCP-Compatible-orange.svg)](https://modelcontextprotocol.io)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
[![PyPI Version](https://img.shields.io/pypi/v/halo-mcp-server.svg)](https://pypi.org/project/halo-mcp-server/)
[![Downloads](https://img.shields.io/pypi/dm/halo-mcp-server.svg)](https://pypi.org/project/halo-mcp-server/)

**让AI成为你的博客管理助手**

通过 MCP 将 [Halo](https://www.halo.run/) 博客系统与 AI 助手(如 Claude、Cursor、Qoder、Trae等)无缝集成

[快速开始](#-快速开始) • [功能特性](#-功能特性) • [使用示例](#-使用示例) • [相关文档](#-文档) • [开发](#-开发) • [测试](#-测试) • [变更记录](/d:/Project/halo-mcp-server/CHANGELOG.md) • [贡献](#-贡献) • [支持项目](#-支持项目)

</div>

<div align="center">

*如果这个项目对你有帮助,欢迎[赞赏支持](https://github.com/Huangwh826/halo-mcp-server#-支持项目) ☕*

</div>

<div align="center">

<img src="assets/sponsor.png" alt="赞赏码" width="300"/>

*感谢您的支持!*

</div>

---

## 📖 简介

Halo MCP Server 是一个基于 Python 的 MCP 服务器,为 AI 助手提供完整的 Halo 博客管理能力。通过自然语言对话,你可以轻松完成文章创建、编辑、发布等所有博客管理操作,并利用 AI 的强大能力进行智能写作、内容优化和 SEO 提升。

### 🎬 视频演示

<div align="center">

[![观看视频演示](assets/video_cover.png)](https://www.bilibili.com/video/BV16osLzdEsc/)

**📺 [点击观看完整演示视频](https://www.bilibili.com/video/BV16osLzdEsc/)** - B站

*视频展示了如何通过自然语言与 AI 对话来管理 Halo 博客*

</div>

### 🎯 核心价值

- **🤖 AI 驱动** - 用自然语言管理博客,无需记忆复杂命令
- **✍️ 智能写作** - 10个专业 Prompts 助手,覆盖写作全流程
- **🚀 高效管理** - 30+ 管理工具,一句话完成复杂操作
- **🔄 无缝集成** - 与 Claude Desktop 完美配合,开箱即用
- **📝 完整功能** - 支持文章、分类、标签、附件等全部管理功能

---

## ✨ 功能特性

### 📝 文章管理(9个工具)

<table>
<tr>
<td width="50%">

**基础操作**
- ✅ 创建文章(支持 Markdown)
- ✅ 编辑文章(标题、内容、设置)
- ✅ 发布/取消发布文章
- ✅ 删除文章(回收站)
- ✅ 列出我的文章(分页、筛选)

</td>
<td width="50%">

**高级功能**
- ✅ 草稿管理(查看、编辑草稿)
- ✅ 分类和标签管理
- ✅ 文章置顶/取消置顶
- ✅ 设置封面图片
- ✅ 自定义 URL 别名

</td>
</tr>
</table>

### 🏷️ 分类标签(13个工具)

<table>
<tr>
<td width="50%">

**分类管理(6个)**
- ✅ 列出所有分类
- ✅ 创建分类(支持层级结构)
- ✅ 更新分类(名称、描述、封面)
- ✅ 删除分类
- ✅ 获取分类详情
- ✅ 查看分类下的文章

</td>
<td width="50%">

**标签管理(7个)**
- ✅ 列出所有标签
- ✅ 创建标签(支持颜色)
- ✅ 更新标签(名称、颜色)
- ✅ 删除标签
- ✅ 获取标签详情
- ✅ 查看标签下的文章
- ✅ 控制台标签列表

</td>
</tr>
</table>

### 📎 附件管理(8个工具)

- ✅ 列出附件(支持筛选)
- ✅ 上传本地文件
- ✅ 从 URL 上传
- ✅ 删除附件
- ✅ 附件分组管理
- ✅ 查看附件详情
- ✅ 创建附件分组
- ✅ 查看存储策略

### 🤖 AI 写作助手(10个 Prompts)

<table>
<tr>
<td width="50%">

**内容创作**
- 🎨 博客写作助手 - 生成高质量文章
- ✨ 内容优化器 - 提升可读性和结构
- 🎯 SEO 优化器 - 提高搜索排名
- 📰 标题生成器 - 创作吸引人的标题
- 📋 摘要生成器 - 自动生成文章摘要

</td>
<td width="50%">

**辅助功能**
- 🏷️ 标签建议器 - 智能推荐标签
- 📂 分类建议器 - 推荐合适分类
- 🌐 内容翻译器 - 多语言翻译
- ✏️ 内容校对器 - 语法和拼写检查
- 📚 系列规划器 - 规划系列文章

</td>
</tr>
</table>

---

## 🚀 快速开始

### 📋 前置要求

1. **Python 3.10 或更高版本**
   ```bash
   python --version  # 确认版本 >= 3.10
   ```

2. **运行中的 Halo 博客系统**
   - Halo 2.21 或更高版本
   - 记录服务器地址(如 `http://localhost:8091` 或 `https://yourdomain.com`)

3. **Claude Desktop 或其他 MCP 兼容客户端**
   - 下载地址:[Claude Desktop](https://claude.ai/download)

### 📦 安装

#### 方式一:从源码安装(开发)

```bash
# 1. 克隆或下载项目
git clone https://github.com/Huangwh826/halo-mcp-server.git
cd halo-mcp-server

# 2. 创建虚拟环境(推荐)
python -m venv venv

# 3. 激活虚拟环境
# Windows:
venv\Scripts\activate
# macOS/Linux:
source venv/bin/activate

# 4. 安装项目(可编辑模式)
pip install -e .
```

#### 方式二:使用 pip 安装(推荐)

```bash
pip install halo-mcp-server
```

### 🔧 配置

#### 步骤 1: 获取 Halo 访问令牌

1. 登录 Halo 后台管理系统
2. 进入 **个人中心** → **个人令牌**
3. 点击 **生成新令牌**
4. 设置令牌名称(如 "MCP Server")
5. 选择权限(建议勾选所有内容管理权限)
6. **保存并复制生成的令牌**(仅显示一次)

#### 步骤 2: 配置 Claude Desktop

找到并编辑 Claude Desktop 配置文件:

**文件位置:**
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Linux**: `~/.config/Claude/claude_desktop_config.json`

**配置内容:**

```json
{
  "mcpServers": {
    "halo-mcp-server": {
      "command": "python",
      "args": [
        "-m",
        "halo_mcp_server"
      ],
      "env": {
        "HALO_BASE_URL": "your_halo_base_url_here",
        "HALO_TOKEN": "your_halo_token_here"
      }
    }
  }
}
```

**📝 配置说明:**

| 配置项 | 说明 | 示例 |
|-------|------|------|
| `command` | Python 解释器路径 | `python` 或 `C:\\Python310\\python.exe` |
| `HALO_BASE_URL` | Halo 服务器地址 | `http://localhost:8091` 或 `https://blog.example.com` |
| `HALO_TOKEN` | API 访问令牌 | 从 Halo 后台获取的令牌 |

**💡 提示:**

1. **使用虚拟环境时**,将 `command` 指向虚拟环境的 Python:
   ```json
   "command": "D:\\Project\\halo-mcp\\venv\\Scripts\\python.exe"
   ```

2. **查找 Python 路径**:
   ```bash
   # Windows
   where python
   
   # macOS/Linux
   which python
   ```

3. **远程 Halo 服务**,确保使用完整 URL(包含 `http://` 或 `https://`)

#### 步骤 3: 重启 Claude Desktop

完全关闭并重新启动 Claude Desktop 以加载新配置。

### ✅ 验证安装

在 Claude Desktop 中输入以下测试命令:

```
请列出我的所有博客文章
```

**预期结果:**
- Claude 会调用 Halo MCP Server
- 返回你的文章列表
- 如果没有文章,会提示"暂无文章"

**成功标志:**
- ✅ 没有报错
- ✅ 返回了文章列表或提示信息
- ✅ Claude 理解了"列出文章"的指令

---

## 💬 使用示例

> 📖 **完整示例文档**:查看 [examples/README.md](examples/README.md) 获取 6 个详细示例和完整代码
> 
> 🚀 **快速开始**:[quick_start_example.md](examples/quick_start_example.md) - 5分钟了解基本用法

### 🌟 自然语言交互(推荐)

Halo MCP Server 的最大优势是支持自然语言对话,无需记忆复杂命令:

#### 📝 文章创作

```
👤 用户:帮我写一篇关于 Python 异步编程的技术文章并发布

🤖 Claude:
好的!我来帮你创作这篇文章。

[自动触发 halo_blog_writing_assistant Prompt]
→ 生成 2000 字专业文章
→ 推荐标签:Python、异步编程、asyncio
→ 推荐分类:技术教程
→ 调用 create_post 创建文章
→ 调用 publish_post 发布

✓ 文章《Python异步编程完全指南》已成功创建并发布!
```

#### 🔍 文章管理

```
# 查看文章
请显示我最近发布的5篇文章

# 搜索文章
搜索标题包含"Python"的文章

# 编辑文章
把"Python教程"这篇文章的标题改为"Python入门指南"

# 删除文章
删除名为"test-post"的文章
```

#### ✨ 内容优化

```
# 优化文章
请优化"Python教程"这篇文章,让它更通俗易懂

# 生成标题
为这篇文章生成5个吸引人的标题

# SEO优化
帮这篇文章做SEO优化,关键词是:Python、教程、入门
```

#### 🏷️ 分类标签

```
# 创建分类
创建一个名为"技术教程"的分类,描述是"各类技术教程文章"

# 创建标签
创建标签:Python、JavaScript、TypeScript,颜色设置为蓝色

# 批量操作
为"Python教程"文章添加标签:Python、编程、教程
```

#### 📎 附件管理

```
# 上传图片
上传这张图片作为文章封面:https://example.com/image.jpg

# 查看附件
列出所有图片附件

# 创建分组
创建一个名为"文章配图"的附件分组
```

### 📚 完整工作流示例

#### 场景:从零开始发布一篇技术博客

```
👤 用户:我想写一篇关于 Docker 容器化的技术文章

🤖 Claude:
好的!我来帮你完成整个创作和发布流程。

步骤1: 内容创作
[触发 halo_blog_writing_assistant]
→ 生成完整文章(包含简介、核心概念、实践示例、总结)

步骤2: 标题优化
[触发 halo_title_generator]
→ 提供5个标题选项供选择

步骤3: SEO优化
[触发 halo_seo_optimizer]
→ 优化关键词布局
→ 生成Meta描述

步骤4: 分类标签
[触发 halo_tag_suggester]
→ 推荐标签:Docker、容器化、DevOps、云原生
[触发 halo_category_suggester]
→ 推荐分类:云原生技术

步骤5: 创建并发布
[调用 create_post]
→ 创建文章
[调用 publish_post]
→ 发布文章

✓ 完成!文章《Docker容器化实践指南》已成功发布
  - 字数:2000字
  - 标签:Docker、容器化、DevOps、云原生
  - 分类:云原生技术
  - 文章链接:https://yourblog.com/posts/docker-guide
```

---

## 🎯 核心概念

### MCP Tools vs Prompts

Halo MCP Server 提供两种不同的能力:

<table>
<tr>
<th width="15%">类型</th>
<th width="35%">Tools(工具)</th>
<th width="35%">Prompts(提示助手)</th>
<th width="15%">对比</th>
</tr>
<tr>
<td><strong>数量</strong></td>
<td>30 个</td>
<td>10 个</td>
<td>互补配合</td>
</tr>
<tr>
<td><strong>用途</strong></td>
<td>执行具体操作(CRUD)</td>
<td>生成内容指导</td>
<td>工具执行<br>提示生成</td>
</tr>
<tr>
<td><strong>显示</strong></td>
<td>✅ 在工具列表中可见</td>
<td>❌ 后台自动触发</td>
<td>显式 vs 隐式</td>
</tr>
<tr>
<td><strong>调用</strong></td>
<td>Claude 主动调用 API</td>
<td>根据意图自动匹配</td>
<td>API vs 智能</td>
</tr>
<tr>
<td><strong>示例</strong></td>
<td>
• create_post - 创建文章<br>
• list_categories - 列出分类<br>
• upload_attachment - 上传附件
</td>
<td>
• 博客写作助手 - 生成文章<br>
• SEO优化器 - 优化内容<br>
• 标签建议器 - 推荐标签
</td>
<td>操作 vs 创作</td>
</tr>
<tr>
<td><strong>触发方式</strong></td>
<td>
明确的操作指令:<br>
"创建文章"<br>
"上传图片"
</td>
<td>
描述性需求:<br>
"写一篇文章"<br>
"优化内容"
</td>
<td>命令 vs 对话</td>
</tr>
</table>

**💡 实际工作流:**

```
用户: "帮我写一篇Python教程并发布"
     ↓
Prompts: halo_blog_writing_assistant → 生成文章内容
     ↓
Tools: create_post → 创建文章到 Halo
     ↓
Tools: publish_post → 发布文章
     ↓
结果: ✓ 文章创建并发布成功
```

### 为什么看不到 Prompts?

这是 MCP 的**优秀设计**:

- ✅ **用户友好** - 无需记忆 Prompt 名称
- ✅ **智能匹配** - AI 自动理解意图并选择合适的 Prompt
- ✅ **无感知** - 后台自动工作,用户只需描述需求
- ✅ **灵活性** - 可以用各种方式表达同一个需求

**对比传统方式:**

```bash
# ❌ 传统 CLI 方式
$ halo-cli create-post \
  --title "Python教程" \
  --content-file article.md \
  --tags "Python,教程" \
  --category "编程" \
  --publish

# ✅ MCP 方式(自然语言)
帮我写一篇Python教程并发布
```

---

## 📚 文档

### 核心文档

| 文档 | 描述 |
|------|------|
| [快速开始](QUICKSTART.md) | 5分钟快速上手指南 |
| [设计文档](DESIGN.md) | 系统架构和设计理念 |
| [MCP Prompts 指南](MCP_PROMPTS_GUIDE.md) | 10个写作助手详细说明 |
| [Prompts vs Tools](PROMPTS_VS_TOOLS_GUIDE.md) | 两者区别和使用方法 |
| [使用示例](examples/usage_examples.md) | 完整的使用示例集 |

### API 文档

| 文档                                                 | 描述 |
|----------------------------------------------------|------|
| [API 整理](halo_apis_docs/README.md)          | Halo API 整理 |
| [Console API](halo_apis_docs/apis_console.json)    | Halo 控制台 API |
| [Public API](halo_apis_docs/apis_public.json)      | Halo 公开 API |
| [UC API](halo_apis_docs/apis_uc.json)              | Halo 用户内容 API |
| [Extension API](halo_apis_docs/apis_extension.json) | Halo 扩展 API |

### 📖 示例代码

> 💡 **完整示例指南**:查看 [examples/README.md](examples/README.md) 获取详细的示例文档和使用说明

#### 📁 示例目录结构

```
examples/
├── README.md                           # 📘 示例总览和详细指南
├── quick_start_example.md              # ⚡ 快速开始(必读)
├── usage_examples.md                   # 📚 使用示例合集
├── category_management_examples.py     # 🏷️ 分类管理完整示例
├── tag_management_examples.py          # 🔖 标签管理完整示例
├── attachment_management_examples.py   # 📎 附件管理完整示例
└── mcp_prompts_examples.py             # 🤖 AI写作助手示例
```

#### 🚀 快速开始

**新手推荐路径**:
1. 📖 [快速开始示例](examples/quick_start_example.md) - 5分钟了解基本用法
2. 📚 [使用示例合集](examples/usage_examples.md) - 常见场景和最佳实践
3. 📘 [完整示例指南](examples/README.md) - 所有示例的详细文档

**按功能学习**:

| 示例文件 | 功能 | 难度 | 说明 |
|---------|------|------|------|
| [quick_start_example.md](examples/quick_start_example.md) | 快速入门 | ⭐ | 实际调用示例,展示基本用法 |
| [usage_examples.md](examples/usage_examples.md) | 综合示例 | ⭐⭐ | 涵盖所有工具的使用场景 |
| [category_management_examples.py](examples/category_management_examples.py) | 分类管理 | ⭐⭐ | 279行完整代码示例 |
| [tag_management_examples.py](examples/tag_management_examples.py) | 标签管理 | ⭐⭐ | 375行完整代码示例 |
| [attachment_management_examples.py](examples/attachment_management_examples.py) | 附件管理 | ⭐⭐⭐ | 477行完整代码示例 |
| [mcp_prompts_examples.py](examples/mcp_prompts_examples.py) | AI写作助手 | ⭐⭐⭐ | 341行Prompts使用示例 |

#### 💡 使用提示

- **Markdown 示例** (`.md`) - 适合阅读和理解,包含详细说明
- **Python 示例** (`.py`) - 可直接运行的完整代码,包含注释
- **从简到难** - 建议按上表顺序学习,逐步掌握所有功能

**运行 Python 示例**:
```bash
# 1. 确保已配置环境变量
export HALO_BASE_URL="your_url"
export HALO_TOKEN="your_token"

# 2. 运行示例(以分类管理为例)
cd examples
python category_management_examples.py
```

---

## 🔧 配置说明

### 环境变量

创建 `.env` 文件或在 Claude Desktop 配置中设置:

```env
# ========== 必需配置 ==========
HALO_BASE_URL=http://localhost:8091    # Halo 服务器地址
HALO_TOKEN=your_token_here              # API 访问令牌

# ========== 可选配置 ==========
MCP_LOG_LEVEL=INFO                      # 日志级别: DEBUG, INFO, WARNING, ERROR
MCP_TIMEOUT=30                          # HTTP 请求超时(秒)

# ========== 功能开关 ==========
ENABLE_IMAGE_COMPRESSION=true           # 启用图片压缩
IMAGE_MAX_WIDTH=1920                    # 压缩后最大宽度(像素)
IMAGE_QUALITY=85                        # 图片质量 (1-100)
MAX_UPLOAD_SIZE_MB=10                   # 最大上传大小(MB)

# ========== 高级配置 ==========
HTTP_POOL_SIZE=10                       # HTTP 连接池大小
MAX_RETRIES=3                           # 请求重试次数
ENABLE_CACHE=true                       # 启用缓存
CACHE_TTL=300                           # 缓存过期时间(秒)
```

完整配置说明请参考 [.env.example](.env.example)

---

## 🛠️ 故障排除

### 常见问题

#### 1. Claude 无法识别 Halo 工具

**症状:** Claude 不响应博客管理命令

**解决方案:**
```bash
# 检查配置文件
# Windows: %APPDATA%\Claude\claude_desktop_config.json
# macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

# 验证配置格式(JSON必须正确)
# 确认 Python 路径正确
# 重启 Claude Desktop
```

#### 2. 认证失败

**症状:** 报错"Authentication failed"或"Invalid token"

**解决方案:**
1. 检查 `HALO_TOKEN` 是否正确(无多余空格)
2. 确认 Token 未过期
3. 验证 `HALO_BASE_URL` 是否可访问
4. 测试网络连接:
   ```bash
   curl http://localhost:8091/apis/api.console.halo.run/v1alpha1/posts
   ```

#### 3. 模块导入错误

**症状:** "No module named 'halo-mcp-server'"

**解决方案:**
```bash
# 重新安装
pip install -e .

# 验证安装
pip show halo-mcp-server

# 检查 Python 路径
python -c "import halo-mcp-server; print(halo_mcp_server.__version__)"
```

#### 4. Prompts 不生效

**症状:** AI 不能自动生成文章内容

**说明:** Prompts 是隐藏的,通过自然语言触发

**测试方法:**
```
# ✅ 正确方式(会触发写作 Prompt)
帮我写一篇关于Python的文章

# ❌ 错误理解(不需要这样)
使用 halo_blog_writing_assistant 写文章
```

### 调试方法

#### 查看日志

**设置调试级别:**
```json
{
  "mcpServers": {
    "halo": {
      "env": {
        "MCP_LOG_LEVEL": "DEBUG"
      }
    }
  }
}
```

**日志位置:**
- Claude Desktop 日志:帮助 → 开发者工具 → Console
- MCP 服务日志:查看标准输出

#### 手动测试

**测试认证:**
```bash
# 使用 curl 测试
curl -H "Authorization: Bearer YOUR_TOKEN" \
  http://localhost:8091/apis/uc.api.content.halo.run/v1alpha1/posts
```

**测试 Python 模块:**
```bash
# 进入 Python 环境
python

# 导入并测试
>>> from halo_mcp_server.client import HaloClient
>>> import asyncio
>>> client = HaloClient()
>>> asyncio.run(client.authenticate())
>>> print("✓ 认证成功")
```

---

## 🏗️ 开发

### 开发环境设置

```bash
# 1. 克隆项目
git clone https://github.com/Huangwh826/halo_mcp_server.git
cd halo-mcp-server

# 2. 创建虚拟环境
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# 3. 安装开发依赖
pip install -e ".[dev]"

# 4. 安装 pre-commit hooks
pre-commit install
```

### 项目结构

```
halo-mcp-server/
├── src/halo-mcp-server/           # 源代码
│   ├── __init__.py
│   ├── __main__.py         # 入口文件
│   ├── config.py           # 配置管理
│   ├── server.py           # MCP 服务器
│   ├── exceptions.py       # 异常定义
│   ├── client/             # Halo API 客户端
│   │   ├── base.py
│   │   └── halo_client.py
│   ├── tools/              # MCP Tools
│   │   ├── post_tools.py
│   │   ├── category_tools.py
│   │   ├── tag_tools.py
│   │   └── attachment_tools.py
│   ├── prompts/            # MCP Prompts
│   │   └── blog_prompts.py
│   └── utils/              # 工具函数
│       └── logger.py
├── tests/                  # 单元测试
├── examples/               # 使用示例
├── halo_apis_docs/         # API 文档
├── debug_tests/            # 调试脚本
├── pyproject.toml          # 项目配置
└── README.md               # 本文件
```

### 代码规范

```bash
# 格式化代码
black src/ tests/
isort src/ tests/

# 类型检查
mypy src/

# 代码检查
ruff check src/ tests/

# 运行测试
pytest tests/ -v --cov=halo-mcp-server
```

### 添加新功能

1. **添加新 Tool:**
   ```python
   # src/halo-mcp-server/tools/custom_tools.py
   from mcp.types import Tool
   
   async def my_custom_tool(client, arguments):
       """实现你的工具逻辑"""
       pass
   
   MY_TOOLS = [
       Tool(
           name="my_tool",
           description="工具描述",
           inputSchema={...}
       )
   ]
   ```

2. **添加新 Prompt:**
   ```python
   # src/halo-mcp-server/prompts/custom_prompts.py
   from mcp.types import Prompt, PromptArgument
   
   CUSTOM_PROMPTS = [
       Prompt(
           name="my_prompt",
           description="Prompt 描述",
           arguments=[...]
       )
   ]
   ```

3. **注册到 Server:**
   ```python
   # src/halo-mcp-server/server.py
   from halo_mcp_server.tools.custom_tools import MY_TOOLS
   from halo_mcp_server.prompts.custom_prompts import CUSTOM_PROMPTS
   
   # 添加到对应列表
   all_tools += MY_TOOLS
   all_prompts += CUSTOM_PROMPTS
   ```

### 贡献指南

欢迎贡献!请查看 [DEVELOPMENT.md](DEVELOPMENT.md) 了解详细信息。

---

## 🧪 测试

### 快速测试

项目提供了全面的测试套件,覆盖所有 30 个 MCP 工具:

```bash
# 进入测试目录
cd tests

# 运行综合测试
python run_comprehensive_test.py
```

### 测试覆盖

✅ **分类管理** (6个工具): create_category, list_categories, get_category, update_category, get_category_posts, delete_category

✅ **标签管理** (7个工具): create_tag, list_tags, get_tag, update_tag, list_console_tags, get_tag_posts, delete_tag

✅ **附件管理** (8个工具): 上传、列表、删除、分组等

✅ **文章管理** (9个工具): 创建、编辑、发布、草稿等

### 测试详情

查看 [tests/README.md](tests/README.md) 了解:
- 📝 详细的测试指南
- 🔧 环境配置说明
- 🐛 故障排除方法
- 📊 测试报告生成

---

## 📊 功能对照表

### 完整工具列表(30个)

<details>
<summary><b>📝 文章管理工具(9个)</b></summary>

| 工具名称 | 功能说明 | 调用示例 |
|---------|---------|---------|
| `list_my_posts` | 列出我的文章 | "列出我的所有文章" |
| `get_post` | 获取文章详情 | "显示post-xxx的详情" |
| `create_post` | 创建文章 | "创建一篇文章" |
| `update_post` | 更新文章 | "更新文章标题" |
| `publish_post` | 发布文章 | "发布这篇文章" |
| `unpublish_post` | 取消发布 | "下线这篇文章" |
| `delete_post` | 删除文章 | "删除这篇文章" |
| `get_post_draft` | 获取草稿 | "查看草稿内容" |
| `update_post_draft` | 更新草稿 | "修改草稿" |

</details>

<details>
<summary><b>🏷️ 分类管理工具(6个)</b></summary>

| 工具名称 | 功能说明 | 调用示例 |
|---------|---------|---------|
| `list_categories` | 列出分类 | "列出所有分类" |
| `get_category` | 获取分类详情 | "查看分类详情" |
| `create_category` | 创建分类 | "创建技术分类" |
| `update_category` | 更新分类 | "修改分类名称" |
| `delete_category` | 删除分类 | "删除这个分类" |
| `get_category_posts` | 获取分类下文章 | "查看分类下的文章" |

</details>

<details>
<summary><b>🔖 标签管理工具(7个)</b></summary>

| 工具名称 | 功能说明 | 调用示例 |
|---------|---------|---------|
| `list_tags` | 列出标签 | "列出所有标签" |
| `get_tag` | 获取标签详情 | "查看标签详情" |
| `create_tag` | 创建标签 | "创建Python标签" |
| `update_tag` | 更新标签 | "修改标签颜色" |
| `delete_tag` | 删除标签 | "删除这个标签" |
| `get_tag_posts` | 获取标签下文章 | "查看标签下的文章" |
| `list_console_tags` | 控制台标签列表 | "查看控制台标签" |

</details>

<details>
<summary><b>📎 附件管理工具(8个)</b></summary>

| 工具名称 | 功能说明 | 调用示例 |
|---------|---------|---------|
| `list_attachments` | 列出附件 | "列出所有附件" |
| `get_attachment` | 获取附件详情 | "查看附件详情" |
| `upload_attachment` | 上传文件 | "上传这个文件" |
| `upload_attachment_from_url` | 从URL上传 | "从URL上传图片" |
| `delete_attachment` | 删除附件 | "删除这个附件" |
| `list_attachment_groups` | 列出附件分组 | "列出附件分组" |
| `create_attachment_group` | 创建分组 | "创建图片分组" |
| `get_attachment_policies` | 获取存储策略 | "查看存储策略" |

</details>

### 完整 Prompts 列表(10个)

<details>
<summary><b>🤖 AI 写作助手详细说明</b></summary>

| Prompt 名称 | 功能说明 | 触发示例 | 主要参数 |
|------------|---------|---------|---------|
| `halo_blog_writing_assistant` | 博客写作助手 | "写一篇Python文章" | topic, audience, type, word_count |
| `halo_content_optimizer` | 内容优化器 | "优化这篇文章" | content, focus, length |
| `halo_seo_optimizer` | SEO优化器 | "SEO优化" | title, content, keywords |
| `halo_title_generator` | 标题生成器 | "生成5个标题" | content_summary, style, count |
| `halo_excerpt_generator` | 摘要生成器 | "生成摘要" | content, length, style |
| `halo_tag_suggester` | 标签建议器 | "推荐标签" | title, content, existing_tags |
| `halo_category_suggester` | 分类建议器 | "推荐分类" | title, content, existing_categories |
| `halo_content_translator` | 内容翻译器 | "翻译成英文" | content, target_language |
| `halo_content_proofreader` | 内容校对器 | "校对文章" | content, language, focus |
| `halo_series_planner` | 系列规划器 | "规划系列文章" | series_topic, audience, count |

</details>

---

## 🤝 贡献

欢迎贡献代码、报告问题或提出建议!

### 贡献方式

1. Fork 项目
2. 创建功能分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 开启 Pull Request

### 贡献者

感谢所有为项目做出贡献的开发者!

---

## 📄 许可证

本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件

---

## 🙏 致谢

- [Halo](https://www.halo.run/) - 优秀的开源博客系统
- [Model Context Protocol](https://modelcontextprotocol.io) - 强大的 AI 集成协议
- [Claude](https://claude.ai) - 智能的 AI 助手
- 所有贡献者和用户

---

## 📞 联系我们

- **项目主页**: [GitHub](https://github.com/Huangwh826/halo-mcp-server)
- **问题反馈**: [Issues](https://github.com/Huangwh826/halo-mcp-server/issues)
- **文档**: [Documentation](https://github.com/Huangwh826/halo-mcp-server/blob/main/README.md)

---

## 🎁 支持项目

如果这个项目对你有帮助,欢迎通过以下方式支持:

- ⭐ 给项目点个 Star
- 🐛 提交 Issue 或 PR
- 💬 分享给更多人
- ☕ 赞赏作者

<div align="center">

<img src="assets/sponsor.png" alt="赞赏码" width="300"/>

*感谢您的支持!*

</div>

---

<div align="center">

**⭐ 如果这个项目对你有帮助,请给它一个 Star!**
</div>

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "halo-mcp-server",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "mcp, halo, blog, ai, claude, content-management",
    "author": "Halo MCP Contributors",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/20/ab/22b3cfdb4eede2edc14f3a18c5910efc56bf7e12bb39db5347f26cd283d2/halo_mcp_server-0.1.6.tar.gz",
    "platform": null,
    "description": "# Halo MCP Server\r\n\r\n<div align=\"center\">\r\n\r\n[![Python Version](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/)\r\n[![MCP](https://img.shields.io/badge/MCP-Compatible-orange.svg)](https://modelcontextprotocol.io)\r\n[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\r\n[![PyPI Version](https://img.shields.io/pypi/v/halo-mcp-server.svg)](https://pypi.org/project/halo-mcp-server/)\r\n[![Downloads](https://img.shields.io/pypi/dm/halo-mcp-server.svg)](https://pypi.org/project/halo-mcp-server/)\r\n\r\n**\u8ba9AI\u6210\u4e3a\u4f60\u7684\u535a\u5ba2\u7ba1\u7406\u52a9\u624b**\r\n\r\n\u901a\u8fc7 MCP \u5c06 [Halo](https://www.halo.run/) \u535a\u5ba2\u7cfb\u7edf\u4e0e AI \u52a9\u624b\uff08\u5982 Claude\u3001Cursor\u3001Qoder\u3001Trae\u7b49\uff09\u65e0\u7f1d\u96c6\u6210\r\n\r\n[\u5feb\u901f\u5f00\u59cb](#-\u5feb\u901f\u5f00\u59cb) \u2022 [\u529f\u80fd\u7279\u6027](#-\u529f\u80fd\u7279\u6027) \u2022 [\u4f7f\u7528\u793a\u4f8b](#-\u4f7f\u7528\u793a\u4f8b) \u2022 [\u76f8\u5173\u6587\u6863](#-\u6587\u6863) \u2022 [\u5f00\u53d1](#-\u5f00\u53d1) \u2022 [\u6d4b\u8bd5](#-\u6d4b\u8bd5) \u2022 [\u53d8\u66f4\u8bb0\u5f55](/d:/Project/halo-mcp-server/CHANGELOG.md) \u2022 [\u8d21\u732e](#-\u8d21\u732e) \u2022 [\u652f\u6301\u9879\u76ee](#-\u652f\u6301\u9879\u76ee)\r\n\r\n</div>\r\n\r\n<div align=\"center\">\r\n\r\n*\u5982\u679c\u8fd9\u4e2a\u9879\u76ee\u5bf9\u4f60\u6709\u5e2e\u52a9\uff0c\u6b22\u8fce[\u8d5e\u8d4f\u652f\u6301](https://github.com/Huangwh826/halo-mcp-server#-\u652f\u6301\u9879\u76ee) \u2615*\r\n\r\n</div>\r\n\r\n<div align=\"center\">\r\n\r\n<img src=\"assets/sponsor.png\" alt=\"\u8d5e\u8d4f\u7801\" width=\"300\"/>\r\n\r\n*\u611f\u8c22\u60a8\u7684\u652f\u6301\uff01*\r\n\r\n</div>\r\n\r\n---\r\n\r\n## \ud83d\udcd6 \u7b80\u4ecb\r\n\r\nHalo MCP Server \u662f\u4e00\u4e2a\u57fa\u4e8e Python \u7684 MCP \u670d\u52a1\u5668\uff0c\u4e3a AI \u52a9\u624b\u63d0\u4f9b\u5b8c\u6574\u7684 Halo \u535a\u5ba2\u7ba1\u7406\u80fd\u529b\u3002\u901a\u8fc7\u81ea\u7136\u8bed\u8a00\u5bf9\u8bdd\uff0c\u4f60\u53ef\u4ee5\u8f7b\u677e\u5b8c\u6210\u6587\u7ae0\u521b\u5efa\u3001\u7f16\u8f91\u3001\u53d1\u5e03\u7b49\u6240\u6709\u535a\u5ba2\u7ba1\u7406\u64cd\u4f5c\uff0c\u5e76\u5229\u7528 AI \u7684\u5f3a\u5927\u80fd\u529b\u8fdb\u884c\u667a\u80fd\u5199\u4f5c\u3001\u5185\u5bb9\u4f18\u5316\u548c SEO \u63d0\u5347\u3002\r\n\r\n### \ud83c\udfac \u89c6\u9891\u6f14\u793a\r\n\r\n<div align=\"center\">\r\n\r\n[![\u89c2\u770b\u89c6\u9891\u6f14\u793a](assets/video_cover.png)](https://www.bilibili.com/video/BV16osLzdEsc/)\r\n\r\n**\ud83d\udcfa [\u70b9\u51fb\u89c2\u770b\u5b8c\u6574\u6f14\u793a\u89c6\u9891](https://www.bilibili.com/video/BV16osLzdEsc/)** - B\u7ad9\r\n\r\n*\u89c6\u9891\u5c55\u793a\u4e86\u5982\u4f55\u901a\u8fc7\u81ea\u7136\u8bed\u8a00\u4e0e AI \u5bf9\u8bdd\u6765\u7ba1\u7406 Halo \u535a\u5ba2*\r\n\r\n</div>\r\n\r\n### \ud83c\udfaf \u6838\u5fc3\u4ef7\u503c\r\n\r\n- **\ud83e\udd16 AI \u9a71\u52a8** - \u7528\u81ea\u7136\u8bed\u8a00\u7ba1\u7406\u535a\u5ba2\uff0c\u65e0\u9700\u8bb0\u5fc6\u590d\u6742\u547d\u4ee4\r\n- **\u270d\ufe0f \u667a\u80fd\u5199\u4f5c** - 10\u4e2a\u4e13\u4e1a Prompts \u52a9\u624b\uff0c\u8986\u76d6\u5199\u4f5c\u5168\u6d41\u7a0b\r\n- **\ud83d\ude80 \u9ad8\u6548\u7ba1\u7406** - 30+ \u7ba1\u7406\u5de5\u5177\uff0c\u4e00\u53e5\u8bdd\u5b8c\u6210\u590d\u6742\u64cd\u4f5c\r\n- **\ud83d\udd04 \u65e0\u7f1d\u96c6\u6210** - \u4e0e Claude Desktop \u5b8c\u7f8e\u914d\u5408\uff0c\u5f00\u7bb1\u5373\u7528\r\n- **\ud83d\udcdd \u5b8c\u6574\u529f\u80fd** - \u652f\u6301\u6587\u7ae0\u3001\u5206\u7c7b\u3001\u6807\u7b7e\u3001\u9644\u4ef6\u7b49\u5168\u90e8\u7ba1\u7406\u529f\u80fd\r\n\r\n---\r\n\r\n## \u2728 \u529f\u80fd\u7279\u6027\r\n\r\n### \ud83d\udcdd \u6587\u7ae0\u7ba1\u7406\uff089\u4e2a\u5de5\u5177\uff09\r\n\r\n<table>\r\n<tr>\r\n<td width=\"50%\">\r\n\r\n**\u57fa\u7840\u64cd\u4f5c**\r\n- \u2705 \u521b\u5efa\u6587\u7ae0\uff08\u652f\u6301 Markdown\uff09\r\n- \u2705 \u7f16\u8f91\u6587\u7ae0\uff08\u6807\u9898\u3001\u5185\u5bb9\u3001\u8bbe\u7f6e\uff09\r\n- \u2705 \u53d1\u5e03/\u53d6\u6d88\u53d1\u5e03\u6587\u7ae0\r\n- \u2705 \u5220\u9664\u6587\u7ae0\uff08\u56de\u6536\u7ad9\uff09\r\n- \u2705 \u5217\u51fa\u6211\u7684\u6587\u7ae0\uff08\u5206\u9875\u3001\u7b5b\u9009\uff09\r\n\r\n</td>\r\n<td width=\"50%\">\r\n\r\n**\u9ad8\u7ea7\u529f\u80fd**\r\n- \u2705 \u8349\u7a3f\u7ba1\u7406\uff08\u67e5\u770b\u3001\u7f16\u8f91\u8349\u7a3f\uff09\r\n- \u2705 \u5206\u7c7b\u548c\u6807\u7b7e\u7ba1\u7406\r\n- \u2705 \u6587\u7ae0\u7f6e\u9876/\u53d6\u6d88\u7f6e\u9876\r\n- \u2705 \u8bbe\u7f6e\u5c01\u9762\u56fe\u7247\r\n- \u2705 \u81ea\u5b9a\u4e49 URL \u522b\u540d\r\n\r\n</td>\r\n</tr>\r\n</table>\r\n\r\n### \ud83c\udff7\ufe0f \u5206\u7c7b\u6807\u7b7e\uff0813\u4e2a\u5de5\u5177\uff09\r\n\r\n<table>\r\n<tr>\r\n<td width=\"50%\">\r\n\r\n**\u5206\u7c7b\u7ba1\u7406\uff086\u4e2a\uff09**\r\n- \u2705 \u5217\u51fa\u6240\u6709\u5206\u7c7b\r\n- \u2705 \u521b\u5efa\u5206\u7c7b\uff08\u652f\u6301\u5c42\u7ea7\u7ed3\u6784\uff09\r\n- \u2705 \u66f4\u65b0\u5206\u7c7b\uff08\u540d\u79f0\u3001\u63cf\u8ff0\u3001\u5c01\u9762\uff09\r\n- \u2705 \u5220\u9664\u5206\u7c7b\r\n- \u2705 \u83b7\u53d6\u5206\u7c7b\u8be6\u60c5\r\n- \u2705 \u67e5\u770b\u5206\u7c7b\u4e0b\u7684\u6587\u7ae0\r\n\r\n</td>\r\n<td width=\"50%\">\r\n\r\n**\u6807\u7b7e\u7ba1\u7406\uff087\u4e2a\uff09**\r\n- \u2705 \u5217\u51fa\u6240\u6709\u6807\u7b7e\r\n- \u2705 \u521b\u5efa\u6807\u7b7e\uff08\u652f\u6301\u989c\u8272\uff09\r\n- \u2705 \u66f4\u65b0\u6807\u7b7e\uff08\u540d\u79f0\u3001\u989c\u8272\uff09\r\n- \u2705 \u5220\u9664\u6807\u7b7e\r\n- \u2705 \u83b7\u53d6\u6807\u7b7e\u8be6\u60c5\r\n- \u2705 \u67e5\u770b\u6807\u7b7e\u4e0b\u7684\u6587\u7ae0\r\n- \u2705 \u63a7\u5236\u53f0\u6807\u7b7e\u5217\u8868\r\n\r\n</td>\r\n</tr>\r\n</table>\r\n\r\n### \ud83d\udcce \u9644\u4ef6\u7ba1\u7406\uff088\u4e2a\u5de5\u5177\uff09\r\n\r\n- \u2705 \u5217\u51fa\u9644\u4ef6\uff08\u652f\u6301\u7b5b\u9009\uff09\r\n- \u2705 \u4e0a\u4f20\u672c\u5730\u6587\u4ef6\r\n- \u2705 \u4ece URL \u4e0a\u4f20\r\n- \u2705 \u5220\u9664\u9644\u4ef6\r\n- \u2705 \u9644\u4ef6\u5206\u7ec4\u7ba1\u7406\r\n- \u2705 \u67e5\u770b\u9644\u4ef6\u8be6\u60c5\r\n- \u2705 \u521b\u5efa\u9644\u4ef6\u5206\u7ec4\r\n- \u2705 \u67e5\u770b\u5b58\u50a8\u7b56\u7565\r\n\r\n### \ud83e\udd16 AI \u5199\u4f5c\u52a9\u624b\uff0810\u4e2a Prompts\uff09\r\n\r\n<table>\r\n<tr>\r\n<td width=\"50%\">\r\n\r\n**\u5185\u5bb9\u521b\u4f5c**\r\n- \ud83c\udfa8 \u535a\u5ba2\u5199\u4f5c\u52a9\u624b - \u751f\u6210\u9ad8\u8d28\u91cf\u6587\u7ae0\r\n- \u2728 \u5185\u5bb9\u4f18\u5316\u5668 - \u63d0\u5347\u53ef\u8bfb\u6027\u548c\u7ed3\u6784\r\n- \ud83c\udfaf SEO \u4f18\u5316\u5668 - \u63d0\u9ad8\u641c\u7d22\u6392\u540d\r\n- \ud83d\udcf0 \u6807\u9898\u751f\u6210\u5668 - \u521b\u4f5c\u5438\u5f15\u4eba\u7684\u6807\u9898\r\n- \ud83d\udccb \u6458\u8981\u751f\u6210\u5668 - \u81ea\u52a8\u751f\u6210\u6587\u7ae0\u6458\u8981\r\n\r\n</td>\r\n<td width=\"50%\">\r\n\r\n**\u8f85\u52a9\u529f\u80fd**\r\n- \ud83c\udff7\ufe0f \u6807\u7b7e\u5efa\u8bae\u5668 - \u667a\u80fd\u63a8\u8350\u6807\u7b7e\r\n- \ud83d\udcc2 \u5206\u7c7b\u5efa\u8bae\u5668 - \u63a8\u8350\u5408\u9002\u5206\u7c7b\r\n- \ud83c\udf10 \u5185\u5bb9\u7ffb\u8bd1\u5668 - \u591a\u8bed\u8a00\u7ffb\u8bd1\r\n- \u270f\ufe0f \u5185\u5bb9\u6821\u5bf9\u5668 - \u8bed\u6cd5\u548c\u62fc\u5199\u68c0\u67e5\r\n- \ud83d\udcda \u7cfb\u5217\u89c4\u5212\u5668 - \u89c4\u5212\u7cfb\u5217\u6587\u7ae0\r\n\r\n</td>\r\n</tr>\r\n</table>\r\n\r\n---\r\n\r\n## \ud83d\ude80 \u5feb\u901f\u5f00\u59cb\r\n\r\n### \ud83d\udccb \u524d\u7f6e\u8981\u6c42\r\n\r\n1. **Python 3.10 \u6216\u66f4\u9ad8\u7248\u672c**\r\n   ```bash\r\n   python --version  # \u786e\u8ba4\u7248\u672c >= 3.10\r\n   ```\r\n\r\n2. **\u8fd0\u884c\u4e2d\u7684 Halo \u535a\u5ba2\u7cfb\u7edf**\r\n   - Halo 2.21 \u6216\u66f4\u9ad8\u7248\u672c\r\n   - \u8bb0\u5f55\u670d\u52a1\u5668\u5730\u5740\uff08\u5982 `http://localhost:8091` \u6216 `https://yourdomain.com`\uff09\r\n\r\n3. **Claude Desktop \u6216\u5176\u4ed6 MCP \u517c\u5bb9\u5ba2\u6237\u7aef**\r\n   - \u4e0b\u8f7d\u5730\u5740\uff1a[Claude Desktop](https://claude.ai/download)\r\n\r\n### \ud83d\udce6 \u5b89\u88c5\r\n\r\n#### \u65b9\u5f0f\u4e00\uff1a\u4ece\u6e90\u7801\u5b89\u88c5\uff08\u5f00\u53d1\uff09\r\n\r\n```bash\r\n# 1. \u514b\u9686\u6216\u4e0b\u8f7d\u9879\u76ee\r\ngit clone https://github.com/Huangwh826/halo-mcp-server.git\r\ncd halo-mcp-server\r\n\r\n# 2. \u521b\u5efa\u865a\u62df\u73af\u5883\uff08\u63a8\u8350\uff09\r\npython -m venv venv\r\n\r\n# 3. \u6fc0\u6d3b\u865a\u62df\u73af\u5883\r\n# Windows:\r\nvenv\\Scripts\\activate\r\n# macOS/Linux:\r\nsource venv/bin/activate\r\n\r\n# 4. \u5b89\u88c5\u9879\u76ee\uff08\u53ef\u7f16\u8f91\u6a21\u5f0f\uff09\r\npip install -e .\r\n```\r\n\r\n#### \u65b9\u5f0f\u4e8c\uff1a\u4f7f\u7528 pip \u5b89\u88c5\uff08\u63a8\u8350\uff09\r\n\r\n```bash\r\npip install halo-mcp-server\r\n```\r\n\r\n### \ud83d\udd27 \u914d\u7f6e\r\n\r\n#### \u6b65\u9aa4 1: \u83b7\u53d6 Halo \u8bbf\u95ee\u4ee4\u724c\r\n\r\n1. \u767b\u5f55 Halo \u540e\u53f0\u7ba1\u7406\u7cfb\u7edf\r\n2. \u8fdb\u5165 **\u4e2a\u4eba\u4e2d\u5fc3** \u2192 **\u4e2a\u4eba\u4ee4\u724c**\r\n3. \u70b9\u51fb **\u751f\u6210\u65b0\u4ee4\u724c**\r\n4. \u8bbe\u7f6e\u4ee4\u724c\u540d\u79f0\uff08\u5982 \"MCP Server\"\uff09\r\n5. \u9009\u62e9\u6743\u9650\uff08\u5efa\u8bae\u52fe\u9009\u6240\u6709\u5185\u5bb9\u7ba1\u7406\u6743\u9650\uff09\r\n6. **\u4fdd\u5b58\u5e76\u590d\u5236\u751f\u6210\u7684\u4ee4\u724c**\uff08\u4ec5\u663e\u793a\u4e00\u6b21\uff09\r\n\r\n#### \u6b65\u9aa4 2: \u914d\u7f6e Claude Desktop\r\n\r\n\u627e\u5230\u5e76\u7f16\u8f91 Claude Desktop \u914d\u7f6e\u6587\u4ef6\uff1a\r\n\r\n**\u6587\u4ef6\u4f4d\u7f6e\uff1a**\r\n- **Windows**: `%APPDATA%\\Claude\\claude_desktop_config.json`\r\n- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`\r\n- **Linux**: `~/.config/Claude/claude_desktop_config.json`\r\n\r\n**\u914d\u7f6e\u5185\u5bb9\uff1a**\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"halo-mcp-server\": {\r\n      \"command\": \"python\",\r\n      \"args\": [\r\n        \"-m\",\r\n        \"halo_mcp_server\"\r\n      ],\r\n      \"env\": {\r\n        \"HALO_BASE_URL\": \"your_halo_base_url_here\",\r\n        \"HALO_TOKEN\": \"your_halo_token_here\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n**\ud83d\udcdd \u914d\u7f6e\u8bf4\u660e\uff1a**\r\n\r\n| \u914d\u7f6e\u9879 | \u8bf4\u660e | \u793a\u4f8b |\r\n|-------|------|------|\r\n| `command` | Python \u89e3\u91ca\u5668\u8def\u5f84 | `python` \u6216 `C:\\\\Python310\\\\python.exe` |\r\n| `HALO_BASE_URL` | Halo \u670d\u52a1\u5668\u5730\u5740 | `http://localhost:8091` \u6216 `https://blog.example.com` |\r\n| `HALO_TOKEN` | API \u8bbf\u95ee\u4ee4\u724c | \u4ece Halo \u540e\u53f0\u83b7\u53d6\u7684\u4ee4\u724c |\r\n\r\n**\ud83d\udca1 \u63d0\u793a\uff1a**\r\n\r\n1. **\u4f7f\u7528\u865a\u62df\u73af\u5883\u65f6**\uff0c\u5c06 `command` \u6307\u5411\u865a\u62df\u73af\u5883\u7684 Python\uff1a\r\n   ```json\r\n   \"command\": \"D:\\\\Project\\\\halo-mcp\\\\venv\\\\Scripts\\\\python.exe\"\r\n   ```\r\n\r\n2. **\u67e5\u627e Python \u8def\u5f84**\uff1a\r\n   ```bash\r\n   # Windows\r\n   where python\r\n   \r\n   # macOS/Linux\r\n   which python\r\n   ```\r\n\r\n3. **\u8fdc\u7a0b Halo \u670d\u52a1**\uff0c\u786e\u4fdd\u4f7f\u7528\u5b8c\u6574 URL\uff08\u5305\u542b `http://` \u6216 `https://`\uff09\r\n\r\n#### \u6b65\u9aa4 3: \u91cd\u542f Claude Desktop\r\n\r\n\u5b8c\u5168\u5173\u95ed\u5e76\u91cd\u65b0\u542f\u52a8 Claude Desktop \u4ee5\u52a0\u8f7d\u65b0\u914d\u7f6e\u3002\r\n\r\n### \u2705 \u9a8c\u8bc1\u5b89\u88c5\r\n\r\n\u5728 Claude Desktop \u4e2d\u8f93\u5165\u4ee5\u4e0b\u6d4b\u8bd5\u547d\u4ee4\uff1a\r\n\r\n```\r\n\u8bf7\u5217\u51fa\u6211\u7684\u6240\u6709\u535a\u5ba2\u6587\u7ae0\r\n```\r\n\r\n**\u9884\u671f\u7ed3\u679c\uff1a**\r\n- Claude \u4f1a\u8c03\u7528 Halo MCP Server\r\n- \u8fd4\u56de\u4f60\u7684\u6587\u7ae0\u5217\u8868\r\n- \u5982\u679c\u6ca1\u6709\u6587\u7ae0\uff0c\u4f1a\u63d0\u793a\"\u6682\u65e0\u6587\u7ae0\"\r\n\r\n**\u6210\u529f\u6807\u5fd7\uff1a**\r\n- \u2705 \u6ca1\u6709\u62a5\u9519\r\n- \u2705 \u8fd4\u56de\u4e86\u6587\u7ae0\u5217\u8868\u6216\u63d0\u793a\u4fe1\u606f\r\n- \u2705 Claude \u7406\u89e3\u4e86\"\u5217\u51fa\u6587\u7ae0\"\u7684\u6307\u4ee4\r\n\r\n---\r\n\r\n## \ud83d\udcac \u4f7f\u7528\u793a\u4f8b\r\n\r\n> \ud83d\udcd6 **\u5b8c\u6574\u793a\u4f8b\u6587\u6863**\uff1a\u67e5\u770b [examples/README.md](examples/README.md) \u83b7\u53d6 6 \u4e2a\u8be6\u7ec6\u793a\u4f8b\u548c\u5b8c\u6574\u4ee3\u7801\r\n> \r\n> \ud83d\ude80 **\u5feb\u901f\u5f00\u59cb**\uff1a[quick_start_example.md](examples/quick_start_example.md) - 5\u5206\u949f\u4e86\u89e3\u57fa\u672c\u7528\u6cd5\r\n\r\n### \ud83c\udf1f \u81ea\u7136\u8bed\u8a00\u4ea4\u4e92\uff08\u63a8\u8350\uff09\r\n\r\nHalo MCP Server \u7684\u6700\u5927\u4f18\u52bf\u662f\u652f\u6301\u81ea\u7136\u8bed\u8a00\u5bf9\u8bdd\uff0c\u65e0\u9700\u8bb0\u5fc6\u590d\u6742\u547d\u4ee4\uff1a\r\n\r\n#### \ud83d\udcdd \u6587\u7ae0\u521b\u4f5c\r\n\r\n```\r\n\ud83d\udc64 \u7528\u6237\uff1a\u5e2e\u6211\u5199\u4e00\u7bc7\u5173\u4e8e Python \u5f02\u6b65\u7f16\u7a0b\u7684\u6280\u672f\u6587\u7ae0\u5e76\u53d1\u5e03\r\n\r\n\ud83e\udd16 Claude\uff1a\r\n\u597d\u7684\uff01\u6211\u6765\u5e2e\u4f60\u521b\u4f5c\u8fd9\u7bc7\u6587\u7ae0\u3002\r\n\r\n[\u81ea\u52a8\u89e6\u53d1 halo_blog_writing_assistant Prompt]\r\n\u2192 \u751f\u6210 2000 \u5b57\u4e13\u4e1a\u6587\u7ae0\r\n\u2192 \u63a8\u8350\u6807\u7b7e\uff1aPython\u3001\u5f02\u6b65\u7f16\u7a0b\u3001asyncio\r\n\u2192 \u63a8\u8350\u5206\u7c7b\uff1a\u6280\u672f\u6559\u7a0b\r\n\u2192 \u8c03\u7528 create_post \u521b\u5efa\u6587\u7ae0\r\n\u2192 \u8c03\u7528 publish_post \u53d1\u5e03\r\n\r\n\u2713 \u6587\u7ae0\u300aPython\u5f02\u6b65\u7f16\u7a0b\u5b8c\u5168\u6307\u5357\u300b\u5df2\u6210\u529f\u521b\u5efa\u5e76\u53d1\u5e03\uff01\r\n```\r\n\r\n#### \ud83d\udd0d \u6587\u7ae0\u7ba1\u7406\r\n\r\n```\r\n# \u67e5\u770b\u6587\u7ae0\r\n\u8bf7\u663e\u793a\u6211\u6700\u8fd1\u53d1\u5e03\u76845\u7bc7\u6587\u7ae0\r\n\r\n# \u641c\u7d22\u6587\u7ae0\r\n\u641c\u7d22\u6807\u9898\u5305\u542b\"Python\"\u7684\u6587\u7ae0\r\n\r\n# \u7f16\u8f91\u6587\u7ae0\r\n\u628a\"Python\u6559\u7a0b\"\u8fd9\u7bc7\u6587\u7ae0\u7684\u6807\u9898\u6539\u4e3a\"Python\u5165\u95e8\u6307\u5357\"\r\n\r\n# \u5220\u9664\u6587\u7ae0\r\n\u5220\u9664\u540d\u4e3a\"test-post\"\u7684\u6587\u7ae0\r\n```\r\n\r\n#### \u2728 \u5185\u5bb9\u4f18\u5316\r\n\r\n```\r\n# \u4f18\u5316\u6587\u7ae0\r\n\u8bf7\u4f18\u5316\"Python\u6559\u7a0b\"\u8fd9\u7bc7\u6587\u7ae0\uff0c\u8ba9\u5b83\u66f4\u901a\u4fd7\u6613\u61c2\r\n\r\n# \u751f\u6210\u6807\u9898\r\n\u4e3a\u8fd9\u7bc7\u6587\u7ae0\u751f\u62105\u4e2a\u5438\u5f15\u4eba\u7684\u6807\u9898\r\n\r\n# SEO\u4f18\u5316\r\n\u5e2e\u8fd9\u7bc7\u6587\u7ae0\u505aSEO\u4f18\u5316\uff0c\u5173\u952e\u8bcd\u662f\uff1aPython\u3001\u6559\u7a0b\u3001\u5165\u95e8\r\n```\r\n\r\n#### \ud83c\udff7\ufe0f \u5206\u7c7b\u6807\u7b7e\r\n\r\n```\r\n# \u521b\u5efa\u5206\u7c7b\r\n\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a\"\u6280\u672f\u6559\u7a0b\"\u7684\u5206\u7c7b\uff0c\u63cf\u8ff0\u662f\"\u5404\u7c7b\u6280\u672f\u6559\u7a0b\u6587\u7ae0\"\r\n\r\n# \u521b\u5efa\u6807\u7b7e\r\n\u521b\u5efa\u6807\u7b7e\uff1aPython\u3001JavaScript\u3001TypeScript\uff0c\u989c\u8272\u8bbe\u7f6e\u4e3a\u84dd\u8272\r\n\r\n# \u6279\u91cf\u64cd\u4f5c\r\n\u4e3a\"Python\u6559\u7a0b\"\u6587\u7ae0\u6dfb\u52a0\u6807\u7b7e\uff1aPython\u3001\u7f16\u7a0b\u3001\u6559\u7a0b\r\n```\r\n\r\n#### \ud83d\udcce \u9644\u4ef6\u7ba1\u7406\r\n\r\n```\r\n# \u4e0a\u4f20\u56fe\u7247\r\n\u4e0a\u4f20\u8fd9\u5f20\u56fe\u7247\u4f5c\u4e3a\u6587\u7ae0\u5c01\u9762\uff1ahttps://example.com/image.jpg\r\n\r\n# \u67e5\u770b\u9644\u4ef6\r\n\u5217\u51fa\u6240\u6709\u56fe\u7247\u9644\u4ef6\r\n\r\n# \u521b\u5efa\u5206\u7ec4\r\n\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a\"\u6587\u7ae0\u914d\u56fe\"\u7684\u9644\u4ef6\u5206\u7ec4\r\n```\r\n\r\n### \ud83d\udcda \u5b8c\u6574\u5de5\u4f5c\u6d41\u793a\u4f8b\r\n\r\n#### \u573a\u666f\uff1a\u4ece\u96f6\u5f00\u59cb\u53d1\u5e03\u4e00\u7bc7\u6280\u672f\u535a\u5ba2\r\n\r\n```\r\n\ud83d\udc64 \u7528\u6237\uff1a\u6211\u60f3\u5199\u4e00\u7bc7\u5173\u4e8e Docker \u5bb9\u5668\u5316\u7684\u6280\u672f\u6587\u7ae0\r\n\r\n\ud83e\udd16 Claude\uff1a\r\n\u597d\u7684\uff01\u6211\u6765\u5e2e\u4f60\u5b8c\u6210\u6574\u4e2a\u521b\u4f5c\u548c\u53d1\u5e03\u6d41\u7a0b\u3002\r\n\r\n\u6b65\u9aa41: \u5185\u5bb9\u521b\u4f5c\r\n[\u89e6\u53d1 halo_blog_writing_assistant]\r\n\u2192 \u751f\u6210\u5b8c\u6574\u6587\u7ae0\uff08\u5305\u542b\u7b80\u4ecb\u3001\u6838\u5fc3\u6982\u5ff5\u3001\u5b9e\u8df5\u793a\u4f8b\u3001\u603b\u7ed3\uff09\r\n\r\n\u6b65\u9aa42: \u6807\u9898\u4f18\u5316\r\n[\u89e6\u53d1 halo_title_generator]\r\n\u2192 \u63d0\u4f9b5\u4e2a\u6807\u9898\u9009\u9879\u4f9b\u9009\u62e9\r\n\r\n\u6b65\u9aa43: SEO\u4f18\u5316\r\n[\u89e6\u53d1 halo_seo_optimizer]\r\n\u2192 \u4f18\u5316\u5173\u952e\u8bcd\u5e03\u5c40\r\n\u2192 \u751f\u6210Meta\u63cf\u8ff0\r\n\r\n\u6b65\u9aa44: \u5206\u7c7b\u6807\u7b7e\r\n[\u89e6\u53d1 halo_tag_suggester]\r\n\u2192 \u63a8\u8350\u6807\u7b7e\uff1aDocker\u3001\u5bb9\u5668\u5316\u3001DevOps\u3001\u4e91\u539f\u751f\r\n[\u89e6\u53d1 halo_category_suggester]\r\n\u2192 \u63a8\u8350\u5206\u7c7b\uff1a\u4e91\u539f\u751f\u6280\u672f\r\n\r\n\u6b65\u9aa45: \u521b\u5efa\u5e76\u53d1\u5e03\r\n[\u8c03\u7528 create_post]\r\n\u2192 \u521b\u5efa\u6587\u7ae0\r\n[\u8c03\u7528 publish_post]\r\n\u2192 \u53d1\u5e03\u6587\u7ae0\r\n\r\n\u2713 \u5b8c\u6210\uff01\u6587\u7ae0\u300aDocker\u5bb9\u5668\u5316\u5b9e\u8df5\u6307\u5357\u300b\u5df2\u6210\u529f\u53d1\u5e03\r\n  - \u5b57\u6570\uff1a2000\u5b57\r\n  - \u6807\u7b7e\uff1aDocker\u3001\u5bb9\u5668\u5316\u3001DevOps\u3001\u4e91\u539f\u751f\r\n  - \u5206\u7c7b\uff1a\u4e91\u539f\u751f\u6280\u672f\r\n  - \u6587\u7ae0\u94fe\u63a5\uff1ahttps://yourblog.com/posts/docker-guide\r\n```\r\n\r\n---\r\n\r\n## \ud83c\udfaf \u6838\u5fc3\u6982\u5ff5\r\n\r\n### MCP Tools vs Prompts\r\n\r\nHalo MCP Server \u63d0\u4f9b\u4e24\u79cd\u4e0d\u540c\u7684\u80fd\u529b\uff1a\r\n\r\n<table>\r\n<tr>\r\n<th width=\"15%\">\u7c7b\u578b</th>\r\n<th width=\"35%\">Tools\uff08\u5de5\u5177\uff09</th>\r\n<th width=\"35%\">Prompts\uff08\u63d0\u793a\u52a9\u624b\uff09</th>\r\n<th width=\"15%\">\u5bf9\u6bd4</th>\r\n</tr>\r\n<tr>\r\n<td><strong>\u6570\u91cf</strong></td>\r\n<td>30 \u4e2a</td>\r\n<td>10 \u4e2a</td>\r\n<td>\u4e92\u8865\u914d\u5408</td>\r\n</tr>\r\n<tr>\r\n<td><strong>\u7528\u9014</strong></td>\r\n<td>\u6267\u884c\u5177\u4f53\u64cd\u4f5c\uff08CRUD\uff09</td>\r\n<td>\u751f\u6210\u5185\u5bb9\u6307\u5bfc</td>\r\n<td>\u5de5\u5177\u6267\u884c<br>\u63d0\u793a\u751f\u6210</td>\r\n</tr>\r\n<tr>\r\n<td><strong>\u663e\u793a</strong></td>\r\n<td>\u2705 \u5728\u5de5\u5177\u5217\u8868\u4e2d\u53ef\u89c1</td>\r\n<td>\u274c \u540e\u53f0\u81ea\u52a8\u89e6\u53d1</td>\r\n<td>\u663e\u5f0f vs \u9690\u5f0f</td>\r\n</tr>\r\n<tr>\r\n<td><strong>\u8c03\u7528</strong></td>\r\n<td>Claude \u4e3b\u52a8\u8c03\u7528 API</td>\r\n<td>\u6839\u636e\u610f\u56fe\u81ea\u52a8\u5339\u914d</td>\r\n<td>API vs \u667a\u80fd</td>\r\n</tr>\r\n<tr>\r\n<td><strong>\u793a\u4f8b</strong></td>\r\n<td>\r\n\u2022 create_post - \u521b\u5efa\u6587\u7ae0<br>\r\n\u2022 list_categories - \u5217\u51fa\u5206\u7c7b<br>\r\n\u2022 upload_attachment - \u4e0a\u4f20\u9644\u4ef6\r\n</td>\r\n<td>\r\n\u2022 \u535a\u5ba2\u5199\u4f5c\u52a9\u624b - \u751f\u6210\u6587\u7ae0<br>\r\n\u2022 SEO\u4f18\u5316\u5668 - \u4f18\u5316\u5185\u5bb9<br>\r\n\u2022 \u6807\u7b7e\u5efa\u8bae\u5668 - \u63a8\u8350\u6807\u7b7e\r\n</td>\r\n<td>\u64cd\u4f5c vs \u521b\u4f5c</td>\r\n</tr>\r\n<tr>\r\n<td><strong>\u89e6\u53d1\u65b9\u5f0f</strong></td>\r\n<td>\r\n\u660e\u786e\u7684\u64cd\u4f5c\u6307\u4ee4\uff1a<br>\r\n\"\u521b\u5efa\u6587\u7ae0\"<br>\r\n\"\u4e0a\u4f20\u56fe\u7247\"\r\n</td>\r\n<td>\r\n\u63cf\u8ff0\u6027\u9700\u6c42\uff1a<br>\r\n\"\u5199\u4e00\u7bc7\u6587\u7ae0\"<br>\r\n\"\u4f18\u5316\u5185\u5bb9\"\r\n</td>\r\n<td>\u547d\u4ee4 vs \u5bf9\u8bdd</td>\r\n</tr>\r\n</table>\r\n\r\n**\ud83d\udca1 \u5b9e\u9645\u5de5\u4f5c\u6d41\uff1a**\r\n\r\n```\r\n\u7528\u6237: \"\u5e2e\u6211\u5199\u4e00\u7bc7Python\u6559\u7a0b\u5e76\u53d1\u5e03\"\r\n     \u2193\r\nPrompts: halo_blog_writing_assistant \u2192 \u751f\u6210\u6587\u7ae0\u5185\u5bb9\r\n     \u2193\r\nTools: create_post \u2192 \u521b\u5efa\u6587\u7ae0\u5230 Halo\r\n     \u2193\r\nTools: publish_post \u2192 \u53d1\u5e03\u6587\u7ae0\r\n     \u2193\r\n\u7ed3\u679c: \u2713 \u6587\u7ae0\u521b\u5efa\u5e76\u53d1\u5e03\u6210\u529f\r\n```\r\n\r\n### \u4e3a\u4ec0\u4e48\u770b\u4e0d\u5230 Prompts\uff1f\r\n\r\n\u8fd9\u662f MCP \u7684**\u4f18\u79c0\u8bbe\u8ba1**\uff1a\r\n\r\n- \u2705 **\u7528\u6237\u53cb\u597d** - \u65e0\u9700\u8bb0\u5fc6 Prompt \u540d\u79f0\r\n- \u2705 **\u667a\u80fd\u5339\u914d** - AI \u81ea\u52a8\u7406\u89e3\u610f\u56fe\u5e76\u9009\u62e9\u5408\u9002\u7684 Prompt\r\n- \u2705 **\u65e0\u611f\u77e5** - \u540e\u53f0\u81ea\u52a8\u5de5\u4f5c\uff0c\u7528\u6237\u53ea\u9700\u63cf\u8ff0\u9700\u6c42\r\n- \u2705 **\u7075\u6d3b\u6027** - \u53ef\u4ee5\u7528\u5404\u79cd\u65b9\u5f0f\u8868\u8fbe\u540c\u4e00\u4e2a\u9700\u6c42\r\n\r\n**\u5bf9\u6bd4\u4f20\u7edf\u65b9\u5f0f\uff1a**\r\n\r\n```bash\r\n# \u274c \u4f20\u7edf CLI \u65b9\u5f0f\r\n$ halo-cli create-post \\\r\n  --title \"Python\u6559\u7a0b\" \\\r\n  --content-file article.md \\\r\n  --tags \"Python,\u6559\u7a0b\" \\\r\n  --category \"\u7f16\u7a0b\" \\\r\n  --publish\r\n\r\n# \u2705 MCP \u65b9\u5f0f\uff08\u81ea\u7136\u8bed\u8a00\uff09\r\n\u5e2e\u6211\u5199\u4e00\u7bc7Python\u6559\u7a0b\u5e76\u53d1\u5e03\r\n```\r\n\r\n---\r\n\r\n## \ud83d\udcda \u6587\u6863\r\n\r\n### \u6838\u5fc3\u6587\u6863\r\n\r\n| \u6587\u6863 | \u63cf\u8ff0 |\r\n|------|------|\r\n| [\u5feb\u901f\u5f00\u59cb](QUICKSTART.md) | 5\u5206\u949f\u5feb\u901f\u4e0a\u624b\u6307\u5357 |\r\n| [\u8bbe\u8ba1\u6587\u6863](DESIGN.md) | \u7cfb\u7edf\u67b6\u6784\u548c\u8bbe\u8ba1\u7406\u5ff5 |\r\n| [MCP Prompts \u6307\u5357](MCP_PROMPTS_GUIDE.md) | 10\u4e2a\u5199\u4f5c\u52a9\u624b\u8be6\u7ec6\u8bf4\u660e |\r\n| [Prompts vs Tools](PROMPTS_VS_TOOLS_GUIDE.md) | \u4e24\u8005\u533a\u522b\u548c\u4f7f\u7528\u65b9\u6cd5 |\r\n| [\u4f7f\u7528\u793a\u4f8b](examples/usage_examples.md) | \u5b8c\u6574\u7684\u4f7f\u7528\u793a\u4f8b\u96c6 |\r\n\r\n### API \u6587\u6863\r\n\r\n| \u6587\u6863                                                 | \u63cf\u8ff0 |\r\n|----------------------------------------------------|------|\r\n| [API \u6574\u7406](halo_apis_docs/README.md)          | Halo API \u6574\u7406 |\r\n| [Console API](halo_apis_docs/apis_console.json)    | Halo \u63a7\u5236\u53f0 API |\r\n| [Public API](halo_apis_docs/apis_public.json)      | Halo \u516c\u5f00 API |\r\n| [UC API](halo_apis_docs/apis_uc.json)              | Halo \u7528\u6237\u5185\u5bb9 API |\r\n| [Extension API](halo_apis_docs/apis_extension.json) | Halo \u6269\u5c55 API |\r\n\r\n### \ud83d\udcd6 \u793a\u4f8b\u4ee3\u7801\r\n\r\n> \ud83d\udca1 **\u5b8c\u6574\u793a\u4f8b\u6307\u5357**\uff1a\u67e5\u770b [examples/README.md](examples/README.md) \u83b7\u53d6\u8be6\u7ec6\u7684\u793a\u4f8b\u6587\u6863\u548c\u4f7f\u7528\u8bf4\u660e\r\n\r\n#### \ud83d\udcc1 \u793a\u4f8b\u76ee\u5f55\u7ed3\u6784\r\n\r\n```\r\nexamples/\r\n\u251c\u2500\u2500 README.md                           # \ud83d\udcd8 \u793a\u4f8b\u603b\u89c8\u548c\u8be6\u7ec6\u6307\u5357\r\n\u251c\u2500\u2500 quick_start_example.md              # \u26a1 \u5feb\u901f\u5f00\u59cb\uff08\u5fc5\u8bfb\uff09\r\n\u251c\u2500\u2500 usage_examples.md                   # \ud83d\udcda \u4f7f\u7528\u793a\u4f8b\u5408\u96c6\r\n\u251c\u2500\u2500 category_management_examples.py     # \ud83c\udff7\ufe0f \u5206\u7c7b\u7ba1\u7406\u5b8c\u6574\u793a\u4f8b\r\n\u251c\u2500\u2500 tag_management_examples.py          # \ud83d\udd16 \u6807\u7b7e\u7ba1\u7406\u5b8c\u6574\u793a\u4f8b\r\n\u251c\u2500\u2500 attachment_management_examples.py   # \ud83d\udcce \u9644\u4ef6\u7ba1\u7406\u5b8c\u6574\u793a\u4f8b\r\n\u2514\u2500\u2500 mcp_prompts_examples.py             # \ud83e\udd16 AI\u5199\u4f5c\u52a9\u624b\u793a\u4f8b\r\n```\r\n\r\n#### \ud83d\ude80 \u5feb\u901f\u5f00\u59cb\r\n\r\n**\u65b0\u624b\u63a8\u8350\u8def\u5f84**\uff1a\r\n1. \ud83d\udcd6 [\u5feb\u901f\u5f00\u59cb\u793a\u4f8b](examples/quick_start_example.md) - 5\u5206\u949f\u4e86\u89e3\u57fa\u672c\u7528\u6cd5\r\n2. \ud83d\udcda [\u4f7f\u7528\u793a\u4f8b\u5408\u96c6](examples/usage_examples.md) - \u5e38\u89c1\u573a\u666f\u548c\u6700\u4f73\u5b9e\u8df5\r\n3. \ud83d\udcd8 [\u5b8c\u6574\u793a\u4f8b\u6307\u5357](examples/README.md) - \u6240\u6709\u793a\u4f8b\u7684\u8be6\u7ec6\u6587\u6863\r\n\r\n**\u6309\u529f\u80fd\u5b66\u4e60**\uff1a\r\n\r\n| \u793a\u4f8b\u6587\u4ef6 | \u529f\u80fd | \u96be\u5ea6 | \u8bf4\u660e |\r\n|---------|------|------|------|\r\n| [quick_start_example.md](examples/quick_start_example.md) | \u5feb\u901f\u5165\u95e8 | \u2b50 | \u5b9e\u9645\u8c03\u7528\u793a\u4f8b\uff0c\u5c55\u793a\u57fa\u672c\u7528\u6cd5 |\r\n| [usage_examples.md](examples/usage_examples.md) | \u7efc\u5408\u793a\u4f8b | \u2b50\u2b50 | \u6db5\u76d6\u6240\u6709\u5de5\u5177\u7684\u4f7f\u7528\u573a\u666f |\r\n| [category_management_examples.py](examples/category_management_examples.py) | \u5206\u7c7b\u7ba1\u7406 | \u2b50\u2b50 | 279\u884c\u5b8c\u6574\u4ee3\u7801\u793a\u4f8b |\r\n| [tag_management_examples.py](examples/tag_management_examples.py) | \u6807\u7b7e\u7ba1\u7406 | \u2b50\u2b50 | 375\u884c\u5b8c\u6574\u4ee3\u7801\u793a\u4f8b |\r\n| [attachment_management_examples.py](examples/attachment_management_examples.py) | \u9644\u4ef6\u7ba1\u7406 | \u2b50\u2b50\u2b50 | 477\u884c\u5b8c\u6574\u4ee3\u7801\u793a\u4f8b |\r\n| [mcp_prompts_examples.py](examples/mcp_prompts_examples.py) | AI\u5199\u4f5c\u52a9\u624b | \u2b50\u2b50\u2b50 | 341\u884cPrompts\u4f7f\u7528\u793a\u4f8b |\r\n\r\n#### \ud83d\udca1 \u4f7f\u7528\u63d0\u793a\r\n\r\n- **Markdown \u793a\u4f8b** (`.md`) - \u9002\u5408\u9605\u8bfb\u548c\u7406\u89e3\uff0c\u5305\u542b\u8be6\u7ec6\u8bf4\u660e\r\n- **Python \u793a\u4f8b** (`.py`) - \u53ef\u76f4\u63a5\u8fd0\u884c\u7684\u5b8c\u6574\u4ee3\u7801\uff0c\u5305\u542b\u6ce8\u91ca\r\n- **\u4ece\u7b80\u5230\u96be** - \u5efa\u8bae\u6309\u4e0a\u8868\u987a\u5e8f\u5b66\u4e60\uff0c\u9010\u6b65\u638c\u63e1\u6240\u6709\u529f\u80fd\r\n\r\n**\u8fd0\u884c Python \u793a\u4f8b**\uff1a\r\n```bash\r\n# 1. \u786e\u4fdd\u5df2\u914d\u7f6e\u73af\u5883\u53d8\u91cf\r\nexport HALO_BASE_URL=\"your_url\"\r\nexport HALO_TOKEN=\"your_token\"\r\n\r\n# 2. \u8fd0\u884c\u793a\u4f8b\uff08\u4ee5\u5206\u7c7b\u7ba1\u7406\u4e3a\u4f8b\uff09\r\ncd examples\r\npython category_management_examples.py\r\n```\r\n\r\n---\r\n\r\n## \ud83d\udd27 \u914d\u7f6e\u8bf4\u660e\r\n\r\n### \u73af\u5883\u53d8\u91cf\r\n\r\n\u521b\u5efa `.env` \u6587\u4ef6\u6216\u5728 Claude Desktop \u914d\u7f6e\u4e2d\u8bbe\u7f6e\uff1a\r\n\r\n```env\r\n# ========== \u5fc5\u9700\u914d\u7f6e ==========\r\nHALO_BASE_URL=http://localhost:8091    # Halo \u670d\u52a1\u5668\u5730\u5740\r\nHALO_TOKEN=your_token_here              # API \u8bbf\u95ee\u4ee4\u724c\r\n\r\n# ========== \u53ef\u9009\u914d\u7f6e ==========\r\nMCP_LOG_LEVEL=INFO                      # \u65e5\u5fd7\u7ea7\u522b: DEBUG, INFO, WARNING, ERROR\r\nMCP_TIMEOUT=30                          # HTTP \u8bf7\u6c42\u8d85\u65f6\uff08\u79d2\uff09\r\n\r\n# ========== \u529f\u80fd\u5f00\u5173 ==========\r\nENABLE_IMAGE_COMPRESSION=true           # \u542f\u7528\u56fe\u7247\u538b\u7f29\r\nIMAGE_MAX_WIDTH=1920                    # \u538b\u7f29\u540e\u6700\u5927\u5bbd\u5ea6\uff08\u50cf\u7d20\uff09\r\nIMAGE_QUALITY=85                        # \u56fe\u7247\u8d28\u91cf (1-100)\r\nMAX_UPLOAD_SIZE_MB=10                   # \u6700\u5927\u4e0a\u4f20\u5927\u5c0f\uff08MB\uff09\r\n\r\n# ========== \u9ad8\u7ea7\u914d\u7f6e ==========\r\nHTTP_POOL_SIZE=10                       # HTTP \u8fde\u63a5\u6c60\u5927\u5c0f\r\nMAX_RETRIES=3                           # \u8bf7\u6c42\u91cd\u8bd5\u6b21\u6570\r\nENABLE_CACHE=true                       # \u542f\u7528\u7f13\u5b58\r\nCACHE_TTL=300                           # \u7f13\u5b58\u8fc7\u671f\u65f6\u95f4\uff08\u79d2\uff09\r\n```\r\n\r\n\u5b8c\u6574\u914d\u7f6e\u8bf4\u660e\u8bf7\u53c2\u8003 [.env.example](.env.example)\r\n\r\n---\r\n\r\n## \ud83d\udee0\ufe0f \u6545\u969c\u6392\u9664\r\n\r\n### \u5e38\u89c1\u95ee\u9898\r\n\r\n#### 1. Claude \u65e0\u6cd5\u8bc6\u522b Halo \u5de5\u5177\r\n\r\n**\u75c7\u72b6\uff1a** Claude \u4e0d\u54cd\u5e94\u535a\u5ba2\u7ba1\u7406\u547d\u4ee4\r\n\r\n**\u89e3\u51b3\u65b9\u6848\uff1a**\r\n```bash\r\n# \u68c0\u67e5\u914d\u7f6e\u6587\u4ef6\r\n# Windows: %APPDATA%\\Claude\\claude_desktop_config.json\r\n# macOS: ~/Library/Application Support/Claude/claude_desktop_config.json\r\n\r\n# \u9a8c\u8bc1\u914d\u7f6e\u683c\u5f0f\uff08JSON\u5fc5\u987b\u6b63\u786e\uff09\r\n# \u786e\u8ba4 Python \u8def\u5f84\u6b63\u786e\r\n# \u91cd\u542f Claude Desktop\r\n```\r\n\r\n#### 2. \u8ba4\u8bc1\u5931\u8d25\r\n\r\n**\u75c7\u72b6\uff1a** \u62a5\u9519\"Authentication failed\"\u6216\"Invalid token\"\r\n\r\n**\u89e3\u51b3\u65b9\u6848\uff1a**\r\n1. \u68c0\u67e5 `HALO_TOKEN` \u662f\u5426\u6b63\u786e\uff08\u65e0\u591a\u4f59\u7a7a\u683c\uff09\r\n2. \u786e\u8ba4 Token \u672a\u8fc7\u671f\r\n3. \u9a8c\u8bc1 `HALO_BASE_URL` \u662f\u5426\u53ef\u8bbf\u95ee\r\n4. \u6d4b\u8bd5\u7f51\u7edc\u8fde\u63a5\uff1a\r\n   ```bash\r\n   curl http://localhost:8091/apis/api.console.halo.run/v1alpha1/posts\r\n   ```\r\n\r\n#### 3. \u6a21\u5757\u5bfc\u5165\u9519\u8bef\r\n\r\n**\u75c7\u72b6\uff1a** \"No module named 'halo-mcp-server'\"\r\n\r\n**\u89e3\u51b3\u65b9\u6848\uff1a**\r\n```bash\r\n# \u91cd\u65b0\u5b89\u88c5\r\npip install -e .\r\n\r\n# \u9a8c\u8bc1\u5b89\u88c5\r\npip show halo-mcp-server\r\n\r\n# \u68c0\u67e5 Python \u8def\u5f84\r\npython -c \"import halo-mcp-server; print(halo_mcp_server.__version__)\"\r\n```\r\n\r\n#### 4. Prompts \u4e0d\u751f\u6548\r\n\r\n**\u75c7\u72b6\uff1a** AI \u4e0d\u80fd\u81ea\u52a8\u751f\u6210\u6587\u7ae0\u5185\u5bb9\r\n\r\n**\u8bf4\u660e\uff1a** Prompts \u662f\u9690\u85cf\u7684\uff0c\u901a\u8fc7\u81ea\u7136\u8bed\u8a00\u89e6\u53d1\r\n\r\n**\u6d4b\u8bd5\u65b9\u6cd5\uff1a**\r\n```\r\n# \u2705 \u6b63\u786e\u65b9\u5f0f\uff08\u4f1a\u89e6\u53d1\u5199\u4f5c Prompt\uff09\r\n\u5e2e\u6211\u5199\u4e00\u7bc7\u5173\u4e8ePython\u7684\u6587\u7ae0\r\n\r\n# \u274c \u9519\u8bef\u7406\u89e3\uff08\u4e0d\u9700\u8981\u8fd9\u6837\uff09\r\n\u4f7f\u7528 halo_blog_writing_assistant \u5199\u6587\u7ae0\r\n```\r\n\r\n### \u8c03\u8bd5\u65b9\u6cd5\r\n\r\n#### \u67e5\u770b\u65e5\u5fd7\r\n\r\n**\u8bbe\u7f6e\u8c03\u8bd5\u7ea7\u522b\uff1a**\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"halo\": {\r\n      \"env\": {\r\n        \"MCP_LOG_LEVEL\": \"DEBUG\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n**\u65e5\u5fd7\u4f4d\u7f6e\uff1a**\r\n- Claude Desktop \u65e5\u5fd7\uff1a\u5e2e\u52a9 \u2192 \u5f00\u53d1\u8005\u5de5\u5177 \u2192 Console\r\n- MCP \u670d\u52a1\u65e5\u5fd7\uff1a\u67e5\u770b\u6807\u51c6\u8f93\u51fa\r\n\r\n#### \u624b\u52a8\u6d4b\u8bd5\r\n\r\n**\u6d4b\u8bd5\u8ba4\u8bc1\uff1a**\r\n```bash\r\n# \u4f7f\u7528 curl \u6d4b\u8bd5\r\ncurl -H \"Authorization: Bearer YOUR_TOKEN\" \\\r\n  http://localhost:8091/apis/uc.api.content.halo.run/v1alpha1/posts\r\n```\r\n\r\n**\u6d4b\u8bd5 Python \u6a21\u5757\uff1a**\r\n```bash\r\n# \u8fdb\u5165 Python \u73af\u5883\r\npython\r\n\r\n# \u5bfc\u5165\u5e76\u6d4b\u8bd5\r\n>>> from halo_mcp_server.client import HaloClient\r\n>>> import asyncio\r\n>>> client = HaloClient()\r\n>>> asyncio.run(client.authenticate())\r\n>>> print(\"\u2713 \u8ba4\u8bc1\u6210\u529f\")\r\n```\r\n\r\n---\r\n\r\n## \ud83c\udfd7\ufe0f \u5f00\u53d1\r\n\r\n### \u5f00\u53d1\u73af\u5883\u8bbe\u7f6e\r\n\r\n```bash\r\n# 1. \u514b\u9686\u9879\u76ee\r\ngit clone https://github.com/Huangwh826/halo_mcp_server.git\r\ncd halo-mcp-server\r\n\r\n# 2. \u521b\u5efa\u865a\u62df\u73af\u5883\r\npython -m venv venv\r\nsource venv/bin/activate  # Windows: venv\\Scripts\\activate\r\n\r\n# 3. \u5b89\u88c5\u5f00\u53d1\u4f9d\u8d56\r\npip install -e \".[dev]\"\r\n\r\n# 4. \u5b89\u88c5 pre-commit hooks\r\npre-commit install\r\n```\r\n\r\n### \u9879\u76ee\u7ed3\u6784\r\n\r\n```\r\nhalo-mcp-server/\r\n\u251c\u2500\u2500 src/halo-mcp-server/           # \u6e90\u4ee3\u7801\r\n\u2502   \u251c\u2500\u2500 __init__.py\r\n\u2502   \u251c\u2500\u2500 __main__.py         # \u5165\u53e3\u6587\u4ef6\r\n\u2502   \u251c\u2500\u2500 config.py           # \u914d\u7f6e\u7ba1\u7406\r\n\u2502   \u251c\u2500\u2500 server.py           # MCP \u670d\u52a1\u5668\r\n\u2502   \u251c\u2500\u2500 exceptions.py       # \u5f02\u5e38\u5b9a\u4e49\r\n\u2502   \u251c\u2500\u2500 client/             # Halo API \u5ba2\u6237\u7aef\r\n\u2502   \u2502   \u251c\u2500\u2500 base.py\r\n\u2502   \u2502   \u2514\u2500\u2500 halo_client.py\r\n\u2502   \u251c\u2500\u2500 tools/              # MCP Tools\r\n\u2502   \u2502   \u251c\u2500\u2500 post_tools.py\r\n\u2502   \u2502   \u251c\u2500\u2500 category_tools.py\r\n\u2502   \u2502   \u251c\u2500\u2500 tag_tools.py\r\n\u2502   \u2502   \u2514\u2500\u2500 attachment_tools.py\r\n\u2502   \u251c\u2500\u2500 prompts/            # MCP Prompts\r\n\u2502   \u2502   \u2514\u2500\u2500 blog_prompts.py\r\n\u2502   \u2514\u2500\u2500 utils/              # \u5de5\u5177\u51fd\u6570\r\n\u2502       \u2514\u2500\u2500 logger.py\r\n\u251c\u2500\u2500 tests/                  # \u5355\u5143\u6d4b\u8bd5\r\n\u251c\u2500\u2500 examples/               # \u4f7f\u7528\u793a\u4f8b\r\n\u251c\u2500\u2500 halo_apis_docs/         # API \u6587\u6863\r\n\u251c\u2500\u2500 debug_tests/            # \u8c03\u8bd5\u811a\u672c\r\n\u251c\u2500\u2500 pyproject.toml          # \u9879\u76ee\u914d\u7f6e\r\n\u2514\u2500\u2500 README.md               # \u672c\u6587\u4ef6\r\n```\r\n\r\n### \u4ee3\u7801\u89c4\u8303\r\n\r\n```bash\r\n# \u683c\u5f0f\u5316\u4ee3\u7801\r\nblack src/ tests/\r\nisort src/ tests/\r\n\r\n# \u7c7b\u578b\u68c0\u67e5\r\nmypy src/\r\n\r\n# \u4ee3\u7801\u68c0\u67e5\r\nruff check src/ tests/\r\n\r\n# \u8fd0\u884c\u6d4b\u8bd5\r\npytest tests/ -v --cov=halo-mcp-server\r\n```\r\n\r\n### \u6dfb\u52a0\u65b0\u529f\u80fd\r\n\r\n1. **\u6dfb\u52a0\u65b0 Tool\uff1a**\r\n   ```python\r\n   # src/halo-mcp-server/tools/custom_tools.py\r\n   from mcp.types import Tool\r\n   \r\n   async def my_custom_tool(client, arguments):\r\n       \"\"\"\u5b9e\u73b0\u4f60\u7684\u5de5\u5177\u903b\u8f91\"\"\"\r\n       pass\r\n   \r\n   MY_TOOLS = [\r\n       Tool(\r\n           name=\"my_tool\",\r\n           description=\"\u5de5\u5177\u63cf\u8ff0\",\r\n           inputSchema={...}\r\n       )\r\n   ]\r\n   ```\r\n\r\n2. **\u6dfb\u52a0\u65b0 Prompt\uff1a**\r\n   ```python\r\n   # src/halo-mcp-server/prompts/custom_prompts.py\r\n   from mcp.types import Prompt, PromptArgument\r\n   \r\n   CUSTOM_PROMPTS = [\r\n       Prompt(\r\n           name=\"my_prompt\",\r\n           description=\"Prompt \u63cf\u8ff0\",\r\n           arguments=[...]\r\n       )\r\n   ]\r\n   ```\r\n\r\n3. **\u6ce8\u518c\u5230 Server\uff1a**\r\n   ```python\r\n   # src/halo-mcp-server/server.py\r\n   from halo_mcp_server.tools.custom_tools import MY_TOOLS\r\n   from halo_mcp_server.prompts.custom_prompts import CUSTOM_PROMPTS\r\n   \r\n   # \u6dfb\u52a0\u5230\u5bf9\u5e94\u5217\u8868\r\n   all_tools += MY_TOOLS\r\n   all_prompts += CUSTOM_PROMPTS\r\n   ```\r\n\r\n### \u8d21\u732e\u6307\u5357\r\n\r\n\u6b22\u8fce\u8d21\u732e\uff01\u8bf7\u67e5\u770b [DEVELOPMENT.md](DEVELOPMENT.md) \u4e86\u89e3\u8be6\u7ec6\u4fe1\u606f\u3002\r\n\r\n---\r\n\r\n## \ud83e\uddea \u6d4b\u8bd5\r\n\r\n### \u5feb\u901f\u6d4b\u8bd5\r\n\r\n\u9879\u76ee\u63d0\u4f9b\u4e86\u5168\u9762\u7684\u6d4b\u8bd5\u5957\u4ef6\uff0c\u8986\u76d6\u6240\u6709 30 \u4e2a MCP \u5de5\u5177\uff1a\r\n\r\n```bash\r\n# \u8fdb\u5165\u6d4b\u8bd5\u76ee\u5f55\r\ncd tests\r\n\r\n# \u8fd0\u884c\u7efc\u5408\u6d4b\u8bd5\r\npython run_comprehensive_test.py\r\n```\r\n\r\n### \u6d4b\u8bd5\u8986\u76d6\r\n\r\n\u2705 **\u5206\u7c7b\u7ba1\u7406** (6\u4e2a\u5de5\u5177): create_category, list_categories, get_category, update_category, get_category_posts, delete_category\r\n\r\n\u2705 **\u6807\u7b7e\u7ba1\u7406** (7\u4e2a\u5de5\u5177): create_tag, list_tags, get_tag, update_tag, list_console_tags, get_tag_posts, delete_tag\r\n\r\n\u2705 **\u9644\u4ef6\u7ba1\u7406** (8\u4e2a\u5de5\u5177): \u4e0a\u4f20\u3001\u5217\u8868\u3001\u5220\u9664\u3001\u5206\u7ec4\u7b49\r\n\r\n\u2705 **\u6587\u7ae0\u7ba1\u7406** (9\u4e2a\u5de5\u5177): \u521b\u5efa\u3001\u7f16\u8f91\u3001\u53d1\u5e03\u3001\u8349\u7a3f\u7b49\r\n\r\n### \u6d4b\u8bd5\u8be6\u60c5\r\n\r\n\u67e5\u770b [tests/README.md](tests/README.md) \u4e86\u89e3\uff1a\r\n- \ud83d\udcdd \u8be6\u7ec6\u7684\u6d4b\u8bd5\u6307\u5357\r\n- \ud83d\udd27 \u73af\u5883\u914d\u7f6e\u8bf4\u660e\r\n- \ud83d\udc1b \u6545\u969c\u6392\u9664\u65b9\u6cd5\r\n- \ud83d\udcca \u6d4b\u8bd5\u62a5\u544a\u751f\u6210\r\n\r\n---\r\n\r\n## \ud83d\udcca \u529f\u80fd\u5bf9\u7167\u8868\r\n\r\n### \u5b8c\u6574\u5de5\u5177\u5217\u8868\uff0830\u4e2a\uff09\r\n\r\n<details>\r\n<summary><b>\ud83d\udcdd \u6587\u7ae0\u7ba1\u7406\u5de5\u5177\uff089\u4e2a\uff09</b></summary>\r\n\r\n| \u5de5\u5177\u540d\u79f0 | \u529f\u80fd\u8bf4\u660e | \u8c03\u7528\u793a\u4f8b |\r\n|---------|---------|---------|\r\n| `list_my_posts` | \u5217\u51fa\u6211\u7684\u6587\u7ae0 | \"\u5217\u51fa\u6211\u7684\u6240\u6709\u6587\u7ae0\" |\r\n| `get_post` | \u83b7\u53d6\u6587\u7ae0\u8be6\u60c5 | \"\u663e\u793apost-xxx\u7684\u8be6\u60c5\" |\r\n| `create_post` | \u521b\u5efa\u6587\u7ae0 | \"\u521b\u5efa\u4e00\u7bc7\u6587\u7ae0\" |\r\n| `update_post` | \u66f4\u65b0\u6587\u7ae0 | \"\u66f4\u65b0\u6587\u7ae0\u6807\u9898\" |\r\n| `publish_post` | \u53d1\u5e03\u6587\u7ae0 | \"\u53d1\u5e03\u8fd9\u7bc7\u6587\u7ae0\" |\r\n| `unpublish_post` | \u53d6\u6d88\u53d1\u5e03 | \"\u4e0b\u7ebf\u8fd9\u7bc7\u6587\u7ae0\" |\r\n| `delete_post` | \u5220\u9664\u6587\u7ae0 | \"\u5220\u9664\u8fd9\u7bc7\u6587\u7ae0\" |\r\n| `get_post_draft` | \u83b7\u53d6\u8349\u7a3f | \"\u67e5\u770b\u8349\u7a3f\u5185\u5bb9\" |\r\n| `update_post_draft` | \u66f4\u65b0\u8349\u7a3f | \"\u4fee\u6539\u8349\u7a3f\" |\r\n\r\n</details>\r\n\r\n<details>\r\n<summary><b>\ud83c\udff7\ufe0f \u5206\u7c7b\u7ba1\u7406\u5de5\u5177\uff086\u4e2a\uff09</b></summary>\r\n\r\n| \u5de5\u5177\u540d\u79f0 | \u529f\u80fd\u8bf4\u660e | \u8c03\u7528\u793a\u4f8b |\r\n|---------|---------|---------|\r\n| `list_categories` | \u5217\u51fa\u5206\u7c7b | \"\u5217\u51fa\u6240\u6709\u5206\u7c7b\" |\r\n| `get_category` | \u83b7\u53d6\u5206\u7c7b\u8be6\u60c5 | \"\u67e5\u770b\u5206\u7c7b\u8be6\u60c5\" |\r\n| `create_category` | \u521b\u5efa\u5206\u7c7b | \"\u521b\u5efa\u6280\u672f\u5206\u7c7b\" |\r\n| `update_category` | \u66f4\u65b0\u5206\u7c7b | \"\u4fee\u6539\u5206\u7c7b\u540d\u79f0\" |\r\n| `delete_category` | \u5220\u9664\u5206\u7c7b | \"\u5220\u9664\u8fd9\u4e2a\u5206\u7c7b\" |\r\n| `get_category_posts` | \u83b7\u53d6\u5206\u7c7b\u4e0b\u6587\u7ae0 | \"\u67e5\u770b\u5206\u7c7b\u4e0b\u7684\u6587\u7ae0\" |\r\n\r\n</details>\r\n\r\n<details>\r\n<summary><b>\ud83d\udd16 \u6807\u7b7e\u7ba1\u7406\u5de5\u5177\uff087\u4e2a\uff09</b></summary>\r\n\r\n| \u5de5\u5177\u540d\u79f0 | \u529f\u80fd\u8bf4\u660e | \u8c03\u7528\u793a\u4f8b |\r\n|---------|---------|---------|\r\n| `list_tags` | \u5217\u51fa\u6807\u7b7e | \"\u5217\u51fa\u6240\u6709\u6807\u7b7e\" |\r\n| `get_tag` | \u83b7\u53d6\u6807\u7b7e\u8be6\u60c5 | \"\u67e5\u770b\u6807\u7b7e\u8be6\u60c5\" |\r\n| `create_tag` | \u521b\u5efa\u6807\u7b7e | \"\u521b\u5efaPython\u6807\u7b7e\" |\r\n| `update_tag` | \u66f4\u65b0\u6807\u7b7e | \"\u4fee\u6539\u6807\u7b7e\u989c\u8272\" |\r\n| `delete_tag` | \u5220\u9664\u6807\u7b7e | \"\u5220\u9664\u8fd9\u4e2a\u6807\u7b7e\" |\r\n| `get_tag_posts` | \u83b7\u53d6\u6807\u7b7e\u4e0b\u6587\u7ae0 | \"\u67e5\u770b\u6807\u7b7e\u4e0b\u7684\u6587\u7ae0\" |\r\n| `list_console_tags` | \u63a7\u5236\u53f0\u6807\u7b7e\u5217\u8868 | \"\u67e5\u770b\u63a7\u5236\u53f0\u6807\u7b7e\" |\r\n\r\n</details>\r\n\r\n<details>\r\n<summary><b>\ud83d\udcce \u9644\u4ef6\u7ba1\u7406\u5de5\u5177\uff088\u4e2a\uff09</b></summary>\r\n\r\n| \u5de5\u5177\u540d\u79f0 | \u529f\u80fd\u8bf4\u660e | \u8c03\u7528\u793a\u4f8b |\r\n|---------|---------|---------|\r\n| `list_attachments` | \u5217\u51fa\u9644\u4ef6 | \"\u5217\u51fa\u6240\u6709\u9644\u4ef6\" |\r\n| `get_attachment` | \u83b7\u53d6\u9644\u4ef6\u8be6\u60c5 | \"\u67e5\u770b\u9644\u4ef6\u8be6\u60c5\" |\r\n| `upload_attachment` | \u4e0a\u4f20\u6587\u4ef6 | \"\u4e0a\u4f20\u8fd9\u4e2a\u6587\u4ef6\" |\r\n| `upload_attachment_from_url` | \u4eceURL\u4e0a\u4f20 | \"\u4eceURL\u4e0a\u4f20\u56fe\u7247\" |\r\n| `delete_attachment` | \u5220\u9664\u9644\u4ef6 | \"\u5220\u9664\u8fd9\u4e2a\u9644\u4ef6\" |\r\n| `list_attachment_groups` | \u5217\u51fa\u9644\u4ef6\u5206\u7ec4 | \"\u5217\u51fa\u9644\u4ef6\u5206\u7ec4\" |\r\n| `create_attachment_group` | \u521b\u5efa\u5206\u7ec4 | \"\u521b\u5efa\u56fe\u7247\u5206\u7ec4\" |\r\n| `get_attachment_policies` | \u83b7\u53d6\u5b58\u50a8\u7b56\u7565 | \"\u67e5\u770b\u5b58\u50a8\u7b56\u7565\" |\r\n\r\n</details>\r\n\r\n### \u5b8c\u6574 Prompts \u5217\u8868\uff0810\u4e2a\uff09\r\n\r\n<details>\r\n<summary><b>\ud83e\udd16 AI \u5199\u4f5c\u52a9\u624b\u8be6\u7ec6\u8bf4\u660e</b></summary>\r\n\r\n| Prompt \u540d\u79f0 | \u529f\u80fd\u8bf4\u660e | \u89e6\u53d1\u793a\u4f8b | \u4e3b\u8981\u53c2\u6570 |\r\n|------------|---------|---------|---------|\r\n| `halo_blog_writing_assistant` | \u535a\u5ba2\u5199\u4f5c\u52a9\u624b | \"\u5199\u4e00\u7bc7Python\u6587\u7ae0\" | topic, audience, type, word_count |\r\n| `halo_content_optimizer` | \u5185\u5bb9\u4f18\u5316\u5668 | \"\u4f18\u5316\u8fd9\u7bc7\u6587\u7ae0\" | content, focus, length |\r\n| `halo_seo_optimizer` | SEO\u4f18\u5316\u5668 | \"SEO\u4f18\u5316\" | title, content, keywords |\r\n| `halo_title_generator` | \u6807\u9898\u751f\u6210\u5668 | \"\u751f\u62105\u4e2a\u6807\u9898\" | content_summary, style, count |\r\n| `halo_excerpt_generator` | \u6458\u8981\u751f\u6210\u5668 | \"\u751f\u6210\u6458\u8981\" | content, length, style |\r\n| `halo_tag_suggester` | \u6807\u7b7e\u5efa\u8bae\u5668 | \"\u63a8\u8350\u6807\u7b7e\" | title, content, existing_tags |\r\n| `halo_category_suggester` | \u5206\u7c7b\u5efa\u8bae\u5668 | \"\u63a8\u8350\u5206\u7c7b\" | title, content, existing_categories |\r\n| `halo_content_translator` | \u5185\u5bb9\u7ffb\u8bd1\u5668 | \"\u7ffb\u8bd1\u6210\u82f1\u6587\" | content, target_language |\r\n| `halo_content_proofreader` | \u5185\u5bb9\u6821\u5bf9\u5668 | \"\u6821\u5bf9\u6587\u7ae0\" | content, language, focus |\r\n| `halo_series_planner` | \u7cfb\u5217\u89c4\u5212\u5668 | \"\u89c4\u5212\u7cfb\u5217\u6587\u7ae0\" | series_topic, audience, count |\r\n\r\n</details>\r\n\r\n---\r\n\r\n## \ud83e\udd1d \u8d21\u732e\r\n\r\n\u6b22\u8fce\u8d21\u732e\u4ee3\u7801\u3001\u62a5\u544a\u95ee\u9898\u6216\u63d0\u51fa\u5efa\u8bae\uff01\r\n\r\n### \u8d21\u732e\u65b9\u5f0f\r\n\r\n1. Fork \u9879\u76ee\r\n2. \u521b\u5efa\u529f\u80fd\u5206\u652f (`git checkout -b feature/AmazingFeature`)\r\n3. \u63d0\u4ea4\u66f4\u6539 (`git commit -m 'Add some AmazingFeature'`)\r\n4. \u63a8\u9001\u5230\u5206\u652f (`git push origin feature/AmazingFeature`)\r\n5. \u5f00\u542f Pull Request\r\n\r\n### \u8d21\u732e\u8005\r\n\r\n\u611f\u8c22\u6240\u6709\u4e3a\u9879\u76ee\u505a\u51fa\u8d21\u732e\u7684\u5f00\u53d1\u8005\uff01\r\n\r\n---\r\n\r\n## \ud83d\udcc4 \u8bb8\u53ef\u8bc1\r\n\r\n\u672c\u9879\u76ee\u91c7\u7528 MIT \u8bb8\u53ef\u8bc1 - \u8be6\u89c1 [LICENSE](LICENSE) \u6587\u4ef6\r\n\r\n---\r\n\r\n## \ud83d\ude4f \u81f4\u8c22\r\n\r\n- [Halo](https://www.halo.run/) - \u4f18\u79c0\u7684\u5f00\u6e90\u535a\u5ba2\u7cfb\u7edf\r\n- [Model Context Protocol](https://modelcontextprotocol.io) - \u5f3a\u5927\u7684 AI \u96c6\u6210\u534f\u8bae\r\n- [Claude](https://claude.ai) - \u667a\u80fd\u7684 AI \u52a9\u624b\r\n- \u6240\u6709\u8d21\u732e\u8005\u548c\u7528\u6237\r\n\r\n---\r\n\r\n## \ud83d\udcde \u8054\u7cfb\u6211\u4eec\r\n\r\n- **\u9879\u76ee\u4e3b\u9875**: [GitHub](https://github.com/Huangwh826/halo-mcp-server)\r\n- **\u95ee\u9898\u53cd\u9988**: [Issues](https://github.com/Huangwh826/halo-mcp-server/issues)\r\n- **\u6587\u6863**: [Documentation](https://github.com/Huangwh826/halo-mcp-server/blob/main/README.md)\r\n\r\n---\r\n\r\n## \ud83c\udf81 \u652f\u6301\u9879\u76ee\r\n\r\n\u5982\u679c\u8fd9\u4e2a\u9879\u76ee\u5bf9\u4f60\u6709\u5e2e\u52a9\uff0c\u6b22\u8fce\u901a\u8fc7\u4ee5\u4e0b\u65b9\u5f0f\u652f\u6301\uff1a\r\n\r\n- \u2b50 \u7ed9\u9879\u76ee\u70b9\u4e2a Star\r\n- \ud83d\udc1b \u63d0\u4ea4 Issue \u6216 PR\r\n- \ud83d\udcac \u5206\u4eab\u7ed9\u66f4\u591a\u4eba\r\n- \u2615 \u8d5e\u8d4f\u4f5c\u8005\r\n\r\n<div align=\"center\">\r\n\r\n<img src=\"assets/sponsor.png\" alt=\"\u8d5e\u8d4f\u7801\" width=\"300\"/>\r\n\r\n*\u611f\u8c22\u60a8\u7684\u652f\u6301\uff01*\r\n\r\n</div>\r\n\r\n---\r\n\r\n<div align=\"center\">\r\n\r\n**\u2b50 \u5982\u679c\u8fd9\u4e2a\u9879\u76ee\u5bf9\u4f60\u6709\u5e2e\u52a9\uff0c\u8bf7\u7ed9\u5b83\u4e00\u4e2a Star\uff01**\r\n</div>\r\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "MCP for Halo blog system - AI-powered content management",
    "version": "0.1.6",
    "project_urls": {
        "Documentation": "https://github.com/Huangwh826/halo-mcp-server",
        "Homepage": "https://github.com/Huangwh826/halo-mcp-server",
        "Issues": "https://github.com/Huangwh826/halo-mcp-server/issues",
        "Repository": "https://github.com/Huangwh826/halo-mcp-server"
    },
    "split_keywords": [
        "mcp",
        " halo",
        " blog",
        " ai",
        " claude",
        " content-management"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1ef05242eeb586352332cbe3b8f98fa597768c3f55a63a0b626f3eb6bf34354f",
                "md5": "8cbbd254cdcf963bc2bb6e90e01f609f",
                "sha256": "26f1b0bcb777875bd38f8062e08a7f524ac2e819849b2c34a0b4c98eeab37f49"
            },
            "downloads": -1,
            "filename": "halo_mcp_server-0.1.6-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "8cbbd254cdcf963bc2bb6e90e01f609f",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 57055,
            "upload_time": "2025-10-27T10:31:01",
            "upload_time_iso_8601": "2025-10-27T10:31:01.032918Z",
            "url": "https://files.pythonhosted.org/packages/1e/f0/5242eeb586352332cbe3b8f98fa597768c3f55a63a0b626f3eb6bf34354f/halo_mcp_server-0.1.6-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "20ab22b3cfdb4eede2edc14f3a18c5910efc56bf7e12bb39db5347f26cd283d2",
                "md5": "34fc7e217e68967c7ce0454db28c262d",
                "sha256": "d784bc1e76785a252bc5f480f0a13a2624479a9dc8965b72dd876aba0486b2eb"
            },
            "downloads": -1,
            "filename": "halo_mcp_server-0.1.6.tar.gz",
            "has_sig": false,
            "md5_digest": "34fc7e217e68967c7ce0454db28c262d",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 124807,
            "upload_time": "2025-10-27T10:31:02",
            "upload_time_iso_8601": "2025-10-27T10:31:02.598815Z",
            "url": "https://files.pythonhosted.org/packages/20/ab/22b3cfdb4eede2edc14f3a18c5910efc56bf7e12bb39db5347f26cd283d2/halo_mcp_server-0.1.6.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-27 10:31:02",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Huangwh826",
    "github_project": "halo-mcp-server",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "halo-mcp-server"
}
        
Elapsed time: 0.59205s