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 already declare readOnly/idempotent/non-destructive, and the description adds real context beyond them: snippets are verbatim from the README as of server build time with a re-check warning when release_status is untagged, unknown inputs return an error object rather than raising, and the tool is read-only static data that works without the Guard libraries installed.
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 and routing in the first two sentences, then behavior. The lengthy 'Returns' paragraph enumerates fields that an output schema already covers, so some content is redundant, but the README-drift caveat in it earns its place.
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?
Given an output schema exists, the description covers everything else an agent needs: input semantics, error handling for unknown language/framework, data staleness caveats, and the zero-dependency read-only nature. 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% and both parameters are fully documented in the schema, including the error-on-unknown behavior and slug-or-package-name acceptance. The description restates rather than extends this, 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: 'Get the install command and a verified minimal integration for one Guard adapter.' It explicitly contrasts itself with siblings ecosystem (survey all adapters) and wire_agent (telemetry), so an agent can route correctly 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 an explicit trigger ('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'). This is textbook when-to-use/when-not guidance.
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 declare readOnly/idempotent/non-destructive/closed-world, but the description adds substantial context they cannot carry: the sandbox guarantee (request never sent, enable_redis forced off so Redis is never touched), the graceful error-object behavior when guard-core is absent, and the important scoping caveat that this is detection alone, not the full middleware pipeline, so a clean verdict does not promise routing.
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-loads purpose and the sibling alternative, then layers guarantees, limitations and caps in descending order of importance. Four dense paragraphs is on the long side, but each sentence carries distinct decision-relevant information rather than restating the schema.
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?
Although an output schema exists, the description covers everything else an agent needs: error-mode behavior, the fact that caps and enhanced detection require guard-core 3.15.0 (with `versions` named to check), and the boundary between a detection verdict and a real pipeline block. Nothing material is missing for a zero-required-param tool.
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 goes beyond it by naming specific SecurityConfig fields reachable through the `config` override (detection_max_scan_values default 512, detection_max_scan_chars default 65536, detection_max_json_depth default 32) and their truncation semantics, which the schema only gestures at with a generic example.
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+resource (run one synthetic request through guard-core's real penetration-detection engine) and immediately distinguishes itself from the sibling it overlaps with: 'Use validate_config instead to check a config, not a request.' An agent can route between the two 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 an attack payload is caught; explain why a benign request was flagged) and an explicit exclusion pointing at validate_config for config checks. Nothing about when-to-use 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.
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 the read-only, idempotent, closed-world profile, but the description adds real behavioural detail beyond them: the graceful failure mode ('returns an object with an error key instead of raising') when the library is missing or the package is unrecognized, and the spelling-fallback behaviour of matches. Return-shape detail partially duplicates the output schema, which keeps this just short of a 5.
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 guidance, then return/error semantics. Every sentence carries information an agent needs; no filler or restatement of the title.
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?
Complete for a two-parameter lookup tool: purpose, sibling routing, match semantics, fallback behaviour, and error handling are all covered, and an output schema exists so return values need not be exhaustively restated.
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 matching semantics the schema does not spell out: 'every other field whose name or description contains every word of the query' (AND-of-words) and the spelling-based fallback when nothing matches. That is genuine meaning beyond the enum-like examples in 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?
States a specific verb and resource ('Find a Guard config setting') and immediately scopes it by name-or-behaviour, with the returned payload (type, default) named up front. It explicitly distinguishes itself from validate_config and search_docs, so an agent can pick it without opening sibling schemas.
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 both when-to-use cases ('learn what a setting means, or whether a setting for some behaviour exists at all') and names two alternatives with the exact conditions that select them: validate_config for checking a whole config, search_docs for prose explanations.
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 cover safety (readOnly, idempotent, non-destructive, closed-world), but the description goes well beyond them: it explains the release_status enum semantics (published/tagged/untagged) with the caveat that notes must be read together with it, and confirms it works without the Guard libraries installed. This is exactly the kind of domain 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 purpose and the usage routing before the detailed return-shape walkthrough. Reasonably sized for the information conveyed, though the returns block is long and could be tightened slightly without losing meaning.
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 output schema exists, so return values need not be fully explained, yet the description still gives the agent a precise map of the registry structure and the release_status semantics it needs to interpret results correctly. Complete for a zero-param read tool.
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?
There are zero parameters, so the baseline is 4. The description confirms 'It takes no arguments', which is a useful restatement of the empty schema but adds no further parameter meaning because none exists.
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 description states a specific verb and resource ('Survey the whole Guard ecosystem: every language, engine, adapter and agent') and enumerates exactly what the registry contains. It explicitly distinguishes itself from siblings adapter_setup and wire_agent by describing when those should be used instead.
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 ('resolve a package name or compare languages') and when-not-to-use ('When you already know the language and framework, use adapter_setup ... or wire_agent ... instead, which return less'). Names the alternatives and the condition that selects them.
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 cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower, yet the description still adds real behavioral context: exact error semantics (unknown package and nonexistent path both return {"error": "unknown doc path"} and are indistinguishable), offline operation, and the scope limit that it cannot read outside bundled docs.
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 paragraphs, front-loaded with the purpose, then routing guidance, then return shape, then edge cases. Every sentence carries information an agent needs; there is no 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?
Despite an output schema existing, the description usefully names the returned fields and documents the failure case, plus scope constraints. Nothing needed to invoke it 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 description coverage is 100%, so the schema already documents both parameters and the baseline is 3. The description adds provenance semantics beyond the schema ('the package and path come from a search_docs result'), which helps the agent source correct values.
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 ('Return the full text of one bundled Guard documentation page') and immediately distinguishes itself from the sibling search_docs by noting 'it does not search'. An agent can tell this apart from 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?
Explicitly states when to use it ('after search_docs when a snippet is not enough') and names the alternative it is not. It also tells the agent where the required arguments come from (a search_docs result), removing the main selection ambiguity.
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 declare readOnlyHint/idempotentHint/openWorldHint=false, so the safety profile is covered. The description adds genuinely new behavior: the search is offline over bundled docs, an unrecognized package silently matches nothing rather than erroring (unlike validate_config), and therefore an empty result is ambiguous and package should be dropped before concluding a docs gap. That failure-mode guidance is exactly what annotations cannot express.
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 one-line purpose, then routing, then return shape, then caveats. Every sentence carries information, though the final retry instruction is dense and could be trimmed into the package sentence it repeats.
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 output schema exists, yet the description still states the return surface (query, results with package/path/heading/snippet/url/score) and the handoff path to get_doc. Combined with routing rules and the empty-result interpretation, an agent has everything needed to call and interpret this tool.
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% – limit, query and package each carry descriptions, examples and defaults, including the package silent-match caveat. The description restates the package trap but adds no syntax or format 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 ('Search the bundled Guard documentation and return ranked, citable pages') and immediately scopes it as the docs shipped inside this package. It names the siblings it is not (config_fields, adapter_setup, wire_agent) and the sibling it feeds (get_doc), so an agent can separate it from the other nine tools 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?
Explicit routing: use it for how/why questions from documentation and to locate a page for get_doc; use config_fields for a setting's type and default; use adapter_setup or wire_agent for install and wiring steps. That covers when-to-use and named alternatives in one sentence.
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?
Goes well beyond the readOnly/idempotent annotations: it states validation happens in memory and is never applied, explains that pydantic silently ignores unknown keys so typos fail without error, enumerates what construction_warnings captures, and documents the failure path when the library is missing or package unrecognized.
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?
Purpose and the routing rule are correctly front-loaded, but roughly half the text enumerates the return payload (valid, package, version, model, errors, unknown_fields, deprecated, construction_warnings) even though an output schema already exists. That enumeration distends the definition without adding new executable guidance.
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 an output schema and full annotation coverage, the definition closes every meaningful gap: usage routing, non-destructive in-memory semantics, the silent-unknown-key trap, and error behavior on missing/unknown package.
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 schema already documents both parameters, but the description adds real meaning on the package parameter's failure mode ('Any other value returns an error object', missing-install hint) and frames config as constructor-shaped input.
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 explicitly differentiates from the sibling config_fields. An agent can distinguish it from check_payload, ecosystem, or config_fields 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 two concrete use cases ('confirm a config is valid' or 'find out why a setting seems to have no effect') and names the alternative (config_fields) with the exact condition that selects it ('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, read-only, idempotent call, and the description goes well beyond them: it names the returned fields, explains that a null installed version means the library is absent and downstream answers would be guesses, and clarifies that an installed/docs version mismatch is normal and harmless.
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 core instruction is front-loaded in the first line ('Report which Guard libraries... Call this first'), followed by return-field semantics. It runs three paragraphs and could be slightly tighter, but each block carries distinct decision-relevant information.
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?
Even though an output schema exists (so return values need not be documented), the description supplies the interpretation rules an agent needs: null-version consequences and docs-vs-install divergence. Nothing required to call it or act on its 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?
The schema has zero parameters at 100% coverage, so the baseline is 4. The description reinforces this with 'It takes no arguments', but there is no additional parameter meaning to convey.
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: reports which Guard libraries the server can introspect and at which version. It differentiates itself from siblings by framing itself as the version-provenance precondition rather than a config/payload validator.
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 tells the agent when to call it ('Call this first, before trusting any answer about a version-specific feature') and ties its outcome to sibling behavior, explaining that validate_config, config_fields and check_payload cannot answer for a library whose installed version is null.
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 and closed-world, so the safety profile is covered. The description adds genuinely new behavioral facts: unknown language/framework returns an error object rather than raising, and the data is static and readable without libraries installed. It stops short of describing pagination or caching, which is minor here.
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-loads purpose and the alternative in the first two sentences, then details returns. The return enumeration is somewhat redundant given an output schema exists, which costs a point, but the structure is clean and nothing is misleading.
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-only lookup with full schema coverage and an output schema, the description covers purpose, alternative routing, error behavior, and offline availability. An agent has everything needed to call it correctly.
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 meaning beyond the schema by explaining what the framework parameter changes downstream: for python the note points at the bundled guard-agent adapter doc, while for other languages the agent is standalone and the note says so. It also reiterates the error behavior for unknown values, reinforcing the schema's constraint.
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 ('Get how to set up the Guard telemetry agent for one language') and explicitly separates itself from the sibling adapter_setup. An agent can distinguish this from adapter_setup, search_docs, or get_doc 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 ('ship security events and metrics to the guard-core-app backend') and names the alternative with its selection condition ('Use adapter_setup instead for the request-blocking middleware itself'). Also states the precondition that it works without the Guard libraries installed.
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 has a clearly distinct purpose, and the descriptions explicitly disambiguate against their nearest neighbors (check_payload vs validate_config, config_fields vs validate_config vs search_docs, search_docs vs get_doc, ecosystem vs adapter_setup vs wire_agent). No two tools compete for the same job; the search/read and middleware/telemetry splits are clean.
All names use snake_case consistently and are readable, but the set mixes verb_noun forms (check_payload, validate_config, search_docs, get_doc, wire_agent, adapter_setup) with bare nouns (versions, ecosystem, config_fields). The deviation is minor and never ambiguous.
Nine tools is well within the sweet spot and each earns its place across the distinct jobs of version reporting, config validation, field lookup, doc search/read, ecosystem survey, adapter setup, agent wiring, and payload testing. No redundancy or padding.
The surface covers the full lifecycle of the stated purpose: discovering versions, validating configs, looking up fields, searching/reading docs, surveying the ecosystem, and getting adapter/agent setup and testing payloads. Introspection, setup, and troubleshooting paths all have entry points with no obvious dead end.
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.
Audit GitHub repos for malicious and supply-chain code before you depend on them.
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
- AlicenseNot gradedqualityDmaintenanceLocal-first security check for AI coding agents — finds hardcoded secrets, exposed .env files, git-history leaks and vulnerable dependencies (OSV), entirely on your machine. Ask your agent "is this safe to ship?" and get a Launch Readiness score with a fix for every finding.MIT
- 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.10559 npm48Apache 2.0