get_tool_details → run_tool), and Live Data
tools are always reached through a dispatcher (discover_live_tools → run_live_tool). Both are
explained below — the tools themselves are fully available either way.
Have skills, automations, or saved prompts that call Nekt tools by name? Several tools were
merged into generic versions that take a
kind argument, and the old names no longer exist. See
Changed tool names at the bottom of this page.Asking about Nekt
ask_about_nekt
Answers questions about the Nekt platform itself — features, configuration, usage, and capabilities.
This tool consults Nekt’s documentation and does not query your data.
Querying data
The path is: read the business context, find the right tables, generate SQL, run it.get_semantic_context
Retrieves the most relevant semantic-layer documents for a question using vector search over your
business knowledge. Returns curated documentation that explains the business meaning of tables,
fields, and metrics, with each document’s referenced warehouse resources already resolved. This is
the first step of the query workflow — the context it returns grounds generate_sql in your
organization’s own definitions and rules. It is also what decides whether a question should be
answered from the warehouse or from a Live Data connection. For creating semantic
context, see Adding context.
get_relevant_tables_ddl
Discovers which tables are relevant to a given question using semantic search. Returns the full
schema (CREATE TABLE DDL) for each matched table — useful for understanding available columns and
types before generating SQL.
generate_sql
Converts a natural language question into a SQL query based on your table schemas and the business
context retrieved above. The generated query is scoped to the tables accessible by the token. You can
then execute it using the execute_sql tool.
execute_sql
Executes a SQL query against your data warehouse and returns the results as structured data. Supports
pagination for large result sets (up to 1,000 rows per page). The SQL dialect adapts automatically to
your cloud — BigQuery for GCP and Nekt Express, Athena for AWS.
When a query fails, the error comes back with a likely explanation rather than the raw engine text
alone — in particular it distinguishes a table that exists in your Catalog but has not been
materialized yet (the pipeline that writes it hasn’t produced data) from a table name that is simply
wrong, so your agent stops guessing at names that were already correct.
get_table_preview
Returns a small sample (10 rows) from a table to help understand its contents. Useful for inspecting
column values, data formats, and categorical fields before writing queries.
list_tables
Lists tables in the Catalog one page at a time (100 tables per page). Use this when you need a
deterministic, complete enumeration of available tables — for example, when browsing the Catalog
without a specific question, or when you need a table’s id. For question-driven discovery, prefer
get_relevant_tables_ddl.
Browsing what’s connected
Two tools cover everything in your workspace — sources, destinations, Queries, and Notebooks. Both take akind argument.
list_resources
The single browse tool over all resource types. kind accepts:
Supports free-text
search, plus status, tag, connector_slug, and output_table_name filters
and pagination (100 per page). Pass include_trigger=True to also project each row’s current
trigger — that’s how you review existing schedules, and how your agent discovers the pipeline slugs
available to an event trigger. For transformations, each row also carries the GitHub repo the code is
mirrored to, if any.
get_resource
Returns the full detail of a single source or destination by slug — including its streams and
triggers for a source. Configuration values are redacted for security. For a transformation’s code,
use get_code instead.
Connecting sources
Sources pull data into Nekt from external systems — Shopify, HubSpot, Postgres, and more. New sources are created through a draft → publish flow: create a draft, hand the user a secure browser link to complete OAuth or enter secrets (credentials never pass through the chat), validate the live connection, then finalize. Every step is a cross-kind tool called withkind="source":
list_connectors(kind="source")/get_connector(kind="source")— find the connector and read its config schema to see required and secret fields.create_draft(kind="source")— create a draft (connector slug and a description are required; no tables or pipeline yet).get_setup_link(kind="source")— for OAuth/secret connectors, hand the user a deeplink to finish setup in the browser.validate_source_connector_config— test the real connection.check_connector_validation— poll until validation succeeds and the available streams come back.complete_pipeline(kind="source")— finalize the draft: choose streams, output layer, and trigger. Tables are provisioned and the pipeline is deployed.
Connectors with no secret fields can skip step 3 — pass the full config directly at
create_draft.list_connectors
Lists the connector types you can connect, returning each one’s slug and metadata. Use it to discover
the slug needed to start a draft. Pass kind="source" or kind="destination".
get_connector
Returns a connector’s configuration schema (config_template) — every field, which are required, and
which are secret — plus a convenience split so your agent can decide the flow. Connectors with secret
fields (OAuth, API keys, passwords) go through the browser deeplink; connectors without secrets can
be configured entirely in chat. Pass kind="source" or kind="destination".
create_draft
Creates a draft source or destination — the first step of connecting one. A draft has no provisioned
tables and no deployed pipeline; the connector slug and a description are required, so you can start
the connection before any secrets exist. For no-secret connectors, you can pass the full config here
directly.
get_setup_link
Mints a time-limited (24h) deeplink for a draft so the user can complete OAuth or enter secret values
in the browser — secrets never pass through the chat. Present the link and wait for the user to
finish before continuing; the token auto-invalidates once the resource leaves draft. The page fills
only the connector config, not streams, tables, or triggers.
validate_source_connector_config
Tests the connector configuration by actually connecting to the external system, catching bad
credentials or wrong hosts before the source is finalized. For drafts set up via the deeplink, it
re-validates against the config stored on the backend, so secrets never round-trip through the chat.
Returns a validation ID to poll. This step is source-only — destinations publish directly.
check_connector_validation
Polls a validation job until it finishes. On success, it returns the available streams — the
tables/objects the source can pull, each with its supported sync types, fields, primary keys, and
replication keys. Present these so the user can choose which streams to sync before completing the
source.
complete_pipeline
Finalizes a draft. For a source (kind="source"), it requires a description, an output layer, at
least one stream, and a trigger (manual, cron, or event); each stream specifies a destination
table name and a sync type — INCREMENTAL (append new/changed rows) or FULL_SYNC (replace all).
For a destination (kind="destination"), it takes the tables to deliver and a trigger.
Completion is one-way: it provisions warehouse tables and deploys the pipeline.
Managing a live source
Once a source is published, these change it in place.update_source_streams
Adds new streams or edits which streams a live source pulls, applied in place without a redeploy. It
is non-destructive — it never removes streams or drops tables; to stop a stream, disable it. Removing
streams and dropping tables is deliberately left to the web app.
update_trigger
Changes the trigger of an already-live source — manual, cron (a schedule), or event (run when
upstream pipelines finish). Use kind="source". The same tool handles transformation triggers; see
Creating and editing pipelines.
run_pipeline
Triggers an extraction run of a live source on demand, optionally as a full sync or for selected
streams. Use kind="source". This consumes credits, so the assistant confirms before running.
Connecting destinations
Destinations deliver data out of Nekt to external systems — Slack, Google Sheets, Postgres, webhooks, ad platforms, and more. The flow is the same shape as a source, withkind="destination",
and one difference: destinations have no validation step — they publish directly.
list_connectors(kind="destination")/get_connector(kind="destination")— find the connector and read its config schema.create_draft(kind="destination")— create a draft (connector slug and a description; input tables optional here).get_setup_link(kind="destination")— for OAuth/secret connectors, hand the user a deeplink to finish setup in the browser.complete_pipeline(kind="destination")— finalize: choose the tables to deliver (each with its fields, and optional primary keys or field renames) and a trigger. The delivery pipeline is deployed.
list_resources(kind="destination") and get_resource(kind="destination");
running one on demand is run_pipeline(kind="destination") — fire-and-forget, with the assistant
confirming first. Run history comes from list_pipeline_runs and get_pipeline_run_logs.
Creating and editing pipelines
create_query
Deploys a SQL Query as a pipeline in Nekt. Accepts the SQL code, a description, the output layer and
table name, and an optional trigger — either a cron schedule or an event trigger that runs the Query
when one or more upstream pipelines finish.
It is two-phase: the first call returns an authoring guide and a preview of exactly what will be
created, without creating anything; your agent shows you that and only creates the pipeline on a
second call with confirm=True. The pipeline then starts in preparing status — poll
get_pipeline_status until it leaves preparing, then trigger execution with run_pipeline once
you confirm.
Optionally, the Query can be created already connected to a GitHub repo: pass the repository full
name (and optionally a branch), and Nekt creates, connects, and pushes the first commit in one step.
The folder in the repo is always the generated pipeline slug. See
Syncing transformation code to GitHub.
create_notebook
Deploys a Python or PySpark Notebook as a pipeline in Nekt. Accepts the notebook code, a description,
the runtime type (python-base, pyspark, or python-browser), optional pip dependencies, and an
optional trigger. For PySpark notebooks, Spark driver and executor sizing can also be configured.
Inputs and outputs are extracted automatically from nekt.load_table and nekt.save_table calls in
the code, so the notebook must use the Nekt SDK for all table I/O.
Like create_query, it is two-phase (preview first, then confirm=True), follows the same
deploy-then-run lifecycle, and can be created already connected to a GitHub repo.
get_code
Returns the current code of a Query or Notebook by slug, along with its configuration and whether it
is connected to a GitHub repo. Use it before editing so changes are made against what is actually
deployed.
update_transformation
Edits an existing transformation — a Query or a Notebook, with no kind argument; it infers the
type. Updates the code, description, dependencies (Notebooks only), active state, and retry settings.
If the transformation is connected to GitHub, changing its code auto-commits the change; no extra
parameters are needed.
update_trigger
Replaces the trigger of an existing pipeline. Supports three trigger types: manual (runs only on
demand), cron (runs on a schedule, with a cron expression and timezone), and event (runs whenever
upstream pipelines finish). For event triggers, provide the triggering pipeline slugs and an optional
rule — any runs it when any of them completes, all waits for all of them. Use
list_resources(kind=..., include_trigger=True) to discover the available slugs. Defaults to
kind="transformation"; pass kind="source" for a source.
Running and monitoring pipelines
run_pipeline
Triggers execution of a deployed pipeline by slug. Defaults to kind="transformation" (Queries and
Notebooks); pass kind="source" to trigger an extraction or kind="destination" to trigger a
delivery. Returns immediately without waiting for the run to finish — use get_pipeline_status to
track progress.
get_pipeline_status
Returns the current status of any pipeline by slug — Sources, Queries, Notebooks, or Destinations.
Used to track deployment progress after create_query or create_notebook (until status leaves
preparing), and to monitor execution after run_pipeline until it reaches a terminal state
(success or failed).
list_pipeline_runs
Lists recent runs of any pipeline by slug. Returns a summary for each run including its id,
status, start and end times, and trigger_type. Paginated (25 per page by default, up to 100).
Use this to inspect a pipeline’s execution history, such as checking for recent failures or
confirming that a trigger fired.
get_pipeline_run_logs
Fetches the logs of a specific run, or of the most recent run when only a pipeline slug is given.
Returns the ERROR-level entries and, when available, Nekt’s AI analysis of the failure — a summary
of what happened, the technical details, and a suggested fix. Use this to diagnose a failed run
without reading the full log.
Adding context
The semantic layer is the curated business knowledge your agent reads before writing SQL — what tables and fields mean, how metrics are defined, and which source to prefer for which question.get_semantic_context (above) reads it; these tools curate it.
update_resource_description
Updates the Description of a resource in your Catalog. Supported resource_type values are layer,
table, field, folder, volume_file, and derived_field. Returns a preview by default — pass
confirm=True to apply the change.
When resource_type is derived_field, the tool first identifies the Query or Notebook that
produced the target table (via list_resources(kind="transformation")), then enriches the field
Description with structured tags inferred from the transformation code: @pk, @fk <table>.<column>,
@measure additive|non-additive, @attribute, and @grain=<period>. Use this when annotating fact,
aggregated, or dimension tables so downstream consumers and AI agents can interpret each column’s
role.
create_context_document
Creates a new semantic-layer context document — reusable business knowledge such as metric
definitions, segment logic, or table interpretations that should inform future analyses. Documents
support annotations (@table, @field, @layer, @measure, @transformation, @source,
@destination, @context) that link the prose to specific warehouse resources. Returns a preview by
default — pass confirm=True to save the document after reviewing it.
Context documents are also how you steer Live Data routing: a document that says which
questions should be answered from a connected app rather than the warehouse makes that routing
automatic next time.
update_context_document
Updates an existing semantic-layer context document when a definition is refined, a segment is added,
or business rules change. The full name and content are replaced, so the saved version always
reflects the complete document. Returns a preview showing the current versus new content by default —
pass confirm=True to apply the change.
delete_context_document
Reached through the dispatcher — see More tools.
update_context_document when a document is merely out of date. Returns a preview of the document to
be removed by default — pass confirm=True to delete it (there is no undo).
resolve_references
Reached through the dispatcher — see More tools.
Live Data
Live Data tools read from and write to your connected apps in real time — HubSpot, Slack, Grafana, an ad platform — rather than reading the copy of that data in your warehouse. Because the set of live tools grows with every connector you attach, they are not listed individually in your agent’s tool list. Two tools cover all of them.discover_live_tools
Lists your organization’s connected Live Data tools, grouped by connection — the connector, its
namespace, and for each tool its exact name, description, input schema, and whether it writes. It
refreshes on demand, so a connector you linked after your client connected shows up without
reconnecting.
run_live_tool
Calls a live tool by name, passing arguments built from its input schema. Since live tools aren’t
listed individually, this is how every one of them is invoked.
The call order is:
Why discovery comes first. Live tool names are specific to your organization and can change, so
an agent should resolve them at run time rather than hardcoding them into a skill or automation.
Discovery also disambiguates two connections of the same app — a Marketing HubSpot and a CS
HubSpot show up as separate entries, so your agent can ask which one you mean.
Live Data connections are visible only to full-access tokens. A limited or table-scoped token
will not see them. If your organization has no Live Data connections, these tools simply return
nothing and the routing guidance is omitted from your agent’s tool list entirely.
Browsing files in volumes
list_layers
Lists all data layers (lakehouses) that your token has access to. Returns each layer’s ID, name,
slug, and description — use this as the starting point when exploring files stored in Nekt volumes.
The remaining three file tools are reached through the dispatcher — see More tools.
list_volumes
Reached through the dispatcher — see More tools.
list_layers to discover available file
containers.
list_files
Reached through the dispatcher — see More tools.
read_file
Reached through the dispatcher — see More tools.
download parameter returns a presigned URL, a base64 string, or an MCP resource blob instead (up to
10 MB).
Syncing transformation code to GitHub
Query and Notebook code can be mirrored into your own GitHub repository (one GitHub App installation per organization). The repo is a code mirror — a transformation’s trigger, output layer, and settings still live in Nekt. There are two paths: create a transformation already connected to a repo (viacreate_query / create_notebook), or connect transformations that already exist. Once a
transformation is connected, editing its code with update_transformation auto-commits the change —
no extra parameters needed.
To see which transformations are already connected and where, use
list_resources(kind="transformation") — each row carries its GitHub repo.
list_github_repositories
Reached through the dispatcher — see More tools.
my-org/analytics) needed when creating or connecting
transformations.
connect_transformations_to_github
Reached through the dispatcher — see More tools.
More tools
A long tool list measurably degrades how accurately an agent picks the right tool, so seven rarely-used tools are kept off the main list. They remain fully available through two dispatcher tools, and they are documented in their own sections above.get_tool_details
With no argument, returns a catalog of every tool kept off the main list. With a tool name, returns
that tool’s full documentation and input schema, plus whether it writes or is destructive — so your
agent can confirm with you before firing a write.
run_tool
Runs one of those tools by name, passing the arguments built from its schema. Two-phase tools behave
exactly as documented — call again with confirm: true in the arguments to commit.
The tools reached this way:
Once your session uses one of these, it becomes directly callable for the rest of that session — you
only pay the extra discovery step the first time.
Changed tool names
Several tools were merged into generic versions that take akind argument. The old names no
longer exist. If you have saved skills, automations, or prompts that call them, update them using
this table — the arguments are otherwise unchanged.
list_pipeline_options is the one tool that was removed rather than renamed. It returned every
pipeline in a single unpaginated response; list_resources is paginated and filtered by kind, so
an automation that relied on getting everything at once needs its logic adjusted, not just its name
swapped.Ask your agent to do the migration for you — point it at your skill or automation files and give it
this table. It can find and update every reference in one pass.