line_plot
Visualize SQL query results as line charts from CSV, Parquet, or database sources to analyze trends and patterns in data.
Instructions
Run query against specified source and make a line plot using result For both csv and parquet sources, use DuckDB SQL syntax Use 'CSV' as the table name in the SQL query for csv sources. Use 'PARQUET' as the table name in the SQL query for parquet sources.
This will return an image of the plot
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| source_id | Yes | The data source to run the query on | |
| query | Yes | SQL query to run on the data source | |
| x | Yes | Column name from SQL result to use for x-axis | |
| y | Yes | Column name from SQL result to use for y-axis | |
| color | No | Optional; column name from SQL result to use for drawing multiple colored lines representing another dimension |
Implementation Reference
- zaturn/tools/visualizations.py:87-120 (handler)The core handler function for the 'line_plot' MCP tool. It executes a SQL query on the specified data source, creates a line plot using Plotly Express (px.line), updates x-axis, converts the figure to a base64-encoded PNG image using _fig_to_image, and returns ImageContent or error string.def line_plot(self, source_id: Annotated[ str, Field(description='The data source to run the query on') ], query: Annotated[ str, Field(description='SQL query to run on the data source') ], x: Annotated[ str, Field(description='Column name from SQL result to use for x-axis') ], y: Annotated[ str, Field(description='Column name from SQL result to use for y-axis') ], color: Annotated[ str | None, Field(description='Optional; column name from SQL result to use for drawing multiple colored lines representing another dimension') ] = None, ) -> str | ImageContent: """ Run query against specified source and make a line plot using result For both csv and parquet sources, use DuckDB SQL syntax Use 'CSV' as the table name in the SQL query for csv sources. Use 'PARQUET' as the table name in the SQL query for parquet sources. This will return an image of the plot """ try: df = self._get_df_from_source(source_id, query) fig = px.line(df, x=x, y=y, color=color) fig.update_xaxes(autotickangles=[0, 45, 60, 90]) return _fig_to_image(fig) except Exception as e: return str(e)
- zaturn/tools/visualizations.py:30-40 (registration)Registration of the line_plot method into the tools list of the Visualizations class, which is then propagated to ZaturnTools.tools and registered in MCP.self.scatter_plot, self.line_plot, self.histogram, self.strip_plot, self.box_plot, self.bar_plot, self.density_heatmap, self.polar_scatter, self.polar_line, ]
- zaturn/mcp/__init__.py:89-95 (registration)MCP server registration: Creates ZaturnTools instance (including line_plot), initializes FastMCP, and registers all tools by calling add_tool(Tool.from_function(tool_function)) in a loop.def ZaturnMCP(sources): zaturn_tools = ZaturnTools(sources) zaturn_mcp = FastMCP() for tool_function in zaturn_tools.tools: zaturn_mcp.add_tool(Tool.from_function(tool_function)) return zaturn_mcp
- zaturn/tools/visualizations.py:13-22 (helper)Helper function that converts a Plotly figure to a base64 PNG ImageContent object, called by line_plot.def _fig_to_image(fig): fig_encoded = b64encode(fig.to_image(format='png')).decode() img_b64 = "data:image/png;base64," + fig_encoded return ImageContent( type = 'image', data = fig_encoded, mimeType = 'image/png', annotations = None, )
- zaturn/tools/visualizations.py:43-49 (helper)Helper method to fetch data source by ID and execute the SQL query using query_utils.execute_query, returning a Pandas DataFrame for plotting.def _get_df_from_source(self, source_id, query): source = self.data_sources.get(source_id) if not source: raise Exception(f"Source {source_id} Not Found") return query_utils.execute_query(source, query)