@blen/fedreg-mcp-server 2.0.11 → 2.1.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 +7 -1
- package/README.md +13 -2
- package/dist/accounts/app.d.ts +16 -0
- package/dist/accounts/app.d.ts.map +1 -0
- package/dist/accounts/app.js +352 -0
- package/dist/accounts/app.js.map +1 -0
- package/dist/accounts/config.d.ts +16 -0
- package/dist/accounts/config.d.ts.map +1 -0
- package/dist/accounts/config.js +50 -0
- package/dist/accounts/config.js.map +1 -0
- package/dist/accounts/crypto.d.ts +18 -0
- package/dist/accounts/crypto.d.ts.map +1 -0
- package/dist/accounts/crypto.js +43 -0
- package/dist/accounts/crypto.js.map +1 -0
- package/dist/accounts/portal.d.ts +8 -0
- package/dist/accounts/portal.d.ts.map +1 -0
- package/dist/accounts/portal.js +170 -0
- package/dist/accounts/portal.js.map +1 -0
- package/dist/accounts/provider.d.ts +2568 -0
- package/dist/accounts/provider.d.ts.map +1 -0
- package/dist/accounts/provider.js +107 -0
- package/dist/accounts/provider.js.map +1 -0
- package/dist/accounts/runtime.d.ts +16 -0
- package/dist/accounts/runtime.d.ts.map +1 -0
- package/dist/accounts/runtime.js +122 -0
- package/dist/accounts/runtime.js.map +1 -0
- package/dist/accounts/store.d.ts +25 -0
- package/dist/accounts/store.d.ts.map +1 -0
- package/dist/accounts/store.js +142 -0
- package/dist/accounts/store.js.map +1 -0
- package/dist/bin.js +13 -4
- package/dist/bin.js.map +1 -1
- package/dist/sdk/bindings.js +1 -1
- package/dist/sdk/bindings.js.map +1 -1
- package/dist/sdk/sources/corpus-loader.d.ts +3 -1
- package/dist/sdk/sources/corpus-loader.d.ts.map +1 -1
- package/dist/sdk/sources/corpus-loader.js +10 -2
- package/dist/sdk/sources/corpus-loader.js.map +1 -1
- package/dist/sdk/sources/source.d.ts +2 -5
- package/dist/sdk/sources/source.d.ts.map +1 -1
- package/dist/server/mcpServer.js +1 -1
- package/dist/server/mcpServer.js.map +1 -1
- package/dist/server/toolCatalog.d.ts +2 -1
- package/dist/server/toolCatalog.d.ts.map +1 -1
- package/dist/server/toolCatalog.js.map +1 -1
- package/dist/server/zodToJsonSchema.d.ts +1 -1
- package/dist/server/zodToJsonSchema.d.ts.map +1 -1
- package/dist/tools/describeSchema.d.ts +1 -1
- package/dist/tools/describeSchema.d.ts.map +1 -1
- package/dist/tools/describeSchema.js +1 -1
- package/dist/tools/describeSchema.js.map +1 -1
- package/dist/tools/execute.d.ts +4 -2
- package/dist/tools/execute.d.ts.map +1 -1
- package/dist/tools/execute.js +5 -4
- package/dist/tools/execute.js.map +1 -1
- package/dist/tools/searchApi.d.ts +1 -1
- package/dist/tools/searchApi.d.ts.map +1 -1
- package/dist/tools/searchApi.js +1 -1
- package/dist/tools/searchApi.js.map +1 -1
- package/dist/util/httpClient.d.ts +9 -4
- package/dist/util/httpClient.d.ts.map +1 -1
- package/dist/util/httpClient.js +1 -1
- package/dist/util/httpClient.js.map +1 -1
- package/dist/web/assets/blen-logo-BKJFojyj.png +0 -0
- package/dist/web/assets/index--Hn7cjpj.js +299 -0
- package/dist/web/assets/index-bNtg7OeV.css +2 -0
- package/dist/web/index.html +14 -0
- package/package.json +35 -7
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import { fromNodeHeaders } from 'better-auth/node';
|
|
3
|
+
import { verifyOAuthQueryParams } from '@better-auth/oauth-provider';
|
|
4
|
+
import { personalOwner } from './store.js';
|
|
5
|
+
/** Keys go only to this fixed upstream; no URL, owner or user ID comes from the form. */
|
|
6
|
+
export async function checkKey(key, fetcher = fetch) {
|
|
7
|
+
if (typeof key !== 'string' || !/^[a-zA-Z0-9]{40}$/.test(key))
|
|
8
|
+
return 'Enter your 40-character regulations.gov API key.';
|
|
9
|
+
try {
|
|
10
|
+
const result = await fetcher('https://api.regulations.gov/v4/documents?page[size]=1', {
|
|
11
|
+
headers: { 'X-Api-Key': key, Accept: 'application/vnd.api+json' },
|
|
12
|
+
redirect: 'error', signal: AbortSignal.timeout(10_000),
|
|
13
|
+
});
|
|
14
|
+
// Key validation needs status only. Never log, echo, or persist the upstream body.
|
|
15
|
+
await result.body?.cancel();
|
|
16
|
+
if (!result.ok)
|
|
17
|
+
return 'The regulations.gov connection check failed. Your existing key was preserved.';
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return 'The regulations.gov connection check failed. Your existing key was preserved.';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function installPortal(app, config, store, auth, fetcher, ipOf) {
|
|
24
|
+
const api = express.Router();
|
|
25
|
+
api.use(express.json({ limit: '8kb' }));
|
|
26
|
+
api.use((req, res, next) => {
|
|
27
|
+
if (req.method !== 'GET' && (req.headers.origin !== config.origin || !req.is('application/json'))) {
|
|
28
|
+
return res.status(403).json({ error: 'Invalid request origin.' });
|
|
29
|
+
}
|
|
30
|
+
next();
|
|
31
|
+
});
|
|
32
|
+
async function verified(req) {
|
|
33
|
+
const session = await auth.api.getSession({ headers: fromNodeHeaders(req.headers) });
|
|
34
|
+
return session?.user.emailVerified ? session : undefined;
|
|
35
|
+
}
|
|
36
|
+
async function validQuery(value) {
|
|
37
|
+
return typeof value === 'string' && value.length < 16384 &&
|
|
38
|
+
await verifyOAuthQueryParams(value, config.authSecret) ? value : undefined;
|
|
39
|
+
}
|
|
40
|
+
const error = (res, status, message) => res.status(status).json({ error: message });
|
|
41
|
+
async function account(user) {
|
|
42
|
+
const key = await store.keyStatus(personalOwner(user.id));
|
|
43
|
+
return { email: user.email, personal: { connected: key.connected }, key, mcpUrl: `${config.origin}/mcp` };
|
|
44
|
+
}
|
|
45
|
+
async function connection(query) {
|
|
46
|
+
const params = new URLSearchParams(query);
|
|
47
|
+
const client = await (await auth.$context).adapter.findOne({
|
|
48
|
+
model: 'oauthClient', where: [{ field: 'clientId', value: params.get('client_id') }],
|
|
49
|
+
});
|
|
50
|
+
const redirect = new URL(params.get('redirect_uri'));
|
|
51
|
+
return { client: client?.name || 'This application', destination: redirect.host,
|
|
52
|
+
local: ['localhost', '127.0.0.1', '[::1]'].includes(redirect.hostname) };
|
|
53
|
+
}
|
|
54
|
+
async function continueWith(req, res, path, body) {
|
|
55
|
+
const headers = fromNodeHeaders(req.headers);
|
|
56
|
+
headers.delete('content-length');
|
|
57
|
+
headers.set('content-type', 'application/json');
|
|
58
|
+
headers.set('accept', 'application/json');
|
|
59
|
+
// Forward only the client address trusted by Express, not a caller's spoofed chain.
|
|
60
|
+
const ip = ipOf(req);
|
|
61
|
+
if (ip)
|
|
62
|
+
headers.set('x-forwarded-for', ip);
|
|
63
|
+
else
|
|
64
|
+
headers.delete('x-forwarded-for');
|
|
65
|
+
const response = await auth.handler(new globalThis.Request(`${config.origin}/api/auth${path}`, {
|
|
66
|
+
method: 'POST', headers, body: JSON.stringify(body),
|
|
67
|
+
}));
|
|
68
|
+
const cookies = response.headers.getSetCookie();
|
|
69
|
+
if (cookies.length)
|
|
70
|
+
res.setHeader('Set-Cookie', cookies);
|
|
71
|
+
const result = await response.json().catch(() => ({}));
|
|
72
|
+
const url = response.status >= 300 && response.status < 400 ? response.headers.get('location') : result.url ?? result.redirect_uri;
|
|
73
|
+
if (typeof url !== 'string' || response.status >= 400)
|
|
74
|
+
return error(res, 400, 'Connection authorization failed.');
|
|
75
|
+
res.json({ url: new URL(url, config.origin).toString() });
|
|
76
|
+
}
|
|
77
|
+
api.get('/config', (_req, res) => res.json({ google: true, email: false, mcpUrl: `${config.origin}/mcp` }));
|
|
78
|
+
api.get('/connect', async (req, res) => {
|
|
79
|
+
const logged = await verified(req);
|
|
80
|
+
if (!logged)
|
|
81
|
+
return error(res, 401, 'Sign in to continue.');
|
|
82
|
+
const query = await validQuery(req.query.oauth_query);
|
|
83
|
+
if (!query)
|
|
84
|
+
return error(res, 400, 'This connection request expired. Start again from your AI assistant.');
|
|
85
|
+
res.json({ ...await connection(query), ...await account(logged.user) });
|
|
86
|
+
});
|
|
87
|
+
api.post('/connect', async (req, res) => {
|
|
88
|
+
const logged = await verified(req);
|
|
89
|
+
if (!logged)
|
|
90
|
+
return error(res, 401, 'Sign in to continue.');
|
|
91
|
+
const query = await validQuery(req.body?.oauth_query);
|
|
92
|
+
if (!query || !['continue', 'deny'].includes(req.body?.decision) ||
|
|
93
|
+
Object.keys(req.body ?? {}).some(key => !['oauth_query', 'decision', 'apiKey'].includes(key))) {
|
|
94
|
+
return error(res, 400, 'Connection authorization failed.');
|
|
95
|
+
}
|
|
96
|
+
if (req.body.decision === 'deny') {
|
|
97
|
+
await store.clearConnectionStep(logged.session.id);
|
|
98
|
+
return continueWith(req, res, '/oauth2/consent', { oauth_query: query, accept: false });
|
|
99
|
+
}
|
|
100
|
+
if (req.body.apiKey) {
|
|
101
|
+
const owner = personalOwner(logged.user.id);
|
|
102
|
+
if (!await store.allow(`key:${owner}`, 5, 60))
|
|
103
|
+
return error(res, 429, 'Too many key checks. Try again in one minute.');
|
|
104
|
+
const problem = await checkKey(req.body.apiKey, fetcher);
|
|
105
|
+
if (problem)
|
|
106
|
+
return error(res, 400, problem);
|
|
107
|
+
await store.saveKey(owner, req.body.apiKey, logged.user.id);
|
|
108
|
+
}
|
|
109
|
+
await store.markConnectionReady(logged.session.id, logged.user.id);
|
|
110
|
+
try {
|
|
111
|
+
return await continueWith(req, res, '/oauth2/continue', { oauth_query: query, postLogin: true });
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
// Better Auth signs the completed step into the consent query. New flows
|
|
115
|
+
// must visit Connect again; keep no reusable browser-wide selection.
|
|
116
|
+
await store.clearConnectionStep(logged.session.id);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
api.get('/account', async (req, res) => {
|
|
120
|
+
const logged = await verified(req);
|
|
121
|
+
if (!logged)
|
|
122
|
+
return error(res, 401, 'Sign in to continue.');
|
|
123
|
+
res.json(await account(logged.user));
|
|
124
|
+
});
|
|
125
|
+
api.post('/keys', async (req, res) => {
|
|
126
|
+
const logged = await verified(req);
|
|
127
|
+
if (!logged)
|
|
128
|
+
return error(res, 401, 'Sign in to continue.');
|
|
129
|
+
if (Object.keys(req.body ?? {}).some(key => key !== 'apiKey'))
|
|
130
|
+
return error(res, 400, 'Only apiKey is accepted.');
|
|
131
|
+
const owner = personalOwner(logged.user.id);
|
|
132
|
+
if (!await store.allow(`key:${owner}`, 5, 60))
|
|
133
|
+
return error(res, 429, 'Too many key checks. Try again in one minute.');
|
|
134
|
+
const problem = await checkKey(req.body?.apiKey, fetcher);
|
|
135
|
+
if (problem)
|
|
136
|
+
return error(res, 400, problem);
|
|
137
|
+
await store.saveKey(owner, req.body.apiKey, logged.user.id);
|
|
138
|
+
res.json({ saved: true });
|
|
139
|
+
});
|
|
140
|
+
api.post('/keys/delete', async (req, res) => {
|
|
141
|
+
const logged = await verified(req);
|
|
142
|
+
if (!logged)
|
|
143
|
+
return error(res, 401, 'Sign in to continue.');
|
|
144
|
+
if (Object.keys(req.body ?? {}).length)
|
|
145
|
+
return error(res, 400, 'No parameters are accepted.');
|
|
146
|
+
await store.deleteKey(personalOwner(logged.user.id), logged.user.id);
|
|
147
|
+
res.json({ deleted: true });
|
|
148
|
+
});
|
|
149
|
+
api.get('/consent', async (req, res) => {
|
|
150
|
+
const logged = await verified(req);
|
|
151
|
+
if (!logged)
|
|
152
|
+
return error(res, 401, 'Sign in to continue.');
|
|
153
|
+
const query = await validQuery(req.query.oauth_query);
|
|
154
|
+
if (!query)
|
|
155
|
+
return error(res, 400, 'This connection request expired. Start again from your AI assistant.');
|
|
156
|
+
const key = await store.keyStatus(personalOwner(logged.user.id));
|
|
157
|
+
res.json({ ...await connection(query), email: logged.user.email, key: { personal: key.connected } });
|
|
158
|
+
});
|
|
159
|
+
api.post('/consent', async (req, res) => {
|
|
160
|
+
const logged = await verified(req);
|
|
161
|
+
if (!logged)
|
|
162
|
+
return error(res, 401, 'Sign in to continue.');
|
|
163
|
+
const query = await validQuery(req.body?.oauth_query);
|
|
164
|
+
if (!query || typeof req.body?.accept !== 'boolean')
|
|
165
|
+
return error(res, 400, 'Connection authorization failed.');
|
|
166
|
+
return continueWith(req, res, '/oauth2/consent', { oauth_query: query, accept: req.body.accept });
|
|
167
|
+
});
|
|
168
|
+
app.use('/api/portal', api);
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=portal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portal.js","sourceRoot":"","sources":["../../src/accounts/portal.ts"],"names":[],"mappings":"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"}
|