-
Notifications
You must be signed in to change notification settings - Fork 61
Expand file tree
/
Copy pathpyproject.toml
More file actions
177 lines (166 loc) · 7.06 KB
/
Copy pathpyproject.toml
File metadata and controls
177 lines (166 loc) · 7.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
[project]
name = "nextcloud-mcp-server"
version = "0.162.0"
description = "Model Context Protocol (MCP) server for Nextcloud integration - enables AI assistants to interact with Nextcloud data"
authors = [
{name = "Chris Coutinho", email = "chris@coutinho.io"}
]
readme = "README.md"
license = {text = "AGPL-3.0-only"}
requires-python = ">=3.11"
keywords = ["nextcloud", "mcp", "model-context-protocol", "llm", "ai", "claude", "webdav", "caldav", "carddav"]
dependencies = [
"mcp[cli] (>=1.29,<1.30)",
"httpx (>=0.28.1,<0.29.0)",
"pillow (>=10.3.0,<12.0.0)", # Compatible with fastembed
"icalendar (>=7.2.0,<7.3.0)",
"pythonvcard4>=0.2.0",
"pydantic>=2.11.4",
"click>=8.1.8",
"caldav>=3.0.1,<4.0",
"recurring-ical-events>=3.8.0,<4.0", # Client-side recurrence expansion (preserves TZID/floating semantics)
"pyjwt[crypto]>=2.8.0",
"aiosqlite>=0.20.0", # Async SQLite for refresh token storage
"alembic>=1.14.0", # Database migrations
"authlib>=1.6.5",
"qdrant-client>=1.17.0",
"fastembed>=0.7.3", # BM25 sparse vector embeddings for hybrid search
"boto3>=1.35.0", # For Amazon Bedrock provider (optional)
# Observability dependencies
"prometheus-client>=0.21.0", # Prometheus metrics
"opentelemetry-api>=1.28.2", # OpenTelemetry API
"opentelemetry-sdk>=1.28.2", # OpenTelemetry SDK
"starlette<1.0", # Pin until we address starlette 1.0 breaking changes (#648)
"opentelemetry-instrumentation-asgi>=0.49b2", # Auto-instrument ASGI/Starlette
"opentelemetry-instrumentation-httpx>=0.49b2", # Auto-instrument httpx client
"opentelemetry-instrumentation-logging>=0.49b2", # Logging integration
"opentelemetry-exporter-otlp-proto-grpc>=1.28.2", # OTLP gRPC exporter
"python-json-logger>=3.2.0", # Structured JSON logging
"jinja2>=3.1.6",
"langchain-text-splitters>=1.0.0",
"markdownify>=0.14.1", # HTML to Markdown conversion for News items
# Pinned exactly, and upgraded deliberately rather than by range. The
# per-page ``metadata`` that ``to_markdown(page_chunks=True)`` emits is a
# hard dependency of our page-boundary/citation path, and it is not stable
# across releases: 1.27.2.1 made pymupdf4llm initialise pymupdf_layout on
# import, which switched the emitting code path from ``pymupdf_rag`` (key
# ``page``) to ``document_layout`` (key ``page_number``). Upstream pins its
# own pymupdf dependency exactly for the same reason (see their CHANGES for
# 1.27.2.1), so the two versions must move together.
"pymupdf==1.28.0",
"pymupdf4llm==1.28.0",
"openai>=2.8.1",
"dynaconf>=3.2.13,<4.0",
"mistralai>=2.4.5",
"sqlalchemy[asyncio]>=2.0",
"pypdfium2>=5.9.0",
]
classifiers = [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Affero General Public License v3",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Scientific/Engineering :: Artificial Intelligence",
"Topic :: Communications",
"Topic :: Internet :: WWW/HTTP",
]
[project.urls]
Homepage = "https://github.com/cbcoutinho/nextcloud-mcp-server"
Documentation = "https://github.com/cbcoutinho/nextcloud-mcp-server#readme"
Repository = "https://github.com/cbcoutinho/nextcloud-mcp-server"
"Bug Tracker" = "https://github.com/cbcoutinho/nextcloud-mcp-server/issues"
Changelog = "https://github.com/cbcoutinho/nextcloud-mcp-server/blob/master/CHANGELOG.md"
[tool.pytest.ini_options]
anyio_mode = "auto"
addopts = "-p no:asyncio" # Disable pytest-asyncio plugin, use only anyio
log_cli = 1
log_cli_level = "ERROR"
log_level = "ERROR"
markers = [
"unit: Fast unit tests with mocked dependencies",
"integration: Integration tests requiring Docker containers",
"smoke: Critical path smoke tests for quick validation",
"keycloak: OAuth tests that utilize keycloak external identity provider",
"login_flow: Login Flow v2 integration tests (ADR-022)",
"multi_user_basic: Multi-user BasicAuth pass-through tests (ADR-020)",
"ldap: LDAP-backend tests reproducing divergent loginName/UID DAV paths (GH #980)",
"login_flow_ldap: Login Flow v2 deployment mode against the LDAP backend (GH #980, cross-mode)",
"postgres: Tests requiring the docker-compose postgres-test service (ADR-026)",
"contract: Pact consumer/provider contract tests (ADR-029)",
"docling: Tests requiring the docker-compose docling-serve backend (ADR-031)",
]
testpaths = [
"tests",
]
# Timeout settings to prevent tests from hanging indefinitely
timeout = 180 # 3 minutes default timeout per test (includes fixture setup)
timeout_func_only = false # Timeout includes fixture setup/teardown
[tool.commitizen]
name = "cz_conventional_commits"
tag_format = "v$version"
version_scheme = "pep440"
version_provider = "uv"
update_changelog_on_bump = true
major_version_zero = true
[tool.ruff.lint]
extend-select = ["I", "PLC0415", "G004"]
[tool.ruff.lint.per-file-ignores]
"tests/**" = ["PLC0415"]
[build-system]
requires = ["uv_build>=0.12.1,<0.13.0"]
build-backend = "uv_build"
[tool.uv.build-backend]
module-name = "nextcloud_mcp_server"
module-root = ""
[dependency-groups]
dev = [
"commitizen>=4.8.2",
"ipython>=9.2.0",
"playwright>=1.49.1",
"pytest>=8.3.5",
"pytest-cov>=6.1.1",
"pytest-mock>=3.15.1",
"pytest-playwright-asyncio>=0.7.1",
"pytest-timeout>=2.3.1",
"pytest-xdist>=3.6.1",
"ruff>=0.11.13",
"reportlab>=4.0.0",
# ty 0.0.62 only honours bracketed suppression codes carrying a `ty:` prefix.
# The repo's `# type: ignore[<mypy-code>]` comments therefore stopped
# suppressing on the bump; each still-needed one now carries a matching
# `# ty: ignore[<ty-code>]` alongside, and the newly-surfaced diagnostics were
# fixed. Upper bound is renovate-managed (one minor at a time).
"ty>=0.0.63,<0.0.64",
"pytest-otel>=2.0.1",
"procrastinate>=3.8",
"psycopg[binary,pool]>=3.2",
"pact-python>=3.4.0",
# Linux-only dev/CI: exercise the profiling configured-path tests. The
# unit-test job runs on ubuntu, so the pyroscope-io Rust wheel resolves;
# package-smoke (which hits Windows) uses `--with .` and never sees the dev
# group, so this doesn't reintroduce the Windows build failure.
"pyroscope-io>=0.8.0",
]
[project.scripts]
nextcloud-mcp-server = "nextcloud_mcp_server.cli:cli"
[project.optional-dependencies]
postgres = [
"procrastinate>=3.8",
"psycopg[binary,pool]>=3.2",
]
# Continuous profiling (Pyroscope push SDK). Kept OUT of the default deps: it's
# a Rust extension with no Windows wheel, so an unconditional dep breaks the
# cross-platform package-smoke isolated install (source build fails on Windows).
# The runtime import is guarded (observability/profiling.py degrades to a warning
# when absent), so the app runs fully without it; deploy images install
# `.[observability]`. Deck #655.
observability = [
"pyroscope-io>=0.8.0",
]
[[tool.uv.index]]
name = "testpypi"
url = "https://test.pypi.org/simple/"
publish-url = "https://test.pypi.org/legacy/"
explicit = true