db-mcp 1.0.1
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 +860 -0
- package/dist/adapters/DatabaseAdapter.d.ts +141 -0
- package/dist/adapters/DatabaseAdapter.d.ts.map +1 -0
- package/dist/adapters/DatabaseAdapter.js +131 -0
- package/dist/adapters/DatabaseAdapter.js.map +1 -0
- package/dist/adapters/sqlite/SchemaManager.d.ts +58 -0
- package/dist/adapters/sqlite/SchemaManager.d.ts.map +1 -0
- package/dist/adapters/sqlite/SchemaManager.js +187 -0
- package/dist/adapters/sqlite/SchemaManager.js.map +1 -0
- package/dist/adapters/sqlite/SqliteAdapter.d.ts +161 -0
- package/dist/adapters/sqlite/SqliteAdapter.d.ts.map +1 -0
- package/dist/adapters/sqlite/SqliteAdapter.js +741 -0
- package/dist/adapters/sqlite/SqliteAdapter.js.map +1 -0
- package/dist/adapters/sqlite/index.d.ts +9 -0
- package/dist/adapters/sqlite/index.d.ts.map +1 -0
- package/dist/adapters/sqlite/index.js +8 -0
- package/dist/adapters/sqlite/index.js.map +1 -0
- package/dist/adapters/sqlite/json-utils.d.ts +100 -0
- package/dist/adapters/sqlite/json-utils.d.ts.map +1 -0
- package/dist/adapters/sqlite/json-utils.js +274 -0
- package/dist/adapters/sqlite/json-utils.js.map +1 -0
- package/dist/adapters/sqlite/output-schemas.d.ts +1187 -0
- package/dist/adapters/sqlite/output-schemas.d.ts.map +1 -0
- package/dist/adapters/sqlite/output-schemas.js +1337 -0
- package/dist/adapters/sqlite/output-schemas.js.map +1 -0
- package/dist/adapters/sqlite/prompts.d.ts +13 -0
- package/dist/adapters/sqlite/prompts.d.ts.map +1 -0
- package/dist/adapters/sqlite/prompts.js +605 -0
- package/dist/adapters/sqlite/prompts.js.map +1 -0
- package/dist/adapters/sqlite/resources.d.ts +13 -0
- package/dist/adapters/sqlite/resources.d.ts.map +1 -0
- package/dist/adapters/sqlite/resources.js +251 -0
- package/dist/adapters/sqlite/resources.js.map +1 -0
- package/dist/adapters/sqlite/tools/admin.d.ts +14 -0
- package/dist/adapters/sqlite/tools/admin.d.ts.map +1 -0
- package/dist/adapters/sqlite/tools/admin.js +788 -0
- package/dist/adapters/sqlite/tools/admin.js.map +1 -0
- package/dist/adapters/sqlite/tools/core.d.ts +25 -0
- package/dist/adapters/sqlite/tools/core.d.ts.map +1 -0
- package/dist/adapters/sqlite/tools/core.js +359 -0
- package/dist/adapters/sqlite/tools/core.js.map +1 -0
- package/dist/adapters/sqlite/tools/fts.d.ts +13 -0
- package/dist/adapters/sqlite/tools/fts.d.ts.map +1 -0
- package/dist/adapters/sqlite/tools/fts.js +347 -0
- package/dist/adapters/sqlite/tools/fts.js.map +1 -0
- package/dist/adapters/sqlite/tools/geo.d.ts +14 -0
- package/dist/adapters/sqlite/tools/geo.d.ts.map +1 -0
- package/dist/adapters/sqlite/tools/geo.js +252 -0
- package/dist/adapters/sqlite/tools/geo.js.map +1 -0
- package/dist/adapters/sqlite/tools/index.d.ts +30 -0
- package/dist/adapters/sqlite/tools/index.d.ts.map +1 -0
- package/dist/adapters/sqlite/tools/index.js +61 -0
- package/dist/adapters/sqlite/tools/index.js.map +1 -0
- package/dist/adapters/sqlite/tools/json-helpers.d.ts +14 -0
- package/dist/adapters/sqlite/tools/json-helpers.d.ts.map +1 -0
- package/dist/adapters/sqlite/tools/json-helpers.js +477 -0
- package/dist/adapters/sqlite/tools/json-helpers.js.map +1 -0
- package/dist/adapters/sqlite/tools/json-operations.d.ts +14 -0
- package/dist/adapters/sqlite/tools/json-operations.d.ts.map +1 -0
- package/dist/adapters/sqlite/tools/json-operations.js +839 -0
- package/dist/adapters/sqlite/tools/json-operations.js.map +1 -0
- package/dist/adapters/sqlite/tools/stats.d.ts +15 -0
- package/dist/adapters/sqlite/tools/stats.d.ts.map +1 -0
- package/dist/adapters/sqlite/tools/stats.js +1219 -0
- package/dist/adapters/sqlite/tools/stats.js.map +1 -0
- package/dist/adapters/sqlite/tools/text.d.ts +14 -0
- package/dist/adapters/sqlite/tools/text.d.ts.map +1 -0
- package/dist/adapters/sqlite/tools/text.js +1141 -0
- package/dist/adapters/sqlite/tools/text.js.map +1 -0
- package/dist/adapters/sqlite/tools/vector.d.ts +14 -0
- package/dist/adapters/sqlite/tools/vector.d.ts.map +1 -0
- package/dist/adapters/sqlite/tools/vector.js +613 -0
- package/dist/adapters/sqlite/tools/vector.js.map +1 -0
- package/dist/adapters/sqlite/tools/virtual.d.ts +13 -0
- package/dist/adapters/sqlite/tools/virtual.d.ts.map +1 -0
- package/dist/adapters/sqlite/tools/virtual.js +930 -0
- package/dist/adapters/sqlite/tools/virtual.js.map +1 -0
- package/dist/adapters/sqlite/types.d.ts +207 -0
- package/dist/adapters/sqlite/types.d.ts.map +1 -0
- package/dist/adapters/sqlite/types.js +186 -0
- package/dist/adapters/sqlite/types.js.map +1 -0
- package/dist/adapters/sqlite-native/NativeSqliteAdapter.d.ts +163 -0
- package/dist/adapters/sqlite-native/NativeSqliteAdapter.d.ts.map +1 -0
- package/dist/adapters/sqlite-native/NativeSqliteAdapter.js +748 -0
- package/dist/adapters/sqlite-native/NativeSqliteAdapter.js.map +1 -0
- package/dist/adapters/sqlite-native/index.d.ts +11 -0
- package/dist/adapters/sqlite-native/index.d.ts.map +1 -0
- package/dist/adapters/sqlite-native/index.js +11 -0
- package/dist/adapters/sqlite-native/index.js.map +1 -0
- package/dist/adapters/sqlite-native/tools/spatialite.d.ts +19 -0
- package/dist/adapters/sqlite-native/tools/spatialite.d.ts.map +1 -0
- package/dist/adapters/sqlite-native/tools/spatialite.js +628 -0
- package/dist/adapters/sqlite-native/tools/spatialite.js.map +1 -0
- package/dist/adapters/sqlite-native/tools/transactions.d.ts +12 -0
- package/dist/adapters/sqlite-native/tools/transactions.d.ts.map +1 -0
- package/dist/adapters/sqlite-native/tools/transactions.js +255 -0
- package/dist/adapters/sqlite-native/tools/transactions.js.map +1 -0
- package/dist/adapters/sqlite-native/tools/window.d.ts +12 -0
- package/dist/adapters/sqlite-native/tools/window.d.ts.map +1 -0
- package/dist/adapters/sqlite-native/tools/window.js +370 -0
- package/dist/adapters/sqlite-native/tools/window.js.map +1 -0
- package/dist/auth/AuthorizationServerDiscovery.d.ts +90 -0
- package/dist/auth/AuthorizationServerDiscovery.d.ts.map +1 -0
- package/dist/auth/AuthorizationServerDiscovery.js +204 -0
- package/dist/auth/AuthorizationServerDiscovery.js.map +1 -0
- package/dist/auth/OAuthResourceServer.d.ts +65 -0
- package/dist/auth/OAuthResourceServer.d.ts.map +1 -0
- package/dist/auth/OAuthResourceServer.js +121 -0
- package/dist/auth/OAuthResourceServer.js.map +1 -0
- package/dist/auth/TokenValidator.d.ts +60 -0
- package/dist/auth/TokenValidator.d.ts.map +1 -0
- package/dist/auth/TokenValidator.js +235 -0
- package/dist/auth/TokenValidator.js.map +1 -0
- package/dist/auth/errors.d.ts +74 -0
- package/dist/auth/errors.d.ts.map +1 -0
- package/dist/auth/errors.js +133 -0
- package/dist/auth/errors.js.map +1 -0
- package/dist/auth/index.d.ts +13 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +15 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +81 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +291 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/scopes.d.ts +136 -0
- package/dist/auth/scopes.d.ts.map +1 -0
- package/dist/auth/scopes.js +349 -0
- package/dist/auth/scopes.js.map +1 -0
- package/dist/auth/types.d.ts +257 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +8 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +236 -0
- package/dist/cli.js.map +1 -0
- package/dist/constants/ServerInstructions.d.ts +45 -0
- package/dist/constants/ServerInstructions.d.ts.map +1 -0
- package/dist/constants/ServerInstructions.js +356 -0
- package/dist/constants/ServerInstructions.js.map +1 -0
- package/dist/filtering/ToolConstants.d.ts +34 -0
- package/dist/filtering/ToolConstants.d.ts.map +1 -0
- package/dist/filtering/ToolConstants.js +174 -0
- package/dist/filtering/ToolConstants.js.map +1 -0
- package/dist/filtering/ToolFilter.d.ts +82 -0
- package/dist/filtering/ToolFilter.d.ts.map +1 -0
- package/dist/filtering/ToolFilter.js +296 -0
- package/dist/filtering/ToolFilter.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/server/McpServer.d.ts +61 -0
- package/dist/server/McpServer.d.ts.map +1 -0
- package/dist/server/McpServer.js +270 -0
- package/dist/server/McpServer.js.map +1 -0
- package/dist/transports/http.d.ts +134 -0
- package/dist/transports/http.d.ts.map +1 -0
- package/dist/transports/http.js +516 -0
- package/dist/transports/http.js.map +1 -0
- package/dist/transports/index.d.ts +5 -0
- package/dist/transports/index.d.ts.map +1 -0
- package/dist/transports/index.js +5 -0
- package/dist/transports/index.js.map +1 -0
- package/dist/types/index.d.ts +380 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +68 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/annotations.d.ts +44 -0
- package/dist/utils/annotations.d.ts.map +1 -0
- package/dist/utils/annotations.js +77 -0
- package/dist/utils/annotations.js.map +1 -0
- package/dist/utils/errors.d.ts +155 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +329 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/identifiers.d.ts +121 -0
- package/dist/utils/identifiers.d.ts.map +1 -0
- package/dist/utils/identifiers.js +319 -0
- package/dist/utils/identifiers.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/insightsManager.d.ts +39 -0
- package/dist/utils/insightsManager.d.ts.map +1 -0
- package/dist/utils/insightsManager.js +63 -0
- package/dist/utils/insightsManager.js.map +1 -0
- package/dist/utils/logger.d.ts +189 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +394 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/progress-utils.d.ts +54 -0
- package/dist/utils/progress-utils.d.ts.map +1 -0
- package/dist/utils/progress-utils.js +74 -0
- package/dist/utils/progress-utils.js.map +1 -0
- package/dist/utils/resourceAnnotations.d.ts +36 -0
- package/dist/utils/resourceAnnotations.d.ts.map +1 -0
- package/dist/utils/resourceAnnotations.js +57 -0
- package/dist/utils/resourceAnnotations.js.map +1 -0
- package/dist/utils/where-clause.d.ts +41 -0
- package/dist/utils/where-clause.d.ts.map +1 -0
- package/dist/utils/where-clause.js +116 -0
- package/dist/utils/where-clause.js.map +1 -0
- package/package.json +83 -0
- package/server.json +53 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db-mcp - OAuth Middleware
|
|
3
|
+
*
|
|
4
|
+
* Express middleware for OAuth 2.0 authentication and authorization.
|
|
5
|
+
* Extracts Bearer tokens, validates them, and enforces scope requirements.
|
|
6
|
+
*/
|
|
7
|
+
import { TokenMissingError, InvalidTokenError, InsufficientScopeError, isOAuthError, } from "./errors.js";
|
|
8
|
+
import { scopesGrantToolAccess } from "./scopes.js";
|
|
9
|
+
import { createModuleLogger, ERROR_CODES } from "../utils/logger.js";
|
|
10
|
+
const logger = createModuleLogger("AUTH");
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// Token Extraction
|
|
13
|
+
// =============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Extract Bearer token from Authorization header
|
|
16
|
+
*
|
|
17
|
+
* @param authHeader - Authorization header value
|
|
18
|
+
* @returns The token or null if not present/invalid
|
|
19
|
+
*/
|
|
20
|
+
export function extractBearerToken(authHeader) {
|
|
21
|
+
if (!authHeader) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
// Check for Bearer scheme (case-insensitive)
|
|
25
|
+
const parts = authHeader.split(" ");
|
|
26
|
+
const scheme = parts[0];
|
|
27
|
+
const tokenPart = parts[1];
|
|
28
|
+
if (parts.length !== 2 || scheme?.toLowerCase() !== "bearer") {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
if (tokenPart === undefined) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const token = tokenPart.trim();
|
|
35
|
+
return token.length > 0 ? token : null;
|
|
36
|
+
}
|
|
37
|
+
// =============================================================================
|
|
38
|
+
// Path Matching
|
|
39
|
+
// =============================================================================
|
|
40
|
+
/**
|
|
41
|
+
* Check if a path matches any of the public path patterns
|
|
42
|
+
*
|
|
43
|
+
* Supports:
|
|
44
|
+
* - Exact matches: '/health' matches '/health'
|
|
45
|
+
* - Wildcard suffix: '/api/*' matches '/api/users', '/api/posts/1'
|
|
46
|
+
* - Well-known paths are always public
|
|
47
|
+
*/
|
|
48
|
+
function isPublicPath(path, publicPaths) {
|
|
49
|
+
// Well-known paths are always public (RFC requirement)
|
|
50
|
+
if (path.startsWith("/.well-known/")) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
for (const pattern of publicPaths) {
|
|
54
|
+
// Exact match
|
|
55
|
+
if (pattern === path) {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
// Wildcard match
|
|
59
|
+
if (pattern.endsWith("/*")) {
|
|
60
|
+
const prefix = pattern.slice(0, -2);
|
|
61
|
+
if (path === prefix || path.startsWith(prefix + "/")) {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
// =============================================================================
|
|
69
|
+
// Main Authentication Middleware
|
|
70
|
+
// =============================================================================
|
|
71
|
+
/**
|
|
72
|
+
* Create the main authentication middleware
|
|
73
|
+
*
|
|
74
|
+
* This middleware:
|
|
75
|
+
* 1. Skips authentication for public paths (e.g., /.well-known/*)
|
|
76
|
+
* 2. Extracts Bearer token from Authorization header
|
|
77
|
+
* 3. Validates the token using the TokenValidator
|
|
78
|
+
* 4. Attaches validated claims to req.auth
|
|
79
|
+
* 5. Returns 401 with WWW-Authenticate header on failure
|
|
80
|
+
*/
|
|
81
|
+
export function createAuthMiddleware(config) {
|
|
82
|
+
const { tokenValidator, resourceServer, publicPaths = [] } = config;
|
|
83
|
+
return async (req, res, next) => {
|
|
84
|
+
// Generate request ID for tracing
|
|
85
|
+
const requestId = crypto.randomUUID();
|
|
86
|
+
req.requestId = requestId;
|
|
87
|
+
// Check if path is public
|
|
88
|
+
if (isPublicPath(req.path, publicPaths)) {
|
|
89
|
+
logger.info(`Public path accessed: ${req.path}`, {
|
|
90
|
+
code: "AUTH_PUBLIC_PATH",
|
|
91
|
+
requestId,
|
|
92
|
+
path: req.path,
|
|
93
|
+
});
|
|
94
|
+
next();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
// Extract Bearer token
|
|
98
|
+
const token = extractBearerToken(req.headers.authorization);
|
|
99
|
+
if (!token) {
|
|
100
|
+
const error = new TokenMissingError(resourceServer.getResourceUri());
|
|
101
|
+
logger.warning("No access token provided", {
|
|
102
|
+
code: ERROR_CODES.AUTH.TOKEN_MISSING.full,
|
|
103
|
+
requestId,
|
|
104
|
+
path: req.path,
|
|
105
|
+
});
|
|
106
|
+
res.status(error.httpStatus);
|
|
107
|
+
res.setHeader("WWW-Authenticate", error.wwwAuthenticate ?? "");
|
|
108
|
+
res.json({
|
|
109
|
+
error: "unauthorized",
|
|
110
|
+
error_description: error.message,
|
|
111
|
+
});
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
// Validate token
|
|
115
|
+
const result = await tokenValidator.validate(token);
|
|
116
|
+
if (!result.valid) {
|
|
117
|
+
// Create error for logging (variable intentionally used only for type check)
|
|
118
|
+
new InvalidTokenError(result.error);
|
|
119
|
+
logger.warning(`Token validation failed: ${result.error ?? "Unknown error"}`, {
|
|
120
|
+
code: result.errorCode ?? ERROR_CODES.AUTH.TOKEN_INVALID.full,
|
|
121
|
+
requestId,
|
|
122
|
+
path: req.path,
|
|
123
|
+
});
|
|
124
|
+
res.status(401);
|
|
125
|
+
res.setHeader("WWW-Authenticate", resourceServer.getWWWAuthenticateHeader("invalid_token", result.error));
|
|
126
|
+
res.json({
|
|
127
|
+
error: "invalid_token",
|
|
128
|
+
error_description: result.error,
|
|
129
|
+
});
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
// Attach claims to request (claims is guaranteed defined when valid is true)
|
|
133
|
+
const claims = result.claims;
|
|
134
|
+
if (!claims) {
|
|
135
|
+
// Should not happen when valid is true, but satisfies TypeScript
|
|
136
|
+
res.status(500).json({ error: "internal_error" });
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
req.auth = claims;
|
|
140
|
+
req.accessToken = token;
|
|
141
|
+
logger.info(`Request authenticated: ${claims.sub}`, {
|
|
142
|
+
code: "AUTH_SUCCESS",
|
|
143
|
+
requestId,
|
|
144
|
+
sub: claims.sub,
|
|
145
|
+
scopes: claims.scopes.length,
|
|
146
|
+
path: req.path,
|
|
147
|
+
});
|
|
148
|
+
next();
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
// =============================================================================
|
|
152
|
+
// Scope Enforcement Middleware
|
|
153
|
+
// =============================================================================
|
|
154
|
+
/**
|
|
155
|
+
* Middleware factory that requires a specific scope
|
|
156
|
+
*
|
|
157
|
+
* @param scope - Required scope
|
|
158
|
+
* @returns Express middleware
|
|
159
|
+
*/
|
|
160
|
+
export function requireScope(scope) {
|
|
161
|
+
return (req, res, next) => {
|
|
162
|
+
if (!req.auth) {
|
|
163
|
+
// Should not happen if auth middleware is applied first
|
|
164
|
+
res.status(401).json({
|
|
165
|
+
error: "unauthorized",
|
|
166
|
+
error_description: "Authentication required",
|
|
167
|
+
});
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const hasScope = req.auth.scopes.includes(scope) || req.auth.scopes.includes("admin"); // Admin scope grants all
|
|
171
|
+
if (!hasScope) {
|
|
172
|
+
const error = new InsufficientScopeError(scope, req.auth.scopes);
|
|
173
|
+
logger.warning(`Insufficient scope: required ${scope}`, {
|
|
174
|
+
code: ERROR_CODES.AUTH.SCOPE_DENIED.full,
|
|
175
|
+
requestId: req.requestId,
|
|
176
|
+
requiredScope: scope,
|
|
177
|
+
providedScopes: req.auth.scopes,
|
|
178
|
+
});
|
|
179
|
+
res.status(error.httpStatus);
|
|
180
|
+
res.setHeader("WWW-Authenticate", error.wwwAuthenticate ?? "");
|
|
181
|
+
res.json({
|
|
182
|
+
error: "insufficient_scope",
|
|
183
|
+
error_description: error.message,
|
|
184
|
+
required_scope: scope,
|
|
185
|
+
});
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
next();
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Middleware factory that requires any of the specified scopes
|
|
193
|
+
*
|
|
194
|
+
* @param scopes - Array of acceptable scopes (user must have at least one)
|
|
195
|
+
* @returns Express middleware
|
|
196
|
+
*/
|
|
197
|
+
export function requireAnyScope(scopes) {
|
|
198
|
+
return (req, res, next) => {
|
|
199
|
+
if (!req.auth) {
|
|
200
|
+
res.status(401).json({
|
|
201
|
+
error: "unauthorized",
|
|
202
|
+
error_description: "Authentication required",
|
|
203
|
+
});
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
// Admin scope grants all
|
|
207
|
+
if (req.auth.scopes.includes("admin")) {
|
|
208
|
+
next();
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
const hasAnyScope = scopes.some((scope) => req.auth?.scopes.includes(scope));
|
|
212
|
+
if (!hasAnyScope) {
|
|
213
|
+
const error = new InsufficientScopeError(scopes, req.auth.scopes);
|
|
214
|
+
logger.warning(`Insufficient scope: required one of [${scopes.join(", ")}]`, {
|
|
215
|
+
code: ERROR_CODES.AUTH.SCOPE_DENIED.full,
|
|
216
|
+
requestId: req.requestId,
|
|
217
|
+
requiredScopes: scopes,
|
|
218
|
+
providedScopes: req.auth.scopes,
|
|
219
|
+
});
|
|
220
|
+
res.status(error.httpStatus);
|
|
221
|
+
res.setHeader("WWW-Authenticate", error.wwwAuthenticate ?? "");
|
|
222
|
+
res.json({
|
|
223
|
+
error: "insufficient_scope",
|
|
224
|
+
error_description: error.message,
|
|
225
|
+
required_scopes: scopes,
|
|
226
|
+
});
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
next();
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Middleware factory that requires scope for a specific tool
|
|
234
|
+
*
|
|
235
|
+
* @param toolName - Name of the tool being accessed
|
|
236
|
+
* @returns Express middleware
|
|
237
|
+
*/
|
|
238
|
+
export function requireToolScope(toolName) {
|
|
239
|
+
return (req, res, next) => {
|
|
240
|
+
if (!req.auth) {
|
|
241
|
+
res.status(401).json({
|
|
242
|
+
error: "unauthorized",
|
|
243
|
+
error_description: "Authentication required",
|
|
244
|
+
});
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
const hasAccess = scopesGrantToolAccess(req.auth.scopes, toolName);
|
|
248
|
+
if (!hasAccess) {
|
|
249
|
+
const error = new InsufficientScopeError(`Tool access: ${toolName}`, req.auth.scopes);
|
|
250
|
+
logger.warning(`Insufficient scope for tool: ${toolName}`, {
|
|
251
|
+
code: ERROR_CODES.AUTH.SCOPE_DENIED.full,
|
|
252
|
+
requestId: req.requestId,
|
|
253
|
+
toolName,
|
|
254
|
+
providedScopes: req.auth.scopes,
|
|
255
|
+
});
|
|
256
|
+
res.status(error.httpStatus);
|
|
257
|
+
res.setHeader("WWW-Authenticate", error.wwwAuthenticate ?? "");
|
|
258
|
+
res.json({
|
|
259
|
+
error: "insufficient_scope",
|
|
260
|
+
error_description: `Access to tool '${toolName}' denied`,
|
|
261
|
+
tool: toolName,
|
|
262
|
+
});
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
next();
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
// =============================================================================
|
|
269
|
+
// Error Handler
|
|
270
|
+
// =============================================================================
|
|
271
|
+
/**
|
|
272
|
+
* Error handler middleware for OAuth errors
|
|
273
|
+
*
|
|
274
|
+
* Should be added after all routes to catch OAuth-related errors
|
|
275
|
+
*/
|
|
276
|
+
export function oauthErrorHandler(error, _req, res, next) {
|
|
277
|
+
if (isOAuthError(error)) {
|
|
278
|
+
res.status(error.httpStatus);
|
|
279
|
+
if (error.wwwAuthenticate) {
|
|
280
|
+
res.setHeader("WWW-Authenticate", error.wwwAuthenticate);
|
|
281
|
+
}
|
|
282
|
+
res.json({
|
|
283
|
+
error: error.code,
|
|
284
|
+
error_description: error.message,
|
|
285
|
+
});
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
// Pass to next error handler
|
|
289
|
+
next(error);
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db-mcp - OAuth Scopes
|
|
3
|
+
*
|
|
4
|
+
* Scope definitions and enforcement utilities for
|
|
5
|
+
* granular access control.
|
|
6
|
+
*
|
|
7
|
+
* Scope Patterns:
|
|
8
|
+
* - read : Read-only access to all databases
|
|
9
|
+
* - write : Read and write access to all databases
|
|
10
|
+
* - admin : Full administrative access
|
|
11
|
+
* - db:{name} : Access to specific database only
|
|
12
|
+
* - table:{db}:{table} : Access to specific table only
|
|
13
|
+
*/
|
|
14
|
+
import type { ToolGroup } from "../types/index.js";
|
|
15
|
+
/**
|
|
16
|
+
* Base scopes supported by the server
|
|
17
|
+
*/
|
|
18
|
+
export declare const BASE_SCOPES: readonly ["read", "write", "admin"];
|
|
19
|
+
/**
|
|
20
|
+
* Scope patterns (regex patterns for validation)
|
|
21
|
+
*/
|
|
22
|
+
export declare const SCOPE_PATTERNS: {
|
|
23
|
+
/** Read-only access */
|
|
24
|
+
readonly READ: "read";
|
|
25
|
+
/** Read and write access */
|
|
26
|
+
readonly WRITE: "write";
|
|
27
|
+
/** Full admin access */
|
|
28
|
+
readonly ADMIN: "admin";
|
|
29
|
+
/** Database-specific access pattern */
|
|
30
|
+
readonly DATABASE: RegExp;
|
|
31
|
+
/** Table-specific access pattern */
|
|
32
|
+
readonly TABLE: RegExp;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* All supported scope patterns for metadata
|
|
36
|
+
*/
|
|
37
|
+
export declare const SUPPORTED_SCOPES: readonly ["read", "write", "admin", "db:{database}", "table:{database}:{table}"];
|
|
38
|
+
/**
|
|
39
|
+
* Tool groups accessible with read scope (read-only operations)
|
|
40
|
+
*/
|
|
41
|
+
export declare const READ_SCOPE_GROUPS: ToolGroup[];
|
|
42
|
+
/**
|
|
43
|
+
* Tool groups accessible with write scope (read + write operations)
|
|
44
|
+
*/
|
|
45
|
+
export declare const WRITE_SCOPE_GROUPS: ToolGroup[];
|
|
46
|
+
/**
|
|
47
|
+
* Tool groups accessible with admin scope (all operations)
|
|
48
|
+
*/
|
|
49
|
+
export declare const ADMIN_SCOPE_GROUPS: ToolGroup[];
|
|
50
|
+
/**
|
|
51
|
+
* Read-only tools within the core group
|
|
52
|
+
* (used when scope is 'read' to filter write operations)
|
|
53
|
+
*/
|
|
54
|
+
export declare const READ_ONLY_TOOLS: Set<string>;
|
|
55
|
+
/**
|
|
56
|
+
* Write tools that require 'write' scope
|
|
57
|
+
*/
|
|
58
|
+
export declare const WRITE_TOOLS: Set<string>;
|
|
59
|
+
/**
|
|
60
|
+
* Admin tools that require 'admin' scope
|
|
61
|
+
*/
|
|
62
|
+
export declare const ADMIN_TOOLS: Set<string>;
|
|
63
|
+
/**
|
|
64
|
+
* Parse a scope string (space-delimited) into an array
|
|
65
|
+
*/
|
|
66
|
+
export declare function parseScopes(scopeString: string): string[];
|
|
67
|
+
/**
|
|
68
|
+
* Parse a database-specific scope
|
|
69
|
+
* @returns The database name or null if not a database scope
|
|
70
|
+
*/
|
|
71
|
+
export declare function parseDatabaseScope(scope: string): string | null;
|
|
72
|
+
/**
|
|
73
|
+
* Parse a table-specific scope
|
|
74
|
+
* @returns Object with database and table names, or null if not a table scope
|
|
75
|
+
*/
|
|
76
|
+
export declare function parseTableScope(scope: string): {
|
|
77
|
+
database: string;
|
|
78
|
+
table: string;
|
|
79
|
+
} | null;
|
|
80
|
+
/**
|
|
81
|
+
* Check if a scope is valid (matches known patterns)
|
|
82
|
+
*/
|
|
83
|
+
export declare function isValidScope(scope: string): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Check if scopes include admin access
|
|
86
|
+
*/
|
|
87
|
+
export declare function hasAdminScope(scopes: string[]): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Check if scopes include write access
|
|
90
|
+
*/
|
|
91
|
+
export declare function hasWriteScope(scopes: string[]): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* Check if scopes include read access
|
|
94
|
+
*/
|
|
95
|
+
export declare function hasReadScope(scopes: string[]): boolean;
|
|
96
|
+
/**
|
|
97
|
+
* Check if a scope grants access to a specific tool
|
|
98
|
+
*/
|
|
99
|
+
export declare function scopeGrantsToolAccess(scope: string, toolName: string): boolean;
|
|
100
|
+
/**
|
|
101
|
+
* Check if any of the scopes grants access to a tool
|
|
102
|
+
*/
|
|
103
|
+
export declare function scopesGrantToolAccess(scopes: string[], toolName: string): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Check if a scope grants access to a specific database
|
|
106
|
+
*/
|
|
107
|
+
export declare function scopeGrantsDatabaseAccess(scope: string, databaseName: string): boolean;
|
|
108
|
+
/**
|
|
109
|
+
* Check if any of the scopes grants access to a database
|
|
110
|
+
*/
|
|
111
|
+
export declare function scopesGrantDatabaseAccess(scopes: string[], databaseName: string): boolean;
|
|
112
|
+
/**
|
|
113
|
+
* Check if a scope grants access to a specific table
|
|
114
|
+
*/
|
|
115
|
+
export declare function scopeGrantsTableAccess(scope: string, databaseName: string, tableName: string): boolean;
|
|
116
|
+
/**
|
|
117
|
+
* Check if any of the scopes grants access to a table
|
|
118
|
+
*/
|
|
119
|
+
export declare function scopesGrantTableAccess(scopes: string[], databaseName: string, tableName: string): boolean;
|
|
120
|
+
/**
|
|
121
|
+
* Get the required minimum scope for a tool group
|
|
122
|
+
*/
|
|
123
|
+
export declare function getRequiredScopeForGroup(group: ToolGroup): string;
|
|
124
|
+
/**
|
|
125
|
+
* Get the required minimum scope for a tool
|
|
126
|
+
*/
|
|
127
|
+
export declare function getRequiredScopeForTool(toolName: string): string;
|
|
128
|
+
/**
|
|
129
|
+
* Get tool groups accessible with given scopes
|
|
130
|
+
*/
|
|
131
|
+
export declare function getAccessibleToolGroups(scopes: string[]): ToolGroup[];
|
|
132
|
+
/**
|
|
133
|
+
* Get all tools accessible with given scopes
|
|
134
|
+
*/
|
|
135
|
+
export declare function getAccessibleTools(scopes: string[]): string[];
|
|
136
|
+
//# sourceMappingURL=scopes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scopes.d.ts","sourceRoot":"","sources":["../../src/auth/scopes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAOnD;;GAEG;AACH,eAAO,MAAM,WAAW,qCAAsC,CAAC;AAE/D;;GAEG;AACH,eAAO,MAAM,cAAc;IACzB,uBAAuB;;IAEvB,4BAA4B;;IAE5B,wBAAwB;;IAExB,uCAAuC;;IAEvC,oCAAoC;;CAE5B,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,gBAAgB,kFAMnB,CAAC;AAMX;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,EAExC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,EAMzC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,EAGzC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,aAe1B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW,aActB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW,aAYtB,CAAC;AAMH;;GAEG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAKzD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG/D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,GACZ;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQ5C;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAiBnD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAEtD;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAsBT;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EAAE,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,GACnB,OAAO,CAmBT;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EAAE,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAmBT;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EAAE,EAChB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAIT;AAMD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAcjE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQhE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAWrE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAmB7D"}
|