Skip to content

Commit 2f6965f

Browse files
authored
Merge pull request #974 from DataRecce/feature/drc-2219-recce-mcp-improvements
feat: change the lineage diff response format
2 parents 8d7ac5e + e042774 commit 2f6965f

File tree

2 files changed

+26
-9
lines changed

2 files changed

+26
-9
lines changed

recce/mcp_server.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,10 @@ async def list_tools() -> List[Tool]:
137137
description=textwrap.dedent(
138138
"""
139139
Get the lineage diff between production(base) and session(current) for changed models.
140-
Returns nodes, parent_map (node dependencies), and change_status/impacted information in compact dataframe format.
140+
Returns nodes and edges (node dependencies) in compact dataframe format.
141141
142-
In parent_map: key is a node index, value is list of parent node indices
143142
Nodes dataframe includes: idx, id, name, resource_type, materialized, change_status, impacted.
143+
Edges dataframe includes: from (parent node idx), to (child node idx).
144144
145145
Rendering guidance for Mermaid diagram:
146146
Use graph LR and apply these styles based on change_status and impacted:
@@ -450,16 +450,25 @@ async def _tool_lineage_diff(self, arguments: Dict[str, Any]) -> Dict[str, Any]:
450450
data=nodes_data,
451451
)
452452

453-
# Map parent_map IDs to indices
454-
parent_map_indexed = {}
453+
# Build edges from parent_map
454+
edges_data = []
455455
for node_id, parents in parent_map.items():
456456
if node_id in id_to_idx:
457-
node_idx = id_to_idx[node_id]
458-
parent_indices = [id_to_idx[p] for p in parents if p in id_to_idx]
459-
parent_map_indexed[node_idx] = parent_indices
457+
for parent_id in parents:
458+
if parent_id in id_to_idx:
459+
edges_data.append((id_to_idx[parent_id], id_to_idx[node_id]))
460+
461+
# Create edges DataFrame
462+
edges_df = DataFrame.from_data(
463+
columns={
464+
"from": "integer",
465+
"to": "integer",
466+
},
467+
data=edges_data,
468+
)
460469

461470
# Build simplified result
462-
result = {"nodes": nodes_df.model_dump(mode="json"), "parent_map": parent_map_indexed}
471+
result = {"nodes": nodes_df.model_dump(mode="json"), "edges": edges_df.model_dump(mode="json")}
463472

464473
return result
465474

tests/test_mcp_server.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ async def test_tool_lineage_diff(self, mcp_server):
8787

8888
# Verify the result structure
8989
assert "nodes" in result
90-
assert "parent_map" in result
90+
assert "edges" in result
9191

9292
# Verify nodes is a DataFrame dict with columns and data
9393
nodes = result["nodes"]
@@ -98,6 +98,14 @@ async def test_tool_lineage_diff(self, mcp_server):
9898
assert isinstance(nodes["data"], list)
9999
assert len(nodes["data"]) == 2
100100

101+
# Verify edges is a DataFrame dict with columns and data
102+
edges = result["edges"]
103+
assert "columns" in edges
104+
assert "data" in edges
105+
assert isinstance(edges["data"], list)
106+
# Verify edges contains the parent-child relationship (model_a -> model_b)
107+
assert len(edges["data"]) == 1
108+
101109
mock_context.get_lineage_diff.assert_called_once()
102110
mock_context.adapter.select_nodes.assert_called()
103111

0 commit comments

Comments
 (0)