MCP server to load CSV files to PostgreSQL with validation and progress tracking
This project has been archived.
The maintainers of this project have marked this project as archived. No new releases are expected.
Project description
CSV to PostgreSQL MCP Server
An MCP (Model Context Protocol) server that loads CSV files into PostgreSQL databases with validation and progress tracking.
Features
- CSV Validation: Validates CSV structure and provides detailed error messages
- Efficient Loading: Uses PostgreSQL COPY command for fast bulk loading
- Progress Tracking: Shows progress bar for long-running imports
- Flexible Configuration: Optional database name (defaults to
csvimports) - Error Reporting: Exact line numbers and column information for validation errors
Installation
From PyPI
pip install csv-postgres-loader
Or using uv:
uv pip install csv-postgres-loader
From Source
Clone the repository and install with uv:
git clone https://github.com/raviramadoss/mcp-csv-postgres.git
cd mcp-csv-postgres
uv sync --all-extras
Usage
As MCP Server
Option 1: After installing from PyPI
Add to your Claude Desktop configuration file (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"csv-postgres-loader": {
"command": "uv",
"args": [
"tool",
"run",
"--from",
"csv-postgres-loader",
"csv-postgres-loader"
]
}
}
}
Option 2: For local development
{
"mcpServers": {
"csv-postgres-loader": {
"command": "uv",
"args": [
"tool",
"run",
"--from",
"/path/to/mcp-csv-postgres",
"--python",
"3.10",
"csv-postgres-loader"
]
}
}
}
Or run directly from command line:
csv-postgres-loader
Tool: load_csv_to_postgres
Loads a CSV file into PostgreSQL database.
Parameters:
file_path(required): Path to the CSV filedbname(optional): Database name (default:csvimports)host(optional): PostgreSQL host (default:localhost)port(optional): PostgreSQL port (default:5432)user(optional): PostgreSQL user (default:postgres)password(optional): PostgreSQL passwordtable_name(optional): Table name (derived from filename if not provided)
Returns:
- Success message with database name, table name, and rows loaded
- Error message with detailed validation or database errors
Testing the Server
Quick Test
Run the test script to see the server in action:
uv run python test_server.py
This will:
- Create sample CSV files
- Test loading them into PostgreSQL
- Test validation error reporting
- Show detailed output
Manual Testing with Sample Data
A sample CSV file is provided in sample_data.csv. To test manually:
# In Python/IPython
import asyncio
from csv_postgres_loader.server import call_tool
result = asyncio.run(call_tool(
"load_csv_to_postgres",
{"file_path": "sample_data.csv"}
))
print(result[0].text)
Using with MCP Inspector
To test with the MCP Inspector tool:
npx @modelcontextprotocol/inspector uv run csv-postgres-loader
VS Code Launch Configurations
The .vscode/launch.json includes:
- Run MCP Server: Start the server in debug mode
- Test MCP Server with Sample CSV: Run the test script
- Run All Tests: Execute full test suite
- Run Specific Test: Debug a single test file
Development
Running Tests
uv run pytest
Code Coverage
uv run pytest --cov-report=html
Coverage report will be available in htmlcov/index.html.
Current coverage: >90%
Pre-commit Hooks
Pre-commit hooks are configured to run tests before each commit:
uv run pre-commit install
uv run pre-commit run --all-files
Architecture
Modules
-
validator.py: CSV validation with detailed error reporting
- File existence and readability checks
- CSV structure validation
- Row consistency validation
- Automatic dialect detection
-
database.py: PostgreSQL database operations
- Connection management
- Database creation
- Table creation from CSV headers
- Row counting
-
loader.py: CSV loading using COPY command
- Progress tracking with tqdm
- Efficient bulk loading
- Error handling and rollback
-
server.py: MCP server implementation
- stdio transport
- Tool registration
- Error handling
Error Handling
The server provides detailed error messages:
- Validation Errors: Exact line numbers and description of CSV issues
- Database Errors: Connection, permission, and SQL errors
- File Errors: Permission, encoding, and file not found errors
Examples
Loading a CSV file
{
"tool": "load_csv_to_postgres",
"arguments": {
"file_path": "/path/to/data.csv"
}
}
With custom database
{
"tool": "load_csv_to_postgres",
"arguments": {
"file_path": "/path/to/data.csv",
"dbname": "mydb",
"table_name": "my_table"
}
}
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file csv_postgres_loader-0.1.0.tar.gz.
File metadata
- Download URL: csv_postgres_loader-0.1.0.tar.gz
- Upload date:
- Size: 7.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d7098b6875078b4b6ebcfe241275e07c24ffbcd31e4615f0196121b1ebcaf37f
|
|
| MD5 |
0257b3109ccc38e0e8788d0962b3870a
|
|
| BLAKE2b-256 |
2b11ea5d66433786cfb053dc3beaddc0a8b3798bce9ec9d883061d338a1022ae
|
File details
Details for the file csv_postgres_loader-0.1.0-py3-none-any.whl.
File metadata
- Download URL: csv_postgres_loader-0.1.0-py3-none-any.whl
- Upload date:
- Size: 10.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5b1cf66e2dcb9bc83e07881e49f8a2d42175286e2e99d26d358c2c880a78dc2f
|
|
| MD5 |
7e16317fc1a3029dce47b48dc2f1c486
|
|
| BLAKE2b-256 |
d93bdc239ba2f0a0617a655c5ec6cdcefe4d20d6db8d66233e1cfa9b3801f50f
|