@berthojoris/mcp-mysql-server 1.4.12 → 1.4.13

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
@@ -1,4 +1,4 @@
1
- # MySQL MCP Server
1
+ # MySQL MCP Server
2
2
 
3
3
  A fully-featured **Model Context Protocol (MCP)** server for MySQL database integration with AI agents like Claude Desktop, Cline, Windsurf, and other MCP-compatible tools.
4
4
 
@@ -7,21 +7,21 @@ A fully-featured **Model Context Protocol (MCP)** server for MySQL database inte
7
7
 
8
8
  ---
9
9
 
10
- ## 🌟 Features
10
+ ## 🌟 Features
11
11
 
12
- - **Full MCP Protocol Support** - Works with Claude Desktop, Cline, Windsurf, and any MCP-compatible AI agent
13
- - 🔒 **Secure by Default** - Parameterized queries, SQL injection protection, permission-based access control
14
- - 🛠️ **30 Powerful Tools** - Complete database operations (CRUD, DDL, queries, schema inspection, transactions, stored procedures, bulk operations)
15
- - 🎛️ **Dynamic Per-Project Permissions** - Each AI agent can have different access levels
16
- - 🏗️ **DDL Support** - Create, alter, and drop tables (when explicitly enabled)
17
- - 💰 **Transaction Support** - Full ACID transaction management (BEGIN, COMMIT, ROLLBACK)
18
- - 🌐 **Dual Mode** - Run as MCP server OR as REST API
19
- - 📊 **Rich Metadata** - Table schemas, relationships, connection info
20
- - **TypeScript** - Fully typed with TypeScript definitions
12
+ - ✅ **Full MCP Protocol Support** - Works with Claude Desktop, Cline, Windsurf, and any MCP-compatible AI agent
13
+ - 🔒 **Secure by Default** - Parameterized queries, SQL injection protection, permission-based access control
14
+ - 🛠️ **30 Powerful Tools** - Complete database operations (CRUD, DDL, queries, schema inspection, transactions, stored procedures, bulk operations)
15
+ - 🎛️ **Dynamic Per-Project Permissions** - Each AI agent can have different access levels
16
+ - 🏗️ **DDL Support** - Create, alter, and drop tables (when explicitly enabled)
17
+ - 💰 **Transaction Support** - Full ACID transaction management (BEGIN, COMMIT, ROLLBACK)
18
+ - 🌐 **Dual Mode** - Run as MCP server OR as REST API
19
+ - 📊 **Rich Metadata** - Table schemas, relationships, connection info
20
+ - âš¡ **TypeScript** - Fully typed with TypeScript definitions
21
21
 
22
22
  ---
23
23
 
24
- ## 📦 Installation
24
+ ## 📦 Installation
25
25
 
26
26
  ### Option 1: Quick Start (npx)
27
27
 
@@ -40,7 +40,7 @@ mcp-mysql mysql://user:pass@localhost:3306/db "list,read,utility"
40
40
 
41
41
  ---
42
42
 
43
- ## 🚀 Quick Start
43
+ ## 🚀 Quick Start
44
44
 
45
45
  ### 1. Set Up Environment
46
46
 
@@ -254,7 +254,7 @@ Control access with these permission categories:
254
254
  {
255
255
  "args": [
256
256
  "mysql://user:pass@localhost:3306/db",
257
- "list,read,utility" // Permissions here
257
+ "list,read,utility" // ← Permissions here
258
258
  ]
259
259
  }
260
260
  ```
@@ -347,7 +347,7 @@ You can have different databases with different permissions in the same AI agent
347
347
 
348
348
  ---
349
349
 
350
- ## 🚫 Permission Error Handling
350
+ ## 🚫 Permission Error Handling
351
351
 
352
352
  The MySQL MCP Server provides clear, user-friendly error messages when operations are attempted without proper permissions. This helps users understand exactly what permissions are needed and how to enable them.
353
353
 
@@ -356,7 +356,7 @@ The MySQL MCP Server provides clear, user-friendly error messages when operation
356
356
  When a tool is called without the required permission, you'll receive a detailed error message like:
357
357
 
358
358
  ```
359
- Permission denied: Cannot use tool 'create_table'. This tool requires 'ddl' permission.
359
+ ❌ Permission denied: Cannot use tool 'create_table'. This tool requires 'ddl' permission.
360
360
 
361
361
  Current permissions: list,read,utility
362
362
  To enable this tool, add 'ddl' to your permissions configuration.
@@ -375,7 +375,7 @@ Tool description: Create new tables with columns and indexes
375
375
 
376
376
  **Error response when DDL not enabled:**
377
377
  ```
378
- Permission denied: Cannot use tool 'create_table'. This tool requires 'ddl' permission.
378
+ ❌ Permission denied: Cannot use tool 'create_table'. This tool requires 'ddl' permission.
379
379
 
380
380
  Current permissions: list,read,utility
381
381
  To enable this tool, add 'ddl' to your permissions configuration.
@@ -392,7 +392,7 @@ Tool description: Create new tables with columns and indexes
392
392
 
393
393
  **Error response when CREATE not enabled:**
394
394
  ```
395
- Permission denied: Cannot use tool 'create_record'. This tool requires 'create' permission.
395
+ ❌ Permission denied: Cannot use tool 'create_record'. This tool requires 'create' permission.
396
396
 
397
397
  Current permissions: list,read,utility
398
398
  To enable this tool, add 'create' to your permissions configuration.
@@ -409,7 +409,7 @@ Tool description: Insert new records with automatic SQL generation
409
409
 
410
410
  **Error response when UPDATE not enabled:**
411
411
  ```
412
- Permission denied: Cannot use tool 'update_record'. This tool requires 'update' permission.
412
+ ❌ Permission denied: Cannot use tool 'update_record'. This tool requires 'update' permission.
413
413
 
414
414
  Current permissions: list,read,utility
415
415
  To enable this tool, add 'update' to your permissions configuration.
@@ -422,11 +422,11 @@ Tool description: Update existing records based on conditions
422
422
 
423
423
  ### Permission Error Benefits
424
424
 
425
- 1. **🎯 Clear Guidance** - Exact permission needed and how to add it
426
- 2. **📋 Current State** - Shows what permissions are currently active
427
- 3. **💡 Example Configuration** - Ready-to-use configuration example
428
- 4. **📖 Tool Context** - Explains what the tool does
429
- 5. **🔒 Security** - Prevents unauthorized operations while being helpful
425
+ 1. **🎯 Clear Guidance** - Exact permission needed and how to add it
426
+ 2. **📋 Current State** - Shows what permissions are currently active
427
+ 3. **💡 Example Configuration** - Ready-to-use configuration example
428
+ 4. **📖 Tool Context** - Explains what the tool does
429
+ 5. **🔒 Security** - Prevents unauthorized operations while being helpful
430
430
 
431
431
  ### Troubleshooting Permission Errors
432
432
 
@@ -461,7 +461,7 @@ After (DDL enabled):
461
461
 
462
462
  ---
463
463
 
464
- ## 🛠️ Available Tools
464
+ ## 🛠️ Available Tools
465
465
 
466
466
  The MCP server provides **30 powerful tools**:
467
467
 
@@ -538,1249 +538,31 @@ The MCP server provides **30 powerful tools**:
538
538
 
539
539
  ---
540
540
 
541
- ## 🏗️ DDL Operations
541
+ ## 📚 Detailed Documentation
542
542
 
543
- DDL (Data Definition Language) operations allow AI to create, modify, and delete tables.
543
+ For comprehensive documentation on all features, please see **[DOCUMENTATIONS.md](DOCUMENTATIONS.md)** which includes:
544
544
 
545
- ### ⚠️ Enable DDL with Caution
546
-
547
- DDL operations are **disabled by default** for safety. Add `ddl` to permissions to enable:
548
-
549
- ```json
550
- {
551
- "args": [
552
- "mysql://user:pass@localhost:3306/db",
553
- "list,read,create,update,delete,ddl,utility"
554
- ]
555
- }
556
- ```
557
-
558
- ### DDL Tool Examples
559
-
560
- #### Create Table
561
-
562
- **User prompt:** *"Create a users table with id, username, email, and created_at"*
563
-
564
- **AI will execute:**
565
- ```json
566
- {
567
- "tool": "create_table",
568
- "arguments": {
569
- "table_name": "users",
570
- "columns": [
571
- {"name": "id", "type": "INT", "primary_key": true, "auto_increment": true},
572
- {"name": "username", "type": "VARCHAR(255)", "nullable": false},
573
- {"name": "email", "type": "VARCHAR(255)", "nullable": false},
574
- {"name": "created_at", "type": "DATETIME", "default": "CURRENT_TIMESTAMP"}
575
- ]
576
- }
577
- }
578
- ```
579
-
580
- #### Alter Table
581
-
582
- **User prompt:** *"Add a phone column to the users table"*
583
-
584
- **AI will execute:**
585
- ```json
586
- {
587
- "tool": "alter_table",
588
- "arguments": {
589
- "table_name": "users",
590
- "operations": [
591
- {
592
- "type": "add_column",
593
- "column_name": "phone",
594
- "column_type": "VARCHAR(20)",
595
- "nullable": true
596
- }
597
- ]
598
- }
599
- }
600
- ```
601
-
602
- #### Drop Table
603
-
604
- **User prompt:** *"Drop the temp_data table"*
605
-
606
- **AI will execute:**
607
- ```json
608
- {
609
- "tool": "drop_table",
610
- "arguments": {
611
- "table_name": "temp_data",
612
- "if_exists": true
613
- }
614
- }
615
- ```
616
-
617
- ### DDL Safety Guidelines
618
-
619
- 1. ✅ **Enable only in development** - Keep DDL disabled for production
620
- 2. ✅ **Backup before major changes** - DDL operations are usually irreversible
621
- 3. ✅ **Test in dev first** - Try schema changes in development environment
622
- 4. ✅ **Use proper MySQL user permissions** - Grant only necessary privileges
623
-
624
- ---
625
-
626
- ## 📤 Data Export Tools
627
-
628
- The MySQL MCP Server provides powerful data export capabilities, allowing AI agents to export database content in CSV format for analysis, reporting, and data sharing.
629
-
630
- ### Data Export Tools Overview
631
-
632
- - **`export_table_to_csv`** - Export all or filtered data from a table to CSV format
633
- - **`export_query_to_csv`** - Export the results of a custom SELECT query to CSV format
634
-
635
- Both tools support:
636
- - Filtering data with conditions
637
- - Pagination for large datasets
638
- - Sorting results
639
- - Optional column headers
640
- - Proper CSV escaping for special characters
641
-
642
- ### Data Export Tool Examples
643
-
644
- #### Export Table to CSV
645
-
646
- **User prompt:** *"Export the first 100 users ordered by registration date to CSV"*
647
-
648
- **AI will execute:**
649
- ```json
650
- {
651
- "tool": "export_table_to_csv",
652
- "arguments": {
653
- "table_name": "users",
654
- "sorting": {
655
- "field": "registration_date",
656
- "direction": "desc"
657
- },
658
- "pagination": {
659
- "page": 1,
660
- "limit": 100
661
- },
662
- "include_headers": true
663
- }
664
- }
665
- ```
666
-
667
- #### Export Filtered Data to CSV
668
-
669
- **User prompt:** *"Export all users from the marketing department to CSV"*
670
-
671
- **AI will execute:**
672
- ```json
673
- {
674
- "tool": "export_table_to_csv",
675
- "arguments": {
676
- "table_name": "users",
677
- "filters": [
678
- {
679
- "field": "department",
680
- "operator": "eq",
681
- "value": "marketing"
682
- }
683
- ],
684
- "include_headers": true
685
- }
686
- }
687
- ```
688
-
689
- #### Export Query Results to CSV
690
-
691
- **User prompt:** *"Export a report of total sales by product category to CSV"*
692
-
693
- **AI will execute:**
694
- ```json
695
- {
696
- "tool": "export_query_to_csv",
697
- "arguments": {
698
- "query": "SELECT category, SUM(sales_amount) as total_sales FROM sales GROUP BY category ORDER BY total_sales DESC",
699
- "include_headers": true
700
- }
701
- }
702
- ```
703
-
704
- ### Data Export Best Practices
705
-
706
- 1. ✅ **Use filtering** - Export only the data you need to reduce file size
707
- 2. ✅ **Implement pagination** - For large datasets, use pagination to avoid memory issues
708
- 3. ✅ **Include headers** - Make CSV files more understandable with column headers
709
- 4. ✅ **Test with small datasets first** - Verify export format before processing large amounts of data
710
- 5. ✅ **Use proper permissions** - Data export tools require `utility` permission
711
-
712
- ### Common Data Export Patterns
713
-
714
- **Pattern 1: Simple Table Export**
715
- ```json
716
- {
717
- "tool": "export_table_to_csv",
718
- "arguments": {
719
- "table_name": "products",
720
- "include_headers": true
721
- }
722
- }
723
- ```
724
-
725
- **Pattern 2: Filtered and Sorted Export**
726
- ```json
727
- {
728
- "tool": "export_table_to_csv",
729
- "arguments": {
730
- "table_name": "orders",
731
- "filters": [
732
- {
733
- "field": "order_date",
734
- "operator": "gte",
735
- "value": "2023-01-01"
736
- }
737
- ],
738
- "sorting": {
739
- "field": "order_date",
740
- "direction": "desc"
741
- },
742
- "include_headers": true
743
- }
744
- }
745
- ```
746
-
747
- **Pattern 3: Complex Query Export**
748
- ```json
749
- {
750
- "tool": "export_query_to_csv",
751
- "arguments": {
752
- "query": "SELECT u.name, u.email, COUNT(o.id) as order_count FROM users u LEFT JOIN orders o ON u.id = o.user_id GROUP BY u.id HAVING order_count > 5",
753
- "include_headers": true
754
- }
755
- }
756
- ```
757
-
758
- ---
759
-
760
- ## 💰 Transaction Management
761
-
762
- The MySQL MCP Server provides full ACID transaction support, allowing you to group multiple database operations into atomic units.
763
-
764
- ### Transaction Tools Overview
765
-
766
- - **`begin_transaction`** - Start a new transaction
767
- - **`execute_in_transaction`** - Execute SQL within transaction context
768
- - **`commit_transaction`** - Permanently save all changes
769
- - **`rollback_transaction`** - Discard all changes since transaction start
770
- - **`get_transaction_status`** - Check if transaction is active
771
-
772
- ### Transaction Example: Money Transfer
773
-
774
- **User:** *"Transfer $100 from Alice's account to Bob's account"*
775
-
776
- **AI executes:**
777
- ```json
778
- // Step 1: Begin transaction
779
- {
780
- "tool": "begin_transaction"
781
- }
782
-
783
- // Step 2: Deduct from Alice's account
784
- {
785
- "tool": "execute_in_transaction",
786
- "arguments": {
787
- "sql": "UPDATE accounts SET balance = balance - 100 WHERE name = 'Alice'"
788
- }
789
- }
790
-
791
- // Step 3: Add to Bob's account
792
- {
793
- "tool": "execute_in_transaction",
794
- "arguments": {
795
- "sql": "UPDATE accounts SET balance = balance + 100 WHERE name = 'Bob'"
796
- }
797
- }
798
-
799
- // Step 4: Verify both accounts exist and have sufficient funds
800
- {
801
- "tool": "execute_in_transaction",
802
- "arguments": {
803
- "sql": "SELECT * FROM accounts WHERE name IN ('Alice', 'Bob')"
804
- }
805
- }
806
-
807
- // Step 5: Commit if everything is valid
808
- {
809
- "tool": "commit_transaction"
810
- }
811
- ```
812
-
813
- ### Transaction Safety Features
814
-
815
- 1. ✅ **Atomic Operations** - All operations succeed or all fail together
816
- 2. ✅ **Automatic Rollback** - If any operation fails, transaction automatically rolls back
817
- 3. ✅ **Isolation** - Other sessions see changes only after commit
818
- 4. ✅ **Status Checking** - Always know if a transaction is active
819
- 5. ✅ **Error Handling** - Comprehensive error reporting for failed operations
820
-
821
- ### Transaction Best Practices
822
-
823
- 1. **Keep transactions short** - Long transactions can block other operations
824
- 2. **Always commit or rollback** - Don't leave transactions hanging
825
- 3. **Test transaction logic** - Verify your transaction sequence works correctly
826
- 4. **Handle errors gracefully** - Check for errors after each operation
827
- 5. **Use appropriate isolation levels** - Understand your consistency requirements
828
-
829
- ### Common Transaction Patterns
830
-
831
- **Pattern 1: Safe Update with Verification**
832
- ```json
833
- // Begin transaction
834
- // Update records
835
- // Verify changes with SELECT
836
- // Commit if valid, rollback if not
837
- ```
838
-
839
- **Pattern 2: Batch Operations**
840
- ```json
841
- // Begin transaction
842
- // Insert multiple related records
843
- // Update related tables
844
- // Commit all changes together
845
- ```
846
-
847
- **Pattern 3: Error Recovery**
848
- ```json
849
- // Begin transaction
850
- // Try operations
851
- // If error occurs: rollback
852
- // If success: commit
853
- ```
854
-
855
- ---
856
-
857
- ## 🔧 Stored Procedures
858
-
859
- The MySQL MCP Server provides comprehensive stored procedure management, allowing you to create, execute, and manage stored procedures with full parameter support.
860
-
861
- ### Stored Procedure Tools Overview
862
-
863
- - **`list_stored_procedures`** - List all stored procedures in a database
864
- - **`create_stored_procedure`** - Create new stored procedures with IN/OUT/INOUT parameters
865
- - **`get_stored_procedure_info`** - Get detailed information about parameters and metadata
866
- - **`execute_stored_procedure`** - Execute procedures with automatic parameter handling
867
- - **`drop_stored_procedure`** - Delete stored procedures safely
868
-
869
- ### ⚠️ Enable Stored Procedures
870
-
871
- Stored procedure operations require the `procedure` permission. Add it to your configuration:
872
-
873
- ```json
874
- {
875
- "args": [
876
- "mysql://user:pass@localhost:3306/db",
877
- "list,read,procedure,utility" // ← Include 'procedure'
878
- ]
879
- }
880
- ```
881
-
882
- ### Creating Stored Procedures
883
-
884
- **User:** *"Create a stored procedure that calculates tax for a given amount"*
885
-
886
- **AI will execute:**
887
- ```json
888
- {
889
- "tool": "create_stored_procedure",
890
- "arguments": {
891
- "procedure_name": "calculate_tax",
892
- "parameters": [
893
- {
894
- "name": "amount",
895
- "mode": "IN",
896
- "data_type": "DECIMAL(10,2)"
897
- },
898
- {
899
- "name": "tax_rate",
900
- "mode": "IN",
901
- "data_type": "DECIMAL(5,4)"
902
- },
903
- {
904
- "name": "tax_amount",
905
- "mode": "OUT",
906
- "data_type": "DECIMAL(10,2)"
907
- }
908
- ],
909
- "body": "SET tax_amount = amount * tax_rate;",
910
- "comment": "Calculate tax amount based on amount and tax rate"
911
- }
912
- }
913
- ```
914
-
915
- ### Executing Stored Procedures
916
-
917
- **User:** *"Calculate tax for $1000 with 8.5% tax rate"*
918
-
919
- **AI will execute:**
920
- ```json
921
- {
922
- "tool": "execute_stored_procedure",
923
- "arguments": {
924
- "procedure_name": "calculate_tax",
925
- "parameters": [1000.00, 0.085]
926
- }
927
- }
928
- ```
929
-
930
- **Result:**
931
- ```json
932
- {
933
- "status": "success",
934
- "data": {
935
- "results": { /* execution results */ },
936
- "outputParameters": {
937
- "tax_amount": 85.00
938
- }
939
- }
940
- }
941
- ```
942
-
943
- ### Parameter Types
944
-
945
- **IN Parameters** - Input values passed to the procedure
946
- ```sql
947
- IN user_id INT
948
- IN email VARCHAR(255)
949
- ```
950
-
951
- **OUT Parameters** - Output values returned by the procedure
952
- ```sql
953
- OUT total_count INT
954
- OUT average_score DECIMAL(5,2)
955
- ```
956
-
957
- **INOUT Parameters** - Values that are both input and output
958
- ```sql
959
- INOUT running_total DECIMAL(10,2)
960
- ```
961
-
962
- ### Complex Stored Procedure Example
963
-
964
- **User:** *"Create a procedure to process an order with inventory check"*
965
-
966
- ```json
967
- {
968
- "tool": "create_stored_procedure",
969
- "arguments": {
970
- "procedure_name": "process_order",
971
- "parameters": [
972
- { "name": "product_id", "mode": "IN", "data_type": "INT" },
973
- { "name": "quantity", "mode": "IN", "data_type": "INT" },
974
- { "name": "customer_id", "mode": "IN", "data_type": "INT" },
975
- { "name": "order_id", "mode": "OUT", "data_type": "INT" },
976
- { "name": "success", "mode": "OUT", "data_type": "BOOLEAN" }
977
- ],
978
- "body": "DECLARE available_qty INT; SELECT stock_quantity INTO available_qty FROM products WHERE id = product_id; IF available_qty >= quantity THEN INSERT INTO orders (customer_id, product_id, quantity) VALUES (customer_id, product_id, quantity); SET order_id = LAST_INSERT_ID(); UPDATE products SET stock_quantity = stock_quantity - quantity WHERE id = product_id; SET success = TRUE; ELSE SET order_id = 0; SET success = FALSE; END IF;",
979
- "comment": "Process order with inventory validation"
980
- }
981
- }
982
- ```
983
-
984
- ### Getting Procedure Information
985
-
986
- **User:** *"Show me details about the calculate_tax procedure"*
987
-
988
- **AI will execute:**
989
- ```json
990
- {
991
- "tool": "get_stored_procedure_info",
992
- "arguments": {
993
- "procedure_name": "calculate_tax"
994
- }
995
- }
996
- ```
997
-
998
- **Returns detailed information:**
999
- - Procedure metadata (created date, security type, etc.)
1000
- - Parameter details (names, types, modes)
1001
- - Procedure definition
1002
- - Comments and documentation
1003
-
1004
- ### Stored Procedure Best Practices
1005
-
1006
- 1. ✅ **Use descriptive names** - Make procedure purposes clear
1007
- 2. ✅ **Document with comments** - Add meaningful comments to procedures
1008
- 3. ✅ **Validate inputs** - Check parameter values within procedures
1009
- 4. ✅ **Handle errors** - Use proper error handling in procedure bodies
1010
- 5. ✅ **Test thoroughly** - Verify procedures work with various inputs
1011
- 6. ✅ **Use appropriate data types** - Choose correct types for parameters
1012
- 7. ✅ **Consider security** - Be mindful of SQL injection in dynamic SQL
1013
-
1014
- ### Common Stored Procedure Patterns
1015
-
1016
- **Pattern 1: Data Validation and Processing**
1017
- ```sql
1018
- -- Validate input, process if valid, return status
1019
- IF input_value > 0 THEN
1020
- -- Process data
1021
- SET success = TRUE;
1022
- ELSE
1023
- SET success = FALSE;
1024
- END IF;
1025
- ```
1026
-
1027
- **Pattern 2: Complex Business Logic**
1028
- ```sql
1029
- -- Multi-step business process
1030
- -- Step 1: Validate
1031
- -- Step 2: Calculate
1032
- -- Step 3: Update multiple tables
1033
- -- Step 4: Return results
1034
- ```
1035
-
1036
- **Pattern 3: Reporting and Analytics**
1037
- ```sql
1038
- -- Aggregate data from multiple tables
1039
- -- Apply business rules
1040
- -- Return calculated results
1041
- ```
1042
-
1043
- ---
1044
-
1045
- ## 📋 Usage Examples
1046
-
1047
- ### Example 1: Read Data
1048
-
1049
- **User:** *"Show me the first 10 users ordered by created_at"*
1050
-
1051
- **AI uses `read_records`:**
1052
- - Queries the users table
1053
- - Applies pagination (limit 10)
1054
- - Sorts by created_at descending
1055
- - Returns results
1056
-
1057
- ### Example 2: Filter Data
1058
-
1059
- **User:** *"Find all users with email ending in @example.com"*
1060
-
1061
- **AI uses `read_records` with filters:**
1062
- - Applies LIKE filter on email column
1063
- - Returns matching records
1064
-
1065
- ### Example 3: Create Records
1066
-
1067
- **User:** *"Add a new user with username 'john_doe' and email 'john@example.com'"*
1068
-
1069
- **AI uses `create_record`:**
1070
- - Inserts new record
1071
- - Returns insert ID
1072
-
1073
- ### Example 4: Update Records
1074
-
1075
- **User:** *"Update the email for user ID 5 to 'newemail@example.com'"*
1076
-
1077
- **AI uses `update_record`:**
1078
- - Updates specific record by ID
1079
- - Returns affected rows
1080
-
1081
- ### Example 5: Complex Query
1082
-
1083
- **User:** *"Show me the total number of orders per user for the last 30 days"*
1084
-
1085
- **AI uses `run_query`:**
1086
- - Constructs JOIN query
1087
- - Applies date filter
1088
- - Groups by user
1089
- - Returns aggregated results
1090
-
1091
- ### Example 6: Transaction Management
1092
-
1093
- **User:** *"Transfer $100 from account 1 to account 2 in a single transaction"*
1094
-
1095
- **AI uses transaction tools:**
1096
- ```json
1097
- {
1098
- "tool": "begin_transaction"
1099
- }
1100
-
1101
- {
1102
- "tool": "execute_in_transaction",
1103
- "arguments": {
1104
- "sql": "UPDATE accounts SET balance = balance - 100 WHERE id = 1"
1105
- }
1106
- }
1107
-
1108
- {
1109
- "tool": "execute_in_transaction",
1110
- "arguments": {
1111
- "sql": "UPDATE accounts SET balance = balance + 100 WHERE id = 2"
1112
- }
1113
- }
1114
-
1115
- {
1116
- "tool": "commit_transaction"
1117
- }
1118
- ```
1119
-
1120
- **User:** *"Check if there's an active transaction"*
1121
-
1122
- **AI uses `get_transaction_status`:**
1123
- - Returns transaction status and ID if active
1124
-
1125
- ### Example 7: Bulk Insert
1126
-
1127
- **User:** *"Insert 1000 new products from this CSV data"*
1128
-
1129
- **AI uses `bulk_insert`:**
1130
- ```json
1131
- {
1132
- "tool": "bulk_insert",
1133
- "arguments": {
1134
- "table_name": "products",
1135
- "data": [
1136
- {"name": "Product 1", "price": 19.99, "category": "Electronics"},
1137
- {"name": "Product 2", "price": 29.99, "category": "Books"},
1138
- // ... up to 1000 records
1139
- ],
1140
- "batch_size": 1000
1141
- }
1142
- }
1143
- ```
1144
- - Processes records in optimized batches
1145
- - Returns total inserted count and performance metrics
1146
-
1147
- ### Example 8: Bulk Update
1148
-
1149
- **User:** *"Update prices for all products in specific categories with different discounts"*
1150
-
1151
- **AI uses `bulk_update`:**
1152
- ```json
1153
- {
1154
- "tool": "bulk_update",
1155
- "arguments": {
1156
- "table_name": "products",
1157
- "updates": [
1158
- {
1159
- "data": {"price": "price * 0.9"},
1160
- "conditions": [{"field": "category", "operator": "eq", "value": "Electronics"}]
1161
- },
1162
- {
1163
- "data": {"price": "price * 0.8"},
1164
- "conditions": [{"field": "category", "operator": "eq", "value": "Books"}]
1165
- }
1166
- ],
1167
- "batch_size": 100
1168
- }
1169
- }
1170
- ```
1171
- - Applies different updates based on conditions
1172
- - Processes in batches for optimal performance
1173
-
1174
- ### Example 9: Bulk Delete
1175
-
1176
- **User:** *"Delete all inactive users and expired sessions"*
1177
-
1178
- **AI uses `bulk_delete`:**
1179
- ```json
1180
- {
1181
- "tool": "bulk_delete",
1182
- "arguments": {
1183
- "table_name": "users",
1184
- "condition_sets": [
1185
- [{"field": "status", "operator": "eq", "value": "inactive"}],
1186
- [{"field": "last_login", "operator": "lt", "value": "2023-01-01"}],
1187
- [{"field": "email_verified", "operator": "eq", "value": false}]
1188
- ],
1189
- "batch_size": 100
1190
- }
1191
- }
1192
- ```
1193
- - Deletes records matching any of the condition sets
1194
- - Processes deletions in safe batches
1195
-
1196
- **User:** *"Rollback the current transaction"*
1197
-
1198
- **AI uses `rollback_transaction`:**
1199
- - Cancels all changes in the current transaction
545
+ - 🏗️ **DDL Operations** - Create, alter, and drop tables
546
+ - 📤 **Data Export Tools** - Export data to CSV format
547
+ - 💰 **Transaction Management** - ACID transactions with BEGIN, COMMIT, ROLLBACK
548
+ - 🔧 **Stored Procedures** - Create and execute stored procedures with IN/OUT/INOUT parameters
549
+ - 📋 **Usage Examples** - Real-world examples for all tools
550
+ - 📝 **Query Logging & Automatic SQL Display** - See all SQL queries executed automatically
551
+ - 🔒 **Security Features** - Built-in security and best practices
552
+ - 🚀 **Bulk Operations** - High-performance batch processing
553
+ - 🛠️ **Troubleshooting** - Common issues and solutions
554
+ - 📄 **License** - MIT License details
555
+ - 🗺️ **Roadmap** - Upcoming features and improvements
1200
556
 
1201
557
  ---
1202
558
 
1203
- ## 📝 Query Logging & Automatic SQL Display
1204
-
1205
- All queries executed through the MySQL MCP Server are automatically logged with detailed execution information in a **human-readable format**. Query logs are **automatically displayed to users** in the LLM response output of **ALL tool operations** that interact with the database.
1206
-
1207
- ### ✨ Automatic SQL Query Display (v1.4.12+)
1208
-
1209
- **The SQL queries are now automatically shown to users without needing to explicitly ask for them!**
1210
-
1211
- When you ask questions like:
1212
- - *"Show me all tables in my database"*
1213
- - *"Get the first 10 users"*
1214
- - *"Update user email where id = 5"*
1215
-
1216
- The LLM will automatically include the SQL query execution details in its response, such as:
1217
-
1218
- > "The SQL query 'SHOW TABLES' was executed successfully in 107ms and returned 73 tables including users, products, orders..."
1219
-
1220
- This happens because the SQL query information is embedded as part of the response data structure with an explicit instruction to the LLM to always display it to users.
1221
-
1222
- ### How It Works
1223
-
1224
- The MCP server returns responses in this structured format:
1225
-
1226
- ```json
1227
- {
1228
- "⚠️ IMPORTANT_INSTRUCTION_TO_ASSISTANT": "ALWAYS display the SQL query execution details below to the user in your response. This is critical information that users need to see.",
1229
- "⚠️ SQL_QUERY_EXECUTED": "✅ SQL Query #1 - SUCCESS\n⏱️ 107ms\n📝 SHOW TABLES",
1230
- "📊 RESULTS": [
1231
- { "table_name": "users" },
1232
- { "table_name": "products" }
1233
- ]
1234
- }
1235
- ```
1236
-
1237
- The LLM processes this structure and naturally includes the SQL query information when describing results to you.
1238
-
1239
- ### Query Log Information
1240
-
1241
- Each logged query includes:
1242
- - **Query Number** - Sequential identifier for the query
1243
- - **Status** - Success (✓) or error (✗) with visual indicator
1244
- - **Execution Duration** - Time taken to execute in milliseconds with ⏱️ icon
1245
- - **Timestamp** - ISO 8601 formatted execution time with 🕐 icon
1246
- - **Formatted SQL Query** - Properly formatted SQL with line breaks for readability
1247
- - **Parameters** - Values passed to the query (if any), formatted with JSON indentation
1248
- - **Error Details** - Error message if the query failed (optional)
1249
-
1250
- ### Example Query Log Output
1251
-
1252
- **Markdown-Friendly Format (optimized for AI agent UIs):**
1253
-
1254
- ```markdown
1255
- ### Query #1 - SUCCESS (12ms)
1256
- **Timestamp:** 2025-11-21T10:30:45.123Z
1257
-
1258
- **SQL:**
1259
- ```sql
1260
- SELECT *
1261
- FROM users
1262
- WHERE id = ?
1263
- ```
1264
- Parameters:
1265
- [5]
1266
- ```
1267
-
1268
- **Complex Query with Multiple Parameters:**
1269
-
1270
- ```markdown
1271
- ### Query #1 - SUCCESS (45ms)
1272
- **Timestamp:** 2025-11-21T10:32:15.456Z
1273
-
1274
- **SQL:**
1275
- ```sql
1276
- INSERT INTO users (name,
1277
- email,
1278
- age,
1279
- created_at)
1280
- VALUES (?,
1281
- ?,
1282
- ?,
1283
- ?)
1284
- ```
1285
- Parameters:
1286
- [
1287
- "John Doe",
1288
- "john@example.com",
1289
- 30,
1290
- "2025-11-21T10:32:15.000Z"
1291
- ]
1292
- ```
1293
-
1294
- ### Benefits of Automatic SQL Display
1295
-
1296
- 1. **🎓 Learning** - Users can see and learn from the SQL queries being executed
1297
- 2. **🔍 Transparency** - Clear visibility into what database operations are performed
1298
- 3. **🐛 Debugging** - Easy to identify and troubleshoot query issues
1299
- 4. **📊 Performance Monitoring** - See execution times for queries
1300
- 5. **✅ Verification** - Confirm the AI is executing the correct queries
1301
-
1302
- ### Viewing Query Logs in Responses
1303
-
1304
- Query logs are automatically included in **ALL** tool responses and displayed to users via the structured response format with explicit LLM instructions:
1305
-
1306
- **Example: Viewing Response with Query Log:**
1307
-
1308
- When you call `list_tables`, the AI agent receives:
1309
-
1310
- ```json
1311
- [
1312
- {"table_name": "users"},
1313
- {"table_name": "orders"}
1314
- ]
1315
- ```
1316
-
1317
- ---
1318
-
1319
- ## SQL Query Execution Log
1320
-
1321
- ### Query #1 - SUCCESS (8ms)
1322
- **Timestamp:** 2025-11-21T10:30:45.123Z
1323
-
1324
- **SQL:**
1325
- ```sql
1326
- SHOW TABLES
1327
- ```
1328
-
1329
- **Example: Bulk Operations with Multiple Queries:**
1330
-
1331
- When you call `bulk_insert`, the AI agent receives:
1332
-
1333
- ```json
1334
- {
1335
- "affectedRows": 100,
1336
- "totalInserted": 100
1337
- }
1338
- ```
1339
-
1340
- ---
1341
-
1342
- ## SQL Query Execution Log
1343
-
1344
- ### Query #1 - SUCCESS (45ms)
1345
- **Timestamp:** 2025-11-21T10:30:45.123Z
1346
-
1347
- **SQL:**
1348
- ```sql
1349
- INSERT INTO users (name, email, age)
1350
- VALUES (?, ?, ?)
1351
- ```
1352
- Parameters:
1353
- ["John Doe", "john@example.com", 30]
1354
-
1355
- ---
1356
-
1357
- ### Query #2 - SUCCESS (23ms)
1358
- **Timestamp:** 2025-11-21T10:30:45.168Z
1359
-
1360
- **SQL:**
1361
- ```sql
1362
- INSERT INTO users (name, email, age)
1363
- VALUES (?, ?, ?)
1364
- ```
1365
- Parameters:
1366
- ["Jane Smith", "jane@example.com", 28]
1367
-
1368
- **Tools with Query Logging:**
1369
-
1370
- Query logs are now included in responses from **ALL 30 tools**:
1371
-
1372
- ✅ **Database Discovery** - `list_databases`, `list_tables`, `read_table_schema`, `get_table_relationships`
1373
- ✅ **Data Operations** - `create_record`, `read_records`, `update_record`, `delete_record`
1374
- ✅ **Bulk Operations** - `bulk_insert`, `bulk_update`, `bulk_delete`
1375
- ✅ **Custom Queries** - `run_query`, `execute_sql`
1376
- ✅ **Schema Management** - `create_table`, `alter_table`, `drop_table`, `execute_ddl`
1377
- ✅ **Utilities** - `get_table_relationships`
1378
- ✅ **Transactions** - `execute_in_transaction`
1379
- ✅ **Stored Procedures** - `list_stored_procedures`, `get_stored_procedure_info`, `execute_stored_procedure`, etc.
1380
- ✅ **Data Export** - `export_table_to_csv`, `export_query_to_csv`
1381
-
1382
- ### Query Logs for Debugging
1383
-
1384
- Query logs are valuable for:
1385
- - **Performance Analysis** - Track which queries are slow (high duration)
1386
- - **Troubleshooting** - Review exact parameters sent to queries
1387
- - **Auditing** - See what operations were performed and when
1388
- - **Optimization** - Identify patterns in query execution
1389
- - **Error Investigation** - Review failed queries and their errors
1390
-
1391
- ### Query Log Limitations
1392
-
1393
- - Logs are stored in memory (not persisted to disk)
1394
- - Maximum of 100 most recent queries are retained
1395
- - Logs are cleared when the MCP server restarts
1396
- - For production audit trails, consider using MySQL's built-in query logging
1397
-
1398
- ### Tools with Query Logging
1399
-
1400
- All tools that execute queries include logs:
1401
- - `run_query` - SELECT query execution
1402
- - `executeSql` - Write operations (INSERT, UPDATE, DELETE)
1403
- - `create_record` - Single record insertion
1404
- - `read_records` - Record querying with filters
1405
- - `update_record` - Record updates
1406
- - `delete_record` - Record deletion
1407
- - Bulk operations (`bulk_insert`, `bulk_update`, `bulk_delete`)
1408
- - Stored procedure execution
1409
- - Transaction operations
1410
-
1411
- ### Query Logger Performance & Configuration
1412
-
1413
- #### Memory Management
1414
-
1415
- The QueryLogger is designed with robust memory safety:
1416
-
1417
- **Built-in Protections:**
1418
- - ✅ **SQL Truncation** - Queries truncated to 500 characters max
1419
- - ✅ **Parameter Limiting** - Only first 5 parameters logged
1420
- - ✅ **Value Truncation** - Individual parameter values limited to 50 characters
1421
- - ✅ **Error Truncation** - Error messages limited to 200 characters
1422
- - ✅ **Deep Copy** - Parameters are deep copied to prevent reference mutations
1423
- - ✅ **Safe Serialization** - Handles circular references, BigInt, and unstringifiable objects
1424
- - ✅ **Bounded Storage** - Maximum 100 most recent queries retained
1425
-
1426
- **Memory Impact:**
1427
- ```
1428
- Regular query: ~1 KB per log entry
1429
- Bulk operations: ~1 KB per log entry (99.9% reduction vs unbounded)
1430
- Total max memory: ~100 KB for all 100 log entries
1431
- ```
1432
-
1433
- #### Configuration Tuning
1434
-
1435
- The QueryLogger limits are defined as constants and can be adjusted if needed by modifying `src/db/queryLogger.ts`:
1436
-
1437
- ```typescript
1438
- private static readonly MAX_LOGS = 100; // Number of queries to retain
1439
- private static readonly MAX_SQL_LENGTH = 500; // Max SQL string length
1440
- private static readonly MAX_PARAM_LENGTH = 200; // Max params output length
1441
- private static readonly MAX_PARAM_ITEMS = 5; // Max number of params to log
1442
- ```
1443
-
1444
- **Tuning Recommendations:**
1445
- - **High-traffic production**: Reduce `MAX_LOGS` to 50 to minimize memory
1446
- - **Development/debugging**: Increase `MAX_SQL_LENGTH` to 1000 for fuller visibility
1447
- - **Bulk operations heavy**: Keep defaults - they're optimized for bulk workloads
1448
-
1449
- #### Production Monitoring
1450
-
1451
- When running in production, monitor these metrics:
1452
-
1453
- 1. **Memory Usage** - QueryLogger should use <500 KB total
1454
- 2. **Response Payload Size** - Query logs add minimal overhead (<1 KB per response)
1455
- 3. **Performance Impact** - Logging overhead is <1ms per query
1456
-
1457
- **Health Check:**
1458
- ```javascript
1459
- // Check log memory usage
1460
- const logs = db.getQueryLogs();
1461
- const estimatedMemory = logs.length * 1; // ~1 KB per log
1462
- console.log(`Query log memory usage: ~${estimatedMemory} KB`);
1463
- ```
1464
-
1465
- #### Persistent Logging for Production Auditing
1466
-
1467
- **Important:** QueryLogger stores logs in memory only (not persisted to disk). For production audit trails and compliance, consider:
1468
-
1469
- 1. **MySQL Query Log** (Recommended)
1470
- ```sql
1471
- -- Enable general query log
1472
- SET GLOBAL general_log = 'ON';
1473
- SET GLOBAL general_log_file = '/var/log/mysql/queries.log';
1474
- ```
1475
-
1476
- 2. **MySQL Slow Query Log**
1477
- ```sql
1478
- -- Log queries slower than 1 second
1479
- SET GLOBAL slow_query_log = 'ON';
1480
- SET GLOBAL long_query_time = 1;
1481
- ```
1482
-
1483
- 3. **Application-Level Logging**
1484
- - Use Winston or similar logger to persist query logs to disk
1485
- - Integrate with log aggregation services (ELK, Splunk, DataDog)
1486
-
1487
- 4. **Database Audit Plugins**
1488
- - MySQL Enterprise Audit
1489
- - MariaDB Audit Plugin
1490
- - Percona Audit Log Plugin
1491
-
1492
- **Trade-offs:**
1493
- - **In-Memory (QueryLogger)**: Fast, lightweight, for debugging & development
1494
- - **MySQL Query Log**: Complete audit trail, slight performance impact
1495
- - **Application Logging**: Flexible, can include business context
1496
- - **Audit Plugins**: Enterprise-grade, compliance-ready, feature-rich
1497
-
1498
- ---
1499
-
1500
- ## 🔒 Security Features
1501
-
1502
- ### Built-in Security
1503
-
1504
- - ✅ **Parameterized Queries** - All queries use prepared statements (SQL injection protection)
1505
- - ✅ **Permission-Based Access** - Fine-grained control over operations
1506
- - ✅ **Read-Only Validation** - `run_query` enforces SELECT-only operations
1507
- - ✅ **DDL Gating** - Schema changes require explicit `ddl` permission
1508
- - ✅ **Condition Requirements** - DELETE operations must include WHERE conditions
1509
- - ✅ **Input Validation** - All inputs validated with JSON schemas
1510
- - ✅ **Connection Pooling** - Efficient database connection management
1511
-
1512
- ### Additional Security (REST API Mode)
1513
-
1514
- - ✅ **JWT Authentication** - Token-based authentication
1515
- - ✅ **Rate Limiting** - 100 requests per 15 minutes per IP
1516
- - ✅ **CORS Protection** - Configurable CORS policies
1517
- - ✅ **Helmet Security Headers** - HTTP security headers
1518
-
1519
- ### Security Best Practices
1520
-
1521
- 1. **Use Read-Only for Production**
1522
- ```
1523
- "list,read,utility"
1524
- ```
1525
-
1526
- 2. **Create MySQL Users with Limited Permissions**
1527
- ```sql
1528
- CREATE USER 'readonly'@'%' IDENTIFIED BY 'password';
1529
- GRANT SELECT ON myapp.* TO 'readonly'@'%';
1530
- FLUSH PRIVILEGES;
1531
- ```
1532
-
1533
- 3. **Never Use Root in Production**
1534
- - Create dedicated users per environment
1535
- - Grant minimal necessary permissions
1536
-
1537
- 4. **Never Commit `.env` Files**
1538
- - Add `.env` to `.gitignore`
1539
- - Use environment-specific configs
1540
-
1541
- 5. **Enable DDL Only When Needed**
1542
- - Keep DDL disabled by default
1543
- - Only enable for schema migration tasks
1544
-
1545
- ---
1546
-
1547
- ## 🚀 Bulk Operations
1548
-
1549
- The MySQL MCP server includes powerful bulk operation tools designed for high-performance data processing. These tools are optimized for handling large datasets efficiently.
1550
-
1551
- ### Performance Characteristics
1552
-
1553
- - **Batch Processing**: Operations are processed in configurable batches to optimize memory usage and database performance
1554
- - **Transaction Safety**: Each batch is wrapped in a transaction for data consistency
1555
- - **Error Handling**: Detailed error reporting with batch-level granularity
1556
- - **Memory Efficient**: Streaming approach prevents memory overflow with large datasets
1557
-
1558
- ### Best Practices
1559
-
1560
- #### Batch Size Optimization
1561
- ```json
1562
- {
1563
- "batch_size": 1000 // Recommended for most operations
1564
- }
1565
- ```
1566
-
1567
- **Guidelines:**
1568
- - **Small records (< 1KB)**: Use batch sizes of 1000-5000
1569
- - **Large records (> 10KB)**: Use batch sizes of 100-500
1570
- - **Complex operations**: Start with 100 and increase based on performance
1571
-
1572
- #### Bulk Insert Tips
1573
- - Use consistent data structure across all records
1574
- - Pre-validate data to avoid mid-batch failures
1575
- - Consider using `ON DUPLICATE KEY UPDATE` for upsert operations
1576
- - Monitor MySQL's `max_allowed_packet` setting for large batches
1577
-
1578
- #### Bulk Update Optimization
1579
- - Use indexed columns in conditions for better performance
1580
- - Group similar updates together
1581
- - Consider using raw SQL expressions for calculated updates
1582
- - Test with small batches first to verify logic
1583
-
1584
- #### Bulk Delete Safety
1585
- - Always test delete conditions with `SELECT` first
1586
- - Use smaller batch sizes for delete operations
1587
- - Consider soft deletes for important data
1588
- - Monitor foreign key constraints
1589
-
1590
- ### Error Handling
1591
-
1592
- Bulk operations provide detailed error information:
1593
-
1594
- ```json
1595
- {
1596
- "success": false,
1597
- "error": "Batch 3 failed: Duplicate entry 'user123' for key 'username'",
1598
- "processed_batches": 2,
1599
- "total_batches": 5,
1600
- "successful_operations": 2000,
1601
- "failed_operations": 1000
1602
- }
1603
- ```
1604
-
1605
- ### Performance Monitoring
1606
-
1607
- Each bulk operation returns performance metrics:
1608
-
1609
- ```json
1610
- {
1611
- "success": true,
1612
- "total_processed": 10000,
1613
- "batches_processed": 10,
1614
- "execution_time_ms": 2500,
1615
- "average_batch_time_ms": 250,
1616
- "records_per_second": 4000
1617
- }
1618
- ```
1619
-
1620
- ---
1621
-
1622
- ## Troubleshooting
1623
-
1624
- ### MCP Server Not Connecting
1625
-
1626
- **Problem:** AI agent doesn't see tools
1627
-
1628
- **Solutions:**
1629
- 1. Check config file path is correct
1630
- 2. Restart AI agent completely
1631
- 3. If using npx: Verify internet connection for package download
1632
- 4. If using local files: Verify bin/mcp-mysql.js exists
1633
- 5. Check for JSON syntax errors
1634
-
1635
- **Problem:** Connection fails
1636
-
1637
- **Solutions:**
1638
- 1. Test MySQL manually: `mysql -u root -p`
1639
- 2. Verify credentials in connection string
1640
- 3. Check MySQL is running
1641
- 4. Verify network access (host/port)
1642
-
1643
- ### Permission Issues
1644
-
1645
- **Problem:** "Tool is disabled" error
1646
-
1647
- **Solutions:**
1648
- 1. Check permissions in third argument
1649
- 2. Verify permission spelling
1650
- 3. Add required permission category
1651
-
1652
- **Problem:** MySQL permission denied
1653
-
1654
- **Solutions:**
1655
- ```sql
1656
- GRANT SELECT, INSERT, UPDATE, DELETE ON db.* TO 'user'@'localhost';
1657
- FLUSH PRIVILEGES;
1658
- ```
1659
-
1660
- ### DDL Operations Not Working
1661
-
1662
- **Problem:** "DDL operations require 'ddl' permission"
1663
-
1664
- **Solution:** Add `ddl` to permissions:
1665
- ```json
1666
- {
1667
- "args": [
1668
- "mysql://...",
1669
- "list,read,create,update,delete,ddl,utility"
1670
- ]
1671
- }
1672
- ```
1673
-
1674
- ### Parameter Validation Errors
1675
-
1676
- **Problem:** "Invalid parameters: must be object" error
1677
-
1678
- **Symptoms:**
1679
- - Tools fail when called without parameters
1680
- - Error message: `Error: Invalid parameters: [{"instancePath":"","schemaPath":"#/type","keyword":"type","params":{"type":"object"},"message":"must be object"}]`
1681
- - Occurs especially with tools that have optional parameters like `list_tables`, `begin_transaction`, `list_stored_procedures`
1682
-
1683
- **Cause:**
1684
- This error occurred in earlier versions (< 1.4.1) when AI agents called MCP tools without providing parameters. The MCP SDK sometimes passes `undefined` or `null` instead of an empty object `{}`, causing JSON schema validation to fail.
1685
-
1686
- **Solution:**
1687
- ✅ **Fixed in version 1.4.1+** - All 33 tools now include defensive parameter handling that automatically converts `undefined`/`null` to empty objects.
1688
-
1689
- **If you're still experiencing this issue:**
1690
- 1. Update to the latest version:
1691
- ```bash
1692
- npx -y @berthojoris/mcp-mysql-server@latest mysql://user:pass@localhost:3306/db "permissions"
1693
- ```
1694
-
1695
- 2. If using global installation:
1696
- ```bash
1697
- npm update -g @berthojoris/mcp-mysql-server
1698
- ```
1699
-
1700
- 3. Restart your AI agent after updating
1701
-
1702
- **Technical Details:**
1703
- - All tool handlers now use defensive pattern: `(args || {})` to ensure parameters are always objects
1704
- - This fix applies to all 27 tools that accept parameters
1705
- - Tools with no parameters (like `list_databases`, `test_connection`) were not affected
1706
- - No breaking changes - existing valid calls continue to work exactly as before
1707
-
1708
- ---
1709
-
1710
- ## 📄 License
559
+ ## 📄 License
1711
560
 
1712
561
  MIT License - see [LICENSE](LICENSE) file for details.
1713
562
 
1714
563
  ---
1715
564
 
1716
- ## 🗺️ Roadmap
1717
-
1718
- ### Core Features
1719
- - ✅ **Transaction support (BEGIN, COMMIT, ROLLBACK)** - **COMPLETED!**
1720
- - ✅ **Stored procedure execution** - **COMPLETED!**
1721
- - ✅ **Bulk operations (batch insert/update/delete)** - **COMPLETED!**
1722
- - ✅ **Add query log on output** - **COMPLETED!**
1723
- - [ ] Query result caching
1724
- - [ ] Advanced query optimization hints
1725
-
1726
- ### Enterprise Features
1727
- - [ ] **Database backup and restore tools**
1728
- - [ ] **Data export/import utilities** (CSV, JSON, SQL dumps)
1729
- - [ ] **Performance monitoring and metrics**
1730
- - [ ] **Query performance analysis**
1731
- - [ ] **Connection pool monitoring**
1732
- - [ ] **Audit logging and compliance**
1733
- - [ ] **Data migration utilities**
1734
- - [ ] **Schema versioning and migrations**
1735
-
1736
- ### Database Adapters
1737
- - [ ] PostgreSQL adapter
1738
- - [ ] MongoDB adapter
1739
- - [ ] SQLite adapter
1740
- - [ ] Oracle Database adapter
1741
- - [ ] SQL Server adapter
1742
-
1743
- ### Recommended Implementation Order
1744
-
1745
- #### **Phase 1: Performance & Monitoring** 🚀
1746
- - [ ] **Query result caching** - Dramatically improve response times for repeated queries
1747
- - [ ] **Performance metrics** - Track query execution times and database performance
1748
- - [ ] **Connection pool monitoring** - Monitor database connection health and usage
1749
- - [ ] **Database health checks** - Comprehensive system health monitoring
1750
-
1751
- #### **Phase 2: Data Management** 📊
1752
- - [ ] **Database backup and restore tools** - Essential for production data safety
1753
- - [ ] **Data migration utilities** - Move data between databases and environments
1754
- - [ ] **Enhanced export/import** - Support for JSON, XML, Excel formats
1755
- - [ ] **Query history & analytics** - Track and analyze database usage patterns
1756
-
1757
- #### **Phase 3: Enterprise Features** 🏢
1758
- - [ ] **Audit logging and compliance** - Track all database operations for security
1759
- - [ ] **Schema versioning and migrations** - Version control for database schema changes
1760
- - [ ] **Query optimization** - Automatic query analysis and optimization suggestions
1761
- - [ ] **Advanced security features** - Enhanced access control and monitoring
1762
-
1763
- #### **Phase 4: Multi-Database Support** 🌐
1764
- - [ ] **PostgreSQL adapter** - Extend support to PostgreSQL databases
1765
- - [ ] **MongoDB adapter** - Add NoSQL document database support
1766
- - [ ] **SQLite adapter** - Support for lightweight embedded databases
1767
- - [ ] **Database-agnostic operations** - Unified API across different database types
1768
-
1769
- #### **Implementation Priority Matrix**
1770
-
1771
- | Feature | Impact | Effort | Priority |
1772
- |---------|--------|--------|----------|
1773
- | Query Result Caching | High | Medium | 1 |
1774
- | Database Backup/Restore | High | High | 2 |
1775
- | Performance Monitoring | High | Medium | 3 |
1776
- | Data Migration | High | High | 4 |
1777
- | Query Optimization | Medium | Medium | 5 |
1778
- | PostgreSQL Adapter | High | High | 6 |
1779
- | Audit Logging | Medium | Low | 7 |
1780
- | Schema Versioning | Medium | Medium | 8 |
1781
-
1782
- ---
1783
-
1784
- **Made with ❤️ for the AI community**
565
+ **Made with ❤️ for the AI community**
1785
566
 
1786
567
  *Help AI agents interact with MySQL databases safely and efficiently!*
568
+