Skip to content

Commit 766e655

Browse files
committed
feat: add intent and query_parameters fields to match dbt schema
1 parent 741575c commit 766e655

File tree

3 files changed

+48
-6
lines changed

3 files changed

+48
-6
lines changed

mcp_server_snowflake/query_manager/tools.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,16 @@ def run_query_tool(
9191
specific agents, models, or sessions in Snowflake's query history.
9292
9393
Common context keys:
94-
- model: The AI model name (e.g., "claude-sonnet-4", "gpt-4")
95-
- agent_name: Name of the agent or application making queries (e.g., "Claude Code")
94+
- model: The AI model name (e.g., "claude-sonnet-4-5-20250929")
95+
- agent_name: Name of the agent or application (e.g., "Claude Code")
9696
- user_email: Email of the user running the agent
9797
- user_name: Name of the user running the agent
98+
- intent: Object describing query intent (category, confidence, domains, question)
99+
- query_parameters: Object describing query details (datasets, dimensions, time_range)
98100
- session_id: A unique session identifier for grouping related queries
99101
100-
You can also set custom key-value pairs that will be available as template variables.
101-
Context persists for the lifetime of the MCP server connection.""",
102+
Context persists for the lifetime of the MCP server connection. Call this tool again
103+
to update intent/query_parameters for different queries.""",
102104
)
103105
def set_query_context_tool(
104106
model: Annotated[
@@ -129,6 +131,20 @@ def set_query_context_tool(
129131
description="Name of the user running the agent",
130132
),
131133
] = None,
134+
intent: Annotated[
135+
dict,
136+
Field(
137+
default=None,
138+
description="Query intent: {category, confidence, domains, question}",
139+
),
140+
] = None,
141+
query_parameters: Annotated[
142+
dict,
143+
Field(
144+
default=None,
145+
description="Query parameters: {datasets, dimensions, time_range}",
146+
),
147+
] = None,
132148
session_id: Annotated[
133149
str,
134150
Field(
@@ -154,6 +170,10 @@ def set_query_context_tool(
154170
context["user_email"] = user_email
155171
if user_name is not None:
156172
context["user_name"] = user_name
173+
if intent is not None:
174+
context["intent"] = intent
175+
if query_parameters is not None:
176+
context["query_parameters"] = query_parameters
157177
if session_id is not None:
158178
context["session_id"] = session_id
159179
if custom_context is not None:

mcp_server_snowflake/server.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,13 @@
6161
"request_id": "{request_id}",
6262
"timestamp": "{timestamp}",
6363
},
64+
"intent": "{intent}",
6465
"model_version": "{model}",
6566
"query": {
6667
"tool": "{tool_name}",
6768
"statement_type": "{statement_type}",
6869
},
70+
"query_parameters": "{query_parameters}",
6971
"user": {
7072
"email": "{user_email}",
7173
"name": "{user_name}",
@@ -542,6 +544,9 @@ def build_query_comment(
542544
"user_name": self.query_context.get(
543545
"user_name", os.environ.get("SNOWFLAKE_MCP_USER_NAME", "unknown")
544546
),
547+
# Intent and query_parameters: complex objects from agent (default to null)
548+
"intent": self.query_context.get("intent"),
549+
"query_parameters": self.query_context.get("query_parameters"),
545550
"server_name": server_name,
546551
"server_version": f"{tag_major_version}.{tag_minor_version}",
547552
}
@@ -553,9 +558,20 @@ def build_query_comment(
553558
def substitute_value(value: Any) -> Any:
554559
"""Recursively substitute template variables in values."""
555560
if isinstance(value, str):
561+
# Check if the entire string is a single placeholder like "{intent}"
562+
# If so, return the actual value (could be dict, None, etc.)
563+
import re
564+
565+
match = re.fullmatch(r"\{(\w+)\}", value)
566+
if match:
567+
key = match.group(1)
568+
if key in substitutions:
569+
return substitutions[key]
570+
# Otherwise do string replacement
556571
result = value
557572
for key, sub_value in substitutions.items():
558-
result = result.replace(f"{{{key}}}", str(sub_value))
573+
if sub_value is not None:
574+
result = result.replace(f"{{{key}}}", str(sub_value))
559575
return result
560576
elif isinstance(value, dict):
561577
return {k: substitute_value(v) for k, v in value.items()}

services/configuration.yaml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,12 @@ query_comment:
6565
# context:
6666
# request_id: "{request_id}"
6767
# timestamp: "{timestamp}"
68+
# intent: "{intent}"
6869
# model_version: "{model}"
6970
# query:
7071
# tool: "{tool_name}"
7172
# statement_type: "{statement_type}"
73+
# query_parameters: "{query_parameters}"
7274
# user:
7375
# email: "{user_email}"
7476
# name: "{user_name}"
@@ -82,6 +84,8 @@ query_comment:
8284
# {agent_name} - Agent name (from set_query_context, defaults to "mcp-server-snowflake")
8385
# {user_email} - User email (from set_query_context or SNOWFLAKE_MCP_USER_EMAIL env var)
8486
# {user_name} - User name (from set_query_context or SNOWFLAKE_MCP_USER_NAME env var)
87+
# {intent} - Query intent object: {category, confidence, domains, question}
88+
# {query_parameters} - Query params object: {datasets, dimensions, time_range}
8589
# {session_id} - Session ID (from set_query_context)
8690
# {server_name} - MCP server name
8791
# {server_version} - Server version
@@ -92,5 +96,7 @@ query_comment:
9296
# model="claude-sonnet-4-5-20250929",
9397
# agent_name="Claude Code",
9498
# user_email="user@example.com",
95-
# user_name="username"
99+
# user_name="username",
100+
# intent={"category": "aggregation", "question": "Total users"},
101+
# query_parameters={"datasets": ["my_table"], "dimensions": ["date"]}
96102
# )

0 commit comments

Comments
 (0)