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.
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/CHANGELOG.md +8 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/PKG-INFO +2 -2
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/README.md +1 -1
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/pyproject.toml +1 -1
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/server.json +2 -2
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/__init__.py +1 -1
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/config.py +10 -1
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/mcp_server.py +1 -1
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/.gitignore +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/LICENSE +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/sql-safe-mcp.example.yaml +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/__main__.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/db/__init__.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/db/extras.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/db/mysql.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/db/reflection.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/db/registry.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/db/sqlserver.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/diagnostics.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/errors.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/models.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/__init__.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/dialect.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/executor.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/lineage.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/parser.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/pipeline.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/policy.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/reasons.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/schema.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/tokens.py +0 -0
- {sql_safe_mcp-1.3.0 → sql_safe_mcp-1.3.1}/src/sql_safe_mcp/security/validated_query.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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)
|
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
"url": "https://github.com/proprock/sql-safe-mcp",
|
|
8
8
|
"source": "github"
|
|
9
9
|
},
|
|
10
|
-
"version": "1.3.
|
|
10
|
+
"version": "1.3.1",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "pypi",
|
|
14
14
|
"identifier": "sql-safe-mcp",
|
|
15
|
-
"version": "1.3.
|
|
15
|
+
"version": "1.3.1",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
}
|
|
@@ -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
|
-
|
|
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.
|
|
55
|
+
version="1.3.1",
|
|
56
56
|
lifespan=lifespan,
|
|
57
57
|
log_level=config.logging.level,
|
|
58
58
|
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|