@nestr/mcp 0.1.8
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 +21 -0
- package/README.md +228 -0
- package/build/api/client.d.ts +211 -0
- package/build/api/client.d.ts.map +1 -0
- package/build/api/client.js +279 -0
- package/build/api/client.js.map +1 -0
- package/build/http.d.ts +25 -0
- package/build/http.d.ts.map +1 -0
- package/build/http.js +810 -0
- package/build/http.js.map +1 -0
- package/build/index.d.ts +15 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +62 -0
- package/build/index.js.map +1 -0
- package/build/oauth/config.d.ts +70 -0
- package/build/oauth/config.d.ts.map +1 -0
- package/build/oauth/config.js +86 -0
- package/build/oauth/config.js.map +1 -0
- package/build/oauth/flow.d.ts +113 -0
- package/build/oauth/flow.d.ts.map +1 -0
- package/build/oauth/flow.js +233 -0
- package/build/oauth/flow.js.map +1 -0
- package/build/oauth/storage.d.ts +65 -0
- package/build/oauth/storage.d.ts.map +1 -0
- package/build/oauth/storage.js +222 -0
- package/build/oauth/storage.js.map +1 -0
- package/build/server.d.ts +11 -0
- package/build/server.d.ts.map +1 -0
- package/build/server.js +383 -0
- package/build/server.js.map +1 -0
- package/build/tools/index.d.ts +1049 -0
- package/build/tools/index.d.ts.map +1 -0
- package/build/tools/index.js +711 -0
- package/build/tools/index.js.map +1 -0
- package/package.json +58 -0
- package/web/index.html +595 -0
- package/web/styles.css +700 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../../src/oauth/flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent Storage for OAuth Data
|
|
3
|
+
*
|
|
4
|
+
* Stores registered OAuth clients and pending auth requests to disk.
|
|
5
|
+
* Uses a simple JSON file-based storage that persists across restarts.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Registered OAuth Client (RFC 7591)
|
|
9
|
+
*/
|
|
10
|
+
export interface RegisteredClient {
|
|
11
|
+
client_id: string;
|
|
12
|
+
client_secret?: string;
|
|
13
|
+
client_name?: string;
|
|
14
|
+
redirect_uris: string[];
|
|
15
|
+
grant_types: string[];
|
|
16
|
+
response_types: string[];
|
|
17
|
+
token_endpoint_auth_method: string;
|
|
18
|
+
scope?: string;
|
|
19
|
+
registered_at: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Pending OAuth authorization with PKCE
|
|
23
|
+
*/
|
|
24
|
+
export interface PendingAuthWithPKCE {
|
|
25
|
+
state: string;
|
|
26
|
+
redirectUri: string;
|
|
27
|
+
clientId: string;
|
|
28
|
+
codeChallenge?: string;
|
|
29
|
+
codeChallengeMethod?: string;
|
|
30
|
+
createdAt: number;
|
|
31
|
+
scope?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Register a new OAuth client
|
|
35
|
+
*/
|
|
36
|
+
export declare function registerClient(client: RegisteredClient): void;
|
|
37
|
+
/**
|
|
38
|
+
* Get a registered client by ID
|
|
39
|
+
*/
|
|
40
|
+
export declare function getClient(clientId: string): RegisteredClient | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Check if a client ID exists
|
|
43
|
+
*/
|
|
44
|
+
export declare function clientExists(clientId: string): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Validate client credentials
|
|
47
|
+
*/
|
|
48
|
+
export declare function validateClientCredentials(clientId: string, clientSecret?: string): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Validate redirect URI for a client
|
|
51
|
+
*/
|
|
52
|
+
export declare function validateRedirectUri(clientId: string, redirectUri: string): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Store a pending auth request
|
|
55
|
+
*/
|
|
56
|
+
export declare function storePendingAuth(pending: PendingAuthWithPKCE): void;
|
|
57
|
+
/**
|
|
58
|
+
* Get and remove a pending auth request
|
|
59
|
+
*/
|
|
60
|
+
export declare function consumePendingAuth(state: string): PendingAuthWithPKCE | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* Cleanup expired pending auth requests
|
|
63
|
+
*/
|
|
64
|
+
export declare function cleanupExpiredPendingAuth(): void;
|
|
65
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/oauth/storage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,0BAA0B,EAAE,MAAM,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA6GD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAK7D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAGxE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGtD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAST;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CA0BT;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAInE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,GACZ,mBAAmB,GAAG,SAAS,CAkBjC;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAgBhD"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent Storage for OAuth Data
|
|
3
|
+
*
|
|
4
|
+
* Stores registered OAuth clients and pending auth requests to disk.
|
|
5
|
+
* Uses a simple JSON file-based storage that persists across restarts.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
// Storage directory - use /data in production (mounted volume), fallback to local .data
|
|
10
|
+
const STORAGE_DIR = process.env.OAUTH_STORAGE_DIR ||
|
|
11
|
+
(process.env.NODE_ENV === "production" ? "/data" : ".data");
|
|
12
|
+
const CLIENTS_FILE = join(STORAGE_DIR, "oauth-clients.json");
|
|
13
|
+
const PENDING_AUTH_FILE = join(STORAGE_DIR, "pending-auth.json");
|
|
14
|
+
// In-memory cache backed by disk
|
|
15
|
+
let clientsCache = null;
|
|
16
|
+
let pendingAuthCache = null;
|
|
17
|
+
/**
|
|
18
|
+
* Ensure storage directory exists
|
|
19
|
+
*/
|
|
20
|
+
function ensureStorageDir() {
|
|
21
|
+
if (!existsSync(STORAGE_DIR)) {
|
|
22
|
+
mkdirSync(STORAGE_DIR, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Load registered clients from disk
|
|
27
|
+
*/
|
|
28
|
+
function loadClients() {
|
|
29
|
+
if (clientsCache)
|
|
30
|
+
return clientsCache;
|
|
31
|
+
ensureStorageDir();
|
|
32
|
+
clientsCache = new Map();
|
|
33
|
+
if (existsSync(CLIENTS_FILE)) {
|
|
34
|
+
try {
|
|
35
|
+
const data = JSON.parse(readFileSync(CLIENTS_FILE, "utf-8"));
|
|
36
|
+
for (const [id, client] of Object.entries(data)) {
|
|
37
|
+
clientsCache.set(id, client);
|
|
38
|
+
}
|
|
39
|
+
console.log(`Loaded ${clientsCache.size} registered OAuth clients`);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
console.error("Failed to load OAuth clients:", error);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return clientsCache;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Save registered clients to disk
|
|
49
|
+
*/
|
|
50
|
+
function saveClients() {
|
|
51
|
+
if (!clientsCache)
|
|
52
|
+
return;
|
|
53
|
+
ensureStorageDir();
|
|
54
|
+
const data = {};
|
|
55
|
+
for (const [id, client] of clientsCache) {
|
|
56
|
+
data[id] = client;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
writeFileSync(CLIENTS_FILE, JSON.stringify(data, null, 2));
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.error("Failed to save OAuth clients:", error);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Load pending auth requests from disk
|
|
67
|
+
*/
|
|
68
|
+
function loadPendingAuth() {
|
|
69
|
+
if (pendingAuthCache)
|
|
70
|
+
return pendingAuthCache;
|
|
71
|
+
ensureStorageDir();
|
|
72
|
+
pendingAuthCache = new Map();
|
|
73
|
+
if (existsSync(PENDING_AUTH_FILE)) {
|
|
74
|
+
try {
|
|
75
|
+
const data = JSON.parse(readFileSync(PENDING_AUTH_FILE, "utf-8"));
|
|
76
|
+
const now = Date.now();
|
|
77
|
+
const TTL = 5 * 60 * 1000; // 5 minutes
|
|
78
|
+
for (const [state, pending] of Object.entries(data)) {
|
|
79
|
+
const p = pending;
|
|
80
|
+
// Only load non-expired entries
|
|
81
|
+
if (now - p.createdAt < TTL) {
|
|
82
|
+
pendingAuthCache.set(state, p);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
console.error("Failed to load pending auth:", error);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return pendingAuthCache;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Save pending auth requests to disk
|
|
94
|
+
*/
|
|
95
|
+
function savePendingAuth() {
|
|
96
|
+
if (!pendingAuthCache)
|
|
97
|
+
return;
|
|
98
|
+
ensureStorageDir();
|
|
99
|
+
const data = {};
|
|
100
|
+
for (const [state, pending] of pendingAuthCache) {
|
|
101
|
+
data[state] = pending;
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
writeFileSync(PENDING_AUTH_FILE, JSON.stringify(data, null, 2));
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
console.error("Failed to save pending auth:", error);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// ============ Client Registration ============
|
|
111
|
+
/**
|
|
112
|
+
* Register a new OAuth client
|
|
113
|
+
*/
|
|
114
|
+
export function registerClient(client) {
|
|
115
|
+
const clients = loadClients();
|
|
116
|
+
clients.set(client.client_id, client);
|
|
117
|
+
saveClients();
|
|
118
|
+
console.log(`Registered OAuth client: ${client.client_id}`);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get a registered client by ID
|
|
122
|
+
*/
|
|
123
|
+
export function getClient(clientId) {
|
|
124
|
+
const clients = loadClients();
|
|
125
|
+
return clients.get(clientId);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Check if a client ID exists
|
|
129
|
+
*/
|
|
130
|
+
export function clientExists(clientId) {
|
|
131
|
+
const clients = loadClients();
|
|
132
|
+
return clients.has(clientId);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Validate client credentials
|
|
136
|
+
*/
|
|
137
|
+
export function validateClientCredentials(clientId, clientSecret) {
|
|
138
|
+
const client = getClient(clientId);
|
|
139
|
+
if (!client)
|
|
140
|
+
return false;
|
|
141
|
+
// If client has no secret (public client), accept
|
|
142
|
+
if (!client.client_secret)
|
|
143
|
+
return true;
|
|
144
|
+
// Otherwise validate secret
|
|
145
|
+
return client.client_secret === clientSecret;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Validate redirect URI for a client
|
|
149
|
+
*/
|
|
150
|
+
export function validateRedirectUri(clientId, redirectUri) {
|
|
151
|
+
const client = getClient(clientId);
|
|
152
|
+
if (!client)
|
|
153
|
+
return false;
|
|
154
|
+
return client.redirect_uris.some((uri) => {
|
|
155
|
+
// Exact match or localhost with any port
|
|
156
|
+
if (uri === redirectUri)
|
|
157
|
+
return true;
|
|
158
|
+
// Handle localhost wildcards (common for CLI tools)
|
|
159
|
+
try {
|
|
160
|
+
const registered = new URL(uri);
|
|
161
|
+
const requested = new URL(redirectUri);
|
|
162
|
+
if (registered.hostname === "localhost" &&
|
|
163
|
+
requested.hostname === "localhost" &&
|
|
164
|
+
registered.pathname === requested.pathname) {
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
// Invalid URLs, skip
|
|
170
|
+
}
|
|
171
|
+
return false;
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
// ============ Pending Auth with PKCE ============
|
|
175
|
+
/**
|
|
176
|
+
* Store a pending auth request
|
|
177
|
+
*/
|
|
178
|
+
export function storePendingAuth(pending) {
|
|
179
|
+
const cache = loadPendingAuth();
|
|
180
|
+
cache.set(pending.state, pending);
|
|
181
|
+
savePendingAuth();
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get and remove a pending auth request
|
|
185
|
+
*/
|
|
186
|
+
export function consumePendingAuth(state) {
|
|
187
|
+
const cache = loadPendingAuth();
|
|
188
|
+
const pending = cache.get(state);
|
|
189
|
+
if (!pending)
|
|
190
|
+
return undefined;
|
|
191
|
+
// Check if expired (5 minutes)
|
|
192
|
+
if (Date.now() - pending.createdAt > 5 * 60 * 1000) {
|
|
193
|
+
cache.delete(state);
|
|
194
|
+
savePendingAuth();
|
|
195
|
+
return undefined;
|
|
196
|
+
}
|
|
197
|
+
// Remove from cache (one-time use)
|
|
198
|
+
cache.delete(state);
|
|
199
|
+
savePendingAuth();
|
|
200
|
+
return pending;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Cleanup expired pending auth requests
|
|
204
|
+
*/
|
|
205
|
+
export function cleanupExpiredPendingAuth() {
|
|
206
|
+
const cache = loadPendingAuth();
|
|
207
|
+
const now = Date.now();
|
|
208
|
+
const TTL = 5 * 60 * 1000;
|
|
209
|
+
let cleaned = 0;
|
|
210
|
+
for (const [state, pending] of cache) {
|
|
211
|
+
if (now - pending.createdAt > TTL) {
|
|
212
|
+
cache.delete(state);
|
|
213
|
+
cleaned++;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if (cleaned > 0) {
|
|
217
|
+
savePendingAuth();
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Run cleanup every minute
|
|
221
|
+
setInterval(cleanupExpiredPendingAuth, 60000);
|
|
222
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/oauth/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nestr MCP Server
|
|
3
|
+
* Core server setup and configuration
|
|
4
|
+
*/
|
|
5
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
6
|
+
import { NestrClient } from "./api/client.js";
|
|
7
|
+
export interface NestrMcpServerConfig {
|
|
8
|
+
client?: NestrClient;
|
|
9
|
+
}
|
|
10
|
+
export declare function createServer(config?: NestrMcpServerConfig): Server;
|
|
11
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAOnE,OAAO,EAAE,WAAW,EAAuB,MAAM,iBAAiB,CAAC;AAGnE,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAkSD,wBAAgB,YAAY,CAAC,MAAM,GAAE,oBAAyB,GAAG,MAAM,CAmGtE"}
|