@uteamup/mcp-server 1.0.0-beta.8 → 2.3.0-beta.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +631 -0
- package/README.md +77 -0
- package/assets/logo.png +0 -0
- package/assets/logo.svg +11 -0
- package/index.js +426 -205
- package/lib/config.js +60 -5
- package/lib/logger.js +56 -3
- package/lib/mcp-http-headers.js +87 -0
- package/lib/retry.js +12 -3
- package/lib/transport-security.js +252 -0
- package/openapi-actions.json +234 -0
- package/package.json +27 -13
- package/server.json +77 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
{
|
|
2
|
+
"openapi": "3.1.0",
|
|
3
|
+
"info": {
|
|
4
|
+
"title": "UteamUP CMMS Read-Only Assistant Actions",
|
|
5
|
+
"description": "OpenAPI 3.1.0 Action schema for ChatGPT Custom GPTs (GPT Store) and Google Gemini / Vertex AI Extensions. Invokes the UteamUP read-only MCP endpoint (/mcp/read-only) to list and search assets and work orders using the caller's tenant-scoped permissions.",
|
|
6
|
+
"version": "2.3.0-beta.9",
|
|
7
|
+
"x-logo": {
|
|
8
|
+
"url": "https://raw.githubusercontent.com/UteamUP/uteamup-mcp/main/assets/logo.png",
|
|
9
|
+
"altText": "UteamUP CMMS"
|
|
10
|
+
},
|
|
11
|
+
"contact": {
|
|
12
|
+
"name": "UteamUP Support",
|
|
13
|
+
"email": "support@uteamup.com",
|
|
14
|
+
"url": "https://uteamup.com"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"servers": [
|
|
18
|
+
{
|
|
19
|
+
"url": "https://api.uteamup.com",
|
|
20
|
+
"description": "UteamUP Production API"
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"security": [
|
|
24
|
+
{
|
|
25
|
+
"UteamupOAuth": [
|
|
26
|
+
"mcp:read"
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
"paths": {
|
|
31
|
+
"/mcp/read-only": {
|
|
32
|
+
"post": {
|
|
33
|
+
"operationId": "callUteamupReadOnlyTool",
|
|
34
|
+
"summary": "Execute a read-only UteamUP CMMS tool (assets or work orders)",
|
|
35
|
+
"description": "Calls one of the five read-only UteamUP MCP tools over JSON-RPC 2.0: uteamup_asset_list, uteamup_asset_get_by_guid, uteamup_asset_search, uteamup_workorder_list, or uteamup_workorder_search.",
|
|
36
|
+
"x-openai-isConsequential": false,
|
|
37
|
+
"requestBody": {
|
|
38
|
+
"required": true,
|
|
39
|
+
"content": {
|
|
40
|
+
"application/json": {
|
|
41
|
+
"schema": {
|
|
42
|
+
"$ref": "#/components/schemas/JsonRpcToolCallRequest"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"responses": {
|
|
48
|
+
"200": {
|
|
49
|
+
"description": "JSON-RPC 2.0 tool execution result",
|
|
50
|
+
"content": {
|
|
51
|
+
"application/json": {
|
|
52
|
+
"schema": {
|
|
53
|
+
"$ref": "#/components/schemas/JsonRpcToolCallResponse"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"401": {
|
|
59
|
+
"description": "Missing or invalid OAuth token / API key credential"
|
|
60
|
+
},
|
|
61
|
+
"403": {
|
|
62
|
+
"description": "Caller or API key role does not hold read-only permission for the requested tool"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"components": {
|
|
69
|
+
"securitySchemes": {
|
|
70
|
+
"UteamupOAuth": {
|
|
71
|
+
"type": "oauth2",
|
|
72
|
+
"description": "OAuth 2.0 Authorization Code flow for UteamUP Assistant Connections",
|
|
73
|
+
"flows": {
|
|
74
|
+
"authorizationCode": {
|
|
75
|
+
"authorizationUrl": "https://api.uteamup.com/oauth/authorize",
|
|
76
|
+
"tokenUrl": "https://api.uteamup.com/oauth/token",
|
|
77
|
+
"refreshUrl": "https://api.uteamup.com/oauth/token",
|
|
78
|
+
"scopes": {
|
|
79
|
+
"mcp:read": "Read-only access to UteamUP assets and work orders"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"schemas": {
|
|
86
|
+
"JsonRpcToolCallRequest": {
|
|
87
|
+
"type": "object",
|
|
88
|
+
"required": [
|
|
89
|
+
"jsonrpc",
|
|
90
|
+
"id",
|
|
91
|
+
"method",
|
|
92
|
+
"params"
|
|
93
|
+
],
|
|
94
|
+
"properties": {
|
|
95
|
+
"jsonrpc": {
|
|
96
|
+
"type": "string",
|
|
97
|
+
"const": "2.0",
|
|
98
|
+
"default": "2.0",
|
|
99
|
+
"description": "JSON-RPC protocol version (always '2.0')"
|
|
100
|
+
},
|
|
101
|
+
"id": {
|
|
102
|
+
"type": "integer",
|
|
103
|
+
"default": 1,
|
|
104
|
+
"description": "Request correlation identifier"
|
|
105
|
+
},
|
|
106
|
+
"method": {
|
|
107
|
+
"type": "string",
|
|
108
|
+
"const": "tools/call",
|
|
109
|
+
"default": "tools/call",
|
|
110
|
+
"description": "MCP JSON-RPC method (always 'tools/call')"
|
|
111
|
+
},
|
|
112
|
+
"params": {
|
|
113
|
+
"$ref": "#/components/schemas/ReadOnlyToolCallParams"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
"ReadOnlyToolCallParams": {
|
|
118
|
+
"type": "object",
|
|
119
|
+
"required": [
|
|
120
|
+
"name",
|
|
121
|
+
"arguments"
|
|
122
|
+
],
|
|
123
|
+
"properties": {
|
|
124
|
+
"name": {
|
|
125
|
+
"type": "string",
|
|
126
|
+
"enum": [
|
|
127
|
+
"uteamup_asset_list",
|
|
128
|
+
"uteamup_asset_get_by_guid",
|
|
129
|
+
"uteamup_asset_search",
|
|
130
|
+
"uteamup_workorder_list",
|
|
131
|
+
"uteamup_workorder_search"
|
|
132
|
+
],
|
|
133
|
+
"description": "Name of the read-only UteamUP MCP tool to invoke"
|
|
134
|
+
},
|
|
135
|
+
"arguments": {
|
|
136
|
+
"type": "object",
|
|
137
|
+
"description": "Tool arguments matching the selected tool name",
|
|
138
|
+
"properties": {
|
|
139
|
+
"page": {
|
|
140
|
+
"type": "integer",
|
|
141
|
+
"minimum": 1,
|
|
142
|
+
"default": 1,
|
|
143
|
+
"description": "Page number (for uteamup_asset_list and uteamup_workorder_list)"
|
|
144
|
+
},
|
|
145
|
+
"pageSize": {
|
|
146
|
+
"type": "integer",
|
|
147
|
+
"minimum": 1,
|
|
148
|
+
"maximum": 100,
|
|
149
|
+
"default": 10,
|
|
150
|
+
"description": "Results per page (1-100, for uteamup_asset_list and uteamup_workorder_list)"
|
|
151
|
+
},
|
|
152
|
+
"guid": {
|
|
153
|
+
"type": "string",
|
|
154
|
+
"format": "uuid",
|
|
155
|
+
"description": "Asset ExternalGuid (required for uteamup_asset_get_by_guid)"
|
|
156
|
+
},
|
|
157
|
+
"searchFilter": {
|
|
158
|
+
"type": "string",
|
|
159
|
+
"description": "Case-insensitive search term (required for uteamup_asset_search and uteamup_workorder_search)"
|
|
160
|
+
},
|
|
161
|
+
"assetGuid": {
|
|
162
|
+
"type": "string",
|
|
163
|
+
"format": "uuid",
|
|
164
|
+
"description": "Optional asset GUID filter (for uteamup_workorder_list)"
|
|
165
|
+
},
|
|
166
|
+
"search": {
|
|
167
|
+
"type": "string",
|
|
168
|
+
"description": "Optional name, ticket ID, or workorder GUID filter (for uteamup_workorder_list)"
|
|
169
|
+
},
|
|
170
|
+
"openOnly": {
|
|
171
|
+
"type": "boolean",
|
|
172
|
+
"default": false,
|
|
173
|
+
"description": "When true, return only non-completed and non-cancelled work orders (for uteamup_workorder_list)"
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
"JsonRpcToolCallResponse": {
|
|
180
|
+
"type": "object",
|
|
181
|
+
"required": [
|
|
182
|
+
"jsonrpc",
|
|
183
|
+
"id"
|
|
184
|
+
],
|
|
185
|
+
"properties": {
|
|
186
|
+
"jsonrpc": {
|
|
187
|
+
"type": "string",
|
|
188
|
+
"const": "2.0"
|
|
189
|
+
},
|
|
190
|
+
"id": {
|
|
191
|
+
"type": [
|
|
192
|
+
"integer",
|
|
193
|
+
"string",
|
|
194
|
+
"null"
|
|
195
|
+
]
|
|
196
|
+
},
|
|
197
|
+
"result": {
|
|
198
|
+
"type": "object",
|
|
199
|
+
"properties": {
|
|
200
|
+
"content": {
|
|
201
|
+
"type": "array",
|
|
202
|
+
"items": {
|
|
203
|
+
"type": "object",
|
|
204
|
+
"properties": {
|
|
205
|
+
"type": {
|
|
206
|
+
"type": "string"
|
|
207
|
+
},
|
|
208
|
+
"text": {
|
|
209
|
+
"type": "string"
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
"isError": {
|
|
215
|
+
"type": "boolean"
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
"error": {
|
|
220
|
+
"type": "object",
|
|
221
|
+
"properties": {
|
|
222
|
+
"code": {
|
|
223
|
+
"type": "integer"
|
|
224
|
+
},
|
|
225
|
+
"message": {
|
|
226
|
+
"type": "string"
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uteamup/mcp-server",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.3.0-beta.9",
|
|
4
|
+
"mcpName": "io.github.UteamUP/mcp-server",
|
|
4
5
|
"description": "MCP server client for UteamUP - enables Claude Desktop/Code integration with automatic OAuth 2.0 authentication",
|
|
5
6
|
"main": "index.js",
|
|
6
7
|
"bin": {
|
|
@@ -17,6 +18,10 @@
|
|
|
17
18
|
"claude",
|
|
18
19
|
"claude-desktop",
|
|
19
20
|
"claude-code",
|
|
21
|
+
"grok",
|
|
22
|
+
"chatgpt",
|
|
23
|
+
"gemini",
|
|
24
|
+
"perplexity",
|
|
20
25
|
"oauth",
|
|
21
26
|
"oauth2",
|
|
22
27
|
"pkce",
|
|
@@ -29,35 +34,44 @@
|
|
|
29
34
|
"license": "MIT",
|
|
30
35
|
"repository": {
|
|
31
36
|
"type": "git",
|
|
32
|
-
"url": "git+https://github.com/uteamup
|
|
37
|
+
"url": "git+https://github.com/UteamUP/uteamup-mcp.git"
|
|
33
38
|
},
|
|
34
39
|
"bugs": {
|
|
35
|
-
"url": "https://github.com/uteamup
|
|
40
|
+
"url": "https://github.com/UteamUP/uteamup-mcp/issues"
|
|
36
41
|
},
|
|
37
|
-
"homepage": "https://github.com/uteamup
|
|
42
|
+
"homepage": "https://github.com/UteamUP/uteamup-mcp#readme",
|
|
38
43
|
"scripts": {
|
|
39
44
|
"test": "jest",
|
|
40
45
|
"test:watch": "jest --watch",
|
|
41
46
|
"test:integration": "jest test/integration.test.js",
|
|
42
|
-
"
|
|
47
|
+
"test:ai-governance": "jest test/ai-governance-boundary.test.js test/ai-governance-ci.test.js --runInBand",
|
|
48
|
+
"lint": "eslint index.js lib/ test/",
|
|
43
49
|
"format": "prettier --write \"**/*.{js,json,md}\"",
|
|
44
50
|
"prepublishOnly": "npm test"
|
|
45
51
|
},
|
|
46
52
|
"dependencies": {
|
|
47
|
-
"pino": "^
|
|
48
|
-
"pino-pretty": "^
|
|
49
|
-
"zod": "^
|
|
53
|
+
"pino": "^10.3.1",
|
|
54
|
+
"pino-pretty": "^13.1.3",
|
|
55
|
+
"zod": "^4.4.3"
|
|
50
56
|
},
|
|
51
57
|
"devDependencies": {
|
|
52
|
-
"jest": "^
|
|
53
|
-
"eslint": "^
|
|
54
|
-
"prettier": "^3.
|
|
55
|
-
"nock": "^
|
|
56
|
-
"@types/node": "^
|
|
58
|
+
"jest": "^30.4.2",
|
|
59
|
+
"eslint": "^10.3.0",
|
|
60
|
+
"prettier": "^3.8.3",
|
|
61
|
+
"nock": "^14.0.15",
|
|
62
|
+
"@types/node": "^25.7.0"
|
|
57
63
|
},
|
|
64
|
+
"overrides": {
|
|
65
|
+
"js-yaml": "^4.3.2",
|
|
66
|
+
"@babel/core": "^7.29.7"
|
|
67
|
+
},
|
|
68
|
+
"icon": "assets/logo.png",
|
|
58
69
|
"files": [
|
|
59
70
|
"index.js",
|
|
60
71
|
"lib/",
|
|
72
|
+
"assets/",
|
|
73
|
+
"server.json",
|
|
74
|
+
"openapi-actions.json",
|
|
61
75
|
"README.md",
|
|
62
76
|
"LICENSE",
|
|
63
77
|
"CHANGELOG.md"
|
package/server.json
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
|
+
"name": "io.github.UteamUP/mcp-server",
|
|
4
|
+
"title": "UteamUP CMMS",
|
|
5
|
+
"description": "Connect AI assistants to UteamUP CMMS for work orders, assets, maintenance, and inventory.",
|
|
6
|
+
"version": "2.3.0-beta.9",
|
|
7
|
+
"websiteUrl": "https://uteamup.com",
|
|
8
|
+
"icons": [
|
|
9
|
+
{
|
|
10
|
+
"src": "https://raw.githubusercontent.com/UteamUP/uteamup-mcp/main/assets/logo.svg",
|
|
11
|
+
"mimeType": "image/svg+xml",
|
|
12
|
+
"sizes": [
|
|
13
|
+
"any"
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"src": "https://raw.githubusercontent.com/UteamUP/uteamup-mcp/main/assets/logo.png",
|
|
18
|
+
"mimeType": "image/png",
|
|
19
|
+
"sizes": [
|
|
20
|
+
"512x512"
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"repository": {
|
|
25
|
+
"url": "https://github.com/UteamUP/uteamup-mcp",
|
|
26
|
+
"source": "github"
|
|
27
|
+
},
|
|
28
|
+
"packages": [
|
|
29
|
+
{
|
|
30
|
+
"registryType": "npm",
|
|
31
|
+
"registryBaseUrl": "https://registry.npmjs.org",
|
|
32
|
+
"identifier": "@uteamup/mcp-server",
|
|
33
|
+
"version": "2.3.0-beta.9",
|
|
34
|
+
"transport": {
|
|
35
|
+
"type": "stdio"
|
|
36
|
+
},
|
|
37
|
+
"environmentVariables": [
|
|
38
|
+
{
|
|
39
|
+
"name": "UTEAMUP_API_KEY",
|
|
40
|
+
"description": "32-character MCP-enabled UteamUP tenant API key",
|
|
41
|
+
"isRequired": true,
|
|
42
|
+
"isSecret": true
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "UTEAMUP_SECRET",
|
|
46
|
+
"description": "64-character UteamUP tenant API key secret",
|
|
47
|
+
"isRequired": true,
|
|
48
|
+
"isSecret": true
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"name": "UTEAMUP_API_BASE_URL",
|
|
52
|
+
"description": "UteamUP API origin URL (defaults to https://api.uteamup.com)",
|
|
53
|
+
"isRequired": false,
|
|
54
|
+
"isSecret": false,
|
|
55
|
+
"default": "https://api.uteamup.com"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"name": "UTEAMUP_MCP_PATH",
|
|
59
|
+
"description": "Backend MCP endpoint path (/mcp or /mcp/read-only)",
|
|
60
|
+
"isRequired": false,
|
|
61
|
+
"isSecret": false,
|
|
62
|
+
"default": "/mcp"
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
],
|
|
67
|
+
"remotes": [
|
|
68
|
+
{
|
|
69
|
+
"type": "streamable-http",
|
|
70
|
+
"url": "https://api.uteamup.com/mcp/read-only"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"type": "streamable-http",
|
|
74
|
+
"url": "https://api.uteamup.com/mcp"
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
}
|