MCP server for Gauss automatic import workflows
Project description
gauss-mcp
一个基于 FastMCP 的 Python MCP server,用来把公开图片 URL 驱动到 Gauss 自动导入链路。
当前 v1 聚焦这条主链路:
ImageTypeImg2Pano(仅普通图需要)PanoClear(按需)Pano2PointCloudSpatialTuneGaussImportGaussInfo(轮询v2/gauss/info直到展示信息就绪)- 返回
design_id/plan_id/level_id/result_url/gauss_info_status/gauss_splat_url/gauss_drc_url
不在本轮范围内:本地图片上传、渲染发布。
能力概览
- 运行状态持久化到 SQLite + artifact 文件
- 支持中断恢复,不依赖会话上下文
- 支持从中间步骤派生 variant run
- 支持导出单步调试信息和完整 run report
clear_furniture、floor_height_m缺失时显式停下来等待用户输入ImageType失败时,skill 可以向用户确认是否为全景图,再通过人工覆盖继续推进GaussImport成功后会继续轮询v2/gauss/info,直到展示信息可读- 如果本地等待窗口结束但展示信息仍在生成,run 会保持
running,后续继续gauss_resume_run即可
环境要求
- Python 3.11+
uv
安装
本地开发
uv sync
已发布包
如果已经发布到 PyPI 或内网 Python 仓库,其他人可以直接运行:
uvx gauss-mcp
配置
必填鉴权配置
本地开发可以创建 .env,变量名必须使用 GAUSS_* 前缀:
GAUSS_APPUID=your_appuid
GAUSS_APPKEY=your_appkey
GAUSS_APPSECRET=your_appsecret
GAUSS_API_BASE_URL=https://api-beta.kujiale.com/p/openapi/
GAUSS_WEB_BASE_URL=https://www.kujiale.com
可选运行时配置
GAUSS_STATE_DIR=/absolute/path/to/gauss-mcp/state
GAUSS_RUNS_DIR=/absolute/path/to/gauss-mcp/runs
GAUSS_TIMEOUT_S=300
GAUSS_POLL_INTERVAL_S=2
GAUSS_LOG_LEVEL=INFO
GAUSS_TRANSPORT=stdio
GAUSS_HOST=127.0.0.1
GAUSS_PORT=8000
全量参数说明
GAUSS_APPUID:OpenAPI 鉴权所需的 appuid。默认None,调用真实接口时通常必填。GAUSS_APPKEY:OpenAPI 鉴权所需的 appkey。默认None。GAUSS_APPSECRET:OpenAPI 鉴权所需的 appsecret。默认None。GAUSS_API_BASE_URL:OpenAPI 基础地址。默认https://api-beta.kujiale.com/p/openapi/。GAUSS_WEB_BASE_URL:结果页基础地址,用于拼接result_url。默认https://www.kujiale.com。GAUSS_STATE_DIR:SQLite 状态目录。默认行为:- 从源码仓库直接运行时,使用
<repo>/data/state - 从已安装包或
uvx gauss-mcp运行时,使用~/.gauss-mcp/state
- 从源码仓库直接运行时,使用
GAUSS_RUNS_DIR:run artifact 目录。默认行为:- 从源码仓库直接运行时,使用
<repo>/data/runs - 从已安装包或
uvx gauss-mcp运行时,使用~/.gauss-mcp/runs
- 从源码仓库直接运行时,使用
GAUSS_TIMEOUT_S:单步远端轮询等待窗口,单位秒。默认300。GAUSS_POLL_INTERVAL_S:轮询间隔,单位秒。默认2。GAUSS_LOG_LEVEL:日志级别。默认INFO。GAUSS_TRANSPORT:MCP 传输方式。默认stdio。可选值:stdio、sse、streamable-http。GAUSS_HOST:HTTP 类传输绑定地址。默认127.0.0.1;仅在GAUSS_TRANSPORT=sse或streamable-http时生效。GAUSS_PORT:HTTP 类传输监听端口。默认8000;仅在GAUSS_TRANSPORT=sse或streamable-http时生效。
补充说明:
database_path由GAUSS_STATE_DIR派生,固定为<state_dir>/gauss_mcp.sqlite3,不单独暴露环境变量。- 分发给其他人时,推荐显式配置
GAUSS_STATE_DIR、GAUSS_RUNS_DIR,避免状态写入默认目录后不易排查。 - 不要把真实密钥提交到仓库。
启动 MCP Server
默认使用 stdio 传输。
如果设置 GAUSS_TRANSPORT=sse 或 GAUSS_TRANSPORT=streamable-http,进程会改为监听 GAUSS_HOST:GAUSS_PORT。
从源码仓库启动
uv run gauss-mcp
或:
uv run python -m gauss_mcp
从已发布包启动
uvx gauss-mcp
打包与发布
当前工程已经具备 Python 包分发能力:
pyproject.toml已声明uv_build构建后端- 已提供 console script:
gauss-mcp - 可以构建
sdist/wheel后上传到 PyPI 或内网仓库
典型发布流程:
uv build
uv run twine check dist/*
uv run twine upload dist/*
说明:
- 发布前记得更新
pyproject.toml中的project.version - 如果使用内网仓库,可按仓库要求补充
twine upload参数 - 发布完成后,其他人可直接通过
uvx gauss-mcp使用
Claude Code / MCP 配置
推荐优先使用“已发布包 + uvx”的方式分发给其他人,不要求对方 clone 仓库。
方式一:用 CLI 添加到 Claude Code
添加到当前项目:
claude mcp add --scope project \
--env GAUSS_APPUID=your_appuid \
--env GAUSS_APPKEY=your_appkey \
--env GAUSS_APPSECRET=your_appsecret \
--env GAUSS_API_BASE_URL=https://api-beta.kujiale.com/p/openapi/ \
--env GAUSS_WEB_BASE_URL=https://www.kujiale.com \
gauss-mcp -- uvx gauss-mcp
如果想给自己全局使用,把 --scope project 改成 --scope user。
方式二:在项目根目录提供 .mcp.json
{
"mcpServers": {
"gauss-mcp": {
"command": "uvx",
"args": ["gauss-mcp"],
"env": {
"GAUSS_APPUID": "your_appuid",
"GAUSS_APPKEY": "your_appkey",
"GAUSS_APPSECRET": "your_appsecret",
"GAUSS_API_BASE_URL": "https://api-beta.kujiale.com/p/openapi/",
"GAUSS_WEB_BASE_URL": "https://www.kujiale.com"
}
}
}
}
配置建议:
- 本地开发继续用
.env+uv run gauss-mcp即可 - 分发给其他人时,更推荐用 Claude Code 的
env配置显式注入参数,不要假设对方工作目录里一定有.env - 如果团队要共享
.mcp.json,不要把真实密钥直接提交到仓库
主要工具
Run 管理
gauss_create_rungauss_get_rungauss_list_runsgauss_set_run_optionsgauss_resume_rungauss_create_variant
Step 执行
gauss_run_image_typegauss_run_img2panogauss_run_pano_cleargauss_run_pano2pointcloudgauss_run_spatial_tunegauss_run_gauss_importgauss_run_gauss_info
调试与导出
gauss_get_stepgauss_retry_stepgauss_export_run_report
Resources
gauss://runs/{run_id}gauss://runs/{run_id}/stepsgauss://runs/{run_id}/steps/{step_key}gauss://runs/{run_id}/report
Skill 交互约定
推荐配合 .claude/skills/gauss-import/SKILL.md 使用。
正常情况下,skill 会采用“逐步展示、逐步汇报”的策略,而不是一上来就用一次 gauss_resume_run(wait=true) 把多个步骤吞在一起。
新建导入任务时
skill 会按下面的顺序执行,并在每一步结束后明确展示结果:
gauss_create_rungauss_run_image_typegauss_run_img2pano(仅is_pano=false时)gauss_run_pano_clear(按需)gauss_run_pano2pointcloudgauss_run_spatial_tunegauss_run_gauss_importgauss_run_gauss_info
展示时会尽量明确:
- 当前 step 是否执行
- 关键结果是什么
- 哪些 step 被跳过
- 跳过原因是什么
- 下一步将做什么
- 当首次拿到可用全景图时,当前回复里同时展示 markdown 图片
和 URL 文本 - 如果
PanoClear产出了新的cleared_panorama_url,会再次展示清家具后的全景图和 URL
例如:
ImageType已执行,结果是全景图 →Img2Pano会被明确标记为“已跳过,原因是当前图已可直接视为全景图”,并在当前回复里同时展示和原始 URLImageType已执行,结果是普通图 → 下一步将显式执行Img2Pano;一旦拿到panorama_url,会立即展示全景图预览和 URL- 如果用户选择清家具,且
PanoClear返回了新的cleared_panorama_url→ 会再次展示清家具后的全景图预览和 URL
已有 run 时
如果用户给的是 run_id,skill 会优先复用当前 run,而不是重建:
- 先调用
gauss_get_run(include_steps=true)读取当前状态 - 明确展示 run 的
status、current_step和已完成步骤 - 需要继续时再调用
gauss_resume_run或对应单步工具 - 失败时先读取失败 step 详情,再向用户解释原因和下一步建议
显式人机 gate
当前仍有 3 个显式的人机 gate:
clear_furniture未提供floor_height_m未提供ImageType/Img2Pano异常后,怀疑图片类型误判,需要人工确认是否为全景图
第 3 个 gate 的典型处理方式:
ImageType失败 → 先读取image_typestep 详情,再询问用户这是不是全景图Img2Pano异常,且前面存在is_pano=false的判断 → 明确告诉用户ImageType这一步已经跑过了,但当前怀疑可能误判,再询问用户这张图其实是不是全景图- 用户回答“是全景图” →
gauss_set_run_options(is_pano=true),再继续gauss_resume_run(wait=true) - 用户回答“不是全景图” →
gauss_set_run_options(is_pano=false),再继续gauss_resume_run(wait=true)
开发与验证
uv run ruff check .
uv run mypy src
uv run pytest
uv build
uv run twine check dist/*
真实环境 smoke test
真实 smoke test 会在上游创建实际任务。执行前请确认:
.env中已配置有效鉴权信息- 输入的是公开可访问的图片 URL
- 你接受在测试环境创建真实导入任务
项目结构
src/gauss_mcp/
__main__.py
client.py
config.py
models.py
server.py
workflow.py
persistence/
tests/
当前状态
本地质量门禁已打通:
ruffmypypytestuv buildtwine check
如果下一步要做真实链路验证,建议直接围绕 gauss-import skill 跑一次完整 smoke。
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gauss_mcp-0.1.1.tar.gz.
File metadata
- Download URL: gauss_mcp-0.1.1.tar.gz
- Upload date:
- Size: 23.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b7d8c220f5f386322780e55e63ba25bed8db594cee2143cb3cac1a1b9cc67463
|
|
| MD5 |
cb8c9a40d636f251bd315a24c960899a
|
|
| BLAKE2b-256 |
b13760a70bc6fce091cbfd72089965ae2bc5b5e0f8350d3cae182365d81f1228
|
File details
Details for the file gauss_mcp-0.1.1-py3-none-any.whl.
File metadata
- Download URL: gauss_mcp-0.1.1-py3-none-any.whl
- Upload date:
- Size: 27.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
397dd25dd8dd84bdb0d6fb8f8668c08d3b7915a43540fc002a18b1092432ae67
|
|
| MD5 |
d9496eeb670135989c453824b4f40999
|
|
| BLAKE2b-256 |
6603505ed3f0d5b00abc24acb474c4f32681f296cc207fe63e70786be35eb8c8
|