gjp-print-mcp

gjp-print-mcp

MCP server for cloud printing that exposes three template style tools (get_print_info, new_style, save_style), enabling vision models to restore print templates from user images and save them to the business system with dynamic token authentication.

Category
访问服务器

README

GJP 云打印模板样式 MCP

基于 AgentScope 2.0.4 的云打印 MCP 服务。对外只发布三个模板样式工具,供视觉 模型根据用户图片还原模板并保存到云打印业务系统。

MCP 工具

工具 业务 API 参数
get_print_info /ElectronPrintApi/GetPrintInfo report_name;reportType 固定为 1
new_style /ElectronPrintApi/NewStyle report_name、report_type、style_name
save_style /ElectronPrintApi/SaveStyle report_name、report_type、style_name、style_id、style_content

Token 不属于工具参数。MCP 客户端通过 Authorization: Bearer <云打印Token> 动态传入,服务端 Adapter 再把 Token 注入三个业务 API 的请求体。

动态参数

对接方每次调用 MCP 时,同时提供当前用户的 Token 和本次的 report_name:Token 放在该 MCP HTTP 请求的 Authorization 头中, report_name 放在 tools/call.params.arguments 中。两个值都是每次请求动态传入, reportType=1 由 MCP 服务端固定补全。

业务字段 MCP 传入方式 来源 规则
token 当次 MCP 请求的 Authorization: Bearer <Token> 对接方 每次请求动态注入,不出现在工具 Schema 中
reportName report_name 图片识别或用户输入 三个工具均为动态值
reportType report_type 业务上下文 GetPrintInfo 固定为 1;NewStyle/SaveStyle 动态传入
styleName style_name 用户命名 NewStyle 动态传入;SaveStyle 必须沿用 NewStyle 返回值
styleId style_id NewStyle 响应 SaveStyle 动态传入,必须作为字符串保留
styleContent style_content 模板 JSON 生成/编辑逻辑 传入完整 JSON 对象,由服务端序列化

GetPrintInfo 的完整 MCP 调用形式:

POST /mcp
Authorization: Bearer <对接方本次动态传入的Token>
Mcp-Session-Id: <initialize返回的会话ID>
Content-Type: application/json
{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "get_print_info",
    "arguments": {
      "report_name": "销售单"
    }
  }
}

MCP 服务从同一请求中取出 Token 和 report_name,再生成:

{
  "token": "<本次请求的Token>",
  "reportName": "销售单",
  "reportType": 1,
  "styleName": "",
  "styleId": "",
  "styleContent": "",
  "isDynamicBaseStyle": "",
  "baseStyleContent": "",
  "isPublic": false
}

三个 MCP 工具的动态调用关系:

get_print_info(
  report_name=图片识别得到的分类
)

new_style(
  report_name=上一步的分类,
  report_type=当前业务类型,
  style_name=用户指定的新模板名称
)

save_style(
  report_name=new_style.reportName,
  report_type=new_style.reportType,
  style_name=new_style.styleName,
  style_id=new_style.styleId,
  style_content=生成的完整模板 JSON
)

图片还原流程

用户图片
  → 视觉模型识别报表名称、字段和布局
  → get_print_info(report_name)
  → 生成完整的云打印原生模板 JSON
  → new_style(report_name, report_type, style_name)
  → save_style(
        使用 new_style 返回的 reportName/reportType/styleName/styleId,
        style_content=生成的模板 JSON 对象
    )

style_id 始终作为字符串传递,避免超大整数精度丢失。new_style 和 save_style 不自动重试;创建成功后保存失败,应使用同一 style_id 重试保存, 不能重复创建空模板。

多轮编辑

服务端按 tenant_id / account_id / session_id / report_name 保存当前模板。 Streamable HTTP 初始化时服务端签发 Mcp-Session-Id,客户端后续自动 回传,因此同一 Token 下的不同对话也会隔离。未提供会话头时才回退为 Token 哈希会话。首次 new_style 后记录模板身份,首次 save_style 后记录完整 JSON;后续调用 get_print_info(report_name) 会同时返回:

{
  "currentStyle": {
    "reportName": "销售单",
    "reportType": 1,
    "styleName": "图片还原模板",
    "styleId": "2086707921336647680",
    "revision": 2,
    "hasContent": true,
    "styleContent": {"ReportName": "销售单", "Pages": []}
  }
}

模型以 currentStyle.styleContent 为基线,只修改用户本轮指定内容,再使用同一个 styleId 调用 save_style。只有用户明确要求另存为新模板时才调用 new_style。

参考实现使用进程内状态,支持同一服务进程内多轮对话;服务重启会丢失状态,多副本 部署应把 TemplateConversationStore 替换为共享存储。

模板 JSON 生成内核

模板 JSON 的字段提取、计划、布局、编译、补丁和校验代码继续保留为内部领域能力, 不作为额外 MCP 工具发布:

模块 职责
catalog.py 字段目录与原生绑定提取
domain.py 模板计划和领域对象
planner.py / plan_builder.py 构造模板计划
paper.py 纸张与页面规则
native.py 原生模板 JSON 编译、补丁、校验与哈希
reports.py 线上模板上下文和页面信息
service.py 模板生成编排
template_schema.py 模板生成计划的 Pydantic 输入模型
conversation.py 三个工具之间的当前模板状态与修订号

这套内核生成的原生模板对象可直接传给 save_style.style_content。

快速启动

运行要求:Python 3.11 或更高版本,并已安装 uv。

1. 安装依赖

cd /path/to/gjp-print-mcp
uv sync

本地开发和执行测试时使用:

uv sync --extra dev

2. 配置服务

可在项目根目录创建 .env:

YUNPRINT_BASE_URL=https://yunprint.gmgrasp.com.cn
YUNPRINT_TIMEOUT_SECONDS=30
GJP_LOG_ENABLED=true
GJP_LOG_LEVEL=INFO

也可以使用同名进程环境变量;进程环境变量优先于 .env。

变量 必填 默认值 说明
YUNPRINT_BASE_URL 是 - 云打印平台 HTTPS 根地址,不包含三个 API 路径
YUNPRINT_TIMEOUT_SECONDS 否 30 三个业务 API 的超时时间(秒)
GJP_LOG_ENABLED 否 false 是否开启终端日志
GJP_LOG_LEVEL 否 INFO DEBUG / INFO / WARNING / ERROR

云打印 Token 不写入 .env,而是由每个 MCP 客户端连接通过 Authorization 请求头动态传入。

3. 启动 MCP

本地启动:

uv run python -m yunprint --host 127.0.0.1 --port 8931

容器、服务器或局域网启动:

uv run uvicorn yunprint.app:app --host 0.0.0.0 --port 8931 --workers 1

启动后的首选 MCP 地址为 http://127.0.0.1:8931/mcp,传输类型为 Streamable HTTP。生产环境应在反向代理层配置 HTTPS。

当前多轮模板状态保存在进程内存中,因此必须使用单 worker。 启用 Redis/数据库共享状态后才能安全扩展为多 worker 或多副本。

连接 MCP

支持 Streamable HTTP 的 Agent 平台使用以下配置:

{
  "mcpServers": {
    "yunprint-print": {
      "type": "streamable-http",
      "url": "http://127.0.0.1:8931/mcp",
      "headers": {
        "Authorization": "Bearer <云打印Token>"
      }
    }
  }
}

不同 Agent 平台的配置字段名可能不同,但必须保持这三项:

配置项 值
传输 Streamable HTTP
URL http(s)://<MCP服务地址>/mcp
Header Authorization: Bearer <云打印Token>

MCP 服务在 initialize 响应中签发 Mcp-Session-Id。标准 MCP 客户端会在 后续请求中自动携带它,不要在配置文件里写死该请求头。同一轮对话 必须复用同一 MCP 会话,才能继续编辑 currentStyle。

连接成功后应只能发现:

  1. get_print_info
  2. new_style
  3. save_style

连接排查

现象 检查项
404 URL 必须以 /mcp 结尾
MCP_UNAUTHORIZED 检查 Authorization 是否为 Bearer <Token>
缺少或无效 Mcp-Session-Id 确认客户端支持有状态 Streamable HTTP,并复用初始化会话
BUSINESS_CONNECTION_INVALID 检查服务端 YUNPRINT_BASE_URL
YUNPRINT_REQUEST_FAILED 检查云打印 Token、网络和云打印 API 状态

更完整的部署、反向代理和手工握手验证方式见 SaaS 与三接口 MCP 接入。

测试

uv run pytest -q

三个工具的请求契约、动态 Token 注入、权限和 Schema 测试位于 tests/printing/test_style_*.py;模板 JSON 生成内核的测试继续保留在 tests/printing/。

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选