[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "agentmailkit" version = "0.2.2" description = "Local-first engine for scheduled, LLM-generated email digests that read your own data and never leave your machine." readme = "README.md" requires-python = ">=3.9" license = { text = "MIT" } authors = [{ name = "Aria Han", email = "ariaxhan@gmail.com" }] keywords = [ "mcp", "mcp-server", "model-context-protocol", "claude-code", "codex", "email-digest", "rss", "ai-agents", "local-first", "email", "llm", "agent", "automation", "digest", "scheduler", "claude", "openai", "newsletter", ] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Topic :: Communications :: Email", "Topic :: Office/Business :: Scheduling", ] # Deliberately near-zero required deps: the core runs on the stdlib so agentmailkit # stays trivially installable. Delivery/model/source backends pull their own # libs only when you actually enable them (see [project.optional-dependencies]). dependencies = [] [project.optional-dependencies] gmail = ["google-api-python-client", "google-auth", "google-auth-oauthlib"] anthropic = ["anthropic"] openai = ["openai"] cloud = [] # cloudflare deploy adapter uses the wrangler CLI, no python dep # `agentmailkit mcp` only. The marker is load-bearing: the MCP SDK requires Python # 3.10, agentmailkit supports 3.9, and without it `pip install agentmailkit[mcp]` on # 3.9 fails as an unresolvable dependency instead of installing the rest of the # package. On 3.9 the extra is a no-op and `agentmailkit mcp` says why. mcp = ["mcp>=1.2; python_version >= '3.10'"] all = ["agentmailkit[gmail,anthropic,openai]"] dev = ["pytest", "ruff"] [project.urls] # Homepage points at the author site, not the repo. PyPI project pages carry # real authority and this package's only outbound links went to GitHub, so the # domain the work is actually published under got nothing back. Homepage = "https://ariaxhan.com" Documentation = "https://ariaxhan.com/projects/agentmailkit/" Source = "https://github.com/ariaxhan/agentmailkit" Issues = "https://github.com/ariaxhan/agentmailkit/issues" [project.scripts] agentmailkit = "agentmailkit.cli:main" amk = "agentmailkit.cli:main" [tool.hatch.build.targets.wheel] packages = ["src/agentmailkit"] # The five example jobs must travel with the wheel, or a fresh `pip install agentmailkit` # has no jobs at all and the README's own first command renders nothing. They are copied # in from the repo-root `jobs/` at build time rather than duplicated into src/, so git # holds exactly one copy and the shipped set can never drift from the developed set. # See src/agentmailkit/bundled.py for the matching lookup. [tool.hatch.build.targets.wheel.force-include] "jobs" = "agentmailkit/_bundled/jobs" # The sdist ships the whole working tree by default, which swept in this repo's local # agent scratch state: `_meta/agentdb/agent.db` (session checkpoints, error traces, and # 97 absolute `/Users//...` paths) plus `_meta/logs/actions.jsonl`. None of that is # gitignored-into-safety, because sdist inclusion is independent of git. A PyPI upload is # permanent, so the exclusions below are load-bearing privacy, not tidiness. Verify with # `tar tzf dist/*.tar.gz` before every release. [tool.hatch.build.targets.sdist] exclude = [ "_meta", ".venv", "venv", ".claude", ".github", "out", "*.pickle", ".agentmailkit.json", "secrets.json", ] [tool.pytest.ini_options] testpaths = ["tests"] addopts = "-q" [tool.ruff] target-version = "py39" line-length = 100 [tool.ruff.lint] # Sane baseline, not maximal pedantry: pyflakes (F) + pycodestyle errors (E4/E7/E9) # + import sorting (I). Deliberately NOT enabled: pyupgrade (UP) - repo supports # py3.9 and mixes old/new typing styles on purpose; flake8-bandit (S) / # flake8-blind-except (BLE) - the scheduler/runner intentionally catches broad # exceptions per-job so one bad source/model never kills the whole run; refurb # (FURB) - re.I/re.S aliases are the existing house style throughout themes/. select = ["E4", "E7", "E9", "F", "I"]