From 0d7c8792091a6e26d274cd0d773ebb690a963f76 Mon Sep 17 00:00:00 2001 From: Gisli Gudmundsson Date: Sat, 24 Oct 2026 13:40:56 +0000 Subject: [PATCH] feat(uteamup-zcode): add UteamUP CMMS read-only MCP plugin --- assets/uteamup-zcode/icon.png | Bin 0 -> 37731 bytes external_plugins/uteamup-zcode/.mcp.json | 8 +++ .../uteamup-zcode/.zcode-plugin/plugin.json | 30 +++++++++ external_plugins/uteamup-zcode/README.md | 60 ++++++++++++++++++ external_plugins/uteamup-zcode/README_CN.md | 55 ++++++++++++++++ .../uteamup-zcode/skills/uteamup/SKILL.md | 56 ++++++++++++++++ marketplace.json | 24 +++++++ 7 files changed, 233 insertions(+) create mode 100644 assets/uteamup-zcode/icon.png create mode 100644 external_plugins/uteamup-zcode/.mcp.json create mode 100644 external_plugins/uteamup-zcode/.zcode-plugin/plugin.json create mode 100644 external_plugins/uteamup-zcode/README.md create mode 100644 external_plugins/uteamup-zcode/README_CN.md create mode 100644 external_plugins/uteamup-zcode/skills/uteamup/SKILL.md diff --git a/assets/uteamup-zcode/icon.png b/assets/uteamup-zcode/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..61f7566b5e8bcb09b657322280ba8979505953a0 GIT binary patch literal 37731 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 VojPtjL;?Yi)kU;fwTauk{{d`Uf@A;y literal 0 HcmV?d00001 diff --git a/external_plugins/uteamup-zcode/.mcp.json b/external_plugins/uteamup-zcode/.mcp.json new file mode 100644 index 0000000..3e107d2 --- /dev/null +++ b/external_plugins/uteamup-zcode/.mcp.json @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "uteamup": { + "type": "http", + "url": "https://api.uteamup.com/mcp/read-only" + } + } +} diff --git a/external_plugins/uteamup-zcode/.zcode-plugin/plugin.json b/external_plugins/uteamup-zcode/.zcode-plugin/plugin.json new file mode 100644 index 0000000..56a5118 --- /dev/null +++ b/external_plugins/uteamup-zcode/.zcode-plugin/plugin.json @@ -0,0 +1,30 @@ +{ + "name": "uteamup-zcode", + "version": "0.1.0", + "description": "Connect ZCode to UteamUP CMMS for read-only work orders, assets, and maintenance data via Model Context Protocol (MCP), signing in with your UteamUP account.", + "description_i18n": { + "en": "Connect ZCode to UteamUP CMMS for read-only work orders, assets, and maintenance data via Model Context Protocol (MCP), signing in with your UteamUP account.", + "zh-CN": "通过 Model Context Protocol(MCP)将 ZCode 连接到 UteamUP CMMS,以只读方式查询工单、资产和维保数据,并使用您自己的 UteamUP 账号登录授权。" + }, + "author": { + "name": "UteamUP", + "email": "gisli@uteamup.com", + "url": "https://uteamup.com" + }, + "homepage": "https://uteamup.com", + "repository": "https://github.com/UteamUP/uteamup-mcp", + "license": "MIT", + "supportUrl": "https://github.com/UteamUP/uteamup-mcp/issues", + "privacyPolicyUrl": "https://app.uteamup.com/privacypolicy", + "termsOfServiceUrl": "https://app.uteamup.com/terms", + "keywords": [ + "mcp", + "uteamup", + "cmms", + "maintenance", + "work-orders", + "asset-management" + ], + "mcpServers": "./.mcp.json", + "skills": "./skills" +} diff --git a/external_plugins/uteamup-zcode/README.md b/external_plugins/uteamup-zcode/README.md new file mode 100644 index 0000000..dfb66ff --- /dev/null +++ b/external_plugins/uteamup-zcode/README.md @@ -0,0 +1,60 @@ +# UteamUP CMMS for ZCode + +Connect ZCode to your [UteamUP](https://uteamup.com) workspace and ask about your +assets and work orders in natural language. The plugin ships one remote MCP +server and one skill; it contains no local code, hooks, or commands. + +## How it works + +The `uteamup` MCP server connects to the production read-only endpoint +`https://api.uteamup.com/mcp/read-only` and authenticates with your own UteamUP +account over OAuth 2.0 (the plugin registers itself automatically and ZCode +opens the UteamUP consent page on first use). The requested scope is `mcp:read`. + +Prerequisites (one-time, done in UteamUP, not in ZCode): + +1. A tenant administrator turns on **Allow members to connect AI assistants** + in the company's **API Keys** tab. +2. On first use, sign in on the UteamUP consent page and pick the company. + Only companies where you are the owner or hold a license are offered. + +No API keys or secrets are needed. The connection uses the member's own +permissions in the chosen company. A member disconnects under +**Profile → Accounts**; an administrator sees and revokes every link in the +API Keys tab. + +## Tools + +- `uteamup_asset_list` — list assets in the connected workspace +- `uteamup_asset_get_by_guid` — fetch one asset by its GUID +- `uteamup_asset_search` — search assets (name, free text) +- `uteamup_workorder_list` — list work orders in the connected workspace +- `uteamup_workorder_search` — search work orders (title, description, free text) + +Only these read tools are advertised; write or admin calls are denied +server-side. Reads do not invoke a UteamUP AI provider and spend no UteamUP AI +credits. + +## Try it + +- "List the first five assets in my workspace." +- "Find assets whose name contains pump." +- "Show my open work orders." + +## Network access, side effects, and provenance + +- Network: outbound HTTPS to `https://api.uteamup.com/mcp/read-only` and the + UteamUP OAuth endpoints (`/oauth/authorize`, `/oauth/token`, `/oauth/register`). + No other network destinations are configured. +- Local side effects: none. No file writes, no command execution, no hooks, no + bundled binaries. The plugin declares only an MCP server and a skill. +- Third-party services and code: UteamUP is the publisher of this plugin and + operates the only contacted service. No third-party code is bundled. The logo + asset is owned by UteamUP. Requests and responses are processed by Z.ai + (ZCode) and UteamUP under their respective policies; UteamUP retains stored + records under its privacy policy and workspace retention settings. +- License: MIT. Privacy policy: https://app.uteamup.com/privacypolicy. + Terms: https://app.uteamup.com/terms. + Support: https://github.com/UteamUP/uteamup-mcp/issues. + Canonical source maintained at https://github.com/UteamUP/uteamup-mcp + (`plugins/uteamup-zcode`), also installable from UteamUP's own marketplace. diff --git a/external_plugins/uteamup-zcode/README_CN.md b/external_plugins/uteamup-zcode/README_CN.md new file mode 100644 index 0000000..9d5b8ba --- /dev/null +++ b/external_plugins/uteamup-zcode/README_CN.md @@ -0,0 +1,55 @@ +# UteamUP CMMS(ZCode 版) + +将 ZCode 连接到您的 [UteamUP](https://uteamup.com) 工作区,用自然语言查询资产和工单。 +本插件只包含一个远程 MCP 服务和一个 Skill,不包含任何本地代码、钩子或命令。 + +## 工作原理 + +`uteamup` MCP 服务连接生产只读端点 +`https://api.uteamup.com/mcp/read-only`,并通过您自己的 UteamUP 账号进行 +OAuth 2.0 授权(插件自动完成客户端注册,首次使用时 ZCode 会打开 UteamUP +授权页面)。申请的权限范围为 `mcp:read`。 + +前置条件(一次性操作,在 UteamUP 中完成,与 ZCode 无关): + +1. 租户管理员在公司的 **API Keys** 标签页开启 **Allow members to connect AI + assistants**(允许成员连接 AI 助手)。 +2. 首次使用时,在 UteamUP 授权页面登录并选择公司。仅显示您作为所有者或持有 + 许可证的公司。 + +无需 API 密钥或密钥口令。连接使用成员本人在所选公司中的权限。成员可以在 +**Profile → Accounts** 中断开连接;管理员可以在 API Keys 标签页查看并撤销 +所有连接。 + +## 工具 + +- `uteamup_asset_list` — 列出所连接工作区中的资产 +- `uteamup_asset_get_by_guid` — 按 GUID 获取单个资产 +- `uteamup_asset_search` — 搜索资产(名称、全文) +- `uteamup_workorder_list` — 列出所连接工作区中的工单 +- `uteamup_workorder_search` — 搜索工单(标题、描述、全文) + +仅提供上述只读工具;写入或管理类调用会被服务端拒绝。读取操作不会调用 +UteamUP 的 AI 服务,也不消耗 UteamUP AI 积分。 + +## 试一试 + +- "列出我工作区中的前五个资产。" +- "查找名称包含 pump 的资产。" +- "显示我未关闭的工单。" + +## 网络访问、副作用与来源说明 + +- 网络访问:仅出站 HTTPS 访问 `https://api.uteamup.com/mcp/read-only` 及 + UteamUP OAuth 端点(`/oauth/authorize`、`/oauth/token`、`/oauth/register`)。 + 未配置其他网络目标。 +- 本地副作用:无。不写文件、不执行命令、无钩子、无内置二进制文件。插件仅 + 声明一个 MCP 服务和一个 Skill。 +- 第三方服务与代码:UteamUP 是本插件的发布者,并运营唯一被访问的服务。未捆绑 + 第三方代码。Logo 素材归 UteamUP 所有。请求与响应由 Z.ai(ZCode)和 UteamUP + 按各自政策处理;UteamUP 按其隐私政策和工作区保留设置保存记录。 +- 许可证:MIT。隐私政策:https://app.uteamup.com/privacypolicy。 + 服务条款:https://app.uteamup.com/terms。 + 支持渠道:https://github.com/UteamUP/uteamup-mcp/issues。 + 源码维护于 https://github.com/UteamUP/uteamup-mcp(`plugins/uteamup-zcode`), + 也可从 UteamUP 自有插件市场安装。 diff --git a/external_plugins/uteamup-zcode/skills/uteamup/SKILL.md b/external_plugins/uteamup-zcode/skills/uteamup/SKILL.md new file mode 100644 index 0000000..bb9a513 --- /dev/null +++ b/external_plugins/uteamup-zcode/skills/uteamup/SKILL.md @@ -0,0 +1,56 @@ +--- +name: uteamup +description: Use when the user asks about their UteamUP CMMS data — assets, work orders, maintenance, or equipment lookups (e.g. "list my assets", "find work orders about pump", "what assets do we have in Building A"), or wants to search UteamUP records by name, GUID, status, or free text. Read-only; not for writing or updating records. +--- + +# UteamUP CMMS (read-only) + +This skill uses the `uteamup` MCP server (tools prefixed `uteamup_`) to read the +user's UteamUP workspace: companies (tenants), assets, and work orders. + +## Connection + +The server connects to `https://api.uteamup.com/mcp/read-only` and authenticates +with the user's own UteamUP account over OAuth. + +Prerequisites (one-time, done in UteamUP, not in ZCode): + +1. A tenant administrator turns on **Allow members to connect AI assistants** in + the company's **API Keys** tab. +2. On first use ZCode opens the UteamUP consent page; the member signs in, + picks the company (only companies where they are owner or hold a license are + listed), and allows access. + +No API key or secret is needed. The connection uses the member's own +permissions in the chosen company. A member disconnects under +**Profile → Accounts**; administrators can revoke links in the API Keys tab. + +## Tools + +- `uteamup_asset_list` — list assets in the connected workspace +- `uteamup_asset_get_by_guid` — fetch one asset by its GUID +- `uteamup_asset_search` — search assets (name, free text) +- `uteamup_workorder_list` — list work orders in the connected workspace +- `uteamup_workorder_search` — search work orders (title, description, free text) + +Only these read tools are available; guessed write or admin calls are denied +server-side. Reads do not invoke a UteamUP AI provider and spend no AI credits. + +## Usage notes + +- Prefer `list` tools for browsing and `search` tools when the user names + something ("find assets containing 'pump'"). +- Assets and work orders are identified by GUID in results; use + `uteamup_asset_get_by_guid` for follow-up detail on a specific asset. +- If a tool call returns 401 `invalid_token`, the member's license or the + company setting ended, or the link was revoked — tell the user to reconnect + or contact their administrator. +- If the tools are missing entirely, the plugin's MCP server is not connected + yet: ask the user to complete the sign-in flow (Settings → MCP → uteamup). + +## Examples + +- "List the first five assets in my workspace." → `uteamup_asset_list` +- "Find assets whose name contains pump." → `uteamup_asset_search` +- "Show my open work orders." → `uteamup_workorder_list` / `uteamup_workorder_search` +- "Give me details for asset with GUID …" → `uteamup_asset_get_by_guid` diff --git a/marketplace.json b/marketplace.json index 884bfc8..a0e853d 100644 --- a/marketplace.json +++ b/marketplace.json @@ -1409,6 +1409,30 @@ "mcp", "verification" ] + }, + { + "name": "uteamup-zcode", + "source": "./external_plugins/uteamup-zcode", + "description": "Connect ZCode to UteamUP CMMS for read-only work orders, assets, and maintenance data via Model Context Protocol (MCP), signing in with your UteamUP account.", + "description_i18n": { + "en": "Connect ZCode to UteamUP CMMS for read-only work orders, assets, and maintenance data via Model Context Protocol (MCP), signing in with your UteamUP account.", + "zh-CN": "通过 Model Context Protocol(MCP)将 ZCode 连接到 UteamUP CMMS,以只读方式查询工单、资产和维保数据,并使用您自己的 UteamUP 账号登录授权。" + }, + "version": "0.1.0", + "author": { + "name": "UteamUP", + "url": "https://uteamup.com" + }, + "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/uteamup-zcode/icon.png", + "category": "productivity", + "keywords": [ + "mcp", + "uteamup", + "cmms", + "maintenance", + "work-orders", + "asset-management" + ] } ] } \ No newline at end of file