> hypequery

Tool Generation

Generate catalog-backed dataset tools for agents and function-calling runtimes.

@hypequery/datasets can generate tool metadata from the same catalog used by Serve and MCP. Use this when an agent runtime needs constrained schemas for dataset queries instead of direct access to SQL.

Generated tools expose declared datasets, dimensions, measures, filters, order fields, time grains, and limits. They do not expose tenant selection by default, and SQL is removed from tool results unless includeSql is enabled.

Catalog Tool

Catalog mode creates one generic query_dataset tool.

import {
  createDatasetClient,
  generateDatasetTools,
  toOpenAITools,
} from '@hypequery/datasets';
import { Orders } from './datasets/orders.js';
import { db } from './db.js';

const analytics = createDatasetClient({ queryBuilder: db });

const tools = generateDatasetTools({
  datasets: { orders: Orders },
  analytics,
  mode: 'catalog',
});

const openaiTools = toOpenAITools(tools);

The generated schema includes enums derived from the dataset catalog.

{
  "name": "query_dataset",
  "parameters": {
    "type": "object",
    "properties": {
      "dataset": { "type": "string", "enum": ["orders"] },
      "dimensions": {
        "type": "array",
        "items": { "type": "string", "enum": ["status", "createdAt"] }
      },
      "measures": {
        "type": "array",
        "items": { "type": "string", "enum": ["revenue", "orderCount"] }
      }
    },
    "required": ["dataset"],
    "additionalProperties": false
  }
}

Per-Dataset Tools

Per-dataset mode creates one tool per dataset, such as query_orders.

const tools = generateDatasetTools({
  datasets: {
    orders: Orders,
    customers: Customers,
  },
  analytics,
  mode: 'per-dataset',
});

Per-Metric Tools

Per-metric mode creates one tool per attached named metric. Attach metric refs to the dataset registry shape so the catalog can see them.

const totalRevenue = Orders.metric('totalRevenue', {
  measure: 'revenue',
  label: 'Total Revenue',
});

const tools = generateDatasetTools({
  datasets: {
    orders: {
      ...Orders,
      metrics: { totalRevenue },
    },
  },
  analytics,
  mode: 'per-metric',
});

Per-metric tools do not include a measures input. They accept dimensions, filters, order, limits, offsets, and time grains that are valid for that metric's dataset.

Adapters

Use adapters when a runtime needs a specific metadata shape.

import {
  toAISDKTools,
  toMcpTools,
  toOpenAITools,
} from '@hypequery/datasets';

const openaiTools = toOpenAITools(tools);
const aiSdkTools = toAISDKTools(tools);
const mcpTools = toMcpTools(tools);

toAISDKTools() returns plain tool objects with description, parameters, and execute. If your AI SDK version expects a wrapper such as tool(...), wrap the returned entries in your application.

SQL Redaction

Generated tools redact meta.sql by default.

const tools = generateDatasetTools({
  datasets: { orders: Orders },
  analytics,
  includeSql: false,
});

Set includeSql: true only for trusted debugging contexts.

Validation

Tool execution performs catalog-level validation before calling analytics.execute(...). Invalid datasets, fields, filter operators, order fields, grains, and limits fail with errors that agents can repair.

The dataset client remains the authoritative validator and executor. Tool generation is a constrained metadata and execution wrapper around the same semantic query path.

On this page