@loxtep/customer-mcp-server 1.0.0
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/README.md +155 -0
- package/dist/auth.d.ts +49 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +113 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +167 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +123 -0
- package/dist/index.js.map +1 -0
- package/dist/tools.d.ts +17 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +359 -0
- package/dist/tools.js.map +1 -0
- package/package.json +46 -0
package/README.md
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Loxtep Customer MCP Server
|
|
2
|
+
|
|
3
|
+
Proxy MCP server for Loxtep customers: log in via the Loxtep app UI, then run
|
|
4
|
+
tools in Cursor, Claude Desktop, or any MCP-compatible client with your saved
|
|
5
|
+
tokens.
|
|
6
|
+
|
|
7
|
+
## Prerequisites
|
|
8
|
+
|
|
9
|
+
- **Role:** Your account must have `owner`, `admin`, or `developer` role. The
|
|
10
|
+
`ai:mcp_tools` permission is only granted to those roles. If you get 403
|
|
11
|
+
errors, contact your organization owner.
|
|
12
|
+
- Node.js 18+.
|
|
13
|
+
|
|
14
|
+
## Quickstart
|
|
15
|
+
|
|
16
|
+
### 1. Login (one-time setup)
|
|
17
|
+
|
|
18
|
+
Save your authentication tokens by opening the browser-based login flow:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npx @loxtep/customer-mcp-server login
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
This opens your browser to the Loxtep app. Sign in (with MFA if enabled), then
|
|
25
|
+
tokens are saved to `~/.loxtep/customer-mcp.json` with restricted permissions.
|
|
26
|
+
|
|
27
|
+
### 2. Choose your MCP client and add the server config
|
|
28
|
+
|
|
29
|
+
Jump to [MCP Setup](#mcp-setup) below for your client (Cursor, Claude, or
|
|
30
|
+
other).
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## MCP Setup
|
|
35
|
+
|
|
36
|
+
After running `npx @loxtep/customer-mcp-server login` once, choose your client:
|
|
37
|
+
|
|
38
|
+
### Cursor
|
|
39
|
+
|
|
40
|
+
Add to **Cursor Settings → MCP** (or `~/.cursor/mcp.json` or Cursor settings
|
|
41
|
+
UI):
|
|
42
|
+
|
|
43
|
+
```json
|
|
44
|
+
{
|
|
45
|
+
"mcpServers": {
|
|
46
|
+
"loxtep": {
|
|
47
|
+
"command": "npx",
|
|
48
|
+
"args": ["@loxtep/customer-mcp-server"]
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Then restart Cursor. The Loxtep tools appear in the MCP palette.
|
|
55
|
+
|
|
56
|
+
### Claude Desktop
|
|
57
|
+
|
|
58
|
+
Edit your Claude config file (`~/.claude/mcp.json` on macOS/Linux;
|
|
59
|
+
`%APPDATA%\.claude\mcp.json` on Windows):
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"mcpServers": {
|
|
64
|
+
"loxtep": {
|
|
65
|
+
"command": "npx",
|
|
66
|
+
"args": ["@loxtep/customer-mcp-server"]
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Restart Claude Desktop. The Loxtep tools appear in the MCP list.
|
|
73
|
+
|
|
74
|
+
### Other Stdio Clients
|
|
75
|
+
|
|
76
|
+
For any MCP-compatible client that uses stdio:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# Option 1: npx (recommended)
|
|
80
|
+
npx @loxtep/customer-mcp-server
|
|
81
|
+
|
|
82
|
+
# Option 2: global install, then run
|
|
83
|
+
npm install -g @loxtep/customer-mcp-server
|
|
84
|
+
loxtep-mcp-server
|
|
85
|
+
|
|
86
|
+
# Option 3: local package with pnpm
|
|
87
|
+
pnpm exec loxtep-mcp server
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
All three commands start the stdio MCP server. Use the one that fits your setup.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Environment Variables (Optional)
|
|
95
|
+
|
|
96
|
+
- `LOXTEP_API_BASE_URL` – API endpoint (default: `https://api.loxtep.io`)
|
|
97
|
+
- `LOXTEP_TOKEN_FILE` – Custom path to token file (default:
|
|
98
|
+
`~/.loxtep/customer-mcp.json`)
|
|
99
|
+
- `LOXTEP_APP_URL` – App base URL for login (default:
|
|
100
|
+
`https://devapp.loxtep.io`)
|
|
101
|
+
- `LOXTEP_AUTH_TOKEN` – Direct access token (no refresh; only if refresh token
|
|
102
|
+
unavailable)
|
|
103
|
+
- `MCP_DEBUG` – Set to `1` for verbose logging on stderr
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Security
|
|
108
|
+
|
|
109
|
+
- **Only log in via official channels** – Use
|
|
110
|
+
`npx @loxtep/customer-mcp-server login` or `loxtep-mcp login` from the
|
|
111
|
+
official `@loxtep/customer-mcp-server` package.
|
|
112
|
+
- **Token file permissions** – Stored at `~/.loxtep/customer-mcp.json` with mode
|
|
113
|
+
0600 (Unix) or best-effort (Windows). Do not share or commit to version
|
|
114
|
+
control.
|
|
115
|
+
- **Login port** – Uses fixed port **38473** on `127.0.0.1`. If in use, login
|
|
116
|
+
fails with clear message.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Token Expiration & Refresh
|
|
121
|
+
|
|
122
|
+
Session cookies in the Loxtep app expire every 1 hour. If you logged in more
|
|
123
|
+
than an hour ago, the MCP auth page will redirect you to log in again. Simply
|
|
124
|
+
run:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
npx @loxtep/customer-mcp-server login
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Build (Development)
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
pnpm install
|
|
136
|
+
pnpm run build
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Debug & Troubleshooting
|
|
142
|
+
|
|
143
|
+
Enable debug logging:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
MCP_DEBUG=1 npx @loxtep/customer-mcp-server
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Check that:
|
|
150
|
+
|
|
151
|
+
1. You've run `npx @loxtep/customer-mcp-server login` at least once.
|
|
152
|
+
2. Your role has `ai:mcp_tools` permission (contact org owner if not).
|
|
153
|
+
3. Your token file exists at `~/.loxtep/customer-mcp.json`.
|
|
154
|
+
4. The client MCP config points to `npx @loxtep/customer-mcp-server` or an
|
|
155
|
+
equivalent command.
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token loading, refresh, and file I/O for customer MCP.
|
|
3
|
+
* - Load from LOXTEP_AUTH_TOKEN (access only) or ~/.loxtep/customer-mcp.json
|
|
4
|
+
* - Decode JWT exp for expires_at
|
|
5
|
+
* - On refresh: MUST save new tokens (backend rotates refresh token)
|
|
6
|
+
*/
|
|
7
|
+
export interface TokenFile {
|
|
8
|
+
access_token: string;
|
|
9
|
+
refresh_token: string;
|
|
10
|
+
expires_at?: string;
|
|
11
|
+
api_base_url: string;
|
|
12
|
+
}
|
|
13
|
+
export interface AuthTokens {
|
|
14
|
+
access_token: string;
|
|
15
|
+
refresh_token?: string;
|
|
16
|
+
expires_at?: string;
|
|
17
|
+
api_base_url: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Decode JWT exp claim (seconds since epoch) and return ISO8601 string.
|
|
21
|
+
* Returns undefined if decode fails (caller can rely on 401-based refresh).
|
|
22
|
+
*/
|
|
23
|
+
export declare function getExpiresAtFromJwt(accessToken: string): string | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Load tokens: env LOXTEP_AUTH_TOKEN (access only), or token file.
|
|
26
|
+
* api_base_url from env LOXTEP_API_BASE_URL (required when using file).
|
|
27
|
+
*/
|
|
28
|
+
export declare function loadTokens(): AuthTokens | null;
|
|
29
|
+
/**
|
|
30
|
+
* Check if access token is expired (with 60s buffer).
|
|
31
|
+
*/
|
|
32
|
+
export declare function isAccessExpired(tokens: AuthTokens): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Call POST {apiBaseUrl}/app/auth/refresh with refresh_token.
|
|
35
|
+
* Returns new tokens; caller MUST save them (backend revokes old refresh token).
|
|
36
|
+
*/
|
|
37
|
+
export declare function refreshAccess(apiBaseUrl: string, refreshToken: string): Promise<RefreshResponse>;
|
|
38
|
+
export interface RefreshResponse {
|
|
39
|
+
access_token: string;
|
|
40
|
+
refresh_token: string;
|
|
41
|
+
expires_at: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Write token file with mode 0600 (best-effort on Windows).
|
|
45
|
+
* Creates ~/.loxtep if needed.
|
|
46
|
+
*/
|
|
47
|
+
export declare function writeTokenFile(tokens: TokenFile): void;
|
|
48
|
+
export declare function getTokenFilePath(): string;
|
|
49
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAU3E;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,UAAU,GAAG,IAAI,CA0B9C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAI3D;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,eAAe,CAAC,CA0B1B;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAYtD;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token loading, refresh, and file I/O for customer MCP.
|
|
3
|
+
* - Load from LOXTEP_AUTH_TOKEN (access only) or ~/.loxtep/customer-mcp.json
|
|
4
|
+
* - Decode JWT exp for expires_at
|
|
5
|
+
* - On refresh: MUST save new tokens (backend rotates refresh token)
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import * as jwt from 'jsonwebtoken';
|
|
10
|
+
const DEFAULT_TOKEN_FILE = process.env.LOXTEP_TOKEN_FILE ||
|
|
11
|
+
path.join(process.env.HOME || process.env.USERPROFILE || '', '.loxtep', 'customer-mcp.json');
|
|
12
|
+
/**
|
|
13
|
+
* Decode JWT exp claim (seconds since epoch) and return ISO8601 string.
|
|
14
|
+
* Returns undefined if decode fails (caller can rely on 401-based refresh).
|
|
15
|
+
*/
|
|
16
|
+
export function getExpiresAtFromJwt(accessToken) {
|
|
17
|
+
try {
|
|
18
|
+
const decoded = jwt.decode(accessToken);
|
|
19
|
+
if (decoded?.exp) {
|
|
20
|
+
return new Date(decoded.exp * 1000).toISOString();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// ignore
|
|
25
|
+
}
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Load tokens: env LOXTEP_AUTH_TOKEN (access only), or token file.
|
|
30
|
+
* api_base_url from env LOXTEP_API_BASE_URL (required when using file).
|
|
31
|
+
*/
|
|
32
|
+
export function loadTokens() {
|
|
33
|
+
const apiBaseUrl = process.env.LOXTEP_API_BASE_URL;
|
|
34
|
+
const envToken = process.env.LOXTEP_AUTH_TOKEN;
|
|
35
|
+
if (envToken && apiBaseUrl) {
|
|
36
|
+
return {
|
|
37
|
+
access_token: envToken,
|
|
38
|
+
api_base_url: apiBaseUrl,
|
|
39
|
+
expires_at: getExpiresAtFromJwt(envToken),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const tokenPath = DEFAULT_TOKEN_FILE;
|
|
43
|
+
try {
|
|
44
|
+
const raw = fs.readFileSync(tokenPath, 'utf-8');
|
|
45
|
+
const data = JSON.parse(raw);
|
|
46
|
+
if (!data.access_token || !data.api_base_url)
|
|
47
|
+
return null;
|
|
48
|
+
return {
|
|
49
|
+
access_token: data.access_token,
|
|
50
|
+
refresh_token: data.refresh_token,
|
|
51
|
+
expires_at: data.expires_at ?? getExpiresAtFromJwt(data.access_token),
|
|
52
|
+
api_base_url: data.api_base_url,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check if access token is expired (with 60s buffer).
|
|
61
|
+
*/
|
|
62
|
+
export function isAccessExpired(tokens) {
|
|
63
|
+
if (!tokens.expires_at)
|
|
64
|
+
return false;
|
|
65
|
+
const exp = new Date(tokens.expires_at).getTime();
|
|
66
|
+
return Date.now() >= exp - 60_000;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Call POST {apiBaseUrl}/app/auth/refresh with refresh_token.
|
|
70
|
+
* Returns new tokens; caller MUST save them (backend revokes old refresh token).
|
|
71
|
+
*/
|
|
72
|
+
export async function refreshAccess(apiBaseUrl, refreshToken) {
|
|
73
|
+
const url = `${apiBaseUrl.replace(/\/$/, '')}/app/auth/refresh`;
|
|
74
|
+
const res = await fetch(url, {
|
|
75
|
+
method: 'POST',
|
|
76
|
+
headers: { 'Content-Type': 'application/json' },
|
|
77
|
+
body: JSON.stringify({ refresh_token: refreshToken }),
|
|
78
|
+
});
|
|
79
|
+
const data = (await res.json());
|
|
80
|
+
if (!res.ok || !data.success) {
|
|
81
|
+
throw new Error(data.error || `Refresh failed: ${res.status}`);
|
|
82
|
+
}
|
|
83
|
+
const access = data.access_token;
|
|
84
|
+
return {
|
|
85
|
+
access_token: access,
|
|
86
|
+
refresh_token: data.refresh_token,
|
|
87
|
+
expires_at: data.expires_at ??
|
|
88
|
+
getExpiresAtFromJwt(access) ??
|
|
89
|
+
new Date(Date.now() + 3600_000).toISOString(),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Write token file with mode 0600 (best-effort on Windows).
|
|
94
|
+
* Creates ~/.loxtep if needed.
|
|
95
|
+
*/
|
|
96
|
+
export function writeTokenFile(tokens) {
|
|
97
|
+
const tokenPath = DEFAULT_TOKEN_FILE;
|
|
98
|
+
const dir = path.dirname(tokenPath);
|
|
99
|
+
if (!fs.existsSync(dir)) {
|
|
100
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
101
|
+
}
|
|
102
|
+
fs.writeFileSync(tokenPath, JSON.stringify(tokens, null, 2), { mode: 0o600 });
|
|
103
|
+
try {
|
|
104
|
+
fs.chmodSync(tokenPath, 0o600);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Best-effort on Windows (NTFS doesn't use Unix permissions)
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
export function getTokenFilePath() {
|
|
111
|
+
return DEFAULT_TOKEN_FILE;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAsDA,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAgF9C"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createServer } from 'http';
|
|
3
|
+
import { parse as parseUrl } from 'url';
|
|
4
|
+
import open from 'open';
|
|
5
|
+
import { getExpiresAtFromJwt, writeTokenFile, getTokenFilePath } from './auth.js';
|
|
6
|
+
import { spawn } from 'child_process';
|
|
7
|
+
import { fileURLToPath } from 'url';
|
|
8
|
+
import { dirname, join } from 'path';
|
|
9
|
+
const PORT = 38473;
|
|
10
|
+
const HOST = '127.0.0.1';
|
|
11
|
+
const APP_BASE_URL = process.env.LOXTEP_APP_URL || 'https://devapp.loxtep.io';
|
|
12
|
+
const API_BASE_URL = process.env.LOXTEP_API_BASE_URL || 'https://api.loxtep.io';
|
|
13
|
+
function getCallbackPage() {
|
|
14
|
+
return `<!DOCTYPE html>
|
|
15
|
+
<html>
|
|
16
|
+
<head><title>Loxtep MCP Login</title></head>
|
|
17
|
+
<body>
|
|
18
|
+
<p id="msg">Connecting...</p>
|
|
19
|
+
<script>
|
|
20
|
+
(function() {
|
|
21
|
+
var hash = window.location.hash.slice(1);
|
|
22
|
+
if (!hash) {
|
|
23
|
+
document.getElementById('msg').textContent = 'No tokens in URL. Close this window and run: loxtep-mcp login';
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
var params = new URLSearchParams(hash);
|
|
27
|
+
var access_token = params.get('access_token');
|
|
28
|
+
var refresh_token = params.get('refresh_token');
|
|
29
|
+
if (!access_token || !refresh_token) {
|
|
30
|
+
document.getElementById('msg').textContent = 'Missing access_token or refresh_token. Close and run: loxtep-mcp login';
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
fetch('/receive', {
|
|
34
|
+
method: 'POST',
|
|
35
|
+
headers: { 'Content-Type': 'application/json' },
|
|
36
|
+
body: JSON.stringify({ access_token: access_token, refresh_token: refresh_token })
|
|
37
|
+
}).then(function(r) {
|
|
38
|
+
if (r.ok) return r.text();
|
|
39
|
+
throw new Error(r.status + ' ' + r.statusText);
|
|
40
|
+
}).then(function(text) {
|
|
41
|
+
document.getElementById('msg').textContent = text || 'Login successful. You can close this window.';
|
|
42
|
+
}).catch(function(e) {
|
|
43
|
+
document.getElementById('msg').textContent = 'Error: ' + e.message + '. You can close this window and try again (loxtep-mcp login).';
|
|
44
|
+
});
|
|
45
|
+
})();
|
|
46
|
+
</script>
|
|
47
|
+
</body>
|
|
48
|
+
</html>`;
|
|
49
|
+
}
|
|
50
|
+
export async function runLogin() {
|
|
51
|
+
return new Promise((resolve, reject) => {
|
|
52
|
+
const server = createServer((req, res) => {
|
|
53
|
+
const url = parseUrl(req.url || '/', true);
|
|
54
|
+
const pathname = url.pathname || '/';
|
|
55
|
+
if (req.method === 'GET' && pathname === '/callback') {
|
|
56
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
57
|
+
res.end(getCallbackPage());
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (req.method === 'POST' && pathname === '/receive') {
|
|
61
|
+
let body = '';
|
|
62
|
+
req.on('data', chunk => (body += chunk));
|
|
63
|
+
req.on('end', () => {
|
|
64
|
+
try {
|
|
65
|
+
const data = JSON.parse(body);
|
|
66
|
+
const access_token = data.access_token;
|
|
67
|
+
const refresh_token = data.refresh_token;
|
|
68
|
+
if (!access_token || !refresh_token) {
|
|
69
|
+
res.writeHead(400, { 'Content-Type': 'text/plain' });
|
|
70
|
+
res.end('Missing access_token or refresh_token');
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const expires_at = getExpiresAtFromJwt(access_token);
|
|
74
|
+
writeTokenFile({
|
|
75
|
+
access_token,
|
|
76
|
+
refresh_token,
|
|
77
|
+
expires_at,
|
|
78
|
+
api_base_url: API_BASE_URL,
|
|
79
|
+
});
|
|
80
|
+
res.writeHead(200, { 'Content-Type': 'text/plain' });
|
|
81
|
+
res.end('Login successful. You can close this window.');
|
|
82
|
+
done();
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
res.writeHead(400, { 'Content-Type': 'text/plain' });
|
|
86
|
+
res.end('Invalid JSON body');
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
res.writeHead(404);
|
|
92
|
+
res.end('Not found');
|
|
93
|
+
});
|
|
94
|
+
let settled = false;
|
|
95
|
+
function done() {
|
|
96
|
+
if (settled)
|
|
97
|
+
return;
|
|
98
|
+
settled = true;
|
|
99
|
+
setTimeout(() => {
|
|
100
|
+
server.close(() => resolve());
|
|
101
|
+
}, 500);
|
|
102
|
+
}
|
|
103
|
+
server.listen(PORT, HOST, () => {
|
|
104
|
+
const authUrl = `${APP_BASE_URL}/auth/mcp?port=${PORT}`;
|
|
105
|
+
open(authUrl).catch(err => {
|
|
106
|
+
console.error('Could not open browser:', err);
|
|
107
|
+
console.log('Open this URL in your browser:', authUrl);
|
|
108
|
+
});
|
|
109
|
+
console.log('Login server listening on http://127.0.0.1:' + PORT);
|
|
110
|
+
console.log('Tokens will be saved to:', getTokenFilePath());
|
|
111
|
+
});
|
|
112
|
+
server.on('error', (err) => {
|
|
113
|
+
if (err.code === 'EADDRINUSE') {
|
|
114
|
+
console.error('Port 38473 is already in use. Free the port or close the other process, then run `loxtep-mcp login` again.');
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
console.error('Server error:', err);
|
|
118
|
+
}
|
|
119
|
+
if (!settled) {
|
|
120
|
+
settled = true;
|
|
121
|
+
reject(err);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
// CLI entry when run as `node cli.js [command]`
|
|
127
|
+
const sub = process.argv[2];
|
|
128
|
+
function startServer() {
|
|
129
|
+
// Run the stdio server (index.js) directly
|
|
130
|
+
const filename = fileURLToPath(import.meta.url);
|
|
131
|
+
const dirname_val = dirname(filename);
|
|
132
|
+
const indexPath = join(dirname_val, 'index.js');
|
|
133
|
+
// Spawn the index.js process and inherit stdio for proper MCP communication
|
|
134
|
+
const child = spawn('node', [indexPath], {
|
|
135
|
+
stdio: 'inherit',
|
|
136
|
+
env: process.env,
|
|
137
|
+
});
|
|
138
|
+
child.on('exit', code => {
|
|
139
|
+
process.exit(code ?? 1);
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
if (sub === 'login') {
|
|
143
|
+
runLogin()
|
|
144
|
+
.then(() => {
|
|
145
|
+
console.log('Done.');
|
|
146
|
+
process.exit(0);
|
|
147
|
+
})
|
|
148
|
+
.catch(err => {
|
|
149
|
+
console.error(err);
|
|
150
|
+
process.exit(1);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
else if (sub === 'server' || sub === '--stdio') {
|
|
154
|
+
startServer();
|
|
155
|
+
}
|
|
156
|
+
else if (!sub) {
|
|
157
|
+
// Default: start the stdio server when run without arguments
|
|
158
|
+
startServer();
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
console.log('Usage:');
|
|
162
|
+
console.log(' loxtep-mcp login Opens browser for authentication');
|
|
163
|
+
console.log(' loxtep-mcp server Start the MCP stdio server');
|
|
164
|
+
console.log(' loxtep-mcp --stdio Start the MCP stdio server (alias)');
|
|
165
|
+
process.exit(1);
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, InitializeRequestSchema, PingRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import { getTools } from './tools.js';
|
|
6
|
+
import { loadTokens, isAccessExpired, refreshAccess, writeTokenFile, } from './auth.js';
|
|
7
|
+
const DEBUG = process.env.MCP_DEBUG === '1' || process.env.MCP_DEBUG === 'true';
|
|
8
|
+
function log(msg, data) {
|
|
9
|
+
if (DEBUG) {
|
|
10
|
+
console.error(`[customer-mcp] ${msg}`, data !== undefined ? JSON.stringify(data) : '');
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
// Resolve current access token (refresh if needed) and return tokens for this request.
|
|
14
|
+
async function ensureValidTokens() {
|
|
15
|
+
let tokens = loadTokens();
|
|
16
|
+
if (!tokens) {
|
|
17
|
+
throw new Error('No tokens. Run `loxtep-mcp login` or set LOXTEP_AUTH_TOKEN and LOXTEP_API_BASE_URL.');
|
|
18
|
+
}
|
|
19
|
+
if (!tokens.api_base_url) {
|
|
20
|
+
throw new Error('LOXTEP_API_BASE_URL is required.');
|
|
21
|
+
}
|
|
22
|
+
if (isAccessExpired(tokens) && tokens.refresh_token) {
|
|
23
|
+
const refreshed = await refreshAccess(tokens.api_base_url, tokens.refresh_token);
|
|
24
|
+
const newFile = {
|
|
25
|
+
access_token: refreshed.access_token,
|
|
26
|
+
refresh_token: refreshed.refresh_token,
|
|
27
|
+
expires_at: refreshed.expires_at,
|
|
28
|
+
api_base_url: tokens.api_base_url,
|
|
29
|
+
};
|
|
30
|
+
writeTokenFile(newFile);
|
|
31
|
+
tokens = {
|
|
32
|
+
access_token: refreshed.access_token,
|
|
33
|
+
refresh_token: refreshed.refresh_token,
|
|
34
|
+
expires_at: refreshed.expires_at,
|
|
35
|
+
api_base_url: tokens.api_base_url,
|
|
36
|
+
};
|
|
37
|
+
log('Refreshed and saved tokens');
|
|
38
|
+
}
|
|
39
|
+
return tokens;
|
|
40
|
+
}
|
|
41
|
+
async function callToolApi(apiBaseUrl, accessToken, name, args) {
|
|
42
|
+
const url = `${apiBaseUrl.replace(/\/$/, '')}/ai/mcp/tools/call`;
|
|
43
|
+
const res = await fetch(url, {
|
|
44
|
+
method: 'POST',
|
|
45
|
+
headers: {
|
|
46
|
+
'Content-Type': 'application/json',
|
|
47
|
+
Authorization: `Bearer ${accessToken}`,
|
|
48
|
+
},
|
|
49
|
+
body: JSON.stringify({ name, arguments: args ?? {} }),
|
|
50
|
+
});
|
|
51
|
+
if (res.status === 401) {
|
|
52
|
+
throw new Error('Unauthorized (token expired or invalid). Run `loxtep-mcp login` again.');
|
|
53
|
+
}
|
|
54
|
+
if (res.status === 403) {
|
|
55
|
+
throw new Error('Forbidden: your role does not have ai:mcp_tools permission. Contact your org owner.');
|
|
56
|
+
}
|
|
57
|
+
if (!res.ok) {
|
|
58
|
+
const text = await res.text();
|
|
59
|
+
throw new Error(`Tool call failed: ${res.status} ${text}`);
|
|
60
|
+
}
|
|
61
|
+
const data = (await res.json());
|
|
62
|
+
if (!data.success || !data.data?.content) {
|
|
63
|
+
throw new Error('Invalid tool response');
|
|
64
|
+
}
|
|
65
|
+
const content = data.data.content.map(c => ({
|
|
66
|
+
type: 'text',
|
|
67
|
+
text: c.text,
|
|
68
|
+
}));
|
|
69
|
+
return { content };
|
|
70
|
+
}
|
|
71
|
+
const server = new Server({
|
|
72
|
+
name: 'loxtep-customer-mcp',
|
|
73
|
+
version: '1.0.0',
|
|
74
|
+
}, {
|
|
75
|
+
capabilities: {
|
|
76
|
+
tools: {},
|
|
77
|
+
resources: {},
|
|
78
|
+
prompts: {},
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
const toolList = getTools().map(t => ({
|
|
82
|
+
name: t.name,
|
|
83
|
+
description: t.description,
|
|
84
|
+
inputSchema: t.inputSchema,
|
|
85
|
+
}));
|
|
86
|
+
server.setRequestHandler(InitializeRequestSchema, async () => {
|
|
87
|
+
log('Initialize');
|
|
88
|
+
return {
|
|
89
|
+
protocolVersion: '2024-11-05',
|
|
90
|
+
capabilities: { tools: {}, resources: {}, prompts: {} },
|
|
91
|
+
serverInfo: { name: 'loxtep-customer-mcp', version: '1.0.0' },
|
|
92
|
+
};
|
|
93
|
+
});
|
|
94
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
95
|
+
log('ListTools');
|
|
96
|
+
return { tools: toolList };
|
|
97
|
+
});
|
|
98
|
+
server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
99
|
+
const { name, arguments: args } = req.params;
|
|
100
|
+
log('CallTool', { name });
|
|
101
|
+
const tokens = await ensureValidTokens();
|
|
102
|
+
const result = await callToolApi(tokens.api_base_url, tokens.access_token, name, args ?? {});
|
|
103
|
+
return result;
|
|
104
|
+
});
|
|
105
|
+
server.setRequestHandler(PingRequestSchema, async () => ({}));
|
|
106
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => ({ resources: [] }));
|
|
107
|
+
server.setRequestHandler(ReadResourceRequestSchema, async () => {
|
|
108
|
+
throw new Error('No resources available');
|
|
109
|
+
});
|
|
110
|
+
server.setRequestHandler(ListPromptsRequestSchema, async () => ({ prompts: [] }));
|
|
111
|
+
server.setRequestHandler(GetPromptRequestSchema, async () => {
|
|
112
|
+
throw new Error('No prompts available');
|
|
113
|
+
});
|
|
114
|
+
async function main() {
|
|
115
|
+
const transport = new StdioServerTransport();
|
|
116
|
+
await server.connect(transport);
|
|
117
|
+
process.stdin.resume();
|
|
118
|
+
}
|
|
119
|
+
main().catch(err => {
|
|
120
|
+
console.error('Customer MCP server failed:', err);
|
|
121
|
+
process.exit(1);
|
|
122
|
+
});
|
|
123
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static list of customer workspace tools aligned with platform-backend/ai/lib/tools/tool-definitions.ts.
|
|
3
|
+
* Maintenance note: when adding tools there, add an entry here (name + description).
|
|
4
|
+
* inputSchema is generic (object) since the backend validates arguments.
|
|
5
|
+
*/
|
|
6
|
+
export interface McpTool {
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
inputSchema: {
|
|
10
|
+
type: 'object';
|
|
11
|
+
properties?: Record<string, unknown>;
|
|
12
|
+
required?: string[];
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export declare function getTools(): McpTool[];
|
|
16
|
+
export declare function getToolNames(): string[];
|
|
17
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAC5F;AAwWD,wBAAgB,QAAQ,IAAI,OAAO,EAAE,CAEpC;AAED,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC"}
|
package/dist/tools.js
ADDED
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static list of customer workspace tools aligned with platform-backend/ai/lib/tools/tool-definitions.ts.
|
|
3
|
+
* Maintenance note: when adding tools there, add an entry here (name + description).
|
|
4
|
+
* inputSchema is generic (object) since the backend validates arguments.
|
|
5
|
+
*/
|
|
6
|
+
const TOOLS = [
|
|
7
|
+
{
|
|
8
|
+
name: 'create_data_product',
|
|
9
|
+
description: 'Create a new data product',
|
|
10
|
+
inputSchema: { type: 'object' },
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: 'update_data_product',
|
|
14
|
+
description: 'Update an existing data product',
|
|
15
|
+
inputSchema: { type: 'object' },
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'delete_data_product',
|
|
19
|
+
description: 'Delete a data product',
|
|
20
|
+
inputSchema: { type: 'object' },
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: 'list_data_products',
|
|
24
|
+
description: 'List all data products in the project',
|
|
25
|
+
inputSchema: { type: 'object' },
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'get_data_product',
|
|
29
|
+
description: 'Get details of a specific data product',
|
|
30
|
+
inputSchema: { type: 'object' },
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'create_pipeline',
|
|
34
|
+
description: 'Create a new pipeline',
|
|
35
|
+
inputSchema: { type: 'object' },
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'update_pipeline',
|
|
39
|
+
description: 'Update an existing pipeline',
|
|
40
|
+
inputSchema: { type: 'object' },
|
|
41
|
+
},
|
|
42
|
+
{ name: 'delete_pipeline', description: 'Delete a pipeline', inputSchema: { type: 'object' } },
|
|
43
|
+
{
|
|
44
|
+
name: 'list_pipelines',
|
|
45
|
+
description: 'List all pipelines in the project',
|
|
46
|
+
inputSchema: { type: 'object' },
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'get_pipeline',
|
|
50
|
+
description: 'Get details of a specific pipeline',
|
|
51
|
+
inputSchema: { type: 'object' },
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: 'get_pipeline_graph',
|
|
55
|
+
description: 'Get the pipeline graph (nodes, edges, deployment) for a flow',
|
|
56
|
+
inputSchema: { type: 'object' },
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: 'patch_pipeline_graph',
|
|
60
|
+
description: 'Apply graph patch operations (add_node, update_node, remove_node, connect_nodes, disconnect_nodes, update_pipeline). Supports dry_run.',
|
|
61
|
+
inputSchema: { type: 'object' },
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: 'create_transformation',
|
|
65
|
+
description: 'Create a new transformation step in a pipeline',
|
|
66
|
+
inputSchema: { type: 'object' },
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: 'create_validation',
|
|
70
|
+
description: 'Create a new validation step in a pipeline',
|
|
71
|
+
inputSchema: { type: 'object' },
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: 'create_connection',
|
|
75
|
+
description: 'Create a new connection',
|
|
76
|
+
inputSchema: { type: 'object' },
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: 'update_connection',
|
|
80
|
+
description: 'Update an existing connection',
|
|
81
|
+
inputSchema: { type: 'object' },
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: 'delete_connection',
|
|
85
|
+
description: 'Delete a connection',
|
|
86
|
+
inputSchema: { type: 'object' },
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: 'list_connections',
|
|
90
|
+
description: 'List all connections in the project',
|
|
91
|
+
inputSchema: { type: 'object' },
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: 'get_connection',
|
|
95
|
+
description: 'Get details of a specific connection',
|
|
96
|
+
inputSchema: { type: 'object' },
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'test_connection',
|
|
100
|
+
description: 'Test a connection configuration (non-destructive)',
|
|
101
|
+
inputSchema: { type: 'object' },
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: 'create_schema',
|
|
105
|
+
description: 'Create a new schema definition',
|
|
106
|
+
inputSchema: { type: 'object' },
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: 'update_schema',
|
|
110
|
+
description: 'Update an existing schema',
|
|
111
|
+
inputSchema: { type: 'object' },
|
|
112
|
+
},
|
|
113
|
+
{ name: 'delete_schema', description: 'Delete a schema', inputSchema: { type: 'object' } },
|
|
114
|
+
{
|
|
115
|
+
name: 'get_schema',
|
|
116
|
+
description: 'Get details of a specific schema',
|
|
117
|
+
inputSchema: { type: 'object' },
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: 'list_schema_versions',
|
|
121
|
+
description: 'List schema versions',
|
|
122
|
+
inputSchema: { type: 'object' },
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: 'tag_pii_fields',
|
|
126
|
+
description: 'Tag PII fields in a schema',
|
|
127
|
+
inputSchema: { type: 'object' },
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
name: 'create_quality_rule',
|
|
131
|
+
description: 'Create a new quality rule',
|
|
132
|
+
inputSchema: { type: 'object' },
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
name: 'update_quality_rule',
|
|
136
|
+
description: 'Update an existing quality rule',
|
|
137
|
+
inputSchema: { type: 'object' },
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
name: 'delete_quality_rule',
|
|
141
|
+
description: 'Delete a quality rule',
|
|
142
|
+
inputSchema: { type: 'object' },
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
name: 'list_quality_rules',
|
|
146
|
+
description: 'List quality rules',
|
|
147
|
+
inputSchema: { type: 'object' },
|
|
148
|
+
},
|
|
149
|
+
{ name: 'get_quality_rule', description: 'Get a quality rule', inputSchema: { type: 'object' } },
|
|
150
|
+
{
|
|
151
|
+
name: 'test_quality_rule',
|
|
152
|
+
description: 'Test a quality rule against sample data (non-destructive)',
|
|
153
|
+
inputSchema: { type: 'object' },
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
name: 'search_catalog',
|
|
157
|
+
description: 'Search the data catalog. Use include_evidence and include_lineage for richer results. Results are access-filtered when user context is present.',
|
|
158
|
+
inputSchema: { type: 'object' },
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
name: 'get_evidence',
|
|
162
|
+
description: 'Get quality and freshness evidence for data products by ID',
|
|
163
|
+
inputSchema: { type: 'object' },
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
name: 'get_lineage_impact',
|
|
167
|
+
description: 'Get downstream impact (lineage) for a data product by ID',
|
|
168
|
+
inputSchema: { type: 'object' },
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
name: 'get_governance_flags',
|
|
172
|
+
description: 'Get governance metadata (classification, pii_fields) for a data product by ID',
|
|
173
|
+
inputSchema: { type: 'object' },
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
name: 'run_discovery',
|
|
177
|
+
description: 'One-shot discovery: guidance and available discovery tool names',
|
|
178
|
+
inputSchema: { type: 'object' },
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
name: 'get_catalog_entry',
|
|
182
|
+
description: 'Get a catalog entry by ID',
|
|
183
|
+
inputSchema: { type: 'object' },
|
|
184
|
+
},
|
|
185
|
+
{ name: 'list_domains', description: 'List available domains', inputSchema: { type: 'object' } },
|
|
186
|
+
{ name: 'list_tags', description: 'List available tags', inputSchema: { type: 'object' } },
|
|
187
|
+
{
|
|
188
|
+
name: 'execute_query',
|
|
189
|
+
description: 'Execute an analytics query',
|
|
190
|
+
inputSchema: { type: 'object' },
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
name: 'list_tables',
|
|
194
|
+
description: 'List available tables for querying',
|
|
195
|
+
inputSchema: { type: 'object' },
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
name: 'get_table_schema',
|
|
199
|
+
description: 'Get schema for a specific table',
|
|
200
|
+
inputSchema: { type: 'object' },
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
name: 'get_query_results',
|
|
204
|
+
description: 'Get results for a previously executed query',
|
|
205
|
+
inputSchema: { type: 'object' },
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
name: 'list_versions',
|
|
209
|
+
description: 'List project version snapshots',
|
|
210
|
+
inputSchema: { type: 'object' },
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
name: 'create_snapshot',
|
|
214
|
+
description: 'Create a project version snapshot',
|
|
215
|
+
inputSchema: { type: 'object' },
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
name: 'restore_version',
|
|
219
|
+
description: 'Restore project state to a prior snapshot',
|
|
220
|
+
inputSchema: { type: 'object' },
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
name: 'compare_versions',
|
|
224
|
+
description: 'Compare two project versions (or version vs current)',
|
|
225
|
+
inputSchema: { type: 'object' },
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
name: 'reindex_workspace',
|
|
229
|
+
description: 'Trigger a full workspace reindex for the project',
|
|
230
|
+
inputSchema: { type: 'object' },
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
name: 'get_queue_info',
|
|
234
|
+
description: 'Get queue/stream metadata for a data asset or by queue name',
|
|
235
|
+
inputSchema: { type: 'object' },
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
name: 'replay_events',
|
|
239
|
+
description: 'Replay events from a data asset (time-travel)',
|
|
240
|
+
inputSchema: { type: 'object' },
|
|
241
|
+
},
|
|
242
|
+
// Procedures (process graph)
|
|
243
|
+
{
|
|
244
|
+
name: 'list_procedures',
|
|
245
|
+
description: 'List procedures for an organization (process graph). Pass organization_id. Returns procedure_id, entity_type, properties, created_at.',
|
|
246
|
+
inputSchema: {
|
|
247
|
+
type: 'object',
|
|
248
|
+
properties: { organization_id: { type: 'string', description: 'Organization UUID' } },
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
name: 'get_procedure_workflow',
|
|
253
|
+
description: 'Get procedure detail with steps and agents (workflow). Pass procedure_id. organization_id optional (from context).',
|
|
254
|
+
inputSchema: {
|
|
255
|
+
type: 'object',
|
|
256
|
+
properties: {
|
|
257
|
+
procedure_id: { type: 'string' },
|
|
258
|
+
organization_id: { type: 'string' },
|
|
259
|
+
},
|
|
260
|
+
required: ['procedure_id'],
|
|
261
|
+
},
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
name: 'create_procedure',
|
|
265
|
+
description: 'Create a procedure (name, description, optional steps with order, name, system). Pass organization_id and body.',
|
|
266
|
+
inputSchema: {
|
|
267
|
+
type: 'object',
|
|
268
|
+
properties: {
|
|
269
|
+
organization_id: { type: 'string' },
|
|
270
|
+
name: { type: 'string' },
|
|
271
|
+
description: { type: 'string' },
|
|
272
|
+
steps: { type: 'array', items: { type: 'object' } },
|
|
273
|
+
},
|
|
274
|
+
required: ['organization_id', 'name'],
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
name: 'update_procedure',
|
|
279
|
+
description: 'Update a procedure (name and/or description). Pass procedure_id and body.',
|
|
280
|
+
inputSchema: {
|
|
281
|
+
type: 'object',
|
|
282
|
+
properties: {
|
|
283
|
+
procedure_id: { type: 'string' },
|
|
284
|
+
organization_id: { type: 'string' },
|
|
285
|
+
name: { type: 'string' },
|
|
286
|
+
description: { type: 'string' },
|
|
287
|
+
},
|
|
288
|
+
required: ['procedure_id'],
|
|
289
|
+
},
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
name: 'delete_procedure',
|
|
293
|
+
description: 'Delete a procedure and its steps. Pass procedure_id. Requires approval.',
|
|
294
|
+
inputSchema: {
|
|
295
|
+
type: 'object',
|
|
296
|
+
properties: {
|
|
297
|
+
procedure_id: { type: 'string' },
|
|
298
|
+
organization_id: { type: 'string' },
|
|
299
|
+
},
|
|
300
|
+
required: ['procedure_id'],
|
|
301
|
+
},
|
|
302
|
+
},
|
|
303
|
+
// Projects (org-scoped; pipelines API)
|
|
304
|
+
{
|
|
305
|
+
name: 'list_projects',
|
|
306
|
+
description: 'List projects in the organization. Optional: status (active, inactive, archived), search, page, page_size. Returns items and pagination.',
|
|
307
|
+
inputSchema: { type: 'object' },
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
name: 'get_project',
|
|
311
|
+
description: 'Get a single project by project_id.',
|
|
312
|
+
inputSchema: {
|
|
313
|
+
type: 'object',
|
|
314
|
+
properties: { project_id: { type: 'string' } },
|
|
315
|
+
required: ['project_id'],
|
|
316
|
+
},
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
name: 'create_project',
|
|
320
|
+
description: 'Create a project. Pass name (required). Optional: description, status, metadata, template_slug, domain_id, github_* fields.',
|
|
321
|
+
inputSchema: { type: 'object' },
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
name: 'update_project',
|
|
325
|
+
description: 'Update a project. Pass project_id and any of: name, description, status, metadata, configuration, repository_*, github_*, customer_role_arn.',
|
|
326
|
+
inputSchema: { type: 'object' },
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
name: 'delete_project',
|
|
330
|
+
description: 'Delete a project by project_id. Requires approval.',
|
|
331
|
+
inputSchema: {
|
|
332
|
+
type: 'object',
|
|
333
|
+
properties: { project_id: { type: 'string' } },
|
|
334
|
+
required: ['project_id'],
|
|
335
|
+
},
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
name: 'list_blueprints',
|
|
339
|
+
description: 'List blueprints (templates). Optional: category (e.g. pipelines, connectors, projects), search, page, page_size.',
|
|
340
|
+
inputSchema: { type: 'object' },
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
name: 'get_blueprint',
|
|
344
|
+
description: 'Get a single blueprint (template) by template_id for exploration.',
|
|
345
|
+
inputSchema: { type: 'object' },
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
name: 'apply_blueprint',
|
|
349
|
+
description: 'Apply a pipeline/connector/transform/data_product/domain/validation/export blueprint into a project. For project blueprints use create_project with template_slug. Params: project_id, blueprint_type, blueprint_slug; optional: preview, placeholder_overrides.',
|
|
350
|
+
inputSchema: { type: 'object' },
|
|
351
|
+
},
|
|
352
|
+
];
|
|
353
|
+
export function getTools() {
|
|
354
|
+
return TOOLS;
|
|
355
|
+
}
|
|
356
|
+
export function getToolNames() {
|
|
357
|
+
return TOOLS.map(t => t.name);
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@loxtep/customer-mcp-server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Customer MCP proxy: login via app UI, stdio server that forwards tool calls to Loxtep API",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"loxtep-mcp": "dist/cli.js",
|
|
9
|
+
"loxtep-mcp-server": "dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"start": "node dist/index.js",
|
|
14
|
+
"login": "node dist/cli.js login",
|
|
15
|
+
"prepare": "pnpm run build"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"mcp",
|
|
19
|
+
"loxtep",
|
|
20
|
+
"customer"
|
|
21
|
+
],
|
|
22
|
+
"author": "Loxtep Team",
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@modelcontextprotocol/sdk": "^1.15.1",
|
|
26
|
+
"express": "^4.21.0",
|
|
27
|
+
"jsonwebtoken": "^9.0.2",
|
|
28
|
+
"open": "^10.0.0"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/express": "^4.17.21",
|
|
32
|
+
"@types/jsonwebtoken": "^9.0.7",
|
|
33
|
+
"@types/node": "^22.10.2",
|
|
34
|
+
"typescript": "^5.9.2"
|
|
35
|
+
},
|
|
36
|
+
"files": [
|
|
37
|
+
"dist/**/*",
|
|
38
|
+
"README.md"
|
|
39
|
+
],
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=18.0.0"
|
|
42
|
+
},
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
}
|
|
46
|
+
}
|