@fleetx_io/fleetx-mcp-server 1.1.8 → 2.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/CHANGELOG.md +28 -2
- package/README.md +56 -6
- package/dist/auth/fleetx/exchange.d.ts +13 -0
- package/dist/auth/fleetx/exchange.d.ts.map +1 -0
- package/dist/auth/fleetx/exchange.js +27 -0
- package/dist/auth/fleetx/exchange.js.map +1 -0
- package/dist/auth/google/callback.d.ts +3 -0
- package/dist/auth/google/callback.d.ts.map +1 -0
- package/dist/auth/google/callback.js +98 -0
- package/dist/auth/google/callback.js.map +1 -0
- package/dist/auth/google/client.d.ts +17 -0
- package/dist/auth/google/client.d.ts.map +1 -0
- package/dist/auth/google/client.js +50 -0
- package/dist/auth/google/client.js.map +1 -0
- package/dist/auth/oauth/authorize.d.ts +3 -0
- package/dist/auth/oauth/authorize.d.ts.map +1 -0
- package/dist/auth/oauth/authorize.js +74 -0
- package/dist/auth/oauth/authorize.js.map +1 -0
- package/dist/auth/oauth/cimd.d.ts +33 -0
- package/dist/auth/oauth/cimd.d.ts.map +1 -0
- package/dist/auth/oauth/cimd.js +63 -0
- package/dist/auth/oauth/cimd.js.map +1 -0
- package/dist/auth/oauth/pending-sessions.d.ts +5 -0
- package/dist/auth/oauth/pending-sessions.d.ts.map +1 -0
- package/dist/auth/oauth/pending-sessions.js +24 -0
- package/dist/auth/oauth/pending-sessions.js.map +1 -0
- package/dist/auth/oauth/pkce.d.ts +3 -0
- package/dist/auth/oauth/pkce.d.ts.map +1 -0
- package/dist/auth/oauth/pkce.js +7 -0
- package/dist/auth/oauth/pkce.js.map +1 -0
- package/dist/auth/oauth/register.d.ts +8 -0
- package/dist/auth/oauth/register.d.ts.map +1 -0
- package/dist/auth/oauth/register.js +37 -0
- package/dist/auth/oauth/register.js.map +1 -0
- package/dist/auth/oauth/token.d.ts +3 -0
- package/dist/auth/oauth/token.d.ts.map +1 -0
- package/dist/auth/oauth/token.js +111 -0
- package/dist/auth/oauth/token.js.map +1 -0
- package/dist/auth/oauth/types.d.ts +11 -0
- package/dist/auth/oauth/types.d.ts.map +1 -0
- package/dist/auth/oauth/types.js +2 -0
- package/dist/auth/oauth/types.js.map +1 -0
- package/dist/auth/oauth/userinfo.d.ts +3 -0
- package/dist/auth/oauth/userinfo.d.ts.map +1 -0
- package/dist/auth/oauth/userinfo.js +29 -0
- package/dist/auth/oauth/userinfo.js.map +1 -0
- package/dist/auth/storage/authorization-code.d.ts +19 -0
- package/dist/auth/storage/authorization-code.d.ts.map +1 -0
- package/dist/auth/storage/authorization-code.js +44 -0
- package/dist/auth/storage/authorization-code.js.map +1 -0
- package/dist/auth/storage/connected-account.d.ts +24 -0
- package/dist/auth/storage/connected-account.d.ts.map +1 -0
- package/dist/auth/storage/connected-account.js +60 -0
- package/dist/auth/storage/connected-account.js.map +1 -0
- package/dist/auth/storage/db.d.ts +3 -0
- package/dist/auth/storage/db.d.ts.map +1 -0
- package/dist/auth/storage/db.js +110 -0
- package/dist/auth/storage/db.js.map +1 -0
- package/dist/auth/storage/oauth-client.d.ts +12 -0
- package/dist/auth/storage/oauth-client.d.ts.map +1 -0
- package/dist/auth/storage/oauth-client.js +28 -0
- package/dist/auth/storage/oauth-client.js.map +1 -0
- package/dist/auth/storage/refresh-token.d.ts +17 -0
- package/dist/auth/storage/refresh-token.d.ts.map +1 -0
- package/dist/auth/storage/refresh-token.js +46 -0
- package/dist/auth/storage/refresh-token.js.map +1 -0
- package/dist/auth/tokens/encryption.d.ts +5 -0
- package/dist/auth/tokens/encryption.d.ts.map +1 -0
- package/dist/auth/tokens/encryption.js +27 -0
- package/dist/auth/tokens/encryption.js.map +1 -0
- package/dist/auth/tokens/jwt.d.ts +8 -0
- package/dist/auth/tokens/jwt.d.ts.map +1 -0
- package/dist/auth/tokens/jwt.js +34 -0
- package/dist/auth/tokens/jwt.js.map +1 -0
- package/dist/auth.d.ts +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +2 -1
- package/dist/auth.js.map +1 -1
- package/dist/config/oauth.d.ts +21 -0
- package/dist/config/oauth.d.ts.map +1 -0
- package/dist/config/oauth.js +41 -0
- package/dist/config/oauth.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp/middleware/auth.d.ts +18 -0
- package/dist/mcp/middleware/auth.d.ts.map +1 -0
- package/dist/mcp/middleware/auth.js +35 -0
- package/dist/mcp/middleware/auth.js.map +1 -0
- package/dist/transports/fastify.d.ts +2 -0
- package/dist/transports/fastify.d.ts.map +1 -0
- package/dist/transports/fastify.js +223 -0
- package/dist/transports/fastify.js.map +1 -0
- package/dist/transports/sse.d.ts +1 -1
- package/dist/transports/sse.d.ts.map +1 -1
- package/dist/transports/sse.js +156 -84
- package/dist/transports/sse.js.map +1 -1
- package/dist/utils-http.d.ts +8 -0
- package/dist/utils-http.d.ts.map +1 -0
- package/dist/utils-http.js +15 -0
- package/dist/utils-http.js.map +1 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +9 -2
- package/dist/utils.js.map +1 -1
- package/dist/well-known/discovery.d.ts +4 -0
- package/dist/well-known/discovery.d.ts.map +1 -0
- package/dist/well-known/discovery.js +25 -0
- package/dist/well-known/discovery.js.map +1 -0
- package/package.json +15 -7
package/dist/transports/sse.js
CHANGED
|
@@ -1,19 +1,30 @@
|
|
|
1
|
-
import
|
|
1
|
+
import Fastify from "fastify";
|
|
2
|
+
import formbody from "@fastify/formbody";
|
|
2
3
|
import { randomUUID } from "node:crypto";
|
|
3
4
|
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
4
5
|
import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
|
|
5
6
|
import { createMcpServer } from "../server/createMcpServer.js";
|
|
6
7
|
import { createTokenStore } from "../auth.js";
|
|
7
8
|
import { log } from "../utils.js";
|
|
9
|
+
import { isOAuthConfigured, getOAuthConfig } from "../config/oauth.js";
|
|
10
|
+
import { verifyMcpAccessToken } from "../auth/tokens/jwt.js";
|
|
11
|
+
import { findConnectedAccountByUserId, expireConnectedAccountToken } from "../auth/storage/connected-account.js";
|
|
12
|
+
import { handleAuthorize } from "../auth/oauth/authorize.js";
|
|
13
|
+
import { handleToken } from "../auth/oauth/token.js";
|
|
14
|
+
import { handleClientRegistration } from "../auth/oauth/register.js";
|
|
15
|
+
import { handleUserInfo } from "../auth/oauth/userinfo.js";
|
|
16
|
+
import { handleGoogleCallback } from "../auth/google/callback.js";
|
|
17
|
+
import { handleAuthorizationServerMetadata, handleProtectedResourceMetadata, } from "../well-known/discovery.js";
|
|
8
18
|
const transports = new Map();
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
19
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
20
|
+
// Credential resolution
|
|
21
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
22
|
+
function parseBearer(header) {
|
|
23
|
+
if (!header?.startsWith("Bearer "))
|
|
24
|
+
return undefined;
|
|
25
|
+
return header.slice(7).trim() || undefined;
|
|
26
|
+
}
|
|
27
|
+
function parseBasic(header) {
|
|
17
28
|
if (!header?.startsWith("Basic "))
|
|
18
29
|
return undefined;
|
|
19
30
|
const decoded = Buffer.from(header.slice(6), "base64").toString("utf-8");
|
|
@@ -24,123 +35,173 @@ function parseBasicAuth(header) {
|
|
|
24
35
|
const password = decoded.slice(sep + 1);
|
|
25
36
|
return username && password ? { type: "basic", username, password } : undefined;
|
|
26
37
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
async function resolveCredentials(authHeader) {
|
|
39
|
+
const bearerToken = parseBearer(authHeader);
|
|
40
|
+
if (bearerToken && isOAuthConfigured()) {
|
|
41
|
+
const payload = await verifyMcpAccessToken(bearerToken).catch((err) => {
|
|
42
|
+
log("MCP JWT verification failed:", err);
|
|
43
|
+
return null;
|
|
44
|
+
});
|
|
45
|
+
if (payload) {
|
|
46
|
+
const account = findConnectedAccountByUserId(payload.sub);
|
|
47
|
+
if (account && account.fleetxAccessToken) {
|
|
48
|
+
log("resolveCredentials: OAuth JWT → FleetX bearer for", payload.sub);
|
|
49
|
+
return { credentials: { type: "bearer", token: account.fleetxAccessToken }, userId: payload.sub };
|
|
50
|
+
}
|
|
51
|
+
log("resolveCredentials: JWT valid but no active FleetX token for sub:", payload.sub);
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
// Not a valid MCP JWT — fall through to raw bearer / basic / env
|
|
40
55
|
}
|
|
56
|
+
const basic = parseBasic(authHeader);
|
|
41
57
|
if (basic) {
|
|
42
|
-
|
|
58
|
+
log("resolveCredentials: basic auth");
|
|
59
|
+
return { credentials: basic };
|
|
60
|
+
}
|
|
61
|
+
if (bearerToken) {
|
|
62
|
+
log("resolveCredentials: raw bearer token");
|
|
63
|
+
return { credentials: { type: "bearer", token: bearerToken } };
|
|
43
64
|
}
|
|
44
|
-
const
|
|
45
|
-
if (
|
|
46
|
-
|
|
65
|
+
const envToken = process.env.BEARER_ACCESS_TOKEN?.trim();
|
|
66
|
+
if (envToken) {
|
|
67
|
+
log("resolveCredentials: BEARER_ACCESS_TOKEN env");
|
|
68
|
+
return { credentials: { type: "bearer", token: envToken } };
|
|
47
69
|
}
|
|
70
|
+
log("resolveCredentials: no credentials (authHeader present:", !!authHeader, ")");
|
|
48
71
|
return undefined;
|
|
49
72
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
resolve(JSON.parse(Buffer.concat(chunks).toString()));
|
|
57
|
-
}
|
|
58
|
-
catch (err) {
|
|
59
|
-
reject(err);
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
req.on("error", reject);
|
|
73
|
+
// Send 401 with WWW-Authenticate so Claude triggers the OAuth flow.
|
|
74
|
+
function sendUnauthorized(res) {
|
|
75
|
+
const base = process.env.MCP_BASE_URL ?? "https://mcp.fleetx.io";
|
|
76
|
+
res.writeHead(401, {
|
|
77
|
+
"Content-Type": "application/json",
|
|
78
|
+
"WWW-Authenticate": `Bearer resource_metadata="${base}/.well-known/oauth-protected-resource"`,
|
|
63
79
|
});
|
|
80
|
+
res.end(JSON.stringify({
|
|
81
|
+
error: "unauthorized",
|
|
82
|
+
error_description: "Authentication required. Please complete OAuth flow.",
|
|
83
|
+
}));
|
|
64
84
|
}
|
|
65
|
-
|
|
66
|
-
|
|
85
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
86
|
+
// MCP session handlers (operate on Node raw req/res)
|
|
87
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
88
|
+
async function handleMcpPost(req, res, authHeader, body) {
|
|
67
89
|
const sessionId = req.headers["mcp-session-id"];
|
|
90
|
+
// Existing session — forward directly (already authenticated when session was created)
|
|
68
91
|
if (sessionId && transports.has(sessionId)) {
|
|
92
|
+
log(`MCP POST session=${sessionId}`);
|
|
69
93
|
await transports.get(sessionId).handleRequest(req, res, body);
|
|
70
94
|
return;
|
|
71
95
|
}
|
|
96
|
+
// New session must start with initialize
|
|
72
97
|
if (!sessionId && isInitializeRequest(body)) {
|
|
73
|
-
log(`
|
|
98
|
+
log(`MCP initialize from ${req.socket?.remoteAddress} auth=${!!authHeader}`);
|
|
99
|
+
const resolved = await resolveCredentials(authHeader);
|
|
100
|
+
// OAuth is enabled but no valid token → tell Claude to authenticate
|
|
101
|
+
if (!resolved && isOAuthConfigured()) {
|
|
102
|
+
log("MCP initialize rejected: no credentials, sending 401");
|
|
103
|
+
sendUnauthorized(res);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
74
106
|
const transport = new StreamableHTTPServerTransport({
|
|
75
107
|
sessionIdGenerator: () => randomUUID(),
|
|
76
108
|
onsessioninitialized: (id) => {
|
|
77
109
|
transports.set(id, transport);
|
|
78
|
-
log(`
|
|
110
|
+
log(`MCP session created: ${id}`);
|
|
79
111
|
},
|
|
80
112
|
});
|
|
81
113
|
transport.onclose = () => {
|
|
82
114
|
const sid = transport.sessionId;
|
|
83
115
|
if (sid) {
|
|
84
116
|
transports.delete(sid);
|
|
85
|
-
log(`
|
|
117
|
+
log(`MCP session closed: ${sid}`);
|
|
86
118
|
}
|
|
87
119
|
};
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
const
|
|
120
|
+
// For OAuth sessions, when FleetX returns 401 the tokenStore.clearToken()
|
|
121
|
+
// also wipes the stored token in SQLite → next MCP connect gets 401 → Claude re-auths.
|
|
122
|
+
const onClear = resolved?.userId
|
|
123
|
+
? () => {
|
|
124
|
+
log("FleetX token expired for userId:", resolved.userId);
|
|
125
|
+
expireConnectedAccountToken(resolved.userId);
|
|
126
|
+
}
|
|
127
|
+
: undefined;
|
|
128
|
+
const tokenStore = createTokenStore(onClear);
|
|
129
|
+
const server = await createMcpServer(tokenStore, resolved?.credentials);
|
|
91
130
|
await server.connect(transport);
|
|
92
131
|
await transport.handleRequest(req, res, body);
|
|
93
132
|
return;
|
|
94
133
|
}
|
|
134
|
+
// Unknown session or non-initialize without session
|
|
135
|
+
log(`MCP POST bad request: sessionId=${sessionId} isInit=${isInitializeRequest(body)}`);
|
|
95
136
|
res.writeHead(400, { "Content-Type": "application/json" });
|
|
96
137
|
res.end(JSON.stringify({
|
|
97
138
|
jsonrpc: "2.0",
|
|
98
|
-
error: { code: -32000, message: "Bad Request:
|
|
139
|
+
error: { code: -32000, message: "Bad Request: send initialize first" },
|
|
99
140
|
id: null,
|
|
100
141
|
}));
|
|
101
142
|
}
|
|
102
|
-
async function
|
|
143
|
+
async function handleMcpGetDelete(req, res, authHeader) {
|
|
103
144
|
const sessionId = req.headers["mcp-session-id"];
|
|
104
|
-
if (
|
|
105
|
-
|
|
106
|
-
res.end(JSON.stringify({ error: "Invalid or missing session ID" }));
|
|
145
|
+
if (sessionId && transports.has(sessionId)) {
|
|
146
|
+
await transports.get(sessionId).handleRequest(req, res);
|
|
107
147
|
return;
|
|
108
148
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
if (!sessionId || !transports.has(sessionId)) {
|
|
114
|
-
res.writeHead(400, { "Content-Type": "application/json" });
|
|
115
|
-
res.end(JSON.stringify({ error: "Invalid or missing session ID" }));
|
|
149
|
+
// No valid session — return 401 if OAuth enabled so Claude triggers the auth flow,
|
|
150
|
+
// otherwise 400.
|
|
151
|
+
if (isOAuthConfigured() && !(await resolveCredentials(authHeader))) {
|
|
152
|
+
sendUnauthorized(res);
|
|
116
153
|
return;
|
|
117
154
|
}
|
|
118
|
-
|
|
155
|
+
res.writeHead(400, { "Content-Type": "application/json" });
|
|
156
|
+
res.end(JSON.stringify({ error: "Invalid or missing session ID" }));
|
|
119
157
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
158
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
159
|
+
// Fastify server bootstrap
|
|
160
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
161
|
+
export async function startSSE() {
|
|
162
|
+
const port = parseInt(process.env.PORT ?? "3000", 10);
|
|
163
|
+
const oauthEnabled = isOAuthConfigured();
|
|
164
|
+
const fastify = Fastify({
|
|
165
|
+
logger: {
|
|
166
|
+
stream: process.stderr,
|
|
167
|
+
level: process.env.LOG_LEVEL ?? "info",
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
// Parse application/x-www-form-urlencoded (token endpoint)
|
|
171
|
+
await fastify.register(formbody);
|
|
172
|
+
// ── Health ───────────────────────────────────────────────────────────────
|
|
173
|
+
fastify.get("/health", async () => ({
|
|
174
|
+
status: "ok",
|
|
175
|
+
message: "FleetX MCP Server is running",
|
|
176
|
+
oauth: oauthEnabled,
|
|
177
|
+
}));
|
|
178
|
+
// ── OAuth + discovery (only when configured) ─────────────────────────────
|
|
179
|
+
if (oauthEnabled) {
|
|
180
|
+
const cfg = getOAuthConfig();
|
|
181
|
+
fastify.get("/.well-known/oauth-authorization-server", handleAuthorizationServerMetadata);
|
|
182
|
+
fastify.get("/.well-known/oauth-protected-resource", handleProtectedResourceMetadata);
|
|
183
|
+
fastify.get("/oauth/authorize", handleAuthorize);
|
|
184
|
+
fastify.post("/oauth/token", handleToken);
|
|
185
|
+
fastify.post("/oauth/register", handleClientRegistration);
|
|
186
|
+
fastify.get("/userinfo", handleUserInfo);
|
|
187
|
+
fastify.get("/google/callback", handleGoogleCallback);
|
|
188
|
+
log(`OAuth endpoints enaxbled (issuer: ${cfg.MCP_BASE_URL})`);
|
|
189
|
+
}
|
|
190
|
+
// ── MCP endpoint ─────────────────────────────────────────────────────────
|
|
191
|
+
fastify.all("/mcp", async (request, reply) => {
|
|
192
|
+
// Hand off raw req/res to the MCP transport; Fastify must not touch the response.
|
|
193
|
+
reply.hijack();
|
|
194
|
+
const req = request.raw;
|
|
195
|
+
const res = reply.raw;
|
|
134
196
|
try {
|
|
135
197
|
switch (req.method) {
|
|
136
198
|
case "POST":
|
|
137
|
-
|
|
199
|
+
// Pass Fastify's already-parsed body — raw stream is consumed by this point.
|
|
200
|
+
await handleMcpPost(req, res, request.headers.authorization, request.body);
|
|
138
201
|
break;
|
|
139
202
|
case "GET":
|
|
140
|
-
await handleGet(req, res);
|
|
141
|
-
break;
|
|
142
203
|
case "DELETE":
|
|
143
|
-
await
|
|
204
|
+
await handleMcpGetDelete(req, res, request.headers.authorization);
|
|
144
205
|
break;
|
|
145
206
|
default:
|
|
146
207
|
res.writeHead(405, { "Content-Type": "application/json" });
|
|
@@ -148,27 +209,38 @@ export async function startHTTP() {
|
|
|
148
209
|
}
|
|
149
210
|
}
|
|
150
211
|
catch (err) {
|
|
151
|
-
log("
|
|
212
|
+
log("MCP handler error:", err);
|
|
152
213
|
if (!res.headersSent) {
|
|
153
214
|
res.writeHead(500, { "Content-Type": "application/json" });
|
|
154
215
|
res.end(JSON.stringify({ error: "Internal server error" }));
|
|
155
216
|
}
|
|
156
217
|
}
|
|
157
218
|
});
|
|
158
|
-
|
|
159
|
-
|
|
219
|
+
// ── 404 fallback ─────────────────────────────────────────────────────────
|
|
220
|
+
fastify.setNotFoundHandler(async (_, reply) => {
|
|
221
|
+
return reply.status(404).send({ error: "Not found" });
|
|
160
222
|
});
|
|
223
|
+
await fastify.listen({ port, host: "0.0.0.0" });
|
|
224
|
+
log(`FleetX MCP Server listening on http://0.0.0.0:${port}`);
|
|
225
|
+
log(`MCP endpoint : http://localhost:${port}/mcp`);
|
|
226
|
+
if (oauthEnabled) {
|
|
227
|
+
const cfg = getOAuthConfig();
|
|
228
|
+
log(` Authorize : ${cfg.MCP_BASE_URL}/oauth/authorize`);
|
|
229
|
+
log(` Token : ${cfg.MCP_BASE_URL}/oauth/token`);
|
|
230
|
+
log(` Discovery : ${cfg.MCP_BASE_URL}/.well-known/oauth-authorization-server`);
|
|
231
|
+
}
|
|
161
232
|
process.on("SIGINT", async () => {
|
|
162
|
-
log("Shutting down
|
|
233
|
+
log("Shutting down…");
|
|
163
234
|
for (const [id, transport] of transports) {
|
|
164
235
|
try {
|
|
165
236
|
await transport.close();
|
|
166
|
-
transports.delete(id);
|
|
167
237
|
}
|
|
168
238
|
catch {
|
|
169
|
-
|
|
239
|
+
/* best-effort */
|
|
170
240
|
}
|
|
241
|
+
transports.delete(id);
|
|
171
242
|
}
|
|
243
|
+
await fastify.close();
|
|
172
244
|
process.exit(0);
|
|
173
245
|
});
|
|
174
246
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/transports/sse.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/transports/sse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FastifyRequest } from "fastify";
|
|
2
|
+
/**
|
|
3
|
+
* Derives the public base URL of this server from the incoming request.
|
|
4
|
+
* Prefers MCP_BASE_URL when it has been explicitly overridden from the default.
|
|
5
|
+
* Falls back to the request Host header so local dev works without config.
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveServerBaseUrl(request: FastifyRequest): string;
|
|
8
|
+
//# sourceMappingURL=utils-http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils-http.d.ts","sourceRoot":"","sources":["../src/utils-http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CASpE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derives the public base URL of this server from the incoming request.
|
|
3
|
+
* Prefers MCP_BASE_URL when it has been explicitly overridden from the default.
|
|
4
|
+
* Falls back to the request Host header so local dev works without config.
|
|
5
|
+
*/
|
|
6
|
+
export function resolveServerBaseUrl(request) {
|
|
7
|
+
const configured = process.env.MCP_BASE_URL?.trim();
|
|
8
|
+
if (configured && configured !== "https://mcp.fleetx.io")
|
|
9
|
+
return configured;
|
|
10
|
+
const proto = request.headers["x-forwarded-proto"]?.split(",")[0].trim() ??
|
|
11
|
+
"http";
|
|
12
|
+
const host = request.headers.host ?? `localhost:${process.env.PORT ?? 3000}`;
|
|
13
|
+
return `${proto}://${host}`;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=utils-http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils-http.js","sourceRoot":"","sources":["../src/utils-http.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAuB;IAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;IACpD,IAAI,UAAU,IAAI,UAAU,KAAK,uBAAuB;QAAE,OAAO,UAAU,CAAC;IAE5E,MAAM,KAAK,GACR,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAwB,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QAClF,MAAM,CAAC;IACT,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,aAAa,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;IAC7E,OAAO,GAAG,KAAK,MAAM,IAAI,EAAE,CAAC;AAC9B,CAAC"}
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,QASrC;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AACD,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,uBAAuB,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAKhF"}
|
package/dist/utils.js
CHANGED
|
@@ -3,8 +3,15 @@
|
|
|
3
3
|
* Use log() everywhere instead of console.log / console.error.
|
|
4
4
|
*/
|
|
5
5
|
export function log(...args) {
|
|
6
|
-
const msg = args
|
|
7
|
-
|
|
6
|
+
const msg = args
|
|
7
|
+
.map((a) => {
|
|
8
|
+
if (typeof a === "string")
|
|
9
|
+
return a;
|
|
10
|
+
if (a instanceof Error)
|
|
11
|
+
return `${a.name}: ${a.message}${a.cause ? ` (cause: ${a.cause})` : ""}`;
|
|
12
|
+
return JSON.stringify(a);
|
|
13
|
+
})
|
|
14
|
+
.join(" ");
|
|
8
15
|
console.error(JSON.stringify({ message: msg, level: "info" }));
|
|
9
16
|
}
|
|
10
17
|
export function getAPIDefinitionURL() {
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,GAAG,CAAC,GAAG,IAAe;IACpC,MAAM,GAAG,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,GAAG,CAAC,GAAG,IAAe;IACpC,MAAM,GAAG,GAAG,IAAI;SACb,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,YAAY,KAAK;YAAE,OAAO,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACjG,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAmB,IAAI,qCAAqC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,GAAG,CAAC,SAAU,IAAI,oCAAoC,CAAC;AACxE,CAAC;AACD,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAC,GAAG,CAAC,WAAY,IAAI,uCAAuC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE;QACnE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE;KACpE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { FastifyRequest, FastifyReply } from "fastify";
|
|
2
|
+
export declare function handleAuthorizationServerMetadata(request: FastifyRequest, reply: FastifyReply): Promise<void>;
|
|
3
|
+
export declare function handleProtectedResourceMetadata(request: FastifyRequest, reply: FastifyReply): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/well-known/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5D,wBAAsB,iCAAiC,CACrD,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAOf"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { resolveServerBaseUrl } from "../utils-http.js";
|
|
2
|
+
export async function handleAuthorizationServerMetadata(request, reply) {
|
|
3
|
+
const base = resolveServerBaseUrl(request);
|
|
4
|
+
return reply.send({
|
|
5
|
+
issuer: base,
|
|
6
|
+
authorization_endpoint: `${base}/oauth/authorize`,
|
|
7
|
+
token_endpoint: `${base}/oauth/token`,
|
|
8
|
+
registration_endpoint: `${base}/oauth/register`,
|
|
9
|
+
userinfo_endpoint: `${base}/userinfo`,
|
|
10
|
+
response_types_supported: ["code"],
|
|
11
|
+
grant_types_supported: ["authorization_code", "refresh_token"],
|
|
12
|
+
code_challenge_methods_supported: ["S256"],
|
|
13
|
+
token_endpoint_auth_methods_supported: ["none"],
|
|
14
|
+
// CIMD: Claude skips DCR when both flags are present
|
|
15
|
+
client_id_metadata_document_supported: true,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export async function handleProtectedResourceMetadata(request, reply) {
|
|
19
|
+
const base = resolveServerBaseUrl(request);
|
|
20
|
+
return reply.send({
|
|
21
|
+
resource: `${base}/mcp`,
|
|
22
|
+
authorization_servers: [base],
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/well-known/discovery.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACrD,OAAuB,EACvB,KAAmB;IAEnB,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAE3C,OAAO,KAAK,CAAC,IAAI,CAAC;QAChB,MAAM,EAAE,IAAI;QACZ,sBAAsB,EAAE,GAAG,IAAI,kBAAkB;QACjD,cAAc,EAAE,GAAG,IAAI,cAAc;QACrC,qBAAqB,EAAE,GAAG,IAAI,iBAAiB;QAC/C,iBAAiB,EAAE,GAAG,IAAI,WAAW;QACrC,wBAAwB,EAAE,CAAC,MAAM,CAAC;QAClC,qBAAqB,EAAE,CAAC,oBAAoB,EAAE,eAAe,CAAC;QAC9D,gCAAgC,EAAE,CAAC,MAAM,CAAC;QAC1C,qCAAqC,EAAE,CAAC,MAAM,CAAC;QAC/C,qDAAqD;QACrD,qCAAqC,EAAE,IAAI;KAC5C,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,OAAuB,EACvB,KAAmB;IAEnB,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAE3C,OAAO,KAAK,CAAC,IAAI,CAAC;QAChB,QAAQ,EAAE,GAAG,IAAI,MAAM;QACvB,qBAAqB,EAAE,CAAC,IAAI,CAAC;KAC9B,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fleetx_io/fleetx-mcp-server",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "MCP server that gives AI agents access to the FleetX REST API. Works with Cursor, Claude Desktop, Windsurf, and any MCP-compatible client.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -19,11 +19,12 @@
|
|
|
19
19
|
"access": "public"
|
|
20
20
|
},
|
|
21
21
|
"scripts": {
|
|
22
|
-
"dev": "
|
|
22
|
+
"dev": "tsx watch ./src/index.ts",
|
|
23
|
+
"dev:http": "MCP_TRANSPORT=http tsx watch ./src/index.ts",
|
|
23
24
|
"build": "tsc",
|
|
24
25
|
"publish": "npm run build && npm publish --access public",
|
|
25
26
|
"start": "MCP_TRANSPORT=http NODE_ENV=production node dist/index.js",
|
|
26
|
-
"startClientLive": "npx @modelcontextprotocol/inspector
|
|
27
|
+
"startClientLive": "npx @modelcontextprotocol/inspector tsx ./src/index.ts",
|
|
27
28
|
"startClient": "npx @modelcontextprotocol/inspector node dist/index.js"
|
|
28
29
|
},
|
|
29
30
|
"keywords": [
|
|
@@ -43,17 +44,24 @@
|
|
|
43
44
|
"license": "ISC",
|
|
44
45
|
"homepage": "https://www.npmjs.com/package/@fleetx_io/fleetx-mcp-server",
|
|
45
46
|
"engines": {
|
|
46
|
-
"node": ">=
|
|
47
|
+
"node": ">=22.0.0"
|
|
47
48
|
},
|
|
48
49
|
"dependencies": {
|
|
50
|
+
"@fastify/formbody": "^8.0.2",
|
|
49
51
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
50
|
-
"axios": "^1.
|
|
52
|
+
"axios": "^1.17.0",
|
|
53
|
+
"better-sqlite3": "^12.10.0",
|
|
54
|
+
"dotenv": "^17.4.2",
|
|
55
|
+
"fastify": "^5.8.5",
|
|
56
|
+
"jose": "^6.2.3",
|
|
51
57
|
"zod": "^4.3.6"
|
|
52
58
|
},
|
|
53
59
|
"devDependencies": {
|
|
60
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
54
61
|
"@types/node": "^25.3.3",
|
|
62
|
+
"prettier": "2.0.5",
|
|
55
63
|
"ts-node-dev": "^2.0.0",
|
|
56
|
-
"
|
|
57
|
-
"
|
|
64
|
+
"tsx": "^4.22.4",
|
|
65
|
+
"typescript": "^5.9.3"
|
|
58
66
|
}
|
|
59
67
|
}
|