@cano721/mysql-mcp-server 0.2.0 → 0.3.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 CHANGED
@@ -22,17 +22,19 @@
22
22
 
23
23
  ## 보안 기능
24
24
 
25
- - **읽기 전용 접근**: SELECT, SHOW, DESCRIBE 문 항상 허용, EXPLAIN 선택적 허용
25
+ - **읽기 전용 접근**: SELECT, SHOW, DESCRIBE 문 항상 허용
26
+ - **선택적 분석 도구**: EXPLAIN, ANALYZE 선택적 허용
26
27
  - **쿼리 검증**: SQL 인젝션 방지 및 데이터 수정 시도 차단
27
28
  - **쿼리 타임아웃**: 장시간 실행되는 쿼리로부터 리소스 보호
28
29
  - **행 제한**: 과도한 데이터 반환 방지 (최대 1000행)
29
- - **선택적 기능 제어**: EXPLAIN 쿼리 허용/차단 설정 가능
30
+ - **세밀한 권한 제어**: 분석 도구별 개별 활성화/비활성화
30
31
 
31
32
  **지원되는 SQL 명령어**:
32
33
  - `SELECT` - 데이터 조회 및 분석 (항상 허용)
33
34
  - `SHOW` - 데이터베이스/테이블/인덱스 정보 조회 (항상 허용)
34
35
  - `DESCRIBE` / `DESC` - 테이블 구조 및 컬럼 정보 (항상 허용)
35
36
  - `EXPLAIN` - 쿼리 실행 계획 및 성능 분석 (선택적 허용, 기본값: 허용)
37
+ - `ANALYZE` - 테이블 통계 분석 및 업데이트 (선택적 허용, 기본값: 비허용)
36
38
 
37
39
  ## 요구사항
38
40
 
@@ -103,6 +105,7 @@ npx -y @smithery/cli install @cano721/mysql-mcp-server --client claude
103
105
 
104
106
  **보안 설정:**
105
107
  - `MYSQL_ALLOW_EXPLAIN`: EXPLAIN 쿼리 허용 여부 (기본값: true, 비활성화: false)
108
+ - `MYSQL_ALLOW_ANALYZE`: ANALYZE 쿼리 허용 여부 (기본값: false, 활성화: true)
106
109
 
107
110
  ### 3. MCP 설정에 추가
108
111
 
@@ -264,6 +267,18 @@ MySQL 서버에서 접근 가능한 모든 데이터베이스를 나열합니다
264
267
  }
265
268
  ```
266
269
 
270
+ **ANALYZE 사용 예제** (MYSQL_ALLOW_ANALYZE=true 필요):
271
+ ```json
272
+ {
273
+ "server_name": "mysql",
274
+ "tool_name": "execute_query",
275
+ "arguments": {
276
+ "database": "my_database",
277
+ "query": "ANALYZE TABLE my_table"
278
+ }
279
+ }
280
+ ```
281
+
267
282
  **SHOW 명령어 예제**:
268
283
  ```json
269
284
  {
@@ -298,7 +313,8 @@ MySQL 연결 풀 동작을 더 세밀하게 제어하려면 추가 매개변수
298
313
  "MYSQL_CONNECT_TIMEOUT": "10000",
299
314
  "MYSQL_IDLE_TIMEOUT": "60000",
300
315
  "MYSQL_MAX_IDLE": "10",
301
- "MYSQL_ALLOW_EXPLAIN": "true"
316
+ "MYSQL_ALLOW_EXPLAIN": "true",
317
+ "MYSQL_ALLOW_ANALYZE": "false"
302
318
  },
303
319
  "disabled": false,
304
320
  "autoApprove": []
@@ -315,6 +331,7 @@ MySQL 연결 풀 동작을 더 세밀하게 제어하려면 추가 매개변수
315
331
  - `MYSQL_IDLE_TIMEOUT`: 연결이 해제되기 전까지 유휴 상태로 있을 수 있는 시간 (밀리초 단위)
316
332
  - `MYSQL_MAX_IDLE`: 풀에 유지할 최대 유휴 연결 수 설정
317
333
  - `MYSQL_ALLOW_EXPLAIN`: EXPLAIN 쿼리 허용 여부 (기본값: true)
334
+ - `MYSQL_ALLOW_ANALYZE`: ANALYZE 쿼리 허용 여부 (기본값: false)
318
335
 
319
336
  ## 테스트
320
337
 
@@ -104,6 +104,7 @@ export function getConfigFromEnv() {
104
104
  const maxIdleStr = process.env.MYSQL_MAX_IDLE;
105
105
  // Security options
106
106
  const allowExplain = process.env.MYSQL_ALLOW_EXPLAIN !== 'false'; // Default: true
107
+ const allowAnalyze = process.env.MYSQL_ALLOW_ANALYZE === 'true'; // Default: false
107
108
  if (!host)
108
109
  throw new Error('MYSQL_HOST environment variable is required');
109
110
  if (!user)
@@ -116,7 +117,8 @@ export function getConfigFromEnv() {
116
117
  const idleTimeout = idleTimeoutStr ? parseInt(idleTimeoutStr, 10) : undefined;
117
118
  const maxIdle = maxIdleStr ? parseInt(maxIdleStr, 10) : undefined;
118
119
  console.error('[Setup] Security settings:', {
119
- allowExplain
120
+ allowExplain,
121
+ allowAnalyze
120
122
  });
121
123
  return {
122
124
  host,
package/build/index.js CHANGED
@@ -46,13 +46,17 @@ const server = new Server({
46
46
  * Handler that lists available tools for MySQL database access
47
47
  */
48
48
  server.setRequestHandler(ListToolsRequestSchema, async () => {
49
- // Check if EXPLAIN is enabled
49
+ // Check if optional commands are enabled
50
50
  const allowExplain = process.env.MYSQL_ALLOW_EXPLAIN !== 'false';
51
+ const allowAnalyze = process.env.MYSQL_ALLOW_ANALYZE === 'true';
51
52
  // Build allowed commands description
52
53
  const allowedCommands = ['SELECT', 'SHOW', 'DESCRIBE'];
53
54
  if (allowExplain) {
54
55
  allowedCommands.push('EXPLAIN');
55
56
  }
57
+ if (allowAnalyze) {
58
+ allowedCommands.push('ANALYZE');
59
+ }
56
60
  const commandsDescription = `SQL query (only ${allowedCommands.join(', ')} statements are allowed)`;
57
61
  return {
58
62
  tools: [
@@ -12,6 +12,7 @@ const ALLOWED_COMMANDS = [
12
12
  // Optional commands that can be enabled/disabled
13
13
  const OPTIONAL_COMMANDS = [
14
14
  'EXPLAIN',
15
+ 'ANALYZE',
15
16
  ];
16
17
  // List of disallowed SQL commands (write operations)
17
18
  const DISALLOWED_COMMANDS = [
@@ -45,7 +46,12 @@ function getAllowedCommands() {
45
46
  // Check if EXPLAIN is enabled (default: true)
46
47
  const allowExplain = process.env.MYSQL_ALLOW_EXPLAIN !== 'false';
47
48
  if (allowExplain) {
48
- allowedCommands.push(...OPTIONAL_COMMANDS);
49
+ allowedCommands.push('EXPLAIN');
50
+ }
51
+ // Check if ANALYZE is enabled (default: false)
52
+ const allowAnalyze = process.env.MYSQL_ALLOW_ANALYZE === 'true';
53
+ if (allowAnalyze) {
54
+ allowedCommands.push('ANALYZE');
49
55
  }
50
56
  return allowedCommands;
51
57
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cano721/mysql-mcp-server",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "An MCP server that provides read-only access to MySQL databases.",
5
5
  "type": "module",
6
6
  "bin": {