通过 MCP 协议直接从 Claude 调用 OpenAI 的模型进行对话和图像生成。支持在对话中直接显示生成的图像,并提供可配置的超时和重试机制。
+-----------------+
| |
| Claude Desktop |
| |
+--------+--------+
|
| MCP 协议
|
+-----------------------------+
| |
| MCP Server (OpenAI) |
| |
| +---------------------+ |
| | Server Core | |
| +---------------------+ |
| | |
| +---------------------+ |
| | Request Handler | |
| +---------------------+ |
| | |
| +---------------------+ |
| | Notification Manager| |
| +---------------------+ |
| | |
| +---------------------+ |
| | OpenAI Client | |
| +---------------------+ |
| |
+-----------------------------+
|
|
+-----------------+
| |
| OpenAI API |
| |
+-----------------+
-
Server Core
- 负责 MCP 协议的实现
- 处理请求路由和生命周期管理
- 提供配置管理和错误处理
-
Request Handler
- 处理具体的请求类型
- 实现请求参数验证和转换
- 管理请求超时和重试逻辑
-
Notification Manager
- 管理进度通知的生命周期
- 实现可靠的通知发送机制
- 处理通知的取消和清理
-
OpenAI Client
- 封装 OpenAI API 调用
- 处理响应转换和错误处理
- 实现 API 限流和重试策略
- 支持 GPT-4 和 GPT-3.5-turbo 模型
- 可调整温度和响应长度等参数
- 支持流式响应
- 支持 DALL·E 2 和 DALL·E 3
- 直接在对话中显示生成的图像
- 可配置的超时时间和重试机制
- 多种图像尺寸和质量选项
- 批量图像生成能力
项目使用 anyio
作为异步运行时,支持在 asyncio 和 trio 上运行。主要的异步处理包括:
- 请求处理
async def handle_request(self, request: Request) -> Response:
async with anyio.create_task_group() as tg:
response = await tg.start(self._process_request, request)
tg.cancel_scope.cancel()
return response
- 通知管理
class NotificationManager:
async def __aenter__(self):
await self.initialize()
return self
async def __aexit__(self, exc_type, exc_val, exc_tb):
await self.cleanup()
- 超时控制
async def with_timeout(timeout: float):
async with anyio.move_on_after(timeout) as scope:
yield scope
- 请求层错误处理
try:
response = await self.process_request(request)
except RequestError as e:
return self.handle_request_error(e)
except Exception as e:
return self.handle_unexpected_error(e)
- API 调用重试机制
async def call_api_with_retry(self, func, *args, **kwargs):
for attempt in range(self.max_retries):
try:
return await func(*args, **kwargs)
except APIError as e:
if not self.should_retry(e):
raise
await self.wait_before_retry(attempt)
我们使用 uv 作为依赖管理工具,它提供了更快的包安装和依赖解析速度。如果你还没有安装 uv,可以参考官方文档进行安装。
- 克隆仓库并设置环境:
git clone https://github.com/donghao1393/mcp-openai
cd mcp-openai
# 使用 uv 创建和激活虚拟环境
uv venv
source .venv/bin/activate # Linux/macOS
# 或
.venv\Scripts\activate # Windows
# 安装依赖
uv pip install -e .
- 在
claude_desktop_config.json
中添加服务配置:
{
"mcpServers": {
"openai-server": {
"command": "uv",
"args": [
"--directory",
"/path/to/mcp-openai",
"run",
"mcp-openai"
],
"env": {
"OPENAI_API_KEY": "your-key-here"
}
}
}
}
此工具提供与 OpenAI 语言模型的交互功能:
query
: 您的问题或提示model
: 可选择 "gpt-4" 或 "gpt-3.5-turbo"temperature
: 控制响应的随机性,范围为 0-2max_tokens
: 最大响应长度,范围为 1-4000
示例:
response = await client.ask_openai(
query="解释什么是量子计算",
model="gpt-4",
temperature=0.7,
max_tokens=500
)
此工具提供 DALL·E 图像生成功能:
prompt
: 您想要生成的图像描述model
: 可选择 "dall-e-3" 或 "dall-e-2"size
: 图像尺寸- DALL·E 3支持: "1024x1024"(方形)、"1792x1024"(横屏)、"1024x1792"(竖屏)
- DALL·E 2支持: "1024x1024"、"512x512"、"256x256"
quality
: 图像质量,可选 "standard" 或 "hd"(仅DALL·E 3支持hd选项)n
: 生成图像的数量,范围为 1-10
示例:
# 生成横屏图像
images = await client.create_image(
prompt="一只在月光下奔跑的狼",
model="dall-e-3",
size="1792x1024", # 横屏尺寸
quality="hd",
n=1
)
# 生成竖屏图像
images = await client.create_image(
prompt="一座古老的灯塔",
model="dall-e-3",
size="1024x1792", # 竖屏尺寸
quality="standard",
n=1
)
-
Python 代码风格
- 遵循 PEP 8 规范
- 使用 black 进行代码格式化
- 使用 pylint 进行代码质量检查
-
异步编程规范
- 使用 async/await 语法
- 正确处理异步上下文管理器
- 适当使用任务组和取消作用域
- VS Code 或 PyCharm 作为 IDE
pylint
和black
用于代码质量检查和格式化pytest
用于单元测试
-
服务启动问题
- 检查虚拟环境是否正确激活
- 验证所有依赖是否正确安装
- 确认 PYTHONPATH 设置
- 验证 OpenAI API key 有效性
-
运行时错误
- ModuleNotFoundError: 检查 PYTHONPATH 和依赖安装
- ImportError: 使用
uv pip list
验证包安装状态 - 启动失败: 检查 Python 版本 (>=3.10)
-
对于复杂的图像生成任务:
- 适当增加 timeout 参数的值,特别是使用 DALL·E 3 时
- 调整 max_retries 参数
- 简化图像描述
- 考虑使用 DALL·E 2,响应时间通常更短
-
批量任务处理:
- 每个图像预留至少 60 秒处理时间
- 使用适当的并发控制
- 实现请求队列和限流
- 重构了图像生成实现,使用 OpenAI 原生 URL
- 为生成图片添加了原图下载链接
- 优化了图像压缩显示流程
- 支持 DALL·E 3 的横竖屏尺寸
- 添加了 uv 包管理器支持
- 优化了项目结构
- 改进了异步操作的稳定性
- 增强了错误处理机制
- 添加了可配置的超时和重试机制
- 优化了图像生成的错误处理流程
- 增强了用户反馈信息的详细程度
- 实现了图像直接显示在对话中的功能
- 优化了错误处理和响应格式
- 引入了基于 anyio 的异步处理框架
MIT 许可证