Skip to content

Commit 24cdf49

Browse files
DevonFulcherAI Assistant
andcommitted
refactor(tools): default structured_output to True, require title
Flip `GenericToolDefinition.structured_output` from `bool | None = False` to `bool = True` so newly-added tools don't have to opt in. Make `title` required in `generic_dbt_mcp_tool` and force keyword-only args so call sites stay explicit. Co-Authored-By: AI Assistant <noreply@ai>
1 parent 1d4837a commit 24cdf49

5 files changed

Lines changed: 23 additions & 10 deletions

File tree

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
kind: Under the Hood
2+
body: Make ToolDefinition.structured_output default to True and require title in generic_dbt_mcp_tool. Decorator now keyword-only.
3+
time: 2026-05-13T08:56:32.224755-05:00

src/dbt_mcp/dbt_cli/tools.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@ def get_node_details_dev(
429429
return [
430430
ToolDefinition(
431431
fn=build,
432+
title="dbt build",
432433
description=get_prompt("dbt_cli/build"),
433434
annotations=create_tool_annotations(
434435
title="dbt build",
@@ -439,6 +440,7 @@ def get_node_details_dev(
439440
),
440441
ToolDefinition(
441442
fn=compile,
443+
title="dbt compile",
442444
description=get_prompt("dbt_cli/compile"),
443445
annotations=create_tool_annotations(
444446
title="dbt compile",
@@ -449,6 +451,7 @@ def get_node_details_dev(
449451
),
450452
ToolDefinition(
451453
fn=docs,
454+
title="dbt docs",
452455
description=get_prompt("dbt_cli/docs"),
453456
annotations=create_tool_annotations(
454457
title="dbt docs",
@@ -460,6 +463,7 @@ def get_node_details_dev(
460463
ToolDefinition(
461464
name="list",
462465
fn=ls,
466+
title="dbt list",
463467
description=get_prompt("dbt_cli/list"),
464468
annotations=create_tool_annotations(
465469
title="dbt list",
@@ -470,6 +474,7 @@ def get_node_details_dev(
470474
),
471475
ToolDefinition(
472476
fn=parse,
477+
title="dbt parse",
473478
description=get_prompt("dbt_cli/parse"),
474479
annotations=create_tool_annotations(
475480
title="dbt parse",
@@ -480,6 +485,7 @@ def get_node_details_dev(
480485
),
481486
ToolDefinition(
482487
fn=run,
488+
title="dbt run",
483489
description=get_prompt("dbt_cli/run"),
484490
annotations=create_tool_annotations(
485491
title="dbt run",
@@ -490,6 +496,7 @@ def get_node_details_dev(
490496
),
491497
ToolDefinition(
492498
fn=test,
499+
title="dbt test",
493500
description=get_prompt("dbt_cli/test"),
494501
annotations=create_tool_annotations(
495502
title="dbt test",
@@ -500,6 +507,7 @@ def get_node_details_dev(
500507
),
501508
ToolDefinition(
502509
fn=show,
510+
title="dbt show",
503511
description=get_prompt("dbt_cli/show"),
504512
annotations=create_tool_annotations(
505513
title="dbt show",
@@ -510,6 +518,7 @@ def get_node_details_dev(
510518
),
511519
ToolDefinition(
512520
fn=clone,
521+
title="dbt clone",
513522
description=get_prompt("dbt_cli/clone"),
514523
annotations=create_tool_annotations(
515524
title="dbt clone",
@@ -521,6 +530,7 @@ def get_node_details_dev(
521530
ToolDefinition(
522531
name="get_lineage_dev",
523532
fn=get_lineage_dev,
533+
title="Get Model Lineage (Dev)",
524534
description=get_prompt("dbt_cli/get_lineage_dev"),
525535
annotations=create_tool_annotations(
526536
title="Get Model Lineage (Dev)",
@@ -532,6 +542,7 @@ def get_node_details_dev(
532542
ToolDefinition(
533543
name="get_node_details_dev",
534544
fn=get_node_details_dev,
545+
title="Get Node Details (Dev)",
535546
description=get_prompt("dbt_cli/get_node_details_dev"),
536547
annotations=create_tool_annotations(
537548
title="Get Node Details (Dev)",

src/dbt_mcp/dbt_codegen/tools.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,29 +163,29 @@ def generate_staging_model(
163163
return [
164164
ToolDefinition(
165165
fn=generate_source,
166+
title="Generate Source",
166167
description=get_prompt("dbt_codegen/generate_source"),
167168
annotations=create_tool_annotations(
168-
title="dbt-codegen generate_source",
169169
read_only_hint=True,
170170
destructive_hint=False,
171171
idempotent_hint=True,
172172
),
173173
),
174174
ToolDefinition(
175175
fn=generate_model_yaml,
176+
title="Generate Model YAML",
176177
description=get_prompt("dbt_codegen/generate_model_yaml"),
177178
annotations=create_tool_annotations(
178-
title="dbt-codegen generate_model_yaml",
179179
read_only_hint=True,
180180
destructive_hint=False,
181181
idempotent_hint=True,
182182
),
183183
),
184184
ToolDefinition(
185185
fn=generate_staging_model,
186+
title="Generate Staging Model",
186187
description=get_prompt("dbt_codegen/generate_staging_model"),
187188
annotations=create_tool_annotations(
188-
title="dbt-codegen generate_staging_model",
189189
read_only_hint=True,
190190
destructive_hint=False,
191191
idempotent_hint=True,

src/dbt_mcp/lsp/tools.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,9 @@ async def wrapper(*args, **kwargs) -> Any:
7070
return [
7171
ToolDefinition(
7272
fn=call_with_lsp_client(get_column_lineage),
73+
title="Get Column Lineage",
7374
description=get_prompt("lsp/get_column_lineage"),
7475
annotations=create_tool_annotations(
75-
title="get_column_lineage",
7676
read_only_hint=False,
7777
destructive_hint=False,
7878
idempotent_hint=True,

src/dbt_mcp/tools/definitions.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,12 @@
1414
@dataclass
1515
class GenericToolDefinition[NameEnum: Enum]:
1616
fn: Callable[..., Any]
17+
title: str
1718
description: str
1819
name_enum: type[NameEnum]
1920
name: str | None = None
20-
title: str | None = None
2121
annotations: ToolAnnotations | None = None
22-
# We haven't strictly defined our tool contracts yet.
23-
# So we're setting this to False by default for now.
24-
structured_output: bool | None = False
22+
structured_output: bool = True
2523
meta: dict[str, Any] | None = None
2624

2725
def get_name(self) -> NameEnum:
@@ -62,15 +60,16 @@ class ToolDefinition(GenericToolDefinition[ToolName]):
6260

6361

6462
def generic_dbt_mcp_tool[NameEnum: Enum](
63+
*,
6564
description: str,
65+
title: str,
6666
name_enum: type[NameEnum],
6767
name: str | None = None,
68-
title: str | None = None,
6968
read_only_hint: bool = False,
7069
destructive_hint: bool = True,
7170
idempotent_hint: bool = False,
7271
open_world_hint: bool = True,
73-
structured_output: bool | None = False,
72+
structured_output: bool = True,
7473
meta: dict[str, Any] | None = None,
7574
) -> Callable[[Callable], GenericToolDefinition[NameEnum]]:
7675
"""Decorator to define a tool definition for dbt MCP"""

0 commit comments

Comments
 (0)