Skip to main content
Glama

Hostaway MCP Server

pyproject.toml4.68 kB
[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "hostaway-mcp" version = "0.1.0" description = "MCP server for Hostaway property management API" readme = "README.md" requires-python = ">=3.12" dependencies = [ "aiolimiter>=1.2.1", "click>=8.1.0", "email-validator>=2.3.0", "fastapi>=0.100.0", "fastapi-mcp>=0.4.0", "httpx>=0.27.0", "mcp>=1.17.0", "nanoid>=2.0.0", "pydantic>=2.0.0", "pydantic-settings>=2.0.0", "python-json-logger>=4.0.0", "stripe>=7.0.0", "supabase>=2.0.0", "tenacity>=9.1.2", "watchdog>=3.0.0", ] [tool.hatch.build.targets.wheel] packages = ["src"] [dependency-groups] dev = [ "mypy>=1.18.2", "pre-commit>=4.3.0", "pytest>=8.4.2", "pytest-asyncio>=1.2.0", "pytest-cov>=7.0.0", "pytest-mock>=3.12.0", "respx>=0.21.1", "ruff>=0.14.0", ] [tool.ruff] line-length = 100 target-version = "py312" [tool.ruff.lint] select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # pyflakes "I", # isort "N", # pep8-naming "UP", # pyupgrade "B", # flake8-bugbear "A", # flake8-builtins "C4", # flake8-comprehensions "DTZ", # flake8-datetimez "T10", # flake8-debugger "EM", # flake8-errmsg # "ISC", # flake8-implicit-str-concat - disabled due to formatter conflict with ISC001 "ICN", # flake8-import-conventions "PIE", # flake8-pie "PT", # flake8-pytest-style "Q", # flake8-quotes "RET", # flake8-return "SIM", # flake8-simplify "TID", # flake8-tidy-imports "ARG", # flake8-unused-arguments "PTH", # flake8-use-pathlib "ERA", # eradicate "PL", # pylint "RUF", # ruff-specific rules ] ignore = [ "PLR0913", # Too many arguments in function definition "PLR2004", # Magic value used in comparison "PLR0911", # Too many return statements "PLW0603", # Global statement usage "EM101", # Exception string literals (require variable assignment) "EM102", # Exception f-string literals (require variable assignment) "SIM105", # Use contextlib.suppress instead of try-except-pass "ERA001", # Commented-out code (keep for now during development) "DTZ005", # datetime.now() without timezone (non-critical for tests) "DTZ007", # datetime.strptime() without timezone "DTZ011", # date.today() without timezone "ARG001", # Unused function arguments (may be required by framework) "ARG002", # Unused method arguments "PLC0415", # Import outside top-level (needed for conditional imports) "E402", # Module level import not at top of file "B008", # Function call in argument defaults (FastAPI Depends pattern) "B904", # Raise from within except (allow simple raise) "B007", # Loop variable not used (intentional in some cases) "RET504", # Unnecessary variable assignment before return "PT011", # pytest.raises too broad (allow for now) "B017", # Assert with broad exception (allow for tests) "E501", # Line too long (formatter handles this) "RUF022", # __all__ not sorted "SIM117", # Nested with statements (intentional for readability) "F841", # Local variable assigned but never used (tests may have setup) ] [tool.ruff.format] quote-style = "double" indent-style = "space" [tool.mypy] python_version = "3.12" strict = false # Relaxed for development - can tighten later warn_return_any = false warn_unused_configs = true warn_unused_ignores = false # Allow unused ignores during development no_implicit_optional = true show_error_codes = true disallow_untyped_defs = false # Allow untyped defs for now disallow_any_unimported = false disallow_any_explicit = false check_untyped_defs = false # Don't check untyped defs ignore_missing_imports = true # Ignore missing stubs [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] python_files = ["test_*.py"] python_classes = ["Test*"] python_functions = ["test_*"] addopts = [ "--strict-markers", "--cov=src", "--cov-report=term-missing", "--cov-report=html", "--cov-fail-under=80", ] markers = [ "e2e: End-to-end integration tests", "performance: Performance and load tests", "slow: Slow running tests", ] [tool.coverage.run] source = ["src"] omit = [ "*/tests/*", "*/__pycache__/*", "*/.venv/*", "src/api/main.py", # Integration/lifecycle code - tested separately "src/mcp/server.py", # MCP server instance - not unit testable ] [tool.coverage.report] precision = 2 show_missing = true skip_covered = false

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/darrentmorgan/hostaway-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server