Teradata Workload Management (WLM) MCP Server

Teradata Workload Management (WLM) MCP Server

An MCP server that provides comprehensive monitoring and management capabilities for Teradata Workload Management (WLM), enabling tasks like performance troubleshooting, emergency throttling, and scheduled maintenance through 41 tools and 39 resources.

Category
访问服务器

README

Teradata Workload Management (WLM) MCP Server

Python 3.13+ MCP

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

Use Cases

Performance Troubleshooting

Scenario: Identify why queries are running slowly or getting delayed

Tools to use:

  1. show_sessions - Identify active sessions and their state
  2. identify_blocking - Find sessions causing blocks
  3. show_sql_text_for_session - See what SQL is running
  4. monitor_amp_load - Check AMP utilization
  5. display_delay_queue - See if queries are delayed
  6. show_tasm_statistics - Analyze TASM workload distribution

Resources to explore:

  • tdwm://summary - Overall system status
  • tdwm://throttle-statistics - Current throttle limits and delays

Emergency Response

Scenario: System is overloaded, need to quickly restrict workload

Workflow:

  1. Use tdwm://workflow/emergency-throttle resource for step-by-step guide
  2. Use tdwm://template/throttle/application-basic for quick throttle pattern
  3. create_system_throttle with low concurrency limit
  4. enable_throttle to activate
  5. activate_ruleset to apply changes immediately
  6. Monitor with show_trottle_statistics

Scheduled Maintenance

Scenario: Block user access during maintenance window

Workflow:

  1. Use tdwm://workflow/maintenance-window for complete guide
  2. Create filter with create_filter targeting all users or specific applications
  3. enable_filter + activate_ruleset to block access
  4. Perform maintenance
  5. disable_filter + activate_ruleset to restore access

Installation

pip install tdwm-mcp

Quick 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_sessions

Configuration

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 explicitly

LDAP

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) user@domain.com
Active Directory (DIGEST-MD5) DOMAIN\username
OpenLDAP / Sun DS username

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 automatically

JWT (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=true
Mode Description
ALLOW Try SSL, fall back to plaintext
PREFER Prefer SSL, but allow plaintext
REQUIRE Require SSL, fail if not available
VERIFY-CA Verify CA certificate
VERIFY-FULL 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.0

OAuth 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=true

Scopes: 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 -d

Connection 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:

  1. Detects Connection Errors - Distinguishes between connection failures (retryable) and SQL errors (not retryable)
  2. 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
  3. Exponential Backoff - Progressive delays (0.5s -> 1.0s -> 2.0s) with jitter
  4. 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 TRANSACTION

This 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
settings.py Frozen Settings dataclass - all env vars read once at startup
queryband.py Per-tool QueryBand builder with value sanitization
tdsql/tdsql.py Teradata connection wrapper with LOGMECH/TLS support
connection_manager.py Connection health monitoring, retry, reconnection
retry_utils.py @with_connection_retry() decorator, error detection
fnc_common.py Shared utilities, connection access, queryband helper
fnc_tools.py 28 core monitoring tools (async, with queryband)
fnc_tools_priority1.py 13 configuration management tools
fnc_resources.py 39 MCP resource handlers
resource_reference.py Reference data resources (8)
resource_templates.py Configuration templates (13)
resource_queries.py Ruleset exploration queries (8)
server.py FastMCP app, transport setup, initialization
oauth_context.py OAuth scope-based authorization
auth/ 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 categories
  • tdwm://reference/classification-types/{category} - Filter by category
  • tdwm://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 templates
  • tdwm://template/throttle/{template_id} - Specific throttle template
  • tdwm://templates/filter - List all filter templates
  • tdwm://template/filter/{template_id} - Specific filter template
  • tdwm://templates/catalog - Templates catalog

Ruleset Exploration

  • tdwm://rulesets - List all available rulesets
  • tdwm://system/active-ruleset - Get currently active ruleset name
  • tdwm://ruleset/{ruleset_name} - Detailed ruleset information
  • tdwm://ruleset/{name}/throttles - List throttles in ruleset
  • tdwm://ruleset/{name}/throttle/{throttle_name} - Throttle details
  • tdwm://ruleset/{name}/filters - List filters in ruleset
  • tdwm://ruleset/{name}/filter/{filter_name} - Filter details
  • tdwm://ruleset/{name}/pending-changes - Check pending changes

Workflow Templates

  • tdwm://workflows - List all available workflows
  • tdwm://workflow/create-throttle - Complete throttle creation workflow
  • tdwm://workflow/create-filter - Complete filter creation workflow
  • tdwm://workflow/maintenance-window - Enable/disable filters for maintenance
  • tdwm://workflow/emergency-throttle - Quick emergency response workflow
  • tdwm://workflow/modify-existing-throttle - Modify existing throttle workflow

Legacy Resources

  • tdwm://sessions, tdwm://workloads, tdwm://active-workloads, tdwm://summary
  • tdwm://delayed-queries, tdwm://throttle-statistics, tdwm://physical-resources
  • tdwm://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 ... (?, ?, ?) pattern
  • Session 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 races
  • Per-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.md

Adding 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 trail
  • Re-raise ConnectionError for retry decorator
  • Return 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-mcp

Dependencies

  • teradatasql>=20.0.0.30 - Teradata SQL driver
  • mcp[cli]>=1.12.3 - Model Control Protocol framework
  • fastapi>=0.115.12 - HTTP framework for SSE/streamable-http
  • pydantic>=2.11.4 - Data validation
  • uvicorn>=0.34.2 - ASGI server
  • pyjwt[crypto]>=2.8.0 - JWT token handling
  • authlib>=1.2.0 - OAuth 2.1 client
  • aiohttp>=3.9.0 - Async HTTP for token introspection
  • httpx>=0.24.0 - HTTP client

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选