fix(ci): apply black formatting and bump hanzo-mcp to 0.12.3

This commit is contained in:
2026-03-04 11:57:07 -08:00
parent 5ed24f2dfb
commit 668c9ca6da
5 changed files with 64 additions and 33 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "hanzo-mcp"
version = "0.12.2"
version = "0.12.3"
description = "The Zen of Hanzo MCP: One server to rule them all. The ultimate MCP that orchestrates all others."
readme = "README.md"
requires-python = ">=3.12"
+42 -17
View File
@@ -171,7 +171,9 @@ def dns_zones(provider: str | None) -> None:
results = _run_parallel(providers, "list_zones")
zones: list[DNSZone] = [r for r in results if isinstance(r, DNSZone)]
errors = [r for r in results if isinstance(r, tuple) and isinstance(r[1], Exception)]
errors = [
r for r in results if isinstance(r, tuple) and isinstance(r[1], Exception)
]
if not zones and not errors:
console.print("[yellow]No zones found.[/yellow]")
@@ -199,7 +201,9 @@ def dns_zones(provider: str | None) -> None:
@dns_group.command("list")
@click.option("--zone", "-z", required=True, help="Zone name (e.g. hanzo.ai).")
@click.option("--type", "record_type", default=None, help="Record type filter (A, CNAME, etc.).")
@click.option(
"--type", "record_type", default=None, help="Record type filter (A, CNAME, etc.)."
)
@click.option("--provider", "-p", default=None, help="Filter by provider.")
def dns_list(zone: str, record_type: str | None, provider: str | None) -> None:
"""List DNS records for a zone (queries all providers in parallel)."""
@@ -216,7 +220,9 @@ def dns_list(zone: str, record_type: str | None, provider: str | None) -> None:
results = _run_parallel(providers, "list_records", zone, record_type)
records: list[DNSRecord] = [r for r in results if isinstance(r, DNSRecord)]
errors = [r for r in results if isinstance(r, tuple) and isinstance(r[1], Exception)]
errors = [
r for r in results if isinstance(r, tuple) and isinstance(r[1], Exception)
]
if not records:
label = f" {record_type}" if record_type else ""
@@ -237,8 +243,13 @@ def dns_list(zone: str, record_type: str | None, provider: str | None) -> None:
for r in sorted(records, key=lambda x: (x.provider, x.type, x.name)):
proxied = "[green]yes[/green]" if r.proxied else "no"
table.add_row(
r.type, r.name, r.content, r.ttl_display,
proxied, r.provider, r.id[:12],
r.type,
r.name,
r.content,
r.ttl_display,
proxied,
r.provider,
r.id[:12],
)
console.print(table)
@@ -256,12 +267,21 @@ def dns_list(zone: str, record_type: str | None, provider: str | None) -> None:
@click.argument("name")
@click.argument("content")
@click.option("--type", "record_type", default="A", help="Record type (default: A).")
@click.option("--proxied/--no-proxy", default=True, help="Proxy (default: on, CF only).")
@click.option(
"--proxied/--no-proxy", default=True, help="Proxy (default: on, CF only)."
)
@click.option("--ttl", default=1, help="TTL (1 = auto).")
@click.option("--provider", "-p", default=None, help="Target provider (default: first active).")
@click.option(
"--provider", "-p", default=None, help="Target provider (default: first active)."
)
def dns_add(
zone: str, name: str, content: str,
record_type: str, proxied: bool, ttl: int, provider: str | None
zone: str,
name: str,
content: str,
record_type: str,
proxied: bool,
ttl: int,
provider: str | None,
) -> None:
"""Add a DNS record.
@@ -279,7 +299,9 @@ def dns_add(
rec = target.add_record(zone, name, content, record_type, proxied, ttl)
if rec:
console.print(f"[green]✓[/green] Created {record_type.upper()} record via [magenta]{target.name}[/magenta]")
console.print(
f"[green]✓[/green] Created {record_type.upper()} record via [magenta]{target.name}[/magenta]"
)
console.print(f" Name: {rec.name}")
console.print(f" Content: {content}")
console.print(f" Proxied: {'yes' if rec.proxied else 'no'}")
@@ -295,7 +317,9 @@ def dns_add(
@click.option("--type", "record_type", default=None, help="Record type filter.")
@click.option("--force", "-f", is_flag=True, help="Skip confirmation.")
@click.option("--provider", "-p", default=None, help="Target provider (default: all).")
def dns_rm(zone: str, name: str, record_type: str | None, force: bool, provider: str | None) -> None:
def dns_rm(
zone: str, name: str, record_type: str | None, force: bool, provider: str | None
) -> None:
"""Remove DNS record(s) matching NAME.
\b
@@ -351,8 +375,12 @@ def dns_rm(zone: str, name: str, record_type: str | None, force: bool, provider:
@click.option("--dry-run", is_flag=True, help="Show changes without applying.")
@click.option("--provider", "-p", default=None, help="Target provider (default: all).")
def dns_update(
zone: str, old_ip: str, new_ip: str,
record_type: str, dry_run: bool, provider: str | None
zone: str,
old_ip: str,
new_ip: str,
record_type: str,
dry_run: bool,
provider: str | None,
) -> None:
"""Batch update records: replace OLD_IP with NEW_IP across all providers.
@@ -374,10 +402,7 @@ def dns_update(
# Preview: find matching records across all providers
results = _run_parallel(providers, "list_records", zone, record_type)
matching = [
r for r in results
if isinstance(r, DNSRecord) and r.content == old_ip
]
matching = [r for r in results if isinstance(r, DNSRecord) and r.content == old_ip]
if not matching:
console.print(
@@ -29,6 +29,7 @@ class CloudflareProvider(DNSProvider):
def _client(self):
import httpx
return httpx.Client(headers=self._headers(), timeout=30.0)
def _get(self, client, path: str, params: dict[str, Any] | None = None) -> Any:
@@ -116,9 +117,7 @@ class CloudflareProvider(DNSProvider):
"proxied": proxied,
}
resp = client.post(
f"{CF_API}/zones/{zone_id}/dns_records", json=payload
)
resp = client.post(f"{CF_API}/zones/{zone_id}/dns_records", json=payload)
result = resp.json()
if result.get("success"):
@@ -156,9 +155,7 @@ class CloudflareProvider(DNSProvider):
deleted = 0
for r in records:
resp = client.delete(
f"{CF_API}/zones/{zone_id}/dns_records/{r['id']}"
)
resp = client.delete(f"{CF_API}/zones/{zone_id}/dns_records/{r['id']}")
if resp.json().get("success"):
deleted += 1
return deleted
+13 -8
View File
@@ -33,6 +33,7 @@ class CoreDNSProvider(DNSProvider):
def _client(self):
import httpx
return httpx.Client(headers=self._headers(), timeout=30.0)
def _get(self, client, path: str, params: dict[str, Any] | None = None) -> Any:
@@ -46,7 +47,11 @@ class CoreDNSProvider(DNSProvider):
with self._client() as client:
data = self._get(client, "/zones")
zones = data if isinstance(data, list) else data.get("zones", data.get("result", []))
zones = (
data
if isinstance(data, list)
else data.get("zones", data.get("result", []))
)
return [
DNSZone(
id=z.get("id", z.get("name", "")),
@@ -69,7 +74,11 @@ class CoreDNSProvider(DNSProvider):
data = self._get(client, f"/zones/{zone}/records", params=params)
records = data if isinstance(data, list) else data.get("records", data.get("result", []))
records = (
data
if isinstance(data, list)
else data.get("records", data.get("result", []))
)
return [
DNSRecord(
id=r.get("id", ""),
@@ -104,9 +113,7 @@ class CoreDNSProvider(DNSProvider):
"ttl": ttl,
}
resp = client.post(
f"{self.endpoint}/zones/{zone}/records", json=payload
)
resp = client.post(f"{self.endpoint}/zones/{zone}/records", json=payload)
resp.raise_for_status()
rec = resp.json()
@@ -134,9 +141,7 @@ class CoreDNSProvider(DNSProvider):
deleted = 0
for r in matching:
try:
resp = client.delete(
f"{self.endpoint}/zones/{zone}/records/{r.id}"
)
resp = client.delete(f"{self.endpoint}/zones/{zone}/records/{r.id}")
resp.raise_for_status()
deleted += 1
except Exception:
+5 -1
View File
@@ -142,7 +142,11 @@ def load_dns_config() -> dict[str, dict[str, Any]]:
# Legacy: top-level cloudflare key
cf_legacy = data.get("cloudflare", {})
if isinstance(cf_legacy, dict) and cf_legacy.get("email") and cf_legacy.get("api_key"):
if (
isinstance(cf_legacy, dict)
and cf_legacy.get("email")
and cf_legacy.get("api_key")
):
providers.setdefault("cloudflare", {}).update(cf_legacy)
return providers