Teradata工作负载管理服务器

一个用于Teradata工作负载管理的模型控制协议服务器,提供全面的监控和管理功能。

  • by arturborycki
  • Python
  • 本地部署
  • 4 星标
  • 更新于
在 GitHub 查看 arturborycki/tdwm-mcp

使用说明

Teradata工作负载管理(WLM)MCP服务器

用于Teradata工作负载管理(WLM)的模型控制协议(MCP)服务器,为Teradata系统提供全面的监控和管理功能。

特性

  • 41管理工具:28个核心监控工具+13个配置管理工具
  • 39 MCP资源:参考数据、模板、规则集探索和工作流指导
  • 完全Teradata连接:TD2、LDAP、Kerberos、TDNEGO、JWT身份验证
  • TLS/SSL支持:允许、首选、必需、验证-CA、验证-FULL模式
  • 每工具审计跟踪:用于工作负载管理的每个工具调用的QueryBand跟踪
  • 异步数据库操作:所有数据库调用都在线程池中运行(非阻塞)
  • 连接弹性:具有指数退避和抖动的智能重试
  • 连接健康监控:自动健康检查和恢复
  • OAuth 2.1身份验证:可选Keycloak与基于作用域的访问控制集成
  • 模板驱动配置:常见TDWM配置的预构建模式
  • 通用错误消息:没有原始数据库错误泄露给客户端

用例

性能故障排除

场景:确定查询运行缓慢或延迟的原因

使用工具:

  1. show_sessions -识别活动会话及其状态
  2. identify_blocking -查找导致阻塞的会话
  3. show_sql_text_for_session -查看正在运行的SQL
  4. monitor_amp_load -检查AMP利用率
  5. display_delay_queue -查看查询是否延迟
  6. show_tasm_statistics -分析TASM工作负载分布

可供探索的资源:

  • tdwm://summary -系统总体状态
  • tdwm://throttle-statistics -当前油门限制和延迟

应急响应

场景:系统过载,需要快速限制工作负载

工作流程:

  1. 使用 tdwm://workflow/emergency-throttle 分步指南资源
  2. 使用 tdwm://template/throttle/application-basic 用于快速节流模式
  3. create_system_throttle 具有低并发限制
  4. enable_throttle 激活
  5. activate_ruleset 立即应用更改
  6. 监视器 show_trottle_statistics

定期维护

场景:在维护窗口期间阻止用户访问

工作流程:

  1. 使用 tdwm://workflow/maintenance-window 获取完整指南
  2. 使用创建筛选器 create_filter 针对所有用户或特定应用
  3. enable_filter + activate_ruleset 阻止访问
  4. 进行维护
  5. disable_filter + activate_ruleset 恢复访问权限

安装

pip install tdwm-mcp

快速开始

# 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

配置

所有配置都是通过环境变量完成的。看 .env.example 以获取完整的参考。

数据库连接

# Connection URL (required)
export DATABASE_URI="teradata://username:password@hostname/database"

认证机制

服务器通过以下方式支持所有Teradata身份验证方法 DB_LOGMECH 环境变量:

TD2(默认-用户名/密码)

export DATABASE_URI="teradata://username:password@hostname/database"
# DB_LOGMECH=TD2 is the default, no need to set explicitly

轻量级目录访问协议

export DATABASE_URI="teradata://@hostname/database"
export DB_LOGMECH=LDAP
export DB_LOGDATA="authcid=user@domain.com password=ldap_password"
目录 身份验证格式
Active Directory(简单) user@domain.com
活动目录(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(代币协商)

export DB_LOGMECH=TDNEGO
# Negotiates between TD2, LDAP, KRB5 automatically

JWT(JSON Web令牌)

export DATABASE_URI="teradata://@hostname/database"
export DB_LOGMECH=JWT
export DB_LOGDATA="authcid=token_issuer password=jwt_token_string"

TLS/SSL配置

# SSL mode: ALLOW, PREFER, REQUIRE, VERIFY-CA, VERIFY-FULL
export DB_SSL_MODE=REQUIRE

# Transport encryption (default: true)
export DB_ENCRYPT_DATA=true
模式 描述
ALLOW 尝试SSL,回退到明文
PREFER 更喜欢SSL,但允许明文
REQUIRE 需要SSL,如果不可用则失败
VERIFY-CA 验证CA证书
VERIFY-FULL 验证CA和主机名

传输配置

# 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配置

# Allowed origins (default: * for all)
export CORS_ALLOWED_ORIGINS="https://your-app.example.com"

重试配置

# 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(可选)

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

范围: tdwm:read, tdwm:write, tdwm:admin, tdwm:query, tdwm:monitor, tdwm:workload

码头工人

所有docker组合文件都使用环境变量扩展,没有硬编码凭据。创建 .env 文件来自 .env.example 跑步前。

# 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

连接弹性

服务器包括用于处理Teradata连接失败的自动重试逻辑。

运作原理

所有工具都包含一个智能重试装饰器,该装饰器:

  1. 检测连接错误 -区分连接失败(可重试)和SQL错误(不可重试)
  2. 智能重试逻辑 -基于操作安全:
    • 读取操作 (查询、监视):最多重试2次
    • 写入操作 (创建、更新):最多重试1次
    • 危险作业 (删除、中止):不自动重试
  3. 指数退避 -具有抖动的渐进延迟(0.5s->1.0s->2.0s)
  4. 健康监测 -每5分钟通过以下方式进行一次连接健康检查 SELECT 1

检测到Teradata错误

  • 网络超时和断开连接
  • 会话断开连接(错误3126)
  • 由于TDWM终止,交易中止(错误2631)
  • 超出会话限制(错误8017)
  • 通信链路故障

按工具查询带

每次工具调用都会为审计和工作负载管理设置一个事务级QueryBand:

SET QUERY_BAND = 'ApplicationName=TDWM_MCP;ToolName=show_sessions;Transport=stdio;' FOR TRANSACTION

这使Teradata管理员能够跟踪每个查询是由哪个MCP工具发起的。

建筑

+------------------------------------------------------------+
|                    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)                             |
+--------------------------------------------------------------+

模块组织

模块 目的
settings.py 冻结设置数据类-启动时读取一次所有环境变量
queryband.py 具有值净化功能的按工具QueryBand构建器
tdsql/tdsql.py 支持LOGMECH/TLS的Teradata连接包装器
connection_manager.py 连接健康监控、重试、重新连接
retry_utils.py @with_connection_retry() 错误检测装饰器
fnc_common.py 共享实用程序、连接访问、查询带助手
fnc_tools.py 28个核心监控工具(异步,带queryband)
fnc_tools_priority1.py 13种配置管理工具
fnc_resources.py 39个MCP资源处理程序
resource_reference.py 参考数据资源(8)
resource_templates.py 配置模板(13)
resource_queries.py 规则集探索查询(8)
server.py FastMCP应用程序、传输设置、初始化
oauth_context.py 基于OAuth作用域的授权
auth/ OAuth 2.1配置、中间件、端点、元数据

依赖图

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)

可用工具

会话管理

  • show_sessions -显示我的活动会话
  • show_sql_steps_for_session -显示特定会话的SQL执行步骤
  • show_sql_text_for_session -显示特定会话的SQL文本
  • abort_sessions_user -中止特定用户的所有会话
  • 识别阻塞 -识别导致阻塞情况的用户

查询频带和监控

  • 监视器会话查询带 -监视特定会话的查询带
  • list_query_band -按类型列出查询带(事务、概要、会话或全部)
  • show_query_log -显示特定用户的查询日志

系统资源监控

  • show_physical_resources -监控系统物理资源
  • monitor_amp_load -监控AMP(访问模块处理器)负载
  • 监视器_ awt -监控AWT(AMP Worker Task)资源
  • monitor_config -监控虚拟配置

负载管理

  • list_active_WD -列出活动工作负载(WD)
  • 列表_WD -列出所有工作负载(WD)
  • show_tdwm_summary -显示工作负载摘要信息

延迟队列管理

  • list_delayed_request -列出所有延迟查询
  • 中止延迟请求 -中止特定会话的延迟请求
  • display_delay_queue -按类型显示延迟队列详细信息(工作负载、系统、公用事业或全部)
  • release_delay_queue -释放会话或用户的延迟请求

油门和性能

  • show_trottle_统计 -显示油门统计信息(全部、查询、会话、工作负载)
  • list_utility_stats -列出系统上公用设施使用情况的统计信息

系统信息

  • show_cod_限制 -显示COD(按需容量)限制
  • show_top_users -显示消耗最多资源的用户
  • show_sw_event_log -显示系统软件事件日志(操作或全部)

Teradata主动系统管理

  • tdwm_list_分类 -列出工作负载(TASM)规则的分类类型
  • show_tasm_统计 -显示TASM性能统计数据
  • show_tasm_even_history -显示TASM事件历史记录
  • show_tasm_rule_history_red -显示导致系统进入红色状态的原因

配置管理

油门管理

  • create_system_throttle -创建具有并发限制的系统级限制
  • 修改油门限制 -动态调整油门并发限制
  • 删除_删除 -删除油门定义
  • enable_throttle -激活油门规则
  • disable_throttle -停用油门规则

过滤器管理

  • create_filter -创建过滤器以阻止/拒绝查询
  • delete_filter -删除筛选器定义
  • 启用筛选器 -激活筛选规则
  • disable_filter -停用筛选规则

规则管理

  • 添加分类到规则 -将分类标准添加到任何规则中
  • add_subcriteria_to_target -添加子标准(例如,表格的FTSCAN)
  • 激活规则集 -应用所有待定更改以使其生效
  • list_rulesets -列出所有可用的规则集

可用资源

参考数据资源

  • tdwm://reference/classification-types -所有31种分类类型
  • tdwm://reference/classification-types/{category} -按类别筛选
  • tdwm://reference/operators -分类运算符(I、O、IO)
  • tdwm://reference/subcriteria-types -子标准类型(FTSCAN、MINSTEPTIME等)
  • tdwm://reference/actions -筛选操作类型(E=异常,A=中止)
  • tdwm://reference/throttle-types -油门类型(DM、M)
  • tdwm://reference/states -TASM系统状态(绿色、黄色、橙色、红色)
  • tdwm://reference/catalog -所有参考资源的综合目录

配置模板

  • tdwm://templates/throttle -列出所有油门模板
  • tdwm://template/throttle/{template_id} -特定油门模板
  • tdwm://templates/filter -列出所有筛选器模板
  • tdwm://template/filter/{template_id} -特定筛选器模板
  • tdwm://templates/catalog -模板目录

规则集探索

  • tdwm://rulesets -列出所有可用的规则集
  • tdwm://system/active-ruleset -获取当前活动的规则集名称
  • tdwm://ruleset/{ruleset_name} -详细的规则集信息
  • tdwm://ruleset/{name}/throttles -规则集中的列表限制
  • tdwm://ruleset/{name}/throttle/{throttle_name} -油门详细信息
  • tdwm://ruleset/{name}/filters -在规则集中列出筛选器
  • tdwm://ruleset/{name}/filter/{filter_name} -筛选器详细信息
  • tdwm://ruleset/{name}/pending-changes -检查待处理的更改

工作流模板

  • tdwm://workflows -列出所有可用工作流
  • tdwm://workflow/create-throttle -完成油门创建工作流程
  • tdwm://workflow/create-filter -完成过滤器创建工作流程
  • tdwm://workflow/maintenance-window -启用/禁用过滤器进行维护
  • tdwm://workflow/emergency-throttle -快速应急响应工作流程
  • tdwm://workflow/modify-existing-throttle -修改现有节流工作流

遗留资源

  • tdwm://sessions, tdwm://workloads, tdwm://active-workloads, tdwm://summary
  • tdwm://delayed-queries, tdwm://throttle-statistics, tdwm://physical-resources
  • tdwm://amp-load, tdwm://classification-types

使用示例

基本会话监控

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})

创建系统节流阀

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"}
    ]
})

创建维护窗口筛选器

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"
})

模板驱动配置

# 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")

安全

凭证处理

  • 仅通过环境变量的数据库凭据(从未硬编码)
  • 通过以下方式在所有日志消息和错误输出中混淆密码 obfuscate_password()
  • 面向客户端的错误是通用的(“检查服务器日志以获取详细信息”)-没有泄漏原始异常
  • Docker编写文件使用 ${VAR} 扩展-版本控制中没有真正的凭据

SQL安全

  • 所有用户提供的参数都使用参数化查询(? 占位符)
  • 通过调用TDWM存储过程 CALL ... (?, ?, ?) 模式
  • 在使用之前,会话号已验证为整数 MonitorSQLSteps / MonitorSQLText

OAuth 2.1

  • 使用RS256/RS384/RS512/ES256/ES384/ES512进行JWT验证
  • 通过Keycloak进行令牌自检回退
  • 每个工具的基于范围的访问控制(读/写/管理/查询/监视)
  • HTTPS强制可通过以下方式配置 OAUTH_REQUIRE_HTTPS

异步安全

  • 所有数据库操作都包含在 asyncio.to_thread() (事件循环从未被阻塞)
  • 连接管理器使用 asyncio.Lock() 防止并发的重新连接竞争
  • 按工具QueryBand设置为 FOR TRANSACTION (非会话级别,无跨工具泄漏)

发展

项目结构

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

添加新工具

# 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()

关键模式:

  • 将数据库工作打包 asyncio.to_thread(_run) (非阻塞)
  • 呼叫 _set_queryband(tdconn, "tool_name") 用于审计跟踪
  • 再加注 ConnectionError 用于重试装饰器
  • 返回通用错误消息(从不 str(e))

测试

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

依赖项

  • teradatasql>=20.0.0.30 -Teradata SQL驱动程序
  • mcp[cli]>=1.12.3 -模型控制协议框架
  • fastapi>=0.115.12 -SSE/流式传输HTTP框架
  • pydantic>=2.11.4 -数据验证
  • uvicorn>=0.34.2 -ASGI服务器
  • pyjwt[crypto]>=2.8.0 -JWT令牌处理
  • authlib>=1.2.0 -OAuth 2.1客户端
  • aiohttp>=3.9.0 -异步HTTP用于令牌自检
  • httpx>=0.24.0 -HTTP客户端