Release Notes¶
v1.4.5 (2026-10-08)¶
TITLE (v1.4.5)¶
CONTENT
v1.4.4 (2026-10-08)¶
TITLE (v1.4.4)¶
CONTENT
v1.4.3 (2026-10-08)¶
Guard-Core org migration¶
Metadata release: PyPI project URLs, the docs canonical domain, and all repository links moved to the Guard-Core org. No code changes.
v1.4.2 (2026-10-07)¶
The org-move docs refresh: the vendored documentation and its sources follow the Python family to the Guard-Core org (v1.4.2)¶
- Changed - The vendored
_docsand its sync sources point at the Guard-Core org:scripts/sync_docs.pyand the manifest now read the moved repos' Pages sites atguard-core.github.io(guard-core 4.3.1, guard-agent 3.2.1, fastapi-guard 8.0.2), withguard-core-tsstaying on the legacy namespace until it transfers (#44, #45). - Changed - CI publishes to PyPI via OIDC trusted publishing (
pypa/gh-action-pypi-publish,environment: pypi) instead of twine tokens, matching the PyPI trusted-publisher configuration; the release job now runs in thepypienvironment. - Fixed - The
guard-core-tsclone URL in CI keeps pointing atrennf93/guard-core-tsuntil the TypeScript wave moves, unbreaking the docs-drift gate.
v1.4.1 (2026-10-07)¶
The plugin polish release: the hosted Docker image build fix, the official plugin icon set, and the CI action bumps (v1.4.1)¶
- Fixed - The hosted Docker image installs the package only after its source is present, unbreaking the image build that reached for the package before the sources landed (cbd97c4).
- Changed - The plugin package ships the official Guard Core logo instead of the placeholder, plus a 256px palette-optimized composer icon for the ChatGPT directory (d0d9d9f, 335e755).
- Changed - The vendored
_docsre-sync with the upstream repos (guard-core 4.3.1, guard-agent 3.2.1, fastapi-guard 8.0.2, guard-core-ts 4.3.1) viascripts/sync_docs.py, so the served documentation reflects the current family releases. - Changed - CI action bumps: docker/build-push-action 6 -> 7, docker/setup-buildx-action 3 -> 4, docker/login-action 3 -> 4, github/codeql-action 4.38.1 -> 4.38.2 (#38, #39, #40, #41).
v1.4.0 (2026-10-02)¶
Guard Core for ChatGPT: the hosted plugin release (v1.4.0)¶
- Added - Hosted streamable-http serving of the same nine tools:
guard_core_mcp/hosting.pywraps the MCP app in a pure-ASGI RS256 bearer-auth middleware (PyJWKClient URL mode, or an inline JWKS for tests and air-gapped runs), serves the RFC 9728 protected-resource metadata with a discovery hint on every 401, and adds CORS; the newguard-core-mcp-httpentry point runs it under uvicorn configured by theGUARD_CORE_MCP_*environment variables. - Added - The
hostedextra installs guard-core, fastapi-guard and guard-agent, so the hostedversions,validate_configandcheck_payloadanswers run the lockfile-pinned latest releases;Dockerfile.hostedpackages it as a non-root container and therelease-dockerworkflow publishesghcr.io/rennf93/guard-core-mcpimages on release. - Added -
plugin/packages the ChatGPT directory submission:plugin.jsonwith thecom.openaipresentation metadata (privacy policy, terms, brand color, default prompts),mcp.jsonpointing athttps://mcp.guard-core.com/mcp, askills/guard-core/SKILL.mdtool-selection skill, and generated icon assets. - Added -
docs/chatgpt-plugin.mddocuments the architecture (ChatGPT signs in with a guard-core account through the api.guard-core.com OAuth 2.1 authorization server, then talks to the resource server at mcp.guard-core.com), the developer-mode test loop, local development against a local API, and the pre-submission checklist; the e2e suite drives the real HTTP server with throwaway RSA keys, including a full initialize/list/call session.
v1.3.0 (2026-09-27)¶
The parity train closeout: the registry reflects the shipped 4.2.0/3.1.0 ecosystem (v1.3.0)¶
- Changed - The
ecosystemregistry records the released 4.2.0 parity train for every engine: guard-core 4.2.0 (PyPI, head45b16088recorded in the conformance block), guard-core-go v4.2.0 (tagfdf15562, Go module proxy), guard-core-php 4.2.0 (Packagist, head388d4d1e), @guardcore/core 4.2.0 (all five npm packages, head72348cb4), and guard-core-rs/guard-core-engine 4.2.0 (crates.io, head84ba8907). - Changed - The conformance block tracks the 4.2.0 corpus truthfully: spec 4.1.0, 219 cases across 17 suites (the 12 detect suites, 184 cases, plus the 5 new pipeline suites - ip_control 12, rate_limits 5, detection_response 8, headers_cors 7, behavior_rules 3), and the interop line moves from 82/82 to 106/106 (the exempt_ips phases included).
- Changed - Every adapter pin moves to its released 1.2.0/4.2.0 version: the Go adapters (nethttp-guard, gin-guard, echo-guard, fiber-guard) v1.2.0 over guard-core-go v4.2.0, the PHP adapters v1.2.0 over guard-core-php ^4.2.0, the Rust adapters 1.2.0 over guard-core-engine 4.2.0 on crates.io, and the TypeScript packages (@guardcore/express, fastify, hono, nestjs) 4.2.0. The Python adapters are unchanged (fastapi-guard 8.0.2, flaskapi-guard 4.3.2, djapi-guard 4.3.2, tornadoapi-guard 1.0.0).
- Changed - The telemetry agent pins move to 3.1.0 across all five languages (guard-agent on PyPI, guardagent on npm, guard-agent-go, guard-agent-php on Packagist, guard-agent-rs on crates.io); the semantics lines record the 3.1.0 agent feature-parity surface (dynamic-rules polling with local rate limiters and auto-ban, sensitive-header redaction, optional AES-256-GCM encrypted ingest) and the pre-3.0.2 compressed-signature quirk note is kept.
- Changed - The guard-core-rs registry and knowledge entries carry the honest known gaps (behavior-rule storage is in-memory only with no Redis-backed distributed mode, and the route ip_blacklist-before-ip_whitelist evaluation order diverges from the reference), both documented in the port's docs/configuration.md.
- Changed - The hand-written
_knowledgecorpus re-syncs to those releases (guard-core-go/php/rs 4.2.0 with the spec-4.1.0 corpus, the four agents at 3.1.0) and the vendored_docsre-syncs to guard-core 4.2.0, guard-agent 3.1.0, fastapi-guard 8.0.2 and guard-core-ts 4.2.0 viascripts/sync_docs.py. - Changed -
uv.lockmoves guard-core to 4.2.0 and guard-agent to 3.1.0; version 1.3.0 closes out the 4.2.0/3.1.0 parity release train this server documents.
v1.2.0 (2026-09-26)¶
Full-ecosystem refresh to the guard-core 4.1.0 train (v1.2.0)¶
- Changed - The
ecosystemregistry records the released 4.1.0 train for every engine: guard-core 4.1.0 (PyPI, engine commit0122af02in the conformance block), guard-core-go v4.1.0 (module pathgithub.com/rennf93/guard-core-go/v4, Go module proxy verified), guard-core-php v4.1.0 (now on Packagist, so the VCS repository workaround is gone), @guardcore/core 4.1.0, and guard-core-rs/guard-core-engine 4.1.0 (crates.io). - Changed - Every adapter pin moves to its released version: fastapi-guard 8.0.2, flaskapi-guard 4.3.2, djapi-guard 4.3.2 (the PyPI name is
djapi-guard; the registry had carried the non-existentdjangoapi-guard), tornadoapi-guard unchanged at 1.0.0, the Go adapters (nethttp-guard, gin-guard, echo-guard, fiber-guard) v1.1.0, the PHP adapters (psr15-guard, laravel-guard, symfony-guard, slim-guard) v1.1.0, the Rust adapters (tower-guard-rs, axum-guard-rs, actix-guard-rs, rocket-guard-rs) 1.1.0 on crates.io, and the TypeScript packages (@guardcore/express, fastify, hono, nestjs) 4.1.0. - Changed - The telemetry agent pins move to 3.0.2 across all five languages: guard-agent (PyPI), guardagent (npm), guard-agent-go (tagged v3.0.2, module path
/v3), guard-agent-php (Packagist) and guard-agent-rs (crates.io). The saasknown_quirksentry now says the Python compressed-signature defect is fixed as of guard-agent 3.0.2 (releases before 3.0.2 signed the compressed wire bytes), and the agent notes point operators at pinning >=3.0.2 before enablingrequire_signed_payloads. - Changed - The hand-written
_knowledgecorpus re-syncs its install lines, tags and registry states to those releases (guard-core-go/v4module path and spec-4.0.3 corpus, guard-core-php on Packagist, guard-core-rs crates.io publication with the facade re-exportingdetect/compiler, the four agents' 3.0.2 tags, guard-core-app 2026.09.24). - Changed -
scripts/sync_docs.pyresolves each vendored repo under both layouts: the CI sibling clones (../<package>) and the local ecosystem checkout nested under per-language directories, siblings winning; the vendored_docsre-syncs to guard-core 4.1.0, fastapi-guard 8.0.2, guard-agent 3.0.2 and guard-core-ts 4.1.0. - Changed -
uv.lockmoves guard-core to 4.1.0, fastapi-guard to 8.0.2 and guard-agent to 3.0.2; version 1.2.0 marks the full-ecosystem 4.1.0 refresh this server documents.
v1.1.1 (2026-09-23)¶
Full Guard ecosystem coverage across five languages, re-synced to guard-core 4.0.4 and guard-agent 3.0.1 (v1.1.1)¶
- Added - The
ecosystemtool returns the full registry matrix: five languages (python, go, typescript, php, rust), each with its engine package (install command, version, release status, conformance status), four framework adapters with quick-start snippets verified verbatim against the sibling repos' READMEs and a mapping to the Python adapter they mirror, and the telemetry agent with its delivery semantics; thesaasblock documents the guard-core-app ingestion contract (endpoints, headers, uncompressed-body HMAC signing, the 262144-byte decompressed limit, and the 200/429/413/400/404/422 response semantics). - Added - The
adapter_setup(language, framework)tool returns the install command and a verified minimal middleware integration for one adapter of one language, plus the engine install and conformance status it depends on. - Added - The
wire_agent(language, framework=None)tool returns how to set up the telemetry agent for a language: package, install, release status, quick-start snippet, buffer/flush/overflow/retry semantics, adapter integration notes, and the full ingestion contract; the python framework variants point at the bundled guard-agent doc pages, and it surfaces the known guard-agent compressed-signature quirk. - Added - A hand-written knowledge corpus under
guard_core_mcp/_knowledge/: one entry each for guard-core-go, guard-core-php, guard-core-rs, guard-agent-go, guard-agent-ts, guard-agent-rs, guard-agent-php and the guard-core-app ingestion contract, covering install, setup, semantics and footguns verified against each repo;search_docsandget_docsearch and cite it, andversionsreports it underknowledge_bundled_for. - Changed - The bundled docs corpus gains guard-core-ts 1.0.0 (the Astro Starlight site, 104 pages);
scripts/sync_docs.pynow also reads package.json versions, vendors .mdx alongside .md, and supports per-repo docs subdirectories, and the docs-drift CI job clones guard-core-ts. - Changed - The
ecosystemregistry pins the frozen spec-4.0.3 corpus (184 cases across 12 suites, engine commit436d6f72): the newbinary_bodiessuite is included in the suite breakdown, the Python engine entry moves to 4.0.4, the agent entry to 3.0.1, and the interop block adds the 24/24 Redis-free binary-body detect vectors per engine port. - Fixed - The Rust engine's conformance entry no longer describes the pre-implementation xfail state (39/124); it records the current 184/184 drift-gated result.
- Changed - The vendored
_docsmanifest moves to guard-core 4.0.4 and guard-agent 3.0.1, and the guard-core release notes carry the 4.0.4 section (SQLi comment-terminator binary gate, console-safe detection logs, depth-capped display redaction).
v1.0.2 (2026-09-12)¶
Vendored docs re-synced to guard-core 4.0.2 (v1.0.2)¶
- Changed - Vendored
_docsre-synced to the guard-core 4.0.2 tree: the release notes carry the 4.0.2 section (bounded built-in pattern matchers, the ReDoS validator hardening with the load-scaled verdict deadline, the anomaly variance skip, and the CI/test instrumentation notes), andconfiguration/detection-tuning.mdreplaces the fixed 40-second budget wording with the load-scaled budget and documents the nested-unbounded-quantifier refusal with the linear rewrite for path-validator shapes. - Changed -
uv.lockmoves guard-core to 4.0.2.
v1.0.1 (2026-09-05)¶
Vendored docs re-synced to guard-core 4.0.1 (v1.0.1)¶
- Changed - Vendored
_docsre-synced to the guard-core 4.0.1 tree:api/utilities.mdgains the publicredact_blob_for_displayandredact_url_for_displayhelpers with their documented limits,api/handlers.mddocumentsban_ipreturning a bool that is False when the self-DoS guard refuses a ban,configuration/detection-tuning.mdstates the 40 second reach-probe budget and the host-normalized timing, and the release notes carry the 4.0.1 section. The fastapi-guard corpus picks up the tutorial snippet formatting fix from fastapi-guard PR #134. - Changed -
uv.lockmoves guard-core to 4.0.1.
v1.0.0 (2026-09-04)¶
Vendored docs re-synced to guard-core 4.0.0, guard-agent 3.0.0 and fastapi-guard 8.0.0 (v1.0.0)¶
- Changed - Vendored
_docsre-synced from the sibling repos at the trees that ship as guard-core 4.0.0, guard-agent 3.0.0 and fastapi-guard 8.0.0. The guard-core corpus now describes grammar-based secret redaction across every log line, telemetry event, on_block payload, span, metric and Redis key name, the per-context detection matrix with every disclosed miss and false positive named, the single telemetry contract (pattern_matched,metadata.category,handler_name, decorator events through the bus), thelog_sensitive_headers,log_sensitive_paramsandlog_sensitive_body_fieldsknobs, the deprecation of unconfigured (legacy) detection, and the breaking changes an operator must read before upgrading:excluded_detection_headersno longer silences a header,require_headersenforces non-sentinel values, the endpoint rate-limit Redis key hashes the path segment,detect_pattern_matchreturns a redacted pattern source, andSecurityConfigvalidation errors no longer echo the rejected input value (sovalidate_configanswers name the field and the reason without the value). The guard-agent corpus describes header sanitisation at ingest and egress, the buffer that no longer loses events on a failed send, overflow or cancellation, and the async requeue protocol; the fastapi-guard corpus describes the 8.0.0 lockstep. - Changed - Version 1.0.0: the major follows the guard-core 4.0.0, guard-agent 3.0.0 and fastapi-guard 8.0.0 majors this server documents. The
uv.lockbump to those releases and the re-capturedversionsexamples land once the three packages are on PyPI.
v0.1.12 (2026-09-01)¶
Vendored docs re-synced to guard-core 3.17.0 and guard-agent 2.10.0, both locked (v0.1.12)¶
- Changed - Vendored
_docsre-synced from the sibling repos: guard-core 3.17.0, guard-agent 2.10.0, fastapi-guard 7.8.2 (unchanged). This picks up guard-core 3.17.0's release-notes entry: dynamic rules now persist a last-known snapshot on every successful apply (Redis whenever a redis handler is present, plus an opt-in JSON file behind the newdynamic_rules_cache_pathfield) and hydrate it once at startup before the update loop starts, so a process restarted during a SaaS outage comes up with the last applied rules instead of base config; expired, malformed, or newer-schema snapshots are discarded with an error logged. The sync also carries the matchingdynamic_rules_cache_pathrow in the vendoredconfiguration/security-config.mdreference, and guard-agent 2.10.0's release-notes entry: everyguard_agentlog line now carries an origin prefix ([guard_agent.client] ...),setup_agent_logginggained a JSON format and optional file sink, and the automatic setup run by the handler constructors is non-destructive to host logging configuration. - Changed -
uv.locknow resolves guard-core 3.17.0 and guard-agent 2.10.0 from PyPI (uv lock --refresh --upgrade-package guard-core --upgrade-package guard-agent;--refreshmattered again, the uv index lagged the fresh guard-core publish by a minute). No other dependency, includingmcp, moved. No behavior changes to the server itself:dynamic_rules_cache_pathis a new optionalSecurityConfigfield, sovalidate_configaccepts it as a known field out of the box, and guard-core 3.17.0 introduces no new construction-time warnings forvalidate_configto surface. The workedversionsexamples in the docs are re-captured from this build. - Changed - guard-core 3.17.0 also un-deprecated
ipinfo_tokenandipinfo_db_path: they were never meant to be deprecated.validate_config'sdeprecatedreport no longer carries an entry for either field, where a 0.1.11 install reported one foripinfo_token(and would have foripinfo_db_path) on the same config. This is the one user-visible change tovalidate_config's output in this release. - Changed - pytest now runs with
filterwarnings = ["error"], so any warning fails the suite instead of passing silently.
v0.1.11 (2026-09-01)¶
Vendored docs re-synced to guard-core 3.16.0, guard-core locked at 3.16.0 (v0.1.11)¶
- Changed - Vendored
_docsre-synced from the sibling repos: guard-core 3.16.0, fastapi-guard 7.8.2 (unchanged), guard-agent docs bundle 2.9.1 (unchanged). This picks up guard-core 3.16.0's release-notes entry: the new optionalSecurityConfig.on_blockcallback fired exactly once per blocked or passively flagged request, and the TTLCache check-then-use closures on the security-headers, IP-ban and dedup cache reads that previously raisedKeyErrorat a TTL boundary and failed the ban check open. The sync also carries the matchingon_blockrow in the vendoredconfiguration/security-config.mdreference. - Changed -
uv.locknow resolves guard-core 3.16.0 from PyPI (uv lock --upgrade-package guard-core). No other dependency, includingmcp, moved. No behavior changes to the server itself:on_blockis a new optionalSecurityConfigfield, sovalidate_configaccepts it as a known field out of the box, and guard-core 3.16.0 introduces no new construction-time warnings forvalidate_configto surface.
v0.1.10 (2026-08-27)¶
Vendored docs re-synced to guard-core 3.15.0 / fastapi-guard 7.8.2, and check_payload now reflects guard-core 3.15.0's auto-configuring detection singleton (v0.1.10)¶
- Changed - Vendored
_docsre-synced from the sibling repos: guard-core 3.15.0, fastapi-guard 7.8.2, guard-agent 2.9.0 (unchanged). This picks up guard-core 3.15.0's post-3.14.0 follow-ups: the rate limiter now honorsredis_fail_openon a Redis failure instead of always falling back to the in-memory window (breaking whenredis_fail_open=False, the default: a Redis outage now raisesGuardRedisErrorand letsfail_securedecide, rather than silently falling back); a newdetection_max_json_depth(default 32) bounds how deep a JSON body is walked structurally and a newdetection_max_scan_chars(default 65536) bounds the total characters scanned per request, alongside the existingdetection_max_scan_values;SecurityConfignow warns at construction whenwhitelistcontains a/0network, mirroring the existingtrusted_proxieswarning; a declaredtrusted_proxy_depththat over-counts the real proxy hops is now corrected by walking theX-Forwarded-Forchain right to left instead of silently trusting a client-rotatable entry; a body whose declaredContent-Lengthexceedsdetection_max_body_inspect_bytesis now read and scanned through the adapter's bounded reader instead of skipped outright; andsetup_custom_loggingno longer double-logs into a host's own root logger handlers. And fastapi-guard 7.8.2's lockstep:StarletteGuardRequest.url_pathand the websocket adapter's equivalent now resolve the route-relative path under an ASGIroot_pathor a mounted sub-app instead of the full mount-prefixed path, soexclude_pathsandendpoint_rate_limitskeys match correctly under a mount; this also picks up 7.8.1'smake_guard_websocketfactory, close-code constants, and Redis-manager fixes for the websocket guard. - Fixed -
check_payload's docstring described guard-core 3.14.0'sdetection_max_scan_valuescap alone; it now also documents 3.15.0'sdetection_max_scan_chars(default 65536) anddetection_max_json_depth(default 32) caps, and the fact thatdetect_penetration_attemptnow configures guard-core's detection singleton from the config it receives.check_payloadnever configured that singleton itself, so every prior release of this tool ran guard-core's slower legacy pattern-matching path instead of the enhanced path a real adapter runs, and could report a different verdict than a live request would for the same payload. 0.1.10 is the first release wherecheck_payload's verdicts come from that same enhanced path.validate_config's docstring also now names the newwhitelist/0construction warning alongside the existingtrusted_proxiesone. - Changed -
uv.locknow resolves guard-core 3.15.0 and fastapi-guard 7.8.2 from PyPI (uv lock --refresh --upgrade-package guard-core --upgrade-package fastapi-guard;--refreshmattered here since the uv package index lagged a few minutes behind the fresh PyPI publish). No other dependency, includingmcp, moved.
v0.1.9 (2026-08-26)¶
Vendored docs re-synced to guard-core 3.14.0 / fastapi-guard 7.8.0, and validate_config now surfaces guard-core's construction-time warnings (v0.1.9)¶
- Changed - Vendored
_docsre-synced from the sibling repos: guard-core 3.14.0, fastapi-guard 7.8.0, guard-agent 2.9.0 (unchanged). This picks up guard-core 3.14.0's post-3.13.0 hardening pass:SecurityConfignow warns at construction on atrusted_proxies/0network (0.0.0.0/0,::/0) and on an emptyenabled_detection_categorieswith detection enabled; a request with no client address is now rejected instead of skipping the entire security pipeline, with a newunixtrusted_proxiestoken for Unix-socket deployments;X-Forwarded-Forchain warnings for a depth that cannot be satisfied or that resolves to another trusted proxy; rate-limit and behavior-tracker in-memory stores are now LRU-bounded at 10,000 clients;detection_max_scan_valuesbounds the number of request values scanned per request (default 512); ban address canonicalization closes a silent no-op between IP spellings; and GeoIP, Redis-outage-at-startup and Azure cloud-IP-range resilience fixes. And fastapi-guard 7.8.0's lockstep for the same guard-core release: repeatedX-Forwarded-Forheader lines are now joined before guard-core resolves the client, aguard_websocketdependency closes the gap whereSecurityMiddlewarenever ran for WebSocket scopes, and a Redis outage at startup now returns a clean 503 instead of crashing. - Fixed -
validate_configonly capturedwarnings.warnrecords (DeprecationWarning), missing guard-core'slogger.warningsignals for its own construction-time misconfiguration checks: an unknown constructor keyword, the 3.14.0trusted_proxies/0warning, and the emptyenabled_detection_categorieswarning. A temporarylogging.Handleris now attached to theguard_corelogger for the duration ofSecurityConfigconstruction, and its deduplicated records are reported under a newconstruction_warningsfield; the logger's original handlers and level are always restored afterward. Thevalidate_configandcheck_payloadtool docstrings now document this and guard-core 3.14.0'sdetection_max_scan_valuesrequest-value scan cap (default 512, names and values counted; a payload beyond it gets a verdict on the scanned prefix only). - Changed -
uv.lockis deliberately untouched. guard-core 3.14.0 and fastapi-guard 7.8.0 are not yet published to PyPI, souv lockcannot resolve them, and a blanketuv lock --upgradewould still downgrademcp. Runuv lock --upgrade-package guard-core --upgrade-package fastapi-guardonce both are published.
v0.1.8 (2026-08-25)¶
Vendored docs re-synced to the guard-core 3.13.0 / fastapi-guard 7.7.0 / guard-agent 2.9.0 line, and worked examples refreshed (v0.1.8)¶
- Changed - Vendored
_docsre-synced from the sibling repos: guard-core 3.13.0, fastapi-guard 7.7.0, guard-agent 2.9.0. This picks up guard-core 3.13.0's auth-verifier machinery (require_authandapi_key_authnow require a resolvable verifier and fail-closed 401 without one;require_authorization_headeris the presence-only escape hatch; the approved principal lands onrequest.state.auth_principal), the newthreat_ban_configper-category ban-thresholds field and theenable_rate_limit_auto_banflag that feeds rate-limit violations into the penetration-detection auto-ban engine, and thecheck_ip_access/check_rate_limit_by_ip/is_ip_allowedhelpers re-exported inguard_core.__all__; fastapi-guard 7.7.0's auth-verifier lockstep for the same guard-core release; and guard-agent 2.9.0 carryingguard_core_versionon its telemetry. - Changed -
uv.lockand the development environment refreshed to resolve guard-core 3.13.0, fastapi-guard 7.7.0 and guard-agent 2.9.0. Each package was upgraded individually (uv lock --upgrade-package, with--no-cachefor guard-agent while PyPI propagation caught up after its publish) rather than via a blanketuv lock --upgrade, which still downgradesmcpfrom 2.0.0 to 1.23.3 and breaks the server at import.mcpstays at 2.0.0;pyproject.tomlruntime dependencies remain unpinned and unchanged. - Fixed - The worked examples in the installation guide and tool reference were frozen at the 0.1.7 line (guard-core 3.12.0, fastapi-guard 7.6.0, guard-agent 2.8.1). All five example blocks now show real, live output captured against the installed 3.13.0 / 7.7.0 / 2.9.0 line:
versions()reportsguard_core_mcp0.1.8 and the new installed and bundled versions; thevalidate_configtypo example'sdid_you_meannow lists two suggestions (enable_rate_limitingand the newenable_rate_limit_auto_ban) where it previously listed one; theconfig_fieldsexample'smatchesnow includesthreat_ban_configandenable_rate_limit_auto_ban, which both mentionrate_limitand so surface for that query for the first time; and thesearch_docsexample's second-result score moved from 79 to 80 as fastapi-guard's release notes grew.
v0.1.7 (2026-08-15)¶
check_payload body-scan fix for guard-core 3.12.0, documentation accuracy sweep, and vendored docs re-synced to the 3.12.0 line (v0.1.7)¶
- Fixed - Every worked example in the installation guide and tool reference still showed the versions frozen at the 0.1.5 sweep:
versions()'s ownguard_core_mcpfield showed0.1.5although the server had since moved to 0.1.6, andinstalled/docs_bundled_forstill showed guard-core 3.11.0 and fastapi-guard 7.5.1 despite the sibling repos having released 3.12.0 and 7.6.0. Theversionfield in bothvalidate_configexamples and theconfig_fieldsexample carried the same stale 7.5.1, and thesearch_docsexample's second result score was stale at 76 now that fastapi-guard's growing release notes push it to 79. All five example blocks now show real, live output captured against the installed 3.12.0/7.6.0/2.8.1 line. - Fixed -
config_fields's tool docstring saidmatcheslists every field "whose name or description contains the query", which is not what the implementation does: it splits the query into words and requires every word to appear somewhere in the combined name and description, independent of order or adjacency.config_fields("limit rate", ...)matchesrate_limiteven though the literal substring "limit rate" appears nowhere in its name or description. The docstring now says "contains every word of the query (case-insensitively, word order does not matter)", matching what Tools already documented correctly. - Fixed -
pyproject.toml's package description used an em dash between the product name and its feature list; replaced with a plain hyphen. - Changed - Vendored
_docsre-synced from the sibling repos: guard-core 3.12.0, fastapi-guard 7.6.0, guard-agent 2.8.1 (unchanged). This picks up guard-core's exclusion-path enforcement fix (an excluded path now still enforces IP bans, blacklists, blocked countries, blocked cloud providers and rate limits; only detection and behavioral tracking are skipped there), the identity-block escalation fix so a route-level IP block is no longer bypassed by a stale global-whitelist flag left over from the earlier global check, and fastapi-guard's bounded body reading for chunked requests plus working response-bodyreturn_patternrules. - Changed -
uv.lockand the development environment refreshed to resolve guard-core 3.12.0 and fastapi-guard 7.6.0;guard-agentwas already current at 2.8.1. Upgraded individually rather than via a blanketuv lock --upgrade, which still downgradesmcpfrom 2.0.0 to 1.23.3 and breaks the server at import.pyproject.tomlruntime dependencies remain unpinned and unchanged. - Fixed -
check_payload's sandbox request was not compliant with guard-core 3.12.0's body-read contract, so the detection stage silently skipped the request body. guard-core 3.12.0'sdetect_penetration_attemptreadscontent-lengthto decide whether to scan the body and caches the capped body onrequest.state; the synthetic request carried nocontent-lengthheader and returnedNoneforstate, so detection took the no-content-length branch and never inspected the body, and the body-cache path would have raisedAttributeErrorif reached. The synthetic request now injects acontent-lengthheader when a body is present and exposes a mutablestatenamespace, so the detection tool actually inspects the request body against guard-core 3.12.0. This is a runtime behaviour change forcheck_payload(the body was not scanned before), not a documentation change.
v0.1.6 (2026-08-10)¶
Unblock make check-all under the mcp 2.x line: pin mcp>=2, isolate semgrep, bump cryptography (v0.1.6)¶
- Fixed -
pyproject.tomlnow declaresmcp>=2rather thanmcpunpinned. A blanketuv lock --upgradepreviously downgradedmcpfrom 2.0.0 to 1.23.3, which removesmcp.server.mcpserver.MCPServerand breaks the server at import withModuleNotFoundError: No module named 'mcp.server.mcpserver'. The lower bound stops the resolver from ever selecting a 1.x release. No runtime behaviour change for any environment already on mcp 2.x. - Fixed -
make analysisstopped working under mcp 2.x. semgrep importsmcp.server.fastmcpat CLI startup, a module mcp 2.0.0 removed, souv run semgrepcrashed withModuleNotFoundError: No module named 'mcp.server.fastmcp'before scanning anything; semgrep also pinsmcp==1.23.3in its own metadata, which cannot coexist with this server'smcp>=2in one virtualenv. semgrep is now invoked throughuvx --from semgrepin an isolated environment that resolves its own mcp 1.23.3, and it has been removed from the project dev dependencies so the lock no longer carries the conflicting pin. The commented pre-commit hook was updated to the sameuvxinvocation. semgrep's one audit finding onconfig.py(importlib.import_moduleof a dynamic module name) is a false positive:module_nameis one of three hardcodedPACKAGE_MODELSallowlist entries, not caller-controlled, so no arbitrary module can be loaded. It is suppressed with a# nosemgrepannotation and a one-line reason, somake analysisnow prints no findings. - Security -
cryptographybumped from 49.0.0 to 50.0.0 to clear PYSEC-2026-3552, which pip-audit flagged and which failedmake security. The upgrade is targeted (uv lock --upgrade-package cryptography); mcp and all other dependencies are unchanged.cryptographyis a transitive dependency, so no guard-core-mcp source or runtime dependency declaration changed. - Changed -
uv.lockrefreshed so its recorded constraint matchesmcp>=2, semgrep and its transitive dependencies are no longer recorded, andcryptographyis bumped to 50.0.0. The resolved version of mcp is unchanged at 2.0.0.
v0.1.5 (2026-08-09)¶
Documentation accuracy sweep, corrected tool descriptions, and vendored docs re-synced to the 3.11.0 line (v0.1.5)¶
- Fixed - Three tool descriptions did not match their implementations.
config_fieldsdid not mention thatexactandmatchesare populated together rather than exclusively, and omitted therequiredkey it returns for every field.check_payloaddid not mention that it forcesenable_redisoff regardless of what the caller passes.versionsdid not mention that it also reports the server's own version. A tool's description is what a model reads before deciding to call it, so a wrong description is a functional defect rather than a cosmetic one. - Fixed -
search_docssilently returns an empty result set for an unrecognizedpackage, whilevalidate_configandconfig_fieldsraise a clear error for the same mistake. An agent that typo'd a package name concluded the documentation covered nothing on the topic. The behaviour is unchanged, but the docstring now states it, and Tools documents the difference between the fourpackage-taking tools. - Fixed - The
versionsexample in the installation guide and tool reference showed invented numbers that no real call would produce, and the surrounding prose did not explain whatinstalledanddocs_bundled_foreach mean. Both now show real output, and the prose explains that the two are independent, that either side trailing the other is normal, and that anullunderinstalledis the actual warning sign. - Changed - Vendored
_docsre-synced from the sibling repos: guard-core 3.11.0, fastapi-guard 7.5.1, guard-agent 2.8.1. This picks up guard-core's ten newly reachableagent_*configuration fields and theon_errorforwarding fix, fastapi-guard's corrected agent buffer guidance, and guard-agent's corrected middleware attachment examples. - Changed -
uv.lockrefreshed so the development environment resolves the current guard-core, fastapi-guard and guard-agent releases rather than three versions behind.pyproject.tomldependencies remain unpinned. Note that a blanketuv lock --upgradedowngradesmcpfrom 2.0.0 to 1.23.3, which removesmcp.server.mcpserver.MCPServerand breaks the server at import; the guard packages were upgraded individually instead. - No runtime behaviour change. The only source change is docstring text.
v0.1.4 (2026-08-09)¶
Sync vendored docs to guard-core 3.10.0 and fastapi-guard 7.5.0 (v0.1.4)¶
- Changed - Vendored
_docsre-synced from the sibling repos: guard-core 3.10.0, fastapi-guard 7.5.0, guard-agent 2.8.0. Thesearch_docsandget_doctools now surface guard-core's config-derived security pipeline (SecurityCheck.applies_to, which lets a deployment build only the checks its configuration can actually trigger), the newredis,cloudandgeoinstall extras, and the correctedmuted_check_logsdescription in the telemetry architecture page. - Changed - fastapi-guard's vendored pages pick up the decorator adoption that makes per-route configuration visible when the pipeline is built, and the shared-state registry's compound
(id(config), id(guard_decorator))key, which stops two middleware instances sharing oneSecurityConfigfrom also sharing a pipeline built under different route visibility. - Changed -
uv.lockregenerated so the recorded package version matchespyproject.toml.pyproject.tomldependencies remain unpinned. - No runtime code or behavior change. Runtime dependencies (
mcp,pydantic) are unchanged and the server does not depend on guard-core at runtime, so this release only refreshes the embedded documentation.
v0.1.3 (2026-08-03)¶
Sync vendored docs to guard-core 3.8.1 + refresh dev deps (v0.1.3)¶
- Changed — Vendored
_docsre-synced from the sibling repos on master: guard-core 3.8.1, fastapi-guard 7.4.0, guard-agent 2.7.1. Thesearch_docsandget_doctools now surface guard-core 3.8.1's release notes (the gated lazy_init warning, the completed preempted-header warning advice, and the globalwhitelist_countriesrestrict fix) plus the correctedwhitelist_countriesconfiguration table. - Changed — Development extras in
uv.lockbumped to match: guard-core 3.5.0 → 3.8.1, fastapi-guard 7.3.0 → 7.4.0, guard-agent 2.7.0 → 2.7.1.pyproject.tomldependencies remain unpinned. - No runtime code or behavior change. Runtime dependencies (
mcp,pydantic) are unchanged and the server does not depend on guard-core at runtime, so this release only refreshes the embedded documentation and the development dependency lockfile.
v0.1.2 (2026-07-28)¶
Unpinned mcp (v0.1.2)¶
- Changed —
mcpis declared without a version bound again, matching how every other dependency in the Guard ecosystem is declared. Installs resolve the latest SDK, which is what the server targets.
v0.1.1 (2026-07-28)¶
MCP SDK 2.0 compatibility (v0.1.1)¶
- Fixed — The server failed to start against
mcp2.0.0 withModuleNotFoundError: No module named 'mcp.server.fastmcp'. The SDK renamedFastMCPtoMCPServerand moved it tomcp.server.mcpserver;guard-core-mcpnow imports it from there. - Changed —
mcpis now required at>=2, since the pre-2.0 import path no longer exists.
v0.1.0 (2026-07-25)¶
Config, documentation and detection tools (v0.1.0)¶
- Added —
validate_config— validates a config dict against the real PydanticSecurityConfig/AgentConfigmodel forfastapi-guard,guard-core, orguard-agent, reporting unknown keys (with typo suggestions), validation errors, and deprecation warnings. - Added —
config_fields— looks up a config field by exact name or fuzzy query, returning its type, default, required-ness, and description straight from the installed Pydantic model. - Added — Bundled documentation for
fastapi-guard,guard-core, andguard-agent(95 vendored pages, kept in sync viascripts/sync_docs.py), plussearch_docsandget_docto query it. - Added —
check_payload— runs a request through guard-core's real detection engine in a Redis-disabled sandbox, reporting whether it would be blocked and by which pattern. - Added — Repo scaffolding matching the rest of the Guard ecosystem: community files, pre-commit and CI tooling configuration, and packaging metadata.
v0.0.1 (2026-07-25)¶
Name reservation (v0.0.1)¶
- Added — Initial scaffold published to PyPI to reserve the
guard-core-mcpname. Only theversionstool — reporting which Guard libraries are installed and at what version — is implemented.