Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5259658458 | |||
| e03a3c2e83 | |||
| 94cbd3015d | |||
| 49a961cbcc | |||
| e1aca04aff | |||
| 3b12e585ca | |||
| e647c87dd8 | |||
| cb74157d51 | |||
| 202058bdc8 | |||
| c312911538 | |||
| e602684743 | |||
| 8221046d8a | |||
| 3e45b6ca25 | |||
| 9ec7637579 | |||
| 670188f9e4 | |||
| 3878beaf65 | |||
| a5a0571bde | |||
| 0e7e74867f | |||
| a29045cca4 | |||
| 3c3646bec2 | |||
| dd636e6a08 | |||
| e0de2e17e9 | |||
| 4fc0cb5a41 | |||
| ff9cca716b | |||
| ef4a82e589 | |||
| 301c502e57 | |||
| d4d291d6d2 | |||
| e4b0ea5093 |
@@ -14,16 +14,109 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
|
|
||||||
- name: Configure Git
|
- name: Configure Git
|
||||||
run: |
|
run: |
|
||||||
git config user.name "$GITHUB_ACTOR"
|
git config user.name "$GITHUB_ACTOR"
|
||||||
git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
|
git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
|
||||||
|
|
||||||
- name: Run chart-releaser
|
- name: Run chart-releaser
|
||||||
uses: helm/chart-releaser-action@v1.7.0
|
uses: helm/chart-releaser-action@cae68fefc6b5f367a0275617c9f83181ba54714f # v1.7.0
|
||||||
env:
|
env:
|
||||||
CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
||||||
|
|
||||||
|
- name: Update gh-pages with Chart README and Index
|
||||||
|
run: |
|
||||||
|
# Get the repository name
|
||||||
|
REPO_NAME="${GITHUB_REPOSITORY##*/}"
|
||||||
|
REPO_OWNER="${GITHUB_REPOSITORY%/*}"
|
||||||
|
|
||||||
|
# Switch to gh-pages branch
|
||||||
|
git fetch origin gh-pages
|
||||||
|
git checkout gh-pages
|
||||||
|
|
||||||
|
# Copy Chart README to root
|
||||||
|
git checkout ${GITHUB_REF#refs/tags/} -- charts/nextcloud-mcp-server/README.md
|
||||||
|
mv charts/nextcloud-mcp-server/README.md README.md || true
|
||||||
|
rm -rf charts 2>/dev/null || true
|
||||||
|
|
||||||
|
# Create index.html with installation instructions
|
||||||
|
cat > index.html <<'EOF'
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Nextcloud MCP Server Helm Chart</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||||
|
max-width: 800px;
|
||||||
|
margin: 50px auto;
|
||||||
|
padding: 20px;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
code {
|
||||||
|
background: #f4f4f4;
|
||||||
|
padding: 2px 6px;
|
||||||
|
border-radius: 3px;
|
||||||
|
font-family: "Monaco", "Courier New", monospace;
|
||||||
|
}
|
||||||
|
pre {
|
||||||
|
background: #f4f4f4;
|
||||||
|
padding: 15px;
|
||||||
|
border-radius: 5px;
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
h1, h2 { color: #0082c9; }
|
||||||
|
a { color: #0082c9; text-decoration: none; }
|
||||||
|
a:hover { text-decoration: underline; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Nextcloud MCP Server Helm Chart</h1>
|
||||||
|
|
||||||
|
<p>A Helm chart for deploying the Nextcloud MCP (Model Context Protocol) Server on Kubernetes, enabling AI assistants to interact with your Nextcloud instance.</p>
|
||||||
|
|
||||||
|
<h2>Installation</h2>
|
||||||
|
|
||||||
|
<p>Add the Helm repository:</p>
|
||||||
|
<pre><code>helm repo add nextcloud-mcp https://REPO_OWNER.github.io/REPO_NAME/
|
||||||
|
helm repo update</code></pre>
|
||||||
|
|
||||||
|
<p>Install the chart:</p>
|
||||||
|
<pre><code>helm install nextcloud-mcp nextcloud-mcp/nextcloud-mcp-server \
|
||||||
|
--set nextcloud.host=https://cloud.example.com \
|
||||||
|
--set auth.basic.username=myuser \
|
||||||
|
--set auth.basic.password=mypassword</code></pre>
|
||||||
|
|
||||||
|
<h2>Documentation</h2>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><a href="README.md">Chart README</a> - Full documentation for the Helm chart</li>
|
||||||
|
<li><a href="https://github.com/REPO_OWNER/REPO_NAME">GitHub Repository</a> - Source code and issues</li>
|
||||||
|
<li><a href="index.yaml">Helm Repository Index</a> - Chart metadata</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Quick Start</h2>
|
||||||
|
|
||||||
|
<p>See the <a href="README.md">full documentation</a> for detailed configuration options, examples, and troubleshooting guides.</p>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<p><small>Generated by <a href="https://github.com/helm/chart-releaser">chart-releaser</a></small></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Replace placeholders
|
||||||
|
sed -i "s/REPO_OWNER/$REPO_OWNER/g" index.html
|
||||||
|
sed -i "s/REPO_NAME/$REPO_NAME/g" index.html
|
||||||
|
|
||||||
|
# Commit changes
|
||||||
|
git add README.md index.html
|
||||||
|
git commit -m "Update README and index from chart release" || echo "No changes to commit"
|
||||||
|
git push origin gh-pages
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ jobs:
|
|||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
|
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
|
||||||
- name: Install uv
|
- name: Install uv
|
||||||
uses: astral-sh/setup-uv@2ddd2b9cb38ad8efd50337e8ab201519a34c9f24 # v7
|
uses: astral-sh/setup-uv@85856786d1ce8acfbcc2f13a5f3fbd6b938f9f41 # v7.1.2
|
||||||
- name: Install Python 3.11
|
- name: Install Python 3.11
|
||||||
run: uv python install 3.11
|
run: uv python install 3.11
|
||||||
- name: Build
|
- name: Build
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||||
- name: Install the latest version of uv
|
- name: Install the latest version of uv
|
||||||
uses: astral-sh/setup-uv@2ddd2b9cb38ad8efd50337e8ab201519a34c9f24 # v7.1.1
|
uses: astral-sh/setup-uv@85856786d1ce8acfbcc2f13a5f3fbd6b938f9f41 # v7.1.2
|
||||||
- name: Check format
|
- name: Check format
|
||||||
run: |
|
run: |
|
||||||
uv run --frozen ruff format --diff
|
uv run --frozen ruff format --diff
|
||||||
@@ -52,7 +52,7 @@ jobs:
|
|||||||
up-flags: "--build"
|
up-flags: "--build"
|
||||||
|
|
||||||
- name: Install the latest version of uv
|
- name: Install the latest version of uv
|
||||||
uses: astral-sh/setup-uv@2ddd2b9cb38ad8efd50337e8ab201519a34c9f24 # v7.1.1
|
uses: astral-sh/setup-uv@85856786d1ce8acfbcc2f13a5f3fbd6b938f9f41 # v7.1.2
|
||||||
|
|
||||||
- name: Install Playwright dependencies
|
- name: Install Playwright dependencies
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -1,3 +1,53 @@
|
|||||||
|
## v0.22.7 (2025-10-29)
|
||||||
|
|
||||||
|
### Fix
|
||||||
|
|
||||||
|
- **helm**: Remove image tag overide
|
||||||
|
|
||||||
|
## v0.22.6 (2025-10-29)
|
||||||
|
|
||||||
|
### Fix
|
||||||
|
|
||||||
|
- **helm**: Update helm chart with extraArgs
|
||||||
|
|
||||||
|
## v0.22.5 (2025-10-29)
|
||||||
|
|
||||||
|
### Fix
|
||||||
|
|
||||||
|
- Update helm chart variables
|
||||||
|
|
||||||
|
## v0.22.4 (2025-10-29)
|
||||||
|
|
||||||
|
### Fix
|
||||||
|
|
||||||
|
- **helm**: Update helm version with release
|
||||||
|
- **helm**: Update helm version with release
|
||||||
|
|
||||||
|
## v0.22.3 (2025-10-29)
|
||||||
|
|
||||||
|
### Fix
|
||||||
|
|
||||||
|
- **helm**: Update helm version with release
|
||||||
|
|
||||||
|
## v0.22.2 (2025-10-29)
|
||||||
|
|
||||||
|
### Fix
|
||||||
|
|
||||||
|
- **helm**: Update helm version with release
|
||||||
|
|
||||||
|
## v0.22.1 (2025-10-29)
|
||||||
|
|
||||||
|
### Fix
|
||||||
|
|
||||||
|
- Trigger release
|
||||||
|
|
||||||
|
## v0.22.0 (2025-10-29)
|
||||||
|
|
||||||
|
### Feat
|
||||||
|
|
||||||
|
- **server**: Add /live & /health endpoints
|
||||||
|
- Initialize helm chart
|
||||||
|
|
||||||
## v0.21.0 (2025-10-25)
|
## v0.21.0 (2025-10-25)
|
||||||
|
|
||||||
### Feat
|
### Feat
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ apiVersion: v2
|
|||||||
name: nextcloud-mcp-server
|
name: nextcloud-mcp-server
|
||||||
description: A Helm chart for Nextcloud MCP Server - enables AI assistants to interact with Nextcloud
|
description: A Helm chart for Nextcloud MCP Server - enables AI assistants to interact with Nextcloud
|
||||||
type: application
|
type: application
|
||||||
version: 0.1.0
|
version: 0.22.7
|
||||||
appVersion: "0.21.0"
|
appVersion: "0.22.7"
|
||||||
keywords:
|
keywords:
|
||||||
- nextcloud
|
- nextcloud
|
||||||
- mcp
|
- mcp
|
||||||
|
|||||||
@@ -114,14 +114,35 @@ ingress:
|
|||||||
| `auth.oauth.persistence.enabled` | Enable persistent storage for OAuth | `true` |
|
| `auth.oauth.persistence.enabled` | Enable persistent storage for OAuth | `true` |
|
||||||
| `auth.oauth.persistence.size` | Size of OAuth storage PVC | `100Mi` |
|
| `auth.oauth.persistence.size` | Size of OAuth storage PVC | `100Mi` |
|
||||||
|
|
||||||
|
#### MCP Server Configuration
|
||||||
|
|
||||||
|
| Parameter | Description | Default |
|
||||||
|
|-----------|-------------|---------|
|
||||||
|
| `mcp.transport` | Transport mode | `streamable-http` |
|
||||||
|
| `mcp.port` | Server port (used by both auth modes) | `8000` |
|
||||||
|
| `mcp.extraArgs` | Additional command-line arguments | `[]` |
|
||||||
|
|
||||||
|
The `extraArgs` parameter allows you to pass additional command-line arguments to the MCP server. This is useful for enabling debug logging, enabling specific apps, or other runtime configuration.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```yaml
|
||||||
|
mcp:
|
||||||
|
extraArgs:
|
||||||
|
- "--log-level"
|
||||||
|
- "debug"
|
||||||
|
- "--enable-app"
|
||||||
|
- "notes"
|
||||||
|
```
|
||||||
|
|
||||||
#### Image Configuration
|
#### Image Configuration
|
||||||
|
|
||||||
| Parameter | Description | Default |
|
| Parameter | Description | Default |
|
||||||
|-----------|-------------|---------|
|
|-----------|-------------|---------|
|
||||||
| `image.repository` | Container image repository | `ghcr.io/cbcoutinho/nextcloud-mcp-server` |
|
| `image.repository` | Container image repository | `ghcr.io/cbcoutinho/nextcloud-mcp-server` |
|
||||||
| `image.tag` | Container image tag | `""` (uses chart appVersion) |
|
|
||||||
| `image.pullPolicy` | Image pull policy | `IfNotPresent` |
|
| `image.pullPolicy` | Image pull policy | `IfNotPresent` |
|
||||||
|
|
||||||
|
**Note:** Image tag is automatically set to the chart's `appVersion` and cannot be overridden.
|
||||||
|
|
||||||
#### Resources
|
#### Resources
|
||||||
|
|
||||||
| Parameter | Description | Default |
|
| Parameter | Description | Default |
|
||||||
@@ -137,7 +158,6 @@ ingress:
|
|||||||
|-----------|-------------|---------|
|
|-----------|-------------|---------|
|
||||||
| `service.type` | Service type | `ClusterIP` |
|
| `service.type` | Service type | `ClusterIP` |
|
||||||
| `service.port` | Service port | `8000` |
|
| `service.port` | Service port | `8000` |
|
||||||
| `service.oauthPort` | OAuth service port | `8001` |
|
|
||||||
|
|
||||||
#### Ingress
|
#### Ingress
|
||||||
|
|
||||||
@@ -371,7 +391,6 @@ helm upgrade nextcloud-mcp ./helm/nextcloud-mcp-server -f custom-values.yaml
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
helm upgrade nextcloud-mcp ./helm/nextcloud-mcp-server \
|
helm upgrade nextcloud-mcp ./helm/nextcloud-mcp-server \
|
||||||
--set image.tag=0.21.0 \
|
|
||||||
--set resources.limits.memory=1Gi
|
--set resources.limits.memory=1Gi
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -95,21 +95,17 @@ Create the name of the PVC to use for OAuth storage
|
|||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
{{/*
|
{{/*
|
||||||
Return the appropriate MCP server port based on auth mode
|
Return the MCP server port
|
||||||
*/}}
|
*/}}
|
||||||
{{- define "nextcloud-mcp-server.port" -}}
|
{{- define "nextcloud-mcp-server.port" -}}
|
||||||
{{- if eq .Values.auth.mode "oauth" }}
|
|
||||||
{{- .Values.auth.oauth.port }}
|
|
||||||
{{- else }}
|
|
||||||
{{- .Values.mcp.port }}
|
{{- .Values.mcp.port }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
|
||||||
|
|
||||||
{{/*
|
{{/*
|
||||||
Return the image tag
|
Return the image tag (always uses chart appVersion)
|
||||||
*/}}
|
*/}}
|
||||||
{{- define "nextcloud-mcp-server.imageTag" -}}
|
{{- define "nextcloud-mcp-server.imageTag" -}}
|
||||||
{{- .Values.image.tag | default .Chart.AppVersion }}
|
{{- .Chart.AppVersion }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
{{/*
|
{{/*
|
||||||
|
|||||||
@@ -46,11 +46,12 @@ spec:
|
|||||||
- "{{ .Values.mcp.transport }}"
|
- "{{ .Values.mcp.transport }}"
|
||||||
{{- if eq .Values.auth.mode "oauth" }}
|
{{- if eq .Values.auth.mode "oauth" }}
|
||||||
- "--oauth"
|
- "--oauth"
|
||||||
- "--port"
|
|
||||||
- "{{ .Values.auth.oauth.port }}"
|
|
||||||
- "--oauth-token-type"
|
- "--oauth-token-type"
|
||||||
- "{{ .Values.auth.oauth.tokenType }}"
|
- "{{ .Values.auth.oauth.tokenType }}"
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
{{- with .Values.mcp.extraArgs }}
|
||||||
|
{{- toYaml . | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
ports:
|
ports:
|
||||||
- name: http
|
- name: http
|
||||||
containerPort: {{ include "nextcloud-mcp-server.port" . }}
|
containerPort: {{ include "nextcloud-mcp-server.port" . }}
|
||||||
|
|||||||
@@ -8,8 +8,7 @@ replicaCount: 1
|
|||||||
image:
|
image:
|
||||||
repository: ghcr.io/cbcoutinho/nextcloud-mcp-server
|
repository: ghcr.io/cbcoutinho/nextcloud-mcp-server
|
||||||
pullPolicy: IfNotPresent
|
pullPolicy: IfNotPresent
|
||||||
# Overrides the image tag whose default is the chart appVersion.
|
# Image tag is automatically set to chart appVersion
|
||||||
tag: ""
|
|
||||||
|
|
||||||
imagePullSecrets: []
|
imagePullSecrets: []
|
||||||
nameOverride: ""
|
nameOverride: ""
|
||||||
@@ -61,8 +60,6 @@ auth:
|
|||||||
|
|
||||||
# OAuth2/OIDC settings (experimental)
|
# OAuth2/OIDC settings (experimental)
|
||||||
oauth:
|
oauth:
|
||||||
# Port for OAuth MCP server (default: 8001)
|
|
||||||
port: 8001
|
|
||||||
# OAuth token type: "jwt" or "opaque"
|
# OAuth token type: "jwt" or "opaque"
|
||||||
tokenType: "jwt"
|
tokenType: "jwt"
|
||||||
# Pre-registered OAuth client ID (optional, ignored if existingSecret is set)
|
# Pre-registered OAuth client ID (optional, ignored if existingSecret is set)
|
||||||
@@ -97,8 +94,11 @@ auth:
|
|||||||
mcp:
|
mcp:
|
||||||
# Transport mode (default: streamable-http for SSE)
|
# Transport mode (default: streamable-http for SSE)
|
||||||
transport: "streamable-http"
|
transport: "streamable-http"
|
||||||
# Port for basic auth mode
|
# Port for MCP server (both basic auth and OAuth modes)
|
||||||
port: 8000
|
port: 8000
|
||||||
|
# Additional command-line arguments to pass to nextcloud-mcp-server
|
||||||
|
# Example: ["--log-level", "debug", "--enable-app", "notes"]
|
||||||
|
extraArgs: []
|
||||||
|
|
||||||
# Document processing configuration (optional)
|
# Document processing configuration (optional)
|
||||||
documentProcessing:
|
documentProcessing:
|
||||||
@@ -171,8 +171,6 @@ securityContext:
|
|||||||
service:
|
service:
|
||||||
type: ClusterIP
|
type: ClusterIP
|
||||||
port: 8000
|
port: 8000
|
||||||
# For OAuth mode, you may want to expose both ports
|
|
||||||
oauthPort: 8001
|
|
||||||
annotations: {}
|
annotations: {}
|
||||||
|
|
||||||
ingress:
|
ingress:
|
||||||
|
|||||||
+2
-2
@@ -21,7 +21,7 @@ services:
|
|||||||
restart: always
|
restart: always
|
||||||
|
|
||||||
app:
|
app:
|
||||||
image: docker.io/library/nextcloud:32.0.1@sha256:42a36b4711191273a9cf8cebfd35602909eb1bee461b7076d4d5a57f7ec2b81e
|
image: docker.io/library/nextcloud:32.0.1@sha256:1e4eae55eebe094cae6f9e7b6e0b4bccf4a4fe7b7e6f6f8f57010994b3b2ee42
|
||||||
restart: always
|
restart: always
|
||||||
ports:
|
ports:
|
||||||
- 0.0.0.0:8080:80
|
- 0.0.0.0:8080:80
|
||||||
@@ -45,7 +45,7 @@ services:
|
|||||||
- REDIS_HOST=redis
|
- REDIS_HOST=redis
|
||||||
|
|
||||||
recipes:
|
recipes:
|
||||||
image: docker.io/library/nginx:alpine@sha256:61e01287e546aac28a3f56839c136b31f590273f3b41187a36f46f6a03bbfe22
|
image: docker.io/library/nginx:alpine@sha256:9dacca6749f2215cc3094f641c5b6662f7791e66a57ed034e806a7c48d51c18f
|
||||||
restart: always
|
restart: always
|
||||||
volumes:
|
volumes:
|
||||||
- ./tests/fixtures/test_recipe.html:/usr/share/nginx/html/test_recipe.html:ro
|
- ./tests/fixtures/test_recipe.html:/usr/share/nginx/html/test_recipe.html:ro
|
||||||
|
|||||||
+8
-1
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "nextcloud-mcp-server"
|
name = "nextcloud-mcp-server"
|
||||||
version = "0.21.0"
|
version = "0.22.7"
|
||||||
description = "Model Context Protocol (MCP) server for Nextcloud integration - enables AI assistants to interact with Nextcloud data"
|
description = "Model Context Protocol (MCP) server for Nextcloud integration - enables AI assistants to interact with Nextcloud data"
|
||||||
authors = [
|
authors = [
|
||||||
{name = "Chris Coutinho", email = "chris@coutinho.io"}
|
{name = "Chris Coutinho", email = "chris@coutinho.io"}
|
||||||
@@ -65,6 +65,13 @@ version_scheme = "pep440"
|
|||||||
version_provider = "uv"
|
version_provider = "uv"
|
||||||
update_changelog_on_bump = true
|
update_changelog_on_bump = true
|
||||||
major_version_zero = true
|
major_version_zero = true
|
||||||
|
version_files = [
|
||||||
|
"charts/nextcloud-mcp-server/Chart.yaml:appVersion",
|
||||||
|
"charts/nextcloud-mcp-server/Chart.yaml:version"
|
||||||
|
]
|
||||||
|
ignored_tag_formats = [
|
||||||
|
"nextcloud-mcp-server-*"
|
||||||
|
]
|
||||||
|
|
||||||
[tool.ruff.lint]
|
[tool.ruff.lint]
|
||||||
extend-select = ["I"]
|
extend-select = ["I"]
|
||||||
|
|||||||
@@ -941,7 +941,7 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nextcloud-mcp-server"
|
name = "nextcloud-mcp-server"
|
||||||
version = "0.21.0"
|
version = "0.22.7"
|
||||||
source = { editable = "." }
|
source = { editable = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "caldav" },
|
{ name = "caldav" },
|
||||||
|
|||||||
Reference in New Issue
Block a user