1. 为什么要在 QGIS 里折腾 MCP 与统一 Key
QGIS 是开源 GIS 圈子里最活跃的桌面工具,插件生态几乎覆盖了从数据加载、投影转换到空间统计的全流程。但真正把大模型接进来做「AI For GIS」时,很多人会卡在同一个地方:模型服务商太多,Key 太散,切换一次模型就要改一遍配置。MCP(Model Context Protocol)工具链在 QGIS 里的实践,核心要解决的就是「一个 Key 打通多模型调用」这件事。
先说清楚 MCP 是什么。你可以把它理解成大模型和外部工具之间的「USB-C 接口」:大模型本身不会画地图、不会算 NDVI,它只会理解自然语言并决定调用哪个工具;MCP 服务器负责把「有哪些工具、每个工具要什么参数」告诉模型;QGIS 插件则是真正调用 QGIS API 干活的那只手。三者串起来,你就能用一句中文让 QGIS 自动分层设色、统计面积、甚至生成图表。
这套流程适合谁?三类人最值得试:一是天天在 QGIS 里做重复操作的 GIS 开发者,想把「按字段分组设色」这类动作交给自然语言;二是做空间分析教学或原型验证的人,需要快速把想法变成可交互结果;三是已经在用 Claude、DeepSeek、GPT 等模型,但被多个 API Key 和不同 Base URL 搞得头大的开发者。TaoToken 在这里的角色,就是把这些模型的调用通道收敛成一个统一入口,QGIS 侧的 MCP 服务器只认一个 Key 和一个 Base URL,换模型不用动插件配置。
我实测下来,整个链路最容易被低估的不是 QGIS 插件安装,而是模型通道的稳定性。MCP 服务器在收到模型返回的 tool call 后,需要把参数转成 QGIS 能懂的请求,如果模型通道中途 401 或者返回格式抖动,QGIS 侧看到的就是「插件没反应」。所以下面会先把 TaoToken 的前置配置讲透,再进 QGIS 插件和 MCP 服务器的对接。
2. TaoToken 前置:统一 Key 与 API 通道准备
TaoToken 的定位是模型调用的统一网关,官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址固定为 https://taotoken.net/api 。注意这里不要加任何多余路径,MCP 服务器配置里的 Base URL 就填这个,后面拼/v1/chat/completions或 Anthropic 兼容路径由客户端自己处理。
第一步是拿 Key。进入控制台后创建 API Key,建议按用途分名字,比如qgis-mcp-dev,方便后面在 QGIS 场景里排查是哪个 Key 出的问题。Key 只在创建时完整显示一次,复制后先存到本地密码管理器,不要直接写进会提交到 Git 的配置文件。
第二步是确认模型 ID。TaoToken 的模型对话页面可以直接试跑,选一个你打算在 QGIS 里用的模型,比如 Claude 系列或 DeepSeek 系列,记下它的准确 Model ID。MCP 服务器配置里model字段必须和这个 ID 完全一致,大小写和连字符都不能错,否则会出现「Key 有效但模型不存在」的报错。
第三步是理解通道结构。QGIS 的 MCP 服务器本质是一个本地 Python 进程,它通过 HTTP 把 tool call 的上下文发给模型服务。所以你的配置里需要三件套:Base URL、API Key、Model ID。这三件套在 TaoToken 体系里是解耦的——Base URL 固定,Key 可以轮换,Model ID 可以按任务切换。比如做地图渲染用便宜快的模型,做 NDVI 计算这种需要多步推理的换强一点的模型,只改 Model ID 就行。
这里给一个最小可用的环境变量写法,方便你在终端里先验证通道:
export TAOTOKEN_BASE_URL="https://taotoken.net/api" export TAOTOKEN_API_KEY="sk-你的Key" export TAOTOKEN_MODEL="claude-3-5-sonnet-20241022"然后用 curl 打一次对话接口,确认返回里有choices字段:
curl -s "$TAOTOKEN_BASE_URL/v1/chat/completions" \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "'"$TAOTOKEN_MODEL"'", "messages": [{"role": "user", "content": "只回复 ok"}] }'如果这一步返回 401,说明 Key 或 Authorization 头有问题;如果返回模型不存在,说明 Model ID 写错;如果返回local proxy failed这类网络层错误,检查本机是否设置了会拦截 HTTPS 的本地代理。这一步过了,再进 QGIS 插件环节,能省掉大量「到底是插件问题还是通道问题」的扯皮。
3. 可复制配置:QGIS 插件与 MCP 服务器对接
QGIS 侧的 MCP 实践通常包含两个组件:QGIS 插件(负责在 QGIS 进程内暴露操作接口)和 MCP 服务器(负责和模型对话、把 tool call 转成插件请求)。插件安装走 QGIS 的插件目录,MCP 服务器走 Python 环境。下面给的是可复制的配置片段,路径按你自己的实际目录替换。
先装 uv,它是运行 MCP 服务器的 Python 包管理器。macOS 用:
brew install uvWindows 用 PowerShell:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"然后准备 MCP 服务器的配置文件。如果你用的是支持 MCP 的客户端(Claude Desktop、Cline、或 5ire 这类),配置结构基本一致,核心是把command、args、env三段写对。下面是一个 JSON 片段,路径和字段名保持和实际仓库一致:
{ "mcpServers": { "qgis": { "command": "uv", "args": [ "--directory", "/Users/yourname/code/qgis_mcp/src/qgis_mcp", "run", "qgis_mcp_server.py" ], "env": { "TAOTOKEN_BASE_URL": "https://taotoken.net/api", "TAOTOKEN_API_KEY": "sk-你的Key", "TAOTOKEN_MODEL": "claude-3-5-sonnet-20241022" } } } }三件套在这里的落位很明确:Base URL 进env.TAOTOKEN_BASE_URL,Key 进env.TAOTOKEN_API_KEY,Model ID 进env.TAOTOKEN_MODEL。如果你的 MCP 服务器代码里读的是OPENAI_BASE_URL这类变量名,就把键名改成代码里实际读取的那个,值不变。
QGIS 插件这边,下载仓库源码后,把qgis_mcp_plugin文件夹复制到 QGIS 的插件目录。路径可以通过 QGIS 菜单Settings -> User profiles -> Open active profile folder找到,进去后是python/plugins。复制完重启 QGIS,在Plugins -> Manage Plugins里勾选启用,界面上会出现一个带Start Server按钮的面板,点一下让插件进入监听状态。
如果你用的是 Codex 这类走auth.json的客户端,配置思路一样,只是文件位置不同。auth.json里通常写:
{ "base_url": "https://taotoken.net/api", "api_key": "sk-你的Key", "model": "claude-3-5-sonnet-20241022" }注意base_url不要带/v1,也不要带尾部斜杠,客户端会自己拼。Cline 的 MCP 配置则是在设置里填 Base URL、API Key、Model ID 三栏,和上面的 JSON 字段一一对应。CC Switch 这类切换工具也是同样三件套,只是界面化操作。
配置写完先别急着在 QGIS 里发指令,回到终端用uv run手动启动一次 MCP 服务器,看它有没有正常打印监听日志。如果启动就报ModuleNotFoundError,说明--directory指错了;如果报连接模型失败,回到第 2 步的 curl 验证。
4. 验证请求:从自然语言到 QGIS 图层变化
验证分两层:先验证 MCP 服务器能被客户端识别,再验证 QGIS 插件能真正改动画布。第一层看客户端里有没有出现工具列表,第二层看 QGIS 图层有没有按指令变化。
先做第一层。打开你的 MCP 客户端,在对话界面找工具入口(Claude Desktop 是聊天框底部的小锤子图标)。点开应该能看到qgis相关的工具,比如获取图层列表、执行处理算法、添加图层等。如果工具列表是空的,说明 MCP 服务器没启动成功,回到第 3 步检查args路径和env变量。
第二层验证用一个最小场景:在 QGIS 里预先加载一个矢量图层,然后发一句:
当前图层中,帮我按照"地级码"字段对要素分组,并设置不同颜色风格正常情况你会看到 QGIS 图层面板里的符号发生变化,不同分组用不同颜色渲染。这一步成功,说明「模型理解指令 -> MCP 服务器解析 tool call -> QGIS 插件调用 API -> 画布更新」整条链路通了。
再验证一个带文件输出的场景,确认模型能拿到 QGIS 返回的数据并做二次处理:
帮我统计当前矢量图层中每一个要素的面积,并制作一份柱状图, 图表标签使用"地名"字段,中文标签需要正确显示, 结果保存到 /Users/yourname/Desktop。执行后桌面上应该出现一份表格文件和一张图片。如果图片里中文变成方框,说明绘图库没设中文字体,把提示词改成「图表标签是中文,请正确设置字体以确保显示」再跑一次。这一步能过,说明模型不仅能调 QGIS,还能在拿到结果后继续做数据处理。
最后验证一个多步推理场景,比如 NDVI 计算:
在 /Users/yourname/Desktop/data 文件夹里有一期 Landsat 5 多波段影像, 请根据这些波段计算 NDVI 指数,并把结果作为图层显示在 QGIS 地图上。这个场景对模型的空间分析能力要求更高,需要它知道 NDVI 的波段组合公式。如果结果不对,先检查提示词里有没有明确波段编号和传感器类型,再检查 QGIS 插件是否支持创建栅格图层。实测下来,多步空间分析场景里,模型通道的稳定性比单步渲染更重要,因为中间任何一次 tool call 失败都会导致整条链断掉。
5. 常见报错排查:401、local proxy failed 与 choices 解析失败
MCP + QGIS 这套链路报错时,信息往往藏在三个地方:MCP 客户端日志、MCP 服务器终端输出、QGIS 日志面板。下面按真实遇到的报错对照排查。
401 Unauthorized。最常见的原因是 Key 没传进 MCP 服务器进程。检查env里的TAOTOKEN_API_KEY是否被代码实际读取,有些 MCP 服务器读的是OPENAI_API_KEY,那就把键名改对。另一个原因是 Key 前后带了空格或换行,复制时容易带上。用echo $TAOTOKEN_API_KEY | wc -c看长度是否和预期一致。
local proxy failed / connection refused。这类错误通常不是 TaoToken 侧的问题,而是本机网络层有东西拦截了 HTTPS 请求。检查系统代理设置、环境变量里的HTTP_PROXY/HTTPS_PROXY,以及是否有本地安全软件在做 TLS 拦截。把 MCP 服务器进程的环境变量清干净再启动,只保留 TaoToken 的 Base URL 和 Key。
reading choices 失败 / 返回体不是 JSON。MCP 服务器在解析模型返回时,期望拿到标准 OpenAI 兼容格式,里面有choices[0].message。如果返回的是 HTML 错误页或空体,就会在解析choices时报错。先用第 2 步的 curl 确认接口返回的是 JSON,再检查 Base URL 有没有多写/v1导致路径变成/v1/v1/chat/completions。
OAuth 相关报错。部分客户端默认走 OAuth 流程,但 TaoToken 的 API Key 模式不需要 OAuth。在客户端设置里把认证方式从 OAuth 改成 API Key,或者直接在配置文件里写api_key字段,避免客户端去请求不存在的 OAuth 端点。
QGIS 插件无响应。如果 MCP 客户端显示工具调用成功,但 QGIS 画布没变化,先看 QGIS 插件面板的Start Server是否处于监听状态,再看 QGIS 日志面板有没有 Python 异常。常见原因是插件版本和 QGIS 版本不匹配,或者插件目录复制后没重启 QGIS。
模型返回的 tool call 参数格式不对。不同模型对 function calling 的支持程度不一样,有些模型会把参数包成字符串而不是对象。遇到这种情况,换一个对 tool call 支持更规范的 Model ID,或者在 MCP 服务器里加一层参数清洗。TaoToken 的模型对话页面可以快速切换模型试跑,找到对 MCP 兼容性最好的那个。
排查顺序建议固定成:先 curl 验通道,再手动启动 MCP 服务器验进程,再看客户端工具列表,最后在 QGIS 里发最小指令。这样每层都有明确的成功标志,不会在多层叠加时迷失方向。
6. 把统一 Key 固化进你的 GIS 工作流
走到这里,你已经有了一个能跑的 QGIS + MCP + TaoToken 链路。接下来值得做的是把它固化下来,而不是每次重新配。我的做法是把三件套写进一个本地.env文件,MCP 服务器启动时读取,这样换模型只改一行 Model ID,换 Key 只改一行 API Key,Base URL 基本不动。
对于长期做编码和 Agent 类任务的场景,可以考虑用 Coding Plan 把调用额度管起来,入口在 https://taotoken.net/api-keys 旁边的套餐页,具体以控制台展示为准。如果你更想先验证模型在 GIS 场景下的表现,直接去模型对话页面试跑几轮 tool call,确认模型能稳定输出结构化参数,再进 QGIS 配置。
接入文档在 https://taotoken.net/doc ,里面有各客户端的 Base URL 写法和常见问题。Claude Code 相关的接入说明在 https://taotoken.net/claude-code ,如果你后面想把 QGIS 的 MCP 服务器和 Claude Code 串起来做自动化脚本,那份文档里的配置格式可以直接复用。
最后留一个实用技巧:MCP 服务器和 QGIS 插件之间的通信是本地 WebAPI,如果你同时开多个 GIS 项目,给每个项目的 MCP 服务器分配不同端口,避免插件连错进程。端口号写在 MCP 服务器配置里,QGIS 插件面板上填对应的端口,两边一致才能通。这个细节在单项目时无所谓,多项目并行时能省掉很多「为什么指令发出去没反应」的困惑。