通过MCP协议集成ChatGPT桌面应用,实现AI助手无缝协作
1. 项目概述与核心价值
最近在折腾AI工作流,发现一个痛点:我经常在Claude Desktop或者Cursor这类支持MCP协议的AI助手里面写代码、分析问题,但有时候需要调用ChatGPT的能力,比如让它帮我润色一段英文,或者用它的代码解释器跑个数据分析。每次都得手动切到ChatGPT的桌面应用,复制粘贴,再切回来,效率很低。直到我发现了xncbf开发的这个chatgpt-mcp项目,它完美地解决了这个问题。
简单来说,chatgpt-mcp是一个实现了模型上下文协议(Model Context Protocol, MCP)的服务器。它的核心功能是作为一个“桥梁”,让任何兼容MCP的AI助手(比如Claude Desktop、Cursor、Windsurf等)能够直接与macOS系统上运行的ChatGPT桌面应用进行交互。这意味着,你可以在你常用的AI助手界面里,直接通过命令或工具调用,让ChatGPT在后台帮你处理任务,然后把结果带回来,整个过程无需离开你当前的工作环境。
这个项目的价值在于自动化与集成。对于深度依赖多个AI模型协作的开发者或内容创作者来说,它打破了应用间的壁垒。想象一下,你在Claude里讨论一个复杂的技术方案,可以随时让Claude调用ChatGPT来生成一段示例代码或进行多角度批判性分析;或者在处理文档时,无缝调用ChatGPT进行翻译或总结。这不仅仅是省去了切换窗口的麻烦,更是将ChatGPT的能力变成了你主AI助手的一个可编程“插件”,极大地扩展了工作流的可能性。
2. 核心原理与技术栈拆解
要理解chatgpt-mcp如何工作,我们需要拆解两个核心部分:MCP协议本身,以及该项目如何与ChatGPT桌面应用交互。
2.1 模型上下文协议(MCP)是什么?
MCP是由Anthropic提出的一种开放协议,旨在标准化AI助手与外部工具、数据源之间的通信方式。你可以把它想象成AI世界的“USB协议”或“插件接口标准”。在MCP架构中:
- MCP客户端(Client):通常是AI助手本身,如Claude Desktop。它知道如何发送请求和解析响应。
- MCP服务器(Server):比如
chatgpt-mcp,它提供具体的“能力”或“工具”。服务器向客户端宣告自己有哪些工具可用(例如ask_chatgpt)。 - 通信:客户端和服务器通过标准化的JSON-RPC over stdio(标准输入输出)或SSE进行通信。当你在AI助手中输入指令触发某个工具时,客户端会向对应的服务器发送一个结构化的请求,服务器执行操作后返回结果。
chatgpt-mcp的角色就是一个MCP服务器,它向AI助手宣告:“我这里有三个工具:发送消息、获取回复、新建对话。”
2.2 与ChatGPT桌面应用的交互机制
这是该项目最巧妙也最具平台限制性的部分。它并不通过ChatGPT的官方API,而是通过macOS的自动化框架直接操控ChatGPT桌面应用的用户界面(UI)。主要依赖以下技术:
AppleScript:这是macOS系统级的脚本语言,专门用于控制应用程序。
chatgpt-mcp内部使用AppleScript来模拟用户操作,例如:- 激活ChatGPT应用窗口。
- 将文本粘贴到输入框。
- 模拟按下“发送”按钮(或回车键)。
- 从应用界面上读取最新的回复文本。
可访问性API:为了更可靠地定位应用窗口中的文本框、按钮等UI元素,项目可能用到了macOS的辅助功能(Accessibility)API。这允许脚本以编程方式查询和操作界面元素,即使它们没有标准的AppleScript支持。
Python与FastMCP:项目使用Python编写,并采用了
fastmcp库。fastmcp是一个用于快速构建MCP服务器的Python框架,它极大地简化了工具定义、资源声明和服务器启动的流程。开发者只需要用装饰器定义工具函数,fastmcp会处理所有MCP协议层的通信细节。
注意:这种基于UI自动化的方式决定了其核心限制。首先,它仅支持macOS,因为AppleScript是macOS特有的。其次,它严重依赖ChatGPT桌面应用的UI布局稳定性。如果OpenAI更新了应用界面,改变了按钮的标识符或文本区域的结构,自动化脚本就可能失效,需要更新。这也是为什么项目目前只明确支持英文和韩文系统语言——它需要精确匹配UI上的按钮文字(如“Send”)来触发操作。
3. 环境准备与安装详解
在开始之前,请确保你的系统满足所有先决条件。这一步的准备工作是否扎实,直接决定了后续能否顺利运行。
3.1 前置条件检查清单
- 操作系统:必须是macOS。本项目无法在Windows或Linux上运行。建议系统版本在macOS Monterey (12) 或更高版本,以确保AppleScript和可访问性API的兼容性。
- ChatGPT桌面应用:从OpenAI官网下载并安装最新版的ChatGPT for macOS。安装后,务必先登录你的账号,并让应用保持运行状态。最好将其固定在程序坞(Dock)上,并确保它拥有辅助功能权限(后面会详述)。
- Python环境:需要Python 3.10或更高版本。推荐使用
pyenv来管理多个Python版本,避免与系统Python冲突。可以通过终端运行python3 --version来检查。 - uv包管理器:这是一个用Rust编写的、速度极快的Python包管理器和项目工作流工具。它类似于
pip和poetry的结合体,是本项目推荐的安装方式。安装命令如下:
安装完成后,重启终端或运行# 使用curl安装 curl -LsSf https://astral.sh/uv/install.sh | shsource ~/.zshrc(如果你使用Zsh)使uv命令生效。
3.2 关键权限配置:辅助功能
由于项目需要通过脚本控制另一个应用,macOS的安全机制要求你明确授予权限。这是安装过程中最容易出错的一步。
- 打开系统设置(System Settings)>隐私与安全性(Privacy & Security)>辅助功能(Accessibility)。
- 点击左下角的锁图标,输入密码解锁。
- 在右侧的应用列表中,找到并勾选以下两项(如果它们不在列表中,可能需要点击“+”号添加):
- 终端(Terminal)或你使用的终端应用(如iTerm2)。
- ChatGPT应用。
- 如果你计划使用Claude Desktop作为MCP客户端,也建议将其加入列表。
实操心得:有时即使勾选了,权限也可能不生效。一个可靠的验证方法是:在终端里尝试运行一个简单的AppleScript命令来控制ChatGPT,比如
osascript -e 'tell application \"ChatGPT\" to activate'。如果终端没有权限,系统会弹窗提示。更彻底的方法是,勾选后完全退出终端应用和ChatGPT应用,再重新打开,让权限设置完全加载。
3.3 安装MCP服务器
根据你使用的MCP客户端不同,安装方式有简化和标准两种路径。
3.3.1 针对Claude Code用户的一键安装
如果你使用的是Claude Desktop(其内置的代码编辑器被称为Claude Code),那么安装过程最为简单,因为它深度集成了MCP管理功能。
在终端中直接执行项目提供的命令:
claude mcp add chatgpt-mcp uvx chatgpt-mcp这条命令做了以下几件事:
claude mcp add:告诉Claude要添加一个新的MCP服务器。chatgpt-mcp:给这个服务器实例起一个别名,方便在配置中引用。uvx chatgpt-mcp:指定运行这个服务器的命令。uvx是uv工具的一部分,用于全局运行Python包,它会自动处理依赖安装和环境隔离。
执行成功后,Claude Desktop通常会自动更新其内部配置。你可以在Claude Desktop的设置中找到“开发者设置”或“MCP服务器”部分进行查看和管理。
3.3.2 为其他MCP客户端进行标准安装
对于Cursor、Windsurf等其他支持MCP的客户端,或者你想进行手动控制,需要以下步骤。
步骤一:安装服务器包
推荐使用PyPI安装,这是最干净的方式。
# 使用uv从PyPI安装包 uv add chatgpt-mcp这会在当前环境或虚拟环境中安装chatgpt-mcp及其依赖(主要是fastmcp)。
步骤二:配置MCP客户端
这是最关键的一步,你需要修改客户端的配置文件,告诉它如何启动我们刚安装的MCP服务器。配置文件的路径因客户端而异:
- Cursor:通常位于
~/.cursor/mcp.json或~/Library/Application Support/Cursor/User/globalStorage/mcp.json。 - Windsurf:可能需要在其设置界面或配置文件中指定。
你需要编辑这个JSON配置文件,添加一个mcpServers字段(如果不存在则创建):
{ "mcpServers": { "chatgpt": { "command": "uvx", "args": ["chatgpt-mcp"] } } }"chatgpt":这是你给这个服务器起的名字,在AI助手内部调用工具时会用到。"command": "uvx":指定使用uvx命令来运行。"args": ["chatgpt-mcp"]:参数是包名chatgpt-mcp。
手动安装的配置方式: 如果你是从GitHub克隆源码进行开发或测试,配置会稍有不同:
{ "mcpServers": { "chatgpt": { "command": "uv", "args": ["run", "chatgpt-mcp"], "cwd": "/绝对/路径/到/chatgpt-mcp" } } }- 这里使用
uv run来运行项目内的模块。 cwd字段至关重要,它指定了服务器启动的工作目录,必须指向你克隆的仓库根目录,这样Python才能正确找到模块。
注意事项:修改配置文件后,必须完全重启你的MCP客户端应用(如Cursor),新的服务器配置才会被加载。仅仅重启编辑器窗口可能不够。
4. 使用指南与核心工具解析
安装配置完成后,就可以在你的AI助手中体验无缝调用ChatGPT的能力了。以下是如何使用以及每个工具背后的细节。
4.1 基本工作流程
- 保持ChatGPT桌面应用开启:确保ChatGPT应用在后台运行,并且处于登录状态。最好将其窗口打开,或者最小化到程序坞。如果应用完全关闭,自动化脚本将无法找到目标。
- 在你的MCP客户端中触发工具:以Claude Desktop为例,你可以直接在对话中输入自然语言指令,例如:“请让ChatGPT帮我将这段代码从Python翻译成JavaScript。” Claude理解你的意图后,会在后台调用
chatgpt-mcp服务器的ask_chatgpt工具。 - 观察执行过程:此时,你会看到ChatGPT应用窗口可能会被短暂激活,输入框内自动填入问题,并自动发送。稍等片刻,ChatGPT生成回答后,脚本会读取回复内容。
- 获取结果:Claude会接收到从
chatgpt-mcp服务器返回的ChatGPT回复文本,并将其呈现给你,就像它自己生成的一样。
4.2 可用工具深度剖析
chatgpt-mcp服务器主要暴露了三个工具,理解它们的具体行为有助于你更有效地使用。
4.2.1ask_chatgpt:发送提示词
这是最核心、最常用的工具。它的功能是向ChatGPT发送一条消息并等待其回复。
内部运作流程:
- 激活ChatGPT应用窗口(将其带到前台)。
- 清空现有的输入框内容(如果有)。
- 将你提供的
prompt参数文本粘贴到输入框。 - 模拟按下“发送”按钮(通常是通过模拟回车键或点击特定的UI按钮实现)。
- 等待ChatGPT开始生成回复(通过检测UI状态变化,如“正在输入”指示器的出现)。
- 持续轮询,等待回复完成(检测“正在输入”指示器消失,且回复区域有稳定文本)。
- 从回复区域的UI元素中提取文本内容。
- 将提取的文本作为结果返回给MCP客户端。
使用示例(在AI助手对话中):
用户:“帮我问一下ChatGPT,什么是Rust语言中的所有权系统?”
AI助手(Claude)会执行类似后台操作:
# 伪代码,展示MCP调用逻辑 response = mcp_client.call_tool(server="chatgpt", tool="ask_chatgpt", params={"prompt": "Explain the ownership system in Rust programming language."}) print(response)
重要限制:根据项目说明,此工具仅支持纯英文文本输入。如果提示词中包含中文、日文等非英文字符,由于UI自动化脚本在文本输入和识别时可能编码处理不当,会导致操作失败或返回乱码。这是目前基于UI自动化方案的一个主要局限。
4.2.2get_chatgpt_response:获取最新回复
这个工具用于获取ChatGPT界面中最新的一条回复,而无需发送新消息。这在某些场景下很有用:
- 场景一:回复中断后的补救。如果你发送了一个很长的提示,但网络或脚本问题导致没有完整接收到回复,可以手动调用此工具尝试重新获取。
- 场景二:监控独立操作。如果你手动在ChatGPT应用里进行了一个对话,然后想在AI助手中获取那个结果,可以使用此工具。
它的内部逻辑相对简单:定位到ChatGPT应用界面中的消息历史区域,找到最新一条来自“assistant”或ChatGPT的对话气泡,提取其中的文本。
4.2.3new_chatgpt_chat:开始新对话
这个工具模拟点击ChatGPT界面上的“New Chat”(或类似功能)按钮,清空当前的对话上下文,开始一个全新的会话。
使用时机:
- 当你希望开始一个与之前话题完全无关的新任务时,调用此工具可以避免ChatGPT受到历史对话的影响。
- 在自动化测试或需要隔离不同任务场景时非常有用。
注意事项:调用此工具后,当前ChatGPT应用窗口中的对话历史将被清空。如果你有重要的对话内容没有保存,请谨慎使用。这个操作是不可逆的。
4.3 在对话中的实际应用模式
你不需要直接记忆工具名和参数。优秀的MCP客户端(如Claude)已经将这些工具集成到了其自然语言理解能力中。你可以用非常直观的方式交互:
- 直接请求:“让ChatGPT总结一下这篇文章。” (AI会调用
ask_chatgpt) - 多轮协作:“我想写一个Python爬虫,先让ChatGPT给我一个基础框架,然后你(Claude)来帮我优化异常处理部分。” (AI会先调用ChatGPT获取框架,再基于此进行后续工作)
- 状态管理:“刚才问ChatGPT的问题,它的完整回答是什么?我没看全。” (AI可能会调用
get_chatgpt_response)
这种集成使得ChatGPT从独立的应用程序,变成了你主AI助手的一个强大、可调用的“子处理器”。
5. 开发、测试与故障排查
如果你对项目感兴趣,想参与贡献、适配新语言,或者只是想在本地进行调试,这部分内容将非常有用。
5.1 本地开发环境搭建
为了修改代码或测试新功能,你需要将项目以“可编辑”模式安装。
克隆仓库:
git clone https://github.com/xncbf/chatgpt-mcp.git cd chatgpt-mcp创建虚拟环境并安装依赖:使用
uv可以一键完成。uv sync这会根据项目根目录的
pyproject.toml文件创建虚拟环境并安装所有依赖。以可编辑模式安装:这是开发的关键步骤,它允许你直接修改源代码,而无需重新安装包。
uv pip install -e .执行后,系统中会创建一个指向当前目录的
chatgpt-mcp命令。任何你对chatgpt_mcp/目录下Python文件的修改,都会在下次运行时立即生效。
5.2 使用MCP Inspector进行测试
MCP Inspector是一个官方调试工具,可以让你在不启动完整AI客户端的情况下,直接与MCP服务器交互,查看其提供的工具和资源,并手动测试调用。
安装Inspector:它是一个Node.js工具,可以通过npm安装。
npm install -g @modelcontextprotocol/inspector启动Inspector并连接服务器:在项目根目录下运行。
npx @modelcontextprotocol/inspector chatgpt-mcp如果你的可编辑模式安装成功,这个命令会启动
chatgpt-mcp服务器,并同时打开Inspector的交互界面(通常是一个命令行UI或Web界面)。在Inspector中测试:
- 你会看到服务器公告的工具列表(
ask_chatgpt,get_chatgpt_response,new_chatgpt_chat)。 - 你可以选择某个工具,输入JSON格式的参数(如
{"prompt": "Hello"})进行调用。 - Inspector会显示原始的请求和响应,这对于调试协议通信错误或工具逻辑问题至关重要。
- 你会看到服务器公告的工具列表(
5.3 直接运行服务器
对于快速测试或不想全局安装的情况,可以直接运行Python模块:
PYTHONPATH=. uv run python -m chatgpt_mcp.chatgpt_mcpPYTHONPATH=.确保Python能从当前目录导入模块。这条命令会启动MCP服务器,并开始通过stdio监听请求。你可以用其他MCP客户端连接这个本地服务器进行测试。
5.4 常见问题与排查技巧实录
在实际使用和开发中,你可能会遇到以下问题。这里记录了我踩过的坑和解决方案。
问题1:AI助手提示“无法连接到MCP服务器”或“工具调用失败”。
- 排查步骤:
- 检查ChatGPT应用:首先确认ChatGPT桌面应用是否正在运行,并且窗口没有被隐藏到其他桌面或空间。
- 检查权限:前往“系统设置 > 隐私与安全性 > 辅助功能”,确认终端和ChatGPT的权限已勾选且已生效(尝试取消勾选再重新勾选,然后重启应用)。
- 检查服务器进程:在终端运行
ps aux | grep chatgpt-mcp,查看服务器进程是否在运行。如果没有,可能是配置错误。 - 检查客户端配置:仔细核对MCP客户端配置文件(如
mcp.json)的路径、命令和参数是否正确。特别是cwd(当前工作目录)路径必须是绝对路径。 - 查看日志:许多MCP客户端和服务器在启动时会输出日志到标准错误。尝试从终端手动启动客户端,观察是否有错误信息。对于
chatgpt-mcp,可以在直接运行模块时看到详细输出。
问题2:工具调用成功,但ChatGPT没有反应,或者回复读取为空。
- 可能原因及解决:
- UI布局变化:OpenAI更新了ChatGPT应用的界面,导致AppleScript定位不到正确的按钮或文本框。这是最常见的问题。
- 临时解决:尝试手动点击ChatGPT应用窗口,将其激活到前台,有时脚本就能继续执行。
- 根本解决:需要更新项目中的AppleScript脚本。开发者需要获取新的UI元素标识符。你可以运行项目中的
show_all_button_names.applescript脚本来获取当前界面上的按钮名称,并提交给开发者。
- 系统语言不匹配:项目明确支持英文和韩文系统。如果你的macOS系统语言是中文,UI上的按钮文字是“发送”而非“Send”,脚本就无法识别。
- 解决:暂时将系统语言切换到英文,或者参照上一条,为中文UI元素标识符提交支持。
- 网络延迟或响应慢:脚本的等待超时时间可能不够长。ChatGPT生成长回复时,脚本可能在生成完成前就提前尝试读取,导致获取到不完整或空的内容。
- 解决:如果是开发者,可以尝试修改源代码中的等待和轮询逻辑,增加超时时间或改进等待条件。
问题3:ask_chatgpt发送中文提示词失败。
- 原因:项目文档已明确指出,目前仅支持英文文本输入。非英文字符在AppleScript的文本传递或UI元素内容读取时可能出现编码问题。
- 变通方案:如果需要处理中文,一个可行的思路是,在你的主AI助手(如Claude)中,先将中文任务翻译成英文提示词,再调用
ask_chatgpt。返回的英文结果再由Claude翻译回中文。这虽然多了一步,但在现有技术限制下是稳定的方案。
问题4:我想为新的系统语言(如简体中文)做贡献。
- 贡献流程:
- 将你的macOS系统语言设置为目标语言(如中文)。
- 确保ChatGPT桌面应用已更新到最新版,并以该语言显示。
- 在项目目录下,运行
osascript show_all_button_names.applescript。这个脚本会遍历ChatGPT应用的UI层级,输出所有可访问元素的名称和角色。 - 从输出中,找到关键UI元素的标识符,例如:
- 发送按钮:可能显示为
"发送"(按钮) - 输入文本框:可能显示为
"文本输入区域"(文本框) - 最新消息区域:需要找到包含回复内容的元素。
- 发送按钮:可能显示为
- 根据这些标识符,修改项目Python源码中对应的AppleScript代码片段。通常位于
chatgpt_mcp/applescript_utils.py或类似文件中,查找包含"Send"等字符串的地方,将其替换为新的标识符。 - 进行充分测试后,向原项目仓库提交Pull Request。
6. 进阶应用与生态思考
在熟练使用基础功能后,我们可以探索一些更进阶的应用场景,并思考此类项目的未来。
6.1 构建自动化工作流
chatgpt-mcp的真正威力在于将其嵌入到更大的自动化脚本或工作流中。例如,你可以编写一个Python脚本,使用MCP客户端库(如mcp)直接与chatgpt-mcp服务器通信,实现批处理任务。
设想场景:自动代码评审
# 伪代码示例 import asyncio from mcp import ClientSession, StdioServerParameters import mcp.client.stdio async def code_review(file_path): # 连接到本地运行的 chatgpt-mcp 服务器 server_params = StdioServerParameters(command="uvx", args=["chatgpt-mcp"]) async with ClientSession(server_params) as session: await session.initialize() with open(file_path, 'r') as f: code = f.read() prompt = f"Review the following Python code for potential bugs, style issues, and improvements:\n\n{code}" # 调用工具 response = await session.call_tool("ask_chatgpt", arguments={"prompt": prompt}) review_comments = response.content[0].text # 将评审意见写入文件 with open(f"{file_path}.review.txt", 'w') as out_f: out_f.write(review_comments) print(f"Review for {file_path} completed.") # 运行脚本 asyncio.run(code_review("my_script.py"))这个脚本可以集成到你的CI/CD流程中,对每次提交的代码自动进行初步的AI辅助评审。
6.2 与其他MCP服务器组合使用
MCP的魅力在于可组合性。你的AI助手可以同时连接多个MCP服务器。例如:
chatgpt-mcp:提供ChatGPT的对话与生成能力。filesystem服务器:提供读写本地文件的能力。github服务器:提供访问GitHub仓库、Issue和PR的能力。
这样,你可以对AI助手说:“读取project/src/main.py文件,让ChatGPT分析其复杂度,然后创建一个包含分析结果的GitHub Issue。” AI助手会协调多个MCP服务器,依次完成文件读取、调用ChatGPT分析、创建Issue这一系列操作。
6.3 当前方案的局限与替代思路
必须清醒认识到,chatgpt-mcp基于UI自动化的方案存在固有缺陷:
- 脆弱性:高度依赖特定应用的UI稳定性,更新易导致失效。
- 平台锁定:仅限macOS。
- 功能受限:只能进行基本的发送、接收、新建对话操作,无法利用ChatGPT的API高级功能(如函数调用、指定模型、调整参数等)。
- 性能与可靠性:UI自动化速度慢,且受前端响应速度影响,不如直接API调用稳定。
理想的替代方案是使用官方API。如果OpenAI为ChatGPT桌面应用提供了本地API接口(类似某些笔记应用的做法),那么MCP服务器可以直接通过HTTP或WebSocket与之通信,这将带来革命性的稳定性和功能性提升。届时,chatgpt-mcp这样的项目可能会演变成一个更强大、跨平台的官方API客户端。
6.4 安全与隐私考量
使用此类工具时,需注意:
- 对话隐私:所有通过此工具发送给ChatGPT的提示词和收到的回复,都会经过MCP服务器和客户端。请确保你信任所使用的AI助手和MCP服务器。
- 权限控制:该工具拥有控制ChatGPT应用的能力,理论上可以执行任何UI操作。虽然目前功能受限,但在概念上仍需注意。
- 数据持久化:本工具本身不存储你的对话记录,但ChatGPT应用和OpenAI的服务器会按照其隐私政策处理数据。
我个人在实际使用中的体会是,chatgpt-mcp在现阶段是一个极具创意的“胶水”项目,它用一种巧妙但略显“笨拙”的方式,解决了一个真实存在的效率痛点。它最适合那些主要工作环境在macOS上,且频繁在多个AI工具间切换的重度用户。它的出现,也让我们看到了未来AI工具通过标准化协议(如MCP)深度集成、自由组合的广阔前景。尽管目前有些限制,但将其作为探索AI工作流自动化的起点,无疑是充满乐趣和启发性的。
