11from dataclasses import dataclass
2+ from typing import Any
23
34from mcp .server .fastmcp import FastMCP
45
56from dbt_mcp .config .config_providers import AdminApiConfig , ConfigProvider
67from dbt_mcp .dbt_admin .onboarding .client import OnboardingClient
78from dbt_mcp .dbt_admin .onboarding .models import (
8- OnboardingInitResult ,
9+ OnboardingApplyResult ,
10+ OnboardingGetResult ,
911 OnboardingModel ,
10- OnboardingStateResult ,
12+ OnboardingValidateResult ,
1113)
1214from dbt_mcp .prompts .prompts import get_prompt
1315from dbt_mcp .tools .definitions import dbt_mcp_tool
@@ -23,57 +25,66 @@ class OnboardingToolContext:
2325
2426
2527@dbt_mcp_tool (
26- description = get_prompt ("admin_api/onboarding_init " ),
27- title = "Start or Resume Onboarding" ,
28- read_only_hint = False ,
28+ description = get_prompt ("admin_api/onboarding_get " ),
29+ title = "Get Onboarding Status " ,
30+ read_only_hint = True ,
2931 destructive_hint = False ,
3032 idempotent_hint = True ,
3133)
32- async def dbt_admin_onboarding_init (
34+ async def dbt_admin_onboarding_get (
3335 context : OnboardingToolContext ,
34- ) -> OnboardingInitResult :
35- """Start or resume an onboarding session for the account ."""
36+ ) -> OnboardingGetResult :
37+ """Return the current onboarding record, or null if none has been started ."""
3638 config = await context .admin_api_config_provider .get_config ()
37- account_id = config .account_id
38-
39- existing = await context .onboarding_client .get (account_id )
40- if existing is not None :
41- return OnboardingInitResult (
42- onboarding = OnboardingModel .from_api (existing ),
43- created = False ,
44- )
45-
46- data = await context .onboarding_client .create_or_get (account_id )
47- return OnboardingInitResult (
48- onboarding = OnboardingModel .from_api (data ),
49- created = True ,
39+ data = await context .onboarding_client .get (config .account_id )
40+ return OnboardingGetResult (
41+ onboarding = OnboardingModel .from_api (data ) if data is not None else None
5042 )
5143
5244
5345@dbt_mcp_tool (
54- description = get_prompt ("admin_api/onboarding_state " ),
55- title = "Get Onboarding State " ,
46+ description = get_prompt ("admin_api/onboarding_validate " ),
47+ title = "Validate Onboarding Data " ,
5648 read_only_hint = True ,
5749 destructive_hint = False ,
5850 idempotent_hint = True ,
5951)
60- async def dbt_admin_onboarding_state (
52+ async def dbt_admin_onboarding_validate (
6153 context : OnboardingToolContext ,
62- ) -> OnboardingStateResult :
63- """Return the current onboarding state for the account."""
54+ data : dict [str , Any ],
55+ ) -> OnboardingValidateResult :
56+ """Validate onboarding data without applying it; returns what is missing or invalid."""
6457 config = await context .admin_api_config_provider .get_config ()
65- account_id = config .account_id
58+ raw = await context .onboarding_client .validate (config .account_id , data )
59+ status = raw .get ("status" , {})
60+ if status .get ("is_success" ):
61+ return OnboardingValidateResult (valid = True )
62+ developer_message = status .get ("developer_message" , "" )
63+ errors = [developer_message ] if developer_message else []
64+ return OnboardingValidateResult (valid = False , errors = errors )
6665
67- data = await context .onboarding_client .get (account_id )
68- if data is None :
69- return OnboardingStateResult (onboarding = None )
7066
71- return OnboardingStateResult (onboarding = OnboardingModel .from_api (data ))
67+ @dbt_mcp_tool (
68+ description = get_prompt ("admin_api/onboarding_apply" ),
69+ title = "Apply Onboarding Data" ,
70+ read_only_hint = False ,
71+ destructive_hint = False ,
72+ idempotent_hint = True ,
73+ )
74+ async def dbt_admin_onboarding_apply (
75+ context : OnboardingToolContext ,
76+ data : dict [str , Any ],
77+ ) -> OnboardingApplyResult :
78+ """Submit collected onboarding data; safe to call multiple times with partial data."""
79+ config = await context .admin_api_config_provider .get_config ()
80+ raw = await context .onboarding_client .apply (config .account_id , data )
81+ return OnboardingApplyResult (onboarding = OnboardingModel .from_api (raw ))
7282
7383
7484ONBOARDING_TOOLS = [
75- dbt_admin_onboarding_init ,
76- dbt_admin_onboarding_state ,
85+ dbt_admin_onboarding_get ,
86+ dbt_admin_onboarding_validate ,
87+ dbt_admin_onboarding_apply ,
7788]
7889
7990
0 commit comments