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.
Files changed (208) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +860 -0
  3. package/dist/adapters/DatabaseAdapter.d.ts +141 -0
  4. package/dist/adapters/DatabaseAdapter.d.ts.map +1 -0
  5. package/dist/adapters/DatabaseAdapter.js +131 -0
  6. package/dist/adapters/DatabaseAdapter.js.map +1 -0
  7. package/dist/adapters/sqlite/SchemaManager.d.ts +58 -0
  8. package/dist/adapters/sqlite/SchemaManager.d.ts.map +1 -0
  9. package/dist/adapters/sqlite/SchemaManager.js +187 -0
  10. package/dist/adapters/sqlite/SchemaManager.js.map +1 -0
  11. package/dist/adapters/sqlite/SqliteAdapter.d.ts +161 -0
  12. package/dist/adapters/sqlite/SqliteAdapter.d.ts.map +1 -0
  13. package/dist/adapters/sqlite/SqliteAdapter.js +741 -0
  14. package/dist/adapters/sqlite/SqliteAdapter.js.map +1 -0
  15. package/dist/adapters/sqlite/index.d.ts +9 -0
  16. package/dist/adapters/sqlite/index.d.ts.map +1 -0
  17. package/dist/adapters/sqlite/index.js +8 -0
  18. package/dist/adapters/sqlite/index.js.map +1 -0
  19. package/dist/adapters/sqlite/json-utils.d.ts +100 -0
  20. package/dist/adapters/sqlite/json-utils.d.ts.map +1 -0
  21. package/dist/adapters/sqlite/json-utils.js +274 -0
  22. package/dist/adapters/sqlite/json-utils.js.map +1 -0
  23. package/dist/adapters/sqlite/output-schemas.d.ts +1187 -0
  24. package/dist/adapters/sqlite/output-schemas.d.ts.map +1 -0
  25. package/dist/adapters/sqlite/output-schemas.js +1337 -0
  26. package/dist/adapters/sqlite/output-schemas.js.map +1 -0
  27. package/dist/adapters/sqlite/prompts.d.ts +13 -0
  28. package/dist/adapters/sqlite/prompts.d.ts.map +1 -0
  29. package/dist/adapters/sqlite/prompts.js +605 -0
  30. package/dist/adapters/sqlite/prompts.js.map +1 -0
  31. package/dist/adapters/sqlite/resources.d.ts +13 -0
  32. package/dist/adapters/sqlite/resources.d.ts.map +1 -0
  33. package/dist/adapters/sqlite/resources.js +251 -0
  34. package/dist/adapters/sqlite/resources.js.map +1 -0
  35. package/dist/adapters/sqlite/tools/admin.d.ts +14 -0
  36. package/dist/adapters/sqlite/tools/admin.d.ts.map +1 -0
  37. package/dist/adapters/sqlite/tools/admin.js +788 -0
  38. package/dist/adapters/sqlite/tools/admin.js.map +1 -0
  39. package/dist/adapters/sqlite/tools/core.d.ts +25 -0
  40. package/dist/adapters/sqlite/tools/core.d.ts.map +1 -0
  41. package/dist/adapters/sqlite/tools/core.js +359 -0
  42. package/dist/adapters/sqlite/tools/core.js.map +1 -0
  43. package/dist/adapters/sqlite/tools/fts.d.ts +13 -0
  44. package/dist/adapters/sqlite/tools/fts.d.ts.map +1 -0
  45. package/dist/adapters/sqlite/tools/fts.js +347 -0
  46. package/dist/adapters/sqlite/tools/fts.js.map +1 -0
  47. package/dist/adapters/sqlite/tools/geo.d.ts +14 -0
  48. package/dist/adapters/sqlite/tools/geo.d.ts.map +1 -0
  49. package/dist/adapters/sqlite/tools/geo.js +252 -0
  50. package/dist/adapters/sqlite/tools/geo.js.map +1 -0
  51. package/dist/adapters/sqlite/tools/index.d.ts +30 -0
  52. package/dist/adapters/sqlite/tools/index.d.ts.map +1 -0
  53. package/dist/adapters/sqlite/tools/index.js +61 -0
  54. package/dist/adapters/sqlite/tools/index.js.map +1 -0
  55. package/dist/adapters/sqlite/tools/json-helpers.d.ts +14 -0
  56. package/dist/adapters/sqlite/tools/json-helpers.d.ts.map +1 -0
  57. package/dist/adapters/sqlite/tools/json-helpers.js +477 -0
  58. package/dist/adapters/sqlite/tools/json-helpers.js.map +1 -0
  59. package/dist/adapters/sqlite/tools/json-operations.d.ts +14 -0
  60. package/dist/adapters/sqlite/tools/json-operations.d.ts.map +1 -0
  61. package/dist/adapters/sqlite/tools/json-operations.js +839 -0
  62. package/dist/adapters/sqlite/tools/json-operations.js.map +1 -0
  63. package/dist/adapters/sqlite/tools/stats.d.ts +15 -0
  64. package/dist/adapters/sqlite/tools/stats.d.ts.map +1 -0
  65. package/dist/adapters/sqlite/tools/stats.js +1219 -0
  66. package/dist/adapters/sqlite/tools/stats.js.map +1 -0
  67. package/dist/adapters/sqlite/tools/text.d.ts +14 -0
  68. package/dist/adapters/sqlite/tools/text.d.ts.map +1 -0
  69. package/dist/adapters/sqlite/tools/text.js +1141 -0
  70. package/dist/adapters/sqlite/tools/text.js.map +1 -0
  71. package/dist/adapters/sqlite/tools/vector.d.ts +14 -0
  72. package/dist/adapters/sqlite/tools/vector.d.ts.map +1 -0
  73. package/dist/adapters/sqlite/tools/vector.js +613 -0
  74. package/dist/adapters/sqlite/tools/vector.js.map +1 -0
  75. package/dist/adapters/sqlite/tools/virtual.d.ts +13 -0
  76. package/dist/adapters/sqlite/tools/virtual.d.ts.map +1 -0
  77. package/dist/adapters/sqlite/tools/virtual.js +930 -0
  78. package/dist/adapters/sqlite/tools/virtual.js.map +1 -0
  79. package/dist/adapters/sqlite/types.d.ts +207 -0
  80. package/dist/adapters/sqlite/types.d.ts.map +1 -0
  81. package/dist/adapters/sqlite/types.js +186 -0
  82. package/dist/adapters/sqlite/types.js.map +1 -0
  83. package/dist/adapters/sqlite-native/NativeSqliteAdapter.d.ts +163 -0
  84. package/dist/adapters/sqlite-native/NativeSqliteAdapter.d.ts.map +1 -0
  85. package/dist/adapters/sqlite-native/NativeSqliteAdapter.js +748 -0
  86. package/dist/adapters/sqlite-native/NativeSqliteAdapter.js.map +1 -0
  87. package/dist/adapters/sqlite-native/index.d.ts +11 -0
  88. package/dist/adapters/sqlite-native/index.d.ts.map +1 -0
  89. package/dist/adapters/sqlite-native/index.js +11 -0
  90. package/dist/adapters/sqlite-native/index.js.map +1 -0
  91. package/dist/adapters/sqlite-native/tools/spatialite.d.ts +19 -0
  92. package/dist/adapters/sqlite-native/tools/spatialite.d.ts.map +1 -0
  93. package/dist/adapters/sqlite-native/tools/spatialite.js +628 -0
  94. package/dist/adapters/sqlite-native/tools/spatialite.js.map +1 -0
  95. package/dist/adapters/sqlite-native/tools/transactions.d.ts +12 -0
  96. package/dist/adapters/sqlite-native/tools/transactions.d.ts.map +1 -0
  97. package/dist/adapters/sqlite-native/tools/transactions.js +255 -0
  98. package/dist/adapters/sqlite-native/tools/transactions.js.map +1 -0
  99. package/dist/adapters/sqlite-native/tools/window.d.ts +12 -0
  100. package/dist/adapters/sqlite-native/tools/window.d.ts.map +1 -0
  101. package/dist/adapters/sqlite-native/tools/window.js +370 -0
  102. package/dist/adapters/sqlite-native/tools/window.js.map +1 -0
  103. package/dist/auth/AuthorizationServerDiscovery.d.ts +90 -0
  104. package/dist/auth/AuthorizationServerDiscovery.d.ts.map +1 -0
  105. package/dist/auth/AuthorizationServerDiscovery.js +204 -0
  106. package/dist/auth/AuthorizationServerDiscovery.js.map +1 -0
  107. package/dist/auth/OAuthResourceServer.d.ts +65 -0
  108. package/dist/auth/OAuthResourceServer.d.ts.map +1 -0
  109. package/dist/auth/OAuthResourceServer.js +121 -0
  110. package/dist/auth/OAuthResourceServer.js.map +1 -0
  111. package/dist/auth/TokenValidator.d.ts +60 -0
  112. package/dist/auth/TokenValidator.d.ts.map +1 -0
  113. package/dist/auth/TokenValidator.js +235 -0
  114. package/dist/auth/TokenValidator.js.map +1 -0
  115. package/dist/auth/errors.d.ts +74 -0
  116. package/dist/auth/errors.d.ts.map +1 -0
  117. package/dist/auth/errors.js +133 -0
  118. package/dist/auth/errors.js.map +1 -0
  119. package/dist/auth/index.d.ts +13 -0
  120. package/dist/auth/index.d.ts.map +1 -0
  121. package/dist/auth/index.js +15 -0
  122. package/dist/auth/index.js.map +1 -0
  123. package/dist/auth/middleware.d.ts +81 -0
  124. package/dist/auth/middleware.d.ts.map +1 -0
  125. package/dist/auth/middleware.js +291 -0
  126. package/dist/auth/middleware.js.map +1 -0
  127. package/dist/auth/scopes.d.ts +136 -0
  128. package/dist/auth/scopes.d.ts.map +1 -0
  129. package/dist/auth/scopes.js +349 -0
  130. package/dist/auth/scopes.js.map +1 -0
  131. package/dist/auth/types.d.ts +257 -0
  132. package/dist/auth/types.d.ts.map +1 -0
  133. package/dist/auth/types.js +8 -0
  134. package/dist/auth/types.js.map +1 -0
  135. package/dist/cli.d.ts +8 -0
  136. package/dist/cli.d.ts.map +1 -0
  137. package/dist/cli.js +236 -0
  138. package/dist/cli.js.map +1 -0
  139. package/dist/constants/ServerInstructions.d.ts +45 -0
  140. package/dist/constants/ServerInstructions.d.ts.map +1 -0
  141. package/dist/constants/ServerInstructions.js +356 -0
  142. package/dist/constants/ServerInstructions.js.map +1 -0
  143. package/dist/filtering/ToolConstants.d.ts +34 -0
  144. package/dist/filtering/ToolConstants.d.ts.map +1 -0
  145. package/dist/filtering/ToolConstants.js +174 -0
  146. package/dist/filtering/ToolConstants.js.map +1 -0
  147. package/dist/filtering/ToolFilter.d.ts +82 -0
  148. package/dist/filtering/ToolFilter.d.ts.map +1 -0
  149. package/dist/filtering/ToolFilter.js +296 -0
  150. package/dist/filtering/ToolFilter.js.map +1 -0
  151. package/dist/index.d.ts +13 -0
  152. package/dist/index.d.ts.map +1 -0
  153. package/dist/index.js +17 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/server/McpServer.d.ts +61 -0
  156. package/dist/server/McpServer.d.ts.map +1 -0
  157. package/dist/server/McpServer.js +270 -0
  158. package/dist/server/McpServer.js.map +1 -0
  159. package/dist/transports/http.d.ts +134 -0
  160. package/dist/transports/http.d.ts.map +1 -0
  161. package/dist/transports/http.js +516 -0
  162. package/dist/transports/http.js.map +1 -0
  163. package/dist/transports/index.d.ts +5 -0
  164. package/dist/transports/index.d.ts.map +1 -0
  165. package/dist/transports/index.js +5 -0
  166. package/dist/transports/index.js.map +1 -0
  167. package/dist/types/index.d.ts +380 -0
  168. package/dist/types/index.d.ts.map +1 -0
  169. package/dist/types/index.js +68 -0
  170. package/dist/types/index.js.map +1 -0
  171. package/dist/utils/annotations.d.ts +44 -0
  172. package/dist/utils/annotations.d.ts.map +1 -0
  173. package/dist/utils/annotations.js +77 -0
  174. package/dist/utils/annotations.js.map +1 -0
  175. package/dist/utils/errors.d.ts +155 -0
  176. package/dist/utils/errors.d.ts.map +1 -0
  177. package/dist/utils/errors.js +329 -0
  178. package/dist/utils/errors.js.map +1 -0
  179. package/dist/utils/identifiers.d.ts +121 -0
  180. package/dist/utils/identifiers.d.ts.map +1 -0
  181. package/dist/utils/identifiers.js +319 -0
  182. package/dist/utils/identifiers.js.map +1 -0
  183. package/dist/utils/index.d.ts +7 -0
  184. package/dist/utils/index.d.ts.map +1 -0
  185. package/dist/utils/index.js +7 -0
  186. package/dist/utils/index.js.map +1 -0
  187. package/dist/utils/insightsManager.d.ts +39 -0
  188. package/dist/utils/insightsManager.d.ts.map +1 -0
  189. package/dist/utils/insightsManager.js +63 -0
  190. package/dist/utils/insightsManager.js.map +1 -0
  191. package/dist/utils/logger.d.ts +189 -0
  192. package/dist/utils/logger.d.ts.map +1 -0
  193. package/dist/utils/logger.js +394 -0
  194. package/dist/utils/logger.js.map +1 -0
  195. package/dist/utils/progress-utils.d.ts +54 -0
  196. package/dist/utils/progress-utils.d.ts.map +1 -0
  197. package/dist/utils/progress-utils.js +74 -0
  198. package/dist/utils/progress-utils.js.map +1 -0
  199. package/dist/utils/resourceAnnotations.d.ts +36 -0
  200. package/dist/utils/resourceAnnotations.d.ts.map +1 -0
  201. package/dist/utils/resourceAnnotations.js +57 -0
  202. package/dist/utils/resourceAnnotations.js.map +1 -0
  203. package/dist/utils/where-clause.d.ts +41 -0
  204. package/dist/utils/where-clause.d.ts.map +1 -0
  205. package/dist/utils/where-clause.js +116 -0
  206. package/dist/utils/where-clause.js.map +1 -0
  207. package/package.json +83 -0
  208. 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"}