Skip to main content
Glama
leeguooooo
by leeguooooo
CRITICAL_FIXES.md18.6 kB
# 🔧 关键Bug修复记录 ## Leo Review 发现的问题及修复 感谢 Leo 的细致 review!以下是发现并修复的关键问题: ### ❌ 问题 1: 缺少必需的 import (高优先级) **位置**: `scripts/email_monitor_api.py:9 & :278` **问题**: - 代码中使用了 `json.dumps()` 和 `List[str]` - 但顶部没有 `import json` 和 `from typing import List` - 第一次调用 `/api/translate-unread` 或 `/api/mark-read` 就会抛 `NameError` **修复**: ```python # 修改前 import sys import os from pathlib import Path from typing import Dict, Any # 修改后 import sys import os import json # ✅ 添加 from pathlib import Path from typing import Dict, Any, List # ✅ 添加 List ``` **影响**: 🔴 严重 - 直接导致运行时错误 --- ### ❌ 问题 2: 缺少 openai 依赖 (高优先级) **位置**: `scripts/email_translator.py:45` **问题**: - 模块直接 `import openai` 并实例化 `openai.OpenAI(...)` - 但 `pyproject.toml` 中没有 `openai` 依赖 - 部署后会抛 `ImportError: No module named 'openai'` **修复**: ```toml # pyproject.toml dependencies = [ "mcp>=0.1.0", "python-dotenv>=1.0.0", "schedule>=1.2.2", "requests>=2.31.0", "fastapi>=0.119.0", "uvicorn>=0.34.3", "openai>=1.0.0", # ✅ 添加 ] ``` **验证**: ```bash $ uv sync ✅ Installed openai==2.3.0 ``` **影响**: 🔴 严重 - 翻译功能完全不可用 --- ### ❌ 问题 3: EMAIL_API_URL 路径拼接错误 (高优先级) **位置**: - `config_templates/env.n8n.example:18` - `scripts/deploy_http_workflow.py:94` **问题**: - 示例将 `EMAIL_API_URL` 设为 `https://your-domain.com/api/check-emails` - n8n 工作流会在此基础上拼接 `/api/translate-unread` - 最终 URL 变成:`https://your-domain.com/api/check-emails/api/translate-unread` - 导致 **404 错误** **修复前**: ```bash # ❌ 错误示例 EMAIL_API_URL=https://your-domain.com/api/check-emails # n8n 工作流中 "url": "={{ $env.EMAIL_API_URL }}/api/translate-unread" # 结果 (错误) https://your-domain.com/api/check-emails/api/translate-unread ``` **修复后**: ```bash # ✅ 正确示例 EMAIL_API_URL=https://your-domain.com # n8n 工作流中 "url": "={{ $env.EMAIL_API_URL }}/api/translate-unread" # 结果 (正确) https://your-domain.com/api/translate-unread ``` **修改内容**: 1. **config_templates/env.n8n.example**: ```bash # 修改前 EMAIL_API_URL=https://your-domain.com/api/check-emails # 修改后 # API 基础地址 (在 n8n 环境变量中也要设置) # 注意:只设置域名,不要包含具体的 API 端点 EMAIL_API_URL=https://your-domain.com ``` 2. **scripts/deploy_http_workflow.py**: ```python # 修改前 print(f" 示例: https://your-domain.com/api/check-emails") # 修改后 print(f" 变量值: 你的邮件 API 基础地址(不要包含 /api/xxx 路径)") print(f" 示例: https://your-domain.com") print(f" ⚠️ 注意:只填域名,具体端点由工作流自动拼接") ``` **影响**: 🔴 严重 - 所有 API 调用都会 404 **额外修复**: n8n 工作流也需要正确拼接路径: ```json // n8n/email_monitoring_http_workflow.json { "url": "={{ $env.EMAIL_API_URL }}/api/check-emails" // ✅ 拼接完整路径 } // n8n/email_translate_workflow.json { "url": "={{ $env.EMAIL_API_URL }}/api/translate-unread" // ✅ 拼接完整路径 } { "url": "={{ $env.EMAIL_API_URL }}/api/mark-read" // ✅ 拼接完整路径 } ``` **一致性原则**: - 环境变量 `EMAIL_API_URL` = 基础域名(如 `https://your-domain.com`) - n8n 工作流拼接具体端点(如 `/api/check-emails`) - 最终请求 URL = `https://your-domain.com/api/check-emails` ✅ --- ## ✅ 修复验证 ### 1. Import 验证 ```python # 测试 import scripts.email_monitor_api as api # ✅ 不会报 NameError ``` ### 2. OpenAI 依赖验证 ```bash $ uv run python -c "import openai; print(openai.__version__)" 2.3.0 # ✅ 成功 ``` ### 3. URL 拼接验证 ```bash # 设置环境变量 EMAIL_API_URL=https://e.httpmisonote.com # n8n 工作流拼接 $EMAIL_API_URL/api/translate-unread # ✅ 正确: https://e.httpmisonote.com/api/translate-unread # 而不是 # ❌ 错误: https://e.httpmisonote.com/api/check-emails/api/translate-unread ``` --- ## 📋 修复总结 | 问题 | 优先级 | 状态 | 影响范围 | |------|--------|------|----------| | 缺少 json/List import | 🔴 高 | ✅ 已修复 | API 运行时错误 | | 缺少 openai 依赖 | 🔴 高 | ✅ 已修复 | 翻译功能不可用 | | URL 路径拼接错误 | 🔴 高 | ✅ 已修复 | 所有 API 调用 404 | --- ## 5. 🔧 SECURITY_SETUP_GUIDE URL 示例不一致 **发现者**: Leo Review **严重程度**: 高 **影响**: 按文档配置会导致 404 错误 ### 问题描述 `SECURITY_SETUP_GUIDE.md` 中三处示例仍使用完整端点: ```bash EMAIL_API_URL=https://your-domain.com/api/check-emails ``` 这与实际配置要求不一致,工作流会拼接成: ``` https://your-domain.com/api/check-emails/api/translate-unread # ❌ 404 ``` ### 修复方案 统一所有文档中的 `EMAIL_API_URL` 示例: **修复位置 1 - 表格**: ```markdown | `EMAIL_API_URL` | 邮件 API 基础地址 | `https://your-domain.com` (不含 /api/xxx) | ``` **修复位置 2 - .env 文件示例**: ```bash # 注意:只填基础域名,不要包含 /api/xxx 路径 # 具体端点由 n8n 工作流自动拼接 EMAIL_API_URL=https://your-domain.com ``` **修复位置 3 - 快速部署示例**: ```bash export EMAIL_API_URL="https://your-domain.com" # 只填域名 ``` **添加详细说明**: ```markdown **URL 配置示例**: ✅ 正确: EMAIL_API_URL=https://your-domain.com ❌ 错误: EMAIL_API_URL=https://your-domain.com/api/check-emails 工作流会自动拼接成: - https://your-domain.com/api/translate-unread - https://your-domain.com/api/mark-read - https://your-domain.com/api/check-emails ``` ### 测试验证 ```bash # 验证所有文档中的 URL 配置一致性 grep "EMAIL_API_URL.*https" \ SECURITY_SETUP_GUIDE.md \ config_templates/env.n8n.example \ HTTP_API_QUICK_START.md ``` ### 影响范围 - ✅ `SECURITY_SETUP_GUIDE.md` 已修复(3处) - ✅ `config_templates/env.n8n.example` 已正确 - ✅ 所有工作流 JSON 已正确拼接路径 - ✅ 部署脚本说明已更新 --- ## 6. 🔧 README 目录名和依赖问题 **发现者**: Leo Review **严重程度**: 高 ### 问题 1: 目录名不匹配 **位置**: README.md:66 Git clone 的仓库名是 `email-mcp-service`,但文档写的是 `cd mcp-email-service`,导致 cd 失败。 **修复**: ```bash # 修改前 git clone https://github.com/leeguooooo/email-mcp-service.git cd mcp-email-service # ❌ 错误 # 修改后 git clone https://github.com/leeguooooo/email-mcp-service.git cd email-mcp-service # ✅ 正确 ``` ### 问题 2: 缺少开发工具依赖 **位置**: README.md:233-269 文档要求运行 `black`, `ruff`, `mypy`,但这些工具未在依赖中声明,会导致 `ModuleNotFoundError`。 **修复**: 1. **添加到 pyproject.toml**: ```toml [project.optional-dependencies] dev = [ "pytest>=7.4.0", "pytest-asyncio>=0.21.0", "pytest-cov>=4.0.0", "black>=23.0.0", # 新增 "ruff>=0.1.0", # 新增 "mypy>=1.0.0", # 新增 ] ``` 2. **更新 README 提供两种方式**: **方式 1** - 安装为依赖(推荐): ```bash uv sync --extra dev uv run black src/ ``` **方式 2** - 使用 uvx(无需安装): ```bash uvx black src/ ``` ### 影响范围 - ✅ README.md - 所有目录名已统一 - ✅ README.md - 代码质量工具说明已更新 - ✅ pyproject.toml - dev 依赖已添加 --- ## 7. 🔧 文件移动后路径未更新 **发现者**: Leo Review **严重程度**: 高 ### 问题描述 项目结构清理后,多处路径引用未更新,导致运行时错误和文档链接断裂。 ### 问题列表 #### 1. Smithery 启动命令路径错误 **位置**: `.smithery/smithery.yaml:15` **问题**: ```yaml startCommand: python3 smithery_wrapper.py # ❌ 文件已移至 .smithery/ ``` **影响**: Smithery 服务无法启动 **修复**: ```yaml startCommand: python3 .smithery/smithery_wrapper.py # ✅ 正确路径 ``` #### 2. Dockerfile 路径错误 **位置**: - `docker/Dockerfile.optimized:41` - `docker/Dockerfile.optional:35` **问题**: ```dockerfile CMD ["python", "smithery_wrapper.py"] # ❌ 文件已移动 ``` **影响**: Docker 容器启动时崩溃 "file not found" **修复**: ```dockerfile CMD ["python", ".smithery/smithery_wrapper.py"] # ✅ 正确路径 ``` #### 3. README 文档链接断裂 **位置**: `README.md:38` 和 `README.md:313` **问题**: ```markdown [N8N_EMAIL_MONITORING_GUIDE.md](N8N_EMAIL_MONITORING_GUIDE.md) [SECURITY_SETUP_GUIDE.md](SECURITY_SETUP_GUIDE.md) ``` **影响**: 文档链接 404 **修复**: ```markdown [N8N_EMAIL_MONITORING_GUIDE.md](docs/guides/N8N_EMAIL_MONITORING_GUIDE.md) [SECURITY_SETUP_GUIDE.md](docs/guides/SECURITY_SETUP_GUIDE.md) ``` ### 影响范围 - ✅ `.smithery/smithery.yaml` - 启动命令已更新 - ✅ `docker/Dockerfile.optimized` - CMD 路径已修复 - ✅ `docker/Dockerfile.optional` - CMD 路径已修复 - ✅ `README.md` - 文档链接已修复(2处) ### 验证方法 ```bash # 1. 验证 Smithery 启动 grep "startCommand" .smithery/smithery.yaml # 2. 验证 Dockerfile grep "smithery_wrapper" docker/Dockerfile.* # 3. 验证 README 链接 grep -n "GUIDE.md\](" README.md | grep -v "docs/guides" # 4. 测试文件存在 test -f .smithery/smithery_wrapper.py && echo "✅ Wrapper 文件存在" ``` --- ## 8. 🔧 Smithery Wrapper 路径问题 **发现者**: Leo Review **严重程度**: 🔴 关键(阻断性问题) ### 问题描述 将 `smithery_wrapper.py` 移至 `.smithery/` 后,未更新其内部路径引用,导致: 1. 启动时找不到 `accounts.json` 2. 无法加载 `src/main.py` 3. Smithery 和 Docker 立即退出 同时 `smithery.yaml` 移至 `.smithery/` 后,Smithery CLI 无法找到配置文件。 ### 问题 1: Wrapper 内部路径错误 **位置**: `.smithery/smithery_wrapper.py:15-36` **问题**: ```python # ❌ 错误: 在 .smithery/ 目录中查找 config_path = Path(__file__).parent / "accounts.json" main_py = Path(__file__).parent / "src" / "main.py" ``` **影响**: - 查找 `.smithery/accounts.json`(不存在) - 查找 `.smithery/src/main.py`(不存在) - Smithery 启动失败: "Email accounts not configured" - Docker 容器立即退出 **修复**: ```python # ✅ 正确: 返回到仓库根目录 repo_root = Path(__file__).resolve().parents[1] # .smithery/ 的父目录 config_path = repo_root / "accounts.json" main_py = repo_root / "src" / "main.py" ``` ### 问题 2: smithery.yaml 位置错误 **问题**: Smithery CLI (`npx @smithery/cli install`) 需要在仓库根目录找到 `smithery.yaml` **影响**: ```bash npx @smithery/cli install mcp-email-service --client claude # ❌ Error: Cannot find smithery.yaml ``` **解决方案**: ```bash # ✅ smithery.yaml 必须在根目录 mcp-email-service/ ├── smithery.yaml ← 必须在这里 ├── smithery-minimal.yaml ├── smithery-debug.yaml └── .smithery/ └── smithery_wrapper.py ← 只有 wrapper 在子目录 ``` ### 影响范围 - ✅ `.smithery/smithery_wrapper.py` - 路径已修复为使用 `parents[1]` - ✅ `smithery.yaml` - 已移回根目录 - ✅ `smithery-minimal.yaml` - 已移回根目录 - ✅ `smithery-debug.yaml` - 已移回根目录 - ✅ `.smithery/` - 现在只包含 `smithery_wrapper.py` ### 验证方法 ```bash # 1. 验证 wrapper 路径逻辑 python3 -c " from pathlib import Path wrapper = Path('.smithery/smithery_wrapper.py') repo_root = wrapper.resolve().parents[1] print(f'Repo root: {repo_root}') print(f'accounts.json exists: {(repo_root / \"accounts.json\").exists()}') print(f'src/main.py exists: {(repo_root / \"src\" / \"main.py\").exists()}') " # 2. 验证 smithery.yaml 位置 test -f smithery.yaml && echo "✅ smithery.yaml 在根目录" # 3. 验证 Smithery 可以找到配置 npx @smithery/cli validate # 4. 测试 wrapper 启动 python3 .smithery/smithery_wrapper.py ``` ### 关键学习 **路径计算规则**: ```python # 如果文件在根目录 Path(__file__).parent # = 根目录 ✅ # 如果文件在子目录 .smithery/ Path(__file__).parent # = .smithery/ 目录 ❌ Path(__file__).resolve().parents[0] # = .smithery/ 目录 ❌ Path(__file__).resolve().parents[1] # = 根目录 ✅ ``` --- ## 9. 🔧 Docker 构建和依赖问题 **发现者**: Leo Review **严重程度**: 🔴 高(影响部署) ### 问题 1: .dockerignore 位置错误 **位置**: `docker/.dockerignore` **问题**: 将 `.dockerignore` 移至 `docker/` 目录后,Docker 构建时无法读取忽略规则。 **原因**: Docker 只在**构建上下文根目录**(`.`)查找 `.dockerignore`,不会在子目录中查找。 **影响**: ```bash docker build -f docker/Dockerfile.optimized . # ❌ 不会读取 docker/.dockerignore # ❌ 数据库、日志、配置等敏感文件被打包进镜像 ``` **后果**: - 镜像体积变大(包含 .db, .log 文件) - 敏感信息泄露(accounts.json, .env) - 构建时间变长 **修复**: ```bash # ✅ .dockerignore 必须在根目录 mcp-email-service/ ├── .dockerignore ← 必须在这里 └── docker/ ├── Dockerfile.optimized └── Dockerfile.optional ``` **替代方案**(未采用): ```bash # 使用 --ignorefile 参数(需要 Docker 23.0+) docker build -f docker/Dockerfile.optimized --ignorefile docker/.dockerignore . ``` ### 问题 2: requirements.txt 依赖缺失 **位置**: `requirements.txt:1` **问题**: `requirements.txt` 只包含旧的核心依赖,缺少新功能所需的包。 **缺失的依赖**: ```python # ❌ 缺失但必需的包 requests>=2.31.0 # HTTP 请求(n8n 部署等) fastapi>=0.119.0 # HTTP API 服务 uvicorn>=0.34.3 # ASGI 服务器 openai>=1.0.0 # AI 翻译和总结 ``` **影响**: ```bash # Docker 构建或手动安装 pip install -r requirements.txt # 运行 API 服务 python scripts/email_monitor_api.py # ❌ ModuleNotFoundError: No module named 'fastapi' # 使用翻译功能 # ❌ ModuleNotFoundError: No module named 'openai' ``` **修复**: 同步 `pyproject.toml` 中的所有运行时依赖到 `requirements.txt`: ```txt # Core MCP dependencies mcp>=0.1.0 python-dotenv>=1.0.0 schedule>=1.2.2 # HTTP API and email operations requests>=2.31.0 fastapi>=0.119.0 uvicorn>=0.34.3 # AI features (translation & summarization) openai>=1.0.0 ``` ### 影响范围 - ✅ `.dockerignore` - 已移回根目录 - ✅ `requirements.txt` - 已同步所有依赖 - ✅ `docker/README.md` - 构建说明正确(使用根目录上下文) ### 验证方法 ```bash # 1. 验证 .dockerignore 位置 test -f .dockerignore && echo "✅ .dockerignore 在根目录" # 2. 验证 Docker 构建(不打包敏感文件) docker build -f docker/Dockerfile.optimized -t test:latest . docker run --rm test:latest ls -la | grep -E "\.db|\.env|accounts\.json" # 应该为空(这些文件被忽略) # 3. 验证依赖完整性 python3 -c " import sys missing = [] for pkg in ['fastapi', 'uvicorn', 'openai', 'requests']: try: __import__(pkg) except ImportError: missing.append(pkg) if missing: print(f'❌ 缺失: {missing}') sys.exit(1) print('✅ 所有依赖已安装') " # 4. 对比 requirements.txt 和 pyproject.toml diff <(grep -E "^[a-z]" requirements.txt | cut -d'>=' -f1 | sort) \ <(python3 -c "import tomllib; print('\n'.join(sorted([d.split('>=')[0] for d in tomllib.load(open('pyproject.toml','rb'))['project']['dependencies']])))") ``` ### 关键学习 **Docker 构建上下文**: ```bash # 构建命令结构 docker build [OPTIONS] PATH # PATH 是构建上下文根目录 docker build -f docker/Dockerfile.optimized . # ^ 这是上下文根目录 # Docker 在 . 目录查找 .dockerignore,不是 docker/ ``` **依赖管理最佳实践**: ```python # 方案 1: 从 pyproject.toml 生成 requirements.txt uv pip compile pyproject.toml -o requirements.txt # 方案 2: 手动同步 # 每次更新 pyproject.toml 后,同步更新 requirements.txt # 方案 3: 在 Docker 中直接用 pyproject.toml # pip install . # 或 # uv sync --no-dev ``` --- ## 🎯 教训 1. **Import 检查**: 所有使用的模块和类型都要显式导入 2. **依赖管理**: 使用的第三方库必须在 `pyproject.toml` 中声明(包括开发工具) 3. **URL 设计**: 环境变量应该是"基础路径",不应包含具体端点 4. **文档一致性**: 所有示例文档必须与实际配置保持一致 5. **目录命名**: README 中的 `cd` 命令必须与实际 git clone 的目录名匹配 6. **路径更新**: 移动文件后必须更新所有引用(配置、文档、Docker) 7. **相对路径**: 移动文件到子目录时,必须更新内部路径计算逻辑 8. **工具约定**: 某些工具(如 Smithery、Docker)期望配置文件在特定位置 9. **依赖同步**: requirements.txt 和 pyproject.toml 必须保持同步 10. **Review 重要性**: 详细的 code review 能发现细节问题 --- ## ✨ Review 建议采纳 所有 Leo review 发现的问题都已修复: **第一轮 Review**: - ✅ 缺失的 import 已添加 (json, List) - ✅ 依赖包已加入 pyproject.toml (openai) - ✅ URL 配置逻辑统一 **第二轮 Review**: - ✅ SECURITY_SETUP_GUIDE URL 配置一致性 - ✅ 所有文档示例统一 **第三轮 Review**: - ✅ README 目录名匹配问题已修复 - ✅ 开发工具依赖已添加 (black, ruff, mypy) - ✅ 提供两种代码质量工具使用方式 **第四轮 Review**(项目清理后): - ✅ Smithery 启动命令路径已修复 - ✅ Dockerfile CMD 路径已修复(2个文件) - ✅ README 文档链接已修复(2处) **第五轮 Review**(关键阻断问题): - ✅ Smithery wrapper 内部路径已修复(使用 `parents[1]`) - ✅ smithery.yaml 已移回根目录(工具要求) - ✅ 其他 smithery yaml 也已移回根目录 - ✅ `.smithery/` 现在只包含 wrapper 文件 **第六轮 Review**(Docker 和依赖问题): - ✅ `.dockerignore` 已移回根目录(Docker 构建要求) - ✅ `requirements.txt` 已同步所有运行时依赖 - ✅ 添加 fastapi, uvicorn, openai, requests 现在代码可以正常运行了!感谢仔细的 code review 🙏

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/leeguooooo/email-mcp-service'

If you have feedback or need assistance with the MCP directory API, please join our Discord server