Keboola
Connect your AI assistants to Keboola and expose your data, transformations, SQL queries,...
Connector by keboola.comOfficial · Domain verified by the MCP Registry
Install
Works with Claude Code, VS Code, Codex, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.
npx agentmarket install connector/keboola-com-mcp
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Remote endpoint
https://mcp.us-east4.gcp.keboola.com/mcpRemote (HTTP)
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: data-pipelines, database-access
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list and install config. Checked Oct 25, 2026.
- Tools
- 24 read · 10 write · 13 delete
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Python package
Tools by what they do 47
Read from the source code; the running server may list different tools.
Read 24 · Look things up without changing anything.
docs_queryfind_component_idget_accessible_projectsget_bucketsget_componentsget_config_examplesget_configsget_data_app_preview_linkget_data_appsget_flow_examplesget_flow_schemaget_flows
Show 12 more tools
get_jobsget_project_infoget_semantic_contextget_semantic_schemaget_shared_bucketsget_streamsget_tablesquery_datasearchsearch_semantic_contextset_project_scopevalidate_semantic_query
Write 10 · Create, change, send or run things.
add_config_rowcreate_conditional_flowcreate_configcreate_flowcreate_oauth_urlcreate_projectcreate_python_js_data_app_git_credentialcreate_sql_transformationcreate_streamlink_shared_bucket
Delete 13 · Delete, drop, revoke or wipe things.
delete_python_js_data_app_draftdeploy_data_appmodify_flowmodify_python_js_data_appmodify_streamlit_data_apprun_jobrun_sync_actionupdate_configupdate_config_rowupdate_descriptionsupdate_flowupdate_project_description
Show 1 more tools
update_sql_transformation
Network hosts it talks to 1
mcp.us-east4.gcp.keboola.com· found in remote endpoint, install command
Files it touches
- Any path the agent passes to its tools
Tools (47)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
add_config_rowCreates 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…
create_conditional_flowCreates 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 …
create_configCreates 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_schem…
create_flowCreates 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 orchestrati…
create_oauth_urlGenerates 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.
create_projectCreates a brand-new Keboola project for a session that has no Keboola credentials yet, and signs this session in to it. Use this when the user has no Keboola project to work in -- it is how a first-time user gets started without leaving the conversation. Whether a given caller may create a project is Keboola's decision, not this tool's; on a locally run server it does refuse when the session is already signed in, because that server keeps only one session per stack and would overwrite it. Not every Keboola stack offers this -- it is gated by a stack feature. On a stack without it the tool sa…
create_python_js_data_app_git_credentialMints 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>@<ho…
create_sql_transformationCreates 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 d…
create_streamCreates a Data Stream: a source with an endpoint receiving events and the sinks storing them in tables. - source_type="http": one sink into `table_id` with the given `columns`. Send events as HTTP POST requests (any body, JSON recommended) to the returned `endpoint_url`. - source_type="otlp": three sinks storing logs, metrics and traces into the tables "in.c-otlp-<source_id>.logs|metrics|traces". Configure the OpenTelemetry SDK/Collector OTLP/HTTP exporter: OTEL_EXPORTER_OTLP_ENDPOINT=<otlp_base_url> and OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer <otlp_secret>". Rows appear in th…
delete_python_js_data_app_draftcan change or delete dataDeletes 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 REFUS…
deploy_data_appcan change or delete dataDeploys/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 o…
docs_queryread-onlyAnswers a question using the Keboola documentation as a source.
find_component_idread-onlyReturns 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.
get_accessible_projectsread-onlyLists 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…
get_bucketsread-onlyLists 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
Show 32 more tools
get_componentsread-onlyRetrieves 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 Components that cannot be retrieved are listed in `not_found` (missing) or `errors` (server-side, retryable); the call fails only if none of them can be retrieved. WHEN TO USE: - Before creating a new configuration: fetch the component to get its configuration schema - Before updating a …
get_config_examplesread-onlyRetrieves 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
get_configsread-onlyRetrieves 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. Configs that cannot be retrieved are listed in `not_found` (missing) or `errors` (se…
get_data_app_preview_linkread-onlyCreates a short-lived link that opens a dev-mode data app in your browser without the app's login. Use it to see or test a python-js **draft** deployed with `deploy_data_app(action='deploy', mode='dev')`. - Only a python-js draft reaches dev mode: a Streamlit app has no managed git repo and its image has no dev mode. - An app that is not in dev mode has no preview link. ## How to use the link - Open `url` in a real browser before `link_expires_at` (about 60 seconds after this call): a browser tool, or a headless browser CLI run from your shell. Do not fetch it with an HTTP client or curl…
get_data_appsread-onlyLists 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 co…
get_flow_examplesread-onlyRetrieves 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
get_flow_schemaread-onlyReturns 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`
get_flowsread-onlyLists 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; flows that cannot be retrieved are listed in `not_found` (missing) or `errors` (server-side, retryable), and the call fails only if none of them can be retrieved; a flow whose …
get_jobsread-onlyRetrieves 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 - Jobs that cannot be retrieved are listed in `not_found` (missing…
get_project_inforead-onlyRetrieves 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.
get_semantic_contextread-onlyLoads 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 …
get_semantic_schemaread-onlyReturns 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.
get_shared_bucketsread-onlyLists 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…
get_streamsread-onlyRetrieves the Data Streams in the project: sources receiving events and the sinks writing them to tables. Data Streams receive events over HTTP (webhooks, apps) or OTLP (OpenTelemetry logs/metrics/traces) and store them in Storage tables in near real time, without any component configuration. Each stream includes its `endpoint_url` (with the secret embedded) and, for OTLP, `otlp_base_url` plus `otlp_secret`. Give these only to the user who asked; they authenticate writes into the project. Sessions with read-only access get them hidden (`secret_redacted=true`). If Data Streams are not enable…
get_tablesread-onlyLists 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,…
link_shared_bucketLinks 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 directl…
modify_flowcan change or delete dataUpdates 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 sel…
modify_python_js_data_appcan change or delete dataCreates or updates a python-js data app. Python-js is the default type for new data apps when you can run git: this tool only creates the configuration and the repository, and you deliver the source code by `git push`. Use `modify_streamlit_data_app` instead when you cannot run git or when the user asks for Streamlit explicitly. 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` an…
modify_streamlit_data_appcan change or delete dataCreates or updates a Streamlit data app. <!-- directory:omit --> Python-js is the default type for new data apps when you can run git: create them with `modify_python_js_data_app` (python-js source code is delivered only by `git push`). Use this tool to create a new app when you cannot run git or when the user asks for Streamlit explicitly, and to update existing Streamlit apps. <!-- /directory:omit --> <!-- directory:only --> Use this tool to create new data apps and to update existing Streamlit apps. Other data apps cannot be changed here; tell the user so. <!-- /directory:only --> Conside…
query_dataread-onlyExecutes an SQL SELECT query to get the data from the underlying database. Only one read-only statement is accepted: SELECT or WITH ... SELECT, and on Snowflake also SHOW, DESCRIBE or EXPLAIN (BigQuery has none of these; query INFORMATION_SCHEMA instead). Anything else, including multiple statements, is rejected before it reaches the 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 ch…
run_jobcan change or delete dataStarts a new job for a given component or transformation.
run_sync_actioncan change or delete dataExecutes a synchronous action for a component configuration or a component row configuration. Effects depend on the component and action; execution can modify external resources. 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
searchread-onlySearches 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 …
search_semantic_contextread-onlySearches 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 t…
set_project_scoperead-onlyScopes 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…
update_configcan change or delete dataUpdates an existing root component configuration by modifying its parameters, storage mappings, name or 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 updating Python (`keboola.python-transformation-v2`), R (`keboola.r-transformation-v2`) and DuckDB (`keboola.duckdb-transformation`) transformations. This tool allows PARTIAL parameter updates - you only need to provide the fields you want to change. All other f…
update_config_rowcan change or delete dataUpdates an existing component configuration row by modifying its parameters, storage mappings, name, or description. This tool allows PARTIAL parameter updates - you only need to provide the fields you want to change. All other fields will remain unchanged. Configuration rows are individual items within a configuration, often representing separate data sources, tables, or endpoints that share the same component type and parent configuration settings. WHEN TO USE: - Modifying row-specific parameters (table sources, filters, credentials, etc.) - Updating storage mappings for a specific row (in…
update_descriptionscan change or delete dataUpdates the description for a Keboola storage item. This tool supports three item types, inferred from the provided item_id: - bucket: item_id = "in.c-bucket" - table: item_id = "in.c-bucket.table" - column: item_id = "in.c-bucket.table.column" Usage examples (payload uses a list of DescriptionUpdate objects): - Update a bucket: updates=[DescriptionUpdate(item_id="in.c-my-bucket", description="New bucket description")] - Update a table: updates=[DescriptionUpdate(item_id="in.c-my-bucket.my-table", description="New table description")] - Update a column: updates=[DescriptionUpdate(item…
update_flowcan change or delete dataUpdates an existing flow configuration (either legacy `keboola.orchestrator` or conditional `keboola.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 `…
update_project_descriptioncan change or delete dataUpdates the description of the current Keboola project.
update_sql_transformationcan change or delete dataUpdates an existing SQL transformation configuration by modifying its SQL code, storage mappings, name or description. This tool allows PARTIAL parameter updates for transformation SQL blocks and code - you only need to provide the operations you want to perform. All other fields will remain unchanged. Use this for modifying SQL transformations created with create_sql_transformation. WHEN TO USE: - SQL transformations only (Snowflake/BigQuery); use update_config for Python/R/DuckDB transformations - Modifying SQL queries in transformation (add/edit/remove SQL statements) - Updating transform…
validate_semantic_queryread-onlyPerforms best-effort semantic validation of an SQL query against one or more semantic models and compares it with the expected semantic objects provided. RETURNS: - `validation_auto_detected`: semantic validation built from objects heuristically detected in the SQL - `validation_detected_from_expected`: semantic validation built only from explicitly provided expected object IDs - expected semantic objects that were matched or missing in the auto-detected result - unexpected auto-detected objects outside the expected semantic scope LIMITATIONS: - Detection is heuristic and based on string mat…
Compare and alternatives
Featured in
Signals
- Stars
- 85
- Forks
- 24
- Open issues
- 17
- Contributors
- 42
- Weekly downloads
- 916
- Last commit
- Oct 24, 2026 (4 days ago)
- Last release
- Oct 22, 2026 (6 days ago)
- Last package publish
- Oct 22, 2026 (6 days ago)
From GitHub (fetched Oct 24, 2026) and the package registry.
Details
- Registry name
com.keboola/mcp- Version
- 1.105.1
- Auth
- Auth not stated
- Packages
- pypi keboola-mcp-server
- License
- MIT
- Repository
- github.com/keboola/mcp-server
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
Cite this page
Keboola MCP server. Agent Mart. https://agentmart.dev/connectors/keboola-com-mcp (last updated 2026-10-24)