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,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db-mcp Enhanced Error System
|
|
3
|
+
*
|
|
4
|
+
* Provides typed error classes with categorization, actionable suggestions,
|
|
5
|
+
* and structured error responses for better diagnostics.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Error categories for classification and handling
|
|
9
|
+
*/
|
|
10
|
+
export declare enum ErrorCategory {
|
|
11
|
+
/** Input validation failures (invalid names, paths, types) */
|
|
12
|
+
VALIDATION = "validation",
|
|
13
|
+
/** Database connection issues */
|
|
14
|
+
CONNECTION = "connection",
|
|
15
|
+
/** SQL execution errors */
|
|
16
|
+
QUERY = "query",
|
|
17
|
+
/** Authorization/permission failures */
|
|
18
|
+
PERMISSION = "permission",
|
|
19
|
+
/** Configuration/setup issues */
|
|
20
|
+
CONFIGURATION = "config",
|
|
21
|
+
/** Missing resources (tables, columns, views) */
|
|
22
|
+
RESOURCE = "resource",
|
|
23
|
+
/** Unexpected internal errors */
|
|
24
|
+
INTERNAL = "internal"
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Find a suggestion for an error message
|
|
28
|
+
*/
|
|
29
|
+
export declare function findSuggestion(message: string): {
|
|
30
|
+
suggestion: string;
|
|
31
|
+
category?: ErrorCategory | undefined;
|
|
32
|
+
} | null;
|
|
33
|
+
/**
|
|
34
|
+
* Base error class for db-mcp with enhanced diagnostics
|
|
35
|
+
*/
|
|
36
|
+
export declare class DbMcpError extends Error {
|
|
37
|
+
/** Error category for classification */
|
|
38
|
+
readonly category: ErrorCategory;
|
|
39
|
+
/** Module-prefixed error code (e.g., DB_QUERY_FAILED) */
|
|
40
|
+
readonly code: string;
|
|
41
|
+
/** Actionable suggestion for resolving the error */
|
|
42
|
+
readonly suggestion: string | undefined;
|
|
43
|
+
/** Additional error details */
|
|
44
|
+
readonly details: Record<string, unknown> | undefined;
|
|
45
|
+
/** Whether the error is recoverable (can retry) */
|
|
46
|
+
readonly recoverable: boolean;
|
|
47
|
+
constructor(message: string, code: string, category: ErrorCategory, options?: {
|
|
48
|
+
suggestion?: string | undefined;
|
|
49
|
+
details?: Record<string, unknown> | undefined;
|
|
50
|
+
recoverable?: boolean | undefined;
|
|
51
|
+
cause?: Error | undefined;
|
|
52
|
+
});
|
|
53
|
+
/**
|
|
54
|
+
* Convert to structured response object
|
|
55
|
+
*/
|
|
56
|
+
toResponse(): ErrorResponse;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Validation error for invalid inputs
|
|
60
|
+
*/
|
|
61
|
+
export declare class ValidationError extends DbMcpError {
|
|
62
|
+
constructor(message: string, code?: string, options?: {
|
|
63
|
+
suggestion?: string | undefined;
|
|
64
|
+
details?: Record<string, unknown> | undefined;
|
|
65
|
+
cause?: Error | undefined;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Connection error for database connectivity issues
|
|
70
|
+
*/
|
|
71
|
+
export declare class ConnectionError extends DbMcpError {
|
|
72
|
+
constructor(message: string, code?: string, options?: {
|
|
73
|
+
suggestion?: string | undefined;
|
|
74
|
+
details?: Record<string, unknown> | undefined;
|
|
75
|
+
cause?: Error | undefined;
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Query error for SQL execution failures
|
|
80
|
+
*/
|
|
81
|
+
export declare class QueryError extends DbMcpError {
|
|
82
|
+
constructor(message: string, code?: string, options?: {
|
|
83
|
+
suggestion?: string | undefined;
|
|
84
|
+
details?: Record<string, unknown> | undefined;
|
|
85
|
+
sql?: string | undefined;
|
|
86
|
+
cause?: Error | undefined;
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Permission error for authorization failures
|
|
91
|
+
*/
|
|
92
|
+
export declare class PermissionError extends DbMcpError {
|
|
93
|
+
constructor(message: string, code?: string, options?: {
|
|
94
|
+
suggestion?: string | undefined;
|
|
95
|
+
details?: Record<string, unknown> | undefined;
|
|
96
|
+
cause?: Error | undefined;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Resource not found error
|
|
101
|
+
*/
|
|
102
|
+
export declare class ResourceNotFoundError extends DbMcpError {
|
|
103
|
+
constructor(message: string, code?: string, options?: {
|
|
104
|
+
suggestion?: string | undefined;
|
|
105
|
+
resourceType?: string | undefined;
|
|
106
|
+
resourceName?: string | undefined;
|
|
107
|
+
details?: Record<string, unknown> | undefined;
|
|
108
|
+
cause?: Error | undefined;
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Configuration error
|
|
113
|
+
*/
|
|
114
|
+
export declare class ConfigurationError extends DbMcpError {
|
|
115
|
+
constructor(message: string, code?: string, options?: {
|
|
116
|
+
suggestion?: string | undefined;
|
|
117
|
+
details?: Record<string, unknown> | undefined;
|
|
118
|
+
cause?: Error | undefined;
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Internal error for unexpected failures
|
|
123
|
+
*/
|
|
124
|
+
export declare class InternalError extends DbMcpError {
|
|
125
|
+
constructor(message: string, code?: string, options?: {
|
|
126
|
+
suggestion?: string | undefined;
|
|
127
|
+
details?: Record<string, unknown> | undefined;
|
|
128
|
+
cause?: Error | undefined;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Structured error response format
|
|
133
|
+
*/
|
|
134
|
+
export interface ErrorResponse {
|
|
135
|
+
success: false;
|
|
136
|
+
error: string;
|
|
137
|
+
code: string;
|
|
138
|
+
category: ErrorCategory;
|
|
139
|
+
suggestion: string | undefined;
|
|
140
|
+
recoverable: boolean;
|
|
141
|
+
details: Record<string, unknown> | undefined;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Convert any error to a structured error response
|
|
145
|
+
*/
|
|
146
|
+
export declare function formatError(error: unknown): ErrorResponse;
|
|
147
|
+
/**
|
|
148
|
+
* Wrap an error with enhanced diagnostics
|
|
149
|
+
*/
|
|
150
|
+
export declare function wrapError(error: unknown, defaultCode?: string, defaultCategory?: ErrorCategory): DbMcpError;
|
|
151
|
+
/**
|
|
152
|
+
* Check if an error is a DbMcpError
|
|
153
|
+
*/
|
|
154
|
+
export declare function isDbMcpError(error: unknown): error is DbMcpError;
|
|
155
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db-mcp Enhanced Error System
|
|
3
|
+
*
|
|
4
|
+
* Provides typed error classes with categorization, actionable suggestions,
|
|
5
|
+
* and structured error responses for better diagnostics.
|
|
6
|
+
*/
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// Error Categories
|
|
9
|
+
// =============================================================================
|
|
10
|
+
/**
|
|
11
|
+
* Error categories for classification and handling
|
|
12
|
+
*/
|
|
13
|
+
export var ErrorCategory;
|
|
14
|
+
(function (ErrorCategory) {
|
|
15
|
+
/** Input validation failures (invalid names, paths, types) */
|
|
16
|
+
ErrorCategory["VALIDATION"] = "validation";
|
|
17
|
+
/** Database connection issues */
|
|
18
|
+
ErrorCategory["CONNECTION"] = "connection";
|
|
19
|
+
/** SQL execution errors */
|
|
20
|
+
ErrorCategory["QUERY"] = "query";
|
|
21
|
+
/** Authorization/permission failures */
|
|
22
|
+
ErrorCategory["PERMISSION"] = "permission";
|
|
23
|
+
/** Configuration/setup issues */
|
|
24
|
+
ErrorCategory["CONFIGURATION"] = "config";
|
|
25
|
+
/** Missing resources (tables, columns, views) */
|
|
26
|
+
ErrorCategory["RESOURCE"] = "resource";
|
|
27
|
+
/** Unexpected internal errors */
|
|
28
|
+
ErrorCategory["INTERNAL"] = "internal";
|
|
29
|
+
})(ErrorCategory || (ErrorCategory = {}));
|
|
30
|
+
// =============================================================================
|
|
31
|
+
// Error Suggestions
|
|
32
|
+
// =============================================================================
|
|
33
|
+
/**
|
|
34
|
+
* Pattern-based suggestions for common errors
|
|
35
|
+
*/
|
|
36
|
+
const ERROR_SUGGESTIONS = [
|
|
37
|
+
// Validation errors
|
|
38
|
+
{
|
|
39
|
+
pattern: /invalid table name/i,
|
|
40
|
+
suggestion: "Table names must start with a letter or underscore, followed by letters, numbers, or underscores only.",
|
|
41
|
+
category: ErrorCategory.VALIDATION,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
pattern: /invalid column name/i,
|
|
45
|
+
suggestion: "Column names must start with a letter or underscore, followed by letters, numbers, or underscores only.",
|
|
46
|
+
category: ErrorCategory.VALIDATION,
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
pattern: /invalid (view|index) name/i,
|
|
50
|
+
suggestion: "Names must start with a letter or underscore, followed by alphanumeric characters only.",
|
|
51
|
+
category: ErrorCategory.VALIDATION,
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
pattern: /json path must start with \$/i,
|
|
55
|
+
suggestion: "JSON paths use $ as the root. Example: $.name, $.items[0], $.nested.property",
|
|
56
|
+
category: ErrorCategory.VALIDATION,
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
pattern: /vector dimensions must match/i,
|
|
60
|
+
suggestion: "All vectors in comparison must have the same number of dimensions.",
|
|
61
|
+
category: ErrorCategory.VALIDATION,
|
|
62
|
+
},
|
|
63
|
+
// Resource errors
|
|
64
|
+
{
|
|
65
|
+
pattern: /no such table[:\s]*(['"]?)(\w+)\1/i,
|
|
66
|
+
suggestion: "Table not found. Run sqlite_list_tables to see available tables.",
|
|
67
|
+
category: ErrorCategory.RESOURCE,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
pattern: /no such column[:\s]*(['"]?)(\w+)\1/i,
|
|
71
|
+
suggestion: "Column not found. Use sqlite_describe_table to see available columns.",
|
|
72
|
+
category: ErrorCategory.RESOURCE,
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
pattern: /table .* already exists/i,
|
|
76
|
+
suggestion: "Table already exists. Use CREATE TABLE IF NOT EXISTS or drop the existing table first.",
|
|
77
|
+
category: ErrorCategory.RESOURCE,
|
|
78
|
+
},
|
|
79
|
+
// Query errors
|
|
80
|
+
{
|
|
81
|
+
pattern: /syntax error/i,
|
|
82
|
+
suggestion: "Check SQL syntax. Common issues: missing quotes, commas, parentheses, or reserved word conflicts.",
|
|
83
|
+
category: ErrorCategory.QUERY,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
pattern: /UNIQUE constraint failed/i,
|
|
87
|
+
suggestion: "A row with this value already exists. Use UPDATE to modify existing data or check for duplicates.",
|
|
88
|
+
category: ErrorCategory.QUERY,
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
pattern: /FOREIGN KEY constraint failed/i,
|
|
92
|
+
suggestion: "The referenced row does not exist. Ensure the parent record exists before inserting.",
|
|
93
|
+
category: ErrorCategory.QUERY,
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
pattern: /NOT NULL constraint failed/i,
|
|
97
|
+
suggestion: "A required column is missing a value. Provide a value or set a default.",
|
|
98
|
+
category: ErrorCategory.QUERY,
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
pattern: /CHECK constraint failed/i,
|
|
102
|
+
suggestion: "The value does not meet the column's check constraint requirements.",
|
|
103
|
+
category: ErrorCategory.QUERY,
|
|
104
|
+
},
|
|
105
|
+
// Connection errors
|
|
106
|
+
{
|
|
107
|
+
pattern: /not connected/i,
|
|
108
|
+
suggestion: "Database connection not established. Ensure the database is configured and connected.",
|
|
109
|
+
category: ErrorCategory.CONNECTION,
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
pattern: /database is locked/i,
|
|
113
|
+
suggestion: "Database is being used by another process. Wait and retry, or check for long-running transactions.",
|
|
114
|
+
category: ErrorCategory.CONNECTION,
|
|
115
|
+
},
|
|
116
|
+
// Permission errors
|
|
117
|
+
{
|
|
118
|
+
pattern: /readonly database/i,
|
|
119
|
+
suggestion: "Database is in read-only mode. Check file permissions or connection settings.",
|
|
120
|
+
category: ErrorCategory.PERMISSION,
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
pattern: /attempt to write a readonly/i,
|
|
124
|
+
suggestion: "Write operations are not allowed. Check database configuration.",
|
|
125
|
+
category: ErrorCategory.PERMISSION,
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
/**
|
|
129
|
+
* Find a suggestion for an error message
|
|
130
|
+
*/
|
|
131
|
+
export function findSuggestion(message) {
|
|
132
|
+
for (const entry of ERROR_SUGGESTIONS) {
|
|
133
|
+
if (entry.pattern.test(message)) {
|
|
134
|
+
return {
|
|
135
|
+
suggestion: entry.suggestion,
|
|
136
|
+
category: entry.category,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
// =============================================================================
|
|
143
|
+
// Base Error Class
|
|
144
|
+
// =============================================================================
|
|
145
|
+
/**
|
|
146
|
+
* Base error class for db-mcp with enhanced diagnostics
|
|
147
|
+
*/
|
|
148
|
+
export class DbMcpError extends Error {
|
|
149
|
+
/** Error category for classification */
|
|
150
|
+
category;
|
|
151
|
+
/** Module-prefixed error code (e.g., DB_QUERY_FAILED) */
|
|
152
|
+
code;
|
|
153
|
+
/** Actionable suggestion for resolving the error */
|
|
154
|
+
suggestion;
|
|
155
|
+
/** Additional error details */
|
|
156
|
+
details;
|
|
157
|
+
/** Whether the error is recoverable (can retry) */
|
|
158
|
+
recoverable;
|
|
159
|
+
constructor(message, code, category, options) {
|
|
160
|
+
super(message, { cause: options?.cause });
|
|
161
|
+
this.name = this.constructor.name;
|
|
162
|
+
this.code = code;
|
|
163
|
+
this.category = category;
|
|
164
|
+
this.recoverable = options?.recoverable ?? false;
|
|
165
|
+
this.details = options?.details;
|
|
166
|
+
// Auto-detect suggestion if not provided
|
|
167
|
+
this.suggestion =
|
|
168
|
+
options?.suggestion ?? findSuggestion(message)?.suggestion;
|
|
169
|
+
// Capture stack trace
|
|
170
|
+
Error.captureStackTrace?.(this, this.constructor);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Convert to structured response object
|
|
174
|
+
*/
|
|
175
|
+
toResponse() {
|
|
176
|
+
return {
|
|
177
|
+
success: false,
|
|
178
|
+
error: this.message,
|
|
179
|
+
code: this.code,
|
|
180
|
+
category: this.category,
|
|
181
|
+
suggestion: this.suggestion,
|
|
182
|
+
recoverable: this.recoverable,
|
|
183
|
+
details: this.details,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// =============================================================================
|
|
188
|
+
// Specific Error Classes
|
|
189
|
+
// =============================================================================
|
|
190
|
+
/**
|
|
191
|
+
* Validation error for invalid inputs
|
|
192
|
+
*/
|
|
193
|
+
export class ValidationError extends DbMcpError {
|
|
194
|
+
constructor(message, code = "VALIDATION_ERROR", options) {
|
|
195
|
+
super(message, code, ErrorCategory.VALIDATION, {
|
|
196
|
+
...options,
|
|
197
|
+
recoverable: false,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Connection error for database connectivity issues
|
|
203
|
+
*/
|
|
204
|
+
export class ConnectionError extends DbMcpError {
|
|
205
|
+
constructor(message, code = "CONNECTION_ERROR", options) {
|
|
206
|
+
super(message, code, ErrorCategory.CONNECTION, {
|
|
207
|
+
...options,
|
|
208
|
+
recoverable: true, // Connection errors are often transient
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Query error for SQL execution failures
|
|
214
|
+
*/
|
|
215
|
+
export class QueryError extends DbMcpError {
|
|
216
|
+
constructor(message, code = "QUERY_ERROR", options) {
|
|
217
|
+
super(message, code, ErrorCategory.QUERY, {
|
|
218
|
+
...options,
|
|
219
|
+
details: {
|
|
220
|
+
...options?.details,
|
|
221
|
+
sql: options?.sql,
|
|
222
|
+
},
|
|
223
|
+
recoverable: false,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Permission error for authorization failures
|
|
229
|
+
*/
|
|
230
|
+
export class PermissionError extends DbMcpError {
|
|
231
|
+
constructor(message, code = "PERMISSION_ERROR", options) {
|
|
232
|
+
super(message, code, ErrorCategory.PERMISSION, {
|
|
233
|
+
...options,
|
|
234
|
+
recoverable: false,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Resource not found error
|
|
240
|
+
*/
|
|
241
|
+
export class ResourceNotFoundError extends DbMcpError {
|
|
242
|
+
constructor(message, code = "RESOURCE_NOT_FOUND", options) {
|
|
243
|
+
super(message, code, ErrorCategory.RESOURCE, {
|
|
244
|
+
...options,
|
|
245
|
+
details: {
|
|
246
|
+
...options?.details,
|
|
247
|
+
resourceType: options?.resourceType,
|
|
248
|
+
resourceName: options?.resourceName,
|
|
249
|
+
},
|
|
250
|
+
recoverable: false,
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Configuration error
|
|
256
|
+
*/
|
|
257
|
+
export class ConfigurationError extends DbMcpError {
|
|
258
|
+
constructor(message, code = "CONFIG_ERROR", options) {
|
|
259
|
+
super(message, code, ErrorCategory.CONFIGURATION, {
|
|
260
|
+
...options,
|
|
261
|
+
recoverable: false,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Internal error for unexpected failures
|
|
267
|
+
*/
|
|
268
|
+
export class InternalError extends DbMcpError {
|
|
269
|
+
constructor(message, code = "INTERNAL_ERROR", options) {
|
|
270
|
+
super(message, code, ErrorCategory.INTERNAL, {
|
|
271
|
+
...options,
|
|
272
|
+
recoverable: false,
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// =============================================================================
|
|
277
|
+
// Utility Functions
|
|
278
|
+
// =============================================================================
|
|
279
|
+
/**
|
|
280
|
+
* Convert any error to a structured error response
|
|
281
|
+
*/
|
|
282
|
+
export function formatError(error) {
|
|
283
|
+
if (error instanceof DbMcpError) {
|
|
284
|
+
return error.toResponse();
|
|
285
|
+
}
|
|
286
|
+
if (error instanceof Error) {
|
|
287
|
+
const match = findSuggestion(error.message);
|
|
288
|
+
return {
|
|
289
|
+
success: false,
|
|
290
|
+
error: error.message,
|
|
291
|
+
code: "UNKNOWN_ERROR",
|
|
292
|
+
category: match?.category ?? ErrorCategory.INTERNAL,
|
|
293
|
+
suggestion: match?.suggestion,
|
|
294
|
+
recoverable: false,
|
|
295
|
+
details: undefined,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
return {
|
|
299
|
+
success: false,
|
|
300
|
+
error: String(error),
|
|
301
|
+
code: "UNKNOWN_ERROR",
|
|
302
|
+
category: ErrorCategory.INTERNAL,
|
|
303
|
+
suggestion: undefined,
|
|
304
|
+
recoverable: false,
|
|
305
|
+
details: undefined,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Wrap an error with enhanced diagnostics
|
|
310
|
+
*/
|
|
311
|
+
export function wrapError(error, defaultCode = "UNKNOWN_ERROR", defaultCategory = ErrorCategory.INTERNAL) {
|
|
312
|
+
if (error instanceof DbMcpError) {
|
|
313
|
+
return error;
|
|
314
|
+
}
|
|
315
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
316
|
+
const match = findSuggestion(message);
|
|
317
|
+
return new DbMcpError(message, defaultCode, match?.category ?? defaultCategory, {
|
|
318
|
+
suggestion: match?.suggestion,
|
|
319
|
+
cause: error instanceof Error ? error : undefined,
|
|
320
|
+
recoverable: false,
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Check if an error is a DbMcpError
|
|
325
|
+
*/
|
|
326
|
+
export function isDbMcpError(error) {
|
|
327
|
+
return error instanceof DbMcpError;
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db-mcp - Identifier Sanitization Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides safe handling of SQLite identifiers (table names, column names)
|
|
5
|
+
* to prevent SQL injection attacks via identifier interpolation.
|
|
6
|
+
*
|
|
7
|
+
* SQLite identifier rules:
|
|
8
|
+
* - Can contain letters, digits, underscores (more permissive than PostgreSQL)
|
|
9
|
+
* - Maximum practical length: 255 bytes
|
|
10
|
+
* - Case-insensitive for ASCII letters unless quoted
|
|
11
|
+
*
|
|
12
|
+
* Adapted from postgres-mcp reference implementation for SQLite.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Error thrown when an identifier is invalid
|
|
16
|
+
*/
|
|
17
|
+
export declare class InvalidIdentifierError extends Error {
|
|
18
|
+
readonly identifier: string;
|
|
19
|
+
readonly reason: string;
|
|
20
|
+
constructor(identifier: string, reason: string);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Validate a SQLite identifier
|
|
24
|
+
*
|
|
25
|
+
* @param name - The identifier to validate
|
|
26
|
+
* @throws InvalidIdentifierError if the identifier is invalid
|
|
27
|
+
*/
|
|
28
|
+
export declare function validateIdentifier(name: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Sanitize and quote a SQLite identifier for safe use in SQL queries
|
|
31
|
+
*
|
|
32
|
+
* This function:
|
|
33
|
+
* 1. Validates the identifier against SQLite naming rules
|
|
34
|
+
* 2. Escapes any embedded double quotes
|
|
35
|
+
* 3. Wraps the identifier in double quotes for safe interpolation
|
|
36
|
+
*
|
|
37
|
+
* @param name - The identifier to sanitize
|
|
38
|
+
* @returns The sanitized, double-quoted identifier
|
|
39
|
+
* @throws InvalidIdentifierError if the identifier is invalid
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* sanitizeIdentifier('users') // Returns: "users"
|
|
43
|
+
* sanitizeIdentifier('my_table') // Returns: "my_table"
|
|
44
|
+
* sanitizeIdentifier('User"Data') // Throws: InvalidIdentifierError
|
|
45
|
+
*/
|
|
46
|
+
export declare function sanitizeIdentifier(name: string): string;
|
|
47
|
+
/**
|
|
48
|
+
* Check if an identifier needs quoting (is a reserved keyword or has special characters)
|
|
49
|
+
*
|
|
50
|
+
* @param name - The identifier to check
|
|
51
|
+
* @returns True if the identifier needs quoting
|
|
52
|
+
*/
|
|
53
|
+
export declare function needsQuoting(name: string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Sanitize a table name
|
|
56
|
+
*
|
|
57
|
+
* @param table - The table name
|
|
58
|
+
* @returns The sanitized table reference
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* sanitizeTableName('users') // Returns: "users"
|
|
62
|
+
*/
|
|
63
|
+
export declare function sanitizeTableName(table: string): string;
|
|
64
|
+
/**
|
|
65
|
+
* Sanitize a column reference with optional table qualifier
|
|
66
|
+
*
|
|
67
|
+
* @param column - The column name
|
|
68
|
+
* @param table - Optional table name or alias
|
|
69
|
+
* @returns The sanitized column reference
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* sanitizeColumnRef('id') // Returns: "id"
|
|
73
|
+
* sanitizeColumnRef('id', 'users') // Returns: "users"."id"
|
|
74
|
+
*/
|
|
75
|
+
export declare function sanitizeColumnRef(column: string, table?: string): string;
|
|
76
|
+
/**
|
|
77
|
+
* Sanitize an array of identifiers
|
|
78
|
+
*
|
|
79
|
+
* @param names - Array of identifier names
|
|
80
|
+
* @returns Array of sanitized identifiers
|
|
81
|
+
*/
|
|
82
|
+
export declare function sanitizeIdentifiers(names: string[]): string[];
|
|
83
|
+
/**
|
|
84
|
+
* Create a safe column list for SELECT statements
|
|
85
|
+
*
|
|
86
|
+
* @param columns - Array of column names
|
|
87
|
+
* @returns Comma-separated list of sanitized column names
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* createColumnList(['id', 'name', 'email']) // Returns: "id", "name", "email"
|
|
91
|
+
*/
|
|
92
|
+
export declare function createColumnList(columns: string[]): string;
|
|
93
|
+
/**
|
|
94
|
+
* Sanitize an index name
|
|
95
|
+
* SQLite index names follow the same rules as identifiers
|
|
96
|
+
*
|
|
97
|
+
* @param name - The index name
|
|
98
|
+
* @returns The sanitized index name
|
|
99
|
+
*/
|
|
100
|
+
export declare function sanitizeIndexName(name: string): string;
|
|
101
|
+
/**
|
|
102
|
+
* Quote an identifier for safe use in SQL without strict validation.
|
|
103
|
+
*
|
|
104
|
+
* Unlike sanitizeIdentifier(), this function:
|
|
105
|
+
* - Allows reserved keywords (they become valid when quoted)
|
|
106
|
+
* - Allows any valid SQLite identifier characters
|
|
107
|
+
* - Only validates basic safety (length, no dangerous characters)
|
|
108
|
+
*
|
|
109
|
+
* Use this for user-provided names where reserved keywords
|
|
110
|
+
* are perfectly valid SQLite identifiers when properly quoted.
|
|
111
|
+
*
|
|
112
|
+
* @param name - The identifier to quote
|
|
113
|
+
* @returns The double-quoted identifier safe for SQL interpolation
|
|
114
|
+
* @throws InvalidIdentifierError if the identifier is genuinely invalid
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* quoteIdentifier('table') // Returns: "table" (reserved keyword, but valid)
|
|
118
|
+
* quoteIdentifier('my_column') // Returns: "my_column"
|
|
119
|
+
*/
|
|
120
|
+
export declare function quoteIdentifier(name: string): string;
|
|
121
|
+
//# sourceMappingURL=identifiers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identifiers.d.ts","sourceRoot":"","sources":["../../src/utils/identifiers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAgJH;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;aAE7B,UAAU,EAAE,MAAM;aAClB,MAAM,EAAE,MAAM;gBADd,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM;CAKjC;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAqBrD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOvD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAYlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CASxE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAE7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA2BpD"}
|