使用说明
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配置的预构建模式
- 通用错误消息:没有原始数据库错误泄露给客户端
用例
性能故障排除
场景:确定查询运行缓慢或延迟的原因
使用工具:
show_sessions-识别活动会话及其状态identify_blocking-查找导致阻塞的会话show_sql_text_for_session-查看正在运行的SQLmonitor_amp_load-检查AMP利用率display_delay_queue-查看查询是否延迟show_tasm_statistics-分析TASM工作负载分布
可供探索的资源:
tdwm://summary-系统总体状态tdwm://throttle-statistics-当前油门限制和延迟
应急响应
场景:系统过载,需要快速限制工作负载
工作流程:
- 使用
tdwm://workflow/emergency-throttle分步指南资源 - 使用
tdwm://template/throttle/application-basic用于快速节流模式 create_system_throttle具有低并发限制enable_throttle激活activate_ruleset立即应用更改- 监视器
show_trottle_statistics
定期维护
场景:在维护窗口期间阻止用户访问
工作流程:
- 使用
tdwm://workflow/maintenance-window获取完整指南 - 使用创建筛选器
create_filter针对所有用户或特定应用 enable_filter+activate_ruleset阻止访问- 进行维护
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连接失败的自动重试逻辑。
运作原理
所有工具都包含一个智能重试装饰器,该装饰器:
- 检测连接错误 -区分连接失败(可重试)和SQL错误(不可重试)
- 智能重试逻辑 -基于操作安全:
- 读取操作 (查询、监视):最多重试2次
- 写入操作 (创建、更新):最多重试1次
- 危险作业 (删除、中止):不自动重试
- 指数退避 -具有抖动的渐进延迟(0.5s->1.0s->2.0s)
- 健康监测 -每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://summarytdwm://delayed-queries,tdwm://throttle-statistics,tdwm://physical-resourcestdwm://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客户端
