# 导入错误修复说明
## 问题描述
服务启动时出现以下错误:
```
ImportError: attempted relative import with no known parent package
```
## 原因分析
当使用 `python src/mcp_reminder/server.py` 直接运行文件时,Python不知道这是一个包的一部分,导致相对导入(`from .models import`)失败。
## 解决方案
### 1. 修改导入方式
**修改前 (server.py):**
```python
from .models import Alarm, Todo, parse_time
from .storage import JSONStorage
```
**修改后 (server.py):**
```python
import sys
import os
# Add src directory to Python path
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..'))
from mcp_reminder.models import Alarm, Todo, parse_time
from mcp_reminder.storage import JSONStorage
```
### 2. 创建独立入口点
创建了 `run_server.py` 作为服务的主入口点,放在项目根目录:
```python
"""MCP Reminder Service Entry Point"""
import sys
import os
# Add src directory to Python path
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src'))
# Import and run the server
from mcp_reminder.server import mcp
if __name__ == "__main__":
mcp.run(transport="stdio")
```
### 3. 更新启动脚本
所有启动脚本都已更新为使用新的入口点:
**修改前:**
```bash
uv run python mcp_pipe.py src/mcp_reminder/server.py
```
**修改后:**
```bash
uv run python mcp_pipe.py run_server.py
```
## 测试验证
```bash
# 测试模块导入
cd mcp-reminder
uv run python -c "import sys; sys.path.insert(0, 'src'); from mcp_reminder.server import mcp; print('Import successful')"
# 测试服务启动
uv run python run_server.py
```
## 影响的文件
- ✅ `src/mcp_reminder/server.py` - 修改导入方式
- ✅ `run_server.py` - 新建入口点文件
- ✅ `start.ps1` - 更新启动命令
- ✅ `start.bat` - 更新启动命令
- ✅ `start.sh` - 更新启动命令
- ✅ `README.md` - 更新文档
- ✅ `WINDOWS_SETUP.md` - 更新文档
- ✅ `start_xiaozhi.py` - 更新示例命令
## 现在可以正常使用
运行以下任一启动脚本:
- **PowerShell:** `.\start.ps1`
- **CMD:** `start.bat`
- **Linux/Mac:** `./start.sh`
或手动启动:
```bash
export MCP_ENDPOINT="wss://api.xiaozhi.me/mcp/?token=YOUR_TOKEN"
uv run python mcp_pipe.py run_server.py
```
## 技术说明
这种修复方式的优点:
1. ✅ 兼容mcp_pipe.py的直接文件执行方式
2. ✅ 保持包结构的模块化
3. ✅ 无需修改mcp_pipe.py
4. ✅ 符合Python最佳实践
5. ✅ 易于维护和调试