watsonx Platform MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| WX_APIKEY | No | IBM Cloud apikey (saas) or platform API key (cpd). Usually required; for cpd, WX_PASSWORD can be used instead. | |
| WX_PASSWORD | No | Optional. cpd fallback only, used instead of WX_APIKEY for the `/v1/authorize` bearer flow. | |
| WX_USERNAME | No | cpd only. Required for cpd. | |
| WX_VERIFY_SSL | No | Optional, default `true`; set `false` to skip TLS verification for `WX_URL_OR_REGION`. | |
| WX_ENVIRONMENT | Yes | Required. `saas` or `cpd`. | |
| WX_URL_OR_REGION | Yes | Required. For saas: region code (default `us-south`); for cpd: full cluster base URL. | |
| WX_CA_BUNDLE_PATH | No | Optional. Path to a CA bundle/cert to trust for `WX_URL_OR_REGION`, instead of disabling verification. | |
| WX_PREFER_ZEN_API_KEY | No | Optional, cpd only, default `true`. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Product-agnostic access to IBM watsonx's Common Core Services (CCS): Projects, Assets, Connections, and Jobs — shared by every watsonx product (watsonx.ai, watsonx.data, DataStage, Pipelines, ...). Call authenticate first (or set WX_* env vars) before any other tool. Tools are grouped by confidence: auth/projects/assets(read+basic create)/connections/jobs(create+read) are production-confident, live-verified against a real CPD cluster and a SaaS dev tenant. upload_asset_file, update_job (schedule edits), job-run lifecycle tools, update_connection/delete_connection, and all project-member tools are EXPERIMENTAL — implemented from the spec's contract but not (or not fully) live-verified; treat their exact request/response shapes as provisional.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| authenticateA | Establish (or replace) this session's target environment and credentials. All other tools operate against the current authenticated session — there is no per-call credential parameter. Calling this again replaces the session's target; v1 supports one active target per session, not multiple concurrent ones. |
| list_assetsC | Wraps POST /v2/asset_types/asset/search — envelope {total_rows, results} confirmed live. NOTE: the exact query-DSL field names used below (asset.asset_type / asset.name) are inferred from the general watsonx asset search pattern, not independently confirmed in the spec — only the response envelope shape itself is confirmed. Re-verify the filter syntax against a live cluster with real data if filtered results look wrong. |
| get_assetC | Full asset metadata document (attachments, attributes, relationships). |
| create_assetC | Generic asset creation — confirmed live at POST /v2/assets?project_id=...
(not /transactional/v2/assets, which is 404). |
| upload_asset_fileC | EXPERIMENTAL — Phase 3 / low-confidence (spec/02-tools.md). Only the create-data-asset step is verified live. The attachment-creation body shape is from a real example request, not independently re-verified. The signed-URL PUT and "complete" steps are entirely unconfirmed — this implementation is a best-effort, defensive sequence that should be re-verified against a live cluster before being relied on. If it fails partway through, the data asset (and possibly a dangling attachment record) may be left behind — this tool does not attempt rollback. |
| list_connection_typesD | Wraps GET /v2/datasource_types. |
| create_connectionA | IMPORTANT: this call actively tests the supplied credentials against the
live external system at creation time and fails with a non-standard HTTP 460
("connection_test_failed", non-retryable) if they don't work — confirmed live.
It cannot be used speculatively or with placeholder credentials; only call it
with genuinely reachable external-system credentials. |
| list_connectionsD | Native envelope confirmed live: {resources: [], first: {href}, total_count} — a third, HAL-style pagination shape distinct from projects and asset search. |
| get_connectionD | – |
| update_connectionC | EXPERIMENTAL — Phase 3, never tested at all (spec/02-tools.md). Assumes the same flat partial-object PATCH body as update_project; this is an assumption, not a confirmed fact — update_connection's PATCH format could just as easily match update_job's JSON-Patch-array format instead. Re-verify live once real external-system credentials are available to create a connection to test against. |
| delete_connectionD | EXPERIMENTAL — Phase 3, never tested at all (spec/02-tools.md). |
| list_job_runsC | EXPERIMENTAL — from an unverified example request. Wraps GET /v2/jobs/{id}/runs?project_id=... |
| get_job_runC | EXPERIMENTAL — from an unverified example request. Wraps GET /v2/jobs/{id}/runs/{run_id}?project_id=.... A related GET .../runs/{run_id}/logs endpoint was also seen but is not called here — not one of the 13 capabilities as a separate tool in v1. |
| cancel_job_runC | EXPERIMENTAL — from an unverified example request. Confirmed to be POST (not DELETE) in that example: POST /v2/jobs/{id}/runs/{run_id}/cancel?project_id=.... A separate DELETE .../runs/{run_id} endpoint also exists and is distinct from cancel (presumably deletes the run record instead of stopping it) — not exposed as its own tool in v1. NOTE: |
| create_job_runA | EXPERIMENTAL — from an unverified example request. Wraps POST /v2/jobs/{id}/runs?project_id=..., body {"job_run": {...}} (confirmed wrapper key in that example — NOT {"run": {...}}). Returns immediately with the run's current state; does not block until completion (see spec/03-conventions.md "Async operations"). Poll get_job_run/list_job_runs. |
| create_jobC | Wraps POST /v2/jobs?project_id=... — confirmed live. Request body is {"job": {...}}. |
| update_jobC | EXPERIMENTAL for schedule edits — Phase 3 (spec/02-tools.md). The JSON-Patch (RFC 6902) body format is confirmed live: PATCH
/v2/jobs/{id} rejects a flat object and requires an array. BUT two
separate live attempts to change an existing job's |
| list_jobsC | Wraps GET /v2/jobs?project_id=.... NOTE: the exact native pagination
envelope for this endpoint isn't pinned down in the spec (only that the
read path itself is confirmed reachable) — defensively checks the
|
| get_jobD | – |
| delete_jobC | Confirmed live: 204, via the dedicated /v2/jobs/{id} path (the generic asset-delete path also works, since jobs are assets, but this uses the dedicated form for clarity). |
| list_project_membersC | EXPERIMENTAL — untested. Wraps GET /v2/projects/{id}/members. |
| add_project_memberB | EXPERIMENTAL — untested. Wraps POST /v2/projects/{id}/members. |
| update_project_memberC | EXPERIMENTAL — untested. Wraps PATCH /v2/projects/{id}/members/{member_id}.
NOTE (unverified assumption): 02-tools.md's contract takes |
| remove_project_memberC | EXPERIMENTAL — untested. Wraps DELETE /v2/projects/{id}/members/{member_id}. Same unverified identity-as-member_id assumption as update_project_member. |
| list_projectsB | List projects, flattened to {id, name, description, created_at, updated_at, type, creator, public}. |
| get_projectB | Full project document. Redacted: entity.storage.properties.credentials and similarly-named secret fields are stripped — confirmed live that SaaS can embed real COS/S3 credentials here (see spec/03-conventions.md). |
| create_projectD | – |
| update_projectC | PATCH with a flat, partial JSON object — confirmed live. NOTE: this PATCH body format is specific to projects; update_job needs a JSON Patch array instead (see spec/03-conventions.md). |
| delete_projectC | Confirmed live: 204, immediate, cascades to the project's assets/jobs (not independently verified whether it cascades to connections/members). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 29 tools
Tools are mostly cleanly separated by resource+action (projects, connections, jobs, job runs, assets, members). Some conceptual overlap exists because jobs are a kind of asset (get_job vs get_asset, delete_job but no delete_asset) and the run sub-resources (create/get/list/cancel_job_run) sit close to the job tools, but descriptions clarify intent.
Nearly all tools follow a predictable verb_noun snake_case pattern (list_projects, create_job_run, delete_connection). Minor deviations: members use add/remove_project_member while other resources use create/delete, and 'authenticate' is a bare verb with no noun.
At 29 tools this sits above the comfortable range, and several are flagged EXPERIMENTAL/untested. The breadth is partly justified by covering six distinct sub-domains (projects, connections, jobs, runs, assets, members), but the surface feels heavy and could be trimmed.
Most resources have full lifecycle coverage: projects (CRUD), connections (CRUD + types), jobs (CRUD), job runs (create/get/list/cancel), and members (list/add/update/remove). The notable gap is generic assets, which have create/get/list but no update or delete, and no job-run logs tool.