Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

com.keboola/mcp

PYPI · KEBOOLA-MCP-SERVER · 2 COMPONENTS · SCANNED SEP 21

Connect your AI assistants to Keboola and expose your data, transformations, SQL queries, ...

+27 this week 61 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security37
  • Malware scan not yet available for this package.Unverified
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Install-script risk not yet assessed.Unverified
  • 2 of 52 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency32
Schema Quality & AI Usability73
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 26108 tokens (~593/item across 44 items; 44 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management90
  • Stability observed for 27 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (98% of tools); any adoption earns full credit.Pass
Tool Safety88
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 2 of 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "run_sync_action" implies "execute" and declares readOnlyHint instead, contradicting what its own name says it does. See how to fix → Partial
  • An AI judge read all 45 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Install

How do I install the com.keboola/mcp server?

com.keboola/mcp runs locally as a PyPI package, launched with uvx keboola-mcp-server. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · keboola-mcp-server

# add to Claude Code
claude mcp add com-keboola-mcp -- uvx keboola-mcp-server
// .cursor/mcp.json
{
  "mcpServers": {
    "com-keboola-mcp": {
      "command": "uvx",
      "args": [
        "keboola-mcp-server"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "com-keboola-mcp": {
      "command": "uvx",
      "args": [
        "keboola-mcp-server"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add com-keboola-mcp -- uvx keboola-mcp-server
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-keboola-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "keboola-mcp-server"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add com-keboola-mcp --command uvx --arg keboola-mcp-server
# ~/.hermes/config.yaml
mcp_servers:
  com-keboola-mcp:
    command: "uvx"
    args: ["keboola-mcp-server"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "com-keboola-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "keboola-mcp-server"
      ]
    }
  }
}
# add to Vellum
assistant mcp add com-keboola-mcp -t stdio -c uvx -a keboola-mcp-server
// mcp.json
{
  "mcpServers": {
    "com-keboola-mcp": {
      "command": "uvx",
      "args": [
        "keboola-mcp-server"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 21 Sept 26 +10
    • Malware scan: pass → unverified security
    • Injection markers: unverified → pass security
    • First check of Judged manipulation: pass security
    • Tool coverage: unverified → 100 functional
    • Schema quality: unverified → 100 functional
    • First check of Schema quality: fail functional
    • First check of Schema quality: excellent functional
    • First check of Schema quality: fail functional
    • First check of Destructive annotations: 50 functional
    • First check of Tool coverage: 98 functional
    • First check of Tool coverage: 100 functional
    • MCP protocol: Implements a current MCP spec version (2026-07-28). functional
    • Stability: pass → 0.90 functional
    • Package version: 1.81.1 → 1.86.0 functional
  • 20 Sept 26 +1
    • Stability: 0.97 → pass security
  • 19 Sept 26 −1
    • Stability: pass → 0.97 functional
  • 18 Sept 26 +1
    • Stability: 0.97 → pass security
  • 16 Sept 26 +1
    • Package version: 1.80.1 → 1.81.1 functional
  • 15 Sept 26 +15
    • Malware scan: unverified → pass security
  • 14 Sept 26 −14
    • Malware scan: pass → unverified security
  • 12 Sept 26 −3
    • Stability: pass → 0.80 functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 21 Sept 2026 · Analysed pypi/keboola-mcp-server@1.86.0

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem pypi

Background: How many MCP packages publish verified provenance →

Dependencies 52 packages
Packages resolved 52
Stale 1
No linked repository 1
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 44 exposed · ~25,755 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
add_config_row ~489

Creates a component configuration row in the specified configuration_id, using the specified name, component ID, configuration JSON, and description. BEFORE CALLING - REQUIRED STEPS: 1. Call `get_components([component_id])` to retrieve the component's `configuration_row_schema`. 2. Read `configuration_row_schema.required` to find ALL mandatory top-level fields. 3. Call `get_config_examples(component_id)` to see real-world row parameter examples. 4. Populate `parameters` with every required field before calling this tool. Skipping these steps will cause a schema validation error. USAGE: - Use when you want to create a new row configuration for a specific component configuration. WHEN NOT TO USE: - `keboola.orchestrator` / `keboola.flow` → use `create_flow` / `create_conditional_flow` - `keboola.data-apps` → use `modify_python_js_data_app` / `modify_streamlit_data_app` / `deploy_data_app` - `keboola.snowflake-transformation` / `keboola.google-bigquery-transformation` → use `create_sql_transformation` EXAMPLES: - user_input: `Create a new configuration row for component X with these settings` - set the component_id, configuration_id and configuration parameters accordingly - returns the created component configuration if successful.

NameTypeReqDescription
component_idstringyesThe ID of the component for which to create the configuration.
configuration_idstringyesThe ID of the configuration for which to create the configuration row.
descriptionstringyesThe detailed description of the component configuration explaining its purpose and functionality.
namestringyesA short, descriptive name summarizing the purpose of the component configuration.
parametersobjectyesThe component row configuration parameters, adhering to the configuration_row_schema
processors_afterThe list of processors that will run after the configured component row runs.
processors_beforeThe list of processors that will run before the configured component row runs.
project_idTarget Keboola project id for this write. Required when the session is scoped to 2+ projects; optional (defaults to the single scoped project) otherwise.
storageThe table and/or file input / output mapping of the component configuration. It is present only for components that have tables or file input mapping defined
NameTypeReqDescription
change_summaryOptional summary of the change to update the agent's context.
component_idstringyesThe ID of the component.
configuration_idstringyesThe ID of the configuration.
descriptionstringyesThe description of the configuration.
linksarrayyesThe links relevant to the configuration.
successbooleanIndicates if the operation succeeded.
timestampstringyesThe timestamp of the operation.
versionintegeryesThe version number of the configuration.

No examples provided.

create_conditional_flow ~383

Creates a new conditional flow configuration using `keboola.flow`. PRE-REQUISITES: - Always use `get_flow_schema` with flow_type="keboola.flow" and review `get_flow_examples` if unknown - Gather component configuration IDs for all tasks you include RULES: - `phases` and `tasks` must follow the keboola.flow schema; each entry needs `id` and `name` - Exactly one entry phase (no incoming transitions); all phases must be reachable - Connect phases via `next` transitions; no cycles or dangling phases; empty `next` means flow end - Task/phase failures already stop the flow; add retries/conditions only if the user requests them - Always share the returned links with the user WHEN TO USE: - Flows needing branching, conditions, retries, or notifications - Default choice when user simply says "create a flow," unless they explicitly want legacy orchestrator behavior

NameTypeReqDescription
descriptionstringyesDetailed description of the flow purpose.
folderstringFolder name to organize this flow in the Keboola UI. Pass an empty string to remove an existing folder assignment. Existing folder names are returned in the response change_summary when no folder is…
namestringyesA short, descriptive name for the flow.
phasesarrayyesList of phase definitions for conditional flows.
project_idTarget Keboola project id for this write. Required when the session is scoped to 2+ projects; optional (defaults to the single scoped project) otherwise.
tasksarrayyesList of task definitions for conditional flows.
NameTypeReqDescription
change_summaryAdditional notes or hints about the operation.
component_idstringyesThe ID of the component.
configuration_idstringyesThe configuration ID of the flow.
descriptionstringyesThe description of the Flow.
linksarrayyesThe links relevant to the flow.
responseThe response message from the operation.
successbooleanIndicates if the operation succeeded.
timestampstringyesThe timestamp of the operation.
versionintegeryesThe version number of the flow configuration.

No examples provided.

create_config ~662

Creates a root component configuration using the specified name, component ID, configuration JSON, and description. Not for SQL transformations (`keboola.snowflake-transformation` / `keboola.google-bigquery-transformation`), data apps (`keboola.data-apps`) or flows — use the dedicated tools (see WHEN NOT TO USE). This IS the tool for Python (`keboola.python-transformation-v2`), R (`keboola.r-transformation-v2`) and DuckDB (`keboola.duckdb-transformation`) transformations. BEFORE CALLING - REQUIRED STEPS: 1. Call `get_components([component_id])` to retrieve the component's `configuration_schema`. 2. Read `configuration_schema.required` to find ALL mandatory top-level fields. 3. Call `get_config_examples(component_id)` to see real-world parameter examples. 4. Populate `parameters` with every required field before calling this tool. Skipping these steps will cause a schema validation error. USAGE: - Use when you want to create a new root configuration for a specific component. WHEN NOT TO USE: - `keboola.orchestrator` / `keboola.flow` → use `create_flow` / `create_conditional_flow` - `keboola.data-apps` → use `modify_python_js_data_app` / `modify_streamlit_data_app` / `deploy_data_app` - `keboola.snowflake-transformation` / `keboola.google-bigquery-transformation` → use `create_sql_transformation` EXAMPLES: - user_input: `Create a new configuration for component X with these settings` - set the component_id and configuration parameters accordingly - returns the created component configuration if successful.

NameTypeReqDescription
component_idstringyesThe ID of the component for which to create the configuration.
descriptionstringyesThe detailed description of the component configuration explaining its purpose and functionality.
namestringyesA short, descriptive name summarizing the purpose of the component configuration.
parametersobjectyesThe component configuration parameters, adhering to the configuration_schema
processors_afterThe list of processors that will run after the configured component runs.
processors_beforeThe list of processors that will run before the configured component runs.
project_idTarget Keboola project id for this write. Required when the session is scoped to 2+ projects; optional (defaults to the single scoped project) otherwise.
runtimeRuntime settings such as "parallelism" (parallel row processing) and backend configuration. Only provide if the component supports it.
storageThe table and/or file input / output mapping of the component configuration. It is present only for components that have tables or file input mapping defined
variablesVariable definitions to attach to this configuration. Each entry specifies a name, type ("string" or "vault"), and an optional default value. On creation, both `None` (omitted) and `[]` (empty list)…
NameTypeReqDescription
change_summaryOptional summary of the change to update the agent's context.
component_idstringyesThe ID of the component.
configuration_idstringyesThe ID of the configuration.
descriptionstringyesThe description of the configuration.
linksarrayyesThe links relevant to the configuration.
successbooleanIndicates if the operation succeeded.
timestampstringyesThe timestamp of the operation.
versionintegeryesThe version number of the configuration.

No examples provided.

create_flow ~349

Creates a new legacy (non-conditional) flow using `keboola.orchestrator`. PRE-REQUISITES: - Always use `get_flow_schema` with flow_type="keboola.orchestrator" and review `get_flow_examples` if unknown - Collect component configuration IDs for every task you include RULES: - `phases` and `tasks` must follow the orchestrator schema; each entry must include `id` and `name` - Phases run sequentially; tasks inside a phase run in parallel - Use `dependsOn` on phases to sequence them; reference other phase ids - Always share the returned links with the user WHEN TO USE: - Simple/linear orchestrations without branching or conditions - ETL/ELT pipelines where phases just need ordering and parallel task groups

NameTypeReqDescription
descriptionstringyesDetailed description of the flow purpose.
folderstringFolder name to organize this flow in the Keboola UI. Pass an empty string to remove an existing folder assignment. Existing folder names are returned in the response change_summary when no folder is…
namestringyesA short, descriptive name for the flow.
phasesarrayyesList of phase definitions.
project_idTarget Keboola project id for this write. Required when the session is scoped to 2+ projects; optional (defaults to the single scoped project) otherwise.
tasksarrayyesList of task definitions.
NameTypeReqDescription
change_summaryAdditional notes or hints about the operation.
component_idstringyesThe ID of the component.
configuration_idstringyesThe configuration ID of the flow.
descriptionstringyesThe description of the Flow.
linksarrayyesThe links relevant to the flow.
responseThe response message from the operation.
successbooleanIndicates if the operation succeeded.
timestampstringyesThe timestamp of the operation.
versionintegeryesThe version number of the flow configuration.

No examples provided.

create_oauth_url ~163

Generates an OAuth authorization URL for a Keboola component configuration. When using this tool, be very concise in your response. Just guide the user to click the authorization link. Note that this tool should be called specifically for the OAuth-requiring components after their configuration is created e.g. keboola.ex-google-analytics-v4 and keboola.ex-gmail.

NameTypeReqDescription
component_idstringyesThe component ID to grant access to (e.g., "keboola.ex-google-analytics-v4").
config_idstringyesThe configuration ID for the component.
project_idTarget Keboola project id for this write. Required when the session is scoped to 2+ projects; optional (defaults to the single scoped project) otherwise.
NameTypeReqDescription
resultstringyesThe OAuth authorization URL.

No examples provided.

create_project ~295

Creates a brand-new Keboola project for a session that has no Keboola credentials yet, and signs this session in to it. Use this ONLY when a tool call has reported that the session has no Keboola credentials and the user has no project/token to give you -- it is how a first-time user gets started without leaving the conversation. Never call it to add a project to a session that already works: it refuses, because it would replace the credentials that session is using. Not every Keboola stack offers this -- it is gated by a stack feature. On a stack without it the tool says so and the user has to bring their own project instead; that is a fact about the stack, so do not retry. The project starts out owned by nobody. Show the user the returned `confirm_url` and tell them to open it: signing in there makes the project permanently theirs. Until they do, the project is temporary and Keboola may reclaim it, and once they do, the session created here is revoked and they continue with their own login. Data tools work against the new project in the meantime.

NameTypeReqDescription
backendStorage backend for the new project. Omit to use whichever backend the stack's agent maintainer defaults to (Snowflake when it has both).
nameName for the new project and its organization. Defaults to "Agent project".
NameTypeReqDescription
backendstringyesThe storage backend the project was created with.
backend_init_pendingbooleanyesTrue when the storage backend is still being initialised in the background, so the first data operations may fail for a short while.
confirm_urlstringyesThe URL the human must open to claim the project. Until they do, the project is not owned by anyone and can be reclaimed by Keboola.
llm_instructionstringyesWhat to tell the user next.
project_idintegeryesThe id of the newly created project.
project_namestringyesThe name of the newly created project.

No examples provided.

create_python_js_data_app_git_credential ~580

Mints a one-time HTTPS token on a python-js **prod** data app so the caller can clone, pull, and push to the app's managed git repo over HTTPS. **Always call against the prod app's configuration_id** — drafts have no managed repo of their own, so calling this on a draft fails. The prod app is the canonical repo owner; drafts iterate against branches of that same repo. **MCP never runs git on your behalf.** All git work — clone, branch, commit, push, merge, branch-delete — is yours. This tool only mints credentials. Returns a ready-to-use `git_clone_url` of the form `https://kai:<secret>@<host>/<path>.git` plus the raw `secret`. The token is returned **only** at creation — the platform cannot return it again on any subsequent read. Stash the URL (or the secret) somewhere the LLM can reuse for the rest of the session. The data-science API accepts multiple credentials per app, so calling this again mints an additional token without invalidating any tokens already held by other clients. ## When to call 1. **Right after `modify_python_js_data_app` create of a prod app** — the new prod has a managed repo but no credentials yet. Call this tool with the new app's `configuration_id` to enable git access. (Note: when creating a **draft**, the prod-side token is minted and embedded into the returned `git_clone_url` automatically — no separate call needed.) 2. **Recovery when the cached token is gone / continuing an unfinished draft** — e.g., a fresh sandbox continuing yesterday's work, with the previous sandbox's filesystem wiped. The cached `git_clone_url` is lost; the configuration ID for the prod app is all you have. Call this tool with the **prod app's** `configuration_id` to mint a fresh token (drafts have no managed repo, so always mint against prod). Existing credentials remain valid, so other clients are not disrupted. ## Constraints - Only python-js prod data apps have a managed git repo. Streamlit apps reject the call with a clear e…

NameTypeReqDescription
configuration_idstringyesStorage configuration ID of the python-js data app.
project_idTarget Keboola project id for this write. Required when the session is scoped to 2+ projects; optional (defaults to the single scoped project) otherwise.
NameTypeReqDescription
configuration_idstringyesThe Storage configuration ID of the python-js data app.
credential_idstringyesThe ID of the created credential.
data_app_idstringyesThe ID of the data app the credential was created on.
git_clone_urlstringyesReady-to-use HTTPS clone URL with the one-time token embedded (format: `https://kai:<secret>@<host>/<path>.git`). Pass directly to `git clone`.
linksarrayyesNavigation links for the web interface.
permissionsstringyesThe permissions of the credential, e.g. "readWrite".
responsestringyesThe response of the action performed.
secretstringyesOne-time HTTPS token. Also embedded in `git_clone_url`. Surfaced separately so it can be plugged into a `git credential` helper. **The platform does not return this value again** — store it if you ne…

No examples provided.

create_sql_transformation ~842

Creates an SQL transformation using the specified name, SQL query following the current SQL dialect, a detailed description, and a list of created table names. CONSIDERATIONS: - By default, SQL transformation must create at least one table to produce a result; omit only if the user explicitly indicates that no table creation is needed. - Each SQL code block must include descriptive name that reflects its purpose and group one or more executable semantically related SQL statements. - Each SQL query statement within a code block must be executable and follow the current SQL dialect. - Use delimited identifiers for the current SQL dialect for all identifiers and FQN references. - When referring to the input tables within the SQL query, use fully qualified table names, which can be retrieved using appropriate tools. - When creating a new table within the SQL query (e.g. CREATE TABLE ...): use only the table name with delimited identifiers, without the fully qualified path; add the plain table name without delimiters to the `created_table_names` list. - Unless otherwise specified by user, transformation name and description are generated based on the SQL query and user intent. - If there are 20 or more SQL transformations in the project, consider organizing them with a folder: existing folder names are surfaced in the response's change_summary — use one of them or create a new one. USAGE: - Use when you want to create a new SQL transformation. - This is THE tool for creating `keboola.snowflake-transformation` and `keboola.google-bigquery-transformation` components (do NOT use `create_config` for these); the transformation ID is derived automatically from the workspace SQL dialect. - Snowflake/BigQuery only. For Python, R, or DuckDB transformations, use `create_config` with the appropriate `component_id` instead — this tool cannot create them. EXAMPLES: - user_input: `Can you create a new transformation out of this sql query?` - set the sql_cod…

NameTypeReqDescription
created_table_namesarrayA list of created table names if they are generated within the SQL query statements (e.g., using `CREATE TABLE ...`).
descriptionstringyesThe detailed description of the SQL transformation capturing the user intent, explaining the SQL query, and the expected output.
folderstringFolder name to organize this transformation in the Keboola UI. Pass an empty string to remove an existing folder assignment. Existing folder names are returned in the response change_summary when no…
namestringyesA short, descriptive name summarizing the purpose of the SQL transformation.
project_idTarget Keboola project id for this write. Required when the session is scoped to 2+ projects; optional (defaults to the single scoped project) otherwise.
sql_code_blocksarrayyesThe SQL query code blocks, each containing a descriptive name and an executable SQL script written in the current SQL dialect. The query will be automatically reformatted to be more readable.
variablesVariable definitions to attach to this transformation. Each entry specifies a name, type ("string" or "vault"), and an optional default value. On creation, both `None` (omitted) and `[]` (empty list)…
NameTypeReqDescription
change_summaryOptional summary of the change to update the agent's context.
component_idstringyesThe ID of the component.
configuration_idstringyesThe ID of the configuration.
descriptionstringyesThe description of the configuration.
linksarrayyesThe links relevant to the configuration.
successbooleanIndicates if the operation succeeded.
timestampstringyesThe timestamp of the operation.
versionintegeryesThe version number of the configuration.

No examples provided.

delete_python_js_data_app_draft ~326

Deletes a python-js DRAFT data app — both the data-app instance (DSAPI) and its Storage configuration. **MCP never runs git on your behalf.** Deleting the feature branch on the remote is your job; this tool only tears down the draft config and its data-app instance. WHEN TO CALL: at the end of a promote-to-prod sequence, after you have merged the draft's branch into `main`, pushed, deleted the feature branch from the remote, and redeployed the prod app. The Keboola UI lists drafts under their parent prod app; once you call this tool, the draft disappears from that list. WHAT THIS TOOL REFUSES: - prod apps (no `isDraft` flag) — protects against accidental prod deletion; - Streamlit apps — they have no draft concept. WHAT THIS TOOL DOES NOT DO: - Run git. Deleting the feature branch on the remote is your job. - Revoke the prod-side git credential minted when the draft was created. Credential rotation is the user's job via the Keboola UI. After a successful call, pivot back to the parent prod app (its configuration_id is returned in the response) or to `get_data_apps` for further work.

NameTypeReqDescription
configuration_idstringyesStorage configuration ID of the python-js draft data app to delete.
project_idTarget Keboola project id for this write. Required when the session is scoped to 2+ projects; optional (defaults to the single scoped project) otherwise.
NameTypeReqDescription
configuration_idstringyesStorage configuration ID of the deleted draft.
data_app_idstringyesData-science API ID of the deleted draft data app.
linksarrayNavigation links for the web interface.
parent_configuration_idStorage configuration ID of the parent prod app the draft was iterating against. Surfaced so the agent can pivot back to the prod app after cleanup. May be None if the draft was orphaned (parent alre…
responsestringyesStatus of the delete operation, e.g. "deleted".

No examples provided.

deploy_data_app ~520

Deploys/redeploys a data app or stops a running data app in the Keboola environment asynchronously, given the action and the configuration ID. **MCP never runs git on your behalf.** All git work — clone, branch, commit, push, merge, branch-delete — is yours. This tool only triggers deploys against existing git state. ## Mode (python-js apps) - `mode='dev'` deploys the target as a **dev version of the data app** — the runtime uses a development `setup.sh` (hot reload) and the data-app proxy enables an auto-auth path so an iframe preview can render without a manual login. Only meaningful on **draft** configs (python-js apps with `isDraft=true`). - For prod redeploys (including after merging a draft's branch into `main`), use no `mode` — the prod app picks up the current `main`. - The branch a draft deploys from is pinned in `parameters.dataApp.git.branch` at create time; there is no deploy-time override. - python-js apps do NOT fetch a Storage `configVersion` for deployment (their source lives in git, not in the Storage configuration); this is handled automatically. ## Streamlit apps Streamlit apps have no managed git repo, so `mode` has no effect on the deployed app. `mode=None` is the expected call shape. ## General considerations - Redeploying a data app takes some time, and the app may temporarily report status "stopped" during the restart. - After deployment, the deployment info includes the app URL and the latest logs to help diagnose in-app errors.

NameTypeReqDescription
actionstringyesThe action to perform.
configuration_idstringyesThe ID of the data app configuration.
modeDeployment mode. Set to "dev" to deploy a python-js draft as a **dev version of the data app** — the runtime uses a development `setup.sh` (hot reload), and the data-app proxy enables an auto-auth pa…
project_idTarget Keboola project id for this write. Required when the session is scoped to 2+ projects; optional (defaults to the single scoped project) otherwise.
NameTypeReqDescription
deployment_infoDeployment info with a link to the app and logs to diagnose in-app errors.
linksarrayyesNavigation links for the web interface.
stateyesThe state of the data app deployment.

No examples provided.

docs_query ~36

Answers a question using the Keboola documentation as a source.

NameTypeReqDescription
querystringyesNatural language query to search for in the documentation.
NameTypeReqDescription
source_urlsarrayyesList of URLs to the sources of the answer.
textstringyesText of the answer to a documentation query.

No examples provided.

find_component_id ~93

Returns list of component IDs that match the given query. WHEN TO USE: - Use when you want to find the component for a specific purpose. USAGE EXAMPLES: - user_input: "I am looking for a salesforce extractor component" → Returns a list of component IDs that match the query, ordered by relevance/best match.

NameTypeReqDescription
querystringyesNatural language query to find the requested component.
NameTypeReqDescription
resultarrayyes

No examples provided.

get_accessible_projects ~247

Lists the Keboola projects the current login can access across the stack, each with its SQL dialect and organization. Only call this when a data tool call has actually failed asking you to confirm a project scope -- the session may already be pre-scoped (e.g. the user chose specific projects at `login` time), in which case data tools already work and this call would just be extra, unnecessary API traffic. When a scope genuinely is needed: present the projects, ask whether the user wants to work across all of them or a subset, then call `set_project_scope` with their choice. This tool compacts several API calls (token introspection plus a per-project token verify for the SQL dialect and organization) into one result, so the assistant does not need a separate get_project_info call per project. Pass with_llm_instruction=true on the first call to also receive the base working instructions grouped by dialect.

NameTypeReqDescription
with_llm_instructionbooleanIf true, include the base working instructions (base_instructions), grouped by SQL dialect. Request this once at the very start of a conversation; omit it on later calls.
NameTypeReqDescription
base_instructionsThe base working instructions, grouped by SQL dialect (deduplicated across projects). Only present when the tool is called with with_llm_instruction=true; request this once at the start of a conversa…
llm_instructionstringyesGuidance for the assistant on how to use this result (distinct from base_instructions).
projectsarrayyesThe projects the current token can reach across the stack.
read_onlyWhether the current scoped token is read-only.
scope_tokenOpaque token encoding the confirmed scope, or null if none is confirmed yet. The server does not remember the scope between calls -- pass this value as the "scope_token" argument on every subsequent…
scoped_project_idsThe projects the session is currently scoped to, or null if no scope has been confirmed yet.
user_emailThe email of the authenticated user.

No examples provided.

get_buckets ~145

Lists buckets or retrieves full details of specific buckets, including descriptions, lineage references (created/updated by), and links. WHEN NOT TO USE: - Do NOT call with `bucket_ids=[]` just to find a bucket by name. Use `search` with item_types=["bucket"] instead. - Only use `bucket_ids=[]` when you need a complete inventory of all buckets in the project. EXAMPLES: - `bucket_ids=[]` → summaries of all buckets in the project - `bucket_ids=["id1", ...]` → full details of the buckets with the specified IDs

NameTypeReqDescription
bucket_idsarrayFilter by specific bucket IDs.
NameTypeReqDescription
bucket_countsBucket counts by stage.
bucketsarrayyesList of buckets.
buckets_not_foundList of bucket IDs that were not found.
linksarrayyesLinks relevant to the bucket listing.

No examples provided.

get_components ~224

Retrieves detailed information about one or more components by their IDs. RETURNS FOR EACH COMPONENT: - Component metadata (name, type, description) - Documentation and usage instructions - Configuration JSON schema (required for creating/updating configurations) - Links to component dashboard in Keboola UI WHEN TO USE: - Before creating a new configuration: fetch the component to get its configuration schema - Before updating a configuration: fetch the component to understand valid configuration options - When user asks about component capabilities or documentation PREREQUISITES: - You must know the component_id(s). If unknown, first use `find_component_id` or `docs` tool to discover them. EXAMPLES: - User: "Create a generic extractor configuration" → First call `find_component_id` to get the component_id, then call this tool to get the schema - User: "What options does the Snowflake writer support?" → Call this tool with the Snowflake writer component_id to retrieve its documentation and schema

NameTypeReqDescription
component_idsarrayyesIDs of the components
NameTypeReqDescription
componentsarrayyesThe components
linksarrayNavigation links for the web interface.

No examples provided.

get_config_examples ~110

Retrieves sample configuration examples for a specific component. USAGE: - Use before calling `create_config` or `add_config_row` to understand the expected parameters structure. - Use when you want to see example configurations for a specific component. EXAMPLES: - user_input: `Show me example configurations for component X` - set the component_id parameter accordingly - returns a markdown formatted string with configuration examples

NameTypeReqDescription
component_idstringyesThe ID of the component to get configuration examples for.
NameTypeReqDescription
resultstringyesMarkdown formatted string containing configuration examples for the component.

No examples provided.

get_configs ~509

Retrieves component configurations in the project with optional filtering. Can list summaries of multiple configurations (grouped by component) or retrieve full details for specific configurations. Returns a list of components, each containing: - Component metadata (ID, name, type, description) - Configurations for that component (summaries by default, full details if requested) - Links to the Keboola UI PARAMETER BEHAVIOR: - If configs is provided (non-empty): Returns FULL details ONLY for those configs. - Else if component_ids is provided (non-empty): Lists config summaries for those components. - Else: Lists configs based on component_types (all types if empty). WHEN TO USE: - For listing: Use component_types/component_ids. - For details: Use configs (can handle multiple). WHEN NOT TO USE: - Do NOT list all configs just to find a configuration by name. Use `search` with item_types=["configuration", "transformation"] instead. - Only use broad listing (empty component_types and component_ids) when you need a complete inventory of all configurations in the project. EXAMPLES: - List all configs (summaries): component_types=[], component_ids=[] - List extractors (summaries): component_types=["extractor"] - Get details for specific configs: configs=[{"component_id": "keboola.ex-db-mysql", "configuration_id": "12345"}]

NameTypeReqDescription
component_idsarrayFilter by specific component IDs (e.g., ["keboola.ex-db-mysql", "keboola.wr-google-sheets"]). Empty list [] uses component_types filtering instead. When provided (non-empty) and configs is empty, lis…
component_typesarrayFilter by component types. Options: "application", "extractor", "transformation", "writer". Empty list [] means ALL component types will be returned. This parameter is IGNORED when configs is provide…
configsarrayList of specific configurations to retrieve full details for. Each dict must have "component_id" (str) and "configuration_id" (str). Example: [{"component_id": "keboola.ex-db-mysql", "configuration_i…
NameTypeReqDescription
resultyes

No examples provided.

get_data_apps ~487

Lists summaries of data apps in the project given the limit and offset or gets details of a data apps by providing their configuration IDs. WHEN NOT TO USE: - Do NOT list all data apps just to find one by name. Use `search` with item_types=["data-app"] instead. - Only list all data apps when you need a complete inventory. Considerations: - If configuration_ids are provided, the tool will return details of the data apps by their configuration IDs. - If no configuration_ids are provided, the tool will list all data apps in the project given the limit and offset. - Data App detail contains configuration, metadata, source code, links, and deployment info along with the latest data app logs to investigate in-app errors. The logs may be updated after opening the data app URL. - `deployment_info.last_run` carries the outcome of the most recent deployment attempt. For an app that fails to start, check its `failure_reason`/`failure_message` FIRST — they cover setup-phase failures (e.g. invalid secrets, git clone errors, failing setup scripts) that happen before the container starts and therefore never appear in the regular logs. - `repo_url` (managed git repo URL for python-js apps) is ONLY populated on the detail path (when `configuration_ids` is provided). The inventory list always returns `repo_url=None`, even for python-js apps with a managed repo — to retrieve the URL, call this tool again with the target `configuration_ids`. - When called with `configuration_ids=[<prod-cfg>]` for a python-js **prod** app, the response includes a `drafts: [...]` array of every draft (configs with `isDraft=true` and `parentConfigurationId == <prod-cfg>`) currently in the project. Drafts in trash are not included. Use this to discover existing drafts when continuing a previously abandoned iteration (Scenario C in `modify_python_js_data_app`). The array is empty for drafts themselves and for Streamlit apps.

NameTypeReqDescription
configuration_idsarrayThe IDs of the data app configurations.
limitintegerThe limit of the data apps to fetch.
offsetintegerThe offset of the data apps to fetch.
NameTypeReqDescription
data_appsarrayyesThe data apps in the project.
linksarrayNavigation links for the web interface.

No examples provided.

get_flow_examples ~118

Retrieves examples of valid flow configurations. PRE-REQUISITES: - Unknown examples for the target flow type: `keboola.flow` (conditional) or `keboola.orchestrator` (legacy) to help build the specific flow configuration by mirroring the structure/fields. RULES: - Conditional-flow examples require conditional flows to be enabled; otherwise use legacy orchestrator examples - Present the examples or cite unavailability to the user

NameTypeReqDescription
flow_typestringyesThe type of the flow to retrieve examples for.
NameTypeReqDescription
resultstringyesExamples of the flow configurations.

No examples provided.

get_flow_schema ~125

Returns the JSON schema for the given flow type (markdown). PRE-REQUISITES: - Unknown schema for the target flow type: `keboola.flow` (conditional) or `keboola.orchestrator` (legacy) RULES: - Projects without conditional flows enabled cannot request `keboola.flow` schema - Use the returned schema to shape `phases` and `tasks` for `create_flow` / `create_conditional_flow` / `update_flow`

NameTypeReqDescription
flow_typestringyesThe type of flow for which to fetch schema.
NameTypeReqDescription
resultstringyesThe configuration schema of the specified flow type.

No examples provided.

get_flows ~160

Lists flows or retrieves full details for specific flows. WHEN NOT TO USE: - Do NOT call with `flow_ids=[]` just to find a flow by name. Use `search` with item_types=["flow"] instead. - Only use `flow_ids=[]` when you need a complete list of all flows in the project. OPTIONS: - `flow_ids=[]` → summaries of all flows in the project - `flow_ids=["id1", ...]` → full details (including phases/tasks) for those flows

NameTypeReqDescription
flow_idsarrayIDs of flows to retrieve full details for. When provided (non-empty), returns full flow configurations including phases and tasks. When empty [], lists all flows in the project as summaries.
NameTypeReqDescription
resultyes

No examples provided.

get_jobs ~1,300

Retrieves job execution information from the Keboola project. CONTEXT: Jobs in Keboola are execution records of components (extractors, transformations, writers, flows). Each job represents a single run with its status, timing, configuration, and results. TWO MODES OF OPERATION (controlled by job_ids parameter): MODE 1: GET DETAILS FOR SPECIFIC JOBS (job_ids is non-empty) - Provide one or more job IDs: job_ids=["12345", "67890"] - Returns: FULL details for each job including status, config_data, results, timing, and metadata - Ignores: All filtering/sorting parameters (status, component_id, config_id, limit, offset, sort_by, sort_order) - Use when: You know specific job IDs and need complete information about them MODE 2: LIST/SEARCH JOBS (job_ids is empty) - Leave job_ids empty: job_ids=[] - Returns: SUMMARY list of jobs (id, status, component_id, config_id, timing only - no config_data or results) - Supports: Filtering by status/component_id/config_id, pagination with limit/offset, sorting - Use when: You need to find jobs, see recent executions, or monitor job history DECISION GUIDE: - Start with MODE 2 (list) to find jobs → then use MODE 1 (details) if you need full information - If you already know job IDs → use MODE 1 directly - For monitoring/browsing → use MODE 2 with filters NOTE: Jobs cannot be found by name using the `search` tool. However, always use the filtering parameters (status, component_id, config_id) to narrow results rather than listing all jobs with no filters. If you need to find jobs for a specific configuration but only know its name, first use `search` to find the configuration ID, then filter jobs by that config_id. COMMON WORKFLOWS: 1. Find failed jobs: job_ids=[], status="error" → identify problematic job IDs → get details with MODE 1 2. Check recent runs: job_ids=[], component_id="...", limit=10 → see latest executions 3. Monitor specific job: job_ids=["123"] → poll for status and results 4. Troubleshoot config: job_ids=[], comp…

NameTypeReqDescription
component_idThe optional ID of the component whose jobs you want to list (ignored if job_ids is provided). Default = None.
config_idThe optional ID of the component configuration whose jobs you want to list (ignored if job_ids is provided). Default = None.
include_logsbooleanWhether to include execution logs for each job. Only used when job_ids is provided (MODE 1). Logs are fetched from the Storage API events endpoint using the job's runId. Default is False.
job_idsarrayIDs of jobs to retrieve full details for. When provided (non-empty), returns full job details including status, parameters, results, and metadata. When empty [], lists jobs in the project as summarie…
limitintegerThe number of jobs to list when listing (ignored if job_ids is provided), default = 100, max = 500.
log_event_typesFilter log events by type. Only used when include_logs=True. If None, all event types are included. Example: ["error"] to only show errors, ["error", "warn"] for errors and warnings.
log_tail_linesintegerMaximum number of log events to return per job (most recent first). Only used when include_logs=True. Default = 50, max = 500.
offsetintegerThe offset of the jobs to list when listing (ignored if job_ids is provided), default = 0.
sort_bystringThe field to sort the jobs by when listing (ignored if job_ids is provided), default = "startTime".
sort_orderstringThe order to sort the jobs by when listing (ignored if job_ids is provided), default = "desc".
statusstringThe optional status of the jobs to filter by when listing (ignored if job_ids is provided). If None then all statuses are included.
NameTypeReqDescription
resultyes

No examples provided.

get_project_info ~126

Retrieves structured information about the current project, including essential context and base instructions for working with it (e.g., transformations, components, workflows, and dependencies). Always call this tool at least once at the start of a conversation to establish the project context before using other tools. Reports on exactly one project; pass `project_id` to pick which when the session is scoped to 2+ projects.

NameTypeReqDescription
project_idTarget Keboola project id for this write. Required when the session is scoped to 2+ projects; optional (defaults to the single scoped project) otherwise.
NameTypeReqDescription
branch_idyesThe ID of the branch this call is operating on (default/production or a development branch).
branch_namestringyesThe name of the branch this call is operating on.
conditional_flowsbooleanyesWhether the project supports conditional flows.
is_development_branchbooleanyesTrue if this call is operating on a development branch, False if on the default/production branch. Use this to apply branch-specific guidance (e.g., FQN handling in transformations, unsupported tools…
linksarrayyesThe links relevant to the project.
llm_instructionstringyesThese are the base instructions for working on the project. Use them as the basis for all further instructions. Do not change them. Remember to include them in all subsequent instructions.
organization_idyesThe ID of the organization this project belongs to.
project_descriptionstringyesThe description of the project.
project_idyesThe id of the project.
project_namestringyesThe name of the project.
sql_dialectstringyesThe sql dialect used in the project.
toolset_restrictionsDescribes any restrictions on the available toolset implied by the user role. None if no special restrictions apply.
user_rolestringyesThe Keboola role of the current user (e.g. "admin", "developer", "guest", "readonly").
workspace_idintegeryesThe ID of the read-only Keboola workspace the MCP server uses to run SQL queries (via `query_data`). It exposes all production tables, plus the current development branch's tables when operating on a…

No examples provided.

get_semantic_context ~851

Loads semantic objects grouped by semantic object type. CONSIDERATIONS: - If a selection has empty `ids`, the tool returns all objects of that type in compact form. - If a selection has non-empty `ids`, the tool returns only those specific objects with full attributes. - `semantic_model_ids` optionally narrows the lookup to specific semantic models. - An object returned here carries `scope` ("project", "organization", or "targeted"), `project_id` (the project it was created in -- present regardless of scope), `source_project_id` (which project an "organization"-scope object came from, if known), and `target_project_ids` (the sibling projects granted read access, for "targeted" scope). This is reported only for an object that appears in the current project's listing or that was loaded by id -- an "organization"-scope object owned by another project is not surfaced by the listing path today, only via a direct id lookup. `scope` describes visibility of the metastore object itself, not whether its underlying Keboola Storage table is actually reachable from every project that can see it -- a "targeted"/"organization" object's data may still need its bucket separately shared and linked (`get_shared_buckets`/`link_shared_bucket`) before a query against it will work outside the owning project. Pass `resolve_data_location=True` to check this directly instead of inferring it from scope alone. - An object's `scope_elevation_requested_at` being set means a project has asked an organization admin to promote it from "project" to "organization" scope, and the request is still pending. Treat this as a forward-looking signal: once approved, the object (a semantic-model's promotion also carries its datasets' underlying tables along) becomes visible org-wide, which may require separately sharing the physical data too -- promotion alone does not do that automatically. WHEN TO USE: - When you already know IDs of the semantic objects you want to load an…

NameTypeReqDescription
resolve_data_locationbooleanFor semantic-dataset objects, resolve whether their underlying Storage table is actually reachable from this project and attach it as `data_location`. Off by default: it costs two extra Storage API c…
semantic_model_idsarrayOptional list of semantic model IDs to restrict loading to specific models. Empty list [] means load across all semantic models.
semantic_objectsarrayyesList of semantic object selections to load. Each item contains "object_type" and optional "ids". If "ids" is empty, all objects of that type are returned in compact form. If "ids" is non-empty, only…
NameTypeReqDescription
resultarrayyes

No examples provided.

get_semantic_schema ~81

Returns JSON schemas for the requested semantic object types. WHEN TO USE: - When you want to know the JSON schema of a semantic object type, e.g. before searching something specific.

NameTypeReqDescription
semantic_typesarrayyesList of semantic object types for which JSON schemas should be returned. Each returned item contains the requested semantic type and its metastore schema.
NameTypeReqDescription
resultarrayyes

No examples provided.

get_shared_buckets ~227

Lists buckets shared with this project by other Keboola projects that are not necessarily linked into this project yet (the Data Catalog "Shared with me" view). Use this to answer "what data is shared with this project?" or "what could I link?" — `get_buckets` only returns buckets already in this project (including already-linked ones). Results are paginated (`limit`/`offset`) because the number of shared buckets can be large for projects in big organizations — always check `total_count` and the `message` to see whether more results exist, and page through with `offset` rather than assuming a single call returns everything. Use `link_shared_bucket` to link a shared bucket returned here into this project.

NameTypeReqDescription
limitintegerMaximum number of shared buckets to return (default 50, max 100). Values outside (0, 100] are reset to the default rather than rejected.
offsetintegerNumber of shared buckets to skip, for pagination. Negative values are clamped to 0.
NameTypeReqDescription
messageHuman-readable note about pagination, e.g. when more results are available.
shared_bucketsarrayyesPage of shared buckets, per limit/offset.
total_countintegeryesTotal number of shared buckets available, independent of limit/offset.

No examples provided.

get_tables ~516

Lists tables in buckets or retrieves full details of specific tables, including fully qualified database name, column definitions, lineage references (created/updated by) and links. WHEN NOT TO USE: - Do NOT list tables across buckets just to find a table by name. Use `search` with item_types=["table"] instead — it also matches column names and descriptions. - Only use `bucket_ids` listing when you need all tables in specific known buckets. RETURNS: - With `bucket_ids`: Summaries of tables (ID, name, description, primary key). - With `table_ids`: Full details including columns, data types, and fully qualified database names. - With `table_ids` and `include_usage`: Full details plus components / transformations that use the tables in their input / output mappings. Use only when explicitly needed or evident from context; usage calculation might be demanding in big projects. COLUMN DATA TYPES: - database_native_type: The actual type in the storage backend (Snowflake, BigQuery, etc.) with precision, scale, and other implementation details - keboola_base_type: Standardized type indicating the semantic data type. May not always be available. When present, it reveals the actual type of data stored in the column - for example, a column with database_native_type VARCHAR might have keboola_base_type INTEGER, indicating it stores integer values despite being stored as text in the backend. QUERYABILITY RULE: - A table is directly queryable via query_data tool only if fullyQualifiedName is present and non-null in the response. - If fullyQualifiedName is absent or null (e.g. for linked/alias tables from other projects), the table cannot be queried via SQL from this workspace. - Do not attempt to construct or guess the FQN — it will not work. In that case, inform the user of the limitation immediately. EXAMPLES: - `bucket_ids=["id1", ...]` → summary info of the tables in the buckets with the specified IDs - `table_ids=["id1", ...]` → detailed info of the…

NameTypeReqDescription
bucket_idsarrayFilter by specific bucket IDs.
include_usagebooleanShow components / transformations where each table is used.
table_idsarrayFilter by specific table IDs.
NameTypeReqDescription
linksarrayyesLinks relevant to the table listing.
tablesarrayyesList of tables.
tables_not_foundList of table IDs that were not found.

No examples provided.

link_shared_bucket ~257

Links a bucket shared with this project (found via `get_shared_buckets`) into this project as a new local bucket, so its tables become directly queryable/joinable like any other bucket in the project. Not idempotent: calling this again with the same `target_bucket_name` fails once that name already exists, so don't retry blindly on error without checking whether the link succeeded. Note: unlike `get_buckets`, the returned bucket does not participate in this server's prod/dev branch-shading (its `branch_id` is not resolved) -- linking always targets the caller's current branch context directly.

NameTypeReqDescription
display_nameOptional display name for the linked bucket.
source_bucket_idstringyesThe ID of the shared bucket to link, from `get_shared_buckets`.
source_project_idyesThe ID of the project the shared bucket belongs to.
target_bucket_namestringyesThe name the linked bucket should have in this project.
target_stageStage for the linked bucket in this project. Defaults to the source bucket's own stage (parsed from its "in."/"out." ID prefix) — only pass this to deliberately re-stage on link.
NameTypeReqDescription
createdstringyesCreation timestamp of the bucket.
created_byConfiguration that created the bucket (component/config ID and timestamp).
data_size_bytesTotal data size of the bucket in bytes.
descriptionDescription of the bucket.
display_namestringyesThe display name of the bucket.
idstringyesUnique identifier for the bucket.
last_updated_byConfiguration that last updated the bucket (component/config ID and timestamp).
linksThe links relevant to the bucket.
namestringyesName of the bucket.
source_projectThe source Keboola project of the linked bucket, None otherwise.
stagestringyesStage of the bucket (in for input stage, out for output stage).
tables_countNumber of tables in the bucket.
updatedTimestamp of the most recent change to the bucket.

No examples provided.

modify_flow ~779

Updates an existing flow configuration (either legacy `keboola.orchestrator` or conditional `keboola.flow`) or manages schedules for this flow. PRE-REQUISITES: - Always use `get_flow_schema` (and `get_flow_examples`) for that flow type you want to update to follow the required structure and see the examples if unknown - Only pass `phases`/`tasks` when you want to replace them; omit to keep the existing ones unchanged RULES (ALL FLOWS): - `flow_type` must match the stored component id of the flow; do not switch flow types during update - `phases` and `tasks` must follow the schema for the selected flow type; include at least `id` and `name` - Tasks must reference existing component configurations; keep dependencies consistent - Always provide a clear `change_description` and surface any links returned in the response to the user - A flow can have multiple schedules for automation runs. Add/update/remove schedules only if requested. - When updating a flow or a schedule, specify only the fields you want to update, others will be kept unchanged. CONDITIONAL FLOWS (`keboola.flow`): - Maintain a single entry phase and ensure every phase is reachable; connect phases via `next` transitions - No cycles or dangling phases; failed tasks already stop the flow, so only add retries/conditions if requested LEGACY FLOWS (`keboola.orchestrator`): - Phases run sequentially; tasks inside a phase run in parallel; `dependsOn` references other phase ids - Use `continueOnFailure` or best-effort patterns only when the user explicitly asks for them WHEN TO USE: - Renaming a flow, updating descriptions, adding/removing phases or tasks, updating schedules, adjusting dependencies, or enabling/disabling flow execution

NameTypeReqDescription
change_descriptionstringyesDescription of changes made.
configuration_idstringyesID of the flow configuration.
descriptionstringUpdated flow description. Only updated if provided.
flow_typestringyesThe type of flow to update. Use "keboola.flow" for conditional flows or "keboola.orchestrator" for legacy flows. This MUST match the existing flow type.
folderFolder name to organize this flow in the Keboola UI. Pass an empty string to remove an existing folder assignment. Existing folder names are returned in the response change_summary when no folder is…
is_disabledEnable or disable the flow. Set to True to disable execution (flow won't run), False to enable execution (flow will run). Only provide if changing the status, leave as null to preserve current state.
namestringUpdated flow name. Only updated if provided.
phasesUpdated list of phase definitions.
project_idTarget Keboola project id for this write. Required when the session is scoped to 2+ projects; optional (defaults to the single scoped project) otherwise.
schedulesarrayOptional sequence of schedule requests to add/update/remove schedules for this flow. Each request must have "action": "add"|"update"|"remove". For add: include "cron_tab", "state" ("enabled"|"disable…
tasksUpdated list of task definitions.
NameTypeReqDescription
change_summaryAdditional notes or hints about the operation.
component_idstringyesThe ID of the component.
configuration_idstringyesThe configuration ID of the flow.
descriptionstringyesThe description of the Flow.
linksarrayyesThe links relevant to the flow.
responseThe response message from the operation.
successbooleanIndicates if the operation succeeded.
timestampstringyesThe timestamp of the operation.
versionintegeryesThe version number of the flow configuration.

No examples provided.

modify_python_js_data_app ~2,973

Creates or updates a python-js data app. Two-app project model. Every python-js project has a persistent **prod app** that owns the only managed git repository for the project, and zero or more **drafts** parented to that prod app. A draft is a Storage configuration with `parameters.dataApp.isDraft=true` and `parameters.dataApp.parentConfigurationId=<prod cfg id>`; it's an *external-git* app that clones the parent prod's repo at a pinned branch on every deploy. Drafts are surfaced in the Keboola UI under their parent prod app. Use `deploy_data_app(mode='dev')` to deploy a draft as a dev version of the data app (hot reload + auto-auth for iframe preview); use `delete_python_js_data_app_draft` to tear a draft down after its branch has been promoted. **MCP never runs git on your behalf.** All git work — clone, branch, commit, push, merge, branch-delete — is yours. MCP gives you authenticated clone URLs and manages configs/deploys; it never invokes git. **The draft flow below is mandatory — never edit prod source directly.** Every source-code change goes through a draft branch that the user previews and explicitly approves first. NEVER push directly to `main`: `main` only ever advances by merging an approved draft branch, and only after the user has approved that draft's preview. Three scenarios the agent has to distinguish: ## Scenario A — Create a brand-new data app 1. `modify_python_js_data_app(slug='demo')` → `(configuration_id=PROD, repo_url=R)`. PROD owns the only managed repo for this app. 2. `modify_python_js_data_app(slug='demo-draft', parent_configuration_id=PROD)` → `(configuration_id=DRAFT, repo_url=R, git_clone_url=U, branch='draft-<hex>')`. The default branch is generated fresh per draft (`draft-<hex>`) so it can never collide with a branch left behind by an earlier draft. Override with `branch=<name>` for a descriptive name — if you do, YOU own uniqueness (see step 3). 3. YOU: `git clone U`; `git checkout -b <branch>` (the repo of a…

NameTypeReqDescription
allow_main_branchbooleanInternal escape hatch for the platform to create a read-only **view draft** pinned directly to the prod app's `main` branch (used by the AI workspace in-platform preview, which needs a deployable dra…
authentication_typestringAuthentication type. "no-auth" removes authentication completely (the app becomes public -- only use it when the user explicitly asks for a public app; it is rejected on drafts, which inherit the pro…
auto_suspend_after_secondsintegerNumber of seconds after which the running data app is automatically suspended.
branchGit branch of the data app, written to `parameters.dataApp.git.branch`. Two uses: - **On draft create** (with `parent_configuration_id`): the branch to pin the new draft to. Defaults to a generated `…
change_descriptionstringThe description of the change when updating (e.g. "Bump image"), otherwise empty string.
configuration_idstringThe ID of existing data app configuration when updating, otherwise empty string.
descriptionstringyesDescription of the data app.
folderFolder name to organize this data app in the Keboola UI. Pass an empty string to remove an existing folder assignment. Existing folder names are returned in the response change_summary when no folder…
namestringyesName of the data app (max ~50 chars to fit DNS label limit).
parent_configuration_idStorage configuration ID of the prod python-js data app this draft will iterate against. When set on create, the new app is created as a **draft**: no managed repo is provisioned for it; instead its…
project_idTarget Keboola project id for this write. Required when the session is scoped to 2+ projects; optional (defaults to the single scoped project) otherwise.
slugURL-safe slug for the data app (used as a subdomain). Optional on create — when omitted it is auto-derived from `name` (drafts get a unique suffix). An explicit slug must be at most 63 characters (DN…
storageComplete storage configuration for the data app (input/output table mappings). Validated against the storage JSON schema. Replaces the ENTIRE storage block when updating an existing app. For data app…
NameTypeReqDescription
branchDraft branch the new draft is pinned to (set in `parameters.dataApp.git.branch`). Only populated on the **draft create path** — defaults to a freshly generated `draft-<hex>` when the caller does not…
change_summaryAdditional notes or hints about the operation.
data_appobjectyesThe data app.
git_clone_urlReady-to-use authenticated HTTPS clone URL embedding the freshly-minted prod-app token (format: `https://kai:<secret>@<host>/<path>.git`). Only populated on the **draft create path** — the token was…
linksarrayyesNavigation links for the web interface.
repo_urlHTTPS clone URL of the managed git repo (without embedded credentials). Returned on create so the caller can clone the repo and push initial source code. On update, populated when the repo info can b…
responsestringyesThe response of the action performed with potential additional information.

No examples provided.

modify_streamlit_data_app ~742

Creates or updates a Streamlit data app. Considerations: - The `source_code` parameter must be a complete and runnable Streamlit app. It must include a placeholder `{QUERY_DATA_FUNCTION}` where a `query_data` function will be injected. This function queries the workspace to get data, it accepts a string of SQL query following current sql dialect and returns a pandas DataFrame with the results from the workspace. - Write SQL queries so they are compatible with the current workspace backend, you can ensure this by using the `query_data` tool to inspect the data in the workspace before using it in the data app. - If you're updating an existing data app, provide the `configuration_id` parameter and the `change_description` parameter. To keep existing data app values during an update, leave them as empty strings, lists, or None appropriately based on the parameter type. - After creating or updating a data app with this tool, ALWAYS call `deploy_data_app(action="deploy", configuration_id=...)` to start a new app or restart an existing app so changes take effect. Without this step, a newly created app will not start, and an existing app will keep running the previous deployment without the latest changes. - New apps use the HTTP basic authentication by default for security unless explicitly specified otherwise; when updating, set `authentication_type` to `default` to keep the existing authentication type configuration (including OIDC setups) unless explicitly specified otherwise. SQL & DATA TYPE RULES: - Use delimited identifiers for the current SQL dialect for all column names and aliases in SQL. Match the exact identifier case used in SQL when referencing columns in Python code. - `query_data` RETURNS ALL COLUMNS AS STRINGS regardless of SQL CAST. Always convert types in Python after loading: `df["col"] = pd.to_numeric(df["col"], errors="coerce").fillna(0)` and `df["date"] = pd.to_datetime(df["date"], errors="coerce")`.

NameTypeReqDescription
authentication_typestringyesAuthentication type, "no-auth" removes authentication completely, "basic-auth" sets the data app to be secured using the HTTP basic authentication, and "default" keeps the existing authentication typ…
change_descriptionstringThe description of the change when updating (e.g. "Update Code"), otherwise empty string.
configuration_idstringThe ID of existing data app configuration when updating, otherwise empty string.
descriptionstringyesDescription of the data app.
folderFolder name to organize this data app in the Keboola UI. Pass an empty string to remove an existing folder assignment. Existing folder names are returned in the response change_summary when no folder…
namestringyesName of the data app (max ~50 chars to fit DNS label limit).
packagesarrayyesPython packages used in the source code that will be installed by `pip install` into the environment before the code runs. For example: ["pandas", "requests~=2.32"].
project_idTarget Keboola project id for this write. Required when the session is scoped to 2+ projects; optional (defaults to the single scoped project) otherwise.
source_codestringyesComplete Python/Streamlit source code for the data app.
NameTypeReqDescription
change_summaryAdditional notes or hints about the operation.
data_appobjectyesThe data app.
linksarrayyesNavigation links for the web interface.
responsestringyesThe response of the action performed with potential additional information.

No examples provided.

query_data ~1,054

Executes an SQL SELECT query to get the data from the underlying database. BEFORE QUERYING: * Always verify the table has a non-null fullyQualifiedName from get_tables tool. If it does not, the table is not SQL-accessible from this workspace — do not attempt the query and inform user. CRITICAL SQL REQUIREMENTS: * ALWAYS check the SQL dialect before constructing queries. * Do not include any comments in the SQL code * Use delimited identifiers and FQN format for the current SQL dialect. TABLE AND COLUMN REFERENCES: * Always use fully qualified table names in the exact FQN format provided by table information tools * Follow the identifier structure exactly as shown by table info tools for the current SQL dialect * For every column reference, call get_tables first and copy that column's `quotedName` value VERBATIM. Do not guess the name, re-case it, or hand-quote it yourself — use the exact `quotedName` from get_tables. * Snowflake case trap: unquoted identifiers fold to UPPERCASE while quoted identifiers are case-sensitive, so hand-quoting a guessed lowercase name (e.g. "date") fails with `invalid identifier` even though the column physically exists as DATE. The `quotedName` from get_tables already carries the correct case and dialect quoting, so copying it avoids this. CTE (WITH CLAUSE) RULES: * ALL column references in main query MUST match exact case used in the CTE * If you alias a column in a CTE, reference it under the aliased name in the subsequent queries * Define all column aliases explicitly in CTEs * Use delimited identifiers in both CTE definition and references to preserve case FUNCTION COMPATIBILITY: * Check data types before using date functions (DATE_TRUNC, EXTRACT require proper date/timestamp types) * Cast VARCHAR columns to appropriate types before using in date/numeric functions ERROR PREVENTION: * Keboola Storage stores empty cells as empty strings ('') rather than NULL — even for columns reported as VARCHAR/STRING with nullabl…

NameTypeReqDescription
query_namestringyesA concise, human-readable name for this query based on its purpose and what data it retrieves. Use normal words with spaces (e.g., "Customer Orders Last Month", "Top Selling Products", "User Activity…
query_refOpaque correlation token chosen by the agent. Pass the SAME value to validate_semantic_query so the client can pair this result with its semantic validation. Purely a passthrough; it does not affect…
sql_querystringyesSQL SELECT query to run.
NameTypeReqDescription
csv_datastringyesThe retrieved data in CSV format
messageA message from the query execution
query_namestringyesThe name of the executed query
query_refCorrelation token echoed from the request.

No examples provided.

run_job ~120

Starts a new job for a given component or transformation.

NameTypeReqDescription
component_idstringyesThe ID of the component or transformation for which to start a job.
configuration_idstringyesThe ID of the configuration for which to start a job.
configuration_row_idsOptional list of configuration row IDs to run. If not provided, all rows are executed.
project_idTarget Keboola project id for this write. Required when the session is scoped to 2+ projects; optional (defaults to the single scoped project) otherwise.
NameTypeReqDescription
component_idThe ID of the component that the job is running on.
config_dataThe data of the configuration.
config_idThe ID of the component configuration that the job is running on.
config_rowThe configuration row ID.
created_timeThe creation time of the job.
duration_secondsThe duration of the job in seconds.
end_timeThe end time of the job.
idstringyesThe ID of the job.
is_finishedbooleanWhether the job is finished.
linksarrayyesThe links relevant to the job.
logsExecution log events for the job, populated when include_logs=True.
resultThe results of the job.
run_idThe ID of the run that the job is running on.
start_timeThe start time of the job.
statusstringyesThe status of the job.
urlstringyesThe URL of the job.

No examples provided.

run_sync_action ~165

Executes a synchronous action for a component configuration or a component row configuration. WHEN TO USE: - For finding available values of a configuration field - For validating already configured values (e.g. testing a database connection) - For listing remote resources such as endpoints, schemas or tables

NameTypeReqDescription
action_namestringyesThe sync action to execute (e.g., "testConnection", "getTables").
component_idstringyesThe ID of the component (e.g., "keboola.ex-db-mysql").
configuration_idstringyesThe ID of the configuration to use for the sync action.
configuration_row_idOptional row ID for row-level actions. When provided, the row parameters and storage are shallow-merged on top of root config.
NameTypeReqDescription
resultyes

No examples provided.

search ~2,126

Searches for Keboola items (tables, buckets, components, configurations, transformations, flows, data-apps, etc.) in the current project and returns matching ID + metadata. This tool supports two complementary search types: 1) textual - Searches items by name, server-side (fast, independent of project size). - Tokenized full-text name matching, case- and diacritics-insensitive. Pass the plain name; do NOT build regex (rejected). It is NOT typo-corrected — misspellings may not match. - Prefers the current branch context; when nothing is found there, automatically widens the search to all branches of the project — such hits carry `branch_id`/`branch_name` so you can tell where they live. 2) config-based - Searches item configurations (JSON objects) by matching patterns against the configuration values converted to a string, optionally narrowed by JSON path `scopes`. - Returns also `match_scopes` with JSON paths and matched patterns per scope. THIS IS THE PRIMARY DISCOVERY TOOL. Always use it BEFORE any get_* tool when you need to find items by name or specific configuration content. Do NOT enumerate items with get_buckets, get_tables, get_configs, get_flows, or get_data_apps just to locate a specific item — use this tool instead. WHEN TO USE: - User asks to "find", "locate", or "search for" something by name, keyword, text pattern, configuration content or value - User mentions a partial name and you need to find the full item (e.g., "find the customer table") - User asks "what tables/configs/flows do I have with X in the name?" - You need to discover items before performing operations on them - User asks to "list all items with [name] or [configuration value/part] in it" - User asks where a value, table, component, specific configuration ID, or specific settings is used in components, data-apps, flows, or transformations - You need to trace lineage by searching for IDs referenced in configurations, or to find flows using a specific component, or find us…

NameTypeReqDescription
item_typesarrayFilter for specific Keboola item types. Common values: "table" (data tables), "bucket" (table containers), "transformation" (SQL/Python transformations), "component" (extractor/writer/application com…
limitintegerMaximum number of items to return (default: 50, max: 100).
modestringHow to interpret patterns. Applies to config-based search only: "regex" for regular expressions or "literal" for exact text (default: "literal"). Ignored by textual search, which is always a tokenize…
offsetintegerNumber of matching items to skip for pagination (default: 0).
patternsarrayyesOne or more search patterns. For textual search they match item names (server-side, tokenized full-text); for config-based search they match the configuration JSON content. Case-insensitive by defaul…
scopesarrayJSONPath expressions to narrow config-based search to specific parts of the configuration. Simple dot-notation (e.g. "parameters", "storage.input") and full JSONPath (e.g. "$.tasks[*]") are both supp…
search_typestringSearch mode: "textual" (name/id/description) or "config-based" (stringified configuration payloads). (default: "textual")
NameTypeReqDescription
branch_scopestringBranch scope the hits come from. 'all-branches' means nothing was found in the current branch context and the search was widened to the whole project; check each hit's branch_id/branch_name to see wh…
by_typeobjectNumber of matching items per item type (before pagination and client-side narrowing).
hitsarrayyesThe matching items (paginated).
totalintegeryesApproximate total number of matching items before pagination; treat it as an upper bound on the items reachable via pagination. With multiple patterns, an item matching more than one pattern is count…

No examples provided.

search_semantic_context ~706

Searches semantic models and semantic objects using regex patterns matched against their names, descriptions and stringified JSON attributes. Returns compact matches grouped by semantic model. Each match includes the semantic object type, the paths where the patterns matched, and compact object view. CONSIDERATIONS: - The search is case-insensitive by default. Use `case_sensitive=True` when exact casing matters. - The search is performed against semantic object names and data attributes which are stringified JSON objects following their corresponding JSON schema. - The search can be scoped to specific semantic models or semantic object types but prefer broader search without scoping unless required by the context. - Matches carry the same `scope`/`project_id`/`source_project_id`/`target_project_ids` fields as `get_semantic_context` -- see that tool's CONSIDERATIONS for what they mean and imply. WHEN TO USE: - When you need to discover which semantic objects are relevant to a user request. - When you know business terms, column names, metric fragments, or rule names, but not exact object UUIDs. - When you need to find semantic objects by keyword or values used in their attributes. WHEN NOT TO USE: - When you know the exact IDs. EXAMPLES: - Find semantic objects by business concepts for revenue or sales: `patterns=["revenue", "sales"]` - Find semantic objects using a Keboola table ID: `patterns=["out.c-sales-main.fact_orders"]` - Find semantic dataset for a certain table: `patterns=["in.c-sales-main.fact_orders"], semantic_types=["semantic-dataset"]` - Find semantic datasets that mention a column name: `patterns=["column_name"], semantic_types=["semantic-dataset"]` - Search semantic objects e.g. semantic metrics, relationships, and constraints using a certain semantic dataset: `patterns=["table-id-of-the-dataset"], semantic_types=["semantic-metric",` `"semantic-relationship", "semantic-constraint"]` - Search semantic constraints using e.g. certain se…

NameTypeReqDescription
case_sensitivebooleanWhether regex matching should be case-sensitive. Leave false for normal discovery; set true only when exact casing matters.
max_resultsintegerMaximum number of matched semantic objects to return. Use a smaller value for quick discovery and a larger value only when you need a broader result set.
patternsarrayyesOne or more regex patterns used to search semantic metadata. The search checks semantic model names plus semantic object names and nested attribute values. Use multiple patterns when you need to find…
semantic_model_idsarrayOptional list of semantic model IDs to restrict the search to specific models. Empty list [] means search across all semantic models.
semantic_typesarrayOptional semantic object types to search. Empty list [] means ALL semantic object types are searched. Use this to narrow the search when you already know whether you want datasets, metrics, relations…
NameTypeReqDescription
resultarrayyes

No examples provided.

set_project_scope ~247

Scopes the current session to a set of Keboola projects. Mints a scoped access token (narrowed to `project_ids`, optionally read-only) that is used for the rest of the conversation. Read-only tools then run against every scoped project in a single call; write/modify/delete tools take a `project_id` argument naming which scoped project to target (required once 2+ projects are scoped). Call this when the user states which projects to work on; it can be called again any time to re-scope. On most transports the server does not remember this scope between calls: pass the returned `scope_token` as the `scope_token` argument on every subsequent tool call in this conversation to keep it in effect. Not needed for a local server or an OAuth-authenticated session, both of which persist the confirmed scope server-side instead -- `scope_token` is null there.

NameTypeReqDescription
project_idsThe project ids to scope the session to. Omit or pass null to scope to ALL accessible projects.
read_onlybooleanIf true, mint a read-only scoped token (no write operations in any scoped project).
NameTypeReqDescription
llm_instructionstringyesGuidance for the assistant on the new scope.
project_idsarrayyesThe projects the session is now scoped to.
read_onlybooleanyesWhether the scoped token is read-only.
scope_tokenOpaque token encoding this scope, or null for an OAuth-authenticated session (the server persists the scope itself in that case -- no need to resend it). Otherwise, pass this value as the "scope_toke…

No examples provided.

Common questions

What is the com.keboola/mcp server?

com.keboola/mcp is listed in the public MCP registry as com.keboola/mcp. Connect your AI assistants to Keboola and expose your data, transformations, SQL queries, ... This page covers its PyPI package (keboola-mcp-server).

Is the com.keboola/mcp server safe to use?

com.keboola/mcp scores 61 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 21 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the com.keboola/mcp server expose?

com.keboola/mcp exposes 44 tools: get_components, get_configs, get_config_examples, create_config, update_config, and 39 more. Their descriptions and schemas cost roughly 25,755 tokens of context every time the server is loaded.

Is the com.keboola/mcp server still maintained?

com.keboola/mcp is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.