mcp-server-llmling
by phil65
Verified
[tool.hatch.version]
source = "regex_commit"
commit_extra_args = ["-e"]
path = "src/mcp_server_llmling/__init__.py"
[build-system]
requires = ["hatchling", "hatch-regex-commit"]
build-backend = "hatchling.build"
[project]
name = "mcp-server-llmling"
description = "MCP (Model context protocol) server with LLMling backend"
authors = [
{ name = "Philipp Temminghoff", email = "philipptemminghoff@googlemail.com" },
]
readme = "README.md"
dynamic = ["version"]
classifiers = [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Topic :: Documentation",
"Topic :: Software Development",
"Topic :: Utilities",
"Typing :: Typed",
]
keywords = []
requires-python = ">=3.12"
license = { file = "LICENSE" }
dependencies = [
"fastapi[standard]>=0.115.6",
"universal-pathlib>=0.2.5",
"uvicorn",
"llmling>=1.0.0",
"mcp>=1.1.0",
"pydantic",
"logfire>=2.6.2",
# Only add below (Copier)
"websockets>=14.1",
"fsspec-httpx>=0.1.2",
]
[project.scripts]
mcp-server-llmling = "mcp_server_llmling.__main__:cli"
[project.optional-dependencies]
gui = ["nicegui"]
[tool.uv]
default-groups = ["dev", "lint", "docs"]
[dependency-groups]
dev = [
"pytest",
"pytest-cov",
"pyreadline3",
"devtools",
# Only add below (Copier)
"pytest-asyncio>=0.24.0",
"pytest-xdist",
]
benchmark = ["pyinstrument"]
lint = [
"ruff",
"mypy[faster-cache]; python_version < '3.14'",
"mypy; python_version >= '3.14'",
# Only add below (Copier)
]
docs = [
"mkdocs-mknodes",
"mkdocs-material",
# Only add below (Copier)
]
[project.urls]
Documentation = "https://phil65.github.io/mcp-server-llmling/"
Source = "https://github.com/phil65/mcp-server-llmling"
Issues = "https://github.com/phil65/mcp-server-llmling/issues"
Discussions = "https://github.com/phil65/mcp-server-llmling/discussions"
"Code coverage" = "https://app.codecov.io/gh/phil65/mcp-server-llmling"
[tool.pytest.ini_options]
testpaths = ["tests"]
log_cli = true
python_files = ["test_*.py"]
pythonpath = ["src"]
log_level = "ERROR"
asyncio_default_fixture_loop_scope = "function"
log_format = "%(asctime)s %(levelname)s %(message)s"
log_date_format = "%Y-%m-%d %H:%M:%S"
asyncio_mode = "auto"
addopts = "-m 'not slow'"
markers = [
"asyncio: mark test as async",
"slow: marks tests as slow",
"unit: marks tests as unit tests",
"integration: marks tests as integration tests",
]
filterwarnings = [
"ignore::DeprecationWarning:pydantic.*:",
"ignore::DeprecationWarning:litellm.*:",
]
[tool.coverage.report]
exclude_lines = [
"pragma: no cover",
"if TYPE_CHECKING:",
"@overload",
"except ImportError",
'if __name__ == "__main__":',
]
[tool.mypy]
python_version = "3.12"
disable_error_code = ["misc", "import"]
pretty = true
check_untyped_defs = true
exclude = ['venv/', '.venv/', 'tests/']
plugins = ["pydantic.mypy"]
[tool.ruff]
line-length = 90
extend-exclude = ['docs']
target-version = "py312"
[tool.ruff.lint]
select = [
"A", # Flake8-builtins
# "ANN", # Flake8-Annotations
# "ASYNC", # Flake8-Async
# "ARG", # # Flake8-Unused-Arguments
"B", # flake8-bugbear
"BLE", # Flake8-blind-except
"C",
"C4", # flake8-comprehensions
# "C90", # MCCabe
"COM", # Flake8-commas
# "CPY", # Copyright-related rules
"D", # PyDocStyle
# "DTZ", # Flake8- Datetimez
"E", # PyCodeStyle Error
"EM", # flake8-errmsg
# "ERA", # Eradicate
"EXE", # flake8-executable
"F", # PyFlakes
"FA", # flake8-future-annotations
# "FBT", # flake8-boolean-trap
# "FIX", # flake8-fixme
"FLY", # flynt
"G", # flake8-logging-format
"I", # ISort
"ICN", # Flake8-import-conventions
"INP", # flake8-no-pep420
"INT", # flake8-gettext
"ISC", # flake8-implicit-str-concat
"N", # pep8-naming
# "NPY", # numpy-specific rules
# "PD", # pandas-vet
"PERF", # perflint
# "PGH", # pygrep-hooks
"PIE", # flake8-pie
"PLE", # PyLint Error
"PLC", # PyLint convention
# "PLW", # PyLint Warning
"PLR", # PyLint refactor
"PT", # flake8-pytest-style
"PTH", # flake8-use-pathlib
"PYI", # flake8-pyi
"Q", # flake8-quotes
"RET", # flake8-return
"RSE", # flake8-raise
"RUF", # ruff-specific rules
# "S", # flake8-bandit
"SIM", # flake8-simplify
"SLF", # flake8-self
"SLOT", # flake8-slots
# "T",
# "TD", # flake8-todos
"T10", # flake8-debugger
# "T20", # flake8-print
"TC", # flake8-type-checking
"TID", # flake8-tidy-imports
"TRY", # tryceratops
"UP", # PyUpgrade
"W", # PyCodeStyle warning
"YTT", # flake8-2020
]
ignore = [
"C408", # Unnecessary {obj_type} call (rewrite as a literal)
"B905", # zip() without an explicit strict= parameter
"C901", # {name} is too complex ({complexity} > {max_complexity})
"COM812",
# "CPY001", # Missing copyright notice at top of file
"D100", # Missing docstring in public module
"D101", # Missing docstring in public class
"D102", # Missing docstring in public method
"D103", # Missing docstring in public function
"D104", # Missing docstring in public package
"D105", # Missing docstring in magic method
"D106", # Missing docstring in public nested class
"D107", # Missing docstring in __init__
"D203", # 1 blank line required before class docstring
"D204", # 1 blank line required after class docstring
"D213", # Multi-line docstring summary should start at the second line
"D215", # Section underline is over-indented ("{name}")
"D400", # First line should end with a period
"D401", # First line of docstring should be in imperative mood: "{first_line}"
"D404", # First word of the docstring should not be "This"
"D406", # Section name should end with a newline ("{name}")
"D407", # Missing dashed underline after section ("{name}")
"D408", # Section underline should be in the line following the section's name ("{name}")
"D409", # Section underline should match the length of its name ("{name}")
"D413", # Missing blank line after last section ("{name}")
"ISC001",
"PLR0912", # Too many branches
"PLR0913", # Too many arguments to function call
"PLR0915", # Too many statements
# "PLR2004", # Magic values instead of named consts
"SLF001", # Private member accessed
"TRY003", # Avoid specifying long messages outside the exception class
]
[tool.ruff.lint.flake8-quotes]
docstring-quotes = "double"
[tool.ruff.format]
# Enable preview style formatting.
preview = true
[tool.ruff.lint.isort]
lines-after-imports = 2
# lines-between-types = 1
# atomic = true
force-sort-within-sections = true
combine-as-imports = true
[tool.ruff.lint.per-file-ignores]
"__init__.py" = ["E402", "I001"]
"scripts/*" = ["INP001"]
[tool.pyright]
venvPath = "."
venv = ".venv"
pythonVersion = "3.12"
pythonPlatform = "All"
typeCheckingMode = "basic"
deprecateTypingAliases = true
reportMissingTypeStubs = false
reportUnusedCallResult = false
reportUnknownVariableType = false
reportAny = false
reportImplicitOverride = false
reportUnusedFunction = false
reportImplicitStringConcatenation = false
reportIgnoreCommentWithoutRule = false
reportUnannotatedClassAttribute = false
reportSelfClsParameterName = false
reportPrivateImportUsage = false
[tool.mknodes]
allowed-commit-types = [
"fix",
"feat",
"refactor",
"docs",
"test",
"build",
"chore",
]
docstring-style = "google"