tdsql-mcp 1.3.7__tar.gz → 1.3.9__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 (55) hide show
  1. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/PKG-INFO +1 -1
  2. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/pyproject.toml +1 -1
  3. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/src/tdsql_mcp/server.py +17 -15
  4. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/.env.example +0 -0
  5. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/.gitignore +0 -0
  6. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/CLAUDE.md +0 -0
  7. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/README.md +0 -0
  8. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/docs/architecture.md +0 -0
  9. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/requirements.txt +0 -0
  10. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/README.md +0 -0
  11. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/SKILL.md +0 -0
  12. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/aggregate-functions.md +0 -0
  13. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/ai-text-analytics.md +0 -0
  14. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/association-analysis.md +0 -0
  15. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/authorization-objects.md +0 -0
  16. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/bit-byte-functions.md +0 -0
  17. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/byom-model-loading.md +0 -0
  18. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/byom-scoring.md +0 -0
  19. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/catalog-views.md +0 -0
  20. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/conditional.md +0 -0
  21. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/data-cleaning.md +0 -0
  22. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/data-exploration.md +0 -0
  23. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/data-prep.md +0 -0
  24. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/data-types-casting.md +0 -0
  25. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/date-time.md +0 -0
  26. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/embeddings.md +0 -0
  27. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/fit-transform-pattern.md +0 -0
  28. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/geospatial.md +0 -0
  29. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/guidelines.md +0 -0
  30. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/hypothesis-testing.md +0 -0
  31. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/index.md +0 -0
  32. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/json-functions.md +0 -0
  33. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/llm-providers.md +0 -0
  34. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/ml-functions.md +0 -0
  35. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/ml-patterns.md +0 -0
  36. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/model-evaluation.md +0 -0
  37. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/numeric-functions.md +0 -0
  38. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/path-analysis.md +0 -0
  39. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/query-tuning.md +0 -0
  40. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/sql-basics.md +0 -0
  41. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/string-functions.md +0 -0
  42. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/text-analytics.md +0 -0
  43. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/uaf-concepts.md +0 -0
  44. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/uaf-data-prep.md +0 -0
  45. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/uaf-diagnostics.md +0 -0
  46. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/uaf-dsp.md +0 -0
  47. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/uaf-estimation.md +0 -0
  48. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/uaf-forecasting.md +0 -0
  49. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/uaf-formula-rules.md +0 -0
  50. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/uaf-utility.md +0 -0
  51. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/utility-functions.md +0 -0
  52. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/vector-search.md +0 -0
  53. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/skills/teradata-sql-analytics/syntax/window-functions.md +0 -0
  54. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/src/tdsql_mcp/__init__.py +0 -0
  55. {tdsql_mcp-1.3.7 → tdsql_mcp-1.3.9}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tdsql-mcp
3
- Version: 1.3.7
3
+ Version: 1.3.9
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.7"
7
+ version = "1.3.9"
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"
@@ -23,9 +23,10 @@ mcp = FastMCP(
23
23
  "You are working with a Teradata Vantage database. "
24
24
  "IMPORTANT: Always prefer native Teradata table operators over hand-written SQL equivalents. "
25
25
  "Teradata Vantage has built-in distributed functions for analytics, ML, data preparation, "
26
- "text processing, and vector search. These run across all AMPs in parallel and outperform "
27
- "equivalent hand-written SQL. Do NOT write manual SQL for operations like scaling, encoding, "
28
- "binning, statistics, clustering, classification, or similarity search when a native function exists. "
26
+ "text processing, and vector search that run across all AMPs in parallel. "
27
+ "Do NOT write manual SQL for analytics, ML, data preparation, or search operations — "
28
+ "Teradata has native distributed functions for most of these; always load guidelines and "
29
+ "the relevant syntax topic first. "
29
30
  "CRITICAL: Never write native table operator syntax (nPath, TD_XGBoost, TD_HNSW, UAF functions, "
30
31
  "AI_* functions, etc.) from training knowledge — training data for these functions is frequently "
31
32
  "incomplete or incorrect. Always call get_syntax_help to load authoritative syntax before writing "
@@ -353,11 +354,14 @@ def _parse_uri(uri: str) -> dict[str, Any]:
353
354
  """Parse a Teradata connection URI into a teradatasql.connect() kwargs dict.
354
355
 
355
356
  URI format:
356
- teradata://user:password@host[:port][/database][?param=value&...]
357
+ teradata://[user:password@]host[:port][/database][?param=value&...]
358
+
359
+ user and password are optional — omit them for authentication methods that
360
+ don't use inline credentials (e.g. logmech=BROWSER, logmech=KRB5).
357
361
 
358
362
  URI components map to teradatasql parameters:
359
- user → user
360
- password → password
363
+ user → user (optional)
364
+ password → password (optional)
361
365
  host → host
362
366
  port → dbs_port (Teradata default: 1025)
363
367
  /path → database
@@ -377,7 +381,7 @@ def _parse_uri(uri: str) -> dict[str, Any]:
377
381
  params: dict[str, Any] = {}
378
382
 
379
383
  if not parsed.hostname:
380
- raise ValueError("URI is missing a hostname. Expected: teradata://user:password@host/...")
384
+ raise ValueError("URI is missing a hostname. Expected: teradata://host/database or teradata://user:password@host/database")
381
385
 
382
386
  params["host"] = parsed.hostname
383
387
 
@@ -400,11 +404,6 @@ def _parse_uri(uri: str) -> dict[str, Any]:
400
404
  for key, values in parse_qs(parsed.query, keep_blank_values=True).items():
401
405
  params[key] = values[0]
402
406
 
403
- if not params.get("user"):
404
- raise ValueError("URI is missing a username. Expected: teradata://user:password@host/...")
405
- if not params.get("password"):
406
- raise ValueError("URI is missing a password. Expected: teradata://user:password@host/...")
407
-
408
407
  return params
409
408
 
410
409
 
@@ -423,11 +422,14 @@ def main() -> None:
423
422
  formatter_class=argparse.RawDescriptionHelpFormatter,
424
423
  epilog=(
425
424
  "Connection URI format:\n"
426
- " teradata://user:password@host[:port][/database][?param=value&...]\n\n"
425
+ " teradata://[user:password@]host[:port][/database][?param=value&...]\n\n"
426
+ "Credentials are optional — omit them for browser or Kerberos auth.\n\n"
427
427
  "Examples:\n"
428
428
  " teradata://alice:s3cr3t@myhost/mydb\n"
429
429
  " teradata://alice:s3cr3t@myhost:1025/mydb?logmech=LDAP&encryptdata=true\n"
430
- " teradata://alice:s3cr3t@myhost/mydb?logon_timeout=30&sslmode=VERIFY-FULL\n\n"
430
+ " teradata://alice:s3cr3t@myhost/mydb?logon_timeout=30&sslmode=VERIFY-FULL\n"
431
+ " teradata://myhost/mydb?logmech=BROWSER\n"
432
+ " teradata://myhost/mydb?logmech=KRB5\n\n"
431
433
  "Any teradatasql connection parameter can be added as a query-string argument.\n"
432
434
  "See: https://github.com/Teradata/python-driver#connection-parameters"
433
435
  ),
@@ -464,7 +466,7 @@ def main() -> None:
464
466
  parser.error(
465
467
  "A connection URI is required.\n"
466
468
  "Set DATABASE_URI env var or pass --uri.\n"
467
- "Format: teradata://user:password@host/database"
469
+ "Format: teradata://[user:password@]host/database[?logmech=BROWSER]"
468
470
  )
469
471
 
470
472
  try:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes