csv-mcp
CSV and Filesystem MCP
Stdio MCP servers for safely working with CSV/TSV files and general UTF-8 text files.
Run
uv sync
CSV_MCP_ROOT=/absolute/path/to/csv-workspace uv run csv-mcp
FILESYSTEM_MCP_ROOT=/absolute/path/to/workspace uv run filesystem-mcpMCP client configuration:
{
"mcpServers": {
"csv": {
"command": "uv",
"args": ["--directory", "/absolute/path/to/csv-mcp", "run", "csv-mcp"],
"env": {"CSV_MCP_ROOT": "/absolute/path/to/csv-workspace"}
},
"filesystem": {
"command": "uv",
"args": ["--directory", "/absolute/path/to/csv-mcp", "run", "filesystem-mcp"],
"env": {"FILESYSTEM_MCP_ROOT": "/absolute/path/to/workspace"}
}
}
}LangChain agent
Set an OpenAI API key and point the agent at the CSV workspace:
export OPENAI_API_KEY=your-key
export CSV_MCP_ROOT=/absolute/path/to/csv-workspace
export FILESYSTEM_MCP_ROOT=/absolute/path/to/workspace
uv run csv-agentThis starts an interactive chat; use /quit to exit. For a single request:
uv run csv-agent "List the CSV files and summarize the sales data"The agent loads both MCP servers. If FILESYSTEM_MCP_ROOT is unset, it uses
CSV_MCP_ROOT so both toolsets operate on the same workspace.
The default model is openai:gpt-4o-mini. Override it with CSV_AGENT_MODEL, using a
LangChain provider:model identifier whose provider integration is installed.
A useful workspace layout is:
csv-workspace/
├── input/
├── output/
├── temporary/
└── backups/All paths are resolved below CSV_MCP_ROOT. Absolute paths, traversal, symlink escapes, URLs, and extensions other than .csv/.tsv are rejected.
Tools
Tool | Purpose |
| List available CSV/TSV files recursively |
| Detect encoding/delimiter and report structure, samples, inferred types, and warnings |
| Read a bounded page and optional columns |
| Backward-compatible alias for |
| Select, filter, and sort with controlled operators |
| Group and aggregate with whitelisted functions |
| Check schemas, types, required values, uniqueness, categories, and malformed rows |
| Compare two files by unique key columns |
| Create validated atomic output |
| Append rows to a new output by default |
| Preview or write filtered changes |
| Preview or write filtered deletions |
| Trim, change case, and deduplicate |
| Concatenate matching files or join two files |
Filesystem tools are list_directory, read_text_file, write_text_file, and
replace_text. Writes are atomic, refuse existing files by default, create parent
directories, and cannot escape FILESYSTEM_MCP_ROOT through traversal or symlinks.
Query operators are =, !=, >, >=, <, <=, contains, starts_with, ends_with, is_null, not_null, and in. Aggregations are count, sum, mean, minimum, maximum, median, and unique_count.
Parsing options
Tools accept an optional options object:
{
"encoding": "windows-1252",
"delimiter": ";",
"decimal_separator": ",",
"quotechar": "\"",
"escapechar": "\\",
"doublequote": true,
"header_mode": "first_row",
"null_values": ["", "NULL", "N/A"],
"keep_empty_strings": false,
"column_types": {"amount": "decimal"},
"date_formats": {"created_at": "%Y-%m-%d"}
}Supported encodings are UTF-8, UTF-8 with BOM, UTF-16, Latin-1, and Windows-1252. Supported delimiters are comma, semicolon, tab, and pipe. With header_mode: "none", pass column_names or generated names such as column_1 are used.
Safe writes
Append, update, delete, and clean produce a file below output/ unless output_file is supplied. Update and delete default to dry_run: true. Existing destinations require overwrite: true.
Writes:
Validate columns, rows, paths, and formula policy.
Serialize mutations inside the server process.
Write a temporary file beside the destination.
Parse and validate the temporary file.
Calculate SHA-256.
Atomically replace the destination.
spreadsheet_formula_policy accepts escape (default), reject, or preserve. Negative values are preserved only for columns explicitly typed as integer or decimal.
Resources
csv://files
csv://file/{name}/metadata
csv://file/{name}/schema
csv://file/{name}/previewLimits
Limits are configurable with environment variables:
Variable | Default |
| 50 MiB |
| 1,000,000 |
| 500 |
| 1 MiB |
| 1,000 |
| 10,000 |
The bounded in-memory engine is intentional for this version. Use chunked pandas, PyArrow, DuckDB, or Parquet when files must exceed these limits.
Test
uv run pytestLatest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/meysam-kazemi/csv-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server