rivet-design 0.10.7 → 0.10.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +54 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +302 -129
- package/dist/index.js.map +1 -1
- package/dist/mcp/agent-variants/SessionStore.d.ts +23 -1
- package/dist/mcp/agent-variants/SessionStore.d.ts.map +1 -1
- package/dist/mcp/agent-variants/SessionStore.js +42 -0
- package/dist/mcp/agent-variants/SessionStore.js.map +1 -1
- package/dist/mcp/agent-variants/WorktreeOrchestrator.d.ts +99 -2
- package/dist/mcp/agent-variants/WorktreeOrchestrator.d.ts.map +1 -1
- package/dist/mcp/agent-variants/WorktreeOrchestrator.js +734 -74
- package/dist/mcp/agent-variants/WorktreeOrchestrator.js.map +1 -1
- package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.d.ts +8 -2
- package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.d.ts.map +1 -1
- package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.js +24 -5
- package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.js.map +1 -1
- package/dist/mcp/agent-variants/contracts.d.ts +1175 -233
- package/dist/mcp/agent-variants/contracts.d.ts.map +1 -1
- package/dist/mcp/agent-variants/contracts.js +12 -4
- package/dist/mcp/agent-variants/contracts.js.map +1 -1
- package/dist/mcp/agent-variants/designCritique.d.ts +163 -0
- package/dist/mcp/agent-variants/designCritique.d.ts.map +1 -0
- package/dist/mcp/agent-variants/designCritique.js +710 -0
- package/dist/mcp/agent-variants/designCritique.js.map +1 -0
- package/dist/mcp/agent-variants/diffQa.d.ts +7 -0
- package/dist/mcp/agent-variants/diffQa.d.ts.map +1 -0
- package/dist/mcp/agent-variants/diffQa.js +67 -0
- package/dist/mcp/agent-variants/diffQa.js.map +1 -0
- package/dist/mcp/agent-variants/index.d.ts +2 -2
- package/dist/mcp/agent-variants/index.d.ts.map +1 -1
- package/dist/mcp/agent-variants/index.js +2 -1
- package/dist/mcp/agent-variants/index.js.map +1 -1
- package/dist/mcp/agent-variants/pinterestSourceContext.d.ts.map +1 -1
- package/dist/mcp/agent-variants/pinterestSourceContext.js +11 -1
- package/dist/mcp/agent-variants/pinterestSourceContext.js.map +1 -1
- package/dist/mcp/agent-variants/previewQa.d.ts.map +1 -1
- package/dist/mcp/agent-variants/previewQa.js +7 -0
- package/dist/mcp/agent-variants/previewQa.js.map +1 -1
- package/dist/mcp/agent-variants/tools.d.ts.map +1 -1
- package/dist/mcp/agent-variants/tools.js +15 -5
- package/dist/mcp/agent-variants/tools.js.map +1 -1
- package/dist/mcp/auth/httpOAuthProvider.d.ts +103 -0
- package/dist/mcp/auth/httpOAuthProvider.d.ts.map +1 -0
- package/dist/mcp/auth/httpOAuthProvider.js +454 -0
- package/dist/mcp/auth/httpOAuthProvider.js.map +1 -0
- package/dist/mcp/auth/tools.d.ts +2 -0
- package/dist/mcp/auth/tools.d.ts.map +1 -1
- package/dist/mcp/auth/tools.js +12 -5
- package/dist/mcp/auth/tools.js.map +1 -1
- package/dist/mcp/httpServer.d.ts +36 -0
- package/dist/mcp/httpServer.d.ts.map +1 -0
- package/dist/mcp/httpServer.js +307 -0
- package/dist/mcp/httpServer.js.map +1 -0
- package/dist/mcp/server.d.ts +17 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +50 -29
- package/dist/mcp/server.js.map +1 -1
- package/dist/proxy-middleware/proxy-config.d.ts.map +1 -1
- package/dist/proxy-middleware/proxy-config.js +5 -2
- package/dist/proxy-middleware/proxy-config.js.map +1 -1
- package/dist/routes/agentVariants.d.ts +2 -1
- package/dist/routes/agentVariants.d.ts.map +1 -1
- package/dist/routes/agentVariants.js +268 -19
- package/dist/routes/agentVariants.js.map +1 -1
- package/dist/routes/design.d.ts.map +1 -1
- package/dist/routes/design.js +0 -122
- package/dist/routes/design.js.map +1 -1
- package/dist/routes/mcp.d.ts.map +1 -1
- package/dist/routes/mcp.js +2 -1
- package/dist/routes/mcp.js.map +1 -1
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +24 -11
- package/dist/server.js.map +1 -1
- package/dist/services/AgentSessionService.d.ts +5 -1
- package/dist/services/AgentSessionService.d.ts.map +1 -1
- package/dist/services/AgentSessionService.js +11 -4
- package/dist/services/AgentSessionService.js.map +1 -1
- package/dist/services/AuthService.d.ts +1 -0
- package/dist/services/AuthService.d.ts.map +1 -1
- package/dist/services/AuthService.js +11 -1
- package/dist/services/AuthService.js.map +1 -1
- package/dist/services/ConfigManager.d.ts +5 -0
- package/dist/services/ConfigManager.d.ts.map +1 -1
- package/dist/services/ConfigManager.js +25 -3
- package/dist/services/ConfigManager.js.map +1 -1
- package/dist/services/DevServerRuntimeService.d.ts +119 -0
- package/dist/services/DevServerRuntimeService.d.ts.map +1 -0
- package/dist/services/DevServerRuntimeService.js +657 -0
- package/dist/services/DevServerRuntimeService.js.map +1 -0
- package/dist/services/GatewayClient.d.ts +25 -0
- package/dist/services/GatewayClient.d.ts.map +1 -1
- package/dist/services/GatewayClient.js +70 -11
- package/dist/services/GatewayClient.js.map +1 -1
- package/dist/services/InlineVariantGenerationService.d.ts +2 -3
- package/dist/services/InlineVariantGenerationService.d.ts.map +1 -1
- package/dist/services/InlineVariantGenerationService.js +7 -5
- package/dist/services/InlineVariantGenerationService.js.map +1 -1
- package/dist/services/IntegrationsClient.d.ts +20 -0
- package/dist/services/IntegrationsClient.d.ts.map +1 -1
- package/dist/services/IntegrationsClient.js +82 -24
- package/dist/services/IntegrationsClient.js.map +1 -1
- package/dist/services/RequestAuthContext.d.ts +7 -1
- package/dist/services/RequestAuthContext.d.ts.map +1 -1
- package/dist/services/RequestAuthContext.js +15 -2
- package/dist/services/RequestAuthContext.js.map +1 -1
- package/dist/services/SessionBridgeService.d.ts +1 -0
- package/dist/services/SessionBridgeService.d.ts.map +1 -1
- package/dist/services/SessionBridgeService.js +16 -1
- package/dist/services/SessionBridgeService.js.map +1 -1
- package/dist/services/TelemetryService.d.ts +2 -0
- package/dist/services/TelemetryService.d.ts.map +1 -1
- package/dist/services/TelemetryService.js +2 -0
- package/dist/services/TelemetryService.js.map +1 -1
- package/dist/services/VariantHistoryService.d.ts +8 -0
- package/dist/services/VariantHistoryService.d.ts.map +1 -1
- package/dist/services/VariantHistoryService.js +23 -0
- package/dist/services/VariantHistoryService.js.map +1 -1
- package/dist/services/VariantRunService.d.ts +56 -0
- package/dist/services/VariantRunService.d.ts.map +1 -0
- package/dist/services/VariantRunService.js +56 -0
- package/dist/services/VariantRunService.js.map +1 -0
- package/dist/services/VariantsRuntime.d.ts +22 -0
- package/dist/services/VariantsRuntime.d.ts.map +1 -0
- package/dist/services/VariantsRuntime.js +32 -0
- package/dist/services/VariantsRuntime.js.map +1 -0
- package/dist/services/VisualVariantAgentRunner.d.ts +20 -0
- package/dist/services/VisualVariantAgentRunner.d.ts.map +1 -0
- package/dist/services/VisualVariantAgentRunner.js +66 -0
- package/dist/services/VisualVariantAgentRunner.js.map +1 -0
- package/dist/services/WorktreeManager.d.ts +34 -0
- package/dist/services/WorktreeManager.d.ts.map +1 -1
- package/dist/services/WorktreeManager.js +172 -23
- package/dist/services/WorktreeManager.js.map +1 -1
- package/dist/services/createAgentVariantsOrchestrator.d.ts.map +1 -1
- package/dist/services/createAgentVariantsOrchestrator.js +9 -0
- package/dist/services/createAgentVariantsOrchestrator.js.map +1 -1
- package/dist/utils/devServerCommand.d.ts +11 -4
- package/dist/utils/devServerCommand.d.ts.map +1 -1
- package/dist/utils/devServerCommand.js +17 -8
- package/dist/utils/devServerCommand.js.map +1 -1
- package/dist/utils/devServerError.d.ts +34 -0
- package/dist/utils/devServerError.d.ts.map +1 -0
- package/dist/utils/devServerError.js +39 -0
- package/dist/utils/devServerError.js.map +1 -0
- package/dist/utils/elementRefToContext.d.ts +4 -0
- package/dist/utils/elementRefToContext.d.ts.map +1 -0
- package/dist/utils/elementRefToContext.js +63 -0
- package/dist/utils/elementRefToContext.js.map +1 -0
- package/dist/utils/skills/shared-variants-protocol.d.ts.map +1 -1
- package/dist/utils/skills/shared-variants-protocol.js +5 -2
- package/dist/utils/skills/shared-variants-protocol.js.map +1 -1
- package/dist/utils/variantSessionStart.d.ts +3 -0
- package/dist/utils/variantSessionStart.d.ts.map +1 -0
- package/dist/utils/variantSessionStart.js +7 -0
- package/dist/utils/variantSessionStart.js.map +1 -0
- package/package.json +3 -1
- package/src/ui/dist/assets/main-Cwwhwfjq.js +645 -0
- package/src/ui/dist/assets/main-Do6whVIm.css +1 -0
- package/src/ui/dist/index.html +2 -2
- package/dist/services/CommentVariationService.d.ts +0 -34
- package/dist/services/CommentVariationService.d.ts.map +0 -1
- package/dist/services/CommentVariationService.js +0 -136
- package/dist/services/CommentVariationService.js.map +0 -1
- package/dist/services/VariantCodeGeneratorService.d.ts +0 -39
- package/dist/services/VariantCodeGeneratorService.d.ts.map +0 -1
- package/dist/services/VariantCodeGeneratorService.js +0 -109
- package/dist/services/VariantCodeGeneratorService.js.map +0 -1
- package/src/ui/dist/assets/main-DUIrSkV3.css +0 -1
- package/src/ui/dist/assets/main-DYpxGvCu.js +0 -646
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { Response } from 'express';
|
|
2
|
+
import type { OAuthServerProvider, AuthorizationParams } from '@modelcontextprotocol/sdk/server/auth/provider.js';
|
|
3
|
+
import type { OAuthRegisteredClientsStore } from '@modelcontextprotocol/sdk/server/auth/clients.js';
|
|
4
|
+
import type { OAuthClientInformationFull, OAuthTokens } from '@modelcontextprotocol/sdk/shared/auth.js';
|
|
5
|
+
import type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';
|
|
6
|
+
/** Rivet credentials issued by the proxy after a completed browser login. */
|
|
7
|
+
export type PersistedRivetTokens = {
|
|
8
|
+
token: string;
|
|
9
|
+
refreshToken?: string;
|
|
10
|
+
user?: {
|
|
11
|
+
id: string;
|
|
12
|
+
email: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
export type RivetOAuthProviderOptions = {
|
|
16
|
+
/** Base URL of the Rivet proxy (auth backend), e.g. https://rivet-proxy.onrender.com */
|
|
17
|
+
proxyUrl: string;
|
|
18
|
+
/**
|
|
19
|
+
* Public URL of the local OAuth browser callback page. Must be a bare
|
|
20
|
+
* localhost origin (no path) — the proxy rejects custom redirect paths.
|
|
21
|
+
*/
|
|
22
|
+
callbackUrl: string;
|
|
23
|
+
/** The MCP client (`--editor`), recorded with the login for analytics. */
|
|
24
|
+
mcpEditor?: string;
|
|
25
|
+
/** Persists tokens locally after login (e.g. ConfigManager.setAuth). */
|
|
26
|
+
persistTokens?: (tokens: PersistedRivetTokens) => void;
|
|
27
|
+
/** Confirms a refresh token is still accepted by durable local auth state. */
|
|
28
|
+
isRefreshTokenCurrent?: (refreshToken: string) => boolean;
|
|
29
|
+
fetchImpl?: typeof fetch;
|
|
30
|
+
/** Test override for the proxy token polling interval. */
|
|
31
|
+
pollIntervalMs?: number;
|
|
32
|
+
};
|
|
33
|
+
/** In-memory dynamic client registration store (clients are ephemeral). */
|
|
34
|
+
declare class InMemoryClientsStore implements OAuthRegisteredClientsStore {
|
|
35
|
+
private clients;
|
|
36
|
+
getClient(clientId: string): OAuthClientInformationFull | undefined;
|
|
37
|
+
registerClient(client: Omit<OAuthClientInformationFull, 'client_id' | 'client_id_issued_at'> & Partial<Pick<OAuthClientInformationFull, 'client_id' | 'client_id_issued_at'>>): OAuthClientInformationFull;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* OAuth authorization server provider that bridges the MCP OAuth spec
|
|
41
|
+
* (authorization code + PKCE, dynamic client registration) onto the existing
|
|
42
|
+
* Rivet proxy Google login flow:
|
|
43
|
+
*
|
|
44
|
+
* 1. `authorize` starts a proxy Google login with this server's local
|
|
45
|
+
* callback page as the redirect origin and sends the browser to Google.
|
|
46
|
+
* 2. The browser returns to the local callback page, which forwards the
|
|
47
|
+
* Supabase hash tokens to `completeBrowserCallback`. That completes the
|
|
48
|
+
* proxy login, obtains the Rivet access token, and mints a single-use
|
|
49
|
+
* authorization code bound to the client's PKCE challenge.
|
|
50
|
+
* 3. `exchangeAuthorizationCode` returns the Rivet access token as the OAuth
|
|
51
|
+
* access token; `verifyAccessToken` validates bearer tokens against the
|
|
52
|
+
* proxy profile endpoint.
|
|
53
|
+
*/
|
|
54
|
+
export declare class RivetOAuthServerProvider implements OAuthServerProvider {
|
|
55
|
+
readonly clientsStore: InMemoryClientsStore;
|
|
56
|
+
private readonly proxyUrl;
|
|
57
|
+
private readonly callbackUrl;
|
|
58
|
+
private readonly mcpEditor?;
|
|
59
|
+
private readonly persistTokens?;
|
|
60
|
+
private readonly isRefreshTokenCurrent?;
|
|
61
|
+
private readonly fetchFn;
|
|
62
|
+
private readonly pollIntervalMs;
|
|
63
|
+
private readonly pendingAuthorizations;
|
|
64
|
+
private readonly authorizationCodes;
|
|
65
|
+
private readonly issuedBearerTokens;
|
|
66
|
+
private readonly verifiedTokens;
|
|
67
|
+
private readonly revokedAccessTokens;
|
|
68
|
+
private readonly revokedRefreshTokens;
|
|
69
|
+
private readonly activeRefreshTokens;
|
|
70
|
+
constructor(options: RivetOAuthProviderOptions);
|
|
71
|
+
authorize(client: OAuthClientInformationFull, params: AuthorizationParams, res: Response): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Completes a browser login forwarded by the local OAuth callback page:
|
|
74
|
+
* finishes the proxy login session, obtains Rivet credentials, mints a
|
|
75
|
+
* single-use authorization code, and returns the MCP client redirect URL.
|
|
76
|
+
*/
|
|
77
|
+
completeBrowserCallback(input: {
|
|
78
|
+
sessionId?: string;
|
|
79
|
+
accessToken?: string;
|
|
80
|
+
refreshToken?: string;
|
|
81
|
+
}): Promise<{
|
|
82
|
+
redirectUrl: string;
|
|
83
|
+
}>;
|
|
84
|
+
challengeForAuthorizationCode(client: OAuthClientInformationFull, authorizationCode: string): Promise<string>;
|
|
85
|
+
exchangeAuthorizationCode(client: OAuthClientInformationFull, authorizationCode: string, _codeVerifier?: string, redirectUri?: string): Promise<OAuthTokens>;
|
|
86
|
+
exchangeRefreshToken(_client: OAuthClientInformationFull, refreshToken: string): Promise<OAuthTokens>;
|
|
87
|
+
verifyAccessToken(token: string): Promise<AuthInfo>;
|
|
88
|
+
/**
|
|
89
|
+
* Invalidates a bearer token issued by this OAuth provider and its paired
|
|
90
|
+
* refresh token, if the provider knows one.
|
|
91
|
+
*/
|
|
92
|
+
revokeAccessToken(token: string): void;
|
|
93
|
+
private rememberIssuedBearerToken;
|
|
94
|
+
private getValidCodeEntry;
|
|
95
|
+
private toOAuthTokens;
|
|
96
|
+
private pollForRivetTokens;
|
|
97
|
+
private prunePendingAuthorizations;
|
|
98
|
+
private pruneAuthorizationCodes;
|
|
99
|
+
private pruneVerifiedTokens;
|
|
100
|
+
private pruneIssuedBearerTokens;
|
|
101
|
+
}
|
|
102
|
+
export {};
|
|
103
|
+
//# sourceMappingURL=httpOAuthProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpOAuthProvider.d.ts","sourceRoot":"","sources":["../../../src/mcp/auth/httpOAuthProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,454 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RivetOAuthServerProvider = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const errors_js_1 = require("@modelcontextprotocol/sdk/server/auth/errors.js");
|
|
6
|
+
const accessTokenRefresh_1 = require("../../services/accessTokenRefresh");
|
|
7
|
+
const telemetry_1 = require("../../config/telemetry");
|
|
8
|
+
const logger_1 = require("../../utils/logger");
|
|
9
|
+
const log = (0, logger_1.createLogger)('mcp-http-oauth');
|
|
10
|
+
const AUTH_CODE_TTL_MS = 10 * 60_000;
|
|
11
|
+
const PENDING_AUTH_TTL_MS = 10 * 60_000;
|
|
12
|
+
const TOKEN_VERIFY_CACHE_TTL_MS = 60_000;
|
|
13
|
+
const DEFAULT_TOKEN_TTL_SECONDS = 3600;
|
|
14
|
+
const TOKEN_POLL_MAX_ATTEMPTS = 120;
|
|
15
|
+
const TOKEN_POLL_INTERVAL_MS = 1000;
|
|
16
|
+
const PROFILE_FETCH_TIMEOUT_MS = 10_000;
|
|
17
|
+
const MCP_OAUTH_SCOPE = 'rivet';
|
|
18
|
+
const HOSTED_DASHBOARD_AUTH_URL = 'https://rivet-proxy.onrender.com/dashboard/';
|
|
19
|
+
const LOOPBACK_REDIRECT_HOSTS = new Set([
|
|
20
|
+
'localhost',
|
|
21
|
+
'127.0.0.1',
|
|
22
|
+
'::1',
|
|
23
|
+
'[::1]',
|
|
24
|
+
]);
|
|
25
|
+
/** In-memory dynamic client registration store (clients are ephemeral). */
|
|
26
|
+
class InMemoryClientsStore {
|
|
27
|
+
clients = new Map();
|
|
28
|
+
getClient(clientId) {
|
|
29
|
+
return this.clients.get(clientId);
|
|
30
|
+
}
|
|
31
|
+
registerClient(client) {
|
|
32
|
+
if (!client.redirect_uris.every(isLoopbackRedirectUri)) {
|
|
33
|
+
throw new errors_js_1.InvalidClientMetadataError('Rivet MCP OAuth clients must use loopback HTTP redirect URIs.');
|
|
34
|
+
}
|
|
35
|
+
const registered = {
|
|
36
|
+
...client,
|
|
37
|
+
client_id: client.client_id ?? (0, crypto_1.randomUUID)(),
|
|
38
|
+
client_id_issued_at: client.client_id_issued_at ?? Math.floor(Date.now() / 1000),
|
|
39
|
+
};
|
|
40
|
+
this.clients.set(registered.client_id, registered);
|
|
41
|
+
return registered;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const isLoopbackRedirectUri = (redirectUri) => {
|
|
45
|
+
try {
|
|
46
|
+
const url = new URL(redirectUri);
|
|
47
|
+
return (url.protocol === 'http:' && LOOPBACK_REDIRECT_HOSTS.has(url.hostname));
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
54
|
+
const escapeHtml = (value) => value
|
|
55
|
+
.replace(/&/g, '&')
|
|
56
|
+
.replace(/</g, '<')
|
|
57
|
+
.replace(/>/g, '>')
|
|
58
|
+
.replace(/"/g, '"')
|
|
59
|
+
.replace(/'/g, ''');
|
|
60
|
+
/**
|
|
61
|
+
* Shows the browser user which local OAuth client will receive the code before
|
|
62
|
+
* starting Google sign-in.
|
|
63
|
+
*/
|
|
64
|
+
const getClientApprovalHtml = (input) => {
|
|
65
|
+
const clientName = input.clientName?.trim() || 'Unknown MCP client';
|
|
66
|
+
return `<!doctype html>
|
|
67
|
+
<html>
|
|
68
|
+
<head>
|
|
69
|
+
<meta charset="utf-8" />
|
|
70
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
71
|
+
<title>Approve Rivet MCP sign in</title>
|
|
72
|
+
<style>
|
|
73
|
+
body {
|
|
74
|
+
margin: 0;
|
|
75
|
+
min-height: 100vh;
|
|
76
|
+
display: grid;
|
|
77
|
+
place-items: center;
|
|
78
|
+
font-family: system-ui, sans-serif;
|
|
79
|
+
background: #0b0b0f;
|
|
80
|
+
color: #fff;
|
|
81
|
+
}
|
|
82
|
+
main {
|
|
83
|
+
max-width: 480px;
|
|
84
|
+
padding: 32px;
|
|
85
|
+
}
|
|
86
|
+
code {
|
|
87
|
+
word-break: break-all;
|
|
88
|
+
}
|
|
89
|
+
a {
|
|
90
|
+
display: inline-block;
|
|
91
|
+
margin-top: 20px;
|
|
92
|
+
padding: 10px 14px;
|
|
93
|
+
border-radius: 8px;
|
|
94
|
+
background: #fff;
|
|
95
|
+
color: #0b0b0f;
|
|
96
|
+
text-decoration: none;
|
|
97
|
+
font-weight: 600;
|
|
98
|
+
}
|
|
99
|
+
</style>
|
|
100
|
+
</head>
|
|
101
|
+
<body>
|
|
102
|
+
<main>
|
|
103
|
+
<h1>Approve Rivet MCP sign in</h1>
|
|
104
|
+
<p><strong>${escapeHtml(clientName)}</strong> wants to connect to Rivet.</p>
|
|
105
|
+
<p>After sign-in, Rivet will return an OAuth code to:</p>
|
|
106
|
+
<p><code>${escapeHtml(input.redirectUri)}</code></p>
|
|
107
|
+
<a href="${escapeHtml(input.authUrl)}">Continue to Rivet sign in</a>
|
|
108
|
+
</main>
|
|
109
|
+
</body>
|
|
110
|
+
</html>`;
|
|
111
|
+
};
|
|
112
|
+
const getTokenExpiryMs = (token) => {
|
|
113
|
+
const secondsUntilExpiry = (0, accessTokenRefresh_1.getJwtSecondsUntilExpiry)(token) ?? DEFAULT_TOKEN_TTL_SECONDS;
|
|
114
|
+
return Date.now() + Math.max(secondsUntilExpiry, 1) * 1000;
|
|
115
|
+
};
|
|
116
|
+
const normalizeProfileUser = (user) => {
|
|
117
|
+
if (typeof user?.id !== 'string' || typeof user.email !== 'string') {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
return { id: user.id, email: user.email };
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* OAuth authorization server provider that bridges the MCP OAuth spec
|
|
124
|
+
* (authorization code + PKCE, dynamic client registration) onto the existing
|
|
125
|
+
* Rivet proxy Google login flow:
|
|
126
|
+
*
|
|
127
|
+
* 1. `authorize` starts a proxy Google login with this server's local
|
|
128
|
+
* callback page as the redirect origin and sends the browser to Google.
|
|
129
|
+
* 2. The browser returns to the local callback page, which forwards the
|
|
130
|
+
* Supabase hash tokens to `completeBrowserCallback`. That completes the
|
|
131
|
+
* proxy login, obtains the Rivet access token, and mints a single-use
|
|
132
|
+
* authorization code bound to the client's PKCE challenge.
|
|
133
|
+
* 3. `exchangeAuthorizationCode` returns the Rivet access token as the OAuth
|
|
134
|
+
* access token; `verifyAccessToken` validates bearer tokens against the
|
|
135
|
+
* proxy profile endpoint.
|
|
136
|
+
*/
|
|
137
|
+
class RivetOAuthServerProvider {
|
|
138
|
+
clientsStore = new InMemoryClientsStore();
|
|
139
|
+
proxyUrl;
|
|
140
|
+
callbackUrl;
|
|
141
|
+
mcpEditor;
|
|
142
|
+
persistTokens;
|
|
143
|
+
isRefreshTokenCurrent;
|
|
144
|
+
fetchFn;
|
|
145
|
+
pollIntervalMs;
|
|
146
|
+
pendingAuthorizations = new Map();
|
|
147
|
+
authorizationCodes = new Map();
|
|
148
|
+
issuedBearerTokens = new Map();
|
|
149
|
+
verifiedTokens = new Map();
|
|
150
|
+
revokedAccessTokens = new Set();
|
|
151
|
+
revokedRefreshTokens = new Set();
|
|
152
|
+
activeRefreshTokens = new Set();
|
|
153
|
+
constructor(options) {
|
|
154
|
+
this.proxyUrl = options.proxyUrl.replace(/\/$/, '');
|
|
155
|
+
this.callbackUrl = options.callbackUrl;
|
|
156
|
+
this.mcpEditor = options.mcpEditor;
|
|
157
|
+
this.persistTokens = options.persistTokens;
|
|
158
|
+
this.isRefreshTokenCurrent = options.isRefreshTokenCurrent;
|
|
159
|
+
this.fetchFn = options.fetchImpl ?? fetch;
|
|
160
|
+
this.pollIntervalMs = options.pollIntervalMs ?? TOKEN_POLL_INTERVAL_MS;
|
|
161
|
+
}
|
|
162
|
+
async authorize(client, params, res) {
|
|
163
|
+
const response = await this.fetchFn(`${this.proxyUrl}/api/auth/google/start`, {
|
|
164
|
+
method: 'POST',
|
|
165
|
+
headers: { 'Content-Type': 'application/json' },
|
|
166
|
+
body: JSON.stringify({
|
|
167
|
+
redirectOrigin: this.callbackUrl,
|
|
168
|
+
authDestination: HOSTED_DASHBOARD_AUTH_URL,
|
|
169
|
+
source: 'mcp',
|
|
170
|
+
editor: this.mcpEditor,
|
|
171
|
+
version: telemetry_1.RIVET_VERSION,
|
|
172
|
+
}),
|
|
173
|
+
});
|
|
174
|
+
const result = (await response.json().catch(() => null));
|
|
175
|
+
if (!response.ok ||
|
|
176
|
+
!result?.success ||
|
|
177
|
+
!result.authUrl ||
|
|
178
|
+
!result.sessionId ||
|
|
179
|
+
!result.pollSecret ||
|
|
180
|
+
!result.completionSecret) {
|
|
181
|
+
log.warn('Proxy login start failed', { status: response.status });
|
|
182
|
+
throw new errors_js_1.ServerError('Failed to start Rivet sign-in');
|
|
183
|
+
}
|
|
184
|
+
this.prunePendingAuthorizations();
|
|
185
|
+
this.pendingAuthorizations.set(result.sessionId, {
|
|
186
|
+
client,
|
|
187
|
+
params,
|
|
188
|
+
pollSecret: result.pollSecret,
|
|
189
|
+
completionSecret: result.completionSecret,
|
|
190
|
+
expiresAt: Date.now() + PENDING_AUTH_TTL_MS,
|
|
191
|
+
});
|
|
192
|
+
res.status(200).type('html').send(getClientApprovalHtml({
|
|
193
|
+
authUrl: result.authUrl,
|
|
194
|
+
clientName: client.client_name,
|
|
195
|
+
redirectUri: params.redirectUri,
|
|
196
|
+
}));
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Completes a browser login forwarded by the local OAuth callback page:
|
|
200
|
+
* finishes the proxy login session, obtains Rivet credentials, mints a
|
|
201
|
+
* single-use authorization code, and returns the MCP client redirect URL.
|
|
202
|
+
*/
|
|
203
|
+
async completeBrowserCallback(input) {
|
|
204
|
+
const { sessionId, accessToken, refreshToken } = input;
|
|
205
|
+
if (!sessionId || !accessToken) {
|
|
206
|
+
throw new Error('OAuth callback missing session or token');
|
|
207
|
+
}
|
|
208
|
+
const pending = this.pendingAuthorizations.get(sessionId);
|
|
209
|
+
this.pendingAuthorizations.delete(sessionId);
|
|
210
|
+
if (!pending || pending.expiresAt < Date.now()) {
|
|
211
|
+
throw new Error('Unknown or expired sign-in session');
|
|
212
|
+
}
|
|
213
|
+
const completeResponse = await this.fetchFn(`${this.proxyUrl}/api/auth/google/complete`, {
|
|
214
|
+
method: 'POST',
|
|
215
|
+
headers: { 'Content-Type': 'application/json' },
|
|
216
|
+
body: JSON.stringify({
|
|
217
|
+
sessionId,
|
|
218
|
+
accessToken,
|
|
219
|
+
refreshToken,
|
|
220
|
+
completionSecret: pending.completionSecret,
|
|
221
|
+
}),
|
|
222
|
+
});
|
|
223
|
+
const completeResult = (await completeResponse.json().catch(() => null));
|
|
224
|
+
if (!completeResponse.ok || !completeResult?.success) {
|
|
225
|
+
throw new Error(completeResult?.error ?? 'Rivet sign-in completion failed');
|
|
226
|
+
}
|
|
227
|
+
const tokens = await this.pollForRivetTokens(sessionId, pending.pollSecret);
|
|
228
|
+
try {
|
|
229
|
+
this.persistTokens?.(tokens);
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
log.warn('Failed to persist Rivet tokens after MCP OAuth login:', error);
|
|
233
|
+
}
|
|
234
|
+
const code = (0, crypto_1.randomBytes)(32).toString('base64url');
|
|
235
|
+
this.pruneAuthorizationCodes();
|
|
236
|
+
this.authorizationCodes.set(code, {
|
|
237
|
+
clientId: pending.client.client_id,
|
|
238
|
+
codeChallenge: pending.params.codeChallenge,
|
|
239
|
+
redirectUri: pending.params.redirectUri,
|
|
240
|
+
accessToken: tokens.token,
|
|
241
|
+
refreshToken: tokens.refreshToken,
|
|
242
|
+
user: tokens.user,
|
|
243
|
+
expiresAt: Date.now() + AUTH_CODE_TTL_MS,
|
|
244
|
+
});
|
|
245
|
+
const redirectUrl = new URL(pending.params.redirectUri);
|
|
246
|
+
redirectUrl.searchParams.set('code', code);
|
|
247
|
+
if (pending.params.state) {
|
|
248
|
+
redirectUrl.searchParams.set('state', pending.params.state);
|
|
249
|
+
}
|
|
250
|
+
return { redirectUrl: redirectUrl.toString() };
|
|
251
|
+
}
|
|
252
|
+
async challengeForAuthorizationCode(client, authorizationCode) {
|
|
253
|
+
const entry = this.getValidCodeEntry(client, authorizationCode);
|
|
254
|
+
return entry.codeChallenge;
|
|
255
|
+
}
|
|
256
|
+
async exchangeAuthorizationCode(client, authorizationCode, _codeVerifier, redirectUri) {
|
|
257
|
+
const entry = this.getValidCodeEntry(client, authorizationCode);
|
|
258
|
+
if (redirectUri && entry.redirectUri !== redirectUri) {
|
|
259
|
+
throw new errors_js_1.InvalidGrantError('redirect_uri does not match');
|
|
260
|
+
}
|
|
261
|
+
this.authorizationCodes.delete(authorizationCode);
|
|
262
|
+
this.rememberIssuedBearerToken({
|
|
263
|
+
token: entry.accessToken,
|
|
264
|
+
refreshToken: entry.refreshToken,
|
|
265
|
+
user: entry.user,
|
|
266
|
+
});
|
|
267
|
+
return this.toOAuthTokens(entry.accessToken, entry.refreshToken);
|
|
268
|
+
}
|
|
269
|
+
async exchangeRefreshToken(_client, refreshToken) {
|
|
270
|
+
if (this.revokedRefreshTokens.has(refreshToken) ||
|
|
271
|
+
!this.activeRefreshTokens.has(refreshToken) ||
|
|
272
|
+
this.isRefreshTokenCurrent?.(refreshToken) === false) {
|
|
273
|
+
throw new errors_js_1.InvalidGrantError('Refresh token was revoked');
|
|
274
|
+
}
|
|
275
|
+
const refreshed = await (0, accessTokenRefresh_1.refreshAccessTokenViaProxy)({
|
|
276
|
+
refreshToken,
|
|
277
|
+
proxyUrl: this.proxyUrl,
|
|
278
|
+
fetchImpl: this.fetchFn,
|
|
279
|
+
});
|
|
280
|
+
if (!refreshed) {
|
|
281
|
+
throw new errors_js_1.InvalidGrantError('Refresh token was rejected');
|
|
282
|
+
}
|
|
283
|
+
const nextRefreshToken = refreshed.refreshToken ?? refreshToken;
|
|
284
|
+
try {
|
|
285
|
+
this.persistTokens?.({
|
|
286
|
+
token: refreshed.token,
|
|
287
|
+
refreshToken: nextRefreshToken,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
log.warn('Failed to persist refreshed Rivet tokens:', error);
|
|
292
|
+
}
|
|
293
|
+
this.activeRefreshTokens.delete(refreshToken);
|
|
294
|
+
this.rememberIssuedBearerToken({
|
|
295
|
+
token: refreshed.token,
|
|
296
|
+
refreshToken: nextRefreshToken,
|
|
297
|
+
});
|
|
298
|
+
return this.toOAuthTokens(refreshed.token, nextRefreshToken);
|
|
299
|
+
}
|
|
300
|
+
async verifyAccessToken(token) {
|
|
301
|
+
if (this.revokedAccessTokens.has(token)) {
|
|
302
|
+
this.verifiedTokens.delete(token);
|
|
303
|
+
throw new errors_js_1.InvalidTokenError('Access token was revoked');
|
|
304
|
+
}
|
|
305
|
+
const cached = this.verifiedTokens.get(token);
|
|
306
|
+
if (cached && cached.cachedUntil > Date.now()) {
|
|
307
|
+
return cached.authInfo;
|
|
308
|
+
}
|
|
309
|
+
let response;
|
|
310
|
+
try {
|
|
311
|
+
response = await this.fetchFn(`${this.proxyUrl}/api/user/profile`, {
|
|
312
|
+
method: 'GET',
|
|
313
|
+
headers: {
|
|
314
|
+
'Content-Type': 'application/json',
|
|
315
|
+
Authorization: `Bearer ${token}`,
|
|
316
|
+
},
|
|
317
|
+
signal: AbortSignal.timeout(PROFILE_FETCH_TIMEOUT_MS),
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
log.warn('Token verification request failed:', error);
|
|
322
|
+
throw new errors_js_1.ServerError('Could not reach the Rivet auth server');
|
|
323
|
+
}
|
|
324
|
+
const result = (await response.json().catch(() => null));
|
|
325
|
+
if (!response.ok || !result?.success) {
|
|
326
|
+
this.verifiedTokens.delete(token);
|
|
327
|
+
throw new errors_js_1.InvalidTokenError('Rivet rejected the access token');
|
|
328
|
+
}
|
|
329
|
+
this.pruneIssuedBearerTokens();
|
|
330
|
+
const issuedToken = this.issuedBearerTokens.get(token);
|
|
331
|
+
const user = normalizeProfileUser(result.user) ?? issuedToken?.user;
|
|
332
|
+
const secondsUntilExpiry = (0, accessTokenRefresh_1.getJwtSecondsUntilExpiry)(token) ?? DEFAULT_TOKEN_TTL_SECONDS;
|
|
333
|
+
const authInfo = {
|
|
334
|
+
token,
|
|
335
|
+
clientId: 'rivet-mcp',
|
|
336
|
+
scopes: [MCP_OAUTH_SCOPE],
|
|
337
|
+
expiresAt: Math.floor(Date.now() / 1000) + Math.max(secondsUntilExpiry, 1),
|
|
338
|
+
extra: {
|
|
339
|
+
...(issuedToken?.refreshToken
|
|
340
|
+
? { refreshToken: issuedToken.refreshToken }
|
|
341
|
+
: {}),
|
|
342
|
+
...(user ? { email: user.email, userId: user.id } : {}),
|
|
343
|
+
},
|
|
344
|
+
};
|
|
345
|
+
this.pruneVerifiedTokens();
|
|
346
|
+
this.verifiedTokens.set(token, {
|
|
347
|
+
authInfo,
|
|
348
|
+
cachedUntil: Date.now() +
|
|
349
|
+
Math.min(TOKEN_VERIFY_CACHE_TTL_MS, Math.max(secondsUntilExpiry, 1) * 1000),
|
|
350
|
+
});
|
|
351
|
+
return authInfo;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Invalidates a bearer token issued by this OAuth provider and its paired
|
|
355
|
+
* refresh token, if the provider knows one.
|
|
356
|
+
*/
|
|
357
|
+
revokeAccessToken(token) {
|
|
358
|
+
const issuedToken = this.issuedBearerTokens.get(token);
|
|
359
|
+
this.revokedAccessTokens.add(token);
|
|
360
|
+
if (issuedToken?.refreshToken) {
|
|
361
|
+
this.revokedRefreshTokens.add(issuedToken.refreshToken);
|
|
362
|
+
this.activeRefreshTokens.delete(issuedToken.refreshToken);
|
|
363
|
+
}
|
|
364
|
+
this.issuedBearerTokens.delete(token);
|
|
365
|
+
this.verifiedTokens.delete(token);
|
|
366
|
+
}
|
|
367
|
+
rememberIssuedBearerToken(tokens) {
|
|
368
|
+
this.pruneIssuedBearerTokens();
|
|
369
|
+
this.issuedBearerTokens.set(tokens.token, {
|
|
370
|
+
refreshToken: tokens.refreshToken,
|
|
371
|
+
user: tokens.user,
|
|
372
|
+
expiresAt: getTokenExpiryMs(tokens.token),
|
|
373
|
+
});
|
|
374
|
+
if (tokens.refreshToken) {
|
|
375
|
+
this.activeRefreshTokens.add(tokens.refreshToken);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
getValidCodeEntry(client, authorizationCode) {
|
|
379
|
+
const entry = this.authorizationCodes.get(authorizationCode);
|
|
380
|
+
if (!entry ||
|
|
381
|
+
entry.clientId !== client.client_id ||
|
|
382
|
+
entry.expiresAt < Date.now()) {
|
|
383
|
+
this.authorizationCodes.delete(authorizationCode);
|
|
384
|
+
throw new errors_js_1.InvalidGrantError('Invalid or expired authorization code');
|
|
385
|
+
}
|
|
386
|
+
return entry;
|
|
387
|
+
}
|
|
388
|
+
toOAuthTokens(accessToken, refreshToken) {
|
|
389
|
+
const secondsUntilExpiry = (0, accessTokenRefresh_1.getJwtSecondsUntilExpiry)(accessToken) ?? DEFAULT_TOKEN_TTL_SECONDS;
|
|
390
|
+
return {
|
|
391
|
+
access_token: accessToken,
|
|
392
|
+
token_type: 'bearer',
|
|
393
|
+
expires_in: Math.max(secondsUntilExpiry, 1),
|
|
394
|
+
scope: MCP_OAUTH_SCOPE,
|
|
395
|
+
...(refreshToken ? { refresh_token: refreshToken } : {}),
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
async pollForRivetTokens(sessionId, pollSecret) {
|
|
399
|
+
for (let attempt = 0; attempt < TOKEN_POLL_MAX_ATTEMPTS; attempt++) {
|
|
400
|
+
const response = await this.fetchFn(`${this.proxyUrl}/api/auth/google/token`, {
|
|
401
|
+
method: 'POST',
|
|
402
|
+
headers: { 'Content-Type': 'application/json' },
|
|
403
|
+
body: JSON.stringify({ session: sessionId, pollSecret }),
|
|
404
|
+
});
|
|
405
|
+
const result = (await response.json().catch(() => null));
|
|
406
|
+
if (result?.success && result.token) {
|
|
407
|
+
return {
|
|
408
|
+
token: result.token,
|
|
409
|
+
refreshToken: result.refreshToken,
|
|
410
|
+
user: result.user,
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
if (result?.error && result.error !== 'Pending') {
|
|
414
|
+
throw new Error(result.error);
|
|
415
|
+
}
|
|
416
|
+
await sleep(this.pollIntervalMs);
|
|
417
|
+
}
|
|
418
|
+
throw new Error('Timed out waiting for Rivet sign-in to complete');
|
|
419
|
+
}
|
|
420
|
+
prunePendingAuthorizations() {
|
|
421
|
+
const now = Date.now();
|
|
422
|
+
for (const [key, value] of this.pendingAuthorizations) {
|
|
423
|
+
if (value.expiresAt < now) {
|
|
424
|
+
this.pendingAuthorizations.delete(key);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
pruneAuthorizationCodes() {
|
|
429
|
+
const now = Date.now();
|
|
430
|
+
for (const [key, value] of this.authorizationCodes) {
|
|
431
|
+
if (value.expiresAt < now) {
|
|
432
|
+
this.authorizationCodes.delete(key);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
pruneVerifiedTokens() {
|
|
437
|
+
const now = Date.now();
|
|
438
|
+
for (const [key, value] of this.verifiedTokens) {
|
|
439
|
+
if (value.cachedUntil < now) {
|
|
440
|
+
this.verifiedTokens.delete(key);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
pruneIssuedBearerTokens() {
|
|
445
|
+
const now = Date.now();
|
|
446
|
+
for (const [key, value] of this.issuedBearerTokens) {
|
|
447
|
+
if (value.expiresAt < now) {
|
|
448
|
+
this.issuedBearerTokens.delete(key);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
exports.RivetOAuthServerProvider = RivetOAuthServerProvider;
|
|
454
|
+
//# sourceMappingURL=httpOAuthProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpOAuthProvider.js","sourceRoot":"","sources":["../../../src/mcp/auth/httpOAuthProvider.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/auth/tools.d.ts
CHANGED
|
@@ -6,6 +6,8 @@ export interface AuthToolDeps {
|
|
|
6
6
|
telemetry?: TelemetryService;
|
|
7
7
|
/** The MCP client (`--editor`), recorded with the login for analytics. */
|
|
8
8
|
mcpEditor?: string;
|
|
9
|
+
/** Rejects an active HTTP OAuth bearer after logout clears local credentials. */
|
|
10
|
+
revokeBearerToken?: (token: string) => void;
|
|
9
11
|
}
|
|
10
12
|
type ToolResponse = {
|
|
11
13
|
content: Array<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/auth/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAMxE,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/auth/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAMxE,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAED,KAAK,YAAY,GAAG;IAClB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAiCF;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC1B,aAAa,WAAW,KACvB,CAAC,MAAM,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAWrC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,GACxB,KAAK,SAAS,EACd,OAAO,MAAM,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,KACxC,SAwBF,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAuI1E"}
|
package/dist/mcp/auth/tools.js
CHANGED
|
@@ -33,7 +33,7 @@ const createAuthGuard = (authService) => {
|
|
|
33
33
|
if (ok) {
|
|
34
34
|
return null;
|
|
35
35
|
}
|
|
36
|
-
return errorResponse('Authentication required.
|
|
36
|
+
return errorResponse('Authentication required. Call the `mcp_auth` tool (it opens a browser to sign in with Google), then retry.', 'AUTH_REQUIRED');
|
|
37
37
|
};
|
|
38
38
|
};
|
|
39
39
|
exports.createAuthGuard = createAuthGuard;
|
|
@@ -73,8 +73,8 @@ const withAuthGuard = (mcp, guard) => {
|
|
|
73
73
|
};
|
|
74
74
|
exports.withAuthGuard = withAuthGuard;
|
|
75
75
|
function registerAuthTools(mcp, deps) {
|
|
76
|
-
const { authService, telemetry, mcpEditor } = deps;
|
|
77
|
-
|
|
76
|
+
const { authService, telemetry, mcpEditor, revokeBearerToken } = deps;
|
|
77
|
+
const loginHandler = async () => {
|
|
78
78
|
try {
|
|
79
79
|
// Real validation — only short-circuit on a genuinely live session,
|
|
80
80
|
// never on a merely-present (possibly stale) token.
|
|
@@ -121,11 +121,18 @@ function registerAuthTools(mcp, deps) {
|
|
|
121
121
|
log.warn('login tool error:', err);
|
|
122
122
|
return errorResponse(err instanceof Error ? err.message : 'Login failed', 'LOGIN_FAILED');
|
|
123
123
|
}
|
|
124
|
-
}
|
|
124
|
+
};
|
|
125
|
+
registerTool(mcp, 'login', 'Authenticate this machine with Rivet via Google. Opens the user\'s browser to sign in, then blocks (~up to 2 minutes) until they finish. If already signed in with a valid session, returns immediately. On timeout, returns success:false with a retryable message — call login again to keep waiting.', {}, loginHandler);
|
|
126
|
+
registerTool(mcp, 'mcp_auth', 'Authenticate this MCP server so the user can access all of its tools. When Rivet reports AUTH_REQUIRED, call this tool soon through your MCP tool-calling interface.', {}, loginHandler);
|
|
125
127
|
registerTool(mcp, 'logout', 'Sign this machine out of Rivet and clear the stored credentials.', {}, async () => {
|
|
126
128
|
try {
|
|
127
|
-
const
|
|
129
|
+
const configManager = (0, ConfigManager_1.getConfigManager)();
|
|
130
|
+
const email = configManager.getEmail();
|
|
131
|
+
const bearerToken = configManager.getAuthToken();
|
|
128
132
|
await authService.logout();
|
|
133
|
+
if (bearerToken) {
|
|
134
|
+
revokeBearerToken?.(bearerToken);
|
|
135
|
+
}
|
|
129
136
|
telemetry?.track('mcp_logout', { source: 'mcp' });
|
|
130
137
|
return jsonResponse({ loggedOut: true, email });
|
|
131
138
|
}
|