[project] name = "kitchensink4xl" version = "1.2.3" description = "Read and edit Excel (.xlsx) files with your AI assistant: formulas, tables, CSV and JSON, and a clear label on every calculated, cached or missing value. Local MCP server for Claude Code, Codex CLI and other MCP clients." readme = "README.md" license = "AGPL-3.0-only" license-files = ["LICENSE", "NOTICE.md"] authors = [{ name = "Alvut Consulting, LLC (KitchenSink4AI)" }] keywords = [ "mcp", "excel", "xlsx", "ooxml", "spreadsheet", "claude", "model-context-protocol", "openpyxl", "pivot-tables", "formulas", "conditional-formatting", "data-validation", "charts", "round-trip-safety", "tiered-loading", "recalculation", "lambda", "named-ranges", "csv", "office", "com", ] # No Development Status trove classifier, matching the shipped siblings # (kitchensink4word and kitchensink4ppt carry none). The version number # carries the maturity claim; README and llms.txt say what backs it. classifiers = [ "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: End Users/Desktop", "Intended Audience :: Financial and Insurance Industry", "Intended Audience :: Science/Research", "Natural Language :: English", "Operating System :: Microsoft :: Windows", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Topic :: Office/Business :: Financial :: Spreadsheet", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: Markup :: XML", "Typing :: Typed", ] requires-python = ">=3.12" dependencies = [ # fastmcp is PINNED from day one (the Word v2 lesson: never ship # unpinned fastmcp; a minor bump moved the visibility API mid-build). "fastmcp>=3.4,<4", "openpyxl", # Ported-infrastructure deps: lxml backs the raw OOXML surgery escape # hatch (DESIGN Section 2.4); regex backs the caller-pattern ReDoS guard # (core/_regex.py). "lxml", "regex", # packaging backs the startup update check's version comparison # (prerelease-aware, so a stable build is never offered an rc). "packaging", ] [project.optional-dependencies] # The COM tier is Windows + Excel only; keep pywin32 an opt-in extra so the # cross-platform file-based tier installs anywhere. Also platform-gated so a # non-Windows install of the extra is a no-op rather than a build failure. com = ["pywin32; sys_platform == 'win32'"] dev = [ "pytest", "pytest-timeout", # Pillow backs the image tools and psutil backs COM process identity. # Neither is a runtime requirement: without them the image tools refuse # honestly and a PID's creation time reads as unknown. The TESTS for both # behaviors need the real library present, so they belong here, and CI # discovered their absence the hard way on the first public run. "pillow", "psutil", ] [project.urls] Homepage = "https://kitchensink4.ai" Documentation = "https://github.com/KitchenSink4AI/KitchenSink4XL#readme" Repository = "https://github.com/KitchenSink4AI/KitchenSink4XL" Issues = "https://github.com/KitchenSink4AI/KitchenSink4XL/issues" Changelog = "https://github.com/KitchenSink4AI/KitchenSink4XL/releases" "Agent manifest (llms.txt)" = "https://github.com/KitchenSink4AI/KitchenSink4XL/blob/main/docs/llms.txt" "Commercial license" = "https://github.com/KitchenSink4AI/KitchenSink4XL/issues/new?template=commercial_license.yml" [project.scripts] xl-mcp = "xlsx_mcp.server:main" kitchensink4xl = "xlsx_mcp.server:main" [build-system] requires = ["setuptools>=77"] build-backend = "setuptools.build_meta" [tool.setuptools.packages.find] where = ["src"] [tool.pytest.ini_options] testpaths = ["tests"] timeout = 120 markers = [ "com: needs an interactive Excel instance (auto-skipped where Excel is unavailable)", ]