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.
- package/README.md +433 -210
- package/package.json +1 -1
- package/src/config/constants.js +18 -40
- package/src/definitions/prompts.js +124 -0
- package/src/definitions/tools.js +363 -0
- package/src/handlers/http-handlers.js +576 -4
- package/src/handlers/mcp-handlers.js +558 -69
- package/src/handlers/prompt-handlers.js +601 -0
- package/src/server/http-server.js +52 -2
- package/src/server/mcp-server.js +208 -95
- package/src/services/database-service.js +395 -55
- package/src/utils/database-operations.js +967 -0
- package/src/utils/detectors.js +55 -0
- package/src/utils/formatters.js +470 -64
- package/src/utils/validators.js +147 -58
- package/lib/database.js +0 -216
package/src/server/mcp-server.js
CHANGED
|
@@ -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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
//
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
+
}
|