Same pattern as the ENABLE_LOGIN_FLOW removal in the previous commit:
the deployment mode (MCP_DEPLOYMENT_MODE) is the single source of truth
for selecting an auth flow. The ENABLE_MULTI_USER_BASIC_AUTH env-var
alias is redundant with `MCP_DEPLOYMENT_MODE=multi_user_basic`.
Unlike the ENABLE_LOGIN_FLOW removal — where silent removal was safe
because Login Flow v2 is the auto-detection default — silent removal
here would be a surprise: a user with only ENABLE_MULTI_USER_BASIC_AUTH=true
in their .env would auto-detect into LOGIN_FLOW after upgrade (wrong
runtime mode). Mitigation: detect_auth_mode now reads os.environ
directly for both legacy aliases and raises ValueError with a one-line
migration message if either is set. Applied retroactively to
ENABLE_LOGIN_FLOW as well — loud is better than silent.
- nextcloud_mcp_server/config.py:
- Drop the dynaconf env-var alias entry for ENABLE_MULTI_USER_BASIC_AUTH.
- Update the `enable_multi_user_basic_auth` field docstring to mark it
as derived / not user-settable.
- `_is_multi_user_mode()` (early-config helper, runs before Settings
is built) switched to checking MCP_DEPLOYMENT_MODE directly. Now
consistent with the canonical detection in detect_auth_mode.
- nextcloud_mcp_server/config_validators.py:
- Drop the auto-detection branch (`if settings.enable_multi_user_basic_auth`).
Selection of MULTI_USER_BASIC is now exclusively via the explicit
MCP_DEPLOYMENT_MODE branch.
- Add `enable_multi_user_basic_auth` to `_sync_derived_flags` alongside
`enable_login_flow` — both flags are now derived from the resolved mode.
- Drop `enable_multi_user_basic_auth` from
`MODE_REQUIREMENTS[MULTI_USER_BASIC].required` and from the
`forbidden` lists of SINGLE_USER_BASIC and LOGIN_FLOW (no longer
user input → no meaningful forbidden check).
- Add loud-deprecation `ValueError` block at the top of detect_auth_mode
that errors with a clear migration message when ENABLE_MULTI_USER_BASIC_AUTH
or ENABLE_LOGIN_FLOW is found in os.environ.
- tests/unit/test_config_validators.py:
- Switch ~10 fixtures from `enable_multi_user_basic_auth=True` to
`deployment_mode="multi_user_basic"` (mirrors `enable_login_flow`
treatment from the previous commit).
- Switch two `patch.dict(os.environ, {"ENABLE_MULTI_USER_BASIC_AUTH": "true"})`
blocks to use MCP_DEPLOYMENT_MODE.
- Rename `test_forbidden_multi_user_basic_auth` to
`test_forbidden_multi_user_basic_when_credentials_present` — the
scenario is now an explicit-mode + credentials conflict, not an
env-var-flag conflict.
- Add `test_legacy_enable_multi_user_basic_auth_env_var_errors` and
`test_legacy_enable_login_flow_env_var_errors` to exercise the new
loud-deprecation ValueError path.
- docker-compose.yml: mcp-multi-user-basic profile switched to
`MCP_DEPLOYMENT_MODE=multi_user_basic`.
- env.sample: replaced `#ENABLE_MULTI_USER_BASIC_AUTH=true` example with
`#MCP_DEPLOYMENT_MODE=multi_user_basic`.
- docs/authentication.md, configuration.md, troubleshooting.md,
auth-flows.md, webhook-management-guide.md,
configuration-migration-v2.md, ADR-025: replaced env-var examples
with the canonical MCP_DEPLOYMENT_MODE form.
- docs/ADR-020: marked partly superseded by ADR-022.
- CLAUDE.md: Multi-User BasicAuth section updated to set
MCP_DEPLOYMENT_MODE.
- nextcloud_mcp_server/vector/oauth_sync.py: module docstring updated.
BREAKING CHANGE: ENABLE_MULTI_USER_BASIC_AUTH is no longer read from
the environment, and setting it now raises a startup ValueError with
a migration message. Replace `ENABLE_MULTI_USER_BASIC_AUTH=true` with
`MCP_DEPLOYMENT_MODE=multi_user_basic`. The same loud-deprecation
check is also applied to the recently-removed ENABLE_LOGIN_FLOW —
replace with `MCP_DEPLOYMENT_MODE=login_flow` (or drop both;
`login_flow` is the auto-detect default when no other auth env vars
are set).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
457 lines
11 KiB
Markdown
457 lines
11 KiB
Markdown
# Troubleshooting
|
|
|
|
This guide covers common issues and solutions for the Nextcloud MCP server.
|
|
|
|
> **Multi-user / Login Flow v2 issues?** See the [Login Flow v2 troubleshooting section](login-flow-v2.md#troubleshooting) for app-password storage, provisioning loops, and OAuth issuer problems.
|
|
|
|
> **Upgrading from v0.57.x?** See the [Configuration Migration Guide](configuration-migration-v2.md) for help with new variable names.
|
|
|
|
## Configuration Issues (v0.58.0+)
|
|
|
|
### Issue: Deprecation warning for VECTOR_SYNC_ENABLED
|
|
|
|
**Symptom:**
|
|
```
|
|
WARNING: VECTOR_SYNC_ENABLED is deprecated. Please use ENABLE_SEMANTIC_SEARCH instead.
|
|
```
|
|
|
|
**Cause:** You're using the old variable name from v0.57.x.
|
|
|
|
**Solution:**
|
|
```bash
|
|
# In your .env file, replace:
|
|
VECTOR_SYNC_ENABLED=true
|
|
|
|
# With:
|
|
ENABLE_SEMANTIC_SEARCH=true
|
|
```
|
|
|
|
See [Configuration Migration Guide](configuration-migration-v2.md) for complete migration instructions.
|
|
|
|
---
|
|
|
|
### Issue: Deprecation warning for ENABLE_OFFLINE_ACCESS
|
|
|
|
**Symptom:**
|
|
```
|
|
WARNING: ENABLE_OFFLINE_ACCESS is deprecated. Please use ENABLE_BACKGROUND_OPERATIONS instead.
|
|
```
|
|
|
|
**Cause:** You're using the old variable name from v0.57.x.
|
|
|
|
**Solution:**
|
|
|
|
**If you have semantic search enabled:**
|
|
```bash
|
|
# In multi-user modes, you can remove ENABLE_OFFLINE_ACCESS entirely!
|
|
# ENABLE_SEMANTIC_SEARCH automatically enables background operations
|
|
|
|
# Before (v0.57.x):
|
|
ENABLE_OFFLINE_ACCESS=true
|
|
VECTOR_SYNC_ENABLED=true
|
|
|
|
# After (v0.58.0+):
|
|
ENABLE_SEMANTIC_SEARCH=true # This is all you need!
|
|
```
|
|
|
|
**If you only want background operations (no semantic search):**
|
|
```bash
|
|
# Replace:
|
|
ENABLE_OFFLINE_ACCESS=true
|
|
|
|
# With:
|
|
ENABLE_BACKGROUND_OPERATIONS=true
|
|
```
|
|
|
|
---
|
|
|
|
### Issue: "Invalid MCP_DEPLOYMENT_MODE"
|
|
|
|
**Symptom:**
|
|
```
|
|
ValueError: Invalid MCP_DEPLOYMENT_MODE: 'oauth'. Valid values: single_user_basic, multi_user_basic, login_flow_v2
|
|
```
|
|
|
|
**Cause:** Invalid value for `MCP_DEPLOYMENT_MODE`.
|
|
|
|
**Solution:**
|
|
Use one of the valid mode values:
|
|
```bash
|
|
MCP_DEPLOYMENT_MODE=single_user_basic # Single-user with username/app password
|
|
MCP_DEPLOYMENT_MODE=multi_user_basic # Multi-user BasicAuth pass-through
|
|
MCP_DEPLOYMENT_MODE=login_flow_v2 # Multi-user via Login Flow v2 (recommended)
|
|
```
|
|
|
|
Or remove `MCP_DEPLOYMENT_MODE` to use automatic detection.
|
|
|
|
---
|
|
|
|
### Issue: Missing TOKEN_ENCRYPTION_KEY when semantic search enabled
|
|
|
|
**Symptom:**
|
|
```
|
|
Error: [login_flow_v2] TOKEN_ENCRYPTION_KEY is required when ENABLE_SEMANTIC_SEARCH is enabled
|
|
```
|
|
|
|
**Cause:** In multi-user modes, semantic search automatically enables background operations, which require encrypted token storage.
|
|
|
|
**Solution:**
|
|
Generate an encryption key and add required token storage configuration:
|
|
|
|
```bash
|
|
# Generate encryption key
|
|
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
|
|
|
|
# Add to .env:
|
|
TOKEN_ENCRYPTION_KEY=<generated-key>
|
|
TOKEN_STORAGE_DB=/app/data/tokens.db
|
|
```
|
|
|
|
**Why this happens:**
|
|
- v0.58.0+ automatically enables background operations when `ENABLE_SEMANTIC_SEARCH=true` in multi-user modes
|
|
- Background operations need encrypted refresh token storage
|
|
- This simplifies configuration but requires the encryption infrastructure
|
|
|
|
See [Configuration Guide - Semantic Search](configuration.md#semantic-search-configuration-optional) for details.
|
|
|
|
---
|
|
|
|
### Issue: Both old and new variable names set
|
|
|
|
**Symptom:**
|
|
```
|
|
WARNING: Both ENABLE_SEMANTIC_SEARCH and VECTOR_SYNC_ENABLED are set. Using ENABLE_SEMANTIC_SEARCH.
|
|
```
|
|
|
|
**Cause:** You have both the old and new variable names in your configuration.
|
|
|
|
**Solution:**
|
|
Remove the old variable name:
|
|
```bash
|
|
# Remove this line:
|
|
VECTOR_SYNC_ENABLED=true
|
|
|
|
# Keep this line:
|
|
ENABLE_SEMANTIC_SEARCH=true
|
|
```
|
|
|
|
The server will use the new name and ignore the old one, but it's cleaner to remove the old variable entirely.
|
|
|
|
---
|
|
|
|
## Multi-User / Login Flow v2 Issues
|
|
|
|
For multi-user deployment issues — provisioning loops, app-password storage, OAuth issuer endpoints, scope enforcement — see the [Login Flow v2 troubleshooting section](login-flow-v2.md#troubleshooting).
|
|
|
|
### Switching deployment modes
|
|
|
|
```bash
|
|
# To Single-User BasicAuth: set NEXTCLOUD_USERNAME and NEXTCLOUD_PASSWORD
|
|
# To Multi-User BasicAuth pass-through: MCP_DEPLOYMENT_MODE=multi_user_basic (no creds)
|
|
# To Login Flow v2: MCP_DEPLOYMENT_MODE=login_flow (no creds; also the default fallback)
|
|
```
|
|
|
|
Restart the server after changing modes. The active mode is logged at startup; you can also set `MCP_DEPLOYMENT_MODE` explicitly to fail fast if the env vars don't match.
|
|
|
|
---
|
|
|
|
## Configuration Issues
|
|
|
|
### Issue: Environment variables not loaded
|
|
|
|
**Cause:** Environment variables from `.env` file are not loaded into the shell.
|
|
|
|
**Solution:**
|
|
|
|
**On Linux/macOS:**
|
|
```bash
|
|
# Load all variables from .env
|
|
export $(grep -v '^#' .env | xargs)
|
|
|
|
# Verify variables are set
|
|
env | grep NEXTCLOUD
|
|
```
|
|
|
|
**On Windows (PowerShell):**
|
|
```powershell
|
|
# Load variables from .env
|
|
Get-Content .env | ForEach-Object {
|
|
if ($_ -match '^\s*([^#][^=]*)\s*=\s*(.*)$') {
|
|
[Environment]::SetEnvironmentVariable($matches[1].Trim(), $matches[2].Trim(), "Process")
|
|
}
|
|
}
|
|
|
|
# Verify variables are set
|
|
Get-ChildItem Env:NEXTCLOUD*
|
|
```
|
|
|
|
**With Docker:**
|
|
```bash
|
|
# Docker automatically loads .env when using --env-file
|
|
docker run -p 127.0.0.1:8000:8000 --env-file .env --rm \
|
|
ghcr.io/cbcoutinho/nextcloud-mcp-server:latest
|
|
```
|
|
|
|
---
|
|
|
|
### Issue: ".env file not found"
|
|
|
|
**Cause:** The `.env` file doesn't exist or is in the wrong location.
|
|
|
|
**Solution:**
|
|
|
|
```bash
|
|
# Create .env from sample
|
|
cp env.sample .env
|
|
|
|
# Edit with your Nextcloud details
|
|
nano .env # or vim, code, etc.
|
|
|
|
# Ensure you're in the correct directory when running commands
|
|
pwd # Should be in the project directory containing .env
|
|
```
|
|
|
|
---
|
|
|
|
### Issue: "Invalid Nextcloud credentials"
|
|
|
|
**Cause:** BasicAuth credentials are incorrect or the app password has been revoked.
|
|
|
|
**Solution:**
|
|
|
|
1. **Verify username:**
|
|
```bash
|
|
# Username should match your Nextcloud login
|
|
echo $NEXTCLOUD_USERNAME
|
|
```
|
|
|
|
2. **Generate a new app password:**
|
|
- Log in to Nextcloud
|
|
- Go to **Settings** → **Security**
|
|
- Under "Devices & sessions", create a new app password
|
|
- Update `.env` with the new password
|
|
|
|
3. **Test credentials manually:**
|
|
```bash
|
|
curl -u "$NEXTCLOUD_USERNAME:$NEXTCLOUD_PASSWORD" \
|
|
"$NEXTCLOUD_HOST/ocs/v2.php/cloud/capabilities" \
|
|
-H "OCS-APIRequest: true"
|
|
# Should return XML with capabilities
|
|
```
|
|
|
|
---
|
|
|
|
## Server Issues
|
|
|
|
### Issue: "Address already in use" / Port conflict
|
|
|
|
**Cause:** Another process is using port 8000.
|
|
|
|
**Solution:**
|
|
|
|
**Option 1: Use a different port**
|
|
```bash
|
|
uv run nextcloud-mcp-server --port 8080
|
|
```
|
|
|
|
**Option 2: Find and kill the process using the port**
|
|
```bash
|
|
# On Linux/macOS
|
|
lsof -ti:8000 | xargs kill -9
|
|
|
|
# On Windows
|
|
netstat -ano | findstr :8000
|
|
taskkill /PID <pid> /F
|
|
```
|
|
|
|
**Option 3: Stop other MCP server instances**
|
|
```bash
|
|
# Check for running instances
|
|
ps aux | grep nextcloud-mcp-server
|
|
|
|
# Kill specific process
|
|
kill <pid>
|
|
```
|
|
|
|
---
|
|
|
|
### Issue: Server starts but can't connect
|
|
|
|
**Cause:** Server is bound to localhost only, or firewall is blocking connections.
|
|
|
|
**Solution:**
|
|
|
|
1. **Check server binding:**
|
|
```bash
|
|
# Bind to all interfaces to allow network access
|
|
uv run nextcloud-mcp-server --host 0.0.0.0 --port 8000
|
|
```
|
|
|
|
2. **Test connectivity:**
|
|
```bash
|
|
# Test from same machine
|
|
curl http://localhost:8000/health/live
|
|
|
|
# Test from network (if using --host 0.0.0.0)
|
|
curl http://<server-ip>:8000/health/live
|
|
```
|
|
|
|
3. **Check firewall:**
|
|
```bash
|
|
# Linux (ufw)
|
|
sudo ufw allow 8000/tcp
|
|
|
|
# Linux (firewalld)
|
|
sudo firewall-cmd --add-port=8000/tcp --permanent
|
|
sudo firewall-cmd --reload
|
|
```
|
|
|
|
---
|
|
|
|
### Issue: Server crashes or restarts frequently
|
|
|
|
**Cause:** Various issues including memory limits or uncaught exceptions.
|
|
|
|
**Solution:**
|
|
|
|
1. **Check logs with debug level:**
|
|
```bash
|
|
uv run nextcloud-mcp-server --log-level debug
|
|
```
|
|
|
|
2. **Monitor resource usage:**
|
|
```bash
|
|
# Check memory and CPU
|
|
top -p $(pgrep -f nextcloud-mcp-server)
|
|
```
|
|
|
|
3. **Use process manager for automatic restart:**
|
|
```bash
|
|
# With systemd (see Running guide for full config)
|
|
sudo systemctl restart nextcloud-mcp
|
|
|
|
# With Docker Compose (includes restart: unless-stopped)
|
|
docker-compose up -d
|
|
```
|
|
|
|
---
|
|
|
|
## Connection Issues
|
|
|
|
### Issue: MCP client can't authenticate
|
|
|
|
**Cause:** Auth flow failing or credentials invalid.
|
|
|
|
**Solution:**
|
|
|
|
**For BasicAuth modes:**
|
|
1. Verify credentials work:
|
|
```bash
|
|
curl -u "$NEXTCLOUD_USERNAME:$NEXTCLOUD_PASSWORD" \
|
|
"$NEXTCLOUD_HOST/ocs/v2.php/cloud/capabilities" \
|
|
-H "OCS-APIRequest: true"
|
|
```
|
|
|
|
**For Login Flow v2 mode:**
|
|
1. Verify the server starts the OAuth issuer:
|
|
```bash
|
|
uv run nextcloud-mcp-server --oauth --log-level debug
|
|
# Look for "OAuth initialization complete"
|
|
```
|
|
|
|
2. Verify `NEXTCLOUD_MCP_SERVER_URL` matches the URL clients use to connect:
|
|
```bash
|
|
echo $NEXTCLOUD_MCP_SERVER_URL
|
|
```
|
|
|
|
3. See [Login Flow v2 troubleshooting](login-flow-v2.md#troubleshooting) for app-password and provisioning issues.
|
|
|
|
---
|
|
|
|
### Issue: Tools return errors or don't work
|
|
|
|
**Cause:** Missing Nextcloud apps, incorrect permissions, or API issues.
|
|
|
|
**Solution:**
|
|
|
|
1. **Verify required Nextcloud apps are installed:**
|
|
- Notes: Install "Notes" app
|
|
- Calendar: Ensure CalDAV is enabled
|
|
- Contacts: Ensure CardDAV is enabled
|
|
- Deck: Install "Deck" app
|
|
|
|
2. **Check user permissions:**
|
|
- Ensure the authenticated user has access to the resources
|
|
- Check sharing permissions for shared resources
|
|
|
|
3. **Test API directly with Basic Auth:**
|
|
```bash
|
|
curl -u "$NEXTCLOUD_USERNAME:$NEXTCLOUD_PASSWORD" \
|
|
"$NEXTCLOUD_HOST/apps/notes/api/v1/notes"
|
|
```
|
|
|
|
4. **Check server logs for specific errors:**
|
|
```bash
|
|
uv run nextcloud-mcp-server --log-level debug
|
|
```
|
|
|
|
---
|
|
|
|
## Getting Help
|
|
|
|
If you continue to experience issues:
|
|
|
|
### 1. Enable Debug Logging
|
|
|
|
```bash
|
|
uv run nextcloud-mcp-server --log-level debug
|
|
```
|
|
|
|
Review the logs for specific error messages.
|
|
|
|
### 2. Test Nextcloud Connectivity
|
|
|
|
```bash
|
|
# Verify Nextcloud is reachable from the MCP server
|
|
curl -I "$NEXTCLOUD_HOST/status.php"
|
|
|
|
# With Basic Auth (Single-User or Multi-User BasicAuth modes)
|
|
curl -u "$NEXTCLOUD_USERNAME:$NEXTCLOUD_PASSWORD" \
|
|
"$NEXTCLOUD_HOST/ocs/v2.php/cloud/capabilities?format=json" \
|
|
-H "OCS-APIRequest: true"
|
|
```
|
|
|
|
For Login Flow v2 mode, see [Login Flow v2 troubleshooting](login-flow-v2.md#troubleshooting).
|
|
|
|
### 3. Check Versions
|
|
|
|
```bash
|
|
# MCP Server version
|
|
uv run nextcloud-mcp-server --version
|
|
|
|
# Python version
|
|
python3 --version
|
|
|
|
# Nextcloud version (check in admin panel)
|
|
```
|
|
|
|
### 4. Open an Issue
|
|
|
|
If problems persist, open an issue on the [GitHub repository](https://github.com/cbcoutinho/nextcloud-mcp-server/issues) with:
|
|
|
|
- **Server logs** (with `--log-level debug`)
|
|
- **Nextcloud version**
|
|
- **Deployment mode** (single_user_basic / multi_user_basic / login_flow_v2)
|
|
- **Error messages**
|
|
- **Steps to reproduce**
|
|
- **Environment details** (OS, Python version, Docker vs local)
|
|
|
|
---
|
|
|
|
## See Also
|
|
|
|
- [Authentication](authentication.md) - Authentication modes
|
|
- [Login Flow v2](login-flow-v2.md) - Multi-user setup, scope reference, troubleshooting FAQ
|
|
- [Configuration](configuration.md) - Environment variables
|
|
- [Running the Server](running.md) - Server options
|