[project] name = "mcp-office-tools" version = "0.1.0" description = "MCP server for comprehensive Microsoft Office document processing" authors = [{name = "MCP Office Tools", email = "contact@mcpofficetools.dev"}] readme = "README.md" license = {text = "MIT"} requires-python = ">=3.11" keywords = ["mcp", "office", "docx", "xlsx", "pptx", "word", "excel", "powerpoint", "document", "processing"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Office/Business :: Office Suites", "Topic :: Text Processing", "Topic :: Software Development :: Libraries :: Python Modules", ] dependencies = [ "fastmcp>=0.5.0", "python-docx>=1.1.0", "openpyxl>=3.1.0", "python-pptx>=1.0.0", "mammoth>=1.6.0", "xlrd>=2.0.0", "xlwt>=1.3.0", "pandas>=2.0.0", "olefile>=0.47", "msoffcrypto-tool>=5.4.0", "lxml>=4.9.0", "pillow>=10.0.0", "beautifulsoup4>=4.12.0", "aiohttp>=3.9.0", "aiofiles>=23.2.0", "chardet>=5.0.0", "xlsxwriter>=3.1.0", ] [project.optional-dependencies] dev = [ "pytest>=7.4.0", "pytest-asyncio>=0.21.0", "pytest-cov>=4.1.0", "black>=23.0.0", "ruff>=0.1.0", "mypy>=1.5.0", "types-beautifulsoup4", "types-pillow", "types-chardet", ] nlp = [ "nltk>=3.8", "spacy>=3.7", "textstat>=0.7", ] conversion = [ "pypandoc>=1.11", ] enhanced = [ "python-magic>=0.4.0", ] [project.urls] Homepage = "https://github.com/mcp-office-tools/mcp-office-tools" Documentation = "https://mcp-office-tools.readthedocs.io" Repository = "https://github.com/mcp-office-tools/mcp-office-tools" Issues = "https://github.com/mcp-office-tools/mcp-office-tools/issues" [project.scripts] mcp-office-tools = "mcp_office_tools.server:main" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/mcp_office_tools"] [tool.hatch.build.targets.sdist] include = [ "/src", "/tests", "/examples", "/README.md", "/LICENSE", ] # Code quality tools [tool.black] line-length = 88 target-version = ["py311"] include = '\.pyi?$' extend-exclude = ''' /( # directories \.eggs | \.git | \.hg | \.mypy_cache | \.tox | \.venv | build | dist )/ ''' [tool.ruff] target-version = "py311" line-length = 88 select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # pyflakes "I", # isort "B", # flake8-bugbear "C4", # flake8-comprehensions "UP", # pyupgrade ] ignore = [ "E501", # line too long, handled by black "B008", # do not perform function calls in argument defaults "C901", # too complex ] [tool.ruff.per-file-ignores] "__init__.py" = ["F401"] [tool.mypy] python_version = "3.11" check_untyped_defs = true disallow_any_generics = true disallow_incomplete_defs = true disallow_untyped_defs = true no_implicit_optional = true warn_redundant_casts = true warn_unused_ignores = true warn_return_any = true strict_equality = true [tool.pytest.ini_options] minversion = "7.0" addopts = [ "--strict-markers", "--strict-config", "--cov=mcp_office_tools", "--cov-report=term-missing", "--cov-report=html", "--cov-report=xml", ] testpaths = ["tests"] python_files = ["test_*.py"] python_classes = ["Test*"] python_functions = ["test_*"] markers = [ "slow: marks tests as slow (deselect with '-m \"not slow\"')", "integration: marks tests as integration tests", "unit: marks tests as unit tests", ] [tool.coverage.run] source = ["src/mcp_office_tools"] omit = [ "*/tests/*", "*/test_*", ] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "if self.debug:", "if settings.DEBUG", "raise AssertionError", "raise NotImplementedError", "if 0:", "if __name__ == .__main__.:", "class .*\\bProtocol\\):", "@(abc\\.)?abstractmethod", ] [dependency-groups] dev = [ "pytest>=8.4.1", "pytest-asyncio>=1.1.0", "pytest-cov>=6.2.1", ]