@assetlab/mcp-server 1.19.5 → 1.19.7
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/dist/client.js +21 -4
- package/dist/client.js.map +1 -1
- package/dist/oauth.d.ts +52 -15
- package/dist/oauth.js +538 -204
- package/dist/oauth.js.map +1 -1
- package/dist/tools-write.js +41 -2
- package/dist/tools-write.js.map +1 -1
- package/dist/tools.d.ts +1 -1
- package/dist/tools.js +28 -0
- package/dist/tools.js.map +1 -1
- package/dist/worker.d.ts +11 -0
- package/dist/worker.js +70 -27
- package/dist/worker.js.map +1 -1
- package/package.json +6 -1
package/dist/worker.js
CHANGED
|
@@ -12,23 +12,42 @@
|
|
|
12
12
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
13
13
|
import { WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js';
|
|
14
14
|
import { AssetLabClient } from './client.js';
|
|
15
|
-
import { authServerMetadata, handleAuthorizeGet, handleAuthorizePost, handleRegister, handleToken, protectedResourceMetadata, } from './oauth.js';
|
|
15
|
+
import { authServerMetadata, handleAuthorizeGet, handleAuthorizePost, handleDelete, handleRegister, handleRevoke, handleToken, protectedResourceMetadata, resolveAccessToken, } from './oauth.js';
|
|
16
16
|
import { registerTools, SERVER_INSTRUCTIONS } from './tools.js';
|
|
17
|
-
const
|
|
18
|
-
'
|
|
19
|
-
'
|
|
20
|
-
'
|
|
21
|
-
|
|
17
|
+
const ALLOWED_ORIGINS = new Set([
|
|
18
|
+
'https://claude.ai',
|
|
19
|
+
'https://chat.openai.com',
|
|
20
|
+
'https://chatgpt.com',
|
|
21
|
+
]);
|
|
22
|
+
function corsHeaders(request) {
|
|
23
|
+
const origin = request.headers.get('origin') ?? '';
|
|
24
|
+
if (!ALLOWED_ORIGINS.has(origin))
|
|
25
|
+
return {};
|
|
26
|
+
return {
|
|
27
|
+
'Access-Control-Allow-Origin': origin,
|
|
28
|
+
'Access-Control-Allow-Credentials': 'true',
|
|
29
|
+
Vary: 'Origin',
|
|
30
|
+
'Access-Control-Allow-Methods': 'GET, POST, DELETE, OPTIONS',
|
|
31
|
+
'Access-Control-Allow-Headers': 'Authorization, Content-Type, MCP-Protocol-Version, Accept',
|
|
32
|
+
};
|
|
33
|
+
}
|
|
22
34
|
const SERVER_INFO = { name: 'assetlab', version: '1.3.0' };
|
|
23
|
-
function jsonResponse(body, status = 200, extra = {}) {
|
|
35
|
+
function jsonResponse(body, status = 200, extra = {}, corsFor) {
|
|
24
36
|
return new Response(JSON.stringify(body), {
|
|
25
37
|
status,
|
|
26
|
-
headers: {
|
|
38
|
+
headers: {
|
|
39
|
+
'Content-Type': 'application/json',
|
|
40
|
+
...(corsFor ? corsHeaders(corsFor) : {}),
|
|
41
|
+
...extra,
|
|
42
|
+
},
|
|
27
43
|
});
|
|
28
44
|
}
|
|
29
|
-
function withCors(response) {
|
|
45
|
+
function withCors(response, request) {
|
|
46
|
+
const cors = corsHeaders(request);
|
|
47
|
+
if (Object.keys(cors).length === 0)
|
|
48
|
+
return response;
|
|
30
49
|
const headers = new Headers(response.headers);
|
|
31
|
-
for (const [k, v] of Object.entries(
|
|
50
|
+
for (const [k, v] of Object.entries(cors)) {
|
|
32
51
|
headers.set(k, v);
|
|
33
52
|
}
|
|
34
53
|
return new Response(response.body, {
|
|
@@ -61,32 +80,41 @@ export default {
|
|
|
61
80
|
async fetch(request, env) {
|
|
62
81
|
const url = new URL(request.url);
|
|
63
82
|
const origin = url.origin;
|
|
64
|
-
// CORS preflight
|
|
83
|
+
// CORS preflight — only emit allow-* headers for trusted origins; unknown
|
|
84
|
+
// origins get a bare 204 which fails the preflight in the browser.
|
|
65
85
|
if (request.method === 'OPTIONS') {
|
|
66
|
-
return new Response(null, { status: 204, headers:
|
|
86
|
+
return new Response(null, { status: 204, headers: corsHeaders(request) });
|
|
67
87
|
}
|
|
68
88
|
if (!env.ASSETLAB_API_URL) {
|
|
69
89
|
return jsonResponse({ error: 'Server misconfigured: ASSETLAB_API_URL not set.' }, 500);
|
|
70
90
|
}
|
|
71
91
|
// ── OAuth 2.0 routes ──────────────────────────────────────────────────
|
|
72
92
|
if (url.pathname === '/.well-known/oauth-protected-resource') {
|
|
73
|
-
return protectedResourceMetadata(origin);
|
|
93
|
+
return protectedResourceMetadata(origin, request);
|
|
74
94
|
}
|
|
75
95
|
if (url.pathname === '/.well-known/oauth-authorization-server' ||
|
|
76
96
|
url.pathname === '/.well-known/openid-configuration') {
|
|
77
|
-
return authServerMetadata(origin);
|
|
97
|
+
return authServerMetadata(origin, request);
|
|
78
98
|
}
|
|
79
99
|
if (url.pathname === '/oauth/register' && request.method === 'POST') {
|
|
80
|
-
return handleRegister(request);
|
|
100
|
+
return handleRegister(request, env.OAUTH_CLIENTS);
|
|
101
|
+
}
|
|
102
|
+
// RFC 7592 client management — DELETE /oauth/register/{client_id}
|
|
103
|
+
if (url.pathname.startsWith('/oauth/register/') && request.method === 'DELETE') {
|
|
104
|
+
const clientId = url.pathname.slice('/oauth/register/'.length);
|
|
105
|
+
return handleDelete(request, env.OAUTH_CLIENTS, clientId);
|
|
81
106
|
}
|
|
82
107
|
if (url.pathname === '/authorize' && request.method === 'GET') {
|
|
83
|
-
return handleAuthorizeGet(request);
|
|
108
|
+
return handleAuthorizeGet(request, env.OAUTH_CLIENTS);
|
|
84
109
|
}
|
|
85
110
|
if (url.pathname === '/authorize' && request.method === 'POST') {
|
|
86
|
-
return handleAuthorizePost(request, env
|
|
111
|
+
return handleAuthorizePost(request, env);
|
|
87
112
|
}
|
|
88
113
|
if (url.pathname === '/token' && request.method === 'POST') {
|
|
89
|
-
return handleToken(request, env
|
|
114
|
+
return handleToken(request, env);
|
|
115
|
+
}
|
|
116
|
+
if (url.pathname === '/oauth/revoke' && request.method === 'POST') {
|
|
117
|
+
return handleRevoke(request, env);
|
|
90
118
|
}
|
|
91
119
|
// ── Health / connectivity probes ──────────────────────────────────────
|
|
92
120
|
// Return 401 for unauthenticated requests so Claude.ai triggers the OAuth
|
|
@@ -97,10 +125,10 @@ export default {
|
|
|
97
125
|
if (!authHeader) {
|
|
98
126
|
return new Response(null, {
|
|
99
127
|
status: 401,
|
|
100
|
-
headers: { 'WWW-Authenticate': wwwAuthenticate, ...
|
|
128
|
+
headers: { 'WWW-Authenticate': wwwAuthenticate, ...corsHeaders(request) },
|
|
101
129
|
});
|
|
102
130
|
}
|
|
103
|
-
return new Response(null, { status: 200, headers:
|
|
131
|
+
return new Response(null, { status: 200, headers: corsHeaders(request) });
|
|
104
132
|
}
|
|
105
133
|
if (request.method === 'GET') {
|
|
106
134
|
const accepts = request.headers.get('Accept') ?? '';
|
|
@@ -111,7 +139,7 @@ export default {
|
|
|
111
139
|
if (!authHeader) {
|
|
112
140
|
return new Response(null, {
|
|
113
141
|
status: 401,
|
|
114
|
-
headers: { 'WWW-Authenticate': wwwAuthenticate, ...
|
|
142
|
+
headers: { 'WWW-Authenticate': wwwAuthenticate, ...corsHeaders(request) },
|
|
115
143
|
});
|
|
116
144
|
}
|
|
117
145
|
const { readable, writable } = new TransformStream();
|
|
@@ -123,16 +151,31 @@ export default {
|
|
|
123
151
|
request.signal?.addEventListener('abort', () => { clearInterval(timer); writer.close().catch(() => { }); });
|
|
124
152
|
return new Response(readable, {
|
|
125
153
|
status: 200,
|
|
126
|
-
headers: { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', ...
|
|
154
|
+
headers: { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', ...corsHeaders(request) },
|
|
127
155
|
});
|
|
128
156
|
}
|
|
129
157
|
if (!authHeader) {
|
|
130
|
-
return jsonResponse({ error: 'unauthorized', error_description: 'Bearer token required' }, 401, { 'WWW-Authenticate': wwwAuthenticate });
|
|
158
|
+
return jsonResponse({ error: 'unauthorized', error_description: 'Bearer token required' }, 401, { 'WWW-Authenticate': wwwAuthenticate }, request);
|
|
131
159
|
}
|
|
132
|
-
return jsonResponse({ ...SERVER_INFO, status: 'ok' });
|
|
160
|
+
return jsonResponse({ ...SERVER_INFO, status: 'ok' }, 200, {}, request);
|
|
133
161
|
}
|
|
134
162
|
// ── MCP transport ─────────────────────────────────────────────────────
|
|
135
|
-
|
|
163
|
+
// Gate POST against the same Bearer requirement as GET/HEAD. Without this,
|
|
164
|
+
// initialize/tools/list leak the full tool catalog + SERVER_INSTRUCTIONS
|
|
165
|
+
// to any unauthenticated caller (pentest finding F-002).
|
|
166
|
+
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
167
|
+
return jsonResponse({ jsonrpc: '2.0', error: { code: -32001, message: 'Unauthorized: Bearer token required' } }, 401, { 'WWW-Authenticate': wwwAuthenticate }, request);
|
|
168
|
+
}
|
|
169
|
+
// Resolve the Bearer token: `mcp_at_*` tokens are looked up in KV and
|
|
170
|
+
// mapped to the underlying AssetLab API key; legacy `al_*` tokens pass
|
|
171
|
+
// through. Unknown / expired tokens → 401, which makes Claude.ai re-run
|
|
172
|
+
// the OAuth flow rather than show a stale "connected" state.
|
|
173
|
+
const presentedToken = authHeader.slice(7).trim();
|
|
174
|
+
const resolved = await resolveAccessToken(env.OAUTH_CLIENTS, presentedToken);
|
|
175
|
+
if (!resolved) {
|
|
176
|
+
return jsonResponse({ jsonrpc: '2.0', error: { code: -32001, message: 'Unauthorized: token expired or revoked' } }, 401, { 'WWW-Authenticate': wwwAuthenticate }, request);
|
|
177
|
+
}
|
|
178
|
+
const apiKey = resolved.apiKey;
|
|
136
179
|
const client = new AssetLabClient({ apiKey, apiUrl: env.ASSETLAB_API_URL });
|
|
137
180
|
const server = new McpServer(SERVER_INFO, { instructions: SERVER_INSTRUCTIONS });
|
|
138
181
|
registerTools(server, client);
|
|
@@ -143,11 +186,11 @@ export default {
|
|
|
143
186
|
const normalizedRequest = normalizeRequest(request);
|
|
144
187
|
try {
|
|
145
188
|
const response = await transport.handleRequest(normalizedRequest);
|
|
146
|
-
return withCors(response);
|
|
189
|
+
return withCors(response, request);
|
|
147
190
|
}
|
|
148
191
|
catch (err) {
|
|
149
192
|
const message = err instanceof Error ? err.message : 'Internal server error';
|
|
150
|
-
return jsonResponse({ jsonrpc: '2.0', error: { code: -32603, message } }, 500);
|
|
193
|
+
return jsonResponse({ jsonrpc: '2.0', error: { code: -32603, message } }, 500, {}, request);
|
|
151
194
|
}
|
|
152
195
|
},
|
|
153
196
|
};
|
package/dist/worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,wCAAwC,EAAE,MAAM,+DAA+D,CAAA;AACxH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,yBAAyB,
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assetlab/mcp-server",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.7",
|
|
4
4
|
"description": "MCP server for AssetLab — connect Claude, ChatGPT, or Microsoft Copilot to your asset management data",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
"build": "tsc",
|
|
12
12
|
"dev": "tsx src/index.ts",
|
|
13
13
|
"start": "node dist/index.js",
|
|
14
|
+
"test": "vitest run",
|
|
15
|
+
"test:watch": "vitest",
|
|
16
|
+
"test:coverage": "vitest run --coverage",
|
|
14
17
|
"worker:dev": "wrangler dev --config wrangler.toml",
|
|
15
18
|
"worker:deploy": "wrangler deploy --config wrangler.toml"
|
|
16
19
|
},
|
|
@@ -34,8 +37,10 @@
|
|
|
34
37
|
},
|
|
35
38
|
"devDependencies": {
|
|
36
39
|
"@types/node": "^22.0.0",
|
|
40
|
+
"@vitest/coverage-v8": "^2.1.0",
|
|
37
41
|
"tsx": "^4.19.0",
|
|
38
42
|
"typescript": "^5.7.0",
|
|
43
|
+
"vitest": "^2.1.0",
|
|
39
44
|
"wrangler": "^4.35.0"
|
|
40
45
|
}
|
|
41
46
|
}
|