awslabs.postgres-mcp-server 1.0.11__tar.gz → 1.0.13__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 (39) hide show
  1. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/PKG-INFO +3 -3
  2. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/awslabs/postgres_mcp_server/__init__.py +1 -1
  3. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/awslabs/postgres_mcp_server/server.py +2 -2
  4. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/kiro_power/POWER.md +17 -10
  5. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/kiro_power/steering/aurora-postgres-mcp.md +0 -8
  6. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/kiro_power/steering/aurora-postgres.md +0 -9
  7. awslabs_postgres_mcp_server-1.0.13/kiro_proj_steering/tech.md +168 -0
  8. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/pyproject.toml +3 -3
  9. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/uv.lock +62 -7
  10. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/.gitignore +0 -0
  11. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/.python-version +0 -0
  12. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/CHANGELOG.md +0 -0
  13. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/Dockerfile +0 -0
  14. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/LICENSE +0 -0
  15. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/NOTICE +0 -0
  16. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/README.md +0 -0
  17. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/awslabs/__init__.py +0 -0
  18. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/awslabs/postgres_mcp_server/connection/__init__.py +0 -0
  19. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/awslabs/postgres_mcp_server/connection/abstract_db_connection.py +0 -0
  20. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/awslabs/postgres_mcp_server/connection/cp_api_connection.py +0 -0
  21. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/awslabs/postgres_mcp_server/connection/db_connection_map.py +0 -0
  22. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/awslabs/postgres_mcp_server/connection/psycopg_pool_connection.py +0 -0
  23. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/awslabs/postgres_mcp_server/connection/rds_api_connection.py +0 -0
  24. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/awslabs/postgres_mcp_server/mutable_sql_detector.py +0 -0
  25. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/docker-healthcheck.sh +0 -0
  26. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/kiro_power/mcp.json +0 -0
  27. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/tests/conftest.py +0 -0
  28. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/tests/test_abstract_db_connection.py +0 -0
  29. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/tests/test_cp_api_connection.py +0 -0
  30. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/tests/test_cp_api_iam_policy.py +0 -0
  31. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/tests/test_cp_api_simple_functions.py +0 -0
  32. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/tests/test_db_connection_map.py +0 -0
  33. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/tests/test_psycopg_connector.py +0 -0
  34. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/tests/test_rds_api_connection.py +0 -0
  35. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/tests/test_server.py +0 -0
  36. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/tests/test_server_error_handling.py +0 -0
  37. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/tests/test_server_helpers.py +0 -0
  38. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/tests/test_server_internal_functions.py +0 -0
  39. {awslabs_postgres_mcp_server-1.0.11 → awslabs_postgres_mcp_server-1.0.13}/uv-requirements.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: awslabs.postgres-mcp-server
3
- Version: 1.0.11
3
+ Version: 1.0.13
4
4
  Summary: An AWS Labs Model Context Protocol (MCP) server for postgres
5
5
  Project-URL: homepage, https://awslabs.github.io/mcp/
6
6
  Project-URL: docs, https://awslabs.github.io/mcp/servers/postgres-mcp-server/
@@ -25,8 +25,8 @@ Requires-Dist: aiorwlock
25
25
  Requires-Dist: boto3>=1.42.4
26
26
  Requires-Dist: botocore>1.42.4
27
27
  Requires-Dist: loguru>=0.7.0
28
- Requires-Dist: mcp[cli]>=1.11.0
29
- Requires-Dist: psycopg[pool]>=3.1.12
28
+ Requires-Dist: mcp[cli]>=1.23.0
29
+ Requires-Dist: psycopg[binary,pool]>=3.1.12
30
30
  Requires-Dist: pydantic>=2.10.6
31
31
  Description-Content-Type: text/markdown
32
32
 
@@ -19,6 +19,6 @@ from importlib.metadata import version
19
19
  try:
20
20
  __version__ = version('awslabs.postgres-mcp-server')
21
21
  except Exception:
22
- __version__ = '1.0.11'
22
+ __version__ = '1.0.13'
23
23
 
24
24
  __user_agent__ = f'awslabs/mcp/postgres_mcp_server/{__version__}'
@@ -238,7 +238,7 @@ async def get_table_schema(
238
238
  )
239
239
  )
240
240
 
241
- sql = """
241
+ sql = f"""
242
242
  SELECT
243
243
  a.attname AS column_name,
244
244
  pg_catalog.format_type(a.atttypid, a.atttypmod) AS data_type,
@@ -246,7 +246,7 @@ async def get_table_schema(
246
246
  FROM
247
247
  pg_attribute a
248
248
  WHERE
249
- a.attrelid = to_regclass(%(table_name)s)
249
+ a.attrelid = to_regclass('{table_name}')
250
250
  AND a.attnum > 0
251
251
  AND NOT a.attisdropped
252
252
  ORDER BY a.attnum
@@ -1,18 +1,21 @@
1
1
  ---
2
- name: "aurora-postgres"
3
- displayName: "Aurora Postgres Power"
4
- description: "Comprehensive guide for using Aurora PostgreSQL to develop database application."
5
- keywords: ["aurora", "postgresql", "database", "aws", "rds"]
6
- author: "kennthhz"
2
+ name: "amazon-aurora-postgresql"
3
+ displayName: "Build applications with Aurora PostgreSQL"
4
+ description: "Build applications backed by Aurora PostgreSQL by leveraging this power. It bundles direct database connectivity through the Aurora PostgreSQL MCP server for data plane operations (queries, table creation, schema management), and control plane operations (cluster creation), The steering file helps with Aurora PostgreSQL specific best practices. When developers work on database tasks, the power dynamically loads relevant guidance - whether creating new Aurora clusters, designing schemas, or optimizing queries - so Kiro agent receives only the context needed for the specific task at hand."
5
+ keywords: ["aurora", "postgresql", "aurora-postgresql", "amazon", "serverless", "rds-postgresql", "postgres", "AWSforData", "Analytics", "database", "aws", "rds"]
6
+ author: "AWS"
7
7
  ---
8
8
 
9
9
  # Aurora Postgres Power
10
10
 
11
11
  ## Overview
12
12
 
13
- This power provides comprehensive guidance for developing database applications with AWS Aurora PostgreSQL using the MCP server. It combines best practices for database design, query optimization, schema management, and operational excellence with direct MCP integration for cluster management and query execution.
13
+ Build database-backed applications with Aurora PostgreSQL through seamless MCP server integration. This power provides:
14
14
 
15
- Whether you're building a new application, optimizing existing queries, or managing production databases, this power helps you leverage Aurora PostgreSQL effectively with both provisioned instances and Aurora Serverless v2.
15
+ - Data Plane Operations: Execute queries, create tables, and manage schemas through direct database connectivity
16
+ - Control Plane Operations: Create and manage Aurora clusters programmatically
17
+ - Context-Aware Guidance: The steering file dynamically loads Aurora PostgreSQL best practices relevant to your current task—whether designing schemas, optimizing queries, or provisioning clusters—ensuring Kiro receives only the context it needs
18
+ This power combines comprehensive guidance for database design, query optimization, schema management, and operational excellence with direct MCP integration for both provisioned instances and Aurora Serverless v2
16
19
 
17
20
  ## Available Steering Files
18
21
 
@@ -31,6 +34,8 @@ This power uses the **awslabs.postgres-mcp-server** MCP server to provide direct
31
34
 
32
35
  The MCP server provides tools for:
33
36
  - **Cluster Management**: Create clusters, monitor job status
37
+ -- database cluster creation take about 5 to 10 minutes after create_cluster tool call
38
+ -- get_job_status tool should be run every minute or so. Running it every few seconds is excessive and may feel like a stuck loop.
34
39
  - **Database Connections**: Connect to databases, manage multiple connections
35
40
  - **Query Execution**: Run SQL queries with safety guardrails
36
41
  - **Schema Exploration**: Get table schemas and metadata
@@ -40,10 +45,10 @@ The MCP server provides tools for:
40
45
  **Connecting to a Database:**
41
46
  ```
42
47
  Call mcp_postgres_connect_to_database with:
43
- - database_type: "APG" (Aurora Postgres)
48
+ - database_type: "APG" (Aurora Postgres) or "RPG" (RDS Postgres)
44
49
  - connection_method: "rdsapi", "pgwire", or "pgwire_iam"
45
50
  - cluster_identifier: your cluster name
46
- - db_endpoint: cluster endpoint URL
51
+ - db_endpoint: database instance endpoint, not needed when connection_method is rdsapi
47
52
  - database: database name
48
53
  - port: 5432
49
54
  - region: AWS region
@@ -58,6 +63,7 @@ Call mcp_postgres_get_database_connection_info to see all active connections
58
63
 
59
64
  **Running Queries:**
60
65
  ```
66
+ Call mcp_postgres_run_query using results from mcp_postgres_connect_to_database call
61
67
  Call mcp_postgres_run_query with:
62
68
  - connection_method: same as connection
63
69
  - cluster_identifier: your cluster
@@ -68,10 +74,11 @@ Call mcp_postgres_run_query with:
68
74
  ```
69
75
 
70
76
  **Safety Guidelines:**
71
- - Read-only by default - writes require "RUN IT" confirmation
77
+ - Read-only by default - writes requires adding "--allow_write_query" to mcp.json and "RUN IT"
72
78
  - Always use LIMIT on browsing queries
73
79
  - Run EXPLAIN plans before heavy queries
74
80
  - Bound queries with WHERE predicates
81
+ -
75
82
 
76
83
  ## Common Workflows
77
84
 
@@ -1,11 +1,3 @@
1
- ---
2
- inclusion: always
3
- ---
4
- <!------------------------------------------------------------------------------------
5
- Add rules to this file or a short description that will apply across all your workspaces.
6
-
7
- Learn about inclusion modes: https://kiro.dev/docs/steering/#inclusion-modes
8
- ------------------------------------------------------------------------------------->
9
1
  # Aurora Postgres MCP — Steering
10
2
 
11
3
  ## Purpose
@@ -1,12 +1,3 @@
1
- ---
2
- inclusion: always
3
- ---
4
- <!------------------------------------------------------------------------------------
5
- Add rules to this file or a short description that will apply across all your workspaces.
6
-
7
- Learn about inclusion modes: https://kiro.dev/docs/steering/#inclusion-modes
8
- ------------------------------------------------------------------------------------->
9
-
10
1
  # Aurora PostgreSQL Development Guide
11
2
 
12
3
  Best practices for Aurora PostgreSQL development using MCP server. Covers provisioned instances and Aurora Serverless v2.
@@ -0,0 +1,168 @@
1
+ # Technology Stack
2
+
3
+ ## AWS Services
4
+
5
+ ### Aurora PostgreSQL
6
+
7
+ **Cluster Creation:**
8
+ - Region: `us-east-2`
9
+ - DB cluster can take several minutes to create (5 to 7 minutes). Use get_job_status every minute, instead of every few seconds.
10
+
11
+ **Database Connection:**
12
+ - **PREFERRED**: Use RDS Data API (no network connectivity required, works through AWS API)
13
+ - **ALTERNATIVE**: Use IAM authentication with `pgwire` connection method (requires network access to cluster)
14
+
15
+ **RDS Data API Connection (Recommended):**
16
+ - Use `@aws-sdk/client-rds-data` for database operations
17
+ - Use `@aws-sdk/credential-providers` with `fromNodeProviderChain()` for credentials
18
+ - **CRITICAL**: `fromNodeProviderChain()` requires AWS credentials as environment variables
19
+ - **Preferred**: Use `.env` file with `dotenv` package for credentials: `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN`
20
+ - Add `dotenv` to dependencies and load at top of server: `import 'dotenv/config';`
21
+ - Create `.env.example` template for users to copy
22
+ - Store cluster ARN and secret ARN in `.env` file
23
+
24
+ **Environment Variables for RDS Data API:**
25
+ ```bash
26
+ AWS_ACCESS_KEY_ID=your_access_key
27
+ AWS_SECRET_ACCESS_KEY=your_secret_key
28
+ AWS_SESSION_TOKEN=your_session_token
29
+ CLUSTER_ARN=arn:aws:rds:us-east-2:account-id:cluster:cluster-name
30
+ SECRET_ARN=arn:aws:secretsmanager:us-east-2:account-id:secret:secret-name
31
+ DATABASE=postgres
32
+ AWS_REGION=us-east-2
33
+ ```
34
+
35
+ **Node.js RDS Data API Pattern:**
36
+ ```javascript
37
+ import 'dotenv/config';
38
+ import { RDSDataClient, ExecuteStatementCommand } from '@aws-sdk/client-rds-data';
39
+ import { fromNodeProviderChain } from '@aws-sdk/credential-providers';
40
+
41
+ const rdsClient = new RDSDataClient({
42
+ region: process.env.AWS_REGION,
43
+ credentials: fromNodeProviderChain()
44
+ });
45
+
46
+ const dbConfig = {
47
+ resourceArn: process.env.CLUSTER_ARN,
48
+ secretArn: process.env.SECRET_ARN,
49
+ database: process.env.DATABASE
50
+ };
51
+
52
+ async function executeQuery(sql, parameters = []) {
53
+ const command = new ExecuteStatementCommand({
54
+ ...dbConfig,
55
+ sql,
56
+ parameters,
57
+ includeResultMetadata: true // CRITICAL: Required to get column names
58
+ });
59
+ return await rdsClient.send(command);
60
+ }
61
+
62
+ function formatRecords(records, columnMetadata) {
63
+ if (!records || !records.length || !columnMetadata) return [];
64
+ return records.map(record => {
65
+ const row = {};
66
+ record.forEach((field, index) => {
67
+ if (!columnMetadata[index]) return;
68
+ const columnName = columnMetadata[index].name;
69
+ if (field.stringValue !== undefined) row[columnName] = field.stringValue;
70
+ else if (field.longValue !== undefined) row[columnName] = field.longValue;
71
+ else if (field.doubleValue !== undefined) row[columnName] = field.doubleValue;
72
+ else if (field.booleanValue !== undefined) row[columnName] = field.booleanValue;
73
+ else if (field.isNull) row[columnName] = null;
74
+ else row[columnName] = null;
75
+ });
76
+ return row;
77
+ });
78
+ }
79
+
80
+ // Example query
81
+ const result = await executeQuery('SELECT * FROM meals');
82
+ const rows = formatRecords(result.records, result.columnMetadata);
83
+ ```
84
+
85
+ **RDS Data API Important Notes:**
86
+ - Always set `includeResultMetadata: true` to get column names
87
+ - Parameters use named placeholders: `:param_name`
88
+ - Parameter format: `{ name: 'param_name', value: { stringValue: 'value' } }`
89
+ - Value types: `stringValue`, `longValue`, `doubleValue`, `booleanValue`
90
+ - Date columns need explicit casting: `CAST(:date_param AS DATE)`
91
+ - JSON aggregations return as strings - parse with `JSON.parse()`
92
+ - No connection pooling needed - serverless API
93
+
94
+ **Error Handling:**
95
+ - Always wrap queries in try-catch
96
+ - Add console.error logging to all API endpoints for debugging
97
+ - Handle empty result sets gracefully
98
+
99
+ **Required Dependencies:**
100
+ - `@aws-sdk/client-rds-data`, `@aws-sdk/credential-providers`
101
+ - `express`, `cors`, `dotenv` for backend
102
+
103
+ **Alternative: pgwire Connection (if network access available):**
104
+ - Use `@aws-sdk/rds-signer` to generate IAM auth tokens
105
+ - Use `pg` package for PostgreSQL client
106
+ - Requires network connectivity to cluster endpoint
107
+ - See previous pattern for implementation details
108
+
109
+ ## Frontend Stack
110
+
111
+ ### React + Vite
112
+
113
+ **Project Creation:**
114
+ - Non-interactive: `echo "n" | npm create vite@latest client -- --template react`
115
+ - Answer "No" to rolldown-vite prompt
116
+
117
+ **Configuration:**
118
+ - Configure proxy in `vite.config.js`:
119
+ ```javascript
120
+ export default defineConfig({
121
+ plugins: [react()],
122
+ server: {
123
+ proxy: {
124
+ '/api': {
125
+ target: 'http://localhost:3001',
126
+ changeOrigin: true
127
+ }
128
+ }
129
+ }
130
+ })
131
+ ```
132
+
133
+ **Error Handling:**
134
+ - Always wrap fetch calls in try-catch
135
+ - Ensure state arrays default to empty arrays: `setMeals(Array.isArray(data) ? data : [])`
136
+ - Prevents "undefined.map is not a function" errors
137
+
138
+ **Dependencies:**
139
+ - `react`, `react-dom`, `vite`, `@vitejs/plugin-react`
140
+
141
+ ## Full Stack App Pattern
142
+
143
+ 1. **Assume `.env` file already exists** with AWS credentials (ACCESS_KEY, SECRET_KEY, SESSION_TOKEN, AWS_REGION)
144
+ 2. Create Aurora cluster with MCP tools
145
+ 3. Wait for cluster creation to complete (check with `get_job_status` every minute)
146
+ 4. **Get Secret ARN automatically** using AWS CLI:
147
+ ```bash
148
+ aws rds describe-db-clusters --db-cluster-identifier CLUSTER_NAME --region us-east-2 --query 'DBClusters[0].MasterUserSecret.SecretArn' --output text
149
+ ```
150
+ 5. **Construct Cluster ARN** from cluster identifier and account ID:
151
+ - Format: `arn:aws:rds:us-east-2:ACCOUNT_ID:cluster:CLUSTER_NAME`
152
+ - Extract account ID from Secret ARN returned in step 4
153
+ 6. **Update `.env` file** by appending:
154
+ - `CLUSTER_ARN=arn:aws:rds:us-east-2:ACCOUNT_ID:cluster:CLUSTER_NAME`
155
+ - `SECRET_ARN=<value from step 4>`
156
+ - `DATABASE=postgres`
157
+ 7. Create database schema using RDS Data API (one table at a time to avoid injection warnings)
158
+ 8. Create Express backend with RDS Data API connection
159
+ 9. Create React frontend with Vite
160
+ 10. Add sample data to database using RDS Data API
161
+ 11. Install dependencies: `npm install` in root and `npm install` in client
162
+ 12. Start backend with `controlBashProcess`: `npm run server`
163
+ 13. Start frontend with `controlBashProcess` in client directory: `npm run dev`
164
+
165
+ **Key Points:**
166
+ - User already has `.env` with AWS credentials - don't ask for them
167
+ - Secret ARN is automatically retrieved from `describe-db-clusters` API call
168
+ - The `MasterUserSecret.SecretArn` field contains the Secrets Manager ARN for database credentials
@@ -1,16 +1,16 @@
1
1
  [project]
2
2
  name = "awslabs.postgres-mcp-server"
3
- version = "1.0.11"
3
+ version = "1.0.13"
4
4
  description = "An AWS Labs Model Context Protocol (MCP) server for postgres"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
7
7
  dependencies = [
8
8
  "loguru>=0.7.0",
9
- "mcp[cli]>=1.11.0",
9
+ "mcp[cli]>=1.23.0",
10
10
  "pydantic>=2.10.6",
11
11
  "boto3>=1.42.4",
12
12
  "botocore>1.42.4",
13
- "psycopg[pool]>=3.1.12",
13
+ "psycopg[binary,pool]>=3.1.12",
14
14
  "aiorwlock"
15
15
  ]
16
16
  license = {text = "Apache-2.0"}
@@ -55,7 +55,7 @@ wheels = [
55
55
 
56
56
  [[package]]
57
57
  name = "awslabs-postgres-mcp-server"
58
- version = "1.0.11"
58
+ version = "1.0.13"
59
59
  source = { editable = "." }
60
60
  dependencies = [
61
61
  { name = "aiorwlock" },
@@ -63,7 +63,7 @@ dependencies = [
63
63
  { name = "botocore" },
64
64
  { name = "loguru" },
65
65
  { name = "mcp", extra = ["cli"] },
66
- { name = "psycopg", extra = ["pool"] },
66
+ { name = "psycopg", extra = ["binary", "pool"] },
67
67
  { name = "pydantic" },
68
68
  ]
69
69
 
@@ -85,8 +85,8 @@ requires-dist = [
85
85
  { name = "boto3", specifier = ">=1.42.4" },
86
86
  { name = "botocore", specifier = ">1.42.4" },
87
87
  { name = "loguru", specifier = ">=0.7.0" },
88
- { name = "mcp", extras = ["cli"], specifier = ">=1.11.0" },
89
- { name = "psycopg", extras = ["pool"], specifier = ">=3.1.12" },
88
+ { name = "mcp", extras = ["cli"], specifier = ">=1.23.0" },
89
+ { name = "psycopg", extras = ["binary", "pool"], specifier = ">=3.1.12" },
90
90
  { name = "pydantic", specifier = ">=2.10.6" },
91
91
  ]
92
92
 
@@ -826,7 +826,7 @@ wheels = [
826
826
 
827
827
  [[package]]
828
828
  name = "mcp"
829
- version = "1.21.1"
829
+ version = "1.23.3"
830
830
  source = { registry = "https://pypi.org/simple" }
831
831
  dependencies = [
832
832
  { name = "anyio" },
@@ -844,9 +844,9 @@ dependencies = [
844
844
  { name = "typing-inspection" },
845
845
  { name = "uvicorn", marker = "sys_platform != 'emscripten'" },
846
846
  ]
847
- sdist = { url = "https://files.pythonhosted.org/packages/f7/25/4df633e7574254ada574822db2245bbee424725d1b01bccae10bf128794e/mcp-1.21.1.tar.gz", hash = "sha256:540e6ac4b12b085c43f14879fde04cbdb10148a09ea9492ff82d8c7ba651a302", size = 469071, upload-time = "2025-11-13T20:33:46.139Z" }
847
+ sdist = { url = "https://files.pythonhosted.org/packages/a7/a4/d06a303f45997e266f2c228081abe299bbcba216cb806128e2e49095d25f/mcp-1.23.3.tar.gz", hash = "sha256:b3b0da2cc949950ce1259c7bfc1b081905a51916fcd7c8182125b85e70825201", size = 600697, upload-time = "2025-12-09T16:04:37.351Z" }
848
848
  wheels = [
849
- { url = "https://files.pythonhosted.org/packages/49/af/01fb42df59ad15925ffc1e2e609adafddd3ac4572f606faae0dc8b55ba0c/mcp-1.21.1-py3-none-any.whl", hash = "sha256:dd35abe36d68530a8a1291daa25d50276d8731e545c0434d6e250a3700dd2a6d", size = 174852, upload-time = "2025-11-13T20:33:44.502Z" },
849
+ { url = "https://files.pythonhosted.org/packages/32/c6/13c1a26b47b3f3a3b480783001ada4268917c9f42d78a079c336da2e75e5/mcp-1.23.3-py3-none-any.whl", hash = "sha256:32768af4b46a1b4f7df34e2bfdf5c6011e7b63d7f1b0e321d0fdef4cd6082031", size = 231570, upload-time = "2025-12-09T16:04:35.56Z" },
850
850
  ]
851
851
 
852
852
  [package.optional-dependencies]
@@ -942,10 +942,65 @@ wheels = [
942
942
  ]
943
943
 
944
944
  [package.optional-dependencies]
945
+ binary = [
946
+ { name = "psycopg-binary", marker = "implementation_name != 'pypy'" },
947
+ ]
945
948
  pool = [
946
949
  { name = "psycopg-pool" },
947
950
  ]
948
951
 
952
+ [[package]]
953
+ name = "psycopg-binary"
954
+ version = "3.2.12"
955
+ source = { registry = "https://pypi.org/simple" }
956
+ wheels = [
957
+ { url = "https://files.pythonhosted.org/packages/33/a0/96f75740b010e92ba95df1b40526d28b0ebb97347465974d7a23799cea79/psycopg_binary-3.2.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13cd057f406d2c8063ae8b489395b089a7f23c39aff223b5ea39f0c4dd640550", size = 4031010, upload-time = "2025-10-26T00:11:16.252Z" },
958
+ { url = "https://files.pythonhosted.org/packages/64/6a/88ebab6ca71a25a67c42b9ecb4707f69522f3c782184c60af13cbe122166/psycopg_binary-3.2.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ef92d5ba6213de060d1390b1f71f5c3b2fbb00b4d55edee39f3b07234538b64a", size = 4090479, upload-time = "2025-10-26T00:11:52.052Z" },
959
+ { url = "https://files.pythonhosted.org/packages/8e/62/917ae2e1a7ff10de3ffd43a65fc6b1536fbd3be6ef016375efc2efd268f3/psycopg_binary-3.2.12-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:95f2806097a49bfd57e0c6a178f77b99487c53c157d9d507aee9c40dd58efdb4", size = 4641200, upload-time = "2025-10-26T00:12:30.626Z" },
960
+ { url = "https://files.pythonhosted.org/packages/56/61/98486eff0a4b3313b9ad789003c89edc2424ba69efe4476ead690ffd219e/psycopg_binary-3.2.12-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:ce68839da386f137bc8d814fdbeede8f89916b8605e3593a85b504a859243af9", size = 4743095, upload-time = "2025-10-26T00:13:10.454Z" },
961
+ { url = "https://files.pythonhosted.org/packages/29/90/764e0d67e21b19e9ad5121ee4b93910bd91aad362f4012f3e03f31eca65e/psycopg_binary-3.2.12-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:940ac69ef6e89c17b3d30f3297a2ad03efdd06a4b1857f81bc533a9108a90eb9", size = 4425175, upload-time = "2025-10-26T00:13:48.553Z" },
962
+ { url = "https://files.pythonhosted.org/packages/98/78/744935118b434e81fc11a5c1fb69b29a7a809343c1277c79eb1a33f1613a/psycopg_binary-3.2.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:310c95a68a9b948b89d6d187622757d57b6c26cece3c3f7c2cbb645ee36531b2", size = 3885210, upload-time = "2025-10-26T00:14:21.382Z" },
963
+ { url = "https://files.pythonhosted.org/packages/41/49/105f40a0632669a653a2ba28506de163ba5cce47fff0910d2d8912ea250e/psycopg_binary-3.2.12-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f7c81bc60560be9eb3c23601237765069ebfa9881097ce19ca6b5ea17c5faa8f", size = 3568097, upload-time = "2025-10-26T00:14:51.534Z" },
964
+ { url = "https://files.pythonhosted.org/packages/2b/d6/8712ae92cd10ec6ddb0df35dc6d5d837db22af42dda1faf647a1a07d9996/psycopg_binary-3.2.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1c1dbeb8e97d00a33dfa9987776ce3d1c1e4cc251dfbd663b8f9e173f5c89d17", size = 3609179, upload-time = "2025-10-26T00:15:21.869Z" },
965
+ { url = "https://files.pythonhosted.org/packages/45/a4/0053351b79cb81d1842581e51e7878e02055afa34de5b49b5ea07fb85fbd/psycopg_binary-3.2.12-cp310-cp310-win_amd64.whl", hash = "sha256:8335d989a4e94df2ccd8a1acbba9d03c4157ea8d73b65b79d447c6dc10b001d8", size = 2918025, upload-time = "2025-10-26T00:15:47.622Z" },
966
+ { url = "https://files.pythonhosted.org/packages/60/4d/980fdd0f75914c8b1f229a6e5a9c422b53e809166b96a7d0e1287b369796/psycopg_binary-3.2.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:16db2549a31ccd4887bef05570d95036813ce25fd9810b523ba1c16b0f6cfd90", size = 4037686, upload-time = "2025-10-26T00:16:22.041Z" },
967
+ { url = "https://files.pythonhosted.org/packages/51/76/6b6ccd3fd31c67bec8608225407322f26a2a633c05b35c56b7c0638dcc67/psycopg_binary-3.2.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7b9a99ded7d19b24d3b6fa632b58e52bbdecde7e1f866c3b23d0c27b092af4e3", size = 4098526, upload-time = "2025-10-26T00:16:58.395Z" },
968
+ { url = "https://files.pythonhosted.org/packages/91/d8/be5242efed4f57f74a27eb47cb3a01bebb04e43ca57e903fcbda23361e72/psycopg_binary-3.2.12-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:385c7b5cfffac115f413b8e32c941c85ea0960e0b94a6ef43bb260f774c54893", size = 4646680, upload-time = "2025-10-26T00:17:36.967Z" },
969
+ { url = "https://files.pythonhosted.org/packages/20/c1/96e42d39c0e75c4059f80e8fc9b286e2b6d9652f30b42698101d4be201cf/psycopg_binary-3.2.12-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:9c674887d1e0d4384c06c822bc7fcfede4952742e232ec1e76b5a6ae39a3ddd4", size = 4749345, upload-time = "2025-10-26T00:18:16.61Z" },
970
+ { url = "https://files.pythonhosted.org/packages/78/00/0ee41e18bdb05b43a27ebf8a952343319554cd9bde7931f633343b5abbad/psycopg_binary-3.2.12-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:72fd979e410ba7805462817ef8ed6f37dd75f9f4ae109bdb8503e013ccecb80b", size = 4432535, upload-time = "2025-10-26T00:18:53.823Z" },
971
+ { url = "https://files.pythonhosted.org/packages/c5/77/580cc455ba909d9e3082b80bb1952f67c5b9692a56ecaf71816ce0e9aa69/psycopg_binary-3.2.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec82fa5134517af44e28a30c38f34384773a0422ffd545fd298433ea9f2cc5a9", size = 3888888, upload-time = "2025-10-26T00:19:26.768Z" },
972
+ { url = "https://files.pythonhosted.org/packages/cb/29/0d0d2aa4238fd57ddbd2f517c58cefb26d408d3e989cbca9ad43f4c48433/psycopg_binary-3.2.12-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:100fdfee763d701f6da694bde711e264aca4c2bc84fb81e1669fb491ce11d219", size = 3571385, upload-time = "2025-10-26T00:19:56.844Z" },
973
+ { url = "https://files.pythonhosted.org/packages/b1/7d/eb11cd86339122c19c1039cb5ee5f87f88d6015dff564b1ed23d0c4a90e7/psycopg_binary-3.2.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:802bd01fb18a0acb0dea491f69a9a2da6034f33329a62876ab5b558a1fb66b45", size = 3614219, upload-time = "2025-10-26T00:20:27.135Z" },
974
+ { url = "https://files.pythonhosted.org/packages/65/02/dff51dc1f88d9854405013e2cabbf7060c2b3993cb82d6e8ad21396081af/psycopg_binary-3.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:f33c9e12ed05e579b7fb3c8fdb10a165f41459394b8eb113e7c377b2bd027f61", size = 2919778, upload-time = "2025-10-26T00:20:51.974Z" },
975
+ { url = "https://files.pythonhosted.org/packages/db/4a/b2779f74fdb0d661febe802fb3b770546a99f0a513ef108e8f9ed36b87cb/psycopg_binary-3.2.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ea9751310b840186379c949ede5a5129b31439acdb929f3003a8685372117ed8", size = 4019926, upload-time = "2025-10-26T00:21:25.599Z" },
976
+ { url = "https://files.pythonhosted.org/packages/d5/af/df6c2beb44de456c4f025a61dfe611cf5b3eb3d3fa671144ce19ac7f1139/psycopg_binary-3.2.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9fdf3a0c24822401c60c93640da69b3dfd4d9f29c3a8d797244fe22bfe592823", size = 4092107, upload-time = "2025-10-26T00:22:00.043Z" },
977
+ { url = "https://files.pythonhosted.org/packages/f6/3b/b16260c93a0a435000fd175f1abb8d12af5542bd9d35d17dd2b7f347dbd5/psycopg_binary-3.2.12-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49582c3b6d578bdaab2932b59f70b1bd93351ed4d594b2c97cea1611633c9de1", size = 4626849, upload-time = "2025-10-26T00:22:38.606Z" },
978
+ { url = "https://files.pythonhosted.org/packages/cb/52/2c8d1c534777176e3e4832105f0b2f70c0ff3d63def0f1fda46833cc2dc1/psycopg_binary-3.2.12-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5b6e505618cb376a7a7d6af86833a8f289833fe4cc97541d7100745081dc31bd", size = 4719811, upload-time = "2025-10-26T00:23:18.23Z" },
979
+ { url = "https://files.pythonhosted.org/packages/34/44/005ab6a42698489310f52f287b78c26560aeedb091ba12f034acdff4549b/psycopg_binary-3.2.12-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6a898717ab560db393355c6ecf39b8c534f252afc3131480db1251e061090d3a", size = 4410950, upload-time = "2025-10-26T00:23:55.532Z" },
980
+ { url = "https://files.pythonhosted.org/packages/a7/ba/c59303ed65659cd62da2b3f4ad2b8635ae10eb85e7645d063025277c953d/psycopg_binary-3.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bfd632f7038c76b0921f6d5621f5ba9ecabfad3042fa40e5875db11771d2a5de", size = 3861578, upload-time = "2025-10-26T00:24:28.482Z" },
981
+ { url = "https://files.pythonhosted.org/packages/29/ce/d36f03b11959978b2c2522c87369fa8d75c1fa9b311805b39ce7678455ae/psycopg_binary-3.2.12-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3e9c9e64fb7cda688e9488402611c0be2c81083664117edcc709d15f37faa30f", size = 3534948, upload-time = "2025-10-26T00:24:58.657Z" },
982
+ { url = "https://files.pythonhosted.org/packages/5a/cc/e0e5fc0d5f2d2650f85540cebd0d047e14b0933b99f713749b2ebc031047/psycopg_binary-3.2.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3c1e38b1eda54910628f68448598139a9818973755abf77950057372c1fe89a6", size = 3583525, upload-time = "2025-10-26T00:25:28.731Z" },
983
+ { url = "https://files.pythonhosted.org/packages/13/27/e2b1afb9819835f85f1575f07fdfc871dd8b4ea7ed8244bfe86a2f6d6566/psycopg_binary-3.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:77690f0bf08356ca00fc357f50a5980c7a25f076c2c1f37d9d775a278234fefd", size = 2910254, upload-time = "2025-10-26T00:25:53.335Z" },
984
+ { url = "https://files.pythonhosted.org/packages/b2/0b/9d480aba4a4864832c29e6fc94ddd34d9927c276448eb3b56ffe24ed064c/psycopg_binary-3.2.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:442f20153415f374ae5753ca618637611a41a3c58c56d16ce55f845d76a3cf7b", size = 4017829, upload-time = "2025-10-26T00:26:27.031Z" },
985
+ { url = "https://files.pythonhosted.org/packages/a4/f3/0d294b30349bde24a46741a1f27a10e8ab81e9f4118d27c2fe592acfb42a/psycopg_binary-3.2.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:79de3cc5adbf51677009a8fda35ac9e9e3686d5595ab4b0c43ec7099ece6aeb5", size = 4089835, upload-time = "2025-10-26T00:27:01.392Z" },
986
+ { url = "https://files.pythonhosted.org/packages/82/d4/ff82e318e5a55d6951b278d3af7b4c7c1b19344e3a3722b6613f156a38ea/psycopg_binary-3.2.12-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:095ccda59042a1239ac2fefe693a336cb5cecf8944a8d9e98b07f07e94e2b78d", size = 4625474, upload-time = "2025-10-26T00:27:40.34Z" },
987
+ { url = "https://files.pythonhosted.org/packages/b1/e8/2c9df6475a5ab6d614d516f4497c568d84f7d6c21d0e11444468c9786c9f/psycopg_binary-3.2.12-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:efab679a2c7d1bf7d0ec0e1ecb47fe764945eff75bb4321f2e699b30a12db9b3", size = 4720350, upload-time = "2025-10-26T00:28:20.104Z" },
988
+ { url = "https://files.pythonhosted.org/packages/74/f5/7aec81b0c41985dc006e2d5822486ad4b7c2a1a97a5a05e37dc2adaf1512/psycopg_binary-3.2.12-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d369e79ad9647fc8217cbb51bbbf11f9a1ffca450be31d005340157ffe8e91b3", size = 4411621, upload-time = "2025-10-26T00:28:59.104Z" },
989
+ { url = "https://files.pythonhosted.org/packages/fc/15/d3cb41b8fa9d5f14320ab250545fbb66f9ddb481e448e618902672a806c0/psycopg_binary-3.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eedc410f82007038030650aa58f620f9fe0009b9d6b04c3dc71cbd3bae5b2675", size = 3863081, upload-time = "2025-10-26T00:29:31.235Z" },
990
+ { url = "https://files.pythonhosted.org/packages/69/8a/72837664e63e3cd3aa145cedcf29e5c21257579739aba78ab7eb668f7d9c/psycopg_binary-3.2.12-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f3bae4be7f6781bf6c9576eedcd5e1bb74468126fa6de991e47cdb1a8ea3a42a", size = 3537428, upload-time = "2025-10-26T00:30:01.465Z" },
991
+ { url = "https://files.pythonhosted.org/packages/cc/7e/1b78ae38e7d69e6d7fb1e2dcce101493f5fa429480bac3a68b876c9b1635/psycopg_binary-3.2.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8ffe75fe6be902dadd439adf4228c98138a992088e073ede6dd34e7235f4e03e", size = 3585981, upload-time = "2025-10-26T00:30:31.635Z" },
992
+ { url = "https://files.pythonhosted.org/packages/a3/f8/245b4868b2dac46c3fb6383b425754ae55df1910c826d305ed414da03777/psycopg_binary-3.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:2598d0e4f2f258da13df0560187b3f1dfc9b8688c46b9d90176360ae5212c3fc", size = 2912929, upload-time = "2025-10-26T00:30:56.413Z" },
993
+ { url = "https://files.pythonhosted.org/packages/5c/5b/76fbb40b981b73b285a00dccafc38cf67b7a9b3f7d4f2025dda7b896e7ef/psycopg_binary-3.2.12-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:dc68094e00a5a7e8c20de1d3a0d5e404a27f522e18f8eb62bbbc9f865c3c81ef", size = 4016868, upload-time = "2025-10-26T00:31:29.974Z" },
994
+ { url = "https://files.pythonhosted.org/packages/0e/08/8841ae3e2d1a3228e79eaaf5b7f991d15f0a231bb5031a114305b19724b1/psycopg_binary-3.2.12-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2d55009eeddbef54c711093c986daaf361d2c4210aaa1ee905075a3b97a62441", size = 4090508, upload-time = "2025-10-26T00:32:04.192Z" },
995
+ { url = "https://files.pythonhosted.org/packages/05/de/a41f62230cf4095ae4547eceada218cf28c17e7f94376913c1c8dde9546f/psycopg_binary-3.2.12-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:66a031f22e4418016990446d3e38143826f03ad811b9f78f58e2afbc1d343f7a", size = 4629788, upload-time = "2025-10-26T00:32:43.28Z" },
996
+ { url = "https://files.pythonhosted.org/packages/45/19/529d92134eae44475f781a86d58cdf3edd0953e17c69762abf387a9f2636/psycopg_binary-3.2.12-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:58ed30d33c25d7dc8d2f06285e88493147c2a660cc94713e4b563a99efb80a1f", size = 4724124, upload-time = "2025-10-26T00:33:22.594Z" },
997
+ { url = "https://files.pythonhosted.org/packages/5c/f5/97344e87065f7c9713ce213a2cff7732936ec3af6622e4b2a88715a953f2/psycopg_binary-3.2.12-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e0b5ccd03ca4749b8f66f38608ccbcb415cbd130d02de5eda80d042b83bee90e", size = 4411340, upload-time = "2025-10-26T00:34:00.759Z" },
998
+ { url = "https://files.pythonhosted.org/packages/b1/c2/34bce068f6bfb4c2e7bb1187bb64a3f3be254702b158c4ad05eacc0055cf/psycopg_binary-3.2.12-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:909de94de7dd4d6086098a5755562207114c9638ec42c52d84c8a440c45fe084", size = 3867815, upload-time = "2025-10-26T00:34:33.181Z" },
999
+ { url = "https://files.pythonhosted.org/packages/d1/a1/c647e01ab162e6bfa52380e23e486215e9d28ffd31e9cf3cb1e9ca59008b/psycopg_binary-3.2.12-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:7130effd0517881f3a852eff98729d51034128f0737f64f0d1c7ea8343d77bd7", size = 3541756, upload-time = "2025-10-26T00:35:08.622Z" },
1000
+ { url = "https://files.pythonhosted.org/packages/6b/d0/795bdaa8c946a7b7126bf7ca8d4371eaaa613093e3ec341a0e50f52cbee2/psycopg_binary-3.2.12-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:89b3c5201ca616d69ca0c3c0003ca18f7170a679c445c7e386ebfb4f29aa738e", size = 3587950, upload-time = "2025-10-26T00:35:41.183Z" },
1001
+ { url = "https://files.pythonhosted.org/packages/53/cf/10c3e95827a3ca8af332dfc471befec86e15a14dc83cee893c49a4910dad/psycopg_binary-3.2.12-cp314-cp314-win_amd64.whl", hash = "sha256:48a8e29f3e38fcf8d393b8fe460d83e39c107ad7e5e61cd3858a7569e0554a39", size = 3005787, upload-time = "2025-10-26T00:36:06.783Z" },
1002
+ ]
1003
+
949
1004
  [[package]]
950
1005
  name = "psycopg-pool"
951
1006
  version = "3.2.7"