[project]
name = "apple-mail-mcp"
version = "0.1.5"
description = "Fast MCP server for Apple Mail with FTS5 search index"
readme = "README.md"
license = "GPL-3.0-or-later"
requires-python = ">=3.11"
authors = [
{ name = "Ioan-Mihail Dinu", email = "iodinu@icloud.com" },
]
keywords = [
"mcp",
"apple-mail",
"apple-mail-mcp",
"automation",
"macos",
"email",
"model-context-protocol",
"fts5",
]
classifiers = [
"Development Status :: 3 - Alpha",
"Environment :: MacOS X",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
"Operating System :: MacOS",
"Programming Language :: JavaScript",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Topic :: Communications :: Email",
"Topic :: Software Development :: Libraries :: Python Modules",
]
dependencies = [
"fastmcp>=3.0.0b1,<4",
"cyclopts>=5.0.0a1",
"beautifulsoup4>=4.12",
]
[project.optional-dependencies]
watch = ["watchfiles>=1.0"]
[project.urls]
Homepage = "https://github.com/imdinu/apple-mail-mcp"
Documentation = "https://imdinu.github.io/apple-mail-mcp/"
Repository = "https://github.com/imdinu/apple-mail-mcp"
Issues = "https://github.com/imdinu/apple-mail-mcp/issues"
[project.scripts]
apple-mail-mcp = "apple_mail_mcp:main"
[tool.hatch.build.targets.wheel]
packages = ["src/apple_mail_mcp"]
[tool.hatch.build.targets.sdist]
include = ["src/"]
[tool.hatch.build]
# Include .js files and py.typed marker in the package
artifacts = ["src/**/*.js", "src/**/py.typed"]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[dependency-groups]
dev = [
"ruff>=0.14.8",
"pytest>=8.0",
"pytest-cov>=6.0",
"pytest-asyncio>=0.24",
]
bench = [
"plotly[kaleido]>=6",
]
docs = [
"zensical",
]
[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["src"]
asyncio_mode = "auto"
asyncio_default_fixture_loop_scope = "function"
[tool.ruff]
target-version = "py311"
line-length = 80
src = ["src"]
[tool.ruff.lint]
select = [
"ASYNC",
"B",
"E",
"F",
"I",
"RUF",
"UP",
"W",
]
ignore = [
"ASYNC109", # Timeout parameter pattern is cleaner API for our use case
]
[tool.ruff.format]
docstring-code-format = true