Teradata Workload Management (WLM) MCP Server
OfficialProvides monitoring and management capabilities for Teradata systems, including workload management, session monitoring, and configuration management.
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., "@Teradata Workload Management (WLM) MCP ServerShow current system status"
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.
Teradata Workload Management (WLM) MCP Server
A Model Control Protocol (MCP) server for Teradata Workload Management (WLM) that provides comprehensive monitoring and management capabilities for Teradata systems.
Features
41 Management Tools: 28 core monitoring tools + 13 configuration management tools
39 MCP Resources: Reference data, templates, ruleset exploration, and workflow guidance
Full Teradata Connectivity: TD2, LDAP, Kerberos, TDNEGO, JWT authentication
TLS/SSL Support: ALLOW, PREFER, REQUIRE, VERIFY-CA, VERIFY-FULL modes
Per-Tool Audit Trail: QueryBand tracking per tool call for workload management
Async DB Operations: All database calls run in thread pool (non-blocking)
Connection Resilience: Intelligent retry with exponential backoff and jitter
Connection Health Monitoring: Automatic health checks and recovery
OAuth 2.1 Authentication: Optional Keycloak integration with scope-based access control
Template-Driven Configuration: Pre-built patterns for common TDWM configurations
Generic Error Messages: No raw database errors leaked to clients
Related MCP server: tdsql-mcp
Use Cases
Performance Troubleshooting
Scenario: Identify why queries are running slowly or getting delayed
Tools to use:
show_sessions- Identify active sessions and their stateidentify_blocking- Find sessions causing blocksshow_sql_text_for_session- See what SQL is runningmonitor_amp_load- Check AMP utilizationdisplay_delay_queue- See if queries are delayedshow_tasm_statistics- Analyze TASM workload distribution
Resources to explore:
tdwm://summary- Overall system statustdwm://throttle-statistics- Current throttle limits and delays
Emergency Response
Scenario: System is overloaded, need to quickly restrict workload
Workflow:
Use
tdwm://workflow/emergency-throttleresource for step-by-step guideUse
tdwm://template/throttle/application-basicfor quick throttle patterncreate_system_throttlewith low concurrency limitenable_throttleto activateactivate_rulesetto apply changes immediatelyMonitor with
show_trottle_statistics
Scheduled Maintenance
Scenario: Block user access during maintenance window
Workflow:
Use
tdwm://workflow/maintenance-windowfor complete guideCreate filter with
create_filtertargeting all users or specific applicationsenable_filter+activate_rulesetto block accessPerform maintenance
disable_filter+activate_rulesetto restore access
Installation
pip install tdwm-mcpQuick Start
# 1. Install the package
pip install tdwm-mcp
# 2. Configure database connection
export DATABASE_URI="teradata://username:password@hostname/database"
# 3. Start the MCP server
uv run tdwm-mcp
# 4. Test with a simple tool call (via your MCP client)
# Tool: show_sessionsConfiguration
All configuration is done via environment variables. See .env.example for a complete reference.
Database Connection
# Connection URL (required)
export DATABASE_URI="teradata://username:password@hostname/database"Authentication Mechanisms
The server supports all Teradata authentication methods via the DB_LOGMECH environment variable:
TD2 (Default - Username/Password)
export DATABASE_URI="teradata://username:password@hostname/database"
# DB_LOGMECH=TD2 is the default, no need to set explicitlyLDAP
export DATABASE_URI="teradata://@hostname/database"
export DB_LOGMECH=LDAP
export DB_LOGDATA="authcid=user@domain.com password=ldap_password"Directory | authcid Format |
Active Directory (Simple) |
|
Active Directory (DIGEST-MD5) |
|
OpenLDAP / Sun DS |
|
Kerberos (KRB5)
export DATABASE_URI="teradata://@hostname/database"
export DB_LOGMECH=KRB5
# Requires valid Kerberos ticket (kinit)TDNEGO (Token Negotiation)
export DB_LOGMECH=TDNEGO
# Negotiates between TD2, LDAP, KRB5 automaticallyJWT (JSON Web Token)
export DATABASE_URI="teradata://@hostname/database"
export DB_LOGMECH=JWT
export DB_LOGDATA="authcid=token_issuer password=jwt_token_string"TLS/SSL Configuration
# SSL mode: ALLOW, PREFER, REQUIRE, VERIFY-CA, VERIFY-FULL
export DB_SSL_MODE=REQUIRE
# Transport encryption (default: true)
export DB_ENCRYPT_DATA=trueMode | Description |
| Try SSL, fall back to plaintext |
| Prefer SSL, but allow plaintext |
| Require SSL, fail if not available |
| Verify CA certificate |
| Verify CA and hostname |
Transport Configuration
# Transport: stdio (default), sse, streamable-http
export MCP_TRANSPORT=stdio
export MCP_HOST=0.0.0.0
export MCP_PORT=8000
export MCP_PATH=/mcp/CORS Configuration
# Allowed origins (default: * for all)
export CORS_ALLOWED_ORIGINS="https://your-app.example.com"Retry Configuration
# Tool-level retry
export TOOL_MAX_RETRIES=2
export TOOL_RETRY_INITIAL_DELAY=0.5
export TOOL_MAX_RETRY_DELAY=2.0
# Connection-level retry
export DB_MAX_RETRIES=3
export DB_INITIAL_BACKOFF=1.0
export DB_MAX_BACKOFF=30.0OAuth 2.1 (Optional)
export OAUTH_ENABLED=true
export KEYCLOAK_URL=https://your-keycloak-server.com
export KEYCLOAK_REALM=your-realm
export KEYCLOAK_CLIENT_ID=tdwm-mcp
export KEYCLOAK_CLIENT_SECRET=your-secret
export OAUTH_RESOURCE_SERVER_URL=https://your-mcp-server.com
export OAUTH_REQUIRED_SCOPES=tdwm:read,tdwm:monitor
export OAUTH_REQUIRE_HTTPS=trueScopes: tdwm:read, tdwm:write, tdwm:admin, tdwm:query, tdwm:monitor, tdwm:workload
Docker
All docker-compose files use environment variable expansion - no credentials are hardcoded. Create a .env file from .env.example before running.
# Basic SSE transport
cp .env.example .env
# Edit .env with your credentials
docker compose up -d
# With OAuth (Keycloak)
docker compose -f docker-compose.oauth.yml up -d
# SSE on alternate port
docker compose -f docker-compose.sse.yml up -dConnection Resilience
The server includes automatic retry logic for handling Teradata connection failures.
How It Works
All tools are wrapped with an intelligent retry decorator that:
Detects Connection Errors - Distinguishes between connection failures (retryable) and SQL errors (not retryable)
Smart Retry Logic - Based on operation safety:
Read operations (queries, monitoring): Up to 2 retries
Write operations (creates, updates): Up to 1 retry
Dangerous operations (deletes, aborts): No automatic retry
Exponential Backoff - Progressive delays (0.5s -> 1.0s -> 2.0s) with jitter
Health Monitoring - Connection health checks every 5 minutes via
SELECT 1
Detected Teradata Errors
Network timeouts and disconnections
Session disconnections (Error 3126)
Transaction aborts due to TDWM termination (Error 2631)
Session limit exceeded (Error 8017)
Communication link failures
Per-Tool QueryBand
Every tool call sets a transaction-level QueryBand for audit and workload management:
SET QUERY_BAND = 'ApplicationName=TDWM_MCP;ToolName=show_sessions;Transport=stdio;' FOR TRANSACTIONThis enables Teradata administrators to track which MCP tool initiated each query.
Architecture
+------------------------------------------------------------+
| MCP Client |
| (Claude Desktop, etc.) |
+----------------------------+-------------------------------+
| MCP Protocol
+----------------------------v-------------------------------+
| TDWM MCP Server |
| +------------------------------------------------------+ |
| | server.py - FastMCP App + Settings | |
| +------------------------------------------------------+ |
| | |
| +------------------------------------------------------+ |
| | fnc_common.py | |
| | - Connection Manager - QueryBand helper | |
| | - get_connection() - _set_queryband() | |
| | - @with_connection_retry decorator | |
| +------+-------------------+---------------------------+ |
| | | |
| +------v------+ +--------v---------+ +--------------+ |
| | fnc_tools | | fnc_tools_ | | fnc_ | |
| | .py | | priority1.py | | resources.py | |
| | | | | | | |
| | 28 core | | 13 config | | 39 | |
| | monitoring | | management | | resources | |
| | tools | | tools | | | |
| +------+------+ +--------+---------+ +------+-------+ |
| | | | |
| +------v------------------v--------------------v--------+ |
| | settings.py queryband.py retry_utils.py | |
| | connection_manager.py tdsql/tdsql.py | |
| +-------------------------------------------------------+ |
+----------------------------+---------------------------------+
| teradatasql (TD2/LDAP/KRB5/JWT)
+----------------------------v---------------------------------+
| Teradata Database |
| (TDWM/TASM System) |
+--------------------------------------------------------------+Module Organization
Module | Purpose |
| Frozen Settings dataclass - all env vars read once at startup |
| Per-tool QueryBand builder with value sanitization |
| Teradata connection wrapper with LOGMECH/TLS support |
| Connection health monitoring, retry, reconnection |
|
|
| Shared utilities, connection access, queryband helper |
| 28 core monitoring tools (async, with queryband) |
| 13 configuration management tools |
| 39 MCP resource handlers |
| Reference data resources (8) |
| Configuration templates (13) |
| Ruleset exploration queries (8) |
| FastMCP app, transport setup, initialization |
| OAuth scope-based authorization |
| OAuth 2.1 config, middleware, endpoints, metadata |
Dependency Graph
settings.py, queryband.py, retry_utils.py (no internal deps)
|
tdsql/tdsql.py (uses settings)
|
connection_manager.py (uses tdsql, queryband)
|
fnc_common.py (uses connection_manager, queryband, retry_utils)
|
+-- fnc_tools_priority1.py (uses fnc_common)
| |
+-- fnc_tools.py (uses fnc_common + fnc_tools_priority1)
| |
+-- fnc_resources.py (uses fnc_common)
|
server.py (uses all above + settings + auth)Available Tools
Session Management
show_sessions - Show my active sessions
show_sql_steps_for_session - Show SQL execution steps for a specific session
show_sql_text_for_session - Show SQL text for a specific session
abort_sessions_user - Abort all sessions for a specific user
identify_blocking - Identify users causing blocking situations
Query Band and Monitoring
monitor_session_query_band - Monitor query band for a specific session
list_query_band - List query bands by type (TRANSACTION, PROFILE, SESSION, or ALL)
show_query_log - Show query log for a specific user
System Resource Monitoring
show_physical_resources - Monitor system physical resources
monitor_amp_load - Monitor AMP (Access Module Processor) load
monitor_awt - Monitor AWT (AMP Worker Task) resources
monitor_config - Monitor virtual configuration
Workload Management
list_active_WD - List active workloads (WD)
list_WD - List all workloads (WD)
show_tdwm_summary - Show workloads summary information
Delay Queue Management
list_delayed_request - List all delayed queries
abort_delayed_request - Abort delayed requests for a specific session
display_delay_queue - Display delay queue details by type (WORKLOAD, SYSTEM, UTILITY, or ALL)
release_delay_queue - Release delayed requests for a session or user
Throttle and Performance
show_trottle_statistics - Show throttle statistics (ALL, QUERY, SESSION, WORKLOAD)
list_utility_stats - List statistics for utility usage on the system
System Information
show_cod_limits - Show COD (Capacity On Demand) limits
show_top_users - Show users consuming the most resources
show_sw_event_log - Show system software event logs (OPERATIONAL or ALL)
TASM (Teradata Active System Management)
tdwm_list_clasification - List classification types for workload (TASM) rules
show_tasm_statistics - Show TASM performance statistics
show_tasm_even_history - Show TASM event history
show_tasm_rule_history_red - Show what caused the system to enter RED state
Configuration Management
Throttle Management
create_system_throttle - Create system-level throttle with concurrency limits
modify_throttle_limit - Dynamically adjust throttle concurrency limits
delete_throttle - Remove throttle definition
enable_throttle - Activate throttle rule
disable_throttle - Deactivate throttle rule
Filter Management
create_filter - Create filter to block/reject queries
delete_filter - Remove filter definition
enable_filter - Activate filter rule
disable_filter - Deactivate filter rule
Rule Management
add_classification_to_rule - Add classification criteria to any rule
add_subcriteria_to_target - Add sub-criteria (e.g., FTSCAN for TABLE)
activate_ruleset - Apply all pending changes to make them live
list_rulesets - List all available rulesets
Available Resources
Reference Data Resources
tdwm://reference/classification-types- All 31 classification types with categoriestdwm://reference/classification-types/{category}- Filter by categorytdwm://reference/operators- Classification operators (I, O, IO)tdwm://reference/subcriteria-types- Sub-criteria types (FTSCAN, MINSTEPTIME, etc.)tdwm://reference/actions- Filter action types (E=Exception, A=Abort)tdwm://reference/throttle-types- Throttle types (DM, M)tdwm://reference/states- TASM system states (GREEN, YELLOW, ORANGE, RED)tdwm://reference/catalog- Comprehensive catalog of all reference resources
Configuration Templates
tdwm://templates/throttle- List all throttle templatestdwm://template/throttle/{template_id}- Specific throttle templatetdwm://templates/filter- List all filter templatestdwm://template/filter/{template_id}- Specific filter templatetdwm://templates/catalog- Templates catalog
Ruleset Exploration
tdwm://rulesets- List all available rulesetstdwm://system/active-ruleset- Get currently active ruleset nametdwm://ruleset/{ruleset_name}- Detailed ruleset informationtdwm://ruleset/{name}/throttles- List throttles in rulesettdwm://ruleset/{name}/throttle/{throttle_name}- Throttle detailstdwm://ruleset/{name}/filters- List filters in rulesettdwm://ruleset/{name}/filter/{filter_name}- Filter detailstdwm://ruleset/{name}/pending-changes- Check pending changes
Workflow Templates
tdwm://workflows- List all available workflowstdwm://workflow/create-throttle- Complete throttle creation workflowtdwm://workflow/create-filter- Complete filter creation workflowtdwm://workflow/maintenance-window- Enable/disable filters for maintenancetdwm://workflow/emergency-throttle- Quick emergency response workflowtdwm://workflow/modify-existing-throttle- Modify existing throttle workflow
Legacy Resources
tdwm://sessions,tdwm://workloads,tdwm://active-workloads,tdwm://summarytdwm://delayed-queries,tdwm://throttle-statistics,tdwm://physical-resourcestdwm://amp-load,tdwm://classification-types
Usage Examples
Basic Session Monitoring
await call_tool("show_sessions")
await call_tool("show_sql_text_for_session", {"sessionNo": 1234})
await call_tool("show_sql_steps_for_session", {"sessionNo": 1234})Create a System Throttle
await call_tool("create_system_throttle", {
"ruleset_name": "MyFirstConfig",
"throttle_name": "ETL_THROTTLE",
"description": "Limit ETL workload concurrency",
"throttle_type": "DM",
"limit": 5,
"classification_criteria": [
{"description": "ETL App", "type": "APPL", "value": "ETL_APP", "operator": "I"}
]
})Create a Maintenance Window Filter
await call_tool("create_filter", {
"ruleset_name": "MyFirstConfig",
"filter_name": "MAINTENANCE_BLOCK",
"description": "Block non-critical queries during maintenance",
"classification_criteria": [
{"description": "Reporting Users", "type": "USER", "value": "reporting_user", "operator": "I"}
],
"action": "E"
})Template-Driven Configuration
# 1. Read template
template = await read_resource("tdwm://template/throttle/application-basic")
# 2. Get active ruleset
active = await read_resource("tdwm://system/active-ruleset")
# 3. Create throttle using template structure
await call_tool("create_system_throttle", { ... })
# 4. Activate
await call_tool("activate_ruleset", {"ruleset_name": "MyFirstConfig"})
# 5. Verify
result = await read_resource("tdwm://ruleset/MyFirstConfig/throttle/MY_THROTTLE")Security
Credential Handling
Database credentials via environment variables only (never hardcoded)
Passwords obfuscated in all log messages and error outputs via
obfuscate_password()Client-facing errors are generic ("Check server logs for details") - no raw exceptions leaked
Docker compose files use
${VAR}expansion - no real credentials in version control
SQL Safety
All user-provided parameters use parameterized queries (
?placeholders)TDWM stored procedures called via
CALL ... (?, ?, ?)patternSession numbers validated as integers before use in
MonitorSQLSteps/MonitorSQLText
OAuth 2.1
JWT validation with RS256/RS384/RS512/ES256/ES384/ES512
Token introspection fallback via Keycloak
Scope-based access control per tool (read/write/admin/query/monitor)
HTTPS enforcement configurable via
OAUTH_REQUIRE_HTTPS
Async Safety
All DB operations wrapped in
asyncio.to_thread()(event loop never blocked)Connection manager uses
asyncio.Lock()to prevent concurrent reconnection racesPer-tool QueryBand set as
FOR TRANSACTION(not session-level, no cross-tool leakage)
Development
Project Structure
tdwm-mcp/
+-- src/tdwm_mcp/
| +-- __init__.py
| +-- server.py # FastMCP app and initialization
| +-- settings.py # Frozen Settings dataclass
| +-- queryband.py # Per-tool QueryBand builder
| +-- fnc_common.py # Shared utilities & connection management
| +-- fnc_tools.py # Core monitoring tools (28 tools)
| +-- fnc_tools_priority1.py # Configuration management (13 tools)
| +-- fnc_resources.py # Resource routing (39 resources)
| +-- fnc_prompts.py # MCP prompts
| +-- retry_utils.py # Retry decorator & error detection
| +-- connection_manager.py # Connection health management
| +-- resource_reference.py # Reference data resources
| +-- resource_templates.py # Configuration templates
| +-- resource_queries.py # Ruleset exploration queries
| +-- tdwm_static.py # Static reference data
| +-- oauth_context.py # OAuth scope-based authorization
| +-- tdsql/
| | +-- __init__.py
| | +-- tdsql.py # Teradata SQL wrapper (LOGMECH/TLS)
| +-- auth/
| +-- config.py # OAuth configuration
| +-- middleware.py # JWT validation middleware
| +-- endpoints.py # OAuth HTTP endpoints
| +-- metadata.py # Protected resource metadata
+-- docker-compose.yml # Basic SSE transport
+-- docker-compose.oauth.yml # With Keycloak integration
+-- docker-compose.sse.yml # SSE on alternate port
+-- Dockerfile
+-- .env.example # Environment variable reference
+-- pyproject.toml
+-- uv.lock
+-- README.mdAdding New Tools
# In fnc_tools.py
@with_connection_retry()
async def my_new_tool(param1: str) -> ResponseType:
"""Description of what the tool does."""
tdconn = await get_connection()
def _run():
_set_queryband(tdconn, "my_new_tool")
cur = tdconn.cursor()
rows = cur.execute("SELECT * FROM my_table WHERE col1 = ?", [param1])
return format_text_response(list(rows.fetchall()))
try:
return await asyncio.to_thread(_run)
except ConnectionError:
raise
except Exception as e:
logger.error(f"Error in my_new_tool: {e}")
return format_error_response("Failed to execute. Check server logs for details.")
# Register in handle_list_tools() and handle_tool_call()Key patterns:
Wrap DB work in
asyncio.to_thread(_run)(non-blocking)Call
_set_queryband(tdconn, "tool_name")for audit trailRe-raise
ConnectionErrorfor retry decoratorReturn generic error messages (never
str(e))
Testing
uv sync
export DATABASE_URI="teradata://user:pass@host/db"
uv run tdwm-mcp
# Test with MCP Inspector
npx @modelcontextprotocol/inspector uv run tdwm-mcpDependencies
teradatasql>=20.0.0.30- Teradata SQL drivermcp[cli]>=1.12.3- Model Control Protocol frameworkfastapi>=0.115.12- HTTP framework for SSE/streamable-httppydantic>=2.11.4- Data validationuvicorn>=0.34.2- ASGI serverpyjwt[crypto]>=2.8.0- JWT token handlingauthlib>=1.2.0- OAuth 2.1 clientaiohttp>=3.9.0- Async HTTP for token introspectionhttpx>=0.24.0- HTTP client
This server cannot be deployed
Maintenance
Related MCP Connectors
- mttrlyOAuthcom.mttrly
AI-powered incident management and server monitoring via MCP.
ThousandEyes MCP Server for network intelligence: outages, anomalies, alerts, events, and tests.
Marketing intelligence MCP server providing campaign performance data and analytics tools.
MCP server for Support & Service Management
Related MCP Servers
AlicenseAqualityAmaintenanceA server providing tools for querying and analyzing Teradata databases, including database management, data quality assessment, and SQL execution capabilities through an MCP interface.47738 PyPI56MIT- AlicenseNot gradedqualityCmaintenanceAn MCP server that turns Teradata Vantage into a full-stack analytics agent platform, providing AI agents with structured knowledge of Teradata's native functions for correct and optimal SQL analytics.11MIT
- AlicenseCqualityDmaintenanceMCP server for Teradata databases, providing tools and prompts for querying, analyzing, and managing data through AI agents.38MIT
- AlicenseAqualityDmaintenanceAn MCP server that connects Claude to Teradata GCFR operational reporting, enabling natural-language queries about stream status, process history, loads, transforms, errors, SLA, and data lineage without writing SQL.21MIT