second-opinion-mcp 0.3.1__py3-none-any.whl → 0.3.2__py3-none-any.whl

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.
@@ -1,6 +1,6 @@
1
1
  """Second Opinion MCP Server - Multi-model AI analysis for Claude."""
2
2
 
3
- __version__ = "0.3.1"
3
+ __version__ = "0.3.2"
4
4
  __author__ = "MarvinFS"
5
5
 
6
6
  from second_opinion_mcp.server import mcp, second_opinion, challenge, code_review, consensus, review_synthesis
@@ -1575,6 +1575,42 @@ def _validate_startup_requirements() -> tuple[bool, str]:
1575
1575
  return True, ""
1576
1576
 
1577
1577
 
1578
+ def _check_for_updates() -> tuple[str | None, str | None]:
1579
+ """Check PyPI for newer version of second-opinion-mcp.
1580
+
1581
+ Returns:
1582
+ (latest_version, current_version) if update available, (None, None) otherwise.
1583
+ """
1584
+ import urllib.request
1585
+ import json
1586
+
1587
+ try:
1588
+ from second_opinion_mcp import __version__ as current_version
1589
+ except ImportError:
1590
+ current_version = "0.0.0"
1591
+
1592
+ try:
1593
+ # Quick timeout to not delay startup
1594
+ url = "https://pypi.org/pypi/second-opinion-mcp/json"
1595
+ req = urllib.request.Request(url, headers={"User-Agent": "second-opinion-mcp"})
1596
+ with urllib.request.urlopen(req, timeout=3) as response:
1597
+ data = json.loads(response.read().decode())
1598
+ latest_version = data.get("info", {}).get("version", "0.0.0")
1599
+
1600
+ # Simple version comparison (works for semver)
1601
+ def parse_version(v: str) -> tuple[int, ...]:
1602
+ return tuple(int(x) for x in v.split(".")[:3] if x.isdigit())
1603
+
1604
+ if parse_version(latest_version) > parse_version(current_version):
1605
+ return latest_version, current_version
1606
+
1607
+ except Exception:
1608
+ # Don't fail startup on update check errors
1609
+ pass
1610
+
1611
+ return None, None
1612
+
1613
+
1578
1614
  def main():
1579
1615
  """Run the MCP server with stdio transport."""
1580
1616
  import sys
@@ -1585,6 +1621,13 @@ def main():
1585
1621
  format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
1586
1622
  )
1587
1623
 
1624
+ # Check for updates (non-blocking, quick timeout)
1625
+ latest, current = _check_for_updates()
1626
+ if latest:
1627
+ print(f"Update available: {current} -> {latest}", file=sys.stderr)
1628
+ print("Run: pipx upgrade second-opinion-mcp", file=sys.stderr)
1629
+ print(file=sys.stderr)
1630
+
1588
1631
  # Validate minimum requirements
1589
1632
  ok, error = _validate_startup_requirements()
1590
1633
  if not ok:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: second-opinion-mcp
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: Multi-model AI analysis for Claude - get second opinions from DeepSeek, Kimi, and OpenRouter
5
5
  Project-URL: Homepage, https://github.com/MarvinFS/second-opinion-mcp
6
6
  Project-URL: Repository, https://github.com/MarvinFS/second-opinion-mcp
@@ -279,6 +279,25 @@ Use code_review with focus_areas=["security", "error-handling", "performance"]
279
279
  Use code_review on directory="./src" with save_to="./docs/reviews"
280
280
  ```
281
281
 
282
+ ## Updating
283
+
284
+ The server checks for updates on startup and notifies you if a new version is available.
285
+
286
+ To update manually:
287
+
288
+ ```bash
289
+ pipx upgrade second-opinion-mcp
290
+ ```
291
+
292
+ Or reinstall:
293
+
294
+ ```bash
295
+ pipx uninstall second-opinion-mcp
296
+ pipx install second-opinion-mcp
297
+ ```
298
+
299
+ Your API keys are preserved in the system keyring across updates.
300
+
282
301
  ## Uninstalling
283
302
 
284
303
  ```bash
@@ -0,0 +1,9 @@
1
+ second_opinion_mcp/__init__.py,sha256=6XCWg4mcxORq2OPxzaC5bVTLmKWEnYok4SWiZ5E6RVs,373
2
+ second_opinion_mcp/__main__.py,sha256=WDv19O6nvIH69GR_DUfXqDt-wm8bgsHNqvPm1LEIKzs,509
3
+ second_opinion_mcp/cli.py,sha256=A88Y0TZQ_B38YliHKzohAOLTZuGdMZzH4bEjyC1Tv_A,15279
4
+ second_opinion_mcp/server.py,sha256=46cHbK0GgL0VBCGI3gmTA1-vQ1jRDdQ6MsCCqWw3LVk,62237
5
+ second_opinion_mcp-0.3.2.dist-info/METADATA,sha256=azoIPNQyVezi-cYoift_BL4RN61qj7PI0Kqqvj2Bosg,8806
6
+ second_opinion_mcp-0.3.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
7
+ second_opinion_mcp-0.3.2.dist-info/entry_points.txt,sha256=-E8BA2gFyU4qW-kJL8SV9Pg1Cc7glOCmraJoZH0PZP8,72
8
+ second_opinion_mcp-0.3.2.dist-info/licenses/LICENSE,sha256=dPx2Jy-Ejearvfh6IlF2PN4Srt-nZW8M4bW5EW7RPAg,1065
9
+ second_opinion_mcp-0.3.2.dist-info/RECORD,,
@@ -1,9 +0,0 @@
1
- second_opinion_mcp/__init__.py,sha256=THy3IptvV_KjNfRHMlhqUKNucORFcyKadnH8QfzFOXI,373
2
- second_opinion_mcp/__main__.py,sha256=WDv19O6nvIH69GR_DUfXqDt-wm8bgsHNqvPm1LEIKzs,509
3
- second_opinion_mcp/cli.py,sha256=A88Y0TZQ_B38YliHKzohAOLTZuGdMZzH4bEjyC1Tv_A,15279
4
- second_opinion_mcp/server.py,sha256=Q6ra1wffKPoT2sfU6RIbTA-V93XgwA3faW3qLIVIoDw,60696
5
- second_opinion_mcp-0.3.1.dist-info/METADATA,sha256=GKMM_Oh9_UgDLQrqzP1IXX-FlUP-8PNDRqA2yANeMCA,8476
6
- second_opinion_mcp-0.3.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
7
- second_opinion_mcp-0.3.1.dist-info/entry_points.txt,sha256=-E8BA2gFyU4qW-kJL8SV9Pg1Cc7glOCmraJoZH0PZP8,72
8
- second_opinion_mcp-0.3.1.dist-info/licenses/LICENSE,sha256=dPx2Jy-Ejearvfh6IlF2PN4Srt-nZW8M4bW5EW7RPAg,1065
9
- second_opinion_mcp-0.3.1.dist-info/RECORD,,