[project] name = "memex-mcp" version = "0.9.0" description = "Trusted engineering context for agentic software engineering — a temporal knowledge graph served through Hermes MemoryProvider and MCP." readme = "README.md" license = { text = "MIT" } requires-python = ">=3.11" authors = [ { name = "Hill Patel", email = "hillaniljppatel@gmail.com" } ] maintainers = [ { name = "Hill Patel", email = "hillaniljppatel@gmail.com" } ] keywords = [ "mcp", "mcp-server", "model-context-protocol", "ai-agents", "ai-coding-assistant", "knowledge-graph", "developer-tools", "code-intelligence", "context", "context-engineering", "agent-memory", "persistent-memory", "rag", "gemini", "gemini-cli", "claude-code", "codex", "cursor", "anthropic", "tree-sitter", "temporal-graph", "neo4j", "graphiti" ] 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 :: Software Development :: Libraries :: Python Modules", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Software Development :: Version Control :: Git", "Operating System :: OS Independent", ] dependencies = [ "graphiti-core[google-genai]>=0.29.0,<1.0.0", "google-genai>=2.0.1,<3.0.0", "tree-sitter-language-pack>=1.8.0,<2.0.0", "watchdog>=6.0.0,<7.0.0", "mcp>=1.27.1,<2.0.0", "fastapi>=0.137.2,<1.0.0", "uvicorn>=0.46.0,<1.0.0", "apscheduler>=3.11.2,<4.0.0", "python-dotenv>=1.2.2,<2.0.0", "pytest>=9.0.3,<10.0.0", "pytest-asyncio>=1.3.0,<2.0.0", "pytest-cov>=7.1.0,<8.0.0", "gitpython>=3.1.50,<4.0.0", "httpx>=0.27.0,<1.0.0", "neo4j>=6.2.0,<7.0.0", "pydantic>=2.13.4,<3.0.0", "psutil>=6.1.1,<8.0.0", "PyYAML>=6.0.1,<7.0.0", "anthropic>=0.102.0", "rich>=13.0.0,<16.0.0", "itsdangerous>=2.2.0", ] [project.optional-dependencies] # v0.3.1 cluster engine — graspologic (Leiden) + hdbscan (decision topic clusters). # graspologic pins numpy<2; on Windows + Python 3.13 you need MSVC Build Tools 2022 # (https://aka.ms/vs/17/release/vs_BuildTools.exe — "Desktop development with C++"). # Without MSVC, install will fail to compile numpy 1.x. Skip this extra to use memex # without cluster engine — module-level fallback still works. cluster = [ "graspologic>=3.4,<4.0", "hdbscan>=0.8.40,<1.0", "scikit-learn>=1.3,<2.0", ] otel = [ "opentelemetry-api>=1.28.0", "opentelemetry-sdk>=1.28.0", "opentelemetry-exporter-otlp>=1.28.0", ] all = [ "memex-mcp[cluster,otel]", ] [project.urls] Homepage = "https://github.com/STiFLeR7/memex" Repository = "https://github.com/STiFLeR7/memex" Documentation = "https://github.com/STiFLeR7/memex/blob/master/README.md" "Bug Tracker" = "https://github.com/STiFLeR7/memex/issues" Changelog = "https://github.com/STiFLeR7/memex/releases" "PyPI" = "https://pypi.org/project/memex-mcp/" "npm" = "https://www.npmjs.com/package/stifler-memex-mcp" [tool.uv] managed = true [tool.hatch.build.targets.wheel] packages = ["memex"] [tool.hatch.build.targets.sdist] include = [ "/memex", "/README.md", "/CHANGELOG.md", "/CONTRIBUTING.md", "/LICENSE", "/pyproject.toml", ] [tool.pytest.ini_options] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "module" addopts = "-p no:capture" markers = [ "integration: marks tests as integration tests (requires Neo4j/Gemini)", ] [project.scripts] memex = "memex.cli:main" [project.entry-points."hermes_agent.memory_providers"] memex = "memex.integrations.hermes_provider:register" [tool.ruff] line-length = 100 target-version = "py311" [tool.ruff.lint] # Correctness (pyflakes) + bugbear. Style rules (E/W) are intentionally NOT # selected yet — there is a large existing E501 backlog (audit Q3/style); enable # them in a dedicated formatting pass. These keep NEW correctness regressions out. select = ["F", "B"] ignore = [ "B904", # raise ... from: 15 pre-existing sites (audit Q1) — track separately "B007", # unused loop control var: 1 pre-existing "B905", # zip() without strict=: 1 pre-existing "B008", # function call in arg default — idiomatic for FastAPI Depends() ] [tool.ruff.lint.per-file-ignores] # Tests legitimately redefine fixtures, import-for-side-effect, and bind # context-manager mocks they don't directly assert on. "tests/**" = ["F811", "F841"] [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [dependency-groups] dev = [ "build>=1.5.0", "hypothesis>=6.153.0", "twine>=6.2.0", ]