tdsql-mcp 1.3.0__tar.gz → 1.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/PKG-INFO +1 -1
  2. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/pyproject.toml +1 -1
  3. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/catalog-views.md +20 -4
  4. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/guidelines.md +1 -1
  5. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/src/tdsql_mcp/server.py +16 -1
  6. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/.env.example +0 -0
  7. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/.gitignore +0 -0
  8. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/8888 +0 -0
  9. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/CLAUDE.md +0 -0
  10. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/README.md +0 -0
  11. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/docs/architecture.md +0 -0
  12. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/requirements.txt +0 -0
  13. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/README.md +0 -0
  14. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/SKILL.md +0 -0
  15. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/aggregate-functions.md +0 -0
  16. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/ai-text-analytics.md +0 -0
  17. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/association-analysis.md +0 -0
  18. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/authorization-objects.md +0 -0
  19. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/bit-byte-functions.md +0 -0
  20. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/byom-model-loading.md +0 -0
  21. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/byom-scoring.md +0 -0
  22. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/conditional.md +0 -0
  23. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/data-cleaning.md +0 -0
  24. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/data-exploration.md +0 -0
  25. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/data-prep.md +0 -0
  26. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/data-types-casting.md +0 -0
  27. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/date-time.md +0 -0
  28. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/embeddings.md +0 -0
  29. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/fit-transform-pattern.md +0 -0
  30. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/geospatial.md +0 -0
  31. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/hypothesis-testing.md +0 -0
  32. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/index.md +0 -0
  33. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/json-functions.md +0 -0
  34. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/llm-providers.md +0 -0
  35. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/ml-functions.md +0 -0
  36. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/ml-patterns.md +0 -0
  37. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/model-evaluation.md +0 -0
  38. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/numeric-functions.md +0 -0
  39. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/path-analysis.md +0 -0
  40. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/query-tuning.md +0 -0
  41. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/sql-basics.md +0 -0
  42. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/string-functions.md +0 -0
  43. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/text-analytics.md +0 -0
  44. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/uaf-concepts.md +0 -0
  45. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/uaf-data-prep.md +0 -0
  46. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/uaf-diagnostics.md +0 -0
  47. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/uaf-dsp.md +0 -0
  48. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/uaf-estimation.md +0 -0
  49. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/uaf-forecasting.md +0 -0
  50. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/uaf-formula-rules.md +0 -0
  51. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/uaf-utility.md +0 -0
  52. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/utility-functions.md +0 -0
  53. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/vector-search.md +0 -0
  54. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/skills/teradata-sql-analytics/syntax/window-functions.md +0 -0
  55. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/src/tdsql_mcp/__init__.py +0 -0
  56. {tdsql_mcp-1.3.0 → tdsql_mcp-1.3.2}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tdsql-mcp
3
- Version: 1.3.0
3
+ Version: 1.3.2
4
4
  Summary: MCP server for Teradata Vantage — SQL execution and native analytics function reference for AI agents
5
5
  Project-URL: Homepage, https://github.com/ksturgeon-td/tdsql-mcp
6
6
  Project-URL: Repository, https://github.com/ksturgeon-td/tdsql-mcp
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "tdsql-mcp"
7
- version = "1.3.0"
7
+ version = "1.3.2"
8
8
  description = "MCP server for Teradata Vantage — SQL execution and native analytics function reference for AI agents"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -98,15 +98,31 @@ WHERE DatabaseName = 'mydb' AND TableName = 'mytable'
98
98
  ORDER BY ColumnName;
99
99
  ```
100
100
 
101
- ## Access Rights
101
+ ## Listing Accessible Databases
102
+
103
+ Prefer the `list_databases` MCP tool — it calls `DBC.DatabasesV` which already filters to databases visible to the current session.
104
+
105
+ `DBC.DatabasesV` answers "what databases exist and are visible to me?"
106
+ `DBC.AllRightsV` answers "what databases do I have explicit rights on?" (includes role-inherited grants)
107
+
108
+ Use `DBC.AllRightsV` when you need to know what rights a specific user holds:
109
+
102
110
  ```sql
103
- -- What access does the current user have on a database?
111
+ -- Databases a user has rights on (includes role-inherited grants)
112
+ SELECT DISTINCT DatabaseName
113
+ FROM DBC.AllRightsV
114
+ WHERE UserName = 'some_user'
115
+ ORDER BY DatabaseName;
116
+
117
+ -- Full rights detail for a user
104
118
  SELECT AccessRight, DatabaseName, TableName
105
- FROM DBC.UserRightsV
106
- WHERE UserName = USER
119
+ FROM DBC.AllRightsV
120
+ WHERE UserName = 'some_user'
107
121
  ORDER BY DatabaseName, TableName;
108
122
  ```
109
123
 
124
+ > **Do not use `DBC.UserRightsV` for database enumeration** — it shows only directly granted rights and misses role-inherited access. Use `DBC.AllRightsV` for a complete picture.
125
+
110
126
  ## Common Lookup Patterns
111
127
  ```sql
112
128
  -- Fully qualified table info in one query
@@ -353,7 +353,7 @@ Native functions do not cover everything. Use hand-written SQL for:
353
353
  - Date/time arithmetic (`date-time`)
354
354
  - CASE expressions and NULL handling (`conditional`)
355
355
  - Window functions for lag/lead features, running totals (`window-functions`)
356
- - Schema discovery queries against DBC.* views (`catalog-views`)
356
+ - Schema discovery via MCP tools first — `list_databases`, `list_tables`, `describe_table` cover the common cases; fall back to manual DBC.* queries only for capabilities not covered by those tools (`catalog-views`)
357
357
  - Bit/byte manipulation — `BITAND`, `BITOR`, `BITXOR`, `BITNOT`, `SHIFTLEFT`/`SHIFTRIGHT`, `ROTATELEFT`/`ROTATERIGHT`, `GETBIT`, `SETBIT`, `COUNTSET`, `SUBBITSTR`, `TO_BYTE` — all Teradata-specific functions, **no ANSI equivalents**; do not use `&`, `|`, `^`, `~` operators (`bit-byte-functions`)
358
358
  - JSON data — native `JSON` type with BSON/UBJSON binary formats; JSONPath extraction; shredding (JSON→relational) and publishing (relational→JSON) — all in-database (`json-functions`)
359
359
  - One-off computations not covered by any native function
@@ -81,6 +81,18 @@ def _require_write() -> None:
81
81
  raise PermissionError("Server is running in read-only mode; write operations are disabled.")
82
82
 
83
83
 
84
+ def _maybe_parse_json(value: Any) -> Any:
85
+ """If a value is a string that looks like a JSON object or array, parse it."""
86
+ if isinstance(value, str):
87
+ s = value.strip()
88
+ if s and s[0] in ('{', '['):
89
+ try:
90
+ return json.loads(s)
91
+ except Exception:
92
+ pass
93
+ return value
94
+
95
+
84
96
  def _execute_query_internal(sql: str, params: list | None = None) -> list[dict]:
85
97
  with _conn_lock:
86
98
  conn = _reconnect_if_needed()
@@ -120,7 +132,10 @@ def execute_query(sql: str, max_rows: int = 100) -> str:
120
132
  return json.dumps({"rows": [], "row_count": 0, "truncated": False})
121
133
  columns = [desc[0] for desc in cur.description]
122
134
  rows = cur.fetchmany(max_rows)
123
- result = [dict(zip(columns, row)) for row in rows]
135
+ result = [
136
+ dict(zip(columns, (_maybe_parse_json(v) for v in row)))
137
+ for row in rows
138
+ ]
124
139
  # Peek to detect truncation without fetching everything
125
140
  truncated = cur.fetchone() is not None
126
141
  return json.dumps(
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes