[project] name = "logodev-mcp" version = "1.1.0" description = "Look up company logos and brand data via the logo.dev API." readme = "README.md" license = "MIT" requires-python = ">=3.11" authors = [{ name = "pvliesdonk" }] keywords = [] classifiers = [ "Development Status :: 3 - Alpha", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "License :: OSI Approved :: MIT License", ] dependencies = [ "fastmcp-pvl-core>=4.2.0,<5", "typer>=0.12", # PROJECT-DEPS-START — add domain dependencies below; kept across copier update "httpx>=0.27", # PROJECT-DEPS-END ] [project.optional-dependencies] # PROJECT-EXTRAS-START — add domain-specific optional-dependency groups below; kept across copier update # Pulls debugpy transitively via fastmcp-pvl-core's [debug] extra. The # version range is inherited from the [project] dependency on # fastmcp-pvl-core above; pip resolves a single, consistent version. debug = ["fastmcp-pvl-core[debug]"] # PROJECT-EXTRAS-END # Tooling lives under PEP 735 [dependency-groups] (not [project.optional-dependencies]) # so it never ships to PyPI consumers and never lands in the security-audit input. [dependency-groups] dev = [ "pytest>=8", "pytest-asyncio>=0.24", "pytest-cov>=5", "diff-cover>=9", "ruff>=0.6", "mypy>=1.11", "pre-commit>=3", "pip-audit>=2.7", "jsonschema>=4.18", "respx>=0.23.1", ] docs = [ "mike>=2", "mkdocs-material>=9.7.6", "mkdocstrings[python]>=0.28", "mkdocs-llmstxt>=0.5", ] browser = [ "pytest-playwright>=0.5", ] [project.scripts] logodev-mcp = "logodev_mcp.cli:main" [project.urls] Repository = "https://github.com/pvliesdonk/logodev-mcp" Documentation = "https://pvliesdonk.github.io/logodev-mcp/" Issues = "https://github.com/pvliesdonk/logodev-mcp/issues" Changelog = "https://github.com/pvliesdonk/logodev-mcp/blob/main/CHANGELOG.md" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/logodev_mcp"] [tool.ruff] target-version = "py311" line-length = 88 src = ["src", "tests"] [tool.ruff.lint] select = [ "E", "W", "F", "I", "B", "C4", "UP", "ARG", "SIM", "TCH", "PTH", "RUF", ] ignore = ["E501"] [tool.ruff.lint.per-file-ignores] # Depends() and CurrentContext() calls in argument defaults are the standard # FastMCP dependency injection pattern — B008 is a false positive here. # Context/FastMCP/Service imports must stay runtime (not TYPE_CHECKING) for # DI resolution — TC001/TC002/TC003. # PROJECT-RUFF-IGNORES-START — replace, extend, or override the entries below # for your project's real source/test paths (split _server_apps.py into # per-domain modules, rename tests, add per-file overrides as needed); kept # across copier update. "src/logodev_mcp/cli.py" = ["B008"] "src/logodev_mcp/_server_deps.py" = ["B008", "TC002", "TC003"] "src/logodev_mcp/_server_apps.py" = ["B008", "TC001", "TC002"] "src/logodev_mcp/tools.py" = ["B008", "TC001", "TC002"] "src/logodev_mcp/resources.py" = ["B008", "TC001", "TC002"] "src/logodev_mcp/prompts.py" = ["B008", "TC002"] "tests/conftest.py" = ["TC002", "TC003"] "tests/test_smoke.py" = ["TC002", "TC003"] "tests/test_tools.py" = ["TC002"] "tests/test_config.py" = ["TC002"] # PROJECT-RUFF-IGNORES-END [tool.ruff.lint.isort] known-first-party = ["logodev_mcp"] [tool.ruff.format] quote-style = "double" indent-style = "space" [tool.pytest.ini_options] testpaths = ["tests"] addopts = ["--strict-markers", "-ra"] asyncio_mode = "auto" markers = [ "browser: end-to-end test that drives a headless browser (requires the 'browser' dependency group + 'playwright install chromium')", ] [tool.coverage.run] source = ["src/logodev_mcp"] branch = true [tool.coverage.report] fail_under = 80 exclude_lines = [ "pragma: no cover", "def __repr__", "raise AssertionError", "raise NotImplementedError", "if TYPE_CHECKING:", "if __name__ == .__main__.:", ] [tool.mypy] python_version = "3.11" strict = true warn_return_any = true warn_unused_ignores = true disallow_untyped_defs = true disallow_incomplete_defs = true check_untyped_defs = true no_implicit_optional = true [[tool.mypy.overrides]] module = ["fastmcp_pvl_core", "fastmcp_pvl_core.*"] ignore_missing_imports = true [[tool.mypy.overrides]] module = ["jsonschema", "jsonschema.*"] ignore_missing_imports = true [tool.pyright] # Point Pyright at the uv-managed venv so editor diagnostics resolve # imports the same way as our CLI tools (mypy/ruff/pytest run via uv). venvPath = "." venv = ".venv" pythonVersion = "3.11" # src-layout editable installs use a .pth shim that Pyright does not execute; # point Pyright at src/ directly so IDE import resolution matches runtime. extraPaths = ["src"] [tool.semantic_release] version_toml = ["pyproject.toml:project.version"] commit_parser = "angular" tag_format = "v{version}" # Bump versioned manifests (server.json) inside the release commit rather # than in a follow-up commit + force-retag. Extend scripts/bump_manifests.py # if your project adds more lockstep manifests (plugin.json, .mcp.json, ...). build_command = "python scripts/bump_manifests.py" # PSR stages and commits files listed in `assets` together with pyproject.toml # and CHANGELOG.md, so the release tag points at a single commit containing # all version-coupled files. Add ".claude-plugin/plugin/.claude-plugin/plugin.json" # and ".claude-plugin/plugin/.mcp.json" once your project scaffolds them. assets = [ "server.json", ] [tool.semantic_release.changelog] changelog_file = "CHANGELOG.md" [tool.semantic_release.commit_parser_options] minor_tags = ["feat"] patch_tags = ["fix", "perf"]