refactor: remove Smithery deployment mode

Smithery is no longer a supported deployment mode. Remove all Smithery-specific
code paths, middleware, configuration, and tests. This simplifies the codebase
by eliminating DeploymentMode enum, SmitheryConfigMiddleware, session config
context variables, and the smithery_main entrypoint.

Files deleted: Dockerfile.smithery, smithery.yaml, smithery_main.py
ADR-016 retained with deprecated status for historical reference.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Chris Coutinho
2026-03-22 20:15:47 +01:00
co-authored by Claude Opus 4.6
parent 5e9bd5dd74
commit 7956c3c061
19 changed files with 92 additions and 775 deletions
-97
View File
@@ -22,14 +22,6 @@ from nextcloud_mcp_server.config_validators import (
class TestModeDetection:
"""Test auth mode detection from configuration."""
def test_smithery_mode_detection(self):
"""Test Smithery mode is detected from environment variable."""
settings = Settings()
with patch.dict(os.environ, {"SMITHERY_DEPLOYMENT": "true"}):
mode = detect_auth_mode(settings)
assert mode == AuthMode.SMITHERY_STATELESS
def test_token_exchange_mode_detection(self):
"""Test token exchange mode is detected."""
settings = Settings(
@@ -70,20 +62,6 @@ class TestModeDetection:
mode = detect_auth_mode(settings)
assert mode == AuthMode.OAUTH_SINGLE_AUDIENCE
def test_mode_priority_smithery_over_all(self):
"""Test Smithery mode has highest priority."""
settings = Settings(
nextcloud_host="http://localhost",
nextcloud_username="admin",
nextcloud_password="password",
enable_token_exchange=True,
enable_multi_user_basic_auth=True,
)
with patch.dict(os.environ, {"SMITHERY_DEPLOYMENT": "true"}):
mode = detect_auth_mode(settings)
assert mode == AuthMode.SMITHERY_STATELESS
def test_mode_priority_token_exchange_over_basic(self):
"""Test token exchange has priority over BasicAuth."""
settings = Settings(
@@ -486,57 +464,6 @@ class TestOAuthTokenExchangeValidation:
assert any("nextcloud_password" in err.lower() for err in errors)
class TestSmitheryValidation:
"""Test validation for Smithery stateless mode."""
def test_valid_empty_config(self):
"""Test valid empty config for Smithery mode."""
settings = Settings()
with patch.dict(os.environ, {"SMITHERY_DEPLOYMENT": "true"}):
mode, errors = validate_configuration(settings)
assert mode == AuthMode.SMITHERY_STATELESS
assert len(errors) == 0
def test_forbidden_nextcloud_host(self):
"""Test error when NEXTCLOUD_HOST is set."""
settings = Settings(
nextcloud_host="http://localhost",
)
with patch.dict(os.environ, {"SMITHERY_DEPLOYMENT": "true"}):
mode, errors = validate_configuration(settings)
assert mode == AuthMode.SMITHERY_STATELESS
assert any("nextcloud_host" in err.lower() for err in errors)
def test_forbidden_credentials(self):
"""Test error when credentials are set."""
settings = Settings(
nextcloud_username="admin",
nextcloud_password="password",
)
with patch.dict(os.environ, {"SMITHERY_DEPLOYMENT": "true"}):
mode, errors = validate_configuration(settings)
assert mode == AuthMode.SMITHERY_STATELESS
assert any("nextcloud_username" in err.lower() for err in errors)
def test_forbidden_vector_sync(self):
"""Test error when vector sync is enabled."""
settings = Settings(
vector_sync_enabled=True,
)
with patch.dict(os.environ, {"SMITHERY_DEPLOYMENT": "true"}):
mode, errors = validate_configuration(settings)
assert mode == AuthMode.SMITHERY_STATELESS
assert any("vector_sync_enabled" in err.lower() for err in errors)
class TestModeSummary:
"""Test mode summary generation."""
@@ -550,14 +477,6 @@ class TestModeSummary:
assert "NEXTCLOUD_PASSWORD" in summary
assert "VECTOR_SYNC_ENABLED" in summary
def test_smithery_summary(self):
"""Test summary for Smithery mode."""
summary = get_mode_summary(AuthMode.SMITHERY_STATELESS)
assert "smithery" in summary
assert "session" in summary.lower()
assert "(none" in summary # No required config
def test_oauth_token_exchange_summary(self):
"""Test summary for OAuth token exchange mode."""
summary = get_mode_summary(AuthMode.OAUTH_TOKEN_EXCHANGE)
@@ -898,22 +817,6 @@ class TestExplicitModeSelection:
assert mode == AuthMode.OAUTH_TOKEN_EXCHANGE
def test_explicit_smithery_mode(self):
"""Test explicit smithery mode selection."""
with patch.dict(
os.environ,
{
"MCP_DEPLOYMENT_MODE": "smithery",
},
clear=True,
):
from nextcloud_mcp_server.config import get_settings
settings = get_settings()
mode = detect_auth_mode(settings)
assert mode == AuthMode.SMITHERY_STATELESS
def test_invalid_deployment_mode_raises_error(self):
"""Test invalid MCP_DEPLOYMENT_MODE raises ValueError."""
with patch.dict(