@reaudit/mcp-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +33 -0
- package/README.md +399 -0
- package/dist/auth/oauth-client.d.ts +43 -0
- package/dist/auth/oauth-client.d.ts.map +1 -0
- package/dist/auth/oauth-client.js +340 -0
- package/dist/auth/oauth-client.js.map +1 -0
- package/dist/auth/token-store.d.ts +41 -0
- package/dist/auth/token-store.d.ts.map +1 -0
- package/dist/auth/token-store.js +176 -0
- package/dist/auth/token-store.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +480 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-client.d.ts +970 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +441 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/confirmation.d.ts +92 -0
- package/dist/lib/confirmation.d.ts.map +1 -0
- package/dist/lib/confirmation.js +224 -0
- package/dist/lib/confirmation.js.map +1 -0
- package/dist/lib/error-handler.d.ts +57 -0
- package/dist/lib/error-handler.d.ts.map +1 -0
- package/dist/lib/error-handler.js +235 -0
- package/dist/lib/error-handler.js.map +1 -0
- package/dist/lib/offline-mode.d.ts +107 -0
- package/dist/lib/offline-mode.d.ts.map +1 -0
- package/dist/lib/offline-mode.js +356 -0
- package/dist/lib/offline-mode.js.map +1 -0
- package/dist/lib/progress-tracker.d.ts +87 -0
- package/dist/lib/progress-tracker.d.ts.map +1 -0
- package/dist/lib/progress-tracker.js +238 -0
- package/dist/lib/progress-tracker.js.map +1 -0
- package/dist/prompts/index.d.ts +24 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +305 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/resources/index.d.ts +44 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +125 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/tools/account.d.ts +25 -0
- package/dist/tools/account.d.ts.map +1 -0
- package/dist/tools/account.js +69 -0
- package/dist/tools/account.js.map +1 -0
- package/dist/tools/action-grids.d.ts +414 -0
- package/dist/tools/action-grids.d.ts.map +1 -0
- package/dist/tools/action-grids.js +271 -0
- package/dist/tools/action-grids.js.map +1 -0
- package/dist/tools/analytics-query.d.ts +126 -0
- package/dist/tools/analytics-query.d.ts.map +1 -0
- package/dist/tools/analytics-query.js +106 -0
- package/dist/tools/analytics-query.js.map +1 -0
- package/dist/tools/analytics.d.ts +57 -0
- package/dist/tools/analytics.d.ts.map +1 -0
- package/dist/tools/analytics.js +122 -0
- package/dist/tools/analytics.js.map +1 -0
- package/dist/tools/audits.d.ts +123 -0
- package/dist/tools/audits.d.ts.map +1 -0
- package/dist/tools/audits.js +226 -0
- package/dist/tools/audits.js.map +1 -0
- package/dist/tools/calendar.d.ts +57 -0
- package/dist/tools/calendar.d.ts.map +1 -0
- package/dist/tools/calendar.js +109 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/content-generation.d.ts +211 -0
- package/dist/tools/content-generation.d.ts.map +1 -0
- package/dist/tools/content-generation.js +363 -0
- package/dist/tools/content-generation.js.map +1 -0
- package/dist/tools/content.d.ts +92 -0
- package/dist/tools/content.d.ts.map +1 -0
- package/dist/tools/content.js +130 -0
- package/dist/tools/content.js.map +1 -0
- package/dist/tools/indexing.d.ts +132 -0
- package/dist/tools/indexing.d.ts.map +1 -0
- package/dist/tools/indexing.js +190 -0
- package/dist/tools/indexing.js.map +1 -0
- package/dist/tools/optimization.d.ts +70 -0
- package/dist/tools/optimization.d.ts.map +1 -0
- package/dist/tools/optimization.js +106 -0
- package/dist/tools/optimization.js.map +1 -0
- package/dist/tools/projects.d.ts +67 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +113 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/prompts.d.ts +306 -0
- package/dist/tools/prompts.d.ts.map +1 -0
- package/dist/tools/prompts.js +378 -0
- package/dist/tools/prompts.js.map +1 -0
- package/dist/tools/publishing.d.ts +135 -0
- package/dist/tools/publishing.d.ts.map +1 -0
- package/dist/tools/publishing.js +209 -0
- package/dist/tools/publishing.js.map +1 -0
- package/dist/tools/reports.d.ts +252 -0
- package/dist/tools/reports.d.ts.map +1 -0
- package/dist/tools/reports.js +183 -0
- package/dist/tools/reports.js.map +1 -0
- package/dist/tools/social.d.ts +224 -0
- package/dist/tools/social.d.ts.map +1 -0
- package/dist/tools/social.js +291 -0
- package/dist/tools/social.js.map +1 -0
- package/dist/tools/sources.d.ts +221 -0
- package/dist/tools/sources.d.ts.map +1 -0
- package/dist/tools/sources.js +308 -0
- package/dist/tools/sources.js.map +1 -0
- package/dist/tools/strategy.d.ts +345 -0
- package/dist/tools/strategy.d.ts.map +1 -0
- package/dist/tools/strategy.js +392 -0
- package/dist/tools/strategy.js.map +1 -0
- package/dist/tools/usage.d.ts +101 -0
- package/dist/tools/usage.d.ts.map +1 -0
- package/dist/tools/usage.js +184 -0
- package/dist/tools/usage.js.map +1 -0
- package/dist/tools/visibility.d.ts +95 -0
- package/dist/tools/visibility.d.ts.map +1 -0
- package/dist/tools/visibility.js +163 -0
- package/dist/tools/visibility.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OAuth Client
|
|
4
|
+
*
|
|
5
|
+
* Handles the OAuth 2.0 authorization code flow with PKCE
|
|
6
|
+
* for authenticating with the Reaudit API.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
42
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.OAuthClient = void 0;
|
|
46
|
+
const http = __importStar(require("http"));
|
|
47
|
+
const crypto = __importStar(require("crypto"));
|
|
48
|
+
const url = __importStar(require("url"));
|
|
49
|
+
const child_process = __importStar(require("child_process"));
|
|
50
|
+
const axios_1 = __importDefault(require("axios"));
|
|
51
|
+
const token_store_js_1 = require("./token-store.js");
|
|
52
|
+
/**
|
|
53
|
+
* Open URL in default browser (cross-platform)
|
|
54
|
+
*/
|
|
55
|
+
async function openBrowser(url) {
|
|
56
|
+
const platform = process.platform;
|
|
57
|
+
let command;
|
|
58
|
+
let args;
|
|
59
|
+
if (platform === 'darwin') {
|
|
60
|
+
command = 'open';
|
|
61
|
+
args = [url];
|
|
62
|
+
}
|
|
63
|
+
else if (platform === 'win32') {
|
|
64
|
+
command = 'cmd';
|
|
65
|
+
args = ['/c', 'start', '', url];
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// Linux and others
|
|
69
|
+
command = 'xdg-open';
|
|
70
|
+
args = [url];
|
|
71
|
+
}
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
const proc = child_process.spawn(command, args, {
|
|
74
|
+
detached: true,
|
|
75
|
+
stdio: 'ignore',
|
|
76
|
+
});
|
|
77
|
+
proc.unref();
|
|
78
|
+
proc.on('error', reject);
|
|
79
|
+
// Resolve immediately since we detached
|
|
80
|
+
setTimeout(resolve, 100);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
const CALLBACK_PORT = 3847;
|
|
84
|
+
const CLIENT_ID = process.env.REAUDIT_CLIENT_ID || 'reaudit-mcp-server';
|
|
85
|
+
/**
|
|
86
|
+
* Generate PKCE code verifier
|
|
87
|
+
*/
|
|
88
|
+
function generateCodeVerifier() {
|
|
89
|
+
return crypto.randomBytes(32).toString('base64url');
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Generate PKCE code challenge from verifier
|
|
93
|
+
*/
|
|
94
|
+
function generateCodeChallenge(verifier) {
|
|
95
|
+
return crypto.createHash('sha256').update(verifier).digest('base64url');
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* OAuth Client class
|
|
99
|
+
*/
|
|
100
|
+
class OAuthClient {
|
|
101
|
+
baseUrl;
|
|
102
|
+
tokenStore;
|
|
103
|
+
constructor(baseUrl) {
|
|
104
|
+
this.baseUrl = baseUrl;
|
|
105
|
+
this.tokenStore = new token_store_js_1.TokenStore(baseUrl);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get a valid access token, refreshing if necessary
|
|
109
|
+
*/
|
|
110
|
+
async getAccessToken() {
|
|
111
|
+
// Check for existing tokens
|
|
112
|
+
const tokens = this.tokenStore.loadTokens();
|
|
113
|
+
if (tokens) {
|
|
114
|
+
// Check if access token is still valid
|
|
115
|
+
if (!this.tokenStore.isAccessTokenExpired()) {
|
|
116
|
+
return tokens.accessToken;
|
|
117
|
+
}
|
|
118
|
+
// Try to refresh
|
|
119
|
+
try {
|
|
120
|
+
const newTokens = await this.refreshToken(tokens.refreshToken);
|
|
121
|
+
return newTokens.access_token;
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
console.error('Token refresh failed, need to re-authenticate');
|
|
125
|
+
this.tokenStore.clearTokens();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// No valid tokens, need to authenticate
|
|
129
|
+
return this.authenticate();
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Start the OAuth flow
|
|
133
|
+
*/
|
|
134
|
+
async authenticate() {
|
|
135
|
+
return new Promise((resolve, reject) => {
|
|
136
|
+
const codeVerifier = generateCodeVerifier();
|
|
137
|
+
const codeChallenge = generateCodeChallenge(codeVerifier);
|
|
138
|
+
const state = crypto.randomBytes(16).toString('hex');
|
|
139
|
+
// Create local server to receive callback
|
|
140
|
+
const server = http.createServer(async (req, res) => {
|
|
141
|
+
const parsedUrl = url.parse(req.url || '', true);
|
|
142
|
+
if (parsedUrl.pathname === '/callback') {
|
|
143
|
+
const code = parsedUrl.query.code;
|
|
144
|
+
const returnedState = parsedUrl.query.state;
|
|
145
|
+
const error = parsedUrl.query.error;
|
|
146
|
+
if (error) {
|
|
147
|
+
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
148
|
+
res.end(this.getErrorPage('Authorization Denied', error === 'access_denied' ? 'You denied the authorization request.' : `Error: ${error}`));
|
|
149
|
+
server.close();
|
|
150
|
+
reject(new Error(`OAuth error: ${error}`));
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (returnedState !== state) {
|
|
154
|
+
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
155
|
+
res.end(this.getErrorPage('Security Error', 'State mismatch detected. This could be a security issue. Please try again.'));
|
|
156
|
+
server.close();
|
|
157
|
+
reject(new Error('State mismatch'));
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
try {
|
|
161
|
+
// Exchange code for tokens
|
|
162
|
+
const tokens = await this.exchangeCode(code, codeVerifier);
|
|
163
|
+
// Save tokens
|
|
164
|
+
this.tokenStore.saveTokens({
|
|
165
|
+
accessToken: tokens.access_token,
|
|
166
|
+
refreshToken: tokens.refresh_token,
|
|
167
|
+
expiresAt: Math.floor(Date.now() / 1000) + tokens.expires_in,
|
|
168
|
+
scope: tokens.scope,
|
|
169
|
+
});
|
|
170
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
171
|
+
res.end(`
|
|
172
|
+
<!DOCTYPE html>
|
|
173
|
+
<html lang="en">
|
|
174
|
+
<head>
|
|
175
|
+
<meta charset="UTF-8">
|
|
176
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
177
|
+
<title>Authorization Successful - Reaudit</title>
|
|
178
|
+
<link rel="icon" href="https://reaudit.io/favicon.ico">
|
|
179
|
+
</head>
|
|
180
|
+
<body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; padding: 40px; text-align: center; background: linear-gradient(135deg, #f5f7fa 0%, #e4e8ec 100%); min-height: 100vh; margin: 0; display: flex; flex-direction: column; align-items: center; justify-content: center;">
|
|
181
|
+
<div style="background: white; padding: 48px; border-radius: 16px; box-shadow: 0 4px 24px rgba(0,0,0,0.1); max-width: 420px;">
|
|
182
|
+
<img src="https://reaudit.io/reaudit-logo-light.svg" alt="Reaudit" style="height: 40px; margin-bottom: 24px;">
|
|
183
|
+
<div style="width: 64px; height: 64px; background: #10b981; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 20px;">
|
|
184
|
+
<svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">
|
|
185
|
+
<polyline points="20 6 9 17 4 12"></polyline>
|
|
186
|
+
</svg>
|
|
187
|
+
</div>
|
|
188
|
+
<h1 style="color: #10b981; margin: 0 0 12px; font-size: 24px; font-weight: 600;">Authorization Successful</h1>
|
|
189
|
+
<p style="color: #64748b; margin: 0 0 24px; font-size: 15px;">You can close this window and return to your AI assistant.</p>
|
|
190
|
+
<p style="color: #94a3b8; font-size: 13px; margin: 0;">This window will close automatically in 3 seconds...</p>
|
|
191
|
+
</div>
|
|
192
|
+
<p style="color: #94a3b8; font-size: 12px; margin-top: 24px;">
|
|
193
|
+
<a href="https://reaudit.io/help/mcp" style="color: #231f20; text-decoration: none;">Need help?</a>
|
|
194
|
+
•
|
|
195
|
+
<a href="https://reaudit.io" style="color: #231f20; text-decoration: none;">reaudit.io</a>
|
|
196
|
+
</p>
|
|
197
|
+
<script>setTimeout(() => window.close(), 3000);</script>
|
|
198
|
+
</body>
|
|
199
|
+
</html>
|
|
200
|
+
`);
|
|
201
|
+
server.close();
|
|
202
|
+
resolve(tokens.access_token);
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
console.error('Token exchange error:', err);
|
|
206
|
+
res.writeHead(500, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
207
|
+
res.end(this.getErrorPage('Token Exchange Failed', 'Failed to complete authorization. Please try again or contact support.'));
|
|
208
|
+
server.close();
|
|
209
|
+
reject(err);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
server.listen(CALLBACK_PORT, () => {
|
|
214
|
+
// Build authorization URL
|
|
215
|
+
const authUrl = new URL(`${this.baseUrl}/api/oauth/authorize`);
|
|
216
|
+
authUrl.searchParams.set('client_id', CLIENT_ID);
|
|
217
|
+
authUrl.searchParams.set('redirect_uri', `http://localhost:${CALLBACK_PORT}/callback`);
|
|
218
|
+
authUrl.searchParams.set('response_type', 'code');
|
|
219
|
+
authUrl.searchParams.set('scope', 'full_access');
|
|
220
|
+
authUrl.searchParams.set('state', state);
|
|
221
|
+
authUrl.searchParams.set('code_challenge', codeChallenge);
|
|
222
|
+
authUrl.searchParams.set('code_challenge_method', 'S256');
|
|
223
|
+
console.error('\n🔐 Opening browser for authentication...');
|
|
224
|
+
console.error('If the browser doesn\'t open, visit this URL:');
|
|
225
|
+
console.error(authUrl.toString());
|
|
226
|
+
console.error('');
|
|
227
|
+
// Open browser
|
|
228
|
+
openBrowser(authUrl.toString()).catch(() => {
|
|
229
|
+
console.error('Could not open browser automatically.');
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
// Timeout after 5 minutes
|
|
233
|
+
setTimeout(() => {
|
|
234
|
+
server.close();
|
|
235
|
+
reject(new Error('Authentication timeout'));
|
|
236
|
+
}, 5 * 60 * 1000);
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Exchange authorization code for tokens
|
|
241
|
+
*/
|
|
242
|
+
async exchangeCode(code, codeVerifier) {
|
|
243
|
+
const response = await axios_1.default.post(`${this.baseUrl}/api/oauth/token`, {
|
|
244
|
+
grant_type: 'authorization_code',
|
|
245
|
+
client_id: CLIENT_ID,
|
|
246
|
+
code,
|
|
247
|
+
redirect_uri: `http://localhost:${CALLBACK_PORT}/callback`,
|
|
248
|
+
code_verifier: codeVerifier,
|
|
249
|
+
}, {
|
|
250
|
+
headers: {
|
|
251
|
+
'Content-Type': 'application/json',
|
|
252
|
+
},
|
|
253
|
+
});
|
|
254
|
+
return response.data;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Refresh access token
|
|
258
|
+
*/
|
|
259
|
+
async refreshToken(refreshToken) {
|
|
260
|
+
const response = await axios_1.default.post(`${this.baseUrl}/api/oauth/token`, {
|
|
261
|
+
grant_type: 'refresh_token',
|
|
262
|
+
client_id: CLIENT_ID,
|
|
263
|
+
refresh_token: refreshToken,
|
|
264
|
+
}, {
|
|
265
|
+
headers: {
|
|
266
|
+
'Content-Type': 'application/json',
|
|
267
|
+
},
|
|
268
|
+
});
|
|
269
|
+
// Save new tokens
|
|
270
|
+
this.tokenStore.saveTokens({
|
|
271
|
+
accessToken: response.data.access_token,
|
|
272
|
+
refreshToken: response.data.refresh_token,
|
|
273
|
+
expiresAt: Math.floor(Date.now() / 1000) + response.data.expires_in,
|
|
274
|
+
scope: response.data.scope,
|
|
275
|
+
});
|
|
276
|
+
return response.data;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Revoke tokens and clear local storage
|
|
280
|
+
*/
|
|
281
|
+
async logout() {
|
|
282
|
+
const tokens = this.tokenStore.loadTokens();
|
|
283
|
+
if (tokens) {
|
|
284
|
+
try {
|
|
285
|
+
await axios_1.default.post(`${this.baseUrl}/api/oauth/revoke`, {
|
|
286
|
+
token: tokens.refreshToken,
|
|
287
|
+
token_type_hint: 'refresh_token',
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
// Ignore errors during revocation
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
this.tokenStore.clearTokens();
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Check if user is authenticated
|
|
298
|
+
*/
|
|
299
|
+
isAuthenticated() {
|
|
300
|
+
const tokens = this.tokenStore.loadTokens();
|
|
301
|
+
return tokens !== null;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Generate branded error page HTML
|
|
305
|
+
*/
|
|
306
|
+
getErrorPage(title, message) {
|
|
307
|
+
return `
|
|
308
|
+
<!DOCTYPE html>
|
|
309
|
+
<html lang="en">
|
|
310
|
+
<head>
|
|
311
|
+
<meta charset="UTF-8">
|
|
312
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
313
|
+
<title>${title} - Reaudit</title>
|
|
314
|
+
<link rel="icon" href="https://reaudit.io/favicon.ico">
|
|
315
|
+
</head>
|
|
316
|
+
<body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; padding: 40px; text-align: center; background: linear-gradient(135deg, #f5f7fa 0%, #e4e8ec 100%); min-height: 100vh; margin: 0; display: flex; flex-direction: column; align-items: center; justify-content: center;">
|
|
317
|
+
<div style="background: white; padding: 48px; border-radius: 16px; box-shadow: 0 4px 24px rgba(0,0,0,0.1); max-width: 420px;">
|
|
318
|
+
<img src="https://reaudit.io/reaudit-logo-light.svg" alt="Reaudit" style="height: 40px; margin-bottom: 24px;">
|
|
319
|
+
<div style="width: 64px; height: 64px; background: #ef4444; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 20px;">
|
|
320
|
+
<svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">
|
|
321
|
+
<line x1="18" y1="6" x2="6" y2="18"></line>
|
|
322
|
+
<line x1="6" y1="6" x2="18" y2="18"></line>
|
|
323
|
+
</svg>
|
|
324
|
+
</div>
|
|
325
|
+
<h1 style="color: #ef4444; margin: 0 0 12px; font-size: 24px; font-weight: 600;">${title}</h1>
|
|
326
|
+
<p style="color: #64748b; margin: 0 0 24px; font-size: 15px;">${message}</p>
|
|
327
|
+
<button onclick="window.close()" style="background: #231f20; color: white; border: none; padding: 12px 24px; border-radius: 8px; font-size: 14px; font-weight: 500; cursor: pointer;">Close Window</button>
|
|
328
|
+
</div>
|
|
329
|
+
<p style="color: #94a3b8; font-size: 12px; margin-top: 24px;">
|
|
330
|
+
<a href="https://reaudit.io/help/mcp" style="color: #231f20; text-decoration: none;">Need help?</a>
|
|
331
|
+
•
|
|
332
|
+
<a href="https://reaudit.io" style="color: #231f20; text-decoration: none;">reaudit.io</a>
|
|
333
|
+
</p>
|
|
334
|
+
</body>
|
|
335
|
+
</html>
|
|
336
|
+
`;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
exports.OAuthClient = OAuthClient;
|
|
340
|
+
//# sourceMappingURL=oauth-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-client.js","sourceRoot":"","sources":["../../src/auth/oauth-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Store
|
|
3
|
+
*
|
|
4
|
+
* Securely stores OAuth tokens on the user's local machine.
|
|
5
|
+
* Tokens are stored in ~/.reaudit/credentials.json
|
|
6
|
+
*/
|
|
7
|
+
interface StoredTokens {
|
|
8
|
+
accessToken: string;
|
|
9
|
+
refreshToken: string;
|
|
10
|
+
expiresAt: number;
|
|
11
|
+
scope: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Token Store class
|
|
15
|
+
*/
|
|
16
|
+
export declare class TokenStore {
|
|
17
|
+
private baseUrl;
|
|
18
|
+
constructor(baseUrl: string);
|
|
19
|
+
/**
|
|
20
|
+
* Save tokens to disk
|
|
21
|
+
*/
|
|
22
|
+
saveTokens(tokens: StoredTokens): void;
|
|
23
|
+
/**
|
|
24
|
+
* Load tokens from disk
|
|
25
|
+
*/
|
|
26
|
+
loadTokens(): StoredTokens | null;
|
|
27
|
+
/**
|
|
28
|
+
* Clear stored tokens
|
|
29
|
+
*/
|
|
30
|
+
clearTokens(): void;
|
|
31
|
+
/**
|
|
32
|
+
* Check if access token is expired (with 5 minute buffer)
|
|
33
|
+
*/
|
|
34
|
+
isAccessTokenExpired(): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Get the credentials file path (for display to user)
|
|
37
|
+
*/
|
|
38
|
+
static getCredentialsPath(): string;
|
|
39
|
+
}
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=token-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../../src/auth/token-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,UAAU,YAAY;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAuDD;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,MAAM;IAI3B;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAmBtC;;OAEG;IACH,UAAU,IAAI,YAAY,GAAG,IAAI;IA8BjC;;OAEG;IACH,WAAW,IAAI,IAAI;IAUnB;;OAEG;IACH,oBAAoB,IAAI,OAAO;IAQ/B;;OAEG;IACH,MAAM,CAAC,kBAAkB,IAAI,MAAM;CAGpC"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Token Store
|
|
4
|
+
*
|
|
5
|
+
* Securely stores OAuth tokens on the user's local machine.
|
|
6
|
+
* Tokens are stored in ~/.reaudit/credentials.json
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.TokenStore = void 0;
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const os = __importStar(require("os"));
|
|
46
|
+
const crypto = __importStar(require("crypto"));
|
|
47
|
+
const CREDENTIALS_DIR = path.join(os.homedir(), '.reaudit');
|
|
48
|
+
const CREDENTIALS_FILE = path.join(CREDENTIALS_DIR, 'credentials.json');
|
|
49
|
+
const FILE_VERSION = 1;
|
|
50
|
+
/**
|
|
51
|
+
* Ensure the credentials directory exists
|
|
52
|
+
*/
|
|
53
|
+
function ensureCredentialsDir() {
|
|
54
|
+
if (!fs.existsSync(CREDENTIALS_DIR)) {
|
|
55
|
+
fs.mkdirSync(CREDENTIALS_DIR, { mode: 0o700 });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get a simple encryption key based on machine ID
|
|
60
|
+
* This provides basic obfuscation, not strong encryption
|
|
61
|
+
*/
|
|
62
|
+
function getEncryptionKey() {
|
|
63
|
+
const machineId = os.hostname() + os.userInfo().username;
|
|
64
|
+
return crypto.createHash('sha256').update(machineId).digest();
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Simple encrypt for local storage
|
|
68
|
+
*/
|
|
69
|
+
function encrypt(text) {
|
|
70
|
+
const key = getEncryptionKey();
|
|
71
|
+
const iv = crypto.randomBytes(16);
|
|
72
|
+
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
|
|
73
|
+
let encrypted = cipher.update(text, 'utf8', 'hex');
|
|
74
|
+
encrypted += cipher.final('hex');
|
|
75
|
+
return iv.toString('hex') + ':' + encrypted;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Simple decrypt for local storage
|
|
79
|
+
*/
|
|
80
|
+
function decrypt(text) {
|
|
81
|
+
const key = getEncryptionKey();
|
|
82
|
+
const [ivHex, encrypted] = text.split(':');
|
|
83
|
+
const iv = Buffer.from(ivHex, 'hex');
|
|
84
|
+
const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
|
|
85
|
+
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
|
|
86
|
+
decrypted += decipher.final('utf8');
|
|
87
|
+
return decrypted;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Token Store class
|
|
91
|
+
*/
|
|
92
|
+
class TokenStore {
|
|
93
|
+
baseUrl;
|
|
94
|
+
constructor(baseUrl) {
|
|
95
|
+
this.baseUrl = baseUrl;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Save tokens to disk
|
|
99
|
+
*/
|
|
100
|
+
saveTokens(tokens) {
|
|
101
|
+
ensureCredentialsDir();
|
|
102
|
+
const data = {
|
|
103
|
+
version: FILE_VERSION,
|
|
104
|
+
tokens: {
|
|
105
|
+
accessToken: encrypt(tokens.accessToken),
|
|
106
|
+
refreshToken: encrypt(tokens.refreshToken),
|
|
107
|
+
expiresAt: tokens.expiresAt,
|
|
108
|
+
scope: tokens.scope,
|
|
109
|
+
},
|
|
110
|
+
baseUrl: this.baseUrl,
|
|
111
|
+
};
|
|
112
|
+
fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(data, null, 2), {
|
|
113
|
+
mode: 0o600,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Load tokens from disk
|
|
118
|
+
*/
|
|
119
|
+
loadTokens() {
|
|
120
|
+
try {
|
|
121
|
+
if (!fs.existsSync(CREDENTIALS_FILE)) {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
const content = fs.readFileSync(CREDENTIALS_FILE, 'utf8');
|
|
125
|
+
const data = JSON.parse(content);
|
|
126
|
+
// Check version and base URL
|
|
127
|
+
if (data.version !== FILE_VERSION || data.baseUrl !== this.baseUrl) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
if (!data.tokens) {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
accessToken: decrypt(data.tokens.accessToken),
|
|
135
|
+
refreshToken: decrypt(data.tokens.refreshToken),
|
|
136
|
+
expiresAt: data.tokens.expiresAt,
|
|
137
|
+
scope: data.tokens.scope,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
console.error('Error loading tokens:', error);
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Clear stored tokens
|
|
147
|
+
*/
|
|
148
|
+
clearTokens() {
|
|
149
|
+
try {
|
|
150
|
+
if (fs.existsSync(CREDENTIALS_FILE)) {
|
|
151
|
+
fs.unlinkSync(CREDENTIALS_FILE);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
console.error('Error clearing tokens:', error);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Check if access token is expired (with 5 minute buffer)
|
|
160
|
+
*/
|
|
161
|
+
isAccessTokenExpired() {
|
|
162
|
+
const tokens = this.loadTokens();
|
|
163
|
+
if (!tokens)
|
|
164
|
+
return true;
|
|
165
|
+
const bufferMs = 5 * 60 * 1000; // 5 minutes
|
|
166
|
+
return Date.now() >= (tokens.expiresAt * 1000) - bufferMs;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Get the credentials file path (for display to user)
|
|
170
|
+
*/
|
|
171
|
+
static getCredentialsPath() {
|
|
172
|
+
return CREDENTIALS_FILE;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
exports.TokenStore = TokenStore;
|
|
176
|
+
//# sourceMappingURL=token-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-store.js","sourceRoot":"","sources":["../../src/auth/token-store.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Reaudit MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Model Context Protocol server for accessing Reaudit AI Visibility Platform
|
|
6
|
+
* from AI assistants like Claude Desktop and Cursor.
|
|
7
|
+
*
|
|
8
|
+
* @see https://reaudit.io/docs/mcp
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}
|