|
| 1 | +from dataclasses import dataclass |
| 2 | + |
| 3 | +from mcp.server.fastmcp import FastMCP |
| 4 | + |
| 5 | +from dbt_mcp.config.config_providers import AdminApiConfig, ConfigProvider |
| 6 | +from dbt_mcp.dbt_admin.onboarding.client import OnboardingClient |
| 7 | +from dbt_mcp.dbt_admin.onboarding.decision_points import get_decision_points |
| 8 | +from dbt_mcp.dbt_admin.onboarding.models import ( |
| 9 | + OnboardingInitResult, |
| 10 | + OnboardingStateResult, |
| 11 | + ServerOnboardingState, |
| 12 | + decision_points_to_dicts, |
| 13 | +) |
| 14 | +from dbt_mcp.dbt_admin.onboarding.session import InMemorySessionStore |
| 15 | +from dbt_mcp.prompts.prompts import get_prompt |
| 16 | +from dbt_mcp.tools.definitions import dbt_mcp_tool |
| 17 | +from dbt_mcp.tools.register import register_tools |
| 18 | +from dbt_mcp.tools.tool_names import ToolName |
| 19 | +from dbt_mcp.tools.toolsets import Toolset |
| 20 | + |
| 21 | + |
| 22 | +@dataclass |
| 23 | +class OnboardingToolContext: |
| 24 | + admin_api_config_provider: ConfigProvider[AdminApiConfig] |
| 25 | + session_store: InMemorySessionStore |
| 26 | + onboarding_client: OnboardingClient |
| 27 | + |
| 28 | + |
| 29 | +@dbt_mcp_tool( |
| 30 | + description=get_prompt("admin_api/onboarding_init"), |
| 31 | + title="Start or Resume Onboarding", |
| 32 | + read_only_hint=False, |
| 33 | + destructive_hint=False, |
| 34 | + idempotent_hint=True, |
| 35 | +) |
| 36 | +async def dbt_admin_onboarding_init( |
| 37 | + context: OnboardingToolContext, |
| 38 | +) -> OnboardingInitResult: |
| 39 | + """Start or resume an onboarding session for the account.""" |
| 40 | + config = await context.admin_api_config_provider.get_config() |
| 41 | + account_id = config.account_id |
| 42 | + |
| 43 | + session = context.session_store.get_or_create(account_id) |
| 44 | + |
| 45 | + return OnboardingInitResult( |
| 46 | + session_id=session.session_id, |
| 47 | + phase=session.phase.value, |
| 48 | + account_id=account_id, |
| 49 | + decision_points=decision_points_to_dicts(get_decision_points()), |
| 50 | + ) |
| 51 | + |
| 52 | + |
| 53 | +@dbt_mcp_tool( |
| 54 | + description=get_prompt("admin_api/onboarding_state"), |
| 55 | + title="Get Onboarding State", |
| 56 | + read_only_hint=True, |
| 57 | + destructive_hint=False, |
| 58 | + idempotent_hint=True, |
| 59 | +) |
| 60 | +async def dbt_admin_onboarding_state( |
| 61 | + context: OnboardingToolContext, |
| 62 | +) -> OnboardingStateResult: |
| 63 | + """Return the current onboarding session state for the account.""" |
| 64 | + config = await context.admin_api_config_provider.get_config() |
| 65 | + account_id = config.account_id |
| 66 | + |
| 67 | + session = context.session_store.get(account_id) |
| 68 | + |
| 69 | + if session is None: |
| 70 | + return OnboardingStateResult( |
| 71 | + phase=None, |
| 72 | + session_id=None, |
| 73 | + server_state=None, |
| 74 | + ) |
| 75 | + |
| 76 | + server_state: ServerOnboardingState | None = None |
| 77 | + if session.has_server_state(): |
| 78 | + raw = await context.onboarding_client.get_state(account_id) |
| 79 | + server_state = ServerOnboardingState( |
| 80 | + status=raw.get("data", {}).get("status", raw.get("status", "unknown")), |
| 81 | + data=raw.get("data", raw), |
| 82 | + ) |
| 83 | + |
| 84 | + return OnboardingStateResult( |
| 85 | + phase=session.phase.value, |
| 86 | + session_id=session.session_id, |
| 87 | + server_state=server_state, |
| 88 | + ) |
| 89 | + |
| 90 | + |
| 91 | +ONBOARDING_TOOLS = [ |
| 92 | + dbt_admin_onboarding_init, |
| 93 | + dbt_admin_onboarding_state, |
| 94 | +] |
| 95 | + |
| 96 | + |
| 97 | +def register_onboarding_tools( |
| 98 | + dbt_mcp: FastMCP, |
| 99 | + admin_api_config_provider: ConfigProvider[AdminApiConfig], |
| 100 | + *, |
| 101 | + disabled_tools: set[ToolName], |
| 102 | + enabled_tools: set[ToolName] | None, |
| 103 | + enabled_toolsets: set[Toolset], |
| 104 | + disabled_toolsets: set[Toolset], |
| 105 | +) -> None: |
| 106 | + """Register dbt onboarding tools.""" |
| 107 | + session_store = InMemorySessionStore() |
| 108 | + onboarding_client = OnboardingClient(admin_api_config_provider) |
| 109 | + |
| 110 | + def bind_context() -> OnboardingToolContext: |
| 111 | + return OnboardingToolContext( |
| 112 | + admin_api_config_provider=admin_api_config_provider, |
| 113 | + session_store=session_store, |
| 114 | + onboarding_client=onboarding_client, |
| 115 | + ) |
| 116 | + |
| 117 | + register_tools( |
| 118 | + dbt_mcp, |
| 119 | + tool_definitions=[tool.adapt_context(bind_context) for tool in ONBOARDING_TOOLS], |
| 120 | + disabled_tools=disabled_tools, |
| 121 | + enabled_tools=enabled_tools, |
| 122 | + enabled_toolsets=enabled_toolsets, |
| 123 | + disabled_toolsets=disabled_toolsets, |
| 124 | + ) |
0 commit comments