guard-core-mcp
Provides tools for Guard Core config validation and documentation search for Actix Web applications via the actix-guard-rs adapter.
Provides tools for Guard Core config validation and documentation search for Django applications via the djapi-guard adapter.
Provides tools for Guard Core config validation and documentation search for Express applications via the @guardcore/express adapter.
Provides tools for Guard Core config validation and documentation search for FastAPI/Starlette applications via the fastapi-guard adapter.
Provides tools for Guard Core config validation and documentation search for Fastify applications via the @guardcore/fastify adapter.
Provides tools for Guard Core config validation and documentation search for Flask applications via the flaskapi-guard adapter.
Provides tools for Guard Core config validation and documentation search for Gin applications via the gin-guard adapter.
Provides tools for Guard Core config validation and documentation search for Hono edge applications via the @guardcore/hono adapter.
Provides tools for Guard Core config validation and documentation search for Laravel applications via the laravel-guard adapter.
Provides tools for Guard Core config validation and documentation search for NestJS applications via the @guardcore/nestjs adapter.
Provides tools for Guard Core config validation and documentation search for Symfony applications via the symfony-guard adapter.
Provides tools for Guard Core config validation and documentation search for Tower-based Rust applications via the tower-guard-rs adapter.
Ecosystem
Guard Core is the Python engine. Framework adapters are thin wrappers that translate native request/response types into Guard Core's protocols. The telemetry agents ship security events and metrics to the monitoring backend. Parallel engine implementations exist for Go, PHP, TypeScript (on npm), and Rust (on crates.io) - all ports of the same reference semantics, conformance-tested against the shared adversarial corpus.
Python
Package | Role | PyPI |
Framework-agnostic security engine | ||
Telemetry agent | ||
FastAPI / Starlette adapter | ||
Flask adapter | ||
Django adapter | ||
Tornado adapter |
Go
Go modules published via GitHub releases. Production-ready.
Package | Role | Release |
Go engine | ||
net/http adapter | ||
Gin adapter | ||
Echo (v4) adapter | ||
Fiber (v3) adapter | ||
Telemetry agent |
PHP
Published on Packagist under the rennf93 vendor. Production-ready.
Package | Role | Packagist |
PHP engine | ||
Laravel adapter | ||
Symfony adapter | ||
PSR-15 adapter | ||
Slim 4 adapter | ||
Telemetry agent |
TypeScript / JavaScript
Published under the @guardcore npm scope; source in the guard-core-ts monorepo. Production-ready.
Package | Role | npm |
Core engine | ||
Express adapter | ||
NestJS adapter | ||
Fastify adapter | ||
Hono (edge) adapter | ||
Telemetry agent |
Rust
Published on crates.io. Production-ready.
Package | Role | crates.io |
Core engine crate | ||
Facade crate (consumer entry point) | ||
Actix Web adapter | ||
Axum adapter | ||
Tower adapter | ||
Rocket adapter | ||
Telemetry agent |
AI Coding Agents
Package | Role | PyPI |
MCP server: config validation, docs search, detection sandbox |
Related MCP server: FlowCheck MCP Server
Documentation
📚 Documentation - full technical documentation for this package.
🛡️ Guard Core - the engine's reference documentation.
🤖 Monitoring Agent Integration - monitor your Guard instance with a monitoring agent.
Why
Your agent can already read the docs. What it cannot do is tell you that the redis_failopen in your config is silently doing nothing because the real field is redis_fail_open, or that the flag you are reaching for did not exist until guard-core 3.5.0, or whether a given request would actually be blocked and by which pattern.
This server answers those from the installed package: real pydantic validation, real field metadata, and the real detection engine. It also answers the cross-language questions the libraries cannot answer: which package guards a Gin, Fastify, Laravel or Rocket app, whether it is tagged or still path-dependent, how to wire its telemetry agent, and what response codes the SaaS ingest endpoint returns.
Install
Install it into your project's environment, not as an isolated tool:
uv add --dev guard-core-mcp
claude mcp add guard-core -- uv run guard-core-mcpuvx guard-core-mcp will start, but an isolated environment contains no guard-core or fastapi-guard for it to introspect, so it can only answer from bundled documentation. Running it inside your own environment is what makes the answers match the versions you actually ship.
Tools
Tool | Answers |
| Which Guard libraries are installed here, and at what version |
| Is this config valid, including typo'd keys pydantic silently ignores |
| What is this setting, what does it default to, does a setting for X exist |
| Where do the docs cover this |
| The full text of one documentation page |
| Would this request be blocked, and by which pattern |
| The full registry matrix: 5 languages, engines, adapters, agents, conformance, SaaS contract |
| Install plus a verified minimal integration for one adapter (e.g. |
| How to set up the telemetry agent for a language, including the ingestion contract |
The ecosystem tools are pure data, so they work everywhere, with or without the Python libraries installed. Every quick-start snippet is copied verbatim from the sibling repo READMEs, and release_status tells you honestly whether a package is published, tagged, or still untagged (source, main, or path dependency only).
ChatGPT plugin
The same tools are also served remotely at https://mcp.guard-core.com/mcp and packaged as a ChatGPT plugin: sign in with a guard-core account, and ChatGPT can validate configs, search the docs and run payloads through the hosted detection engine (the latest published releases, not your local versions). The packaging lives in plugin/, the hosted server in guard_core_mcp.hosting, and the full story (env vars, Docker image, developer-mode test loop, submission checklist) in the ChatGPT plugin guide.
Licence
MIT
mcp-name: io.github.Guard-Core/guard-core-mcp
Available Tools
9 toolsadapter_setupAdapter setupARead-onlyIdempotent
Get the install command and a verified minimal integration for one Guard adapter.
Use this when you know the language and web framework and want working setup code. Use ecosystem instead to survey every adapter, and wire_agent to set up telemetry.
Returns language, engine (package, install command, release_status and conformance status of the engine the adapter depends on) and adapter (install command, release_status, its role in the framework, the Python adapter it mirrors, and a quick-start snippet taken verbatim from the adapter's README). Snippets reflect the README at the time this server was built; when release_status is untagged, re-check the repository. An unknown language or framework returns an object with an error key instead of raising. Read-only static data, works without the Guard libraries installed.
| Name | Required | Description | Default |
|---|---|---|---|
| language | Yes | The language of the adapter. One of python, go, typescript, php or rust. Any other value returns an error object | |
| framework | Yes | The adapter slug for that language, or the adapter package name. An unknown slug returns an error object listing the valid ones |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (read-only, idempotent, non-destructive, closed-world), and the description goes well beyond them: it discloses provenance/staleness of snippets ('reflect the README at the time this server was built; when release_status is untagged, re-check the repository'), error behavior instead of raising, and that no Guard libraries need be installed. That is exactly the extra context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then usage routing, then return details. Every sentence carries information, though the multi-line return inventory overlaps with the output schema that already exists, so it is slightly longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An agent has everything needed: what it returns, when it errors, how fresh the data is, and that no dependencies are required. Because an output schema exists, the extra return prose is bonus rather than obligation, and nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so language and framework are already fully documented, including allowed values and error-on-unknown behavior. The description only reinforces that the pair selects a single adapter and that unknown values yield an error object, which duplicates rather than extends the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Get the install command and a verified minimal integration for one Guard adapter.' The scope ('one Guard adapter', keyed by language+framework) is stated precisely and clearly distinguishes it from the survey tool (ecosystem) and the telemetry tool (wire_agent).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('when you know the language and web framework and want working setup code') plus named alternatives with their selecting conditions: 'Use ecosystem instead to survey every adapter, and wire_agent to set up telemetry.' Nothing left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_payloadCheck payloadARead-onlyIdempotent
Run one synthetic request through guard-core's real penetration-detection engine.
Use this to confirm that an attack payload is caught, or to explain why a benign request was flagged. Use validate_config instead to check a config, not a request.
Returns is_threat (bool), trigger_info (the matched parameter and pattern, empty when clean), threat_categories (for example sqli or xss), threat_scores (a score per category) and elapsed_ms. Verdicts come from the same detection path a live adapter runs. Read-only and sandboxed: the request is never sent anywhere and enable_redis is forced off so Redis is never touched. If guard-core is not installed, returns an object with an error key and a hint instead of raising.
This is the detection stage alone, not the whole middleware pipeline. A real request also passes IP rules, rate limiting, user-agent and cloud-provider checks, any of which can block it before detection runs, and a whitelisted IP skips detection entirely. A clean verdict here does not promise the request reaches the route, and a threat verdict does not promise a running app would block it.
The scan is bounded, so a payload past a cap is judged on the scanned prefix only: detection_max_scan_values caps values inspected (default 512), detection_max_scan_chars caps total characters scanned (default 65536), and detection_max_json_depth (default 32) caps how deep a JSON body is walked before the rest is scanned as one serialized value. These caps and the enhanced detection path apply from guard-core 3.15.0; versions reports what is installed.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Request body as a raw string, or a JSON object or array, which is serialized for you. Omit for a bodyless request | |
| path | No | Request path of the request to test | / |
| query | No | Query-string parameters as a JSON object of names to string values | |
| config | No | SecurityConfig fields to override guard-core's defaults, as a JSON object, to see how a setting changes the verdict. enable_redis is always forced off | |
| method | No | HTTP method of the request to test | GET |
| headers | No | Request headers as a JSON object of names to values. Names are matched case-insensitively |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, idempotent, closed-world), but the description adds substantial context beyond them: sandboxed execution, request never sent, enable_redis forced off, graceful error-object behavior when guard-core is missing, and the crucial scope caveat that this is detection alone and a clean verdict does not guarantee the request reaches the route.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is on the longer side, but it is front-loaded with the core action, and the warning paragraph about pipeline scope and the cap paragraph each carry distinct, non-redundant information an agent needs to interpret a verdict. Only the version-availability detail feels slightly peripheral.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations, a full input schema, and an output schema present, the description still proactively explains the return shape (is_threat, trigger_info, threat_categories, threat_scores, elapsed_ms) and the error path, so nothing needed to call or interpret the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds real meaning on top by explaining that config overrides force enable_redis off and by naming the detection_max_scan_values/chars/json_depth caps that govern how payloads are judged. It stops short of walking each parameter, but the added semantic layer exceeds the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: run one synthetic request through guard-core's real penetration-detection engine. It is unambiguous and immediately distinguishable from the config-checking sibling it names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives two explicit use cases ('confirm that an attack payload is caught' or 'explain why a benign request was flagged') and routes the agent away from this tool with 'Use validate_config instead to check a config, not a request.' When-to-use and the alternative are both stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
config_fieldsConfig fields lookupARead-onlyIdempotent
Find a Guard config setting by name or by what it does, with type and default.
Use this to learn what a setting means, or whether a setting for some behaviour exists at all. Use validate_config instead to check a whole config you already wrote, and search_docs for prose explanations rather than field metadata.
Returns package, version, query, exact and matches. An exact field name fills exact with that field's name, type, default, required flag and description (otherwise exact is null). Every query also fills matches with each other field whose name or description contains every word of the query; if nothing matches at all, matches falls back to the closest field names by spelling.
Read-only, in-memory lookup. If the library is not installed, or package is not recognized, returns an object with an error key instead of raising.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Either an exact config field name or plain words describing the behaviour. Matching is case-insensitive and word order does not matter | |
| package | No | Which Guard library's installed model to search. One of fastapi-guard, guard-core or guard-agent. Any other value returns an error object | fastapi-guard |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, yet the description adds genuinely non-obvious behavior: exact is null when no exact match, matches falls back to 'closest field names by spelling' when nothing matches, and an error key object is returned instead of raising when the library is missing or the package is unrecognized. That error-vs-raise contract is the kind of detail an agent cannot infer from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, then return semantics, then error behavior — a clean progression with no filler. It does spend a sentence enumerating return fields that the output schema already covers, which is mild redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup with an output schema and full annotation coverage, the description supplies the missing pieces: the error-object contract and the spelling-fallback behavior for matches. An agent has everything it needs to call this correctly and interpret failure modes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both query and package are already documented, including case-insensitivity and word order. The description restates the exact-name-vs-words behavior but adds little syntax or constraint detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find a Guard config setting by name or by what it does, with type and default'), and immediately differentiates itself from validate_config and search_docs. An agent can tell exactly what this returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the two alternatives and the condition that selects each ('Use validate_config instead to check a whole config you already wrote, and search_docs for prose explanations rather than field metadata'). It also states the discovery use case ('whether a setting for some behaviour exists at all').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ecosystemEcosystem registryARead-onlyIdempotent
Survey the whole Guard ecosystem: every language, engine, adapter and agent.
Use this to resolve a package name or compare languages. It takes no arguments. When you already know the language and framework, use adapter_setup for one adapter or wire_agent for the telemetry agent instead, which return less.
Returns the full registry for five languages (python, go, typescript, php, rust). Each language entry holds its engine (name, install command, version, release_status, conformance status), every framework adapter with a verified quick-start snippet and the Python adapter it maps to, and its telemetry agent with delivery semantics. A conformance block describes the frozen spec-4.0.2 corpus every engine is tested against, and a saas block documents the guard-core-app ingestion contract all agents share.
release_status is published (live on a package registry), tagged (a git tag exists, registry presence may lag) or untagged (install from source, main or a path dependency). Read it together with notes: several Go, PHP and Rust packages carry tags or version constants that registry publishing has not caught up with. Read-only static data that works with or without the Guard libraries installed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a read-only, idempotent, closed-world operation, but the description goes well beyond them: it enumerates the returned structure, explains the release_status enum semantics (published/tagged/untagged) and the caveat that Go/PHP/Rust registry publishing lags tags, and states it works with or without the Guard libraries installed. No contradiction with the read-only hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then routing, then return shape, then the release_status nuance — a sensible order. It is on the long side and the release_status paragraph is dense, but nearly every sentence carries task-relevant information rather than restating structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite a rich output schema, the description summarizes the registry shape and the non-obvious release_status/notes interaction an agent needs to interpret results correctly. For a zero-argument, read-only survey tool, nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so per the rubric the baseline is 4. The description even reinforces this ('It takes no arguments'), leaving nothing about invocation ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Survey the whole Guard ecosystem: every language, engine, adapter and agent') and explicitly scopes itself apart from siblings by naming adapter_setup and wire_agent and the condition that selects them. An agent can distinguish this from the other eight tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('resolve a package name or compare languages'), a hard constraint ('takes no arguments'), and named alternatives with the reason to prefer them ('which return less'). This is textbook routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_docGet doc pageARead-onlyIdempotent
Return the full text of one bundled Guard documentation page.
Use this after search_docs when a snippet is not enough; it does not search. The package and path come from a search_docs result.
Returns package, path, url (the live page to cite) and content (the full markdown). An unknown package or a path that does not exist returns {"error": "unknown doc path"}; the two cases are not distinguished. Read-only and offline, and it cannot read files outside the bundled documentation.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The page path relative to the library's bundled docs, copied from a search_docs result. Paths outside the bundled docs are rejected | |
| package | Yes | The library the page belongs to, copied from a search_docs result or from the keys versions reports under docs_bundled_for and knowledge_bundled_for |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered; the description goes further by disclosing the exact failure contract ("An unknown package or a path that does not exist returns {\"error\": \"unknown doc path\"}; the two cases are not distinguished") and the offline/no-filesystem-escape boundary. These are non-obvious behavioral traits an agent cannot infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with purpose, then usage, then return shape, then error/boundary behavior. Slight redundancy between "it does not search" and the framing of the tool as a retrieval-by-exact-path operation, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with an output schema and full annotations, everything an agent needs is present: how to obtain arguments, what comes back, what failure looks like, and the offline/scope boundary. Return-value detail that the output schema already covers is not required, and the description's listing of fields is just convenient reinforcement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a real coupling constraint: both arguments must be taken from a prior search_docs result, which tells the agent not to invent values. It does not add format or syntax detail beyond the schema's examples, so it stops short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ("Return the full text of one bundled Guard documentation page") and immediately contrasts with the sibling it is most likely confused with: "it does not search" distinguishes it from search_docs. An agent can pick between get_doc and search_docs without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit sequencing rule ("Use this after search_docs when a snippet is not enough"), states the negative case ("it does not search"), and explains where the arguments originate ("The package and path come from a search_docs result"). This is a complete when/when-not/alternative statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_docsSearch docsARead-onlyIdempotent
Search the bundled Guard documentation and return ranked, citable pages.
Use this to answer how or why questions from documentation, and to find the page to read in full with get_doc. Use config_fields instead for a setting's type and default, and adapter_setup or wire_agent for install and wiring steps.
Returns query and results. Each result has package, path, heading, snippet, url (the live documentation page to cite) and score. Pass a result's package and path straight to get_doc to read the whole page.
Read-only and offline: it searches the docs shipped inside this package. Unlike validate_config, an unrecognized package is not an error, it silently matches nothing, so an empty results list means either a real gap in the docs or a mistyped package name; retry with package omitted before concluding the former.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return, highest score first | |
| query | Yes | Words to look for in the bundled documentation. Pages are ranked by how often the words occur, so use specific terms | |
| package | No | Restrict the search to one library, for example fastapi-guard, guard-core or guard-agent. Omit to search every bundled library. An unrecognized name silently matches nothing |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/offline-safe semantics, but the description adds failure-mode behavior the annotations cannot express: an unrecognized package silently matches nothing, an empty result set is ambiguous between a real doc gap and a typo, and the recommended recovery is to retry with package omitted. It also contrasts this with validate_config's error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then routing, then return/parameter mechanics, then edge-case behavior. Each paragraph earns its place, though the return-field enumeration partially duplicates the output schema and makes it slightly longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter search tool with an output schema and full annotation coverage, the description covers selection, alternatives, result handling, and the tricky silent-empty-result case. An agent has everything needed to invoke it correctly and interpret its output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description adds genuine value beyond the schema by explaining that query terms are ranked by occurrence (hence 'use specific terms') and by giving an operational rule for the package parameter when results come back empty. It does not restate the limit parameter's meaning, so it stops short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search the bundled Guard documentation') plus the return shape ('ranked, citable pages'). It also explicitly differentiates itself from siblings get_doc, config_fields, adapter_setup, and wire_agent by naming the question types each handles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('how or why questions from documentation'), a paired follow-up tool (get_doc to read the full page), and concrete when-not-to-use routing ('Use config_fields instead for a setting's type and default, and adapter_setup or wire_agent for install and wiring steps'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_configValidate configARead-onlyIdempotent
Check a Guard config dict against the installed library's real pydantic model.
Use this to confirm a config is valid, or to find out why a setting seems to have no effect. Use config_fields instead when you do not yet know the setting's name.
Returns valid (bool), package, version, model, errors (type errors, each with field, message and input), unknown_fields (each with name and did_you_mean suggestions), deprecated (field and message) and construction_warnings. Unknown keys matter: pydantic silently ignores them, so a misspelled setting does nothing at runtime and raises no error anywhere else. construction_warnings carries guard-core's own logged-not-raised misconfiguration warnings: an unknown constructor keyword, a trusted_proxies or whitelist /0 network, and enabled_detection_categories empty while penetration detection is enabled.
Read-only: the config is validated in memory and never applied. If the library is not installed, or package is not recognized, returns an object with an error key (plus a hint when the cause is a missing install) instead of raising.
| Name | Required | Description | Default |
|---|---|---|---|
| config | Yes | The config as a JSON object of field names to values, exactly as you would pass it to the model's constructor | |
| package | No | Which Guard library's installed model to validate against. One of fastapi-guard (SecurityConfig), guard-core (SecurityConfig) or guard-agent (AgentConfig). Any other value returns an error object | fastapi-guard |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, but the description adds substantial behavior beyond them: validation happens in memory and the config is never applied, pydantic silently ignores unknown keys so misspellings fail silently, construction_warnings enumerates guard-core's logged-not-raised misconfigurations, and non-missing-library errors return an object with an error key instead of raising. This is exactly the kind of runtime context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then usage, then returns, then error behavior — a sensible order. The one inefficiency is the paragraph enumerating every return field (valid, package, version, model, errors, unknown_fields, deprecated, construction_warnings) when an output schema already exists, which makes it longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter validation tool with nested config input and an output schema, the description covers purpose, routing, safety, silent-failure semantics, and error paths. Nothing an agent needs in order to call it correctly or interpret a surprising result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, which sets a baseline of 3. The description goes further by clarifying what a valid 'config' represents (exactly what you would pass to the model's constructor) and by explaining the failure mode when 'package' is unrecognized, which the schema does not state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check a Guard config dict against the installed library's real pydantic model') and immediately differentiates itself from the sibling tool config_fields, which it names explicitly. An agent can pick between validate_config and config_fields without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete use cases ('confirm a config is valid' / 'find out why a setting seems to have no effect') and an explicit routing rule to the alternative ('Use config_fields instead when you do not yet know the setting's name'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
versionsGuard versionsARead-onlyIdempotent
Report which Guard libraries this server can introspect, and at which version.
Call this first, before trusting any answer about a version-specific feature. It takes no arguments.
Returns guard_core_mcp (this server's version), installed (the guard-core, fastapi-guard and guard-agent versions live in this interpreter), and docs_bundled_for and knowledge_bundled_for (the versions the bundled docs and the hand-written ecosystem notes describe).
A null installed version means that library is absent from the interpreter running this server, so validate_config, config_fields and check_payload cannot answer for it and any answer would be a guess. An installed version that differs from docs_bundled_for is normal and only means the docs may lag or lead the install.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe, idempotent read, but the description goes beyond them by interpreting results: a null installed version means the library is absent and other tools would be 'guessing,' while a version mismatch between installed and docs_bundled_for is explicitly called normal. This is unusually rich disclosure of what the output means in practice.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key routing instruction is front-loaded in the first sentence and the field-by-field explanation follows logically. It runs long across several blocks and some return-field detail could be tightened, but every paragraph carries usable meaning rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-argument introspection tool with an output schema and full annotation coverage, the description supplies everything an agent needs: when to call it, the returned fields, and how to interpret null versus mismatched versions. No gaps remain for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which sets a baseline of 4. The description confirms 'It takes no arguments,' matching the empty schema, though there is nothing further to add.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: reporting which Guard libraries this server can introspect and at which version. This is clearly distinct from siblings like validate_config, config_fields, and check_payload, which it names as dependent on the result.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to 'Call this first, before trusting any answer about a version-specific feature,' and explains the downstream consequence: when a library is absent, validate_config, config_fields and check_payload cannot answer for it. When-to-use is stated directly rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wire_agentWire agentARead-onlyIdempotent
Get how to set up the Guard telemetry agent for one language.
Use this to ship security events and metrics to the guard-core-app backend. Use adapter_setup instead for the request-blocking middleware itself.
Returns language, agent (package, install command, release_status, quick-start snippet, and a summary of its buffer, flush, overflow and retry semantics), ingestion (the guard-core-app contract the agent ships against: endpoints, headers, HMAC signing, size limits and response semantics) and framework_note. For python the note points at the bundled guard-agent doc page for the adapter; for other languages the agent is standalone and the note says so. An unknown language or framework returns an object with an error key instead of raising. Read-only static data, works without the Guard libraries installed.
| Name | Required | Description | Default |
|---|---|---|---|
| language | Yes | The language whose telemetry agent to set up. One of python, go, typescript, php or rust. Any other value returns an error object | |
| framework | No | Optional adapter slug of that language, to add a note on how the agent hooks into that adapter. Omit for the agent alone |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, and the description goes further: it states the tool is read-only static data, works without the Guard libraries installed, and that unknown languages/frameworks return an error object rather than raising. That error-contract disclosure is exactly the kind of behavior an agent needs beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the sibling routing, then structured into usage and return-shape. It is on the long side and enumerates return fields that an output schema already carries, so it is slightly over budget rather than maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to enumerate return values, yet its usage guidance, error-handling contract, dependency note, and sibling routing leave nothing essential missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description still adds meaning by explaining the framework parameter's effect (python note points at the bundled guard-agent doc page, other languages are standalone and the note says so). That clarifies output implications of the parameter rather than merely restating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource (get the setup for the Guard telemetry agent) and immediately scopes it to 'one language'. It names the sibling adapter_setup and states the boundary between them, so an agent can distinguish the two without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the use case ('ship security events and metrics to the guard-core-app backend') and names the alternative ('Use adapter_setup instead for the request-blocking middleware itself'), which is an explicit when-to-use/when-to-use-something-else rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
- First observed
adapter_setup - First observed
check_payload - First observed
config_fields - First observed
ecosystem - First observed
get_doc - First observed
search_docs - First observed
validate_config - First observed
versions - First observed
wire_agent
TDQS
Scored across 9 tools
Each tool targets a clearly distinct purpose, and the descriptions actively disambiguate near-neighbors (validate_config vs config_fields, search_docs vs get_doc, adapter_setup vs wire_agent vs ecosystem) with explicit 'use X instead' guidance. Overlap between ecosystem/adapter_setup/wire_agent is resolved by scope (survey vs one adapter vs telemetry agent), so misselection is unlikely.
Most tools follow a clean verb_noun snake_case pattern (check_payload, wire_agent, validate_config, config_fields, search_docs, get_doc, adapter_setup). The bare nouns 'versions' and 'ecosystem' break the pattern, but the deviation is minor and the names remain readable.
Nine tools is well-scoped for an introspection/help server covering config validation, field lookup, payload testing, docs retrieval, version reporting, and setup guidance. Each tool earns its place with no redundant filler.
The surface covers the main Guard workflows thoroughly: version reporting, config validation and field lookup, payload testing, docs search/read, ecosystem survey, and adapter/agent setup. Minor gaps exist, such as no direct tool to enumerate available doc packages or a changelog/migration guide, but these are workable around via ecosystem and search_docs.
Maintenance
Related MCP Connectors
Deep security scans of repos you own from your editor: dependency CVEs, SAST, git-history secrets.
Security reviews, threat models over a repo or website, and remediation tracking, in your editor.
Scan, monitor and fix a live web app from your editor: graded security reports with fix prompts.
Security scanner for AI-written code: SAST, secrets, dependencies, IaC, containers and DAST.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAI-powered security scanner for Python projects and GitHub repositories. Detects vulnerabilities, secrets, and provides AI risk assessment.11MIT
- AlicenseAqualityDmaintenanceActs as a production-grade safety layer for AI-assisted coding, monitoring Git hygiene, scanning for security issues (PII, secrets, injection), and enabling semantic history search.9MIT
- AlicenseAqualityAmaintenanceLocal-first, zero-egress security scanner for AI-generated / "vibe-coded" JS/TS. Bundles Opengrep, Gitleaks & Trivy behind one CWE-keyed schema and adds AI-code-specific checks (client-side secret exposure, Supabase RLS, prompt-injection & LLM-output XSS sinks). No account, no telemetry.10211 npm50Apache 2.0
- AlicenseNot gradedqualityCmaintenanceProvides security checks for AI agents, including secret scanning, CVE lookup, and dependency vulnerability scanning, all running locally except for CVE lookups.MIT