@mseep/csv-editor 1.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/.github/ISSUE_TEMPLATE/bug_report.md +53 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +38 -0
- package/.github/workflows/deploy-docs.yml +62 -0
- package/.github/workflows/publish-github.yml +52 -0
- package/.github/workflows/publish.yml +44 -0
- package/.github/workflows/test.yml +32 -0
- package/.pre-commit-config.yaml +157 -0
- package/ALTERNATIVE_PUBLISHING.md +175 -0
- package/ARCHITECTURE.md +1011 -0
- package/CHANGELOG.md +99 -0
- package/CODE_OF_CONDUCT.md +41 -0
- package/CONTRIBUTING.md +427 -0
- package/Dockerfile +22 -0
- package/LICENSE +21 -0
- package/MCP_CONFIG.md +505 -0
- package/PUBLISHING.md +210 -0
- package/README.md +400 -0
- package/SECURITY.md +61 -0
- package/docs/README.md +41 -0
- package/docs/blog/2019-05-28-first-blog-post.md +12 -0
- package/docs/blog/2019-05-29-long-blog-post.md +44 -0
- package/docs/blog/2021-08-01-mdx-blog-post.mdx +24 -0
- package/docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg +0 -0
- package/docs/blog/2021-08-26-welcome/index.md +29 -0
- package/docs/blog/authors.yml +25 -0
- package/docs/blog/tags.yml +19 -0
- package/docs/docs/api/overview.md +183 -0
- package/docs/docs/installation.md +252 -0
- package/docs/docs/intro.md +87 -0
- package/docs/docs/tutorial-basics/_category_.json +8 -0
- package/docs/docs/tutorial-basics/congratulations.md +23 -0
- package/docs/docs/tutorial-basics/create-a-blog-post.md +34 -0
- package/docs/docs/tutorial-basics/create-a-document.md +57 -0
- package/docs/docs/tutorial-basics/create-a-page.md +43 -0
- package/docs/docs/tutorial-basics/deploy-your-site.md +31 -0
- package/docs/docs/tutorial-basics/markdown-features.mdx +152 -0
- package/docs/docs/tutorial-extras/_category_.json +7 -0
- package/docs/docs/tutorial-extras/img/docsVersionDropdown.png +0 -0
- package/docs/docs/tutorial-extras/img/localeDropdown.png +0 -0
- package/docs/docs/tutorial-extras/manage-docs-versions.md +55 -0
- package/docs/docs/tutorial-extras/translate-your-site.md +88 -0
- package/docs/docs/tutorials/quickstart.md +365 -0
- package/docs/docusaurus.config.ts +163 -0
- package/docs/package-lock.json +17493 -0
- package/docs/package.json +48 -0
- package/docs/sidebars.ts +33 -0
- package/docs/src/components/HomepageFeatures/index.tsx +71 -0
- package/docs/src/components/HomepageFeatures/styles.module.css +11 -0
- package/docs/src/css/custom.css +30 -0
- package/docs/src/pages/index.module.css +23 -0
- package/docs/src/pages/index.tsx +44 -0
- package/docs/src/pages/markdown-page.md +7 -0
- package/docs/static/.nojekyll +0 -0
- package/docs/static/img/docusaurus-social-card.jpg +0 -0
- package/docs/static/img/docusaurus.png +0 -0
- package/docs/static/img/favicon.ico +0 -0
- package/docs/static/img/logo.svg +1 -0
- package/docs/static/img/undraw_docusaurus_mountain.svg +171 -0
- package/docs/static/img/undraw_docusaurus_react.svg +170 -0
- package/docs/static/img/undraw_docusaurus_tree.svg +40 -0
- package/docs/tsconfig.json +8 -0
- package/examples/README.md +48 -0
- package/examples/auto_save_demo.py +206 -0
- package/examples/auto_save_overwrite.py +201 -0
- package/examples/basic_usage.py +135 -0
- package/examples/demo.py +139 -0
- package/examples/history_demo.py +317 -0
- package/examples/test_default_autosave.py +124 -0
- package/examples/update_consignee_example.py +179 -0
- package/package.json +51 -0
- package/plans/2026-04-19-fastmcp3-migration-plan.md +1045 -0
- package/pyproject.toml +331 -0
- package/requirements-dev.txt +30 -0
- package/requirements.txt +22 -0
- package/scripts/publish.py +67 -0
- package/smithery.yaml +15 -0
- package/specs/2026-04-19-fastmcp3-migration-design.md +243 -0
- package/src/csv_editor/__init__.py +8 -0
- package/src/csv_editor/models/__init__.py +39 -0
- package/src/csv_editor/models/auto_save.py +246 -0
- package/src/csv_editor/models/csv_session.py +468 -0
- package/src/csv_editor/models/data_models.py +244 -0
- package/src/csv_editor/models/history_manager.py +456 -0
- package/src/csv_editor/prompts/__init__.py +0 -0
- package/src/csv_editor/prompts/data_prompts.py +13 -0
- package/src/csv_editor/resources/__init__.py +0 -0
- package/src/csv_editor/resources/csv_resources.py +22 -0
- package/src/csv_editor/server.py +640 -0
- package/src/csv_editor/tools/__init__.py +5 -0
- package/src/csv_editor/tools/analytics.py +700 -0
- package/src/csv_editor/tools/auto_save_operations.py +235 -0
- package/src/csv_editor/tools/data_operations.py +3 -0
- package/src/csv_editor/tools/history_operations.py +315 -0
- package/src/csv_editor/tools/io_operations.py +431 -0
- package/src/csv_editor/tools/transformations.py +663 -0
- package/src/csv_editor/tools/validation.py +822 -0
- package/src/csv_editor/utils/__init__.py +0 -0
- package/src/csv_editor/utils/validators.py +205 -0
- package/tests/README.md +65 -0
- package/tests/__init__.py +7 -0
- package/tests/conftest.py +50 -0
- package/tests/test_auto_save.py +378 -0
- package/tests/test_basic.py +103 -0
- package/tests/test_integration.py +356 -0
- package/tests/test_server_boot.py +50 -0
- package/tests/test_settings.py +184 -0
package/README.md
ADDED
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
# CSV Editor - AI-Powered CSV Processing via MCP
|
|
2
|
+
|
|
3
|
+
[](https://www.python.org/)
|
|
4
|
+
[](https://modelcontextprotocol.io/)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
[](https://github.com/jlowin/fastmcp)
|
|
7
|
+
[](https://pandas.pydata.org/)
|
|
8
|
+
[](https://smithery.ai/server/@santoshray02/csv-editor)
|
|
9
|
+
|
|
10
|
+
**Stateful CSV editing for AI assistants.** CSV Editor is an MCP server that gives Claude, ChatGPT, Cursor, Windsurf, and other MCP clients a full suite of CSV operations — with sessions, undo/redo, and auto-save built in. Most data MCPs are analyze-only; this one lets the AI *edit*.
|
|
11
|
+
|
|
12
|
+
<a href="https://glama.ai/mcp/servers/@santoshray02/csv-editor">
|
|
13
|
+
<img width="380" height="200" src="https://glama.ai/mcp/servers/@santoshray02/csv-editor/badge" alt="CSV Editor MCP server" />
|
|
14
|
+
</a>
|
|
15
|
+
|
|
16
|
+
## 🆕 What's new in v2.0.0 (April 2026)
|
|
17
|
+
|
|
18
|
+
- **FastMCP 3.x** — migrated from FastMCP 2 to 3.2, aligning with MCP spec [2025-11-25](https://modelcontextprotocol.io/specification/2025-11-25).
|
|
19
|
+
- **Python 3.11+ required** (was 3.10+). Tested against 3.11 / 3.12 / 3.13 / 3.14.
|
|
20
|
+
- **`--transport sse` removed.** Use `--transport http` (Streamable HTTP) for remote deployments. SSE was deprecated by FastMCP 3.
|
|
21
|
+
- Dependency refresh: pydantic 2.13, pyarrow 23, httpx 0.28.
|
|
22
|
+
- New `CSV_EDITOR_CSV_HISTORY_DIR` env var for configuring the history directory.
|
|
23
|
+
- First-class CI test matrix on GitHub Actions.
|
|
24
|
+
|
|
25
|
+
Users who pinned `csv-editor>=1,<2` are unaffected and will continue to receive 1.x patches if needed. See [CHANGELOG.md](CHANGELOG.md) for the full list of breaking changes.
|
|
26
|
+
|
|
27
|
+
## 🎯 Why CSV Editor?
|
|
28
|
+
|
|
29
|
+
### The Problem
|
|
30
|
+
AI assistants struggle with complex data operations - they can read files but lack tools for filtering, transforming, analyzing, and validating CSV data efficiently.
|
|
31
|
+
|
|
32
|
+
### The Solution
|
|
33
|
+
CSV Editor bridges this gap by providing AI assistants with 39 specialized tools for CSV operations, turning them into powerful data analysts that can:
|
|
34
|
+
- Clean messy datasets in seconds
|
|
35
|
+
- Perform complex statistical analysis
|
|
36
|
+
- Validate data quality automatically
|
|
37
|
+
- Transform data with natural language commands
|
|
38
|
+
- Track all changes with undo/redo capabilities
|
|
39
|
+
|
|
40
|
+
### Key differentiators vs. other CSV / tabular MCPs
|
|
41
|
+
|
|
42
|
+
| Capability | CSV Editor | DuckDB / Polars MCPs | Most pandas-based MCPs |
|
|
43
|
+
|---|---|---|---|
|
|
44
|
+
| **Stateful editing** (load → mutate → save) | ✅ | Read-only or single-shot | Partial |
|
|
45
|
+
| **Undo / redo with snapshots** | ✅ | ❌ | ❌ |
|
|
46
|
+
| **Multi-session isolation** | ✅ | Limited | Limited |
|
|
47
|
+
| **Auto-save with strategies** | ✅ (overwrite / backup / versioned / custom) | ❌ | ❌ |
|
|
48
|
+
| **Quality scoring & validation** | ✅ | SQL-only | Via separate tools |
|
|
49
|
+
| **File-size sweet spot** | <1 GB (pandas) | 50 GB+ (streaming SQL) | Small–medium |
|
|
50
|
+
| **Best for** | Edit-and-review workflows | Large-file analytics | Quick analysis |
|
|
51
|
+
|
|
52
|
+
**When to pick CSV Editor:** you want the AI to *make changes* to a CSV and iterate, not just answer questions about it. If your workload is read-only analytics on multi-GB files, a DuckDB-based MCP is likely a better fit; CSV Editor's DuckDB/Polars engine support is tracked on the [roadmap](#-roadmap).
|
|
53
|
+
|
|
54
|
+
## ⚡ Quick Demo
|
|
55
|
+
|
|
56
|
+
```python
|
|
57
|
+
# Your AI assistant can now do this:
|
|
58
|
+
"Load the sales data and remove duplicates"
|
|
59
|
+
"Filter for Q4 2024 transactions over $10,000"
|
|
60
|
+
"Calculate correlation between price and quantity"
|
|
61
|
+
"Fill missing values with the median"
|
|
62
|
+
"Export as Excel with the analysis"
|
|
63
|
+
|
|
64
|
+
# All with automatic history tracking and undo capability!
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## 🚀 Quick Start (2 minutes)
|
|
68
|
+
|
|
69
|
+
### Installing via Smithery
|
|
70
|
+
|
|
71
|
+
To install csv-editor for Claude Desktop automatically via [Smithery](https://smithery.ai/server/@santoshray02/csv-editor):
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
npx -y @smithery/cli install @santoshray02/csv-editor --client claude
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Fastest Installation (Recommended)
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# Install uv if needed (one-time setup)
|
|
81
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
82
|
+
|
|
83
|
+
# Clone and run
|
|
84
|
+
git clone https://github.com/santoshray02/csv-editor.git
|
|
85
|
+
cd csv-editor
|
|
86
|
+
uv sync
|
|
87
|
+
uv run csv-editor
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Configure Your AI Assistant
|
|
91
|
+
|
|
92
|
+
<details>
|
|
93
|
+
<summary><b>Claude Desktop</b> (click to expand)</summary>
|
|
94
|
+
|
|
95
|
+
Add to your `claude_desktop_config.json`:
|
|
96
|
+
|
|
97
|
+
- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
98
|
+
- **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
|
|
99
|
+
- **Linux:** `~/.config/Claude/claude_desktop_config.json`
|
|
100
|
+
|
|
101
|
+
```json
|
|
102
|
+
{
|
|
103
|
+
"mcpServers": {
|
|
104
|
+
"csv-editor": {
|
|
105
|
+
"command": "uv",
|
|
106
|
+
"args": ["tool", "run", "csv-editor"],
|
|
107
|
+
"env": {
|
|
108
|
+
"CSV_MAX_FILE_SIZE": "1073741824"
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
</details>
|
|
115
|
+
|
|
116
|
+
<details>
|
|
117
|
+
<summary><b>Claude Code, Cursor, Windsurf, VS Code Copilot, Cline, Continue, Zed</b></summary>
|
|
118
|
+
|
|
119
|
+
Any MCP-capable client works with stdio transport. See [MCP_CONFIG.md](MCP_CONFIG.md) for per-client setup.
|
|
120
|
+
</details>
|
|
121
|
+
|
|
122
|
+
<details>
|
|
123
|
+
<summary><b>ChatGPT Connectors (remote HTTP)</b></summary>
|
|
124
|
+
|
|
125
|
+
ChatGPT Connectors require remote Streamable HTTP with OAuth, which is tracked on the [roadmap](#-roadmap) but not yet in v2.0.0. Use stdio-based clients (Claude Desktop, Claude Code, Cursor, etc.) in the meantime.
|
|
126
|
+
</details>
|
|
127
|
+
|
|
128
|
+
## 💡 Real-World Use Cases
|
|
129
|
+
|
|
130
|
+
### 📊 Data Analyst Workflow
|
|
131
|
+
```python
|
|
132
|
+
# Morning: Load yesterday's data
|
|
133
|
+
session = load_csv("daily_sales.csv")
|
|
134
|
+
|
|
135
|
+
# Clean: Remove duplicates and fix types
|
|
136
|
+
remove_duplicates(session_id)
|
|
137
|
+
change_column_type("date", "datetime")
|
|
138
|
+
fill_missing_values(strategy="median", columns=["revenue"])
|
|
139
|
+
|
|
140
|
+
# Analyze: Get insights
|
|
141
|
+
get_statistics(columns=["revenue", "quantity"])
|
|
142
|
+
detect_outliers(method="iqr", threshold=1.5)
|
|
143
|
+
get_correlation_matrix(min_correlation=0.5)
|
|
144
|
+
|
|
145
|
+
# Report: Export cleaned data
|
|
146
|
+
export_csv(format="excel", file_path="clean_sales.xlsx")
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### 🏭 ETL Pipeline
|
|
150
|
+
```python
|
|
151
|
+
# Extract from multiple sources
|
|
152
|
+
load_csv_from_url("https://api.example.com/data.csv")
|
|
153
|
+
|
|
154
|
+
# Transform with complex operations
|
|
155
|
+
filter_rows(conditions=[
|
|
156
|
+
{"column": "status", "operator": "==", "value": "active"},
|
|
157
|
+
{"column": "amount", "operator": ">", "value": 1000}
|
|
158
|
+
])
|
|
159
|
+
add_column(name="quarter", formula="Q{(month-1)//3 + 1}")
|
|
160
|
+
group_by_aggregate(group_by=["quarter"], aggregations={
|
|
161
|
+
"amount": ["sum", "mean"],
|
|
162
|
+
"customer_id": "count"
|
|
163
|
+
})
|
|
164
|
+
|
|
165
|
+
# Load to different formats
|
|
166
|
+
export_csv(format="parquet") # For data warehouse
|
|
167
|
+
export_csv(format="json") # For API
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### 🔍 Data Quality Assurance
|
|
171
|
+
```python
|
|
172
|
+
# Validate incoming data
|
|
173
|
+
validate_schema(schema={
|
|
174
|
+
"customer_id": {"type": "integer", "required": True},
|
|
175
|
+
"email": {"type": "string", "pattern": r"^[^@]+@[^@]+\.[^@]+$"},
|
|
176
|
+
"age": {"type": "integer", "min": 0, "max": 120}
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
# Quality scoring
|
|
180
|
+
quality_report = check_data_quality()
|
|
181
|
+
# Returns: overall_score, missing_data%, duplicates, outliers
|
|
182
|
+
|
|
183
|
+
# Anomaly detection
|
|
184
|
+
anomalies = find_anomalies(methods=["statistical", "pattern"])
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## 🎨 Core Features
|
|
188
|
+
|
|
189
|
+
### Data Operations
|
|
190
|
+
- **Load & Export**: CSV, JSON, Excel, Parquet, HTML, Markdown
|
|
191
|
+
- **Transform**: Filter, sort, group, pivot, join
|
|
192
|
+
- **Clean**: Remove duplicates, handle missing values, fix types
|
|
193
|
+
- **Calculate**: Add computed columns, aggregations
|
|
194
|
+
|
|
195
|
+
### Analysis Tools
|
|
196
|
+
- **Statistics**: Descriptive stats, correlations, distributions
|
|
197
|
+
- **Outliers**: IQR, Z-score, custom thresholds
|
|
198
|
+
- **Profiling**: Complete data quality reports
|
|
199
|
+
- **Validation**: Schema checking, quality scoring
|
|
200
|
+
|
|
201
|
+
### Productivity Features
|
|
202
|
+
- **Auto-Save**: Never lose work with configurable strategies
|
|
203
|
+
- **History**: Full undo/redo with operation tracking
|
|
204
|
+
- **Sessions**: Multi-user support with isolation
|
|
205
|
+
- **Performance**: Stream processing for large files
|
|
206
|
+
|
|
207
|
+
## 📚 Available Tools
|
|
208
|
+
|
|
209
|
+
<details>
|
|
210
|
+
<summary><b>Complete tool list (39 tools)</b></summary>
|
|
211
|
+
|
|
212
|
+
### Server info (2)
|
|
213
|
+
- `health_check` — health status + active session count
|
|
214
|
+
- `get_server_info` — capabilities, supported formats, limits
|
|
215
|
+
|
|
216
|
+
### I/O operations (7)
|
|
217
|
+
- `load_csv` — Load from file
|
|
218
|
+
- `load_csv_from_url` — Load from URL
|
|
219
|
+
- `load_csv_from_content` — Load from string
|
|
220
|
+
- `export_csv` — Export to various formats (csv, tsv, json, excel, parquet, html, markdown)
|
|
221
|
+
- `get_session_info` — Session details
|
|
222
|
+
- `list_sessions` — Active sessions
|
|
223
|
+
- `close_session` — Cleanup
|
|
224
|
+
|
|
225
|
+
### Data manipulation (10)
|
|
226
|
+
- `filter_rows` — Complex filtering
|
|
227
|
+
- `sort_data` — Multi-column sort
|
|
228
|
+
- `select_columns` — Column selection
|
|
229
|
+
- `rename_columns` — Rename columns
|
|
230
|
+
- `add_column` — Add computed columns
|
|
231
|
+
- `remove_columns` — Remove columns
|
|
232
|
+
- `update_column` — Update values
|
|
233
|
+
- `change_column_type` — Type conversion
|
|
234
|
+
- `fill_missing_values` — Handle nulls
|
|
235
|
+
- `remove_duplicates` — Deduplicate
|
|
236
|
+
|
|
237
|
+
### Analysis (7)
|
|
238
|
+
- `get_statistics` — Statistical summary
|
|
239
|
+
- `get_column_statistics` — Column stats
|
|
240
|
+
- `get_correlation_matrix` — Correlations
|
|
241
|
+
- `group_by_aggregate` — Group operations
|
|
242
|
+
- `get_value_counts` — Frequency counts
|
|
243
|
+
- `detect_outliers` — Find outliers (IQR, Z-score)
|
|
244
|
+
- `profile_data` — Data profiling
|
|
245
|
+
|
|
246
|
+
### Validation (3)
|
|
247
|
+
- `validate_schema` — Schema validation
|
|
248
|
+
- `check_data_quality` — Quality metrics + overall score
|
|
249
|
+
- `find_anomalies` — Anomaly detection
|
|
250
|
+
|
|
251
|
+
### Auto-save (4)
|
|
252
|
+
- `configure_auto_save` — Setup auto-save strategy
|
|
253
|
+
- `disable_auto_save` — Turn off auto-save
|
|
254
|
+
- `get_auto_save_status` — Check status
|
|
255
|
+
- `trigger_manual_save` — Force a save now
|
|
256
|
+
|
|
257
|
+
### History (6)
|
|
258
|
+
- `undo` — Step back one operation
|
|
259
|
+
- `redo` — Step forward after undo
|
|
260
|
+
- `get_history` — View operations log
|
|
261
|
+
- `restore_to_operation` — Time travel to a specific operation
|
|
262
|
+
- `clear_history` — Reset history
|
|
263
|
+
- `export_history` — Export operations log
|
|
264
|
+
|
|
265
|
+
</details>
|
|
266
|
+
|
|
267
|
+
## ⚙️ Configuration
|
|
268
|
+
|
|
269
|
+
### Environment variables
|
|
270
|
+
|
|
271
|
+
| Variable | Default | Description |
|
|
272
|
+
|---|---|---|
|
|
273
|
+
| `CSV_MAX_FILE_SIZE` | `1024` (MB) | Maximum file size (megabytes) |
|
|
274
|
+
| `CSV_SESSION_TIMEOUT` | `60` (minutes) | Session timeout |
|
|
275
|
+
| `CSV_EDITOR_CSV_HISTORY_DIR` | `.csv_history` | Directory for persisted operation history |
|
|
276
|
+
|
|
277
|
+
### Auto-Save Strategies
|
|
278
|
+
|
|
279
|
+
CSV Editor automatically saves your work with configurable strategies:
|
|
280
|
+
|
|
281
|
+
- **Overwrite** (default) - Update original file
|
|
282
|
+
- **Backup** - Create timestamped backups
|
|
283
|
+
- **Versioned** - Maintain version history
|
|
284
|
+
- **Custom** - Save to specified location
|
|
285
|
+
|
|
286
|
+
```python
|
|
287
|
+
# Configure auto-save
|
|
288
|
+
configure_auto_save(
|
|
289
|
+
strategy="backup",
|
|
290
|
+
backup_dir="/backups",
|
|
291
|
+
max_backups=10
|
|
292
|
+
)
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## 🛠️ Advanced Installation Options
|
|
296
|
+
|
|
297
|
+
<details>
|
|
298
|
+
<summary><b>Alternative Installation Methods</b></summary>
|
|
299
|
+
|
|
300
|
+
### Using pip
|
|
301
|
+
```bash
|
|
302
|
+
git clone https://github.com/santoshray02/csv-editor.git
|
|
303
|
+
cd csv-editor
|
|
304
|
+
pip install -e .
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Using pipx (Global)
|
|
308
|
+
```bash
|
|
309
|
+
pipx install git+https://github.com/santoshray02/csv-editor.git
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### From PyPI (once v2.0.0 is live)
|
|
313
|
+
```bash
|
|
314
|
+
pip install csv-editor # latest
|
|
315
|
+
pip install csv-editor==2.0.0 # pinned
|
|
316
|
+
# Or with uv:
|
|
317
|
+
uv tool install csv-editor
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### From GitHub
|
|
321
|
+
```bash
|
|
322
|
+
# Latest main
|
|
323
|
+
pip install git+https://github.com/santoshray02/csv-editor.git
|
|
324
|
+
|
|
325
|
+
# Specific release
|
|
326
|
+
pip install git+https://github.com/santoshray02/csv-editor.git@v2.0.0
|
|
327
|
+
|
|
328
|
+
# Or with uv
|
|
329
|
+
uv pip install git+https://github.com/santoshray02/csv-editor.git@v2.0.0
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
</details>
|
|
333
|
+
|
|
334
|
+
## 🧪 Development
|
|
335
|
+
|
|
336
|
+
### Running tests
|
|
337
|
+
```bash
|
|
338
|
+
uv run pytest tests/ -v # Run tests
|
|
339
|
+
uv run pytest tests/ --cov=src/csv_editor # With coverage
|
|
340
|
+
uv run ruff check src/ tests/ # Lint
|
|
341
|
+
uv run black --check src/ tests/ # Format check
|
|
342
|
+
uv run mypy src/ # Type check
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
CI runs the full pytest matrix on Python 3.11–3.14 for every push to main — see [.github/workflows/test.yml](.github/workflows/test.yml).
|
|
346
|
+
|
|
347
|
+
### Project Structure
|
|
348
|
+
```
|
|
349
|
+
csv-editor/
|
|
350
|
+
├── src/csv_editor/ # Core implementation
|
|
351
|
+
│ ├── tools/ # MCP tool implementations
|
|
352
|
+
│ ├── models/ # Data models
|
|
353
|
+
│ └── server.py # MCP server
|
|
354
|
+
├── tests/ # Test suite
|
|
355
|
+
├── examples/ # Usage examples
|
|
356
|
+
└── docs/ # Documentation
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
## 🤝 Contributing
|
|
360
|
+
|
|
361
|
+
We welcome contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
|
|
362
|
+
|
|
363
|
+
### Quick Contribution Guide
|
|
364
|
+
1. Fork the repository
|
|
365
|
+
2. Create a feature branch
|
|
366
|
+
3. Make your changes with tests
|
|
367
|
+
4. Run `uv run pytest tests/` and `uv run ruff check src/ tests/`
|
|
368
|
+
5. Submit a pull request
|
|
369
|
+
|
|
370
|
+
## 📈 Roadmap
|
|
371
|
+
|
|
372
|
+
Post-v2.0.0 priorities (see the [2026 relevance audit](specs/2026-04-19-fastmcp3-migration-design.md) for context):
|
|
373
|
+
|
|
374
|
+
- [ ] **pandas 3.0 / numpy 2.4** — Copy-on-Write migration, Arrow-backed default strings (follow-up to v2.0.0).
|
|
375
|
+
- [ ] **DuckDB + Polars engines** — swappable backends with DuckDB as the default for files >100 MB (closes the large-file gap).
|
|
376
|
+
- [ ] **MCP async Tasks + Resource Links** — non-blocking `load_csv` / `export_csv` / `profile_data` for GB files; paginated large results.
|
|
377
|
+
- [ ] **Remote HTTP + OAuth (CIMD)** — enables ChatGPT Connectors and VS Code Copilot remote usage.
|
|
378
|
+
- [ ] **Elicitation** — prompt for ambiguous CSV dialect / encoding / dtype at load time instead of failing.
|
|
379
|
+
- [ ] **Docs migration** — Docusaurus → MkDocs-Material with `mkdocstrings` for auto-generated API docs.
|
|
380
|
+
|
|
381
|
+
## 💬 Support
|
|
382
|
+
|
|
383
|
+
- **Issues**: [GitHub Issues](https://github.com/santoshray02/csv-editor/issues)
|
|
384
|
+
- **Discussions**: [GitHub Discussions](https://github.com/santoshray02/csv-editor/discussions)
|
|
385
|
+
- **Documentation**: [Wiki](https://github.com/santoshray02/csv-editor/wiki)
|
|
386
|
+
|
|
387
|
+
## 📄 License
|
|
388
|
+
|
|
389
|
+
MIT License - see [LICENSE](LICENSE) file
|
|
390
|
+
|
|
391
|
+
## 🙏 Acknowledgments
|
|
392
|
+
|
|
393
|
+
Built with:
|
|
394
|
+
- [FastMCP](https://github.com/jlowin/fastmcp) - Fast Model Context Protocol
|
|
395
|
+
- [Pandas](https://pandas.pydata.org/) - Data manipulation
|
|
396
|
+
- [NumPy](https://numpy.org/) - Numerical computing
|
|
397
|
+
|
|
398
|
+
---
|
|
399
|
+
|
|
400
|
+
**Ready to supercharge your AI's data capabilities?** [Get started in 2 minutes →](#-quick-start-2-minutes)
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported Versions
|
|
4
|
+
|
|
5
|
+
We actively support the following versions of CSV Editor:
|
|
6
|
+
|
|
7
|
+
| Version | Supported |
|
|
8
|
+
| ------- | ------------------ |
|
|
9
|
+
| 1.0.x | :white_check_mark: |
|
|
10
|
+
| < 1.0 | :x: |
|
|
11
|
+
|
|
12
|
+
## Reporting a Vulnerability
|
|
13
|
+
|
|
14
|
+
We take security vulnerabilities seriously. If you discover a security vulnerability in CSV Editor, please report it responsibly.
|
|
15
|
+
|
|
16
|
+
### How to Report
|
|
17
|
+
|
|
18
|
+
1. **Email**: Send details to rayskumar02@gmail.com
|
|
19
|
+
2. **Subject**: Include "CSV Editor Security" in the subject line
|
|
20
|
+
3. **Details**: Provide a detailed description of the vulnerability
|
|
21
|
+
|
|
22
|
+
### What to Include
|
|
23
|
+
|
|
24
|
+
- Description of the vulnerability
|
|
25
|
+
- Steps to reproduce the issue
|
|
26
|
+
- Potential impact assessment
|
|
27
|
+
- Suggested fix (if available)
|
|
28
|
+
|
|
29
|
+
### Response Timeline
|
|
30
|
+
|
|
31
|
+
- **Initial Response**: Within 24 hours
|
|
32
|
+
- **Status Update**: Within 72 hours
|
|
33
|
+
- **Fix Timeline**: Depends on severity (1-30 days)
|
|
34
|
+
|
|
35
|
+
### Security Best Practices
|
|
36
|
+
|
|
37
|
+
When using CSV Editor:
|
|
38
|
+
|
|
39
|
+
1. **Input Validation**: Always validate CSV files before processing
|
|
40
|
+
2. **File Permissions**: Ensure proper file permissions for CSV files
|
|
41
|
+
3. **Network Security**: Use HTTPS when running in HTTP mode
|
|
42
|
+
4. **Access Control**: Limit MCP server access to trusted clients
|
|
43
|
+
5. **Regular Updates**: Keep CSV Editor updated to the latest version
|
|
44
|
+
|
|
45
|
+
### Disclosure Policy
|
|
46
|
+
|
|
47
|
+
- We will acknowledge receipt of your vulnerability report
|
|
48
|
+
- We will provide regular updates on our progress
|
|
49
|
+
- We will credit you in the security advisory (unless you prefer anonymity)
|
|
50
|
+
- We will coordinate disclosure timing with you
|
|
51
|
+
|
|
52
|
+
### Security Features
|
|
53
|
+
|
|
54
|
+
CSV Editor includes several security features:
|
|
55
|
+
|
|
56
|
+
- Input sanitization for CSV data
|
|
57
|
+
- File path validation to prevent directory traversal
|
|
58
|
+
- Memory usage limits to prevent DoS attacks
|
|
59
|
+
- Error handling to prevent information disclosure
|
|
60
|
+
|
|
61
|
+
Thank you for helping keep CSV Editor secure!
|
package/docs/README.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Website
|
|
2
|
+
|
|
3
|
+
This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
yarn
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Local Development
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
yarn start
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
|
|
18
|
+
|
|
19
|
+
## Build
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
yarn build
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
This command generates static content into the `build` directory and can be served using any static contents hosting service.
|
|
26
|
+
|
|
27
|
+
## Deployment
|
|
28
|
+
|
|
29
|
+
Using SSH:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
USE_SSH=true yarn deploy
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Not using SSH:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
GIT_USER=<Your GitHub username> yarn deploy
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
slug: first-blog-post
|
|
3
|
+
title: First Blog Post
|
|
4
|
+
authors: [slorber, yangshun]
|
|
5
|
+
tags: [hola, docusaurus]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Lorem ipsum dolor sit amet...
|
|
9
|
+
|
|
10
|
+
<!-- truncate -->
|
|
11
|
+
|
|
12
|
+
...consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
slug: long-blog-post
|
|
3
|
+
title: Long Blog Post
|
|
4
|
+
authors: yangshun
|
|
5
|
+
tags: [hello, docusaurus]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
This is the summary of a very long blog post,
|
|
9
|
+
|
|
10
|
+
Use a `<!--` `truncate` `-->` comment to limit blog post size in the list view.
|
|
11
|
+
|
|
12
|
+
<!-- truncate -->
|
|
13
|
+
|
|
14
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
|
15
|
+
|
|
16
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
|
17
|
+
|
|
18
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
|
19
|
+
|
|
20
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
|
21
|
+
|
|
22
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
|
23
|
+
|
|
24
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
|
25
|
+
|
|
26
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
|
27
|
+
|
|
28
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
|
29
|
+
|
|
30
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
|
31
|
+
|
|
32
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
|
33
|
+
|
|
34
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
|
35
|
+
|
|
36
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
|
37
|
+
|
|
38
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
|
39
|
+
|
|
40
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
|
41
|
+
|
|
42
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
|
43
|
+
|
|
44
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
slug: mdx-blog-post
|
|
3
|
+
title: MDX Blog Post
|
|
4
|
+
authors: [slorber]
|
|
5
|
+
tags: [docusaurus]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/).
|
|
9
|
+
|
|
10
|
+
:::tip
|
|
11
|
+
|
|
12
|
+
Use the power of React to create interactive blog posts.
|
|
13
|
+
|
|
14
|
+
:::
|
|
15
|
+
|
|
16
|
+
{/* truncate */}
|
|
17
|
+
|
|
18
|
+
For example, use JSX to create an interactive button:
|
|
19
|
+
|
|
20
|
+
```js
|
|
21
|
+
<button onClick={() => alert('button clicked!')}>Click me!</button>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
<button onClick={() => alert('button clicked!')}>Click me!</button>
|
|
Binary file
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
slug: welcome
|
|
3
|
+
title: Welcome
|
|
4
|
+
authors: [slorber, yangshun]
|
|
5
|
+
tags: [facebook, hello, docusaurus]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
[Docusaurus blogging features](https://docusaurus.io/docs/blog) are powered by the [blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog).
|
|
9
|
+
|
|
10
|
+
Here are a few tips you might find useful.
|
|
11
|
+
|
|
12
|
+
<!-- truncate -->
|
|
13
|
+
|
|
14
|
+
Simply add Markdown files (or folders) to the `blog` directory.
|
|
15
|
+
|
|
16
|
+
Regular blog authors can be added to `authors.yml`.
|
|
17
|
+
|
|
18
|
+
The blog post date can be extracted from filenames, such as:
|
|
19
|
+
|
|
20
|
+
- `2019-05-30-welcome.md`
|
|
21
|
+
- `2019-05-30-welcome/index.md`
|
|
22
|
+
|
|
23
|
+
A blog post folder can be convenient to co-locate blog post images:
|
|
24
|
+
|
|
25
|
+

|
|
26
|
+
|
|
27
|
+
The blog supports tags as well!
|
|
28
|
+
|
|
29
|
+
**And if you don't want a blog**: just delete this directory, and use `blog: false` in your Docusaurus config.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
yangshun:
|
|
2
|
+
name: Yangshun Tay
|
|
3
|
+
title: Ex-Meta Staff Engineer, Co-founder GreatFrontEnd
|
|
4
|
+
url: https://linkedin.com/in/yangshun
|
|
5
|
+
image_url: https://github.com/yangshun.png
|
|
6
|
+
page: true
|
|
7
|
+
socials:
|
|
8
|
+
x: yangshunz
|
|
9
|
+
linkedin: yangshun
|
|
10
|
+
github: yangshun
|
|
11
|
+
newsletter: https://www.greatfrontend.com
|
|
12
|
+
|
|
13
|
+
slorber:
|
|
14
|
+
name: Sébastien Lorber
|
|
15
|
+
title: Docusaurus maintainer
|
|
16
|
+
url: https://sebastienlorber.com
|
|
17
|
+
image_url: https://github.com/slorber.png
|
|
18
|
+
page:
|
|
19
|
+
# customize the url of the author page at /blog/authors/<permalink>
|
|
20
|
+
permalink: '/all-sebastien-lorber-articles'
|
|
21
|
+
socials:
|
|
22
|
+
x: sebastienlorber
|
|
23
|
+
linkedin: sebastienlorber
|
|
24
|
+
github: slorber
|
|
25
|
+
newsletter: https://thisweekinreact.com
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
facebook:
|
|
2
|
+
label: Facebook
|
|
3
|
+
permalink: /facebook
|
|
4
|
+
description: Facebook tag description
|
|
5
|
+
|
|
6
|
+
hello:
|
|
7
|
+
label: Hello
|
|
8
|
+
permalink: /hello
|
|
9
|
+
description: Hello tag description
|
|
10
|
+
|
|
11
|
+
docusaurus:
|
|
12
|
+
label: Docusaurus
|
|
13
|
+
permalink: /docusaurus
|
|
14
|
+
description: Docusaurus tag description
|
|
15
|
+
|
|
16
|
+
hola:
|
|
17
|
+
label: Hola
|
|
18
|
+
permalink: /hola
|
|
19
|
+
description: Hola tag description
|