@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
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { randomBytes, randomUUID } from "node:crypto";
|
|
2
|
+
import { getDb } from "./db.js";
|
|
3
|
+
import { REFRESH_TOKEN_TTL_DAYS } from "../../config/oauth.js";
|
|
4
|
+
function rowToToken(row) {
|
|
5
|
+
return {
|
|
6
|
+
id: row.id,
|
|
7
|
+
token: row.token,
|
|
8
|
+
userId: row.user_id,
|
|
9
|
+
clientId: row.client_id,
|
|
10
|
+
expiresAt: row.expires_at,
|
|
11
|
+
revokedAt: row.revoked_at,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export function createRefreshToken(params) {
|
|
15
|
+
const db = getDb();
|
|
16
|
+
const id = randomUUID();
|
|
17
|
+
const token = randomBytes(32).toString("base64url");
|
|
18
|
+
const expiresAt = Date.now() + REFRESH_TOKEN_TTL_DAYS * 24 * 60 * 60 * 1000;
|
|
19
|
+
db.prepare(`
|
|
20
|
+
INSERT INTO refresh_tokens (id, token, user_id, client_id, expires_at, revoked_at)
|
|
21
|
+
VALUES (?, ?, ?, ?, ?, NULL)
|
|
22
|
+
`).run(id, token, params.userId, params.clientId, expiresAt);
|
|
23
|
+
return { id, token, userId: params.userId, clientId: params.clientId, expiresAt, revokedAt: null };
|
|
24
|
+
}
|
|
25
|
+
export function findRefreshToken(token) {
|
|
26
|
+
const db = getDb();
|
|
27
|
+
const row = db
|
|
28
|
+
.prepare("SELECT * FROM refresh_tokens WHERE token = ?")
|
|
29
|
+
.get(token);
|
|
30
|
+
return row ? rowToToken(row) : null;
|
|
31
|
+
}
|
|
32
|
+
/** Revokes the old token and issues a new one (rotation). Returns null if invalid/expired. */
|
|
33
|
+
export function rotateRefreshToken(oldToken) {
|
|
34
|
+
const db = getDb();
|
|
35
|
+
const existing = findRefreshToken(oldToken);
|
|
36
|
+
if (!existing || existing.revokedAt !== null || existing.expiresAt < Date.now()) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
db.prepare("UPDATE refresh_tokens SET revoked_at = ? WHERE id = ?").run(Date.now(), existing.id);
|
|
40
|
+
return createRefreshToken({ userId: existing.userId, clientId: existing.clientId });
|
|
41
|
+
}
|
|
42
|
+
export function revokeRefreshToken(token) {
|
|
43
|
+
const db = getDb();
|
|
44
|
+
db.prepare("UPDATE refresh_tokens SET revoked_at = ? WHERE token = ?").run(Date.now(), token);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=refresh-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-token.js","sourceRoot":"","sources":["../../../src/auth/storage/refresh-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAoB/D,SAAS,UAAU,CAAC,GAAU;IAC5B,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAA4C;IAC7E,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACxB,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,sBAAsB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAE5E,EAAE,CAAC,OAAO,CAAC;;;GAGV,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAE7D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,GAAG,GAAG,EAAE;SACX,OAAO,CAAkB,8CAA8C,CAAC;SACxE,GAAG,CAAC,KAAK,CAAC,CAAC;IACd,OAAO,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACtC,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE5C,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS,KAAK,IAAI,IAAI,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEjG,OAAO,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;AAChG,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Encrypts plaintext with AES-256-GCM. Returns "iv:authTag:ciphertext" (all hex). */
|
|
2
|
+
export declare function encryptToken(plaintext: string, keyHex: string): string;
|
|
3
|
+
/** Decrypts a value produced by {@link encryptToken}. */
|
|
4
|
+
export declare function decryptToken(ciphertext: string, keyHex: string): string;
|
|
5
|
+
//# sourceMappingURL=encryption.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../../../src/auth/tokens/encryption.ts"],"names":[],"mappings":"AAKA,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAStE;AAED,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAcvE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createCipheriv, createDecipheriv, randomBytes } from "node:crypto";
|
|
2
|
+
const ALGORITHM = "aes-256-gcm";
|
|
3
|
+
const IV_LENGTH = 12;
|
|
4
|
+
/** Encrypts plaintext with AES-256-GCM. Returns "iv:authTag:ciphertext" (all hex). */
|
|
5
|
+
export function encryptToken(plaintext, keyHex) {
|
|
6
|
+
const key = Buffer.from(keyHex, "hex");
|
|
7
|
+
const iv = randomBytes(IV_LENGTH);
|
|
8
|
+
const cipher = createCipheriv(ALGORITHM, key, iv);
|
|
9
|
+
const encrypted = Buffer.concat([cipher.update(plaintext, "utf8"), cipher.final()]);
|
|
10
|
+
const authTag = cipher.getAuthTag();
|
|
11
|
+
return [iv.toString("hex"), authTag.toString("hex"), encrypted.toString("hex")].join(":");
|
|
12
|
+
}
|
|
13
|
+
/** Decrypts a value produced by {@link encryptToken}. */
|
|
14
|
+
export function decryptToken(ciphertext, keyHex) {
|
|
15
|
+
const key = Buffer.from(keyHex, "hex");
|
|
16
|
+
const parts = ciphertext.split(":");
|
|
17
|
+
if (parts.length !== 3)
|
|
18
|
+
throw new Error("Invalid ciphertext format");
|
|
19
|
+
const [ivHex, authTagHex, encryptedHex] = parts;
|
|
20
|
+
const iv = Buffer.from(ivHex, "hex");
|
|
21
|
+
const authTag = Buffer.from(authTagHex, "hex");
|
|
22
|
+
const encrypted = Buffer.from(encryptedHex, "hex");
|
|
23
|
+
const decipher = createDecipheriv(ALGORITHM, key, iv);
|
|
24
|
+
decipher.setAuthTag(authTag);
|
|
25
|
+
return Buffer.concat([decipher.update(encrypted), decipher.final()]).toString("utf8");
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=encryption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.js","sourceRoot":"","sources":["../../../src/auth/tokens/encryption.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,SAAS,GAAG,aAAa,CAAC;AAChC,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB,sFAAsF;AACtF,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,MAAc;IAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAElD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACpF,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAEpC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5F,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,MAAc;IAC7D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAErE,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC;IAChD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAEnD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACtD,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAE7B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACxF,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface McpTokenPayload {
|
|
2
|
+
sub: string;
|
|
3
|
+
email: string;
|
|
4
|
+
name: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function signMcpAccessToken(payload: McpTokenPayload): Promise<string>;
|
|
7
|
+
export declare function verifyMcpAccessToken(token: string): Promise<McpTokenPayload | null>;
|
|
8
|
+
//# sourceMappingURL=jwt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../../src/auth/tokens/jwt.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAWlF;AAED,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAuBzF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { SignJWT, jwtVerify } from "jose";
|
|
2
|
+
import { getOAuthConfig, ACCESS_TOKEN_TTL_SECONDS } from "../../config/oauth.js";
|
|
3
|
+
export async function signMcpAccessToken(payload) {
|
|
4
|
+
const { JWT_SECRET, MCP_BASE_URL } = getOAuthConfig();
|
|
5
|
+
const secret = new TextEncoder().encode(JWT_SECRET);
|
|
6
|
+
return new SignJWT({ email: payload.email, name: payload.name })
|
|
7
|
+
.setProtectedHeader({ alg: "HS256" })
|
|
8
|
+
.setSubject(payload.sub)
|
|
9
|
+
.setIssuedAt()
|
|
10
|
+
.setExpirationTime(`${ACCESS_TOKEN_TTL_SECONDS}s`)
|
|
11
|
+
.setIssuer(MCP_BASE_URL)
|
|
12
|
+
.sign(secret);
|
|
13
|
+
}
|
|
14
|
+
export async function verifyMcpAccessToken(token) {
|
|
15
|
+
try {
|
|
16
|
+
const { JWT_SECRET, MCP_BASE_URL } = getOAuthConfig();
|
|
17
|
+
const secret = new TextEncoder().encode(JWT_SECRET);
|
|
18
|
+
const { payload } = await jwtVerify(token, secret, { issuer: MCP_BASE_URL });
|
|
19
|
+
if (typeof payload.sub !== "string" ||
|
|
20
|
+
typeof payload["email"] !== "string" ||
|
|
21
|
+
typeof payload["name"] !== "string") {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
sub: payload.sub,
|
|
26
|
+
email: payload["email"],
|
|
27
|
+
name: payload["name"],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=jwt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../../src/auth/tokens/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAQjF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAwB;IAC/D,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEpD,OAAO,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;SAC7D,kBAAkB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;SACpC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC;SACvB,WAAW,EAAE;SACb,iBAAiB,CAAC,GAAG,wBAAwB,GAAG,CAAC;SACjD,SAAS,CAAC,YAAY,CAAC;SACvB,IAAI,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAa;IACtD,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAEpD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QAE7E,IACE,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ;YAC/B,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,QAAQ;YACpC,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,QAAQ,EACnC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,OAAO,CAAC,OAAO,CAAW;YACjC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAW;SAChC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/auth.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { TokenStore } from "./types.js";
|
|
2
|
-
export declare function createTokenStore(): TokenStore;
|
|
2
|
+
export declare function createTokenStore(onClear?: () => void): TokenStore;
|
|
3
3
|
export declare function login(loginUrl: string, username: string, password: string, tokenStore: TokenStore): Promise<{
|
|
4
4
|
success: boolean;
|
|
5
5
|
message: string;
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,wBAAgB,gBAAgB,IAAI,UAAU,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,UAAU,CAqBjE;AAED,wBAAsB,KAAK,CACzB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAyChD"}
|
package/dist/auth.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import axios from "axios";
|
|
2
2
|
import { log } from "./utils.js";
|
|
3
|
-
export function createTokenStore() {
|
|
3
|
+
export function createTokenStore(onClear) {
|
|
4
4
|
let accessToken = null;
|
|
5
5
|
return {
|
|
6
6
|
get accessToken() {
|
|
@@ -14,6 +14,7 @@ export function createTokenStore() {
|
|
|
14
14
|
},
|
|
15
15
|
clearToken() {
|
|
16
16
|
accessToken = null;
|
|
17
|
+
onClear?.();
|
|
17
18
|
},
|
|
18
19
|
isAuthenticated() {
|
|
19
20
|
return accessToken !== null;
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjC,MAAM,UAAU,gBAAgB;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjC,MAAM,UAAU,gBAAgB,CAAC,OAAoB;IACnD,IAAI,WAAW,GAAkB,IAAI,CAAC;IAEtC,OAAO;QACL,IAAI,WAAW;YACb,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,QAAQ,CAAC,KAAa;YACpB,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;QACD,QAAQ;YACN,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,UAAU;YACR,WAAW,GAAG,IAAI,CAAC;YACnB,OAAO,EAAE,EAAE,CAAC;QACd,CAAC;QACD,eAAe;YACb,OAAO,WAAW,KAAK,IAAI,CAAC;QAC9B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,QAAgB,EAChB,QAAgB,EAChB,QAAgB,EAChB,UAAsB;IAEtB,IAAI,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;QACvC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAC1C,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACtC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACtC,GAAG,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE;YAC/D,OAAO,EAAE;gBACP,cAAc,EAAE,mCAAmC;gBACnD,QAAQ,EAAE,iBAAiB;aAC5B;SACF,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;QAGzC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,wDAAwD;aAClE,CAAC;QACJ,CAAC;QAED,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC3B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,4CAA4C,EAAE,CAAC;IAClF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,GAAiB,CAAC;QACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,SAAS,CAAC;QACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;QACrC,MAAM,MAAM,GACV,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,SAAS,IAAI,IAAI;YAC5D,CAAC,CAAE,IAA4B,CAAC,OAAO;YACvC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAEvB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,sBAAsB,MAAM,MAAM,MAAM,EAAE;SACpD,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const configSchema: z.ZodObject<{
|
|
3
|
+
MCP_BASE_URL: z.ZodDefault<z.ZodString>;
|
|
4
|
+
GOOGLE_CLIENT_ID: z.ZodString;
|
|
5
|
+
GOOGLE_CLIENT_SECRET: z.ZodString;
|
|
6
|
+
JWT_SECRET: z.ZodString;
|
|
7
|
+
TOKEN_ENCRYPTION_KEY: z.ZodString;
|
|
8
|
+
DATABASE_PATH: z.ZodDefault<z.ZodString>;
|
|
9
|
+
SESSION_SECRET: z.ZodDefault<z.ZodString>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
export type OAuthConfig = z.infer<typeof configSchema>;
|
|
12
|
+
export declare function getOAuthConfig(): OAuthConfig;
|
|
13
|
+
export declare function isOAuthConfigured(): boolean;
|
|
14
|
+
export declare const CLAUDE_CLIENT_ID = "claude-production";
|
|
15
|
+
export declare const CLAUDE_REDIRECT_URI = "https://claude.ai/api/mcp/auth_callback";
|
|
16
|
+
export declare const AUTH_CODE_TTL_SECONDS = 300;
|
|
17
|
+
export declare const ACCESS_TOKEN_TTL_SECONDS: number;
|
|
18
|
+
export declare const REFRESH_TOKEN_TTL_DAYS = 30;
|
|
19
|
+
export declare const PENDING_SESSION_TTL_MS: number;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/config/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,YAAY;;;;;;;;iBAQhB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAKvD,wBAAgB,cAAc,IAAI,WAAW,CAc5C;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAO3C;AAED,eAAO,MAAM,gBAAgB,sBAAsB,CAAC;AACpD,eAAO,MAAM,mBAAmB,4CAA4C,CAAC;AAC7E,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,wBAAwB,QAAoB,CAAC;AAC1D,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,eAAO,MAAM,sBAAsB,QAAiB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const configSchema = z.object({
|
|
3
|
+
MCP_BASE_URL: z.string().url().default("https://mcp.fleetx.io"),
|
|
4
|
+
GOOGLE_CLIENT_ID: z.string().min(1),
|
|
5
|
+
GOOGLE_CLIENT_SECRET: z.string().min(1),
|
|
6
|
+
JWT_SECRET: z.string().min(32),
|
|
7
|
+
TOKEN_ENCRYPTION_KEY: z.string().length(64), // 32-byte AES key as hex
|
|
8
|
+
DATABASE_PATH: z.string().default("./data/mcp.db"),
|
|
9
|
+
SESSION_SECRET: z.string().min(32).default("change-me-in-production-32-chars!!"),
|
|
10
|
+
});
|
|
11
|
+
let _config = null;
|
|
12
|
+
let _configLoadAttempted = false;
|
|
13
|
+
export function getOAuthConfig() {
|
|
14
|
+
if (_config)
|
|
15
|
+
return _config;
|
|
16
|
+
if (_configLoadAttempted)
|
|
17
|
+
throw new Error("OAuth config not available");
|
|
18
|
+
_configLoadAttempted = true;
|
|
19
|
+
const result = configSchema.safeParse(process.env);
|
|
20
|
+
if (!result.success) {
|
|
21
|
+
const missing = result.error.issues
|
|
22
|
+
.map((i) => `${i.path.join(".")}: ${i.message}`)
|
|
23
|
+
.join("; ");
|
|
24
|
+
throw new Error(`OAuth config invalid: ${missing}`);
|
|
25
|
+
}
|
|
26
|
+
_config = result.data;
|
|
27
|
+
return _config;
|
|
28
|
+
}
|
|
29
|
+
export function isOAuthConfigured() {
|
|
30
|
+
return !!(process.env.GOOGLE_CLIENT_ID &&
|
|
31
|
+
process.env.GOOGLE_CLIENT_SECRET &&
|
|
32
|
+
process.env.JWT_SECRET &&
|
|
33
|
+
process.env.TOKEN_ENCRYPTION_KEY);
|
|
34
|
+
}
|
|
35
|
+
export const CLAUDE_CLIENT_ID = "claude-production";
|
|
36
|
+
export const CLAUDE_REDIRECT_URI = "https://claude.ai/api/mcp/auth_callback";
|
|
37
|
+
export const AUTH_CODE_TTL_SECONDS = 300; // 5 minutes
|
|
38
|
+
export const ACCESS_TOKEN_TTL_SECONDS = 15 * 24 * 60 * 60; // 15 days
|
|
39
|
+
export const REFRESH_TOKEN_TTL_DAYS = 30;
|
|
40
|
+
export const PENDING_SESSION_TTL_MS = 10 * 60 * 1000; // 10 minutes
|
|
41
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/config/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC;IAC/D,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACnC,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IAC9B,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,yBAAyB;IACtE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC;IAClD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,oCAAoC,CAAC;CACjF,CAAC,CAAC;AAIH,IAAI,OAAO,GAAuB,IAAI,CAAC;AACvC,IAAI,oBAAoB,GAAG,KAAK,CAAC;AAEjC,MAAM,UAAU,cAAc;IAC5B,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,IAAI,oBAAoB;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAExE,oBAAoB,GAAG,IAAI,CAAC;IAC5B,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;aAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aAC/C,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;IACtB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CAAC,CAAC,CACP,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAC5B,OAAO,CAAC,GAAG,CAAC,oBAAoB;QAChC,OAAO,CAAC,GAAG,CAAC,UAAU;QACtB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CACjC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AACpD,MAAM,CAAC,MAAM,mBAAmB,GAAG,yCAAyC,CAAC;AAC7E,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC,CAAC,YAAY;AACtD,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU;AACrE,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AACzC,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAGA,OAAO,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
// Load .env before anything else. No-op if file is absent (production envs inject vars directly).
|
|
3
|
+
import "dotenv/config";
|
|
2
4
|
import { log } from "./utils.js";
|
|
3
5
|
const transport = (process.env.MCP_TRANSPORT ?? "stdio").toLowerCase();
|
|
4
6
|
async function main() {
|
|
5
7
|
log(`Starting FleetX MCP Server in ${transport} mode`);
|
|
6
8
|
if (transport === "http") {
|
|
7
|
-
const {
|
|
8
|
-
await
|
|
9
|
+
const { startSSE } = await import("./transports/sse.js");
|
|
10
|
+
await startSSE();
|
|
9
11
|
}
|
|
10
12
|
else {
|
|
11
13
|
const { startStdio } = await import("./transports/stdio.js");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjC,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AAEvE,KAAK,UAAU,IAAI;IACjB,GAAG,CAAC,iCAAiC,SAAS,OAAO,CAAC,CAAC;IACvD,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,kGAAkG;AAClG,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjC,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AAEvE,KAAK,UAAU,IAAI;IACjB,GAAG,CAAC,iCAAiC,SAAS,OAAO,CAAC,CAAC;IACvD,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACzD,MAAM,QAAQ,EAAE,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC7D,MAAM,UAAU,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { FastifyRequest, FastifyReply } from "fastify";
|
|
2
|
+
declare module "fastify" {
|
|
3
|
+
interface FastifyRequest {
|
|
4
|
+
mcpUser?: {
|
|
5
|
+
userId: string;
|
|
6
|
+
email: string;
|
|
7
|
+
name: string;
|
|
8
|
+
fleetxAccessToken: string;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Prehandler that validates MCP Bearer tokens issued by this server.
|
|
14
|
+
* Attaches request.mcpUser on success; returns 401 on failure.
|
|
15
|
+
* If the FleetX token has expired the user must re-authenticate via OAuth.
|
|
16
|
+
*/
|
|
17
|
+
export declare function requireMcpAuth(request: FastifyRequest, reply: FastifyReply): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/mcp/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5D,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,cAAc;QACtB,OAAO,CAAC,EAAE;YACR,MAAM,EAAE,MAAM,CAAC;YACf,KAAK,EAAE,MAAM,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;YACb,iBAAiB,EAAE,MAAM,CAAC;SAC3B,CAAC;KACH;CACF;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BhG"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { verifyMcpAccessToken } from "../../auth/tokens/jwt.js";
|
|
2
|
+
import { findConnectedAccountByUserId } from "../../auth/storage/connected-account.js";
|
|
3
|
+
/**
|
|
4
|
+
* Prehandler that validates MCP Bearer tokens issued by this server.
|
|
5
|
+
* Attaches request.mcpUser on success; returns 401 on failure.
|
|
6
|
+
* If the FleetX token has expired the user must re-authenticate via OAuth.
|
|
7
|
+
*/
|
|
8
|
+
export async function requireMcpAuth(request, reply) {
|
|
9
|
+
const header = request.headers.authorization;
|
|
10
|
+
if (!header?.startsWith("Bearer ")) {
|
|
11
|
+
return reply
|
|
12
|
+
.status(401)
|
|
13
|
+
.header("WWW-Authenticate", "Bearer")
|
|
14
|
+
.send({ error: "unauthorized", error_description: "Bearer token required" });
|
|
15
|
+
}
|
|
16
|
+
const token = header.slice(7).trim();
|
|
17
|
+
const payload = await verifyMcpAccessToken(token);
|
|
18
|
+
if (!payload) {
|
|
19
|
+
return reply
|
|
20
|
+
.status(401)
|
|
21
|
+
.header("WWW-Authenticate", 'Bearer error="invalid_token"')
|
|
22
|
+
.send({ error: "invalid_token" });
|
|
23
|
+
}
|
|
24
|
+
const account = findConnectedAccountByUserId(payload.sub);
|
|
25
|
+
if (!account) {
|
|
26
|
+
return reply.status(401).send({ error: "user_not_found" });
|
|
27
|
+
}
|
|
28
|
+
request.mcpUser = {
|
|
29
|
+
userId: account.userId,
|
|
30
|
+
email: account.email,
|
|
31
|
+
name: account.name,
|
|
32
|
+
fleetxAccessToken: account.fleetxAccessToken,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/mcp/middleware/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,yCAAyC,CAAC;AAavF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAuB,EAAE,KAAmB;IAC/E,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;IAE7C,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,OAAO,KAAK;aACT,MAAM,CAAC,GAAG,CAAC;aACX,MAAM,CAAC,kBAAkB,EAAE,QAAQ,CAAC;aACpC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAElD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,KAAK;aACT,MAAM,CAAC,GAAG,CAAC;aACX,MAAM,CAAC,kBAAkB,EAAE,8BAA8B,CAAC;aAC1D,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,OAAO,GAAG,4BAA4B,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,CAAC,OAAO,GAAG;QAChB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;KAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["../../src/transports/fastify.ts"],"names":[],"mappings":"AA8KA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAwFlD"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import Fastify from "fastify";
|
|
2
|
+
import formbody from "@fastify/formbody";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
5
|
+
import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
|
|
6
|
+
import { createMcpServer } from "../server/createMcpServer.js";
|
|
7
|
+
import { createTokenStore } from "../auth.js";
|
|
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, updateFleetxTokens } from "../auth/storage/connected-account.js";
|
|
12
|
+
import { refreshFleetxToken } from "../auth/fleetx/exchange.js";
|
|
13
|
+
import { handleAuthorize } from "../auth/oauth/authorize.js";
|
|
14
|
+
import { handleToken } from "../auth/oauth/token.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";
|
|
18
|
+
const transports = new Map();
|
|
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) {
|
|
28
|
+
if (!header?.startsWith("Basic "))
|
|
29
|
+
return undefined;
|
|
30
|
+
const decoded = Buffer.from(header.slice(6), "base64").toString("utf-8");
|
|
31
|
+
const sep = decoded.indexOf(":");
|
|
32
|
+
if (sep === -1)
|
|
33
|
+
return undefined;
|
|
34
|
+
const username = decoded.slice(0, sep);
|
|
35
|
+
const password = decoded.slice(sep + 1);
|
|
36
|
+
return username && password ? { type: "basic", username, password } : undefined;
|
|
37
|
+
}
|
|
38
|
+
async function resolveCredentials(authHeader) {
|
|
39
|
+
const bearerToken = parseBearer(authHeader);
|
|
40
|
+
if (bearerToken && isOAuthConfigured()) {
|
|
41
|
+
// Attempt to treat as MCP JWT → look up FleetX token
|
|
42
|
+
const payload = await verifyMcpAccessToken(bearerToken).catch(() => null);
|
|
43
|
+
if (payload) {
|
|
44
|
+
const account = findConnectedAccountByUserId(payload.sub);
|
|
45
|
+
if (account) {
|
|
46
|
+
// Refresh FleetX token if expiring soon
|
|
47
|
+
const BUFFER = 5 * 60 * 1000;
|
|
48
|
+
const expiringSoon = account.fleetxTokenExpiry !== null &&
|
|
49
|
+
account.fleetxTokenExpiry - Date.now() < BUFFER;
|
|
50
|
+
if (expiringSoon) {
|
|
51
|
+
const refreshed = await refreshFleetxToken(account.fleetxRefreshToken);
|
|
52
|
+
if (refreshed) {
|
|
53
|
+
updateFleetxTokens(account.userId, refreshed.accessToken, refreshed.refreshToken);
|
|
54
|
+
return { type: "bearer", token: refreshed.accessToken };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return { type: "bearer", token: account.fleetxAccessToken };
|
|
58
|
+
}
|
|
59
|
+
// Valid JWT but no account — deny
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
// Not a valid MCP JWT — fall through to raw bearer / basic / env
|
|
63
|
+
}
|
|
64
|
+
const basic = parseBasic(authHeader);
|
|
65
|
+
if (basic)
|
|
66
|
+
return basic;
|
|
67
|
+
if (bearerToken)
|
|
68
|
+
return { type: "bearer", token: bearerToken };
|
|
69
|
+
const envToken = process.env.BEARER_ACCESS_TOKEN?.trim();
|
|
70
|
+
if (envToken)
|
|
71
|
+
return { type: "bearer", token: envToken };
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
75
|
+
// Raw-body parser (needed before passing to MCP transport)
|
|
76
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
77
|
+
function readRawBody(req) {
|
|
78
|
+
return new Promise((resolve, reject) => {
|
|
79
|
+
const chunks = [];
|
|
80
|
+
req.on("data", (c) => chunks.push(c));
|
|
81
|
+
req.on("end", () => {
|
|
82
|
+
try {
|
|
83
|
+
resolve(JSON.parse(Buffer.concat(chunks).toString()));
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
reject(e);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
req.on("error", reject);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
93
|
+
// MCP session handlers (operate on Node raw req/res)
|
|
94
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
95
|
+
async function handleMcpPost(req, res, authHeader) {
|
|
96
|
+
const body = await readRawBody(req);
|
|
97
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
98
|
+
if (sessionId && transports.has(sessionId)) {
|
|
99
|
+
await transports.get(sessionId).handleRequest(req, res, body);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (!sessionId && isInitializeRequest(body)) {
|
|
103
|
+
log(`New MCP session from ${req.socket?.remoteAddress}`);
|
|
104
|
+
const credentials = await resolveCredentials(authHeader);
|
|
105
|
+
const transport = new StreamableHTTPServerTransport({
|
|
106
|
+
sessionIdGenerator: () => randomUUID(),
|
|
107
|
+
onsessioninitialized: (id) => {
|
|
108
|
+
transports.set(id, transport);
|
|
109
|
+
log(`MCP session initialized: ${id}`);
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
transport.onclose = () => {
|
|
113
|
+
const sid = transport.sessionId;
|
|
114
|
+
if (sid) {
|
|
115
|
+
transports.delete(sid);
|
|
116
|
+
log(`MCP session closed: ${sid}`);
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
const tokenStore = createTokenStore();
|
|
120
|
+
const server = await createMcpServer(tokenStore, credentials);
|
|
121
|
+
await server.connect(transport);
|
|
122
|
+
await transport.handleRequest(req, res, body);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
res.writeHead(400, { "Content-Type": "application/json" });
|
|
126
|
+
res.end(JSON.stringify({
|
|
127
|
+
jsonrpc: "2.0",
|
|
128
|
+
error: { code: -32000, message: "Bad Request: No valid session ID" },
|
|
129
|
+
id: null,
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
async function handleMcpGetDelete(req, res) {
|
|
133
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
134
|
+
if (!sessionId || !transports.has(sessionId)) {
|
|
135
|
+
res.writeHead(400, { "Content-Type": "application/json" });
|
|
136
|
+
res.end(JSON.stringify({ error: "Invalid or missing session ID" }));
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
await transports.get(sessionId).handleRequest(req, res);
|
|
140
|
+
}
|
|
141
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
142
|
+
// Fastify server bootstrap
|
|
143
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
144
|
+
export async function startFastify() {
|
|
145
|
+
const port = parseInt(process.env.PORT ?? "3000", 10);
|
|
146
|
+
const oauthEnabled = isOAuthConfigured();
|
|
147
|
+
const fastify = Fastify({ logger: false, disableRequestLogging: true });
|
|
148
|
+
// Parse application/x-www-form-urlencoded (token endpoint)
|
|
149
|
+
await fastify.register(formbody);
|
|
150
|
+
// ── Health ───────────────────────────────────────────────────────────────
|
|
151
|
+
fastify.get("/health", async () => ({
|
|
152
|
+
status: "ok",
|
|
153
|
+
message: "FleetX MCP Server is running",
|
|
154
|
+
oauth: oauthEnabled,
|
|
155
|
+
}));
|
|
156
|
+
// ── OAuth + discovery (only when configured) ─────────────────────────────
|
|
157
|
+
if (oauthEnabled) {
|
|
158
|
+
const cfg = getOAuthConfig();
|
|
159
|
+
fastify.get("/.well-known/oauth-authorization-server", handleAuthorizationServerMetadata);
|
|
160
|
+
fastify.get("/.well-known/oauth-protected-resource", handleProtectedResourceMetadata);
|
|
161
|
+
fastify.get("/oauth/authorize", handleAuthorize);
|
|
162
|
+
fastify.post("/oauth/token", handleToken);
|
|
163
|
+
fastify.get("/userinfo", handleUserInfo);
|
|
164
|
+
fastify.get("/google/callback", handleGoogleCallback);
|
|
165
|
+
log(`OAuth endpoints enabled (issuer: ${cfg.MCP_BASE_URL})`);
|
|
166
|
+
}
|
|
167
|
+
// ── MCP endpoint ─────────────────────────────────────────────────────────
|
|
168
|
+
fastify.all("/mcp", async (request, reply) => {
|
|
169
|
+
// Hand off raw req/res to the MCP transport; Fastify must not touch the response.
|
|
170
|
+
reply.hijack();
|
|
171
|
+
const req = request.raw;
|
|
172
|
+
const res = reply.raw;
|
|
173
|
+
try {
|
|
174
|
+
switch (req.method) {
|
|
175
|
+
case "POST":
|
|
176
|
+
await handleMcpPost(req, res, request.headers.authorization);
|
|
177
|
+
break;
|
|
178
|
+
case "GET":
|
|
179
|
+
case "DELETE":
|
|
180
|
+
await handleMcpGetDelete(req, res);
|
|
181
|
+
break;
|
|
182
|
+
default:
|
|
183
|
+
res.writeHead(405, { "Content-Type": "application/json" });
|
|
184
|
+
res.end(JSON.stringify({ error: "Method not allowed" }));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
log("MCP handler error:", err);
|
|
189
|
+
if (!res.headersSent) {
|
|
190
|
+
res.writeHead(500, { "Content-Type": "application/json" });
|
|
191
|
+
res.end(JSON.stringify({ error: "Internal server error" }));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
// ── 404 fallback ─────────────────────────────────────────────────────────
|
|
196
|
+
fastify.setNotFoundHandler(async (_, reply) => {
|
|
197
|
+
return reply.status(404).send({ error: "Not found" });
|
|
198
|
+
});
|
|
199
|
+
await fastify.listen({ port, host: "0.0.0.0" });
|
|
200
|
+
log(`FleetX MCP Server listening on http://0.0.0.0:${port}`);
|
|
201
|
+
log(` MCP endpoint : http://localhost:${port}/mcp`);
|
|
202
|
+
if (oauthEnabled) {
|
|
203
|
+
const cfg = getOAuthConfig();
|
|
204
|
+
log(` Authorize : ${cfg.MCP_BASE_URL}/oauth/authorize`);
|
|
205
|
+
log(` Token : ${cfg.MCP_BASE_URL}/oauth/token`);
|
|
206
|
+
log(` Discovery : ${cfg.MCP_BASE_URL}/.well-known/oauth-authorization-server`);
|
|
207
|
+
}
|
|
208
|
+
process.on("SIGINT", async () => {
|
|
209
|
+
log("Shutting down…");
|
|
210
|
+
for (const [id, transport] of transports) {
|
|
211
|
+
try {
|
|
212
|
+
await transport.close();
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
/* best-effort */
|
|
216
|
+
}
|
|
217
|
+
transports.delete(id);
|
|
218
|
+
}
|
|
219
|
+
await fastify.close();
|
|
220
|
+
process.exit(0);
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=fastify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify.js","sourceRoot":"","sources":["../../src/transports/fastify.ts"],"names":[],"mappings":"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"}
|
package/dist/transports/sse.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function
|
|
1
|
+
export declare function startSSE(): Promise<void>;
|
|
2
2
|
//# sourceMappingURL=sse.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/transports/sse.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/transports/sse.ts"],"names":[],"mappings":"AA6MA,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CA+F9C"}
|