sqlcipher-mcp-server 1.0.4 → 2.0.0

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.
@@ -1,95 +1,208 @@
1
- /**
2
- * MCP Server
3
- * Model Context Protocol server setup and initialization
4
- */
5
-
6
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
7
- import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
8
- import {
9
- CallToolRequestSchema,
10
- ListToolsRequestSchema,
11
- } from '@modelcontextprotocol/sdk/types.js';
12
-
13
- import { SERVER_CONFIG } from '../config/constants.js';
14
- import { getConfigurationWarnings } from '../config/environment.js';
15
- import { handleListTools, handleExecuteQuery, handleUnknownTool } from '../handlers/mcp-handlers.js';
16
-
17
- /**
18
- * Create and configure MCP server
19
- * @returns {Server} Configured MCP server instance
20
- */
21
- export function createMcpServer() {
22
- const server = new Server(
23
- {
24
- name: SERVER_CONFIG.name,
25
- version: SERVER_CONFIG.version,
26
- },
27
- {
28
- capabilities: {
29
- tools: {},
30
- },
31
- }
32
- );
33
-
34
- // Register list tools handler
35
- server.setRequestHandler(ListToolsRequestSchema, async () => {
36
- return handleListTools();
37
- });
38
-
39
- // Register tool execution handler
40
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
41
- const { name, arguments: args } = request.params;
42
-
43
- if (name === 'execute_query') {
44
- return await handleExecuteQuery(args);
45
- } else {
46
- return handleUnknownTool(name);
47
- }
48
- });
49
-
50
- return server;
51
- }
52
-
53
- /**
54
- * Start the MCP server
55
- * @returns {Promise<void>}
56
- */
57
- export async function startMcpServer() {
58
- // Check configuration and log warnings
59
- const warnings = getConfigurationWarnings();
60
- if (warnings.length > 0) {
61
- console.error('Warning: ' + warnings.join(' '));
62
- } else {
63
- console.error('Configuration loaded: Database path and password set via environment variables.');
64
- }
65
-
66
- // Create server
67
- const server = createMcpServer();
68
-
69
- // Create stdio transport
70
- const transport = new StdioServerTransport();
71
-
72
- // Add error handler for transport errors
73
- transport.onerror = (error) => {
74
- console.error('Transport error:', error);
75
- };
76
-
77
- // Connect server to transport
78
- await server.connect(transport);
79
-
80
- console.error('SQLCipher MCP Server running on stdio');
81
-
82
- // Keep the process alive - keep stdin open to prevent the process from exiting
83
- process.stdin.resume();
84
-
85
- // Handle stdin end event (when client disconnects)
86
- process.stdin.on('end', () => {
87
- // When stdin ends, exit gracefully
88
- process.exit(0);
89
- });
90
-
91
- // Handle errors on stdin
92
- process.stdin.on('error', (error) => {
93
- console.error('Stdin error:', error);
94
- });
95
- }
1
+ /**
2
+ * MCP Server
3
+ * Model Context Protocol server setup and initialization
4
+ */
5
+
6
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
7
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
8
+ import {
9
+ CallToolRequestSchema,
10
+ ListToolsRequestSchema,
11
+ ListPromptsRequestSchema,
12
+ GetPromptRequestSchema,
13
+ } from '@modelcontextprotocol/sdk/types.js';
14
+
15
+ import { SERVER_CONFIG } from '../config/constants.js';
16
+ import { getConfigurationWarnings } from '../config/environment.js';
17
+ import {
18
+ handleListTools,
19
+ handleExecuteQuery,
20
+ handleListTables,
21
+ handleGetTableSchema,
22
+ handleListColumns,
23
+ handleGetForeignKeys,
24
+ handleGetIndexes,
25
+ handleGetDatabaseInfo,
26
+ handleGetTableInfo,
27
+ handleTestConnection,
28
+ handleExplainQuery,
29
+ handleValidateQuerySyntax,
30
+ handleSuggestQuery,
31
+ handleGetTableStatistics,
32
+ handleSampleTableData,
33
+ handleGetColumnStatistics,
34
+ handleSearchTables,
35
+ handleSearchColumns,
36
+ handleFindRelatedTables,
37
+ handleUnknownTool
38
+ } from '../handlers/mcp-handlers.js';
39
+
40
+ import {
41
+ handleListPrompts,
42
+ handleExploreDatabaseSchemaPrompt,
43
+ handleDescribeTableStructurePrompt,
44
+ handleFindDataRelationshipsPrompt,
45
+ handleGenerateQueryTemplatePrompt,
46
+ handleOptimizeQueryPrompt,
47
+ handleAnalyzeTableDataPrompt,
48
+ handleCompareTablesPrompt
49
+ } from '../handlers/prompt-handlers.js';
50
+
51
+ /**
52
+ * Create and configure MCP server
53
+ * @returns {Server} Configured MCP server instance
54
+ */
55
+ export function createMcpServer() {
56
+ const server = new Server(
57
+ {
58
+ name: SERVER_CONFIG.name,
59
+ version: SERVER_CONFIG.version,
60
+ },
61
+ {
62
+ capabilities: {
63
+ tools: {},
64
+ prompts: {},
65
+ },
66
+ }
67
+ );
68
+
69
+ // Register list tools handler
70
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
71
+ return handleListTools();
72
+ });
73
+
74
+ // Register list prompts handler
75
+ server.setRequestHandler(ListPromptsRequestSchema, async () => {
76
+ return handleListPrompts();
77
+ });
78
+
79
+ // Register get prompt handler
80
+ server.setRequestHandler(GetPromptRequestSchema, async (request) => {
81
+ const { name, arguments: args } = request.params;
82
+
83
+ try {
84
+ switch (name) {
85
+ case 'explore_database_schema':
86
+ return await handleExploreDatabaseSchemaPrompt(args);
87
+ case 'describe_table_structure':
88
+ return await handleDescribeTableStructurePrompt(args);
89
+ case 'find_data_relationships':
90
+ return await handleFindDataRelationshipsPrompt(args);
91
+ case 'generate_query_template':
92
+ return await handleGenerateQueryTemplatePrompt(args);
93
+ case 'optimize_query':
94
+ return await handleOptimizeQueryPrompt(args);
95
+ case 'analyze_table_data':
96
+ return await handleAnalyzeTableDataPrompt(args);
97
+ case 'compare_tables':
98
+ return await handleCompareTablesPrompt(args);
99
+ default:
100
+ throw new Error(`Unknown prompt: ${name}`);
101
+ }
102
+ } catch (error) {
103
+ return {
104
+ messages: [
105
+ {
106
+ role: 'assistant',
107
+ content: {
108
+ type: 'text',
109
+ text: `Error: ${error.message}`
110
+ }
111
+ }
112
+ ]
113
+ };
114
+ }
115
+ });
116
+
117
+ // Register tool execution handler
118
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
119
+ const { name, arguments: args } = request.params;
120
+
121
+ switch (name) {
122
+ case 'execute_query':
123
+ return await handleExecuteQuery(args);
124
+ case 'list_tables':
125
+ return await handleListTables(args);
126
+ case 'get_table_schema':
127
+ return await handleGetTableSchema(args);
128
+ case 'list_columns':
129
+ return await handleListColumns(args);
130
+ case 'get_foreign_keys':
131
+ return await handleGetForeignKeys(args);
132
+ case 'get_indexes':
133
+ return await handleGetIndexes(args);
134
+ case 'get_database_info':
135
+ return await handleGetDatabaseInfo(args);
136
+ case 'get_table_info':
137
+ return await handleGetTableInfo(args);
138
+ case 'test_connection':
139
+ return await handleTestConnection(args);
140
+ case 'explain_query':
141
+ return await handleExplainQuery(args);
142
+ case 'validate_query_syntax':
143
+ return await handleValidateQuerySyntax(args);
144
+ case 'suggest_query':
145
+ return await handleSuggestQuery(args);
146
+ case 'get_table_statistics':
147
+ return await handleGetTableStatistics(args);
148
+ case 'sample_table_data':
149
+ return await handleSampleTableData(args);
150
+ case 'get_column_statistics':
151
+ return await handleGetColumnStatistics(args);
152
+ case 'search_tables':
153
+ return await handleSearchTables(args);
154
+ case 'search_columns':
155
+ return await handleSearchColumns(args);
156
+ case 'find_related_tables':
157
+ return await handleFindRelatedTables(args);
158
+ default:
159
+ return handleUnknownTool(name);
160
+ }
161
+ });
162
+
163
+ return server;
164
+ }
165
+
166
+ /**
167
+ * Start the MCP server
168
+ * @returns {Promise<void>}
169
+ */
170
+ export async function startMcpServer() {
171
+ // Check configuration and log warnings
172
+ const warnings = getConfigurationWarnings();
173
+ if (warnings.length > 0) {
174
+ console.error('Warning: ' + warnings.join(' '));
175
+ } else {
176
+ console.error('Configuration loaded: Database path and password set via environment variables.');
177
+ }
178
+
179
+ // Create server
180
+ const server = createMcpServer();
181
+
182
+ // Create stdio transport
183
+ const transport = new StdioServerTransport();
184
+
185
+ // Add error handler for transport errors
186
+ transport.onerror = (error) => {
187
+ console.error('Transport error:', error);
188
+ };
189
+
190
+ // Connect server to transport
191
+ await server.connect(transport);
192
+
193
+ console.error('SQLCipher MCP Server running on stdio');
194
+
195
+ // Keep the process alive - keep stdin open to prevent the process from exiting
196
+ process.stdin.resume();
197
+
198
+ // Handle stdin end event (when client disconnects)
199
+ process.stdin.on('end', () => {
200
+ // When stdin ends, exit gracefully
201
+ process.exit(0);
202
+ });
203
+
204
+ // Handle errors on stdin
205
+ process.stdin.on('error', (error) => {
206
+ console.error('Stdin error:', error);
207
+ });
208
+ }