[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "openresearch-mcp" version = "0.2.1" description = "Zero-auth cross-domain research MCP server — web, academic, GitHub, news, weather, macro/finance, SEC, biomedical, Bluesky, YouTube, and more." readme = "README.md" license = { text = "Apache-2.0" } requires-python = ">=3.11" authors = [{ name = "Alex Anokhin", email = "olanokhin@gmail.com" }] keywords = [ "mcp", "model-context-protocol", "research", "llm", "ai", "arxiv", "openalex", "duckduckgo", "github", "news", "weather", "finance", "sec", "biomedical", "bluesky", "youtube", ] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Internet :: WWW/HTTP", "Topic :: Software Development :: Libraries :: Python Modules", ] dependencies = [ "fastmcp>=3.4.2,<4", "requests>=2.32", "beautifulsoup4>=4.12", "pycountry>=24.6,<25", # Scraping libs change behavior across majors — cap to the tested major. "ddgs>=9.0,<10", "pypdf>=5.0,<6", "youtube-transcript-api>=1.0,<2", ] [project.urls] Homepage = "https://github.com/olanokhin/openresearch-mcp" Repository = "https://github.com/olanokhin/openresearch-mcp" "Bug Tracker" = "https://github.com/olanokhin/openresearch-mcp/issues" [project.optional-dependencies] dev = ["pytest", "ruff>=0.6", "mypy>=1.11", "types-requests", "tiktoken>=0.7"] [project.scripts] openresearch-mcp = "openresearch_mcp.server:main" [tool.hatch.build.targets.wheel] packages = ["src/openresearch_mcp"] # Keep the published source distribution clean. hatchling otherwise sweeps in any # untracked dir (local agent tooling, caches). Explicit excludes are deterministic # even when the build runs without git available. [tool.hatch.build.targets.sdist] exclude = [ ".agents", ".claude", ".pytest_cache", "dist", ] [tool.ruff] line-length = 110 target-version = "py311" [tool.ruff.lint] # pyflakes, pycodestyle, isort, pyupgrade, flake8-bugbear, comprehensions. select = ["E", "F", "I", "UP", "B", "C4"] # Line length is intentionally loose here (long instruction strings, dict literals # that predate the linter). Keep the high-signal rules; don't force a reformat. ignore = ["E501"] [tool.mypy] python_version = "3.11" files = ["src"] ignore_missing_imports = true warn_unused_ignores = true warn_redundant_casts = true [tool.pytest.ini_options] testpaths = ["tests"] markers = [ "integration: tests that call real public network services", ] [tool.uv] dev-dependencies = ["pytest", "ruff>=0.6", "mypy>=1.11", "types-requests", "tiktoken>=0.7"]