@uteamup/mcp-server 1.0.0-beta.9 → 2.4.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 +670 -0
- package/README.md +123 -62
- package/assets/logo.png +0 -0
- package/assets/logo.svg +11 -0
- package/index.js +428 -205
- package/lib/config.js +60 -5
- package/lib/logger.js +54 -2
- 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 +28 -14
- package/server.json +77 -0
package/README.md
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/logo.svg" alt="UteamUP Logo" width="88" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
1
5
|
# @uteamup/mcp-server
|
|
2
6
|
|
|
3
7
|
> MCP server client for UteamUP - enables Claude Desktop/Code integration with automatic OAuth 2.0 authentication
|
|
@@ -9,21 +13,73 @@
|
|
|
9
13
|
## Links
|
|
10
14
|
|
|
11
15
|
- **📦 [npm Package](https://www.npmjs.com/package/@uteamup/mcp-server)** - Install with `npx -y @uteamup/mcp-server`
|
|
12
|
-
- **📖 [Documentation](https://
|
|
13
|
-
- **🐛 [Issues](https://github.com/uteamup
|
|
14
|
-
- **💬 [Support](mailto:
|
|
16
|
+
- **📖 [Documentation](https://github.com/UteamUP/uteamup-mcp#readme)** - Full MCP integration guide
|
|
17
|
+
- **🐛 [Issues](https://github.com/UteamUP/uteamup-mcp/issues)** - Report bugs and request features
|
|
18
|
+
- **💬 [Support](mailto:gisli@uteamup.com)** - Get help
|
|
15
19
|
|
|
16
20
|
## What is this?
|
|
17
21
|
|
|
18
22
|
This package enables AI assistants like Claude Desktop and Claude Code to connect to your UteamUP CMMS system using the Model Context Protocol (MCP). It handles OAuth 2.0 authentication automatically, so you can manage work orders, assets, inventory, and more through natural conversation.
|
|
19
23
|
|
|
24
|
+
### Read-only access for Claude, Grok, Grok Bot and ChatGPT
|
|
25
|
+
|
|
26
|
+
Use the production HTTPS endpoint:
|
|
27
|
+
|
|
28
|
+
| Environment | MCP server URL |
|
|
29
|
+
|---|---|
|
|
30
|
+
| Production | `https://api.uteamup.com/mcp/read-only` |
|
|
31
|
+
|
|
32
|
+
**Sign in with your UteamUP account (recommended).** A tenant administrator (`Tenant.Update`)
|
|
33
|
+
first turns on **Allow members to connect AI assistants** in the company's **API Keys** tab.
|
|
34
|
+
Then each member connects their own assistant; no API key or secret is involved:
|
|
35
|
+
|
|
36
|
+
- **Grok:** open [Connectors](https://grok.com/connectors), choose **New Connector → Custom**,
|
|
37
|
+
and enter the endpoint. Grok registers itself (RFC 7591), sends you to the UteamUP consent
|
|
38
|
+
page, and you pick the company and allow access. Business/Enterprise workspaces require
|
|
39
|
+
their administrator to provision the connector.
|
|
40
|
+
- **Grok Bot:** add a **Custom MCP server, Remote HTTPS** with the endpoint on the Bot's
|
|
41
|
+
Setup → Plugins card; each teammate signs in the first time they use it.
|
|
42
|
+
- **ChatGPT:** add a custom MCP server with the endpoint and choose OAuth; ChatGPT registers
|
|
43
|
+
itself and you approve on the same consent page.
|
|
44
|
+
- **Claude:** add a custom connector with the endpoint, choose **Sign in now** and
|
|
45
|
+
**Register automatically**, then approve on the UteamUP consent page.
|
|
46
|
+
|
|
47
|
+
The assistant uses the member's own permissions in the chosen company, and only the read
|
|
48
|
+
tools below. Access tokens last 60 minutes and refresh tokens rotate on every use. A member
|
|
49
|
+
disconnects under **Profile → Accounts**; an administrator sees and revokes every link in the
|
|
50
|
+
API Keys tab, or with the `uteamup_assistant_connection_list` /
|
|
51
|
+
`uteamup_assistant_connection_revoke` MCP tools. Turning the company setting off stops all
|
|
52
|
+
links immediately.
|
|
53
|
+
|
|
54
|
+
**Tenant API key (service integrations).** The **API Keys → Set up UPMate Integration** wizard
|
|
55
|
+
still offers the **Private read-only pilot for ChatGPT and Grok**: select an active role whose
|
|
56
|
+
grants are exclusively `View`/`Read` and create a separate MCP-enabled key per assistant. In
|
|
57
|
+
ChatGPT, configure OAuth with predefined client credentials (the API key as **Client ID**, its
|
|
58
|
+
secret as **Client Secret**). Grok only supports sign-in, so use the option above for Grok.
|
|
59
|
+
Tenant administrators retain the normal key quotas, expiration, IP restrictions, rate
|
|
60
|
+
limits, rotation, and revocation controls.
|
|
61
|
+
|
|
62
|
+
Only the existing asset list, asset search, asset-by-GUID, work-order list and work-order
|
|
63
|
+
search tools are advertised. Current UPMate capability settings, role permissions and
|
|
64
|
+
tenant scope are checked before discovery and invocation. Guessed write/admin tool calls
|
|
65
|
+
are denied before execution. The read-only endpoint also rejects a key if its persisted
|
|
66
|
+
role gains a write or wildcard permission, or if the key is revoked, expired or rotated.
|
|
67
|
+
These reads do not invoke a UteamUP AI provider or spend UteamUP AI credits.
|
|
68
|
+
|
|
69
|
+
The Node proxy can use the same endpoint with `UTEAMUP_MCP_PATH=/mcp/read-only`.
|
|
70
|
+
Its default `/mcp` transport retains the existing behavior and role-based authorization.
|
|
71
|
+
The CLI continues to use existing API-key creation, role selection and revocation commands;
|
|
72
|
+
no separate credential store or tool implementation is required.
|
|
73
|
+
|
|
74
|
+
References: [OpenAI custom MCP servers](https://developers.openai.com/api/docs/guides/custom-mcp-server)
|
|
75
|
+
and [Grok connectors](https://docs.x.ai/grok/connectors).
|
|
76
|
+
|
|
20
77
|
**Key Features:**
|
|
21
78
|
- ✅ Automatic OAuth 2.0 + PKCE authentication
|
|
22
|
-
- ✅ Token caching
|
|
79
|
+
- ✅ Token caching with automatic refresh
|
|
23
80
|
- ✅ Works with Claude Desktop, Claude Code, and any MCP-compatible client
|
|
24
81
|
- ✅ Zero configuration - just provide API credentials
|
|
25
82
|
- ✅ Comprehensive error messages
|
|
26
|
-
- ✅ Development mode support (self-signed certificates)
|
|
27
83
|
- ✅ Server-Sent Events (SSE) response parsing
|
|
28
84
|
- ✅ Proper JSON-RPC 2.0 notification handling
|
|
29
85
|
- ✅ **NEW:** Structured logging with Pino (JSON/text formats)
|
|
@@ -31,9 +87,10 @@ This package enables AI assistants like Claude Desktop and Claude Code to connec
|
|
|
31
87
|
- ✅ **NEW:** Performance monitoring and metrics
|
|
32
88
|
- ✅ **NEW:** Retry logic with exponential backoff
|
|
33
89
|
- ✅ **NEW:** CLI utilities (--help, --version, --validate-config, --test-auth)
|
|
34
|
-
- ✅
|
|
90
|
+
- ✅ Comprehensive test suite
|
|
35
91
|
|
|
36
|
-
**
|
|
92
|
+
**Release status:** Beta. The npm badge above shows the published version;
|
|
93
|
+
see [CHANGELOG.md](CHANGELOG.md) for release details.
|
|
37
94
|
|
|
38
95
|
**Example Conversation:**
|
|
39
96
|
```
|
|
@@ -60,6 +117,22 @@ Or install globally:
|
|
|
60
117
|
npm install -g @uteamup/mcp-server
|
|
61
118
|
```
|
|
62
119
|
|
|
120
|
+
### Install via CLI Plugin Marketplaces
|
|
121
|
+
|
|
122
|
+
- **Claude Code:**
|
|
123
|
+
```bash
|
|
124
|
+
claude plugin marketplace add UteamUP/uteamup-mcp
|
|
125
|
+
claude plugin install uteamup@uteamup
|
|
126
|
+
```
|
|
127
|
+
- **Grok Build:**
|
|
128
|
+
```bash
|
|
129
|
+
grok plugin install https://github.com/UteamUP/uteamup-mcp.git --trust
|
|
130
|
+
```
|
|
131
|
+
- **Gemini CLI:**
|
|
132
|
+
```bash
|
|
133
|
+
gemini extensions install https://github.com/UteamUP/uteamup-mcp
|
|
134
|
+
```
|
|
135
|
+
|
|
63
136
|
---
|
|
64
137
|
|
|
65
138
|
## Quick Start
|
|
@@ -75,8 +148,11 @@ npm install -g @uteamup/mcp-server
|
|
|
75
148
|
|
|
76
149
|
### 2. Configure Claude Desktop
|
|
77
150
|
|
|
78
|
-
**
|
|
79
|
-
|
|
151
|
+
In Claude Desktop, open **Settings → Developer → Edit Config**.
|
|
152
|
+
The configuration file is located at:
|
|
153
|
+
|
|
154
|
+
- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
155
|
+
- **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
|
|
80
156
|
|
|
81
157
|
Add this configuration:
|
|
82
158
|
|
|
@@ -95,22 +171,8 @@ Add this configuration:
|
|
|
95
171
|
}
|
|
96
172
|
```
|
|
97
173
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
{
|
|
101
|
-
"mcpServers": {
|
|
102
|
-
"uteamup-dev": {
|
|
103
|
-
"command": "npx",
|
|
104
|
-
"args": ["-y", "@uteamup/mcp-server"],
|
|
105
|
-
"env": {
|
|
106
|
-
"UTEAMUP_API_KEY": "your-api-key",
|
|
107
|
-
"UTEAMUP_SECRET": "your-secret",
|
|
108
|
-
"UTEAMUP_API_BASE_URL": "https://devback.uteamup.com"
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
```
|
|
174
|
+
All UteamUP MCP connections use `https://api.uteamup.com`. Use a restricted key
|
|
175
|
+
from a demo workspace when validating an integration.
|
|
114
176
|
|
|
115
177
|
### 3. Restart Claude Desktop
|
|
116
178
|
|
|
@@ -150,16 +212,19 @@ That's it! 🎉
|
|
|
150
212
|
| `UTEAMUP_DEBUG` | Legacy debug mode (`1` or `true`) | `false` |
|
|
151
213
|
| `UTEAMUP_REQUEST_TIMEOUT` | Request timeout in milliseconds | `30000` |
|
|
152
214
|
| `UTEAMUP_MAX_RETRIES` | Max retry attempts for network errors | `3` |
|
|
215
|
+
| `UTEAMUP_MAX_REQUEST_BYTES` | Maximum bytes in one JSON-RPC request | `1048576` |
|
|
216
|
+
| `UTEAMUP_MAX_RESPONSE_BYTES` | Maximum bytes buffered from one backend response | `10485760` |
|
|
153
217
|
| `UTEAMUP_TOKEN_CACHE_DIR` | Persistent token cache directory | - |
|
|
154
218
|
| `UTEAMUP_TOKEN_REFRESH_MARGIN` | Token refresh margin in seconds | `300` |
|
|
155
219
|
|
|
156
|
-
### API Base
|
|
220
|
+
### API Base URL
|
|
221
|
+
|
|
222
|
+
The configured base URL must be a bare HTTPS origin. Credentials, paths, query
|
|
223
|
+
parameters, fragments, and plain HTTP endpoints are rejected.
|
|
157
224
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
| **Development** | `https://devback.uteamup.com` | Testing against dev backend |
|
|
162
|
-
| **Local** | `https://localhost:5002` | Local development with self-signed cert |
|
|
225
|
+
Always use `https://api.uteamup.com`, including when running the Node proxy
|
|
226
|
+
locally. The full MCP endpoint is `/mcp`; the read-only endpoint is
|
|
227
|
+
`/mcp/read-only`.
|
|
163
228
|
|
|
164
229
|
### Permissions
|
|
165
230
|
|
|
@@ -183,7 +248,7 @@ Your AI assistant's permissions are controlled by the **role assigned to your AP
|
|
|
183
248
|
**Cause:** `UTEAMUP_API_KEY` or `UTEAMUP_SECRET` not set in MCP configuration.
|
|
184
249
|
|
|
185
250
|
**Solution:**
|
|
186
|
-
1. Check your
|
|
251
|
+
1. Check your Claude Desktop configuration file (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS or `%APPDATA%\Claude\claude_desktop_config.json` on Windows)
|
|
187
252
|
2. Verify the `env` section includes both `UTEAMUP_API_KEY` and `UTEAMUP_SECRET`
|
|
188
253
|
3. Ensure there are no typos in the environment variable names
|
|
189
254
|
4. Restart Claude Desktop after making changes
|
|
@@ -232,36 +297,32 @@ Your AI assistant's permissions are controlled by the **role assigned to your AP
|
|
|
232
297
|
1. **Check your internet connection**
|
|
233
298
|
2. **Verify the base URL:**
|
|
234
299
|
- Production: `https://api.uteamup.com` (default, no env var needed)
|
|
235
|
-
- Development: Set `UTEAMUP_API_BASE_URL=https://devback.uteamup.com`
|
|
236
300
|
3. **Check if UteamUP is down:**
|
|
237
|
-
- Contact
|
|
238
|
-
4. **For local development:**
|
|
239
|
-
- Ensure backend is running: `cd UteamUP_Backend/UteamUP_API && make watch`
|
|
240
|
-
- Use `UTEAMUP_API_BASE_URL=https://localhost:5002`
|
|
301
|
+
- Contact gisli@uteamup.com
|
|
241
302
|
|
|
242
303
|
---
|
|
243
304
|
|
|
244
305
|
#### "UNABLE_TO_VERIFY_LEAF_SIGNATURE" or certificate errors
|
|
245
306
|
|
|
246
|
-
**Cause:**
|
|
307
|
+
**Cause:** The connection cannot validate the server's TLS certificate.
|
|
247
308
|
|
|
248
|
-
**Solution:**
|
|
249
|
-
1. Verify
|
|
250
|
-
2.
|
|
251
|
-
3.
|
|
309
|
+
**Solution:**
|
|
310
|
+
1. Verify the API base URL is `https://api.uteamup.com`
|
|
311
|
+
2. Check the device's date and trusted certificate configuration
|
|
312
|
+
3. Contact gisli@uteamup.com if the certificate error persists
|
|
252
313
|
|
|
253
314
|
---
|
|
254
315
|
|
|
255
316
|
#### Tools list is empty or incomplete
|
|
256
317
|
|
|
257
|
-
**Cause:**
|
|
318
|
+
**Cause:** The credential, role, or company configuration does not grant the requested tools.
|
|
258
319
|
|
|
259
320
|
**Solution:**
|
|
260
321
|
1. Go to **Tenant Settings** → **API Keys** in UteamUP
|
|
261
|
-
2.
|
|
262
|
-
3.
|
|
263
|
-
4.
|
|
264
|
-
5.
|
|
322
|
+
2. Confirm the key is active and MCP-enabled for the intended company
|
|
323
|
+
3. Ask a company administrator to check the specific read permissions needed for your workflow
|
|
324
|
+
4. For the remote read-only connector, use a restricted read-only role; write or wildcard grants are not eligible
|
|
325
|
+
5. Reconnect the client to refresh its tool list after an authorized permission change
|
|
265
326
|
|
|
266
327
|
---
|
|
267
328
|
|
|
@@ -325,9 +386,9 @@ Enable different log levels and formats:
|
|
|
325
386
|
```
|
|
326
387
|
|
|
327
388
|
4. **Get help:**
|
|
328
|
-
- Email:
|
|
329
|
-
- Documentation: https://
|
|
330
|
-
- GitHub Issues: https://github.com/uteamup
|
|
389
|
+
- Email: gisli@uteamup.com
|
|
390
|
+
- Documentation: https://github.com/UteamUP/uteamup-mcp#readme
|
|
391
|
+
- GitHub Issues: https://github.com/UteamUP/uteamup-mcp/issues
|
|
331
392
|
|
|
332
393
|
---
|
|
333
394
|
|
|
@@ -337,20 +398,20 @@ Enable different log levels and formats:
|
|
|
337
398
|
|
|
338
399
|
```bash
|
|
339
400
|
# Clone the repository
|
|
340
|
-
git clone https://github.com/UteamUP/uteamup-mcp
|
|
341
|
-
cd uteamup-mcp
|
|
401
|
+
git clone https://github.com/UteamUP/uteamup-mcp.git
|
|
402
|
+
cd uteamup-mcp
|
|
342
403
|
|
|
343
404
|
# Install dependencies
|
|
344
405
|
npm install
|
|
345
406
|
|
|
346
|
-
# Run tests
|
|
347
|
-
npm test
|
|
407
|
+
# Run tests only at the final whole-goal gate (see MCPGuidelines.md)
|
|
408
|
+
UTEAMUP_FINAL_GOAL_GATE=1 npm test
|
|
348
409
|
|
|
349
410
|
# Test with debug logging
|
|
350
411
|
export UTEAMUP_LOG_LEVEL=DEBUG
|
|
351
|
-
export UTEAMUP_API_KEY="your-
|
|
352
|
-
export UTEAMUP_SECRET="your-
|
|
353
|
-
export UTEAMUP_API_BASE_URL="https://
|
|
412
|
+
export UTEAMUP_API_KEY="your-demo-workspace-key"
|
|
413
|
+
export UTEAMUP_SECRET="your-demo-workspace-secret"
|
|
414
|
+
export UTEAMUP_API_BASE_URL="https://api.uteamup.com"
|
|
354
415
|
node index.js
|
|
355
416
|
|
|
356
417
|
# CLI Utilities
|
|
@@ -374,7 +435,7 @@ npm link
|
|
|
374
435
|
"mcpServers": {
|
|
375
436
|
"uteamup-local": {
|
|
376
437
|
"command": "node",
|
|
377
|
-
"args": ["/absolute/path/to/uteamup-mcp
|
|
438
|
+
"args": ["/absolute/path/to/uteamup-mcp/index.js"],
|
|
378
439
|
"env": {
|
|
379
440
|
"UTEAMUP_API_KEY": "your-key",
|
|
380
441
|
"UTEAMUP_SECRET": "your-secret",
|
|
@@ -388,7 +449,7 @@ npm link
|
|
|
388
449
|
### Project Structure
|
|
389
450
|
|
|
390
451
|
```
|
|
391
|
-
uteamup-mcp
|
|
452
|
+
uteamup-mcp/
|
|
392
453
|
├── index.js # Main entry point (OAuth + MCP client)
|
|
393
454
|
├── package.json # Package metadata
|
|
394
455
|
├── README.md # This file
|
|
@@ -473,9 +534,9 @@ See [LICENSE](LICENSE) for details.
|
|
|
473
534
|
|
|
474
535
|
## Support
|
|
475
536
|
|
|
476
|
-
- **Documentation:** https://
|
|
477
|
-
- **Email:**
|
|
478
|
-
- **Issues:** https://github.com/uteamup
|
|
537
|
+
- **Documentation:** https://github.com/UteamUP/uteamup-mcp#readme
|
|
538
|
+
- **Email:** gisli@uteamup.com
|
|
539
|
+
- **Issues:** https://github.com/UteamUP/uteamup-mcp/issues
|
|
479
540
|
|
|
480
541
|
---
|
|
481
542
|
|
package/assets/logo.png
ADDED
|
Binary file
|
package/assets/logo.svg
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512" fill="none" role="img" aria-label="UteamUP">
|
|
2
|
+
<path d="M372.26,86.67 L372.26,188.95 L255.84,121.72 L255.84,32.00 C268.46,32.00 281.07,34.91 292.65,40.71 L292.66,40.72 Z" fill="#FAA61A"/>
|
|
3
|
+
<path d="M255.84,32.00 L255.84,121.72 L139.40,188.95 L139.40,86.67 L219.07,40.68 C230.63,34.90 243.23,32.00 255.84,32.00 Z" fill="#F37021"/>
|
|
4
|
+
<path d="M461.16,137.59 L460.82,279.69 L460.70,331.35 L460.70,331.37 L460.70,331.39 C459.99,344.51 456.15,357.07 449.74,368.13 C449.74,368.13 449.74,368.14 449.73,368.14 L372.25,323.40 L372.03,323.28 L372.26,188.95 L460.82,137.78 Z" fill="#184795"/>
|
|
5
|
+
<path d="M139.40,188.95 L139.40,323.39 L61.92,368.13 C54.78,355.81 50.84,341.64 50.84,326.91 L50.84,137.82 Z" fill="#198F45"/>
|
|
6
|
+
<path d="M449.74,368.13 C449.74,368.13 449.74,368.14 449.73,368.14 C442.64,380.36 432.40,390.77 419.74,398.07 L296.91,468.99 C284.20,476.32 270.02,480.00 255.84,480.00 L255.84,390.61 L372.25,323.40 L372.26,323.39 Z" fill="#28327A"/>
|
|
7
|
+
<path d="M255.84,390.61 L255.84,480.00 C241.64,480.00 227.46,476.32 214.75,468.98 L91.92,398.07 C79.25,390.76 69.02,380.36 61.92,368.13 L139.40,323.39 Z" fill="#176334"/>
|
|
8
|
+
<path d="M255.84,256.17 L255.84,390.61 L139.40,323.39 L139.40,188.95 Z" fill="#1BAE4B"/>
|
|
9
|
+
<path d="M372.26,188.95 L372.26,323.39 L255.84,390.61 L255.84,256.16 Z" fill="#1A6CB5"/>
|
|
10
|
+
<path d="M372.26,188.95 L255.84,256.16 L255.84,256.17 L139.40,188.95 L255.84,121.72 Z" fill="#F9ED24"/>
|
|
11
|
+
</svg>
|