IBM watsonx.data MCP Server
OfficialThe IBM watsonx.data MCP Server enables AI assistants to interact with IBM watsonx.data lakehouses, providing tools across platform management, engine operations, catalog management, query execution, Spark applications, and data ingestion.
Platform Management
Retrieve instance details including status, version, region, enabled features, and console URL.
Engine Operations
List available Presto, Prestissimo, and Spark engines.
Create new Presto, Prestissimo, or Spark engines with custom configurations (including autoscaling).
Pause, resume, and restart Presto, Prestissimo, and Spark engines.
Scale engines by adjusting node counts and types.
Update engine configuration, display name, description, and tags.
Catalog & Schema Management
List schemas within a catalog and tables within a schema.
Describe tables with detailed column definitions, types, and metadata.
Create new schemas in object storage catalogs (Presto/Prestissimo only).
Add columns to existing tables, rename columns, and rename tables.
Query Execution
Execute SELECT, INSERT, and UPDATE queries.
Explain query execution plans (logical, distributed, validate, IO) without running them.
Analyze queries with detailed execution statistics and performance data.
Spark Application Management
Submit JAR, Python, or R Spark applications with configurable resources and credentials.
List, monitor status of, and stop Spark applications.
Data Ingestion
Create ingestion jobs from object storage (CSV, Parquet, JSON, ORC, Avro) into lakehouse tables, with configurable write modes, delimiters, encoding, and Spark resources.
List, check status of, and cancel ingestion jobs.
Provides tools for managing Presto engines, executing queries, and exploring data in IBM watsonx.data lakehouses.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@IBM watsonx.data MCP Server show tables in the finance catalog"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
IBM watsonx.data MCP Server
Overview
The IBM watsonx.data MCP Server enables AI assistants to interact seamlessly with IBM watsonx.data lakehouses using natural language. It provides specialized tools across 6 categories for comprehensive lakehouse operations:
Platform Management: Instance status and configuration
Engine Operations: Manage and monitor Presto and Spark engines
Catalog Management: Browse schemas, tables, and metadata; modify table structures
Query Execution: Run SELECT, INSERT, UPDATE queries with query plan analysis
Spark Applications: Submit, monitor, and manage Spark jobs
Data Ingestion: Load data from object storage into lakehouse tables
Currently, it supports stdio transport for local subprocess and streamable HTTP. For comprehensive details on transport options, including implementation guidelines and security best practices, refer to the MCP Transports Specification.
Note: IBM watsonx.data also provides a hosted remote MCP server that requires no installation. For details on using the remote server, see the Remote Querying Documentation.
Related MCP server: Watsonx.data Document Library Retrieval MCP Server
Supported Features
Core Capabilities
Multiple Tools organized into 6 functional categories (see TOOLS.md)
Platform Tools: Instance details and status
Engine Tools: Lifecycle management for Presto and Spark engines
Catalog Tools: Schema and table discovery, metadata operations, DDL operations
Query Tools: SELECT, INSERT, UPDATE execution with query plan analysis
Spark Application Tools: Submit and manage Spark applications
Ingestion Tools: Data loading from object storage (CSV, Parquet, JSON)
Security & Authentication
IBM Cloud IAM authentication with automatic token refresh
Read and write operations with appropriate access controls
Transport & Integration
Current: stdio transport, streamable HTTP
Compatible with Claude Desktop, IBM Bob, and other MCP-enabled AI assistants
Architecture Overview
flowchart LR
User --> Assistant[AI Assistant]
Assistant -->|stdio/JSON-RPC| Server[watsonx.data MCP Server]
Server -->|IAM Auth + API Calls| WX[watsonx.data Service]
WX --> Engines[Presto & Spark Engines]
Engines --> Lakehouse[Lakehouse Storage]
style Server fill:#f3e5f5,stroke:#4a148c
style WX fill:#e0f2f1,stroke:#00695c
style Engines fill:#fff3e0,stroke:#ef6c00Query Execution Flow
sequenceDiagram
participant A as AI Assistant
participant S as MCP Server
participant I as IBM Cloud IAM
participant W as watsonx.data API
participant E as Presto/Spark Engines
A->>S: Natural-language request (MCP)
S->>I: Request IAM token
I-->>S: IAM access token
S->>W: API request (catalog, SQL, schema...)
W->>E: Query execution / metadata ops
E-->>W: Results
W-->>S: Response
S-->>A: Structured MCP resultGetting Started
1. Prerequisites
Before installation, ensure you have:
Python 3.11 or higher (Download)
uv package manager (Install)
IBM Cloud account (Create Account)
watsonx.data instance (Provision Instance) and (Setup)
IBM Cloud API key (Create API Key)
Gather Instance details:
Base URL: Obtain from your watsonx.data instance:
Option 1: Copy the hostname from your browser's address bar when accessing the instance, then append
/lakehouse/apiOption 2: Navigate to instance details → Data Access Service (DAS) endpoint
Example format:
https://us-south.lakehouse.cloud.ibm.com/lakehouse/api
Instance CRN (e.g.,
crn:v1:bluemix:public:lakehouse:us-south:a/...)IAM API Key with access to watsonx.data instance, catalog and engines
2. Installation
Option 1: Using pip / pipx
pipx install ibm-watsonxdata-mcp-serverIf pipx is not installed, you can install the MCP server using pip:
pip install --user ibm-watsonxdata-mcp-serverOption 2: Development Setup
# Clone repository
git clone https://github.com/IBM/ibm-watsonxdata-mcp-server.git
cd ibm-watsonxdata-mcp-server
# Install dependencies
uv sync
# Copy example configuration
cp examples/.env.example .env
# Edit with your credentials
export WATSONX_DATA_BASE_URL=https://us-south.lakehouse.cloud.ibm.com/lakehouse/api
export WATSONX_DATA_API_KEY=your_ibm_cloud_api_key_here
export WATSONX_DATA_INSTANCE_ID=crn:v1:bluemix:public:lakehouse:us-south:a/...
# Verify installation
uv run ibm-watsonxdata-mcp-server --transport stdio3. Configure your AI Assistants
Integration with Claude Desktop
Find your Claude Desktop configuration file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
Add this to claude_desktop_config.json:
Option 1: Using pip/pipx install
First, find the full path to the installed command:
# macOS/Linux
which ibm-watsonxdata-mcp-server
# Windows (PowerShell)
where.exe ibm-watsonxdata-mcp-serverCommon installation paths:
macOS/Linux with pipx or pip --user:
~/.local/bin/ibm-watsonxdata-mcp-serverWindows with pipx:
%USERPROFILE%\.local\bin\ibm-watsonxdata-mcp-server.exeSystem-wide install:
/usr/local/bin/ibm-watsonxdata-mcp-server
Then use the full path in your config:
{
"mcpServers": {
"IBM watsonx.data MCP Server": {
"command": "/path/from/which/command/ibm-watsonxdata-mcp-server",
"args": ["--transport", "stdio"],
"env": {
"WATSONX_DATA_BASE_URL": "https://us-south.lakehouse.cloud.ibm.com/lakehouse/api",
"WATSONX_DATA_API_KEY": "your_api_key_here",
"WATSONX_DATA_INSTANCE_ID": "crn:v1:bluemix:public:lakehouse:us-south:a/..."
}
}
}
}Option 2: Using development installation
{
"mcpServers": {
"IBM watsonx.data MCP Server": {
"command": "/absolute/path/to/uv",
"args": [
"--directory",
"/absolute/path/to/mcp-watsonx-data",
"run",
"ibm-watsonxdata-mcp-server"
],
"env": {
"WATSONX_DATA_BASE_URL": "https://us-south.lakehouse.cloud.ibm.com/lakehouse/api",
"WATSONX_DATA_API_KEY": "your_api_key_here",
"WATSONX_DATA_INSTANCE_ID": "crn:v1:bluemix:public:lakehouse:us-south:a/..."
}
}
}
}Integration with IBM Bob
Find your mcp_settings.json configuration file:
~/Library/Application Support/IBM Bob/User/globalStorage/ibm.bob-code/settings/mcp_settings.json
Different version will have different path. The exact path will be found in Views and More Actions... -> MCP Servers -> Edit MCP
Option 1: Using pip/pipx install
First, find the full path:
which ibm-watsonxdata-mcp-serverThen use that path in your config:
{
"mcpServers": {
"IBM watsonx.data MCP Server": {
"command": "/path/from/which/command/ibm-watsonxdata-mcp-server",
"args": ["--transport", "stdio"],
"env": {
"WATSONX_DATA_BASE_URL": "https://us-south.lakehouse.cloud.ibm.com/lakehouse/api",
"WATSONX_DATA_API_KEY": "your_api_key_here",
"WATSONX_DATA_INSTANCE_ID": "crn:v1:bluemix:public:lakehouse:us-south:a/..."
}
}
}
}Option 2: Using development installation
{
"mcpServers": {
"IBM watsonx.data MCP Server": {
"command": "/absolute/path/to/uv",
"args": [
"--directory",
"/absolute/path/to/mcp-watsonx-data",
"run",
"ibm-watsonxdata-mcp-server"
],
"env": {
"WATSONX_DATA_BASE_URL": "https://us-south.lakehouse.cloud.ibm.com/lakehouse/api",
"WATSONX_DATA_API_KEY": "your_api_key_here",
"WATSONX_DATA_INSTANCE_ID": "crn:v1:bluemix:public:lakehouse:us-south:a/..."
}
}
}
}Running with Streamable HTTP Transport
For HTTP-based integrations, bind to 127.0.0.1 (localhost only) unless you explicitly need network access:
uv run python -m lakehouse_mcp --transport streamable-http --host 127.0.0.1 --port 9000Security note: The
streamable-httptransport has no built-in authentication layer. The server uses yourWATSONX_DATA_API_KEYto authenticate all requests to IBM Cloud on your behalf. If you bind to0.0.0.0(all interfaces), any client that can reach that port can invoke all tools under your IAM identity without supplying any credentials. Only use--host 0.0.0.0in a trusted network environment and place a reverse proxy (e.g. nginx) with authentication in front of the MCP endpoint. For single-user local use, always prefer--host 127.0.0.1or the defaultstdiotransport.
Available Tools
Quick Reference
Goal | Tool to Use | Example |
Check connectivity |
| "What's my instance status?" |
Find engines |
| "List all engines" |
Discover data |
| "What schemas exist?" |
Find tables |
| "Show tables in sales_db" |
Understand schema |
| "Describe customers table" |
Query data |
| "SELECT * FROM tpch.tiny.customer LIMIT 10" |
See TOOLS.md for currently supported tools and advanced usage patterns.
Example Usage
Once configured with Claude Desktop, you can interact with your watsonx.data instance using natural language:
1. Check Instance Status
You ask:
What watsonx.data instance am I connected to?Claude responds with:
You're connected to watsonx.data instance:
- Instance ID: crn:v1:bluemix:public:lakehouse:us-south:a/abc123...
- Region: us-south
- Version: 2.0.0
- Status: active
- Serverless Spark: enabled
- Presto: enabled2. Discover Available Data
You ask:
What schemas are available in tpch catalog?Claude responds:
Available Schemas:
- `tiny` - TPC-H benchmark data (smallest scale)
- `sf1` through `sf100000` - Various scale factors (1, 10, 100, 300, 1000, 3000, 10000, 30000, 100000)
- `information_schema` - System schema
**Tables in the "tiny" schema:**
1. customer
2. lineitem
3. nation
4. orders
5. part
6. partsupp
7. region
8. supplier
These are the standard TPC-H benchmark tables. Would you like me to:
- Describe the schema of one of these tables?
- Run a sample query on one of the tables?
- Explore tables from a different scale factor (sf1, sf100, etc.)?3. Explore Table Structure
You ask:
Show me the schema for the customer table in tiny schemaClaude responds:
Here's the schema for the **customer** table in the **tpch.tiny** schema:
Columns (8 total):
1. `c_custkey` - bigint (nullable)
2. `c_name` - varchar(25) (nullable)
3. `c_address` - varchar(40) (nullable)
4. `c_nationkey` - bigint (nullable)
5. `c_phone` - varchar(15) (nullable)
6. `c_acctbal` - double (nullable)
7. `c_mktsegment` - varchar(10) (nullable)
8. `c_comment` - varchar(117) (nullable)
Table Properties:
- Type: TABLE
- Primary Keys: None
- Partitions: None
This is a standard TPC-H customer table with customer ID, name, address, nation reference, phone, account balance, market segment, and comments. All columns are nullable.
Would you like me to run a query on this table or explore other tables?4. Query Data
You ask:
Show me the top 10 customers by account balanceClaude executes:
SELECT c_custkey, c_name, c_address, c_phone, c_acctbal, c_mktsegment FROM customer ORDER BY c_acctbal DESC LIMIT 10And presents results in a formatted table Here are the top 10 customers by account balance:
Customer ID | Customer Name | Account Balance |
213 | Customer#000000213 | $9,987.71 |
45 | Customer#000000045 | $9,983.38 |
1106 | Customer#000001106 | $9,977.62 |
200 | Customer#000000200 | $9,967.60 |
140 | Customer#000000140 | $9,963.15 |
381 | Customer#000000381 | $9,931.71 |
43 | Customer#000000043 | $9,904.28 |
100 | Customer#000000100 | $9,889.89 |
780 | Customer#000000780 | $9,874.12 |
518 | Customer#000000518 | $9,871.66 |
The query executed in 42.7 seconds and returned 10 rows. Customer#000000213 has the highest account balance at $9,987.71.
5. Multi-Step Analysis
You ask:
I need to analyze customer data. What's available and what does it look like?Claude:
Let me check what's in your watsonx.data instance
I'll explore the tpch catalog
Here's the customer table schema
Runs a query to get customer data
Runs few more queries based on the columns in the customer table
Looks at the related tables
Presents a summary
See TOOLS.md for the complete list of tools, more usage patterns, and advanced examples.
Development
Setting Up Development Environment
Clone the repository
git clone https://github.com/your-org/mcp-watsonx-data.git cd mcp-watsonx-dataInstall dependencies (including dev dependencies)
uv sync --extra devSet up environment variables
cp examples/.env.example .env # Edit .env with your credentials export WATSONX_DATA_BASE_URL=https://us-south.lakehouse.cloud.ibm.com/lakehouse/api export WATSONX_DATA_API_KEY=your_ibm_cloud_api_key_here export WATSONX_DATA_INSTANCE_ID=crn:v1:bluemix:public:lakehouse:us-south:a/...
Running Tests
Run the full test suite with coverage:
uv run pytestRun tests with verbose output:
uv run pytest -vRun specific test file:
uv run pytest tests/test_client.pyRun tests with coverage report:
uv run pytest --cov=lakehouse_mcp --cov-report=htmlView coverage report:
open htmlcov/index.html # macOS
xdg-open htmlcov/index.html # Linux
start htmlcov/index.html # WindowsCode Quality
Run linting and formatting:
uv run ruff check .
uv run ruff format .Run type checking:
uv run mypy src/Run pre-commit hooks:
uv run pre-commit run --all-filesTroubleshooting
See TROUBLESHOOTING.md for common issues, diagnostics, and solutions.
Useful Links
IBM watsonx.data Docs: https://cloud.ibm.com/docs/watsonxdata?topic=watsonxdata-getting-started
IBM Cloud API Keys: https://cloud.ibm.com/iam/apikeys
MCP Specification: https://modelcontextprotocol.io/
Available Tools
39 toolsadd_columnsA
Add one or more columns to a table in a watsonx.data schema.
Note: Data types are typically specified in lowercase (e.g., "varchar", "int", "decimal"). While the API pattern allows both cases, lowercase is recommended for compatibility.
Args: catalog_name: Catalog containing the table (e.g., "iceberg_data") schema_name: Schema containing the table table_name: Table to add columns to columns: List of column definitions, each with: name (required), type (required, lowercase recommended), comment (optional), extra (optional), precision (optional), scale (optional) engine_id: Engine ID to use for the operation (from list_engines)
Returns: Dict with: - columns: List of added column details - total_count: Number of columns added
Inputs: catalog_name (required), schema_name (required), table_name (required), columns (required), +1 more. Returns: object
cancel_ingestion_jobC
Cancel a data ingestion job.
Args: job_id: Job identifier
Returns: Dict with cancellation status
Inputs: job_id (required). Returns: object
create_ingestion_jobA
Create a data ingestion job to load data into watsonx.data.
Args:
job_id: Unique job identifier (e.g., "ingestion-1234567890")
catalog: Target catalog name
schema: Target schema name
table: Target table name
file_paths: Source file path (e.g., "s3://bucket-name/file.csv")
file_type: Source file type - "csv", "parquet", "json", "orc", "avro" (default: "csv")
bucket_name: S3 bucket name (extracted from file_paths if not provided)
bucket_type: Bucket type - "amazon_s3", "aws_s3", "minio", "ibm_cos", "ibm_ceph",
"adls_gen1", "adls_gen2", "google_cs", "ibm_storage_scale", "ozone" (default: "ibm_cos")
write_mode: Write mode - "append", "overwrite" (default: "append")
engine_id: Spark engine ID to use for ingestion
field_delimiter: CSV field delimiter (default: ",")
line_delimiter: CSV line delimiter (default: "
") escape_character: CSV escape character (default: "") header: Whether CSV has header row (default: true) encoding: File encoding (default: "UTF-8") driver_memory: Spark driver memory (default: "2G") driver_cores: Spark driver cores (default: 1) executor_memory: Spark executor memory (default: "2G") executor_cores: Spark executor cores (default: 1) num_executors: Number of Spark executors (default: 1)
Returns:
Dict with job_id, status, and creation details
Inputs: job_id (required), catalog (required), schema (required), table (required), +16 more. Returns: object
create_prestissimo_engineA
Create a new Prestissimo engine in watsonx.data.
EXAMPLE PAYLOAD: { "origin": "native", "display_name": "My-Prestissimo-Engine", "description": "Prestissimo engine for fast queries", "tags": [], "associated_catalogs": [], "configuration": { "size_config": "custom", "coordinator": { "node_type": "starter", "quantity": 1 }, "worker": { "node_type": "starter", "quantity": 1 } } }
Args: origin: "native" display_name: (required) Display name for the engine configuration: (required) Engine configuration with required fields: - size_config: (required) "custom" (recommended) or predefined options (may be supported) - coordinator: (required) {"node_type": typically "starter" or "cache_optimized", "quantity": 1} - worker: (required) {"node_type": typically "starter" or "cache_optimized", "quantity": 1-18 recommended} associated_catalogs: (optional) List of catalog names to associate description: (optional) Engine description 50 characters max engine_id: (optional) Custom engine ID (must match pattern: prestissimo-0 to prestissimo-1000) tags: (optional) Tags for the engine
CUSTOM SIZE CONFIG (RECOMMENDED):
Coordinator: 1 node (always), node_type: "starter" or "cache_optimized"
Worker: 1-18 nodes (recommended), node_type: "starter" or "cache_optimized"
Node types do NOT need to match (e.g., starter coordinator + cache_optimized worker is allowed)
PREDEFINED SIZE CONFIGS: If using predefined configs, exact node types and quantities must match:
starter: 1 coordinator + 1 worker (both bx2.48x192)
small: 1 coordinator + 3 workers (both ox2.16x128)
medium: 1 coordinator + 6 workers (both ox2.16x128)
large: 1 coordinator + 12 workers (both ox2.16x128)
Returns: Dict with created engine details including engine_id
Inputs: origin (required), display_name (required), configuration (required), associated_catalogs, +3 more. Returns: object
create_presto_engineA
Create a new Presto engine in watsonx.data.
EXAMPLE PAYLOAD: { "origin": "native", "display_name": "My-Presto-Engine", "description": "Presto engine with autoscaling", "tags": [], "associated_catalogs": [], "configuration": { "size_config": "custom", "coordinator": { "node_type": "starter", "quantity": 1 }, "worker": { "node_type": "starter", "quantity": 1 }, "autoscaling_enabled": true, "autoscaling_config": { "type": "cpu", "target": 40, "min_worker_quantity": 1, "max_worker_quantity": 18, "query_termination_grace_period_min": 1, "scale_in_stabilization_window_min": 5, "scaling_step_size": 1 } } }
Args: origin: (required) "native" display_name: (required) Display name for the engine configuration: (required) Engine configuration with required fields: - size_config: (required) "custom" (recommended) or predefined options (may be supported) - coordinator: (required) {"node_type": typically "starter" or "cache_optimized", "quantity": 1} - worker: (required) {"node_type": typically "starter" or "cache_optimized", "quantity": 1-18 recommended} - autoscaling_enabled: (optional) boolean to enable autoscaling - autoscaling_config: (required if autoscaling_enabled is true) autoscaling configuration object (see AUTOSCALING section) associated_catalogs: (optional) List of catalog names to associate description: (optional) Engine description 50 characters max engine_id: (optional) Custom engine ID (must match pattern: presto-0 through presto-1000) tags: (optional) Tags for the engine
AUTOSCALING (OPTIONAL): To enable autoscaling, include these fields in the configuration:
autoscaling_enabled: true (boolean)
autoscaling_config: { "type": "cpu" or "memory", "target": 1-100 (target utilization percentage, e.g., 40), "min_worker_quantity": 1-18 (minimum workers), "max_worker_quantity": 1-18 (maximum workers), "query_termination_grace_period_min": 1-120 (grace period before terminating queries), "scale_in_stabilization_window_min": 5-60 (stabilization window for scale-in), "scaling_step_size": 1-18 (nodes to add/remove per scaling action) }
PREDEFINED SIZE CONFIGS: If using predefined configs, exact node types and quantities must match:
starter: 1 coordinator + 1 worker (both bx2.48x192)
small: 1 coordinator + 3 workers (both ox2.16x128)
medium: 1 coordinator + 6 workers (both ox2.16x128)
large: 1 coordinator + 12 workers (both ox2.16x128)
Returns: Dict with created engine details including engine_id
Inputs: origin (required), display_name (required), configuration (required), associated_catalogs, +3 more. Returns: object
create_schemaA
Create a new schema in a watsonx.data catalog.
IMPORTANT RESTRICTIONS: - Engine must be a Presto or Prestissimo engine (Spark engines are not supported) - Catalog must be an object storage catalog (Iceberg or Hive format) - Datasource catalogs (e.g., from external databases) are NOT supported for schema creation
Args: catalog_id: Catalog identifier - must be an object storage catalog (e.g., "iceberg_data", "hive_data") schema_name: Name for the new schema engine_id: Engine ID to use for the operation - must be a Presto or Prestissimo engine (from list_engines) custom_path: Path within bucket where schema will be created (REQUIRED, must be at least 1 character). If unsure, use the schema_name as the custom_path. storage_name: Storage/bucket name for the schema (REQUIRED for object storage catalogs)
Returns: Dict with: - name: Name of the created schema - catalog_name: Parent catalog name - custom_path: Custom path used - storage_name: Storage name if specified
Raises: Error if: - Engine is not Presto or Prestissimo type - Catalog is a datasource catalog (not object storage) - custom_path is empty or storage_name is not provided
Inputs: catalog_id (required), schema_name (required), engine_id (required), custom_path (required), +1 more. Returns: object
create_spark_engineB
Create a new Spark engine in watsonx.data.
Args: origin: Engine origin - "native", "external", or "discover" display_name: Display name for the engine storage_name: Storage/bucket name for engine_home (REQUIRED) associated_catalogs: List of catalog IDs to associate description: Engine description default_version: Spark version (default: "3.5") default_config: Additional engine configuration tags: Tags for the engine
Returns: Dict with created engine details including engine_id
Inputs: origin (required), display_name (required), storage_name (required), associated_catalogs, +4 more. Returns: object
describe_tableA
Get detailed schema and metadata for a watsonx.data table.
Args: catalog_name: Catalog containing the table (e.g., "iceberg_data", "tpch") schema_name: Schema containing the table (from list_schemas) table_name: Table to describe (from list_tables) engine_id: Engine ID for metadata retrieval (from list_engines)
Returns: Dict with: - name: Table name - catalog_name, schema_name: Echo of inputs - columns: List of column objects with: - name: Column name (required) - type: SQL data type (required) - comment: Optional comment/description - extra: Optional extra attributes (e.g., AUTO_INCREMENT) - length: Optional length for VARCHAR/CHAR types - precision: Optional precision for DECIMAL types - scale: Optional scale for DECIMAL types - column_count: Total number of columns - engine_id: Echo of input
Inputs: catalog_name (required), schema_name (required), table_name (required), engine_id (required). Returns: object
execute_insertA
Execute INSERT queries against watsonx.data.
Args: sql: SQL INSERT query to execute (must start with INSERT) catalog_name: Target catalog (e.g., "iceberg_data", "hive_data") schema_name: Default schema for unqualified table names engine_id: Engine to run query on (from list_engines, must be running)
Returns: Dict with: - query_id: Unique query identifier - rows_inserted: Number of rows inserted (if available) - execution_time_ms: Query duration in milliseconds - status: Query execution status - catalog_name, schema_name: Echo of inputs
Inputs: sql (required), catalog_name (required), schema_name (required), engine_id (required). Returns: object
execute_selectA
Execute read-only SELECT queries against watsonx.data.
Args: sql: SQL SELECT query to execute (must start with SELECT) catalog_name: Target catalog (e.g., "iceberg_data", "tpch") schema_name: Default schema for unqualified table names engine_id: Engine to run query on (from list_engines, must be running) limit: Max rows to return (default: 500 if no LIMIT in query). Note: Using high limits will consume more tokens.
Returns: Dict with: - query_id: Unique query identifier - columns: List of {name, type} objects - rows: List of row data (list of lists) - row_count: Number of rows returned - execution_time_ms: Query duration in milliseconds - catalog_name, schema_name: Echo of inputs
Inputs: sql (required), catalog_name (required), schema_name (required), engine_id (required), +1 more. Returns: object
execute_updateA
Execute UPDATE queries against watsonx.data.
Args: sql: SQL UPDATE query to execute (must start with UPDATE) catalog_name: Target catalog (e.g., "iceberg_data", "hive_data") schema_name: Default schema for unqualified table names engine_id: Engine to run query on (from list_engines, must be running)
Returns: Dict with: - query_id: Unique query identifier - rows_updated: Number of rows updated (if available) - execution_time_ms: Query duration in milliseconds - status: Query execution status - catalog_name, schema_name: Echo of inputs Note: Iceberg table updates require at least format version 2 and update mode must be merge-on-read. Use ALTER TABLE to configure: SET PROPERTIES 'format-version' = '2', 'write.update.mode' = 'merge-on-read'
Inputs: sql (required), catalog_name (required), schema_name (required), engine_id (required). Returns: object
explain_analyze_queryA
Get detailed query analysis with execution statistics in watsonx.data.
Args: engine_id: Presto or Prestissimo engine identifier statement: SQL query to analyze. If query fails, consider using fully qualified table names (catalog.schema.table) engine_type: Engine type - "presto" or "prestissimo" (default: "presto") verbose: Include detailed statistics
Returns: Dict with engine_id, engine_type, statement, analysis, and full response
Inputs: engine_id (required), statement (required), engine_type, verbose. Returns: object
explain_queryA
Get query execution plan without running the query in watsonx.data.
Args: engine_id: Presto or Prestissimo engine identifier statement: SQL query to explain. If query fails, consider using fully qualified table names (catalog.schema.table) engine_type: Engine type - "presto" or "prestissimo" (default: "presto") format: Output format - "json" or "text" type: Explain type - "logical", "distributed", "validate", or "io"
Returns: Dict with engine_id, engine_type, statement, plan, and full response
Inputs: engine_id (required), statement (required), engine_type, format, +1 more. Returns: object
get_ingestion_jobB
Get detailed status of a data ingestion job.
Args: job_id: Job identifier
Returns: Dict with detailed job status, configuration, and execution details
Inputs: job_id (required). Returns: object
get_instance_detailsA
Get watsonx.data instance information including status, version, region, and enabled features.
Returns: Dict with instance details: - instance_id: Instance CRN identifier - region: IBM Cloud region (e.g., "us-south") - status: Instance status ("active", "provisioning", "inactive", "failed") - version: watsonx.data version - account_type: Account type ("TRIAL", "ENTERPRISE", "LITE", "STANDARD") - serverless_spark_enabled: Whether Spark is available - public_endpoints_enabled: Public internet access enabled - console_url: Web console URL
Inputs: no named parameters. Returns: object
get_spark_application_statusA
Get detailed status of a Spark application.
Args: engine_id: Spark engine identifier application_id: Application identifier
Returns: Dict with detailed application status including: - application_id: Application identifier - state: Current state (e.g., "running", "finished", "failed") - start_time: Application start timestamp - end_time: Application end timestamp (if completed) - spark_version: Spark version used - application_details: Configuration and runtime details
Inputs: engine_id (required), application_id (required). Returns: object
list_enginesA
List available Presto, Prestissimo, and Spark compute engines in watsonx.data.
Args: engine_type: Optional filter - "presto", "prestissimo", "spark", or None for all engines
Returns: Dict with: - engines: List of engine objects with engine_id, display_name, type, status, size (if applicable), created_on, created_by, associated_catalogs - summary: Counts by type and status (total_count, presto_count, prestissimo_count, spark_count, by_status)
Inputs: engine_type. Returns: object
list_ingestion_jobsA
List data ingestion jobs on watsonx.data.
Args: start: Offset for pagination (default: 0, 0-based) limit: Number of jobs per page (default: 10, max: 100, -1 for all)
Returns: Dict with ingestion_jobs list containing job details
Inputs: start, limit. Returns: object
list_schemasA
List database schemas in a watsonx.data catalog.
Args: catalog_name: Catalog to list schemas from (e.g., "iceberg_data", "hive_data", "tpch") engine_id: Engine ID for metadata queries (from list_engines)
Returns: Dict with: - schemas: List of schema objects with schema_name, catalog_name - total_count: Number of schemas found - catalog_name, engine_id: Echo of inputs
Inputs: catalog_name (required), engine_id (required). Returns: object
list_spark_applicationsB
List Spark applications on a Spark engine.
Args: engine_id: (required) Spark engine identifier state: (optional) Filter by application state (e.g., ["running", "finished", "failed"]) limit: (optional) Maximum number of applications to return (1-1000). Recommended to use smaller values (e.g., 10-50) to avoid exhausting tokens.
Returns: Dict with applications list containing application details
Inputs: engine_id (required), state, limit. Returns: object
list_tablesA
List tables in a watsonx.data schema.
Args: catalog_name: Catalog containing the schema (e.g., "iceberg_data", "hive_data") schema_name: Schema/database containing tables (from list_schemas) engine_id: Engine ID for metadata queries (from list_engines)
Returns: Dict with: - tables: List of table names (strings) - total_count: Number of tables in schema - catalog_name, schema_name, engine_id: Echo of inputs
Inputs: catalog_name (required), schema_name (required), engine_id (required). Returns: object
pause_prestissimo_engineB
Pause a running Prestissimo engine in watsonx.data.
Args: engine_id: Engine identifier
Returns: Dict with pause operation status and engine state transition
Inputs: engine_id (required). Returns: object
pause_presto_engineB
Pause a running Presto engine in watsonx.data.
Args: engine_id: Engine identifier
Returns: Dict with pause operation status and engine state transition
Inputs: engine_id (required). Returns: object
pause_spark_engineA
Pause a running Spark engine in watsonx.data (SAAS only).
Args: engine_id: Engine identifier force: Force pause even if applications are running (default: False)
Returns: Dict with pause operation status
Inputs: engine_id (required), force. Returns: object
rename_columnA
Rename a column in a table in a watsonx.data schema.
Args: catalog_name: Catalog containing the table (e.g., "iceberg_data") schema_name: Schema containing the table table_name: Table containing the column column_name: Current column name new_column_name: New name for the column engine_id: Engine ID to use for the operation (from list_engines)
Returns: Dict with column details including the new name
Inputs: catalog_name (required), schema_name (required), table_name (required), column_name (required), +2 more. Returns: object
rename_tableA
Rename a table in a watsonx.data schema.
Args: catalog_name: Catalog containing the table (e.g., "iceberg_data") schema_name: Schema containing the table table_name: Current table name new_table_name: New name for the table engine_id: Engine ID to use for the operation (from list_engines)
Returns: Dict with table details including the new name
Inputs: catalog_name (required), schema_name (required), table_name (required), new_table_name (required), +1 more. Returns: object
restart_prestissimo_engineC
Restart a Prestissimo engine in watsonx.data.
Args: engine_id: Engine identifier
Returns: Dict with engine_id, status, message, response
Inputs: engine_id (required). Returns: object
restart_presto_engineC
Restart a Presto engine in watsonx.data.
Args: engine_id: Engine identifier
Returns: Dict with engine_id, status, message, response
Inputs: engine_id (required). Returns: object
resume_prestissimo_engineB
Resume a paused Prestissimo engine in watsonx.data.
Args: engine_id: Engine identifier
Returns: Dict with resume operation status and engine state transition
Inputs: engine_id (required). Returns: object
resume_presto_engineC
Resume a paused Presto engine in watsonx.data.
Args: engine_id: Engine identifier
Returns: Dict with resume operation status and engine state transition
Inputs: engine_id (required). Returns: object
resume_spark_engineB
Resume a paused Spark engine in watsonx.data (SAAS only).
Args: engine_id: Engine identifier
Returns: Dict with resume operation status
Inputs: engine_id (required). Returns: object
scale_prestissimo_engineA
Scale a Prestissimo engine by adjusting coordinator and worker node counts in watsonx.data.
RECOMMENDED NODE TYPES: "starter" or "cache_optimized" (other types may be available)
SCALING CAPABILITIES:
Coordinator quantity: Always 1 (cannot be changed)
Worker quantity: 1-18 (recommended), up to 50 may be supported
Node types CAN be changed during scaling (e.g., from "starter" to "cache_optimized")
Coordinator and worker do NOT need to match node types
API REQUIREMENT: Must provide BOTH coordinator AND worker configurations together.
Args: engine_id: Engine identifier coordinator_node_type: Typically "starter" or "cache_optimized". Can be different from current type. coordinator_quantity: Number of coordinator nodes (must be 1 for Prestissimo) worker_node_type: Typically "starter" or "cache_optimized". Can be different from coordinator_node_type. worker_quantity: Number of worker nodes (1-18 recommended, up to 50 may be supported)
Returns: Dict with scaling operation status and new node configuration
Inputs: engine_id (required), coordinator_node_type (required), coordinator_quantity (required), worker_node_type (required), +1… Returns: object
scale_presto_engineA
Scale a Presto engine by adjusting coordinator and worker node counts in watsonx.data.
RECOMMENDED NODE TYPES: "starter" or "cache_optimized" (other types may be available)
SCALING CAPABILITIES:
Coordinator quantity: Always 1 (cannot be changed)
Worker quantity: 1-18 (recommended), up to 50 may be supported
Node types CAN be changed during scaling (e.g., from "starter" to "cache_optimized")
Coordinator and worker do NOT need to match node types
API REQUIREMENT: Must provide BOTH coordinator AND worker configurations together.
Args: engine_id: Engine identifier coordinator_node_type: Typically "starter" or "cache_optimized". Can be different from current type. coordinator_quantity: Number of coordinator nodes (must be 1 for Presto) worker_node_type: Typically "starter" or "cache_optimized". Can be different from coordinator_node_type. worker_quantity: Number of worker nodes (1-18 recommended, up to 50 may be supported)
Returns: Dict with scaling operation status and new node configuration
Inputs: engine_id (required), coordinator_node_type (required), coordinator_quantity (required), worker_node_type (required), +1… Returns: object
scale_spark_engineA
Scale a Spark engine by adjusting node count in watsonx.data (SAAS only).
Args: engine_id: Engine identifier number_of_nodes: Target node count (1-1000)
Returns: Dict with scaling operation status (202 Accepted - asynchronous operation)
Inputs: engine_id (required), number_of_nodes (required). Returns: object
stop_spark_applicationA
Stop and remove a Spark application.
This will terminate a running application and remove it from the engine's history.
Args: engine_id: Spark engine identifier application_id: Application identifier to stop
Returns: Dict with operation status
Inputs: engine_id (required), application_id (required). Returns: object
submit_spark_applicationA
Submit a Spark application for execution on a Spark engine.
Args: engine_id: Spark engine identifier application: Application file path (JAR, Python, R file) arguments: Application arguments array conf: Spark configuration properties (e.g., {"spark.executor.memory": "2g"}) env: Environment variables name: Application name (will be added to conf as spark.app.name) job_endpoint: External job endpoint service_instance_id: Service instance ID - "iae" or "emr" type: Engine type - "spark" or "gluten" context_type: Context type - "project", "git_project", or "space" volumes: Volume mounts (watsonx.data software only). List of dicts with: - name: volume name - mount_path: path in spark cluster (e.g., "/mount/path") - source_sub_path: path in volume to mount (e.g., "/source/path") - read_only: boolean flag
Returns: Dict with application_id, state, and submission details
Examples: Minimal configuration for IBM Cloud Object Storage using cos:// protocol:
{
"engine_id": "spark398",
"application": "cos://bucket.instance/app.py",
"arguments": ["cos://bucket.instance/data.csv"],
"conf": {
"spark.hadoop.fs.cos.instance.endpoint": "s3.direct.us-east.cloud-object-storage.appdomain.cloud",
"spark.hadoop.fs.cos.instance.access.key": "your-access-key",
"spark.hadoop.fs.cos.instance.secret.key": "your-secret-key"
}
}
Minimal configuration for IBM Cloud Object Storage using s3a:// protocol:
{
"engine_id": "spark398",
"application": "s3a://bucket/app.py",
"arguments": ["s3a://bucket/data.csv"],
"conf": {
"spark.hadoop.fs.s3a.bucket.bucket.access.key": "your-access-key",
"spark.hadoop.fs.s3a.bucket.bucket.secret.key": "your-secret-key",
"spark.hadoop.fs.s3a.bucket.bucket.aws.credentials.provider": "org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider"
}
}
Optional conf parameters (uses engine defaults if not specified):
- spark.app.name: Custom application name
- ae.spark.driver.log.level / ae.spark.executor.log.level: Log levels
- spark.driver.cores / spark.driver.memory: Driver resources
- spark.executor.cores / spark.executor.memory: Executor resourcesInputs: engine_id (required), application (required), arguments, conf, +7 more. Returns: object
update_prestissimo_engineA
Update Prestissimo engine configuration in watsonx.data.
IMPORTANT: Due to a known API limitation, the description field cannot be
updated on its own. If you want to update the description, you must include
at least one additional field in the same call (e.g., display_name, tags,
or properties). Calls that modify only description will fail.
Args: engine_id: Engine identifier. description: Updated description (1-50 characters). Must be accompanied by at least one other updatable field in the same request. display_name: Updated display name. properties: Engine configuration properties. restart_type: Set to "force" to trigger a restart after the update. remove_engine_properties: Properties to remove. tags: Updated tags.
Returns: Dict with updated engine configuration
Inputs: engine_id (required), description, display_name, properties, +3 more. Returns: object
update_presto_engineB
Update Presto engine configuration in watsonx.data.
Args: engine_id: Engine identifier description: Updated description display_name: Updated display name engine_properties: Engine configuration properties engine_restart: Set to "force" to trigger restart after update remove_engine_properties: Properties to remove tags: Updated tags
Returns: Dict with updated engine configuration
Inputs: engine_id (required), description, display_name, engine_properties, +3 more. Returns: object
update_spark_engineA
Update Spark engine configuration in watsonx.data.
Args: engine_id: Engine identifier description: Updated description display_name: Updated display name configuration: Engine configuration (default_config, default_version, engine_home) tags: Updated tags
Returns: Dict with updated engine configuration
Note: Spark engines do NOT support engine_restart parameter. Configuration changes may require manual restart.
Inputs: engine_id (required), description, display_name, configuration, +1 more. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 39 tools
Each tool targets a distinct action and resource. Even though there are many engine-specific tools (e.g., create_presto_engine vs create_prestissimo_engine), the tool names and descriptions clearly differentiate them. Overlapping concepts like pause/resume are separated by engine type, making selection unambiguous.
Most tools follow a verb_noun pattern (create_schema, list_engines, execute_select). There is slight inconsistency: 'get' vs 'list' for retrieval tools (e.g., get_instance_details vs list_engines), and 'describe_table' uses 'describe' instead of a more uniform prefix. Overall, the convention is predictable.
With 39 tools, the set is on the higher side. Many tools are redundant because they duplicate the same operations for different engine types (Presto, Prestissimo, Spark). While each tool serves a purpose, the count feels heavy for a typical MCP server, bordering on excessive.
Several lifecycle operations are missing: no tool to delete engines, schemas, or tables, and no create_table tool exists. Additionally, there is no way to list catalogs, which are referenced in many operations. These gaps would cause agent failures when trying to perform basic data management tasks.
Maintenance
Related MCP Connectors
Your Databricks Lakehouse in natural language: run SQL on your SQL warehouses, track long-running qu
Query BigQuery, Snowflake, Redshift & Azure Synapse with natural language
Query your org's data in natural language — read-only MCP access to SQL, NoSQL, files & warehouses.
Company and industrial data for AI assistants: datasets, SQL, dashboards, alarms, with approvals.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to query and explore distributed data across EdgeLake nodes through SQL operations, resource discovery, and schema inspection. Supports complex queries with joins, aggregations, and metadata fields across multiple databases and tables.Mozilla Public 2.0

Watsonx.data Document Libraryofficial
AlicenseNot gradedqualityDmaintenanceBridges AI agents with watsonx.data document libraries, enabling natural language queries and intelligent retrieval from document libraries.5Apache 2.0- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with Databricks workspaces through natural language, supporting SQL queries, cluster management, jobs, Genie AI, Unity Catalog, and more.MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to audit data governance, check access control roles, query namespaces, and inspect Iceberg metadata.1MIT