Skip to main content
Glama

generate_graph_chart

Visualize relationships between entities in network graphs by generating interactive charts. Input nodes and edges to create customizable layouts, themes, and outputs like PNG, SVG, or ECharts options.

Instructions

Generate a network graph chart to show relationships (edges) between entities (nodes), such as, relationships between people in social networks.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
dataYesData for network graph chart, such as, { nodes: [{ id: 'node1', name: 'Node 1' }], edges: [{ source: 'node1', target: 'node2' }] }
heightNoSet the height of the chart, default is 600px.
layoutNoLayout algorithm for the graph. Default is 'force'.force
outputTypeNoThe output type of the diagram. Can be 'png', 'svg' or 'option'. Default is 'png', 'png' will return the rendered PNG image, 'svg' will return the rendered SVG string, and 'option' will return the valid ECharts option.png
themeNoSet the theme for the chart, optional, default is 'default'.default
titleNoSet the title of the chart.
widthNoSet the width of the chart, default is 800px.

Implementation Reference

  • The main handler function ('run') that implements the generate_graph_chart tool logic, including data validation, ECharts configuration for graph visualization, and image generation.
    run: async (params: {
      data: {
        nodes: Array<{
          id: string;
          name: string;
          value?: number;
          category?: string;
        }>;
        edges: Array<{ source: string; target: string; value?: number }>;
      };
      height: number;
      layout?: "force" | "circular" | "none";
      theme?: "default" | "dark";
      title?: string;
      width: number;
      outputType?: "png" | "svg" | "option";
    }) => {
      const {
        data,
        height,
        layout = "force",
        theme,
        title,
        width,
        outputType,
      } = params;
    
      // Validate that all edge nodes exist in nodes array
      const nodeIds = new Set(data.nodes.map((node) => node.id));
      const validEdges = data.edges.filter(
        (edge) => nodeIds.has(edge.source) && nodeIds.has(edge.target),
      );
    
      // Extract unique categories for legend
      const categories = Array.from(
        new Set(
          data.nodes
            .map((node) => node.category)
            .filter((cat): cat is string => Boolean(cat)),
        ),
      );
    
      // Transform nodes for ECharts
      const nodes = data.nodes.map((node) => ({
        id: node.id,
        name: node.name,
        symbolSize: node.value ? Math.sqrt(node.value) * 10 : 20,
        category: node.category,
        value: node.value,
      }));
    
      // Transform edges for ECharts
      const links = validEdges.map((edge) => ({
        source: edge.source,
        target: edge.target,
        value: edge.value,
      }));
    
      const series: Array<SeriesOption> = [
        {
          type: "graph",
          data: nodes,
          links: links,
          categories: categories.map((cat) => ({ name: cat })),
          roam: true,
          layout: layout,
          force:
            layout === "force"
              ? {
                  repulsion: 100,
                  gravity: 0.02,
                  edgeLength: 150,
                  layoutAnimation: true,
                }
              : undefined,
          label: {
            show: true,
            position: "right",
            formatter: "{b}",
          },
          lineStyle: {
            color: "source",
            curveness: 0.3,
          },
          emphasis: {
            focus: "adjacency",
            label: {
              fontSize: 16,
            },
          },
        },
      ];
    
      const echartsOption: EChartsOption = {
        series,
        title: {
          left: "center",
          text: title,
        },
        tooltip: {
          trigger: "item",
        },
        legend:
          categories.length > 0
            ? {
                left: "center",
                orient: "horizontal",
                bottom: 10,
                data: categories,
              }
            : undefined,
      };
    
      return await generateChartImage(
        echartsOption,
        width,
        height,
        theme,
        outputType,
        "generate_graph_chart",
      );
    },
  • Zod schemas for input validation: NodeSchema, EdgeSchema, and the full inputSchema for the tool parameters including data, dimensions, layout, theme, and output type.
    // Node schema
    const NodeSchema = z.object({
      id: z.string().describe("Unique identifier for the node."),
      name: z.string().describe("Display name of the node."),
      value: z
        .number()
        .optional()
        .describe("Value associated with the node (affects size)."),
      category: z
        .string()
        .optional()
        .describe("Category of the node (affects color)."),
    });
    
    // Edge schema
    const EdgeSchema = z.object({
      source: z.string().describe("Source node id."),
      target: z.string().describe("Target node id."),
      value: z.number().optional().describe("Weight or value of the edge."),
    });
    
    export const generateGraphChartTool = {
      name: "generate_graph_chart",
      description:
        "Generate a network graph chart to show relationships (edges) between entities (nodes), such as, relationships between people in social networks.",
      inputSchema: z.object({
        data: z
          .object({
            nodes: z
              .array(NodeSchema)
              .describe("Array of nodes in the network.")
              .nonempty({ message: "At least one node is required." }),
            edges: z
              .array(EdgeSchema)
              .describe("Array of edges connecting nodes.")
              .optional()
              .default([]),
          })
          .describe(
            "Data for network graph chart, such as, { nodes: [{ id: 'node1', name: 'Node 1' }], edges: [{ source: 'node1', target: 'node2' }] }",
          ),
        height: HeightSchema,
        layout: z
          .enum(["force", "circular", "none"])
          .optional()
          .default("force")
          .describe("Layout algorithm for the graph. Default is 'force'."),
        theme: ThemeSchema,
        title: TitleSchema,
        width: WidthSchema,
        outputType: OutputTypeSchema,
      }),
  • The generateGraphChartTool is registered by being included in the exported 'tools' array, which aggregates all chart tools.
    export const tools = [
      generateEChartsTool,
      generateLineChartTool,
      generateBarChartTool,
      generatePieChartTool,
      generateRadarChartTool,
      generateScatterChartTool,
      generateSankeyChartTool,
      generateFunnelChartTool,
      generateGaugeChartTool,
      generateTreemapChartTool,
      generateSunburstChartTool,
      generateHeatmapChartTool,
      generateCandlestickChartTool,
      generateBoxplotChartTool,
      generateGraphChartTool,
      generateParallelChartTool,
      generateTreeChartTool,
    ];
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. It states what the tool does but reveals nothing about: what format the output takes (image file? data structure?), whether this is a read-only or mutation operation, performance characteristics, error conditions, or authentication requirements. For a complex visualization tool with 7 parameters, this is a significant transparency gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise - a single sentence that efficiently communicates the core purpose with an illustrative example. Every word earns its place, and the structure is front-loaded with the essential information. There's no wasted verbiage or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex chart generation tool with 7 parameters, nested objects, no output schema, and no annotations, the description is insufficiently complete. It doesn't explain what the tool returns (image? configuration?), doesn't address behavioral aspects like performance or error handling, and provides minimal guidance for parameter usage despite the schema's technical completeness. The description fails to compensate for the lack of output schema and annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description adds no parameter-specific information beyond the generic mention of 'relationships (edges) between entities (nodes)', which loosely maps to the 'data' parameter but provides no additional semantic context. This meets the baseline expectation when schema coverage is complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Generate a network graph chart to show relationships (edges) between entities (nodes)'. It specifies the verb ('generate'), resource ('network graph chart'), and provides an example use case ('relationships between people in social networks'). However, it doesn't explicitly differentiate this network graph tool from its many sibling chart tools beyond the generic 'network graph' terminology.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus the 15+ sibling chart tools. There's no mention of alternatives, prerequisites, or specific scenarios where a network graph is preferred over other visualization types. The single example ('relationships between people in social networks') is helpful but insufficient for comprehensive usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Related Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/hustcc/mcp-echarts'

If you have feedback or need assistance with the MCP directory API, please join our Discord server