mcp-postgresql-ops 3.4.1__tar.gz → 3.4.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 (75) hide show
  1. mcp_postgresql_ops-3.4.1/README.md → mcp_postgresql_ops-3.4.2/PKG-INFO +18 -14
  2. mcp_postgresql_ops-3.4.1/src/mcp_postgresql_ops.egg-info/PKG-INFO → mcp_postgresql_ops-3.4.2/README.md +0 -32
  3. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/scripts/check_release.py +3 -6
  4. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/scripts/publish_release.py +1 -3
  5. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2/src/mcp_postgresql_ops.egg-info}/PKG-INFO +1 -15
  6. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/src/mcp_postgresql_ops.egg-info/scm_version.json +2 -2
  7. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/tests/test_release.py +30 -14
  8. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/.env.example +0 -0
  9. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/.github/CONTRIBUTING.md +0 -0
  10. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/.github/FUNDING.yml +0 -0
  11. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  12. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  13. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  14. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  15. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/.github/ISSUE_TEMPLATE/question.md +0 -0
  16. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/.github/copilot-instructions.md +0 -0
  17. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/.github/dependabot.yml +0 -0
  18. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/.github/pull_request_template.md +0 -0
  19. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/.github/workflows/pypi-publish.yml +0 -0
  20. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/.github/workflows/test.yml +0 -0
  21. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/.gitignore +0 -0
  22. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/.gitleaks.toml +0 -0
  23. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/.pre-commit-config.yaml +0 -0
  24. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/.python-version +0 -0
  25. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/Dockerfile.MCP-Server +0 -0
  26. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/Dockerfile.MCPO-Proxy +0 -0
  27. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/LICENSE +0 -0
  28. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/MANIFEST.in +0 -0
  29. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/SECURITY.md +0 -0
  30. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/_config.yml +0 -0
  31. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/_includes/head-custom-google-analytics.html +0 -0
  32. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/build-mcp-server-docker-image.sh +0 -0
  33. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/build-mcpo-server-docker-image.sh +0 -0
  34. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/docker-compose.custom-db.yml +0 -0
  35. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/docker-compose.yml +0 -0
  36. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/img/MCP-Workflow-of-Quickstart-Tutorial.png +0 -0
  37. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/img/screenshot-000.png +0 -0
  38. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/img/screenshot-001.png +0 -0
  39. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/img/screenshot-002.png +0 -0
  40. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/img/screenshot-004.png +0 -0
  41. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/img/screenshot-005.png +0 -0
  42. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/img/screenshot-claude-desktop-airflow-connections-html.png +0 -0
  43. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/img/screenshot-claude-desktop-mermaid-diagram.png +0 -0
  44. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/img/screenshot-claude-desktop-question-001.png +0 -0
  45. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/img/screenshot-swagger-api.png +0 -0
  46. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/mcp-config.json.http +0 -0
  47. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/mcp-config.json.stdio +0 -0
  48. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/pyproject.toml +0 -0
  49. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/run-mcp-inspector-local.sh +0 -0
  50. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/run-mcp-inspector-pypi.sh +0 -0
  51. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/scripts/create-test-data.sh +0 -0
  52. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/scripts/create-test-data.sql +0 -0
  53. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/scripts/enable-pgsql-extensions.sh +0 -0
  54. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/scripts/mcp-server-docker-cmd.sh +0 -0
  55. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/setup.cfg +0 -0
  56. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/src/mcp_postgresql_ops/__init__.py +0 -0
  57. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/src/mcp_postgresql_ops/__main__.py +0 -0
  58. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/src/mcp_postgresql_ops/functions.py +0 -0
  59. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/src/mcp_postgresql_ops/mcp_main.py +0 -0
  60. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/src/mcp_postgresql_ops/prompt_template.md +0 -0
  61. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/src/mcp_postgresql_ops/version_compat.py +0 -0
  62. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/src/mcp_postgresql_ops.egg-info/SOURCES.txt +0 -0
  63. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/src/mcp_postgresql_ops.egg-info/dependency_links.txt +0 -0
  64. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/src/mcp_postgresql_ops.egg-info/entry_points.txt +0 -0
  65. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/src/mcp_postgresql_ops.egg-info/requires.txt +0 -0
  66. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/src/mcp_postgresql_ops.egg-info/scm_file_list.json +0 -0
  67. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/src/mcp_postgresql_ops.egg-info/top_level.txt +0 -0
  68. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/tests/__init__.py +0 -0
  69. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/tests/conftest.py +0 -0
  70. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/tests/docker/docker-compose.test.yml +0 -0
  71. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/tests/docker/init-test-db.sql +0 -0
  72. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/tests/test_tool_schema_null_defaults.py +0 -0
  73. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/tests/test_tools_integration.py +0 -0
  74. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/tests/test_version_compat.py +0 -0
  75. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.2}/uv.lock +0 -0
@@ -1,3 +1,21 @@
1
+ Metadata-Version: 2.4
2
+ Name: mcp-postgresql-ops
3
+ Version: 3.4.2
4
+ Summary: Add your description here
5
+ Author-email: JungJungIn <call518@gmail.com>
6
+ Requires-Python: >=3.12
7
+ Description-Content-Type: text/markdown
8
+ License-File: LICENSE
9
+ Requires-Dist: fastmcp>=2.12.3
10
+ Requires-Dist: asyncpg>=0.29.0
11
+ Requires-Dist: psycopg2-binary>=2.9.7
12
+ Requires-Dist: setuptools-scm>=10.0.5
13
+ Requires-Dist: pre-commit>=4.6.0
14
+ Provides-Extra: dev
15
+ Requires-Dist: pytest>=7.0.0; extra == "dev"
16
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
17
+ Dynamic: license-file
18
+
1
19
  # MCP Server for PostgreSQL Operations and Monitoring
2
20
 
3
21
  [![MCP Toplist](https://mcptoplist.com/badge/smithery%2Fcall518%2Fmcp-postgresql-ops.svg)](https://mcptoplist.com/server/smithery%2Fcall518%2Fmcp-postgresql-ops)
@@ -291,20 +309,6 @@ The `create-test-data.sql` script is executed by the `postgres-init-extensions`
291
309
 
292
310
  ---
293
311
 
294
- ## Tagged Releases
295
-
296
- The GitHub Actions workflow publishes a pushed version tag (for example,
297
- `v1.2.3`, `1.2.3`, or `1.2.3rc1`) to TestPyPI, then PyPI, and finally creates
298
- a GitHub Release with the tag as its title. Both distribution versions must match
299
- the tag. The existing `testpypi` and `pypi` GitHub environments must have Trusted
300
- Publishing configured on their respective package indexes.
301
-
302
- Release notes include full commit messages since the most recently published
303
- GitHub Release, or all commits for the first release. The previous release tag
304
- must be an ancestor of the new tag. Alpha, beta, and release candidate tags create
305
- prereleases. Existing published releases are preserved; an existing draft requires
306
- manual review. A failed publication prevents subsequent publication jobs.
307
-
308
312
  ## Installation
309
313
 
310
314
  ### From PyPI (Recommended)
@@ -1,21 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: mcp-postgresql-ops
3
- Version: 3.4.1
4
- Summary: Add your description here
5
- Author-email: JungJungIn <call518@gmail.com>
6
- Requires-Python: >=3.12
7
- Description-Content-Type: text/markdown
8
- License-File: LICENSE
9
- Requires-Dist: fastmcp>=2.12.3
10
- Requires-Dist: asyncpg>=0.29.0
11
- Requires-Dist: psycopg2-binary>=2.9.7
12
- Requires-Dist: setuptools-scm>=10.0.5
13
- Requires-Dist: pre-commit>=4.6.0
14
- Provides-Extra: dev
15
- Requires-Dist: pytest>=7.0.0; extra == "dev"
16
- Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
17
- Dynamic: license-file
18
-
19
1
  # MCP Server for PostgreSQL Operations and Monitoring
20
2
 
21
3
  [![MCP Toplist](https://mcptoplist.com/badge/smithery%2Fcall518%2Fmcp-postgresql-ops.svg)](https://mcptoplist.com/server/smithery%2Fcall518%2Fmcp-postgresql-ops)
@@ -309,20 +291,6 @@ The `create-test-data.sql` script is executed by the `postgres-init-extensions`
309
291
 
310
292
  ---
311
293
 
312
- ## Tagged Releases
313
-
314
- The GitHub Actions workflow publishes a pushed version tag (for example,
315
- `v1.2.3`, `1.2.3`, or `1.2.3rc1`) to TestPyPI, then PyPI, and finally creates
316
- a GitHub Release with the tag as its title. Both distribution versions must match
317
- the tag. The existing `testpypi` and `pypi` GitHub environments must have Trusted
318
- Publishing configured on their respective package indexes.
319
-
320
- Release notes include full commit messages since the most recently published
321
- GitHub Release, or all commits for the first release. The previous release tag
322
- must be an ancestor of the new tag. Alpha, beta, and release candidate tags create
323
- prereleases. Existing published releases are preserved; an existing draft requires
324
- manual review. A failed publication prevents subsequent publication jobs.
325
-
326
294
  ## Installation
327
295
 
328
296
  ### From PyPI (Recommended)
@@ -10,13 +10,10 @@ from pathlib import Path
10
10
 
11
11
  def release_version(tag: str) -> str:
12
12
  """Validate a canonical release tag and return its package version."""
13
- version = tag.removeprefix("v")
14
13
  number = r"(?:0|[1-9][0-9]*)"
15
- if not re.fullmatch(
16
- rf"{number}\.{number}\.{number}(?:(?:a|b|rc){number})?", version
17
- ):
18
- raise ValueError("Use a tag such as 0.5.7, v0.5.7, or 0.5.7rc1")
19
- return version
14
+ if not re.fullmatch(rf"{number}\.{number}\.{number}", tag):
15
+ raise ValueError("Use a numeric major.minor.patch tag such as 0.5.7")
16
+ return tag
20
17
 
21
18
 
22
19
  def check_release(tag: str, directory: Path) -> None:
@@ -69,7 +69,7 @@ def release_notes(repository: str, tag: str, previous: str | None) -> str:
69
69
 
70
70
  def publish_release(repository: str, tag: str) -> None:
71
71
  """Create a release once, using the last published release as the baseline."""
72
- version = release_version(tag)
72
+ release_version(tag)
73
73
  current = command("git", "rev-parse", "--verify", f"refs/tags/{tag}^{{commit}}")
74
74
  remote = command("gh", "api", f"repos/{repository}/commits/{tag}", "--jq", ".sha")
75
75
  if current != remote or current != command("git", "rev-parse", "HEAD"):
@@ -117,8 +117,6 @@ def publish_release(repository: str, tag: str) -> None:
117
117
  "--notes-file",
118
118
  str(path),
119
119
  ]
120
- if re.search(r"(?:a|b|rc)\d+$", version):
121
- args.extend(["--prerelease", "--latest=false"])
122
120
  command(*args)
123
121
  print(f"Published GitHub Release {tag} (previous release: {previous or 'none'}).")
124
122
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-postgresql-ops
3
- Version: 3.4.1
3
+ Version: 3.4.2
4
4
  Summary: Add your description here
5
5
  Author-email: JungJungIn <call518@gmail.com>
6
6
  Requires-Python: >=3.12
@@ -309,20 +309,6 @@ The `create-test-data.sql` script is executed by the `postgres-init-extensions`
309
309
 
310
310
  ---
311
311
 
312
- ## Tagged Releases
313
-
314
- The GitHub Actions workflow publishes a pushed version tag (for example,
315
- `v1.2.3`, `1.2.3`, or `1.2.3rc1`) to TestPyPI, then PyPI, and finally creates
316
- a GitHub Release with the tag as its title. Both distribution versions must match
317
- the tag. The existing `testpypi` and `pypi` GitHub environments must have Trusted
318
- Publishing configured on their respective package indexes.
319
-
320
- Release notes include full commit messages since the most recently published
321
- GitHub Release, or all commits for the first release. The previous release tag
322
- must be an ancestor of the new tag. Alpha, beta, and release candidate tags create
323
- prereleases. Existing published releases are preserved; an existing draft requires
324
- manual review. A failed publication prevents subsequent publication jobs.
325
-
326
312
  ## Installation
327
313
 
328
314
  ### From PyPI (Recommended)
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "3.4.1",
2
+ "tag": "3.4.2",
3
3
  "distance": 0,
4
- "node": "g040ffedb6a319f1cd3ceec18f5ec489bac8a41e1",
4
+ "node": "g0b8e72718a54b7db8b4997f0828e4498c3366eae",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-10-24"
@@ -16,12 +16,18 @@ from scripts.check_release import check_release, release_version
16
16
  from scripts.publish_release import publish_release, release_notes
17
17
 
18
18
 
19
- @pytest.mark.parametrize("tag", ["1.2.3", "v1.2.3", "1.2.3rc1"])
19
+ @pytest.mark.parametrize("tag", ["0.0.0", "1.2.3", "10.20.30"])
20
20
  def test_release_version(tag):
21
- assert release_version(tag) == tag.removeprefix("v")
21
+ assert release_version(tag) == tag
22
22
 
23
23
 
24
- @pytest.mark.parametrize("tag", ["latest", "1.2", "v01.2.3", "1.2.3+local"])
24
+ @pytest.mark.parametrize(
25
+ "tag",
26
+ [
27
+ "latest", "1.2", "1.2.3.4", "v1.2.3", "01.2.3", "1.02.3", "1.2.03",
28
+ "1.2.3a1", "1.2.3b1", "1.2.3rc1", "1.2.3+local", "1..3", "1.2.3",
29
+ ],
30
+ )
25
31
  def test_invalid_release_version(tag):
26
32
  with pytest.raises(ValueError):
27
33
  release_version(tag)
@@ -37,20 +43,20 @@ def test_distribution_versions(tmp_path, version):
37
43
  info.size = len(metadata)
38
44
  archive.addfile(info, io.BytesIO(metadata))
39
45
  if version == "1.2.3":
40
- check_release("v1.2.3", tmp_path)
46
+ check_release("1.2.3", tmp_path)
41
47
  else:
42
48
  with pytest.raises(ValueError, match="expected"):
43
- check_release("v1.2.3", tmp_path)
49
+ check_release("1.2.3", tmp_path)
44
50
 
45
51
 
46
52
  def test_notes_use_previous_release_and_preserve_messages():
47
53
  message = "Fix issue\n\n```\n$(touch unwanted)\n```"
48
54
  with patch("scripts.publish_release.command") as command:
49
55
  command.side_effect = ["new", "old", "", f"abcdef123\0{message}\0"]
50
- notes = release_notes("owner/repo", "v1.2.3", "v1.2.2")
56
+ notes = release_notes("owner/repo", "1.2.3", "1.2.2")
51
57
  assert message in notes
52
58
  assert "````text" in notes
53
- assert "compare/v1.2.2...v1.2.3" in notes
59
+ assert "compare/1.2.2...1.2.3" in notes
54
60
  assert command.call_args.args[-2:] == ("old..new", "--")
55
61
 
56
62
 
@@ -59,28 +65,38 @@ def test_existing_release_is_not_overwritten(draft):
59
65
  with patch("scripts.publish_release.command") as command:
60
66
  command.side_effect = [
61
67
  "sha", "sha", "sha",
62
- json.dumps([[{"tag_name": "v1.2.3", "draft": draft}]]),
68
+ json.dumps([[{"tag_name": "1.2.3", "draft": draft}]]),
63
69
  ]
64
70
  if draft:
65
71
  with pytest.raises(ValueError, match="draft"):
66
- publish_release("owner/repo", "v1.2.3")
72
+ publish_release("owner/repo", "1.2.3")
67
73
  else:
68
- publish_release("owner/repo", "v1.2.3")
74
+ publish_release("owner/repo", "1.2.3")
69
75
  assert command.call_count == 4
70
76
 
71
77
 
72
- def test_first_prerelease_creation():
78
+ def test_first_release_creation():
73
79
  with patch("scripts.publish_release.command") as command:
74
80
  command.side_effect = ["sha", "sha", "sha", "[[]]", "sha", "", ""]
75
- publish_release("owner/repo", "v1.2.3rc1")
81
+ publish_release("owner/repo", "1.2.3")
76
82
  args = command.call_args.args
77
83
  assert args[:3] == ("gh", "release", "create")
78
- assert args[-2:] == ("--prerelease", "--latest=false")
84
+ assert args[3] == "1.2.3"
85
+ assert "--prerelease" not in args
86
+ assert "--latest=false" not in args
79
87
 
80
88
 
81
89
  def test_remote_tag_mismatch_stops_publication():
82
90
  with patch("scripts.publish_release.command") as command:
83
91
  command.side_effect = ["local", "remote"]
84
92
  with pytest.raises(ValueError, match="must match"):
85
- publish_release("owner/repo", "v1.2.3")
93
+ publish_release("owner/repo", "1.2.3")
86
94
  assert command.call_count == 2
95
+
96
+
97
+ @pytest.mark.parametrize("tag", ["v1.2.3", "1.2.3rc1"])
98
+ def test_invalid_tag_stops_publication(tag):
99
+ with patch("scripts.publish_release.command") as command:
100
+ with pytest.raises(ValueError):
101
+ publish_release("owner/repo", tag)
102
+ command.assert_not_called()