sql-safe-mcp 1.3.0__tar.gz → 1.3.1__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 (33) hide show
  1. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/CHANGELOG.md +8 -0
  2. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/PKG-INFO +2 -2
  3. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/README.md +1 -1
  4. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/pyproject.toml +1 -1
  5. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/server.json +2 -2
  6. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/__init__.py +1 -1
  7. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/config.py +10 -1
  8. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/mcp_server.py +1 -1
  9. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/.gitignore +0 -0
  10. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/LICENSE +0 -0
  11. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/sql-safe-mcp.example.yaml +0 -0
  12. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/__main__.py +0 -0
  13. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/db/__init__.py +0 -0
  14. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/db/extras.py +0 -0
  15. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/db/mysql.py +0 -0
  16. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/db/reflection.py +0 -0
  17. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/db/registry.py +0 -0
  18. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/db/sqlserver.py +0 -0
  19. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/diagnostics.py +0 -0
  20. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/errors.py +0 -0
  21. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/models.py +0 -0
  22. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/__init__.py +0 -0
  23. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/dialect.py +0 -0
  24. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/executor.py +0 -0
  25. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/lineage.py +0 -0
  26. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/parser.py +0 -0
  27. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/pipeline.py +0 -0
  28. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/policy.py +0 -0
  29. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/reasons.py +0 -0
  30. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/schema.py +0 -0
  31. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/tokens.py +0 -0
  32. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/validated_query.py +0 -0
  33. {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/service.py +0 -0
@@ -7,6 +7,14 @@ categories `Added`, `Changed`, `Deprecated`, `Removed`, `Fixed`, and `Security`.
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.3.1] - 2026-09-21
11
+
12
+ ### Changed
13
+
14
+ - A `${NAME}` placeholder embedded in `connection_url` whose value puts an encoded character into
15
+ the host, such as a `host:port` value whose `:` becomes `%3A`, is now a startup error that names
16
+ the cause. Before, the server started and every call failed after the driver's login timeout.
17
+
10
18
  ## [1.3.0] - 2026-09-21
11
19
 
12
20
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sql-safe-mcp
3
- Version: 1.3.0
3
+ Version: 1.3.1
4
4
  Summary: Minimal, read-only, PII-safe MCP server for SQL databases.
5
5
  License: MIT License
6
6
 
@@ -137,7 +137,7 @@ or
137
137
  pip install sql-safe-mcp
138
138
  ```
139
139
 
140
- Pin a version when you want a fixed surface: `uvx sql-safe-mcp==1.3.0`.
140
+ Pin a version when you want a fixed surface: `uvx sql-safe-mcp==1.3.1`.
141
141
 
142
142
  Requires Python 3.12+, [uv](https://docs.astral.sh/uv/) (or `pip`), and
143
143
  [Microsoft ODBC Driver 18 for SQL Server](https://learn.microsoft.com/sql/connect/odbc/download-odbc-driver-for-sql-server)
@@ -99,7 +99,7 @@ or
99
99
  pip install sql-safe-mcp
100
100
  ```
101
101
 
102
- Pin a version when you want a fixed surface: `uvx sql-safe-mcp==1.3.0`.
102
+ Pin a version when you want a fixed surface: `uvx sql-safe-mcp==1.3.1`.
103
103
 
104
104
  Requires Python 3.12+, [uv](https://docs.astral.sh/uv/) (or `pip`), and
105
105
  [Microsoft ODBC Driver 18 for SQL Server](https://learn.microsoft.com/sql/connect/odbc/download-odbc-driver-for-sql-server)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sql-safe-mcp"
3
- version = "1.3.0"
3
+ version = "1.3.1"
4
4
  description = "Minimal, read-only, PII-safe MCP server for SQL databases."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12,<3.15"
@@ -7,12 +7,12 @@
7
7
  "url": "https://github.com/proprock/sql-safe-mcp",
8
8
  "source": "github"
9
9
  },
10
- "version": "1.3.0",
10
+ "version": "1.3.1",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "pypi",
14
14
  "identifier": "sql-safe-mcp",
15
- "version": "1.3.0",
15
+ "version": "1.3.1",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }
@@ -1,3 +1,3 @@
1
1
  """Minimal, PII-safe MCP server for relational databases."""
2
2
 
3
- __version__ = "1.3.0"
3
+ __version__ = "1.3.1"
@@ -75,6 +75,8 @@ class PiiConfig(BaseModel):
75
75
  rules: list[PiiRule] = Field(min_length=1)
76
76
 
77
77
 
78
+ _PERCENT_ESCAPE = re.compile(r"%[0-9A-Fa-f]{2}")
79
+
78
80
  _DRIVERNAMES = {
79
81
  "sqlserver": "mssql+pyodbc",
80
82
  "mysql": "mysql+pymysql",
@@ -102,7 +104,14 @@ class ServerConfig(BaseModel):
102
104
  elif self.pii_key_env is not None or self.pii is not None:
103
105
  raise ValueError("metadata servers cannot configure pii_key_env or pii rules")
104
106
 
105
- driver = make_url(self.connection_url.get_secret_value()).drivername
107
+ url = make_url(self.connection_url.get_secret_value())
108
+ if url.host and _PERCENT_ESCAPE.search(url.host):
109
+ raise ValueError(
110
+ "connection_url host contains an encoded character; a ${NAME} placeholder inside "
111
+ "a URL is URL-encoded, so a 'host:port' value breaks. "
112
+ "Use separate ${HOST} and ${PORT} variables"
113
+ )
114
+ driver = url.drivername
106
115
  expected = _DRIVERNAMES[self.engine]
107
116
  if driver != expected:
108
117
  raise ValueError(f"engine {self.engine!r} requires SQLAlchemy dialect {expected!r}")
@@ -52,7 +52,7 @@ def create_server(config: AppConfig) -> MCPServer[AppContext]:
52
52
  server: MCPServer[AppContext] = MCPServer(
53
53
  "sql-safe-mcp",
54
54
  description="Minimal, read-only, PII-safe SQL database navigation.",
55
- version="1.3.0",
55
+ version="1.3.1",
56
56
  lifespan=lifespan,
57
57
  log_level=config.logging.level,
58
58
  )
File without changes
File without changes