feat: add Docker Compose profiles and Login Flow v2 service
Add selective service startup via Docker Compose profiles so each MCP deployment mode runs independently. Also add the new mcp-login-flow service (port 8004) for Login Flow v2 authentication (ADR-022). Profile assignments: - single-user: mcp (port 8000) - multi-user-basic: mcp-multi-user-basic (port 8003) - oauth: mcp-oauth (port 8001) - keycloak: keycloak + mcp-keycloak (port 8002) - login-flow: mcp-login-flow (port 8004) Infrastructure services (db, redis, app, recipes) always start. Integration tests cover the full Login Flow v2 provisioning flow: OAuth → browser login → app password → Nextcloud API access for notes, calendar, contacts, files, deck, and cookbook operations. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
5796e2ba54
commit
8b5c2395b5
@@ -0,0 +1,74 @@
|
||||
"""Pydantic response models for Login Flow v2 auth tools."""
|
||||
|
||||
from pydantic import Field
|
||||
|
||||
from nextcloud_mcp_server.models.base import BaseResponse
|
||||
|
||||
|
||||
class ProvisionAccessResponse(BaseResponse):
|
||||
"""Response from nc_auth_provision_access tool."""
|
||||
|
||||
status: str = Field(
|
||||
description="Provisioning status: 'login_required', 'already_provisioned', 'error'"
|
||||
)
|
||||
login_url: str | None = Field(
|
||||
None, description="URL to open in browser for Nextcloud login"
|
||||
)
|
||||
message: str = Field(description="Human-readable status message")
|
||||
user_id: str | None = Field(None, description="MCP user ID")
|
||||
requested_scopes: list[str] | None = Field(
|
||||
None, description="Scopes requested in this provisioning flow"
|
||||
)
|
||||
|
||||
|
||||
class ProvisionStatusResponse(BaseResponse):
|
||||
"""Response from nc_auth_check_status tool."""
|
||||
|
||||
status: str = Field(
|
||||
description="Status: 'provisioned', 'pending', 'not_initiated', 'error'"
|
||||
)
|
||||
message: str = Field(description="Human-readable status message")
|
||||
user_id: str | None = Field(None, description="MCP user ID")
|
||||
scopes: list[str] | None = Field(
|
||||
None, description="Granted scopes (None = all scopes)"
|
||||
)
|
||||
username: str | None = Field(None, description="Nextcloud username (loginName)")
|
||||
|
||||
|
||||
class UpdateScopesResponse(BaseResponse):
|
||||
"""Response from nc_auth_update_scopes tool."""
|
||||
|
||||
status: str = Field(description="Status: 'login_required', 'updated', 'error'")
|
||||
login_url: str | None = Field(
|
||||
None, description="URL for re-provisioning with new scopes"
|
||||
)
|
||||
message: str = Field(description="Human-readable status message")
|
||||
previous_scopes: list[str] | None = Field(
|
||||
None, description="Previously granted scopes"
|
||||
)
|
||||
new_scopes: list[str] | None = Field(None, description="Updated scope set")
|
||||
|
||||
|
||||
# All supported application-level scopes
|
||||
ALL_SUPPORTED_SCOPES = [
|
||||
"notes:read",
|
||||
"notes:write",
|
||||
"calendar:read",
|
||||
"calendar:write",
|
||||
"todo:read",
|
||||
"todo:write",
|
||||
"contacts:read",
|
||||
"contacts:write",
|
||||
"files:read",
|
||||
"files:write",
|
||||
"tables:read",
|
||||
"tables:write",
|
||||
"deck:read",
|
||||
"deck:write",
|
||||
"cookbook:read",
|
||||
"cookbook:write",
|
||||
"sharing:read",
|
||||
"sharing:write",
|
||||
"news:read",
|
||||
"news:write",
|
||||
]
|
||||
Reference in New Issue
Block a user