Skip to main content
Glama

CSV Editor

by santoshray02
pyproject.tomlโ€ข7.97 kB
[build-system] requires = ["hatchling>=1.26.0"] build-backend = "hatchling.build" [project] name = "csv-editor" version = "1.0.1" description = "MCP server for comprehensive CSV file operations with pandas-based tools" readme = "README.md" requires-python = ">=3.10" license = {text = "MIT"} authors = [ {name = "Santosh Ray", email = "rayskumar02@gmail.com"}, ] maintainers = [ {name = "Santosh Ray", email = "rayskumar02@gmail.com"}, ] keywords = [ "csv", "mcp", "model-context-protocol", "data-analysis", "data-manipulation", "pandas", "fastmcp", "data-validation", "data-quality", "data-profiling", "outlier-detection", ] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "Intended Audience :: Financial and Insurance Industry", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Scientific/Engineering :: Information Analysis", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Office/Business :: Financial :: Spreadsheet", "Topic :: Utilities", "Typing :: Typed", "Framework :: AsyncIO", ] dependencies = [ "fastmcp>=2.11.3", "pandas>=2.2.3", "numpy>=2.1.3", "pydantic>=2.10.4", "aiofiles>=24.1.0", "python-dateutil>=2.9.0", "httpx>=0.27.0", "openpyxl>=3.1.5", "pyarrow>=17.0.0", "tabulate>=0.9.0", "pytz>=2024.2", ] [project.optional-dependencies] performance = [ "numexpr>=2.10.0", "bottleneck>=1.4.0", "fastparquet>=2024.11.0", # Alternative Parquet engine ] dev = [ "pytest>=8.3.0", "pytest-asyncio>=0.24.0", "pytest-cov>=5.0.0", "pytest-mock>=3.14.0", "pytest-benchmark>=5.0.0", "black>=24.10.0", "ruff>=0.7.0", "mypy>=1.13.0", "pre-commit>=4.0.0", "pandas-stubs>=2.2.3", "types-aiofiles>=24.1.0", "types-tabulate>=0.9.0", "types-pytz>=2024.2", "ipython>=8.29.0", "rich>=13.9.0", ] docs = [ "mkdocs>=1.6.0", "mkdocs-material>=9.5.0", "mkdocstrings[python]>=0.26.0", "mkdocs-mermaid2-plugin>=1.1.0", ] test = [ "pytest>=8.3.0", "pytest-asyncio>=0.24.0", "pytest-cov>=5.0.0", "pytest-mock>=3.14.0", "pytest-benchmark>=5.0.0", "hypothesis>=6.122.0", # Property-based testing "faker>=30.0.0", # Generate test data ] all = [ "csv-editor[performance,dev,docs,test]", ] [project.urls] Homepage = "https://github.com/santoshray02/csv-editor" Documentation = "https://github.com/santoshray02/csv-editor#readme" Repository = "https://github.com/santoshray02/csv-editor" Issues = "https://github.com/santoshray02/csv-editor/issues" Changelog = "https://github.com/santoshray02/csv-editor/blob/main/CHANGELOG.md" "Release Notes" = "https://github.com/santoshray02/csv-editor/releases" [project.scripts] csv-editor = "csv_editor.server:main" csv = "csv_editor.server:main" # Shorter alias # Note: We use uv for environment and dependency management # Hatchling is used only as the build backend for packaging [tool.hatch.build.targets.sdist] include = [ "/src", "/tests", "/examples", "README.md", "LICENSE", "CHANGELOG.md", "pyproject.toml", "uv.toml", ] exclude = [ "*.pyc", "__pycache__", ".git", ".github", ".venv", ".env", ".DS_Store", "*.egg-info", ".pytest_cache", ".mypy_cache", ".ruff_cache", "htmlcov", ".coverage", ] [tool.hatch.build.targets.wheel] packages = ["src/csv_editor"] # Use uv instead of hatch environments # Run commands with: # uv run test # uv run server # uv run fmt # See uv.toml for command definitions # Modern tool configurations [tool.black] line-length = 100 target-version = ["py38", "py39", "py310", "py311", "py312", "py313"] include = '\.pyi?$' extend-exclude = ''' /( \.git | \.venv | build | dist | \.eggs | \.hatch )/ ''' [tool.ruff] line-length = 100 target-version = "py38" fix = true output-format = "grouped" show-fixes = true [tool.ruff.lint] select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # pyflakes "I", # isort "N", # pep8-naming "B", # flake8-bugbear "C4", # flake8-comprehensions "UP", # pyupgrade "ARG", # flake8-unused-arguments "SIM", # flake8-simplify "PTH", # flake8-use-pathlib "RUF", # Ruff-specific rules "ASYNC",# flake8-async "TCH", # flake8-type-checking "DTZ", # flake8-datetimez "FA", # flake8-future-annotations ] ignore = [ "E501", # line too long (handled by black) "B008", # do not perform function calls in argument defaults "B905", # `zip()` without an explicit `strict=` parameter "SIM105", # contextlib.suppress is slower ] [tool.ruff.lint.per-file-ignores] "tests/*" = ["ARG", "S101", "DTZ"] # Allow unused arguments, assert, and naive datetime in tests "examples/*" = ["T201", "T203"] # Allow print() in examples [tool.ruff.lint.isort] known-first-party = ["src", "csv_editor"] section-order = ["future", "standard-library", "third-party", "first-party", "local-folder"] [tool.ruff.format] quote-style = "double" indent-style = "space" skip-magic-trailing-comma = false [tool.mypy] python_version = "3.8" namespace_packages = true explicit_package_bases = true warn_return_any = true warn_unused_configs = true disallow_untyped_defs = true disallow_any_unimported = false no_implicit_optional = true check_untyped_defs = true warn_redundant_casts = true warn_unused_ignores = true warn_no_return = true show_error_codes = true strict_equality = true pretty = true show_column_numbers = true show_error_context = true [[tool.mypy.overrides]] module = [ "fastmcp", "tabulate", "openpyxl", "pyarrow", "numexpr", "bottleneck", "fastparquet", ] ignore_missing_imports = true [tool.pytest.ini_options] minversion = "8.0" testpaths = ["tests"] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" addopts = [ "--strict-markers", "--tb=short", "--verbose", "--color=yes", "-ra", ] markers = [ "slow: marks tests as slow (deselect with '-m \"not slow\"')", "integration: marks tests as integration tests", "unit: marks tests as unit tests", "benchmark: marks tests as benchmark tests", ] filterwarnings = [ "ignore::DeprecationWarning", "ignore::PendingDeprecationWarning", ] [tool.coverage.run] source = ["src"] branch = true parallel = true omit = [ "*/tests/*", "*/__pycache__/*", "*/site-packages/*", "src/csv_editor/__main__.py", ] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "def __str__", "raise AssertionError", "raise NotImplementedError", "if __name__ == .__main__.:", "if TYPE_CHECKING:", "pass", "@abstractmethod", "@abc.abstractmethod", ] precision = 2 show_missing = true skip_covered = false skip_empty = true sort = "Cover" fail_under = 80 [tool.coverage.html] directory = "htmlcov" title = "CSV Editor Coverage Report" [tool.coverage.json] output = "coverage.json" pretty_print = true # Documentation [tool.mkdocs] site_name = "CSV Editor" site_description = "Comprehensive CSV manipulation and analysis via Model Context Protocol" site_author = "Santosh Ray" repo_url = "https://github.com/santoshray02/csv-editor" repo_name = "csv-editor" [dependency-groups] dev = [ "twine>=6.1.0", ] # Pre-commit hooks configuration (for reference) # Create .pre-commit-config.yaml separately

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/santoshray02/csv-editor'

If you have feedback or need assistance with the MCP directory API, please join our Discord server