docx-mcp


Namedocx-mcp JSON
Version 0.1.1 PyPI version JSON
download
home_pageNone
SummaryA MCP (Model Context Protocol) service for Word document processing, providing document structure extraction, content modification and file management capabilities.
upload_time2025-07-24 12:13:03
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT
keywords document docx mcp microsoft office processing word
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # DOCX MCP 服务

一个基于 MCP (Model Context Protocol) 的 Word 文档处理服务,提供文档结构提取、内容修改和文件管理功能。

## ✨ 功能特性

- 📄 **文档结构提取**: 从 .docx 文件中提取段落、表格等结构化内容
- ✏️ **内容修改**: 支持批量修改文档中的文本内容
- ☁️ **云存储集成**: 自动上传修改后的文档到阿里云 OSS
- 🔗 **URL 支持**: 支持从 URL 直接下载和处理文档
- 🛠️ **MCP 兼容**: 完全兼容 MCP 协议,可集成到支持 MCP 的 AI 助手中

## 📋 系统要求

- Python 3.13+
- uvx (推荐) 或 uv (Python 包管理器)

### 为什么选择 uvx?

- 🚀 **即开即用**: 无需本地安装,直接运行
- 🔒 **环境隔离**: 自动管理依赖环境,避免冲突
- 📦 **轻量部署**: 类似 npx,适合工具型应用
- 🔄 **自动更新**: 每次运行使用最新版本

## 🚀 快速开始

### 安装方式

#### 方式一:从本地运行 uvx(当前推荐)

```bash
# 在项目目录下运行
uvx --from . docx-mcp

# 或使用 uv tool run
uv tool run --from . docx-mcp
```

#### 方式二:发布后使用 uvx(未来推荐)

```bash
# 发布到 PyPI 后可以直接运行
uvx docx-mcp
```

#### 方式三:本地开发安装

```bash
# 使用 uv 安装依赖
uv sync

# 或使用 pip 从 pyproject.toml 安装
pip install -e .
```

### 配置 MCP 服务

#### 使用 uvx 从本地运行(当前推荐配置)

在 Cursor 的 `mcp.json` 配置文件中添加以下配置:

```json
{
  "mcpServers": {
    "docx_filler_service": {
      "command": "cmd",
      "args": [
        "/c",
        "uvx",
        "--from",
        "C:\\Users\\你的用户名\\Desktop\\docx_mcp",
        "docx-mcp"
      ]
    }
  }
}
```

#### 使用 uvx 从 PyPI(发布后)

```json
{
  "mcpServers": {
    "docx_filler_service": {
      "command": "cmd",
      "args": [
        "/c",
        "uvx",
        "docx-mcp"
      ]
    }
  }
}
```

#### 使用本地 uv(开发模式)

```json
{
  "mcpServers": {
    "docx_filler_service": {
      "command": "cmd",
      "args": [
        "/c",
        "uv",
        "--directory",
        "C:\\Users\\你的用户名\\Desktop\\docx_mcp",
        "run",
        "main.py"
      ]
    }
  }
}
```

### 启动服务

```bash
# 使用 uvx 从本地运行(当前推荐)
uvx --from . docx-mcp

# 使用 uvx 从 PyPI(发布后)
uvx docx-mcp

# 使用 uv 运行(开发模式)
uv run main.py

# 或直接运行
python main.py
```

## 📦 发布到 PyPI

如果您想要发布包以便全局使用 uvx:

### 快速配置(推荐)

```bash
# 1. 运行凭证配置脚本
python setup_pypi_credentials.py

# 2. 运行发布脚本
python publish.py
```

### 手动配置

```bash
# 1. 设置 PyPI 凭证
$env:TWINE_USERNAME = "your-pypi-username"
$env:TWINE_PASSWORD = "your-pypi-password"

# 2. 构建包
uv build

# 3. 发布到 PyPI
pip install twine
twine upload dist/*
```

发布后,任何人都可以直接使用:
```bash
uvx docx-mcp
```

## 🔧 API 功能

### 1. 提取文档结构

```python
extract_document_structure(document_url: str) -> Dict
```

从 URL 下载 .docx 文件并提取其结构,为每个元素分配唯一 ID。

**参数:**
- `document_url`: .docx 文件的 URL 链接

**返回:** 包含文档结构的字典,每个元素都有唯一的 ID

### 2. 应用文档修改

```python
apply_modifications_to_document(
    original_file_content_base64: str, 
    patches_json: str
) -> str
```

将一系列修改应用到 .docx 文件,返回修改后的文件内容。

**参数:**
- `original_file_content_base64`: 原始 .docx 文件的 Base64 编码
- `patches_json`: JSON 格式的修改指令列表

**示例修改指令:**
```json
[
  {
    "element_id": "p_0",
    "new_content": "新的段落内容"
  },
  {
    "element_id": "table_0_cell_0_0",
    "new_content": "新的表格单元格内容"
  }
]
```

### 3. 获取修改后的文档

```python
get_modified_document(
    original_file_content_base64: str, 
    patches_json: str
) -> str
```

`apply_modifications_to_document` 的别名,用于更清晰地表达获取最终结果的意图。

### 4. 准备文档下载

```python
prepare_document_for_download(
    original_file_content_base64: str, 
    patches_json: str
) -> Dict
```

将修改后的文档上传到阿里云 OSS,返回下载链接。

**返回示例:**
```json
{
  "success": true,
  "download_url": "https://ggb-lzt.oss-cn-shenzhen.aliyuncs.com/modified_document_xxx.docx",
  "file_name": "modified_document_xxx.docx"
}
```

### 5. 从 URL 处理文档

```python
process_document_from_url(
    document_url: str, 
    patches_json: str
) -> Dict
```

直接从 URL 下载文档,应用修改,然后上传到 OSS。

## 📁 项目结构

```
docx_mcp/
├── core/                    # 核心功能模块
│   ├── docx_processor.py   # 文档处理器
│   └── models.py           # 数据模型定义
├── dist/                   # 构建输出目录
│   ├── docx_mcp-0.1.0-py3-none-any.whl
│   └── docx_mcp-0.1.0.tar.gz
├── main.py                 # MCP 服务主入口
├── pyproject.toml         # 项目配置和依赖定义
├── requirements.txt       # 备用依赖文件(兼容性)
├── uv.lock               # uv 锁定文件
├── LICENSE               # MIT 许可证
├── PUBLISH.md            # 发布指南
├── PRE_PUBLISH_CHECKLIST.md  # 发布前检查清单
├── READY_TO_PUBLISH.md   # 发布准备说明
├── setup_pypi_credentials.py # PyPI 凭证配置脚本
├── publish.py            # 自动化发布脚本
├── env.example           # 环境变量配置模板
└── README.md             # 项目文档
```

## 🔐 配置说明

### 阿里云 OSS 配置

推荐使用环境变量配置 OSS 访问信息。复制 `env.example` 文件并重命名为 `.env`,然后填入您的实际配置:

```bash
# 复制配置模板
cp env.example .env
```

在 `.env` 文件中设置:

```bash
OSS_ACCESS_KEY=your_access_key_here
OSS_SECRET_KEY=your_secret_key_here
OSS_BUCKET_NAME=your_bucket_name
OSS_DOMAIN=https://your-bucket.oss-cn-shenzhen.aliyuncs.com/
```

或者在系统环境变量中设置:

```bash
# Windows PowerShell
$env:OSS_ACCESS_KEY = "your_access_key_here"
$env:OSS_SECRET_KEY = "your_secret_key_here"
$env:OSS_BUCKET_NAME = "your_bucket_name"
$env:OSS_DOMAIN = "https://your-bucket.oss-cn-shenzhen.aliyuncs.com/"

# PyPI 发布凭证(可选)
$env:TWINE_USERNAME = "your-pypi-username"
$env:TWINE_PASSWORD = "your-pypi-password"

# Linux/macOS
export OSS_ACCESS_KEY="your_access_key_here"
export OSS_SECRET_KEY="your_secret_key_here"
export OSS_BUCKET_NAME="your_bucket_name"
export OSS_DOMAIN="https://your-bucket.oss-cn-shenzhen.aliyuncs.com/"

# PyPI 发布凭证(可选)
export TWINE_USERNAME="your-pypi-username"
export TWINE_PASSWORD="your-pypi-password"
```

⚠️ **安全提示**: 
- 请不要将敏感信息提交到版本控制系统
- `.env` 文件已添加到 `.gitignore` 中
- 生产环境建议使用更安全的密钥管理方案

## 🛠️ 开发指南

### 数据模型

项目使用 Pydantic 定义数据模型:

```python
class DocumentPatch(BaseModel):
    element_id: str      # 元素唯一标识符
    new_content: Any     # 新内容(支持多种类型)
```

### 扩展功能

要添加新的文档处理功能:

1. 在 `core/docx_processor.py` 中实现处理逻辑
2. 在 `main.py` 中使用 `@mcp.tool()` 装饰器注册新的 MCP 工具
3. 更新相关的数据模型

## 🤝 贡献指南

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) 文件了解详情。

## 🔗 相关链接

- [MCP 官方文档](https://modelcontextprotocol.io/)
- [FastMCP 框架](https://github.com/pydantic/fastmcp)
- [python-docx 文档](https://python-docx.readthedocs.io/)
- [阿里云 OSS Python SDK](https://help.aliyun.com/document_detail/32026.html)

## ❓ 常见问题

### Q: uvx 和 uv 有什么区别?
A: uvx 是用于运行独立 Python 工具的工具,类似 npx。它会自动处理依赖和环境隔离,更适合工具型应用。uv 主要用于项目依赖管理和开发。

### Q: 如何处理大文件?
A: 服务支持通过 Base64 编码处理大文件,但建议文件大小不超过 50MB。

### Q: 支持哪些文档格式?
A: 目前仅支持 .docx 格式(Office 2007+ 格式)。

### Q: 如何自定义 OSS 配置?
A: 修改 `main.py` 中的 `OSS_CONFIG` 字典,或考虑使用环境变量。

### Q: uvx 找不到命令怎么办?
A: 确保已安装 uv,然后 uvx 会自动可用。如果仍有问题,可以使用 `uv tool run docx-mcp` 替代。

---

💡 **提示**: 如有问题或建议,欢迎提交 Issue 或 Pull Request!

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "docx-mcp",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "Your Name <your.email@example.com>",
    "keywords": "document, docx, mcp, microsoft, office, processing, word",
    "author": null,
    "author_email": "Your Name <your.email@example.com>",
    "download_url": "https://files.pythonhosted.org/packages/54/c5/6c8a1085924831f8b89cc8aa1ba6fab53d9a9583895dc14c9c77293bfadb/docx_mcp-0.1.1.tar.gz",
    "platform": null,
    "description": "# DOCX MCP \u670d\u52a1\n\n\u4e00\u4e2a\u57fa\u4e8e MCP (Model Context Protocol) \u7684 Word \u6587\u6863\u5904\u7406\u670d\u52a1\uff0c\u63d0\u4f9b\u6587\u6863\u7ed3\u6784\u63d0\u53d6\u3001\u5185\u5bb9\u4fee\u6539\u548c\u6587\u4ef6\u7ba1\u7406\u529f\u80fd\u3002\n\n## \u2728 \u529f\u80fd\u7279\u6027\n\n- \ud83d\udcc4 **\u6587\u6863\u7ed3\u6784\u63d0\u53d6**: \u4ece .docx \u6587\u4ef6\u4e2d\u63d0\u53d6\u6bb5\u843d\u3001\u8868\u683c\u7b49\u7ed3\u6784\u5316\u5185\u5bb9\n- \u270f\ufe0f **\u5185\u5bb9\u4fee\u6539**: \u652f\u6301\u6279\u91cf\u4fee\u6539\u6587\u6863\u4e2d\u7684\u6587\u672c\u5185\u5bb9\n- \u2601\ufe0f **\u4e91\u5b58\u50a8\u96c6\u6210**: \u81ea\u52a8\u4e0a\u4f20\u4fee\u6539\u540e\u7684\u6587\u6863\u5230\u963f\u91cc\u4e91 OSS\n- \ud83d\udd17 **URL \u652f\u6301**: \u652f\u6301\u4ece URL \u76f4\u63a5\u4e0b\u8f7d\u548c\u5904\u7406\u6587\u6863\n- \ud83d\udee0\ufe0f **MCP \u517c\u5bb9**: \u5b8c\u5168\u517c\u5bb9 MCP \u534f\u8bae\uff0c\u53ef\u96c6\u6210\u5230\u652f\u6301 MCP \u7684 AI \u52a9\u624b\u4e2d\n\n## \ud83d\udccb \u7cfb\u7edf\u8981\u6c42\n\n- Python 3.13+\n- uvx (\u63a8\u8350) \u6216 uv (Python \u5305\u7ba1\u7406\u5668)\n\n### \u4e3a\u4ec0\u4e48\u9009\u62e9 uvx\uff1f\n\n- \ud83d\ude80 **\u5373\u5f00\u5373\u7528**: \u65e0\u9700\u672c\u5730\u5b89\u88c5\uff0c\u76f4\u63a5\u8fd0\u884c\n- \ud83d\udd12 **\u73af\u5883\u9694\u79bb**: \u81ea\u52a8\u7ba1\u7406\u4f9d\u8d56\u73af\u5883\uff0c\u907f\u514d\u51b2\u7a81\n- \ud83d\udce6 **\u8f7b\u91cf\u90e8\u7f72**: \u7c7b\u4f3c npx\uff0c\u9002\u5408\u5de5\u5177\u578b\u5e94\u7528\n- \ud83d\udd04 **\u81ea\u52a8\u66f4\u65b0**: \u6bcf\u6b21\u8fd0\u884c\u4f7f\u7528\u6700\u65b0\u7248\u672c\n\n## \ud83d\ude80 \u5feb\u901f\u5f00\u59cb\n\n### \u5b89\u88c5\u65b9\u5f0f\n\n#### \u65b9\u5f0f\u4e00\uff1a\u4ece\u672c\u5730\u8fd0\u884c uvx\uff08\u5f53\u524d\u63a8\u8350\uff09\n\n```bash\n# \u5728\u9879\u76ee\u76ee\u5f55\u4e0b\u8fd0\u884c\nuvx --from . docx-mcp\n\n# \u6216\u4f7f\u7528 uv tool run\nuv tool run --from . docx-mcp\n```\n\n#### \u65b9\u5f0f\u4e8c\uff1a\u53d1\u5e03\u540e\u4f7f\u7528 uvx\uff08\u672a\u6765\u63a8\u8350\uff09\n\n```bash\n# \u53d1\u5e03\u5230 PyPI \u540e\u53ef\u4ee5\u76f4\u63a5\u8fd0\u884c\nuvx docx-mcp\n```\n\n#### \u65b9\u5f0f\u4e09\uff1a\u672c\u5730\u5f00\u53d1\u5b89\u88c5\n\n```bash\n# \u4f7f\u7528 uv \u5b89\u88c5\u4f9d\u8d56\nuv sync\n\n# \u6216\u4f7f\u7528 pip \u4ece pyproject.toml \u5b89\u88c5\npip install -e .\n```\n\n### \u914d\u7f6e MCP \u670d\u52a1\n\n#### \u4f7f\u7528 uvx \u4ece\u672c\u5730\u8fd0\u884c\uff08\u5f53\u524d\u63a8\u8350\u914d\u7f6e\uff09\n\n\u5728 Cursor \u7684 `mcp.json` \u914d\u7f6e\u6587\u4ef6\u4e2d\u6dfb\u52a0\u4ee5\u4e0b\u914d\u7f6e\uff1a\n\n```json\n{\n  \"mcpServers\": {\n    \"docx_filler_service\": {\n      \"command\": \"cmd\",\n      \"args\": [\n        \"/c\",\n        \"uvx\",\n        \"--from\",\n        \"C:\\\\Users\\\\\u4f60\u7684\u7528\u6237\u540d\\\\Desktop\\\\docx_mcp\",\n        \"docx-mcp\"\n      ]\n    }\n  }\n}\n```\n\n#### \u4f7f\u7528 uvx \u4ece PyPI\uff08\u53d1\u5e03\u540e\uff09\n\n```json\n{\n  \"mcpServers\": {\n    \"docx_filler_service\": {\n      \"command\": \"cmd\",\n      \"args\": [\n        \"/c\",\n        \"uvx\",\n        \"docx-mcp\"\n      ]\n    }\n  }\n}\n```\n\n#### \u4f7f\u7528\u672c\u5730 uv\uff08\u5f00\u53d1\u6a21\u5f0f\uff09\n\n```json\n{\n  \"mcpServers\": {\n    \"docx_filler_service\": {\n      \"command\": \"cmd\",\n      \"args\": [\n        \"/c\",\n        \"uv\",\n        \"--directory\",\n        \"C:\\\\Users\\\\\u4f60\u7684\u7528\u6237\u540d\\\\Desktop\\\\docx_mcp\",\n        \"run\",\n        \"main.py\"\n      ]\n    }\n  }\n}\n```\n\n### \u542f\u52a8\u670d\u52a1\n\n```bash\n# \u4f7f\u7528 uvx \u4ece\u672c\u5730\u8fd0\u884c\uff08\u5f53\u524d\u63a8\u8350\uff09\nuvx --from . docx-mcp\n\n# \u4f7f\u7528 uvx \u4ece PyPI\uff08\u53d1\u5e03\u540e\uff09\nuvx docx-mcp\n\n# \u4f7f\u7528 uv \u8fd0\u884c\uff08\u5f00\u53d1\u6a21\u5f0f\uff09\nuv run main.py\n\n# \u6216\u76f4\u63a5\u8fd0\u884c\npython main.py\n```\n\n## \ud83d\udce6 \u53d1\u5e03\u5230 PyPI\n\n\u5982\u679c\u60a8\u60f3\u8981\u53d1\u5e03\u5305\u4ee5\u4fbf\u5168\u5c40\u4f7f\u7528 uvx\uff1a\n\n### \u5feb\u901f\u914d\u7f6e\uff08\u63a8\u8350\uff09\n\n```bash\n# 1. \u8fd0\u884c\u51ed\u8bc1\u914d\u7f6e\u811a\u672c\npython setup_pypi_credentials.py\n\n# 2. \u8fd0\u884c\u53d1\u5e03\u811a\u672c\npython publish.py\n```\n\n### \u624b\u52a8\u914d\u7f6e\n\n```bash\n# 1. \u8bbe\u7f6e PyPI \u51ed\u8bc1\n$env:TWINE_USERNAME = \"your-pypi-username\"\n$env:TWINE_PASSWORD = \"your-pypi-password\"\n\n# 2. \u6784\u5efa\u5305\nuv build\n\n# 3. \u53d1\u5e03\u5230 PyPI\npip install twine\ntwine upload dist/*\n```\n\n\u53d1\u5e03\u540e\uff0c\u4efb\u4f55\u4eba\u90fd\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\uff1a\n```bash\nuvx docx-mcp\n```\n\n## \ud83d\udd27 API \u529f\u80fd\n\n### 1. \u63d0\u53d6\u6587\u6863\u7ed3\u6784\n\n```python\nextract_document_structure(document_url: str) -> Dict\n```\n\n\u4ece URL \u4e0b\u8f7d .docx \u6587\u4ef6\u5e76\u63d0\u53d6\u5176\u7ed3\u6784\uff0c\u4e3a\u6bcf\u4e2a\u5143\u7d20\u5206\u914d\u552f\u4e00 ID\u3002\n\n**\u53c2\u6570:**\n- `document_url`: .docx \u6587\u4ef6\u7684 URL \u94fe\u63a5\n\n**\u8fd4\u56de:** \u5305\u542b\u6587\u6863\u7ed3\u6784\u7684\u5b57\u5178\uff0c\u6bcf\u4e2a\u5143\u7d20\u90fd\u6709\u552f\u4e00\u7684 ID\n\n### 2. \u5e94\u7528\u6587\u6863\u4fee\u6539\n\n```python\napply_modifications_to_document(\n    original_file_content_base64: str, \n    patches_json: str\n) -> str\n```\n\n\u5c06\u4e00\u7cfb\u5217\u4fee\u6539\u5e94\u7528\u5230 .docx \u6587\u4ef6\uff0c\u8fd4\u56de\u4fee\u6539\u540e\u7684\u6587\u4ef6\u5185\u5bb9\u3002\n\n**\u53c2\u6570:**\n- `original_file_content_base64`: \u539f\u59cb .docx \u6587\u4ef6\u7684 Base64 \u7f16\u7801\n- `patches_json`: JSON \u683c\u5f0f\u7684\u4fee\u6539\u6307\u4ee4\u5217\u8868\n\n**\u793a\u4f8b\u4fee\u6539\u6307\u4ee4:**\n```json\n[\n  {\n    \"element_id\": \"p_0\",\n    \"new_content\": \"\u65b0\u7684\u6bb5\u843d\u5185\u5bb9\"\n  },\n  {\n    \"element_id\": \"table_0_cell_0_0\",\n    \"new_content\": \"\u65b0\u7684\u8868\u683c\u5355\u5143\u683c\u5185\u5bb9\"\n  }\n]\n```\n\n### 3. \u83b7\u53d6\u4fee\u6539\u540e\u7684\u6587\u6863\n\n```python\nget_modified_document(\n    original_file_content_base64: str, \n    patches_json: str\n) -> str\n```\n\n`apply_modifications_to_document` \u7684\u522b\u540d\uff0c\u7528\u4e8e\u66f4\u6e05\u6670\u5730\u8868\u8fbe\u83b7\u53d6\u6700\u7ec8\u7ed3\u679c\u7684\u610f\u56fe\u3002\n\n### 4. \u51c6\u5907\u6587\u6863\u4e0b\u8f7d\n\n```python\nprepare_document_for_download(\n    original_file_content_base64: str, \n    patches_json: str\n) -> Dict\n```\n\n\u5c06\u4fee\u6539\u540e\u7684\u6587\u6863\u4e0a\u4f20\u5230\u963f\u91cc\u4e91 OSS\uff0c\u8fd4\u56de\u4e0b\u8f7d\u94fe\u63a5\u3002\n\n**\u8fd4\u56de\u793a\u4f8b:**\n```json\n{\n  \"success\": true,\n  \"download_url\": \"https://ggb-lzt.oss-cn-shenzhen.aliyuncs.com/modified_document_xxx.docx\",\n  \"file_name\": \"modified_document_xxx.docx\"\n}\n```\n\n### 5. \u4ece URL \u5904\u7406\u6587\u6863\n\n```python\nprocess_document_from_url(\n    document_url: str, \n    patches_json: str\n) -> Dict\n```\n\n\u76f4\u63a5\u4ece URL \u4e0b\u8f7d\u6587\u6863\uff0c\u5e94\u7528\u4fee\u6539\uff0c\u7136\u540e\u4e0a\u4f20\u5230 OSS\u3002\n\n## \ud83d\udcc1 \u9879\u76ee\u7ed3\u6784\n\n```\ndocx_mcp/\n\u251c\u2500\u2500 core/                    # \u6838\u5fc3\u529f\u80fd\u6a21\u5757\n\u2502   \u251c\u2500\u2500 docx_processor.py   # \u6587\u6863\u5904\u7406\u5668\n\u2502   \u2514\u2500\u2500 models.py           # \u6570\u636e\u6a21\u578b\u5b9a\u4e49\n\u251c\u2500\u2500 dist/                   # \u6784\u5efa\u8f93\u51fa\u76ee\u5f55\n\u2502   \u251c\u2500\u2500 docx_mcp-0.1.0-py3-none-any.whl\n\u2502   \u2514\u2500\u2500 docx_mcp-0.1.0.tar.gz\n\u251c\u2500\u2500 main.py                 # MCP \u670d\u52a1\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pyproject.toml         # \u9879\u76ee\u914d\u7f6e\u548c\u4f9d\u8d56\u5b9a\u4e49\n\u251c\u2500\u2500 requirements.txt       # \u5907\u7528\u4f9d\u8d56\u6587\u4ef6\uff08\u517c\u5bb9\u6027\uff09\n\u251c\u2500\u2500 uv.lock               # uv \u9501\u5b9a\u6587\u4ef6\n\u251c\u2500\u2500 LICENSE               # MIT \u8bb8\u53ef\u8bc1\n\u251c\u2500\u2500 PUBLISH.md            # \u53d1\u5e03\u6307\u5357\n\u251c\u2500\u2500 PRE_PUBLISH_CHECKLIST.md  # \u53d1\u5e03\u524d\u68c0\u67e5\u6e05\u5355\n\u251c\u2500\u2500 READY_TO_PUBLISH.md   # \u53d1\u5e03\u51c6\u5907\u8bf4\u660e\n\u251c\u2500\u2500 setup_pypi_credentials.py # PyPI \u51ed\u8bc1\u914d\u7f6e\u811a\u672c\n\u251c\u2500\u2500 publish.py            # \u81ea\u52a8\u5316\u53d1\u5e03\u811a\u672c\n\u251c\u2500\u2500 env.example           # \u73af\u5883\u53d8\u91cf\u914d\u7f6e\u6a21\u677f\n\u2514\u2500\u2500 README.md             # \u9879\u76ee\u6587\u6863\n```\n\n## \ud83d\udd10 \u914d\u7f6e\u8bf4\u660e\n\n### \u963f\u91cc\u4e91 OSS \u914d\u7f6e\n\n\u63a8\u8350\u4f7f\u7528\u73af\u5883\u53d8\u91cf\u914d\u7f6e OSS \u8bbf\u95ee\u4fe1\u606f\u3002\u590d\u5236 `env.example` \u6587\u4ef6\u5e76\u91cd\u547d\u540d\u4e3a `.env`\uff0c\u7136\u540e\u586b\u5165\u60a8\u7684\u5b9e\u9645\u914d\u7f6e\uff1a\n\n```bash\n# \u590d\u5236\u914d\u7f6e\u6a21\u677f\ncp env.example .env\n```\n\n\u5728 `.env` \u6587\u4ef6\u4e2d\u8bbe\u7f6e\uff1a\n\n```bash\nOSS_ACCESS_KEY=your_access_key_here\nOSS_SECRET_KEY=your_secret_key_here\nOSS_BUCKET_NAME=your_bucket_name\nOSS_DOMAIN=https://your-bucket.oss-cn-shenzhen.aliyuncs.com/\n```\n\n\u6216\u8005\u5728\u7cfb\u7edf\u73af\u5883\u53d8\u91cf\u4e2d\u8bbe\u7f6e\uff1a\n\n```bash\n# Windows PowerShell\n$env:OSS_ACCESS_KEY = \"your_access_key_here\"\n$env:OSS_SECRET_KEY = \"your_secret_key_here\"\n$env:OSS_BUCKET_NAME = \"your_bucket_name\"\n$env:OSS_DOMAIN = \"https://your-bucket.oss-cn-shenzhen.aliyuncs.com/\"\n\n# PyPI \u53d1\u5e03\u51ed\u8bc1\uff08\u53ef\u9009\uff09\n$env:TWINE_USERNAME = \"your-pypi-username\"\n$env:TWINE_PASSWORD = \"your-pypi-password\"\n\n# Linux/macOS\nexport OSS_ACCESS_KEY=\"your_access_key_here\"\nexport OSS_SECRET_KEY=\"your_secret_key_here\"\nexport OSS_BUCKET_NAME=\"your_bucket_name\"\nexport OSS_DOMAIN=\"https://your-bucket.oss-cn-shenzhen.aliyuncs.com/\"\n\n# PyPI \u53d1\u5e03\u51ed\u8bc1\uff08\u53ef\u9009\uff09\nexport TWINE_USERNAME=\"your-pypi-username\"\nexport TWINE_PASSWORD=\"your-pypi-password\"\n```\n\n\u26a0\ufe0f **\u5b89\u5168\u63d0\u793a**: \n- \u8bf7\u4e0d\u8981\u5c06\u654f\u611f\u4fe1\u606f\u63d0\u4ea4\u5230\u7248\u672c\u63a7\u5236\u7cfb\u7edf\n- `.env` \u6587\u4ef6\u5df2\u6dfb\u52a0\u5230 `.gitignore` \u4e2d\n- \u751f\u4ea7\u73af\u5883\u5efa\u8bae\u4f7f\u7528\u66f4\u5b89\u5168\u7684\u5bc6\u94a5\u7ba1\u7406\u65b9\u6848\n\n## \ud83d\udee0\ufe0f \u5f00\u53d1\u6307\u5357\n\n### \u6570\u636e\u6a21\u578b\n\n\u9879\u76ee\u4f7f\u7528 Pydantic \u5b9a\u4e49\u6570\u636e\u6a21\u578b\uff1a\n\n```python\nclass DocumentPatch(BaseModel):\n    element_id: str      # \u5143\u7d20\u552f\u4e00\u6807\u8bc6\u7b26\n    new_content: Any     # \u65b0\u5185\u5bb9\uff08\u652f\u6301\u591a\u79cd\u7c7b\u578b\uff09\n```\n\n### \u6269\u5c55\u529f\u80fd\n\n\u8981\u6dfb\u52a0\u65b0\u7684\u6587\u6863\u5904\u7406\u529f\u80fd\uff1a\n\n1. \u5728 `core/docx_processor.py` \u4e2d\u5b9e\u73b0\u5904\u7406\u903b\u8f91\n2. \u5728 `main.py` \u4e2d\u4f7f\u7528 `@mcp.tool()` \u88c5\u9970\u5668\u6ce8\u518c\u65b0\u7684 MCP \u5de5\u5177\n3. \u66f4\u65b0\u76f8\u5173\u7684\u6570\u636e\u6a21\u578b\n\n## \ud83e\udd1d \u8d21\u732e\u6307\u5357\n\n1. Fork \u672c\u4ed3\u5e93\n2. \u521b\u5efa\u529f\u80fd\u5206\u652f (`git checkout -b feature/AmazingFeature`)\n3. \u63d0\u4ea4\u66f4\u6539 (`git commit -m 'Add some AmazingFeature'`)\n4. \u63a8\u9001\u5230\u5206\u652f (`git push origin feature/AmazingFeature`)\n5. \u5f00\u542f Pull Request\n\n## \ud83d\udcdd \u8bb8\u53ef\u8bc1\n\n\u672c\u9879\u76ee\u57fa\u4e8e MIT \u8bb8\u53ef\u8bc1\u5f00\u6e90 - \u67e5\u770b [LICENSE](LICENSE) \u6587\u4ef6\u4e86\u89e3\u8be6\u60c5\u3002\n\n## \ud83d\udd17 \u76f8\u5173\u94fe\u63a5\n\n- [MCP \u5b98\u65b9\u6587\u6863](https://modelcontextprotocol.io/)\n- [FastMCP \u6846\u67b6](https://github.com/pydantic/fastmcp)\n- [python-docx \u6587\u6863](https://python-docx.readthedocs.io/)\n- [\u963f\u91cc\u4e91 OSS Python SDK](https://help.aliyun.com/document_detail/32026.html)\n\n## \u2753 \u5e38\u89c1\u95ee\u9898\n\n### Q: uvx \u548c uv \u6709\u4ec0\u4e48\u533a\u522b\uff1f\nA: uvx \u662f\u7528\u4e8e\u8fd0\u884c\u72ec\u7acb Python \u5de5\u5177\u7684\u5de5\u5177\uff0c\u7c7b\u4f3c npx\u3002\u5b83\u4f1a\u81ea\u52a8\u5904\u7406\u4f9d\u8d56\u548c\u73af\u5883\u9694\u79bb\uff0c\u66f4\u9002\u5408\u5de5\u5177\u578b\u5e94\u7528\u3002uv \u4e3b\u8981\u7528\u4e8e\u9879\u76ee\u4f9d\u8d56\u7ba1\u7406\u548c\u5f00\u53d1\u3002\n\n### Q: \u5982\u4f55\u5904\u7406\u5927\u6587\u4ef6\uff1f\nA: \u670d\u52a1\u652f\u6301\u901a\u8fc7 Base64 \u7f16\u7801\u5904\u7406\u5927\u6587\u4ef6\uff0c\u4f46\u5efa\u8bae\u6587\u4ef6\u5927\u5c0f\u4e0d\u8d85\u8fc7 50MB\u3002\n\n### Q: \u652f\u6301\u54ea\u4e9b\u6587\u6863\u683c\u5f0f\uff1f\nA: \u76ee\u524d\u4ec5\u652f\u6301 .docx \u683c\u5f0f\uff08Office 2007+ \u683c\u5f0f\uff09\u3002\n\n### Q: \u5982\u4f55\u81ea\u5b9a\u4e49 OSS \u914d\u7f6e\uff1f\nA: \u4fee\u6539 `main.py` \u4e2d\u7684 `OSS_CONFIG` \u5b57\u5178\uff0c\u6216\u8003\u8651\u4f7f\u7528\u73af\u5883\u53d8\u91cf\u3002\n\n### Q: uvx \u627e\u4e0d\u5230\u547d\u4ee4\u600e\u4e48\u529e\uff1f\nA: \u786e\u4fdd\u5df2\u5b89\u88c5 uv\uff0c\u7136\u540e uvx \u4f1a\u81ea\u52a8\u53ef\u7528\u3002\u5982\u679c\u4ecd\u6709\u95ee\u9898\uff0c\u53ef\u4ee5\u4f7f\u7528 `uv tool run docx-mcp` \u66ff\u4ee3\u3002\n\n---\n\n\ud83d\udca1 **\u63d0\u793a**: \u5982\u6709\u95ee\u9898\u6216\u5efa\u8bae\uff0c\u6b22\u8fce\u63d0\u4ea4 Issue \u6216 Pull Request\uff01\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A MCP (Model Context Protocol) service for Word document processing, providing document structure extraction, content modification and file management capabilities.",
    "version": "0.1.1",
    "project_urls": {
        "Documentation": "https://github.com/yourusername/docx_mcp#readme",
        "Homepage": "https://github.com/yourusername/docx_mcp",
        "Issues": "https://github.com/yourusername/docx_mcp/issues",
        "Repository": "https://github.com/yourusername/docx_mcp"
    },
    "split_keywords": [
        "document",
        " docx",
        " mcp",
        " microsoft",
        " office",
        " processing",
        " word"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "348f5220df53514992375402e040f7bd2176e284cd2014389997a88f25dbbc14",
                "md5": "b5fae977e6074c8f63e46042536c0a8f",
                "sha256": "7187e6e2b383e7c86e9a4cd4584a1a286679f416fed0d5c9a5f8031053943fcf"
            },
            "downloads": -1,
            "filename": "docx_mcp-0.1.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "b5fae977e6074c8f63e46042536c0a8f",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 72636,
            "upload_time": "2025-07-24T12:13:00",
            "upload_time_iso_8601": "2025-07-24T12:13:00.648401Z",
            "url": "https://files.pythonhosted.org/packages/34/8f/5220df53514992375402e040f7bd2176e284cd2014389997a88f25dbbc14/docx_mcp-0.1.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "54c56c8a1085924831f8b89cc8aa1ba6fab53d9a9583895dc14c9c77293bfadb",
                "md5": "9205781389e5a4ee3f486e9aba029131",
                "sha256": "31b409b22b054612c4de01a0f023dad5ac30356bf6173e115537aa8602ca2821"
            },
            "downloads": -1,
            "filename": "docx_mcp-0.1.1.tar.gz",
            "has_sig": false,
            "md5_digest": "9205781389e5a4ee3f486e9aba029131",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 57353,
            "upload_time": "2025-07-24T12:13:03",
            "upload_time_iso_8601": "2025-07-24T12:13:03.224927Z",
            "url": "https://files.pythonhosted.org/packages/54/c5/6c8a1085924831f8b89cc8aa1ba6fab53d9a9583895dc14c9c77293bfadb/docx_mcp-0.1.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-24 12:13:03",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "yourusername",
    "github_project": "docx_mcp#readme",
    "github_not_found": true,
    "lcname": "docx-mcp"
}
        
Elapsed time: 1.32776s