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,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db-mcp - Database Adapter Interface
|
|
3
|
+
*
|
|
4
|
+
* Abstract base class for SQLite database adapters.
|
|
5
|
+
* Provides a consistent interface for SQLite database operations
|
|
6
|
+
* across WASM and native backend variants.
|
|
7
|
+
*/
|
|
8
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
9
|
+
import type { DatabaseConfig, DatabaseType, HealthStatus, QueryResult, SchemaInfo, TableInfo, AdapterCapabilities, ToolDefinition, ResourceDefinition, PromptDefinition, RequestContext, ToolGroup, ToolFilterConfig } from "../types/index.js";
|
|
10
|
+
/**
|
|
11
|
+
* Abstract base class for database adapters
|
|
12
|
+
*/
|
|
13
|
+
export declare abstract class DatabaseAdapter {
|
|
14
|
+
/** Database type identifier */
|
|
15
|
+
abstract readonly type: DatabaseType;
|
|
16
|
+
/** Human-readable adapter name */
|
|
17
|
+
abstract readonly name: string;
|
|
18
|
+
/** Adapter version */
|
|
19
|
+
abstract readonly version: string;
|
|
20
|
+
/** Connection status */
|
|
21
|
+
protected connected: boolean;
|
|
22
|
+
/** Database configuration */
|
|
23
|
+
protected config: DatabaseConfig | null;
|
|
24
|
+
/**
|
|
25
|
+
* Connect to the database
|
|
26
|
+
* @param config - Database connection configuration
|
|
27
|
+
*/
|
|
28
|
+
abstract connect(config: DatabaseConfig): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Disconnect from the database
|
|
31
|
+
*/
|
|
32
|
+
abstract disconnect(): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Check if connected to the database
|
|
35
|
+
*/
|
|
36
|
+
isConnected(): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Get health status of the database connection
|
|
39
|
+
*/
|
|
40
|
+
abstract getHealth(): Promise<HealthStatus>;
|
|
41
|
+
/**
|
|
42
|
+
* Execute a read-only query (SELECT)
|
|
43
|
+
* @param sql - SQL query string
|
|
44
|
+
* @param params - Query parameters for prepared statements
|
|
45
|
+
*/
|
|
46
|
+
abstract executeReadQuery(sql: string, params?: unknown[]): Promise<QueryResult>;
|
|
47
|
+
/**
|
|
48
|
+
* Execute a write query (INSERT, UPDATE, DELETE)
|
|
49
|
+
* @param sql - SQL query string
|
|
50
|
+
* @param params - Query parameters for prepared statements
|
|
51
|
+
* @param skipValidation - Skip security validation (for trusted internal operations)
|
|
52
|
+
*/
|
|
53
|
+
abstract executeWriteQuery(sql: string, params?: unknown[], skipValidation?: boolean): Promise<QueryResult>;
|
|
54
|
+
/**
|
|
55
|
+
* Execute any query (for admin operations)
|
|
56
|
+
* @param sql - SQL query string
|
|
57
|
+
* @param params - Query parameters for prepared statements
|
|
58
|
+
*/
|
|
59
|
+
abstract executeQuery(sql: string, params?: unknown[]): Promise<QueryResult>;
|
|
60
|
+
/**
|
|
61
|
+
* Get full database schema information
|
|
62
|
+
*/
|
|
63
|
+
abstract getSchema(): Promise<SchemaInfo>;
|
|
64
|
+
/**
|
|
65
|
+
* List all tables in the database
|
|
66
|
+
*/
|
|
67
|
+
abstract listTables(): Promise<TableInfo[]>;
|
|
68
|
+
/**
|
|
69
|
+
* Describe a specific table's structure
|
|
70
|
+
* @param tableName - Name of the table
|
|
71
|
+
*/
|
|
72
|
+
abstract describeTable(tableName: string): Promise<TableInfo>;
|
|
73
|
+
/**
|
|
74
|
+
* List available schemas/databases
|
|
75
|
+
*/
|
|
76
|
+
abstract listSchemas(): Promise<string[]>;
|
|
77
|
+
/**
|
|
78
|
+
* Get adapter capabilities
|
|
79
|
+
*/
|
|
80
|
+
abstract getCapabilities(): AdapterCapabilities;
|
|
81
|
+
/**
|
|
82
|
+
* Get supported tool groups for this adapter
|
|
83
|
+
*/
|
|
84
|
+
abstract getSupportedToolGroups(): ToolGroup[];
|
|
85
|
+
/**
|
|
86
|
+
* Get all tool definitions for this adapter
|
|
87
|
+
*/
|
|
88
|
+
abstract getToolDefinitions(): ToolDefinition[];
|
|
89
|
+
/**
|
|
90
|
+
* Get all resource definitions for this adapter
|
|
91
|
+
*/
|
|
92
|
+
abstract getResourceDefinitions(): ResourceDefinition[];
|
|
93
|
+
/**
|
|
94
|
+
* Get all prompt definitions for this adapter
|
|
95
|
+
*/
|
|
96
|
+
abstract getPromptDefinitions(): PromptDefinition[];
|
|
97
|
+
/**
|
|
98
|
+
* Register tools with the MCP server
|
|
99
|
+
* @param server - MCP server instance
|
|
100
|
+
* @param filterConfig - Tool filter configuration
|
|
101
|
+
*/
|
|
102
|
+
registerTools(server: McpServer, filterConfig: ToolFilterConfig): void;
|
|
103
|
+
/**
|
|
104
|
+
* Register a single tool with the MCP server
|
|
105
|
+
*/
|
|
106
|
+
protected abstract registerTool(server: McpServer, tool: ToolDefinition): void;
|
|
107
|
+
/**
|
|
108
|
+
* Register resources with the MCP server
|
|
109
|
+
*/
|
|
110
|
+
registerResources(server: McpServer): void;
|
|
111
|
+
/**
|
|
112
|
+
* Register a single resource with the MCP server
|
|
113
|
+
*/
|
|
114
|
+
protected abstract registerResource(server: McpServer, resource: ResourceDefinition): void;
|
|
115
|
+
/**
|
|
116
|
+
* Register prompts with the MCP server
|
|
117
|
+
*/
|
|
118
|
+
registerPrompts(server: McpServer): void;
|
|
119
|
+
/**
|
|
120
|
+
* Register a single prompt with the MCP server
|
|
121
|
+
*/
|
|
122
|
+
protected abstract registerPrompt(server: McpServer, prompt: PromptDefinition): void;
|
|
123
|
+
/**
|
|
124
|
+
* Validate query for safety (SQL injection prevention)
|
|
125
|
+
* @param sql - SQL query to validate
|
|
126
|
+
* @param isReadOnly - Whether to enforce read-only restrictions
|
|
127
|
+
*/
|
|
128
|
+
protected validateQuery(sql: string, isReadOnly: boolean): void;
|
|
129
|
+
/**
|
|
130
|
+
* Create a request context for tool execution
|
|
131
|
+
* @param requestId Optional request ID for tracing
|
|
132
|
+
* @param server Optional MCP Server instance for progress notifications
|
|
133
|
+
* @param progressToken Optional progress token from client request _meta
|
|
134
|
+
*/
|
|
135
|
+
protected createContext(requestId?: string, server?: unknown, progressToken?: string | number): RequestContext;
|
|
136
|
+
/**
|
|
137
|
+
* Get adapter info for logging/debugging
|
|
138
|
+
*/
|
|
139
|
+
getInfo(): Record<string, unknown>;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=DatabaseAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatabaseAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/DatabaseAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db-mcp - Database Adapter Interface
|
|
3
|
+
*
|
|
4
|
+
* Abstract base class for SQLite database adapters.
|
|
5
|
+
* Provides a consistent interface for SQLite database operations
|
|
6
|
+
* across WASM and native backend variants.
|
|
7
|
+
*/
|
|
8
|
+
import { isToolEnabled } from "../filtering/ToolFilter.js";
|
|
9
|
+
/**
|
|
10
|
+
* Abstract base class for database adapters
|
|
11
|
+
*/
|
|
12
|
+
export class DatabaseAdapter {
|
|
13
|
+
/** Connection status */
|
|
14
|
+
connected = false;
|
|
15
|
+
/** Database configuration */
|
|
16
|
+
config = null;
|
|
17
|
+
/**
|
|
18
|
+
* Check if connected to the database
|
|
19
|
+
*/
|
|
20
|
+
isConnected() {
|
|
21
|
+
return this.connected;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Register tools with the MCP server
|
|
25
|
+
* @param server - MCP server instance
|
|
26
|
+
* @param filterConfig - Tool filter configuration
|
|
27
|
+
*/
|
|
28
|
+
registerTools(server, filterConfig) {
|
|
29
|
+
const tools = this.getToolDefinitions();
|
|
30
|
+
for (const tool of tools) {
|
|
31
|
+
if (!isToolEnabled(tool, filterConfig)) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
// Register with MCP server
|
|
35
|
+
this.registerTool(server, tool);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Register resources with the MCP server
|
|
40
|
+
*/
|
|
41
|
+
registerResources(server) {
|
|
42
|
+
const resources = this.getResourceDefinitions();
|
|
43
|
+
for (const resource of resources) {
|
|
44
|
+
this.registerResource(server, resource);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Register prompts with the MCP server
|
|
49
|
+
*/
|
|
50
|
+
registerPrompts(server) {
|
|
51
|
+
const prompts = this.getPromptDefinitions();
|
|
52
|
+
for (const prompt of prompts) {
|
|
53
|
+
this.registerPrompt(server, prompt);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// ===========================================================================
|
|
57
|
+
// Utility Methods
|
|
58
|
+
// ===========================================================================
|
|
59
|
+
/**
|
|
60
|
+
* Validate query for safety (SQL injection prevention)
|
|
61
|
+
* @param sql - SQL query to validate
|
|
62
|
+
* @param isReadOnly - Whether to enforce read-only restrictions
|
|
63
|
+
*/
|
|
64
|
+
validateQuery(sql, isReadOnly) {
|
|
65
|
+
const trimmedSql = sql.trim().toUpperCase();
|
|
66
|
+
if (isReadOnly) {
|
|
67
|
+
// For read-only queries, block mutating statements
|
|
68
|
+
const writePrefixes = [
|
|
69
|
+
"INSERT",
|
|
70
|
+
"UPDATE",
|
|
71
|
+
"DELETE",
|
|
72
|
+
"DROP",
|
|
73
|
+
"CREATE",
|
|
74
|
+
"ALTER",
|
|
75
|
+
"TRUNCATE",
|
|
76
|
+
];
|
|
77
|
+
for (const prefix of writePrefixes) {
|
|
78
|
+
if (trimmedSql.startsWith(prefix)) {
|
|
79
|
+
throw new Error(`Read-only mode: ${prefix} statements are not allowed`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Block obvious SQL injection patterns
|
|
84
|
+
// Note: This is a basic check; parameterized queries are the primary defense
|
|
85
|
+
const dangerousPatterns = [
|
|
86
|
+
/;\s*DROP\s+/i,
|
|
87
|
+
/;\s*DELETE\s+/i,
|
|
88
|
+
/;\s*TRUNCATE\s+/i,
|
|
89
|
+
/--.*$/m, // SQL comments (potential injection)
|
|
90
|
+
/\/\*.*\*\//s, // Block comments
|
|
91
|
+
];
|
|
92
|
+
for (const pattern of dangerousPatterns) {
|
|
93
|
+
if (pattern.test(sql)) {
|
|
94
|
+
throw new Error("Query contains potentially dangerous patterns");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Create a request context for tool execution
|
|
100
|
+
* @param requestId Optional request ID for tracing
|
|
101
|
+
* @param server Optional MCP Server instance for progress notifications
|
|
102
|
+
* @param progressToken Optional progress token from client request _meta
|
|
103
|
+
*/
|
|
104
|
+
createContext(requestId, server, progressToken) {
|
|
105
|
+
const context = {
|
|
106
|
+
timestamp: new Date(),
|
|
107
|
+
requestId: requestId ?? crypto.randomUUID(),
|
|
108
|
+
};
|
|
109
|
+
if (server !== undefined) {
|
|
110
|
+
context.server = server;
|
|
111
|
+
}
|
|
112
|
+
if (progressToken !== undefined) {
|
|
113
|
+
context.progressToken = progressToken;
|
|
114
|
+
}
|
|
115
|
+
return context;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get adapter info for logging/debugging
|
|
119
|
+
*/
|
|
120
|
+
getInfo() {
|
|
121
|
+
return {
|
|
122
|
+
type: this.type,
|
|
123
|
+
name: this.name,
|
|
124
|
+
version: this.version,
|
|
125
|
+
connected: this.connected,
|
|
126
|
+
capabilities: this.getCapabilities(),
|
|
127
|
+
toolGroups: this.getSupportedToolGroups(),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=DatabaseAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatabaseAdapter.js","sourceRoot":"","sources":["../../src/adapters/DatabaseAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Schema Manager
|
|
3
|
+
*
|
|
4
|
+
* Provides TTL-based caching for schema metadata operations.
|
|
5
|
+
* Ported from mysql-mcp's SchemaManager pattern.
|
|
6
|
+
*/
|
|
7
|
+
import type { QueryResult, TableInfo, SchemaInfo, IndexInfo } from "../../types/index.js";
|
|
8
|
+
export interface QueryExecutor {
|
|
9
|
+
executeReadQuery(sql: string, params?: unknown[]): Promise<QueryResult>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* SchemaManager provides cached access to database schema metadata.
|
|
13
|
+
* Reduces repeated schema queries during tool/resource invocations.
|
|
14
|
+
*/
|
|
15
|
+
export declare class SchemaManager {
|
|
16
|
+
private executor;
|
|
17
|
+
private metadataCache;
|
|
18
|
+
private cacheTtlMs;
|
|
19
|
+
constructor(executor: QueryExecutor);
|
|
20
|
+
/**
|
|
21
|
+
* Get cached value if not expired
|
|
22
|
+
*/
|
|
23
|
+
private getCached;
|
|
24
|
+
/**
|
|
25
|
+
* Set cache value
|
|
26
|
+
*/
|
|
27
|
+
private setCache;
|
|
28
|
+
/**
|
|
29
|
+
* Clear all cached metadata (useful after DDL operations)
|
|
30
|
+
*/
|
|
31
|
+
clearCache(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Get the current cache TTL in milliseconds
|
|
34
|
+
*/
|
|
35
|
+
getCacheTtl(): number;
|
|
36
|
+
/**
|
|
37
|
+
* Get full database schema (cached)
|
|
38
|
+
*/
|
|
39
|
+
getSchema(): Promise<SchemaInfo>;
|
|
40
|
+
/**
|
|
41
|
+
* List all tables (cached)
|
|
42
|
+
*/
|
|
43
|
+
listTables(): Promise<TableInfo[]>;
|
|
44
|
+
/**
|
|
45
|
+
* Describe a table's structure (cached per table)
|
|
46
|
+
*/
|
|
47
|
+
describeTable(tableName: string): Promise<TableInfo>;
|
|
48
|
+
/**
|
|
49
|
+
* Get all indexes in a single query (cached)
|
|
50
|
+
* Performance optimization: eliminates N+1 query pattern
|
|
51
|
+
*/
|
|
52
|
+
getAllIndexes(): Promise<IndexInfo[]>;
|
|
53
|
+
/**
|
|
54
|
+
* Get indexes for a specific table (uses cached all_indexes)
|
|
55
|
+
*/
|
|
56
|
+
getTableIndexes(tableName: string): Promise<IndexInfo[]>;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=SchemaManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaManager.d.ts","sourceRoot":"","sources":["../../../src/adapters/sqlite/SchemaManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,UAAU,EACV,SAAS,EAEV,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,aAAa;IAC5B,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACzE;AAgBD;;;GAGG;AACH,qBAAa,aAAa;IAIZ,OAAO,CAAC,QAAQ;IAH5B,OAAO,CAAC,aAAa,CAA0C;IAC/D,OAAO,CAAC,UAAU,CAAwB;gBAEtB,QAAQ,EAAE,aAAa;IAE3C;;OAEG;IACH,OAAO,CAAC,SAAS;IAUjB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAIhB;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;IAYtC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAoCxC;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAmD1D;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAwC3C;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CAI/D"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Schema Manager
|
|
3
|
+
*
|
|
4
|
+
* Provides TTL-based caching for schema metadata operations.
|
|
5
|
+
* Ported from mysql-mcp's SchemaManager pattern.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Default cache TTL in milliseconds (configurable via METADATA_CACHE_TTL_MS env var)
|
|
9
|
+
* SQLite is embedded/local, so 5s default (vs mysql-mcp's 30s for network latency)
|
|
10
|
+
*/
|
|
11
|
+
const DEFAULT_CACHE_TTL_MS = parseInt(process.env["METADATA_CACHE_TTL_MS"] ?? "5000", 10);
|
|
12
|
+
/**
|
|
13
|
+
* SchemaManager provides cached access to database schema metadata.
|
|
14
|
+
* Reduces repeated schema queries during tool/resource invocations.
|
|
15
|
+
*/
|
|
16
|
+
export class SchemaManager {
|
|
17
|
+
executor;
|
|
18
|
+
metadataCache = new Map();
|
|
19
|
+
cacheTtlMs = DEFAULT_CACHE_TTL_MS;
|
|
20
|
+
constructor(executor) {
|
|
21
|
+
this.executor = executor;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get cached value if not expired
|
|
25
|
+
*/
|
|
26
|
+
getCached(key) {
|
|
27
|
+
const entry = this.metadataCache.get(key);
|
|
28
|
+
if (!entry)
|
|
29
|
+
return undefined;
|
|
30
|
+
if (Date.now() - entry.timestamp > this.cacheTtlMs) {
|
|
31
|
+
this.metadataCache.delete(key);
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
return entry.data;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Set cache value
|
|
38
|
+
*/
|
|
39
|
+
setCache(key, data) {
|
|
40
|
+
this.metadataCache.set(key, { data, timestamp: Date.now() });
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Clear all cached metadata (useful after DDL operations)
|
|
44
|
+
*/
|
|
45
|
+
clearCache() {
|
|
46
|
+
this.metadataCache.clear();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get the current cache TTL in milliseconds
|
|
50
|
+
*/
|
|
51
|
+
getCacheTtl() {
|
|
52
|
+
return this.cacheTtlMs;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get full database schema (cached)
|
|
56
|
+
*/
|
|
57
|
+
async getSchema() {
|
|
58
|
+
const cached = this.getCached("schema");
|
|
59
|
+
if (cached)
|
|
60
|
+
return cached;
|
|
61
|
+
const tables = await this.listTables();
|
|
62
|
+
const indexes = await this.getAllIndexes();
|
|
63
|
+
const schema = { tables, indexes };
|
|
64
|
+
this.setCache("schema", schema);
|
|
65
|
+
return schema;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* List all tables (cached)
|
|
69
|
+
*/
|
|
70
|
+
async listTables() {
|
|
71
|
+
const cached = this.getCached("tables");
|
|
72
|
+
if (cached)
|
|
73
|
+
return cached;
|
|
74
|
+
const result = await this.executor.executeReadQuery(`SELECT name, type FROM sqlite_master
|
|
75
|
+
WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%'
|
|
76
|
+
ORDER BY name`);
|
|
77
|
+
const tables = [];
|
|
78
|
+
for (const row of result.rows ?? []) {
|
|
79
|
+
const name = row["name"];
|
|
80
|
+
const type = row["type"];
|
|
81
|
+
// Skip FTS5 virtual tables and shadow tables (they're internal implementation details)
|
|
82
|
+
// - Virtual tables: end with "_fts" (e.g., "articles_fts")
|
|
83
|
+
// - Shadow tables: contain "_fts_" (e.g., "articles_fts_config", "articles_fts_data")
|
|
84
|
+
if (name.endsWith("_fts") || name.includes("_fts_")) {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
const tableInfo = await this.describeTable(name);
|
|
89
|
+
tables.push({ ...tableInfo, type });
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// FTS5 virtual tables fail PRAGMA table_info in WASM mode (no FTS5 module)
|
|
93
|
+
// Skip these tables rather than failing the entire operation
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
this.setCache("tables", tables);
|
|
98
|
+
return tables;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Describe a table's structure (cached per table)
|
|
102
|
+
*/
|
|
103
|
+
async describeTable(tableName) {
|
|
104
|
+
const cacheKey = `table_${tableName}`;
|
|
105
|
+
const cached = this.getCached(cacheKey);
|
|
106
|
+
if (cached)
|
|
107
|
+
return cached;
|
|
108
|
+
// Validate table name
|
|
109
|
+
if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(tableName)) {
|
|
110
|
+
throw new Error("Invalid table name");
|
|
111
|
+
}
|
|
112
|
+
const result = await this.executor.executeReadQuery(`PRAGMA table_info("${tableName}")`);
|
|
113
|
+
// Check if table exists (PRAGMA returns empty for non-existent tables)
|
|
114
|
+
if (!result.rows || result.rows.length === 0) {
|
|
115
|
+
throw new Error(`Table '${tableName}' does not exist`);
|
|
116
|
+
}
|
|
117
|
+
const columns = (result.rows ?? []).map((row) => ({
|
|
118
|
+
name: row["name"],
|
|
119
|
+
type: row["type"],
|
|
120
|
+
nullable: row["notnull"] === 0,
|
|
121
|
+
primaryKey: row["pk"] === 1,
|
|
122
|
+
defaultValue: row["dflt_value"],
|
|
123
|
+
}));
|
|
124
|
+
// Get row count (wrapped in try-catch for FTS5/virtual tables in WASM mode)
|
|
125
|
+
let rowCount = 0;
|
|
126
|
+
try {
|
|
127
|
+
const countResult = await this.executor.executeReadQuery(`SELECT COUNT(*) as count FROM "${tableName}"`);
|
|
128
|
+
rowCount = countResult.rows?.[0]?.["count"] ?? 0;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// FTS5 virtual tables may fail in WASM mode (no FTS5 module)
|
|
132
|
+
// Return 0 for row count rather than failing the entire operation
|
|
133
|
+
rowCount = 0;
|
|
134
|
+
}
|
|
135
|
+
const tableInfo = {
|
|
136
|
+
name: tableName,
|
|
137
|
+
type: "table",
|
|
138
|
+
columns,
|
|
139
|
+
rowCount,
|
|
140
|
+
};
|
|
141
|
+
this.setCache(cacheKey, tableInfo);
|
|
142
|
+
return tableInfo;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get all indexes in a single query (cached)
|
|
146
|
+
* Performance optimization: eliminates N+1 query pattern
|
|
147
|
+
*/
|
|
148
|
+
async getAllIndexes() {
|
|
149
|
+
const cached = this.getCached("all_indexes");
|
|
150
|
+
if (cached)
|
|
151
|
+
return cached;
|
|
152
|
+
const result = await this.executor.executeReadQuery(`SELECT name, tbl_name, sql FROM sqlite_master
|
|
153
|
+
WHERE type = 'index' AND sql IS NOT NULL`);
|
|
154
|
+
const indexes = [];
|
|
155
|
+
for (const row of result.rows ?? []) {
|
|
156
|
+
const indexName = row["name"];
|
|
157
|
+
const tableName = row["tbl_name"];
|
|
158
|
+
const sql = row["sql"];
|
|
159
|
+
// Get column info for this index via PRAGMA index_info
|
|
160
|
+
let columns = [];
|
|
161
|
+
try {
|
|
162
|
+
const indexInfo = await this.executor.executeReadQuery(`PRAGMA index_info("${indexName}")`);
|
|
163
|
+
columns = (indexInfo.rows ?? []).map((col) => col["name"]);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// If PRAGMA fails, fall back to empty columns
|
|
167
|
+
columns = [];
|
|
168
|
+
}
|
|
169
|
+
indexes.push({
|
|
170
|
+
name: indexName,
|
|
171
|
+
tableName,
|
|
172
|
+
columns,
|
|
173
|
+
unique: sql?.toUpperCase().includes("UNIQUE") ?? false,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
this.setCache("all_indexes", indexes);
|
|
177
|
+
return indexes;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get indexes for a specific table (uses cached all_indexes)
|
|
181
|
+
*/
|
|
182
|
+
async getTableIndexes(tableName) {
|
|
183
|
+
const allIndexes = await this.getAllIndexes();
|
|
184
|
+
return allIndexes.filter((idx) => idx.tableName === tableName);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=SchemaManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaManager.js","sourceRoot":"","sources":["../../../src/adapters/sqlite/SchemaManager.ts"],"names":[],"mappings":"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"}
|