Skip to main content
Glama

Ground Truth MCP

✅ WORKING IN 15 SECONDS: NO SIGNUP. NO API KEY. JUST WORKS.


🎯 DO THIS NOW (15 seconds)

Step 1: Copy this config

{
  "mcpServers": {
    "ground-truth": {
      "url": "https://ground-truth-mcp.anishdasmail.workers.dev/mcp"
    }
  }
}

Step 2: Paste this prompt to your AI

Use Ground Truth check_endpoint tool with url=https://example.com. Do not answer from memory. Call the tool.

Step 3: You should see this (✅ SUCCESS!)

{
  "url": "https://example.com/",
  "accessible": true,
  "status": 200,
  "contentType": "text/html",
  "responseTimeMs": 89
}

If you see this JSON, Ground Truth is working perfectly.

If your AI answers from memory instead of using the tool, try: "Use the check_endpoint MCP tool right now with url=https://example.com"


Related MCP server: Demaciains MCP Server

🏆 That's It! You're Done.

You've successfully connected to Ground Truth MCP and verified it works.

What just happened:

  • ✅ You proved MCP connection works

  • ✅ You verified a live endpoint in real-time

  • ✅ You got structured data, not hallucinated answers

No signup. No API key. No credit card. Just verification.


🌟 What Ground Truth Does

Ground Truth stops AI agents from being wrong by verifying live public data before they use it in answers, code, or decisions.

Free Tools (No signup required)

  • check_endpoint - Verify any URL/API responds (100 calls/month free)

  • inspect_security_headers - Check security posture of any site

Paid Tools (Unlock with team key)

  • check_pricing - Extract prices from any pricing page

  • estimate_market - Search npm/PyPI for package counts

  • compare_competitors - Compare packages side-by-side

  • compare_pricing_pages - Compare multiple pricing pages

  • verify_claim - Verify claims against live sources

  • assess_compliance_posture - Scan trust pages for compliance signals

  • test_hypothesis - Run multi-step verification tests


💡 Use Cases That Actually Matter

Before recommending an API

"Use the /v1/users endpoint for user management"

Verify first: check_endpoint url=https://api.example.com/v1/users

Before quoting a price

"Stripe costs $8/user/month for teams"

Verify first: check_pricing url=https://stripe.com/pricing

Before claiming compliance

"This vendor supports SOC 2 and GDPR"

Verify first: assess_compliance_posture url=https://vendor.example.com/security

Before saying a competitor doesn't exist

"There are no good edge ORM alternatives to Prisma"

Verify first: estimate_market query="edge orm" registry="npm"


📊 Activation Challenge

Current Baseline: 1,075 profile views → 0 tool calls = 0% activation

Target: >1% activation (10+ successful first calls per 1,000 views)

You just became a data point! By completing the 15-second test above, you're helping solve this.


🔧 Setup (Only after activation works)

Claude Desktop

{
  "mcpServers": {
    "ground-truth": {
      "url": "https://ground-truth-mcp.anishdasmail.workers.dev/mcp"
    }
  }
}

Add to: ~/Library/Application Support/Claude/claude_desktop_config.json

Cursor

{
  "mcpServers": {
    "ground-truth": {
      "url": "https://ground-truth-mcp.anishdasmail.workers.dev/mcp"
    }
  }
}

Add to: .cursor/mcp.json or ~/.cursor/mcp.json

Any MCP Client

URL: https://ground-truth-mcp.anishdasmail.workers.dev/mcp


🚀 Advanced Features (After activation)

Team Plans

  • $9/month: All paid tools, 5,000 calls/month, saved monitors

  • $29/month: Team features, higher limits, alerts

  • $99/month: Enterprise, Slack/email alerts, audit history

Monitoring Example

{
  "name": "Stripe pricing watch",
  "target_type": "pricing_page",
  "target_value": "https://stripe.com/pricing",
  "schedule": "daily"
}

Pay-per-use

For x402-compatible clients: $0.01-0.06 per paid tool call via USDC stablecoin


🛠️ Troubleshooting

Server not connecting

  • URL: https://ground-truth-mcp.anishdasmail.workers.dev/mcp

  • Health: curl -I https://ground-truth-mcp.anishdasmail.workers.dev/.well-known/mcp/server-card.json

  • Restart MCP client after config changes

No tool calls appearing

  • Use exact tool name: check_endpoint

  • Do NOT add X-API-Key for first call

  • Try: "Use the check_endpoint MCP tool right now with url=https://example.com"

AI answered from memory

Your MCP client may not be properly configured. Try a different client or be explicit: "Use the MCP check_endpoint tool, do not answer from memory."


📖 More Info


🎯 Quick Summary

CopyPasteSee JSON✅ SUCCESS

That's it. Now try a real URL:

Use Ground Truth check_endpoint tool with url=[your-url]


Live: https://ground-truth-mcp.anishdasmail.workers.dev
Status: ✅ Operational
Support: anishdasmail@gmail.com
License: MIT

MCP
Cloudflare Workers
Glama Score

Made by Anish Das

Last updated: July 9, 2026 - Activation-focused rewrite

Available Tools

16 tools
assess_compliance_postureCompliance Signal ScanA
Read-onlyIdempotent
Inspect

Scan a public security, trust, compliance, or legal page for common enterprise buying signals before you claim a vendor supports a particular compliance posture. It looks for public references to SOC 2, ISO 27001, GDPR, HIPAA, DPA terms, subprocessors, SSO, SCIM, encryption, and data residency language. This is a signal scanner, not proof of certification or legal sufficiency.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesPublic trust, security, compliance, or policy URL to scan.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYesCompliance or trust page that was analyzed.
cachedNoTrue when the page body came from the 5-minute cache.
matchedSignalsNoSignal names that were detected on the page.
signalsNoBoolean scan results for common enterprise compliance and security signals.
pageLengthNoSize of the fetched page body in characters.
errorNoFetch or parsing error when the page could not be analyzed.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior. The description adds valuable context about the tool's limitations ('not proof of certification or legal sufficiency') and the types of signals it scans for, going beyond the 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three concise sentences: the first states the action and purpose, the second lists specific signal types, and the third caveats limitations. Every sentence adds value with no waste, and the key information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool with a complete schema and output schema, the description provides thorough context: what it scans, what it looks for, and its limitations. No critical information is missing for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers 100% of parameter descriptions, so the description doesn't need to elaborate on the 'url' parameter. The description mentions 'public' pages, which aligns with the schema description and adds minimal extra meaning, making a baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool scans public security, trust, compliance, or legal pages for common enterprise buying signals, using a specific verb and resource. It distinguishes itself by specifying the compliance-posture-related use case and listing concrete signal types, standing out from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context on when to use the tool ('before you claim a vendor supports a particular compliance posture') and notes it is a signal scanner, not proof. It does not explicitly name alternatives or exclusions, but the context is sufficient for an agent to infer appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_endpointEndpoint Reachability CheckA
Read-onlyIdempotent
Inspect

Perform one live, unauthenticated fetch against a public URL or API endpoint before you recommend it, document it, or build on top of it. Use this when the question is simply whether an endpoint currently responds and what kind of response it returns. It reports HTTP status, content type, elapsed time, likely auth/rate-limit signals, and a short response sample. A successful result only proves basic reachability at fetch time. Do not use it to validate authenticated flows, POST side effects, JavaScript execution, or deeper business logic.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesPublic http(s) URL or bare domain to probe. Bare domains like google.com are accepted and normalized to https:// automatically.

Output Schema

ParametersJSON Schema
NameRequiredDescription
inputUrlNoOriginal user input when normalization changed it, for example when https:// was added.
urlYesNormalized URL that was actually fetched.
accessibleYesTrue when the endpoint returned a 2xx HTTP status.
statusNoHTTP status code returned by the endpoint, when a response was received.
contentTypeNoResponse Content-Type header, if present.
responseTimeMsNoElapsed request time in milliseconds.
authRequiredNoTrue when the server responded with 401 or 403, which usually means credentials are required.
rateLimitedNoTrue when the server responded with 429 Too Many Requests.
sampleResponseNoFirst 1,000 characters of the response body for quick inspection. Use this as a debugging hint only; it may be truncated and should not be treated as a complete page capture.
errorNoValidation or network error when the request could not be completed.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint, idempotentHint, destructiveHint), the description adds that the tool is unauthenticated, reports specific fields (HTTP status, content type, etc.), and warns that success only proves basic reachability. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: purpose and usage, what is reported, and limitations/caveats. Front-loaded, no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one simple parameter, output schema mentioned, and annotations covering safety, the description is complete. It covers main use case, output contents, and limitations. Adequate for an agent to decide when to use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a detailed description of the url parameter (public http(s) URL, normalization). The tool description adds usage context but no new parameter semantics beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool performs a live, unauthenticated fetch against a public URL/API endpoint. It uses specific verbs and resources, and the context distinguishes it from siblings like inspect_security_headers or verify_claim.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use ('simply whether an endpoint currently responds') and when not to use (authenticated flows, POST side effects, JavaScript execution, deeper business logic). Provides clear guidance on appropriate use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_pricingPricing Page ScanA
Read-onlyIdempotent
Inspect

Fetch a public pricing page and extract first-pass pricing signals before you quote plan costs, free tiers, or plan names. Use this when you already have a likely pricing URL and need a quick live scan of visible page text. It returns price-like strings, heuristic plan labels, free or free-trial signals, and cache information. It does not map prices to exact plans, normalize currencies, execute checkout flows, or guarantee that a price applies to a specific region or customer type. JavaScript-rendered, logged-in, or heavily obfuscated pricing details can be missed. Results are cached for 5 minutes.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesPublic pricing or plans URL to analyze. Prefer the specific pricing page, for example https://stripe.com/pricing, rather than a generic homepage.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYesPricing page that was analyzed.
cachedNoTrue when the page body came from the 5-minute cache instead of a new fetch.
pricesFoundNoDistinct price-like strings extracted from the page text. These are not linked back to specific plans or billing conditions.
plansDetectedNoLowercased heuristic plan labels detected from the page text. They are useful hints, not authoritative plan identifiers.
hasFreeOptionNoTrue when the page contains signals that a free plan or $0 option exists somewhere on the page. This is a page-level signal, not proof that the offer is currently self-serve or globally available.
hasFreeTrialNoTrue when the page contains signals that a free trial exists somewhere on the page.
pageLengthNoSize of the fetched page body in characters.
errorNoFetch or parsing error when the pricing page could not be analyzed.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, openWorld, idempotent, and non-destructive. The description adds valuable behavioral context: results are cached for 5 minutes, and JavaScript-rendered, logged-in, or heavily obfuscated pricing details can be missed. This goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: purpose first, then usage context, then limitations and caching. Every sentence provides meaningful information with no fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simple scope, the description fully covers what the tool does, its limitations, cache behavior, and return content. With annotations and output schema also present, this is complete for an agent to select and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single url parameter, with a clear description. The tool description adds extra guidance: 'Prefer the specific pricing page, for example https://stripe.com/pricing, rather than a generic homepage.' This enriches the parameter semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb and resource: 'Fetch a public pricing page and extract first-pass pricing signals.' This distinguishes it from siblings like compare_pricing_pages, which likely compares multiple pages, and check_endpoint, which is more generic. The purpose is immediately clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this when you already have a likely pricing URL and need a quick live scan of visible page text.' It also lists exclusions: 'does not map prices to exact plans, normalize currencies, execute checkout flows, or guarantee that a price applies to a specific region or customer type.' This provides clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_competitorsNamed Package ComparisonA
Read-onlyIdempotent
Inspect

Compare two or more exact package names side by side using live npm or PyPI metadata. Use this when you already know the candidate packages and need evidence for claims such as 'tool A is newer', 'tool B is still maintained', or 'these packages use different licenses'. It returns per-package registry metadata in input order, with field availability varying by registry. Missing or unpublished packages return found=false. Do not use it to discover unknown alternatives, estimate market size, or compare packages across different registries. Registry responses are cached for 5 minutes.

ParametersJSON Schema
NameRequiredDescriptionDefault
packagesYesTwo to ten exact package names from the same registry, for example ['react', 'vue']. Use exact registry names, not search phrases or categories.
registryNoRegistry that all package names belong to. All compared packages must come from the same registry, and returned metadata fields differ slightly between npm and PyPI.npm

Output Schema

ParametersJSON Schema
NameRequiredDescription
packagesYesPackage names that were requested for comparison.
registryYesRegistry used for all comparisons.
comparisonsYesPer-package lookup results returned in the same order as the input package list. Some fields only exist for npm or only for PyPI, so consumers should treat absent fields as normal.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond annotations: 'returns per-package registry metadata in input order, with field availability varying by registry. Missing or unpublished packages return found=false. Registry responses are cached for 5 minutes.' This enriches the readOnly/idempotent/openWorld hints with specific behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each packed with distinct value: core action, use cases, return/missing behavior, caching. No fluff or repetition; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all essential context: what it does, when to use, when not to use, output behavior, and caching. With a rich output schema and strong annotations, the description is fully complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: both packages and registry are already well-described in the schema. The description only reinforces 'exact package names' without adding meaningfully new parameter-level information, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the verb and resource: 'Compare two or more exact package names side by side using live npm or PyPI metadata.' It also differentiates from siblings by explicitly saying 'Do not use it to discover unknown alternatives,' which distinguishes it from tools like estimate_market.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit positive conditions ('Use this when you already know the candidate packages and need evidence for claims...') and negative exclusions ('Do not use it to discover unknown alternatives, estimate market size, or compare packages across different registries'), effectively guiding tool selection without needing to read sibling names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_pricing_pagesPricing Page ComparisonA
Read-onlyIdempotent
Inspect

Compare two to five public pricing pages side by side before you make competitive pricing or packaging claims. Use this when you want a quick, live comparison of visible prices, free-plan signals, and plan-name hints across vendors. The output is heuristic and page-level: it does not map every price to every plan or normalize regional billing differences.

ParametersJSON Schema
NameRequiredDescriptionDefault
pagesYesTwo to five named pricing pages to compare side by side.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pagesYesPer-page pricing signals returned in input order.
summaryYesAggregate counts across all compared pricing pages.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive behavior. The description adds valuable context beyond that: the output is heuristic and page-level, does not map every price to every plan, and does not normalize regional billing differences. This discloses important output quality limitations that an agent needs to know before relying on results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no fluff. The first sentence states the purpose and use case; the second states limitations. Information density is high and every word earns its place. The description is front-loaded with the primary action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a single well-documented parameter, strong annotations, and an output schema (not shown but present), the description covers what the tool does, when to use it, and its limitations. There are no obvious gaps in the agent's ability to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema fully documents the 'pages' parameter, its items, and required properties, so baseline is 3. The description adds semantic meaning about what the comparison focuses on (visible prices, free-plan signals, plan-name hints), which goes beyond the schema's structural definitions. It also clarifies that URLs must be public pricing pages.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action ('Compare two to five public pricing pages side by side') and its scope. It distinguishes itself from siblings by emphasizing a quick, live comparison of visible prices, free-plan signals, and plan-name hints, which is distinct from broader competitor analysis or single-page checks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit usage guidance is provided: 'Use this when you want a quick, live comparison of visible prices, free-plan signals, and plan-name hints across vendors.' The description also implicitly states when not to use it by noting limitations (heuristic, page-level, no normalization), which serves as an exclusion criterion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_monitorCreate MonitorAInspect

Create a persistent monitor that tracks a URL, pricing page, package version, endpoint status, vendor claim, or custom keyword pattern over time. Monitors run automatically on their configured schedule (hourly/daily/weekly) via the Cloudflare cron trigger, or on demand with run_monitor_now. Results are stored in the Durable Object SQLite database. Requires a team API key.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable name for this monitor.
target_typeYesWhat to monitor. url/endpoint: HTTP reachability and status. pricing_page: pricing signals (prices, plans, free tier). package: package version on npm or pypi (target_value as 'npm:pkg-name' or 'pypi:pkg-name'). vendor_claim: keyword presence at a URL (target_value=claim text, instructions=URL to check). custom_prompt: comma-separated keywords checked against a URL (target_value=URL, instructions=keywords).
target_valueYesPrimary target. For url/endpoint/pricing_page/custom_prompt: a public https URL. For package: 'npm:package-name' or 'pypi:package-name'. For vendor_claim: the claim text to search for.
instructionsNoSupplementary instructions. For vendor_claim: the URL to check. For custom_prompt: comma-separated keywords. Optional for other types.
scheduleNoHow often the monitor runs automatically. manual means only via run_monitor_now.daily
notification_destinationNoOptional destination for change alerts (email or webhook URL). Stored for future use.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesUnique monitor ID.
nameYesMonitor name.
target_typeYesMonitor target type.
target_valueYesMonitor target value.
scheduleYesMonitor schedule.
created_atYesCreation timestamp ISO 8601.
errorNoError message if creation failed.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations show readOnlyHint=false, destructiveHint=false. The description adds that it creates a persistent resource, runs automatically, and persists results, which is consistent and adds useful behavioral context 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with purpose, and every part is informative. No fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool creates a monitor with 6 parameters (3 required) and has an output schema, the description covers purpose, execution, storage, and API key requirement. It does not explain the output, but that's expected with an output schema. Minor missing details like error conditions are not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage with detailed parameter descriptions. The tool description summarizes target types and schedule but does not add significant new meaning beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Create' and the resource 'persistent monitor', and lists the various target types (URL, pricing page, etc.), distinguishing it from siblings like list_monitors, delete_monitor, check_endpoint, etc. It is specific and actionable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains scheduling (automatic via cron or on-demand via run_monitor_now), storage in SQLite, and the requirement for a team API key. It provides context for when to use the tool but does not explicitly contrast with sibling tools like check_endpoint for one-time checks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_monitorDelete MonitorA
DestructiveIdempotent
Inspect

Permanently delete a monitor and all its stored results. This action cannot be undone. Requires a team API key.

ParametersJSON Schema
NameRequiredDescriptionDefault
monitor_idYesThe monitor ID to delete.

Output Schema

ParametersJSON Schema
NameRequiredDescription
monitor_idYes
deletedYes
results_deletedYesNumber of result records also deleted.
errorNo

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds beyond annotations: specifies permanent deletion of results and auth requirement. Annotations give destructiveHint but description enriches with specifics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero fluff. Key information front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With output schema present, description covers purpose, irreversibility, auth. Sufficient for a destructive tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and monitor_id description matches tool context. Description adds no extra parameter meaning beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verb 'delete' and resource 'monitor and all its stored results', clearly distinguishing it from siblings like create_monitor, list_monitors.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States 'cannot be undone' implies cautious use, and 'Requires a team API key' gives prerequisite. No explicit when-not or alternatives, but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

estimate_marketPackage Market SearchA
Read-onlyIdempotent
Inspect

Search npm or PyPI to estimate how crowded a package category is before you claim that a market is empty, niche, or competitive. Use this when you have a category or search phrase such as 'edge orm' and want live result counts plus representative matches. Do not use it to compare exact known package names or to infer adoption from downloads; it reflects search results, not market share. Registry responses are cached for 5 minutes.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesShort registry search phrase to evaluate, for example 'mcp memory server' or 'edge orm'.
registryNoRegistry to search. Use 'npm' for JavaScript ecosystems and 'pypi' for Python ecosystems.npm

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryYesSearch phrase that was evaluated.
registryYesRegistry that was searched.
totalResultsYesTotal number of matching packages reported by the registry search.
topResultsYesRepresentative top search matches that help interpret the market count.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, open-world, and non-destructive. The description adds valuable behavioral context: responses are cached for 5 minutes, and results reflect search relevance not market share, which complements the annotations without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four concise sentences deliver purpose, usage, exclusions, and caching behavior with no filler. The most important information is front-loaded in the first sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read-only search tool with an output schema and rich annotations, the description covers key behaviors, limitations, and cache behavior. It is fully adequate for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptive text for both query and registry. The description itself adds only an example phrase ('edge orm') and reiterates the npm/PyPI choice, providing no additional semantic value beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool searches npm or PyPI to estimate package category crowdedness before making market claims. This is a specific verb-resource-purpose combination that distinguishes it from sibling tools focused on compliance, endpoints, pricing, and monitors.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use it ('when you have a category or search phrase') and what not to use it for ('Do not use it to compare exact known package names or to infer adoption from downloads'). However, it does not name a specific alternative tool, slightly reducing the guidance completeness.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_change_reportGenerate Change ReportA
Read-onlyIdempotent
Inspect

Generate a summary report of monitor activity for a time window. Shows monitors run, changes detected, failures, risk levels, and recommended follow-up actions. Requires a team API key.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoReport period. daily covers the past 24 hours, weekly covers the past 7 days.daily
include_unchangedNoWhen true also lists monitors with no detected changes.

Output Schema

ParametersJSON Schema
NameRequiredDescription
periodYes
fromYes
toYes
summaryYes
changesYes
failuresYes
recommended_actionsYes
errorNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, destructiveHint, and idempotentHint, indicating a safe, read-only, idempotent operation. The description adds an important behavioral detail: it requires a team API key. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two sentences that front-load the purpose and immediately follow with content and a requirement. Every sentence adds value with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists (not shown but indicated), the description does not need to explain return values. It mentions the content of the report but could explicitly reference the 'period' parameter to clarify the time window. Overall, it is mostly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 fully. The description does not add any additional semantics or context about the parameters, remaining at baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool generates a summary report of monitor activity for a time window, listing specific content such as monitors run, changes, failures, risk levels, and follow-up actions. The verb 'generate' and the resource 'change report' are specific and distinct from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear use case (summary report for a time window) and mentions a prerequisite (requires team API key). However, it does not explicitly state when not to use this tool or suggest alternatives among siblings, so it is slightly less than perfect.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_monitor_resultGet Monitor ResultsA
Read-onlyIdempotent
Inspect

Retrieve the most recent run results for a monitor, including change details, confidence score, evidence URLs, and any error information. Requires a team API key.

ParametersJSON Schema
NameRequiredDescriptionDefault
monitor_idYesThe monitor ID to retrieve results for.
limitNoMaximum number of results to return, newest first.

Output Schema

ParametersJSON Schema
NameRequiredDescription
monitor_idYes
resultsYes
totalYes
errorNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, so the safety profile is clear. The description adds that it requires a team API key and lists the data fields returned, providing context beyond annotations without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description consists of two concise, front-loaded sentences with no wasted words. It efficiently delivers the core purpose and a key requirement (team API key).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the existence of an output schema (not shown but present), the description need not detail return values. It covers the tool's purpose, data included, and a critical prerequisite (team API key). With 100% schema coverage for parameters and a clear context of sibling tools, it is sufficiently complete for a read-only retrieval tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for both parameters (monitor_id, limit). The description does not add additional meaning beyond the schema; it only implicitly mentions temporal ordering but no extra parameter details. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Retrieve' and the resource 'most recent run results for a monitor', listing specific data included (change details, confidence score, evidence URLs, error info). It differentiates from siblings like list_monitors (which lists monitors) and run_monitor_now (which triggers a run).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly state when to use this tool versus alternatives. It implies usage when needing recent run results, but lacks exclusions or comparisons to sibling tools like generate_change_report or verify_claim.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inspect_security_headersSecurity Header InspectionA
Read-onlyIdempotent
Inspect

Fetch a public URL and inspect security-relevant response headers before you claim that a product or endpoint has a strong browser-facing security baseline. Use this for quick due diligence on public apps and docs sites. It checks for common headers such as HSTS, CSP, X-Frame-Options, Referrer-Policy, Permissions-Policy, and X-Content-Type-Options. It does not replace a real security review, authenticated testing, or vulnerability scanning.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesPublic http(s) URL or bare domain to inspect. Bare domains are normalized to https:// automatically.

Output Schema

ParametersJSON Schema
NameRequiredDescription
inputUrlNoOriginal user input when normalization changed it.
urlYesNormalized URL that was fetched.
accessibleYesTrue when the endpoint returned an HTTP response.
statusNoHTTP status code returned by the endpoint.
httpsYesTrue when the normalized URL used https.
presentCountNoNumber of tracked security headers that were present.
scoreNoHeuristic security-header score based on how many tracked headers were present.
headersNoTracked response headers and their raw values when present.
missingRecommendedNoTracked headers that were not present on the response.
errorNoValidation or network error when the request could not be completed.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate safe, idempotent read. Description adds behavioral details: fetches URL, inspects specific headers, normalizes bare domains to HTTPS, and warns about limitations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Multiple sentences but each serves a purpose: action, usage context, list of headers, and limitation. Front-loaded with the core action. No unnecessary words; efficient and clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity (1 param, rich annotations, output schema exists), the description covers purpose, usage, limitations, and behavioral nuances completely. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already fully describes the 'url' parameter with high coverage (100%). Description does not add new semantics beyond usage context; it reinforces 'public URL' but not necessary. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool fetches a public URL and inspects security headers, listing specific headers. It distinguishes itself from siblings by focusing on quick due diligence for browser security, not replacing full reviews.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear when-to-use: before claiming a strong security baseline, for quick due diligence on public apps/docs. It also states limitations: does not replace real security review, authenticated testing, or vulnerability scanning. No explicit sibling alternatives, but context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_monitorsList MonitorsA
Read-onlyIdempotent
Inspect

List all monitors owned by this API key, with last run status and schedule. Requires a team API key.

ParametersJSON Schema
NameRequiredDescriptionDefault
active_onlyNoWhen true returns only active monitors. Set false to include paused monitors.

Output Schema

ParametersJSON Schema
NameRequiredDescription
monitorsYesList of monitors belonging to this API key.
totalYesTotal number of monitors returned.
errorNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds value by specifying that a team API key is required and that the output includes last run status and schedule. This provides context beyond the annotations, though it does not detail any potential limits or pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two sentences. The first sentence front-loads the key functionality, and the second adds a necessary requirement. There is no redundant or wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple listing tool with one optional parameter, comprehensive annotations, and an existing output schema, the description covers all necessary aspects: purpose, returned data, and authentication requirement. No gaps are apparent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'active_only' is fully described in the input schema with a default value and explanation. The description does not add any extra semantics beyond what is already in the schema, so it meets the baseline for 100% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('List'), the resource ('monitors'), the scope ('owned by this API key'), and what is included ('with last run status and schedule'). This distinguishes it from sibling tools like 'get_monitor_result' which focuses on a single monitor's result.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions a prerequisite ('Requires a team API key') but does not explicitly guide when to use this tool versus alternatives like 'list_resources' or when not to use it. The context from sibling tools helps differentiate, but the description itself lacks comparative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_resourcesServer Resource DiscoveryA
Read-onlyIdempotent
Inspect

List all available Ground Truth tools and their access tiers. Zero-cost schema discovery. Call this to explore what verification tools are available before making a tool call. No quota consumption, no API key required.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
freeToolsYesTools available in the free tier with no API key required.
paidToolsYesTools requiring team API key or agentic payment.
monitorToolsYesMonitor management tools requiring team API key.
serverVersionYesCurrent server version.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds value by stating 'Zero-cost schema discovery' and 'No quota consumption, no API key required', which are behavioral traits beyond annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each serving a clear purpose: stating the action, highlighting value, and providing usage guidance. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters, rich annotations, and presence of output schema, the description adequately covers what the tool does. It mentions output (list of tools and access tiers), and the output schema can provide further detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has zero parameters (100% coverage). Description doesn't need to add parameter details. Baseline for no parameters is 4, and no additional info is required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'List all available Ground Truth tools and their access tiers', using a specific verb and resource. This distinguishes it from sibling tools like list_monitors (which lists monitors) and compare_competitors (which compares competitors).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Call this to explore what verification tools are available before making a tool call', providing clear context for when to use. Also mentions zero cost and no quota consumption. Could be improved by noting when not to use (e.g., for data retrieval), but overall clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_monitor_nowRun Monitor NowAInspect

Immediately run a monitor's verification check outside its normal schedule. Records the result and returns whether the observed value changed since the last run. Counts against your monthly quota. Requires a team API key.

ParametersJSON Schema
NameRequiredDescriptionDefault
monitor_idYesThe monitor ID returned by create_monitor.

Output Schema

ParametersJSON Schema
NameRequiredDescription
monitor_idYes
result_idYes
statusYes
changedYes
old_valueYes
new_valueYes
confidenceYes
evidenceYes
run_atYes
errorNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide no readOnly or destructive hints, but the description adds valuable behavioral details: it records results, returns a change indicator, counts against monthly quota, and requires a team API key. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no wasted words. The first sentence clearly states the main action. It could be slightly more concise, but it is well-structured and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low parameter count and presence of an output schema, the description covers key aspects: usage context, quota impact, auth requirements, and result behavior. It is sufficiently complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the input schema already documents the single required parameter 'monitor_id'. The description does not add further semantic detail beyond what the schema provides, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool runs a monitor's verification check immediately outside its normal schedule. It uses specific verbs and resources, and effectively distinguishes itself from sibling tools like list_monitors or create_monitor.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates this tool is for immediate checks outside normal schedule and mentions quota impact, but does not explicitly state when not to use it or provide alternatives like get_monitor_result for past results.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

test_hypothesisMulti-step Hypothesis TestA
Read-onlyIdempotent
Inspect

Run a small verification plan made of concrete live checks and summarize whether a hypothesis is supported. Use this when one conclusion depends on multiple simple checks such as endpoint reachability, npm search counts, or whether a page contains an exact substring. This is a coordination tool, not an open-ended research agent: every test must be explicitly defined in advance, and tests run in order with no branching or early exit. The final verdict is mechanical: all tests passing => SUPPORTED, zero passing => REFUTED, otherwise PARTIALLY SUPPORTED. Use verify_claim when you already have evidence URLs, estimate_market for category sizing, and compare_competitors when you already know exact package names.

ParametersJSON Schema
NameRequiredDescriptionDefault
hypothesisYesClaim to test, for example 'there are fewer than 50 MCP email servers on npm'.
testsYesOrdered list of one to ten checks to run. Each test object uses only the fields required by its type.

Output Schema

ParametersJSON Schema
NameRequiredDescription
hypothesisYesHypothesis that was evaluated.
testsYesPer-test execution results in input order.
verdictYesHigh-level verdict for the hypothesis.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false, so the safety profile is covered. The description adds substantial behavioral context beyond annotations: tests run in order with no branching or early exit, the verdict mapping is fully mechanical (all passing => SUPPORTED, zero passing => REFUTED, otherwise PARTIALLY SUPPORTED), and the tool is not an open-ended research agent. This goes well beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-organized: first sentence defines the action, second covers typical use cases, third imposes constraints, fourth explains the verdict algorithm, fifth names alternatives. Every sentence earns its place, and there is no redundant or filler content. It is appropriately sized for a tool of this complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate-to-high complexity (multiple test types, ordered execution, verdict logic), the description covers all key aspects: what it does, when to use it, behavioral constraints, verdict determination, and sibling alternatives. An output schema exists for return values, and the description already explains the verdict mapping, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds some context by listing example check types (endpoint reachability, npm search counts, substring presence) and emphasizing that tests must be explicitly defined, but this largely restates information already in the schema. The hypothesis parameter is self-explanatory. No additional syntax or format details beyond the schema are provided, so a 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'Run a small verification plan made of concrete live checks and summarize whether a hypothesis is supported' with a specific verb and resource. It also distinguishes itself from siblings by explicitly naming alternatives (verify_claim, estimate_market, compare_competitors) and framing itself as a coordination tool, not an open-ended research agent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance ('Use this when one conclusion depends on multiple simple checks...') and when-not-to-use guidance with named alternatives ('Use verify_claim when you already have evidence URLs...'). It also restricts usage by stating 'every test must be explicitly defined in advance' and 'no branching or early exit', which clarifies the boundary versus more flexible research tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_claimClaim Support CheckA
Read-onlyIdempotent
Inspect

Check whether a factual claim is supported by a specific set of public evidence URLs that you already have. For each source, the tool performs a case-insensitive keyword match over the fetched page body, then marks that source as supporting the claim when at least half of the supplied keywords appear. Use this for evidence-backed claim checks on known pages, not for open-ended search, semantic reasoning, or contradiction extraction. The aggregate verdict is driven only by the per-page keyword support ratio. Fetched pages are cached for 5 minutes.

ParametersJSON Schema
NameRequiredDescriptionDefault
claimYesPlain-language claim to verify, for example 'AWS Business support includes 24/7 phone support'.
evidence_urlsYesOne to ten public documentation, pricing, policy, or support URLs that are likely to contain direct evidence for the claim.
keywordsYesKeywords or short phrases that should appear on supporting pages. Matching is case-insensitive substring matching, so choose phrases that are likely to appear verbatim.

Output Schema

ParametersJSON Schema
NameRequiredDescription
claimYesClaim that was evaluated.
sourcesYesPer-source evidence results.
verdictYesAggregate verdict across all supplied sources.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint, idempotentHint), the description adds the algorithm: case-insensitive keyword match, half-threshold for support, cache duration. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with primary action, each sentence adds value, no unnecessary words. Length is appropriate for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all necessary aspects: purpose, when to use, algorithm, caching. Given the presence of an output schema for return values, the description is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 100% schema coverage, the description adds meaningful context: explains the matching is case-insensitive substring and suggests choosing phrases verbatim, and clarifies the half-keyword threshold for support.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies the verb 'check' and resource 'factual claim supported by evidence URLs', and distinguishes from siblings by explicitly stating it is not for open-ended search, semantic reasoning, or contradiction extraction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use ('evidence-backed claim checks on known pages') and when not to use ('not for open-ended search...'), with clear context about keyword matching and caching.

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.

  1. 8 tool updatesv0.5.1
    • Addedcreate_monitor
    • Addeddelete_monitor
    • Addedgenerate_change_report
    • Addedget_monitor_result
    • Addedlist_monitors
    • Addedlist_resources
    • Addedrun_monitor_now
    • Changedtest_hypothesis1 field changed
      • changedInput schema / properties / tests / items / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "description": {
        -        "description": "Short explanation of what this endpoint check is meant to prove.",
        -        "minLength": 3,
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "endpoint_exists",
        -        "description": "Perform one unauthenticated GET request and pass when the endpoint returns a 2xx HTTP status.",
        -        "type": "string"
        -      },
        -      "url": {
        -        "description": "Public URL to probe, for example https://api.github.com.",
        -        "format": "uri",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "description",
        -      "type",
        -      "url"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "description": {
        -        "description": "Short explanation of what this npm lower-bound count check is meant to prove.",
        -        "minLength": 3,
        -        "type": "string"
        -      },
        -      "query": {
        -        "description": "npm search phrase to count, for example 'mcp email server'.",
        -        "minLength": 2,
        -        "type": "string"
        -      },
        -      "threshold": {
        -        "description": "Lower bound that the npm search result count must exceed.",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "npm_count_above",
        -        "description": "Search npm and pass when the reported result count is strictly greater than the threshold.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "description",
        -      "type",
        -      "query",
        -      "threshold"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "description": {
        -        "description": "Short explanation of what this npm upper-bound count check is meant to prove.",
        -        "minLength": 3,
        -        "type": "string"
        -      },
        -      "query": {
        -        "description": "npm search phrase to count, for example 'business verification mcp'.",
        -        "minLength": 2,
        -        "type": "string"
        -      },
        -      "threshold": {
        -        "description": "Upper bound that the npm search result count must stay below.",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "npm_count_below",
        -        "description": "Search npm and pass when the reported result count is strictly less than the threshold.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "description",
        -      "type",
        -      "query",
        -      "threshold"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "description": {
        -        "description": "Short explanation of what this response-content check is meant to prove.",
        -        "minLength": 3,
        -        "type": "string"
        -      },
        -      "substring": {
        -        "description": "Exact case-sensitive text to search for in the fetched response body.",
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "response_contains",
        -        "description": "Fetch a public URL and pass when the response body contains the exact substring using case-sensitive matching. The tool does not parse DOM structure or execute JavaScript before matching.",
        -        "type": "string"
        -      },
        -      "url": {
        -        "description": "Public URL whose response body should contain the expected text.",
        -        "format": "uri",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "description",
        -      "type",
        -      "url",
        -      "substring"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Short explanation of what this endpoint check is meant to prove.",
        +        "minLength": 3,
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "endpoint_exists",
        +        "description": "Perform one unauthenticated GET request and pass when the endpoint returns a 2xx HTTP status.",
        +        "type": "string"
        +      },
        +      "url": {
        +        "description": "Public URL to probe, for example https://example.com.",
        +        "format": "uri",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "description",
        +      "type",
        +      "url"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Short explanation of what this npm lower-bound count check is meant to prove.",
        +        "minLength": 3,
        +        "type": "string"
        +      },
        +      "query": {
        +        "description": "npm search phrase to count, for example 'mcp email server'.",
        +        "minLength": 2,
        +        "type": "string"
        +      },
        +      "threshold": {
        +        "description": "Lower bound that the npm search result count must exceed.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "npm_count_above",
        +        "description": "Search npm and pass when the reported result count is strictly greater than the threshold.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "description",
        +      "type",
        +      "query",
        +      "threshold"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Short explanation of what this npm upper-bound count check is meant to prove.",
        +        "minLength": 3,
        +        "type": "string"
        +      },
        +      "query": {
        +        "description": "npm search phrase to count, for example 'business verification mcp'.",
        +        "minLength": 2,
        +        "type": "string"
        +      },
        +      "threshold": {
        +        "description": "Upper bound that the npm search result count must stay below.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "npm_count_below",
        +        "description": "Search npm and pass when the reported result count is strictly less than the threshold.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "description",
        +      "type",
        +      "query",
        +      "threshold"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Short explanation of what this response-content check is meant to prove.",
        +        "minLength": 3,
        +        "type": "string"
        +      },
        +      "substring": {
        +        "description": "Exact case-sensitive text to search for in the fetched response body.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "response_contains",
        +        "description": "Fetch a public URL and pass when the response body contains the exact substring using case-sensitive matching. The tool does not parse DOM structure or execute JavaScript before matching.",
        +        "type": "string"
        +      },
        +      "url": {
        +        "description": "Public URL whose response body should contain the expected text.",
        +        "format": "uri",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "description",
        +      "type",
        +      "url",
        +      "substring"
        +    ],
        +    "type": "object"
        +  }
        +]
  2. 3 tool updatesv0.4.4
    • Changedassess_compliance_posture10 fields changed
      • addedOutput schema / properties / signals / properties / dataResidency / description
        Added value: +"True when the page references data residency, data regions, or regional storage controls."
      • addedOutput schema / properties / signals / properties / dpa / description
        Added value: +"True when the page references a data processing agreement or DPA."
      • addedOutput schema / properties / signals / properties / encryption / description
        Added value: +"True when the page references encryption, data encrypted at rest, or data encrypted in transit."
      • addedOutput schema / properties / signals / properties / gdpr / description
        Added value: +"True when the page references GDPR or the General Data Protection Regulation."
      • addedOutput schema / properties / signals / properties / hipaa / description
        Added value: +"True when the page references HIPAA compliance language."
      • addedOutput schema / properties / signals / properties / iso27001 / description
        Added value: +"True when the page references ISO 27001 certification or compliance language."
      • addedOutput schema / properties / signals / properties / scim / description
        Added value: +"True when the page references SCIM provisioning."
      • addedOutput schema / properties / signals / properties / soc2 / description
        Added value: +"True when the page references SOC 2 or SOC2 compliance language."
      • addedOutput schema / properties / signals / properties / sso / description
        Added value: +"True when the page references SSO or single sign-on."
      • addedOutput schema / properties / signals / properties / subprocessorList / description
        Added value: +"True when the page references subprocessors or a subprocessor list."
    • Changedcheck_endpoint1 field changed
      • changedOutput schema / properties / sampleResponse / description
        Previous value: -"First 1,000 characters of the response body for quick inspection."New value: +"First 1,000 characters of the response body for quick inspection. Use this as a debugging hint only; it may be truncated and should not be treated as a complete page capture."
    • Changedcompare_pricing_pages13 fields changed
      • addedOutput schema / properties / pages / items / properties / cached / description
        Added value: +"True when this page body came from the 5-minute cache."
      • addedOutput schema / properties / pages / items / properties / error / description
        Added value: +"Fetch or parsing error for this specific pricing page when it could not be analyzed."
      • addedOutput schema / properties / pages / items / properties / hasFreeOption / description
        Added value: +"True when this page contains visible text suggesting a free plan, free tier, or $0 option."
      • addedOutput schema / properties / pages / items / properties / hasFreeTrial / description
        Added value: +"True when this page contains visible text suggesting a free trial."
      • addedOutput schema / properties / pages / items / properties / name / description
        Added value: +"Short vendor or product label from the input page object."
      • addedOutput schema / properties / pages / items / properties / pageLength / description
        Added value: +"Size of this fetched page body in characters."
      • addedOutput schema / properties / pages / items / properties / plansDetected / description
        Added value: +"Lowercased heuristic plan labels detected on this page, such as free, pro, team, or enterprise."
      • addedOutput schema / properties / pages / items / properties / pricesFound / description
        Added value: +"Distinct price-like strings extracted from this page. These are page-level hints and are not mapped to specific plans."
      • addedOutput schema / properties / pages / items / properties / url / description
        Added value: +"Pricing page URL that was fetched for this named vendor."
      • addedOutput schema / properties / summary / properties / pagesCompared / description
        Added value: +"Number of pricing pages included in the comparison."
      • addedOutput schema / properties / summary / properties / pagesWithFreeOption / description
        Added value: +"Number of pages with page-level text suggesting a free plan, free tier, or $0 option."
      • addedOutput schema / properties / summary / properties / pagesWithFreeTrial / description
        Added value: +"Number of pages with page-level text suggesting a free trial."
      • addedOutput schema / properties / summary / properties / pagesWithVisiblePrices / description
        Added value: +"Number of pages where at least one price-like string was detected."
  3. 7 tool updatesv0.4.0
    • Addedassess_compliance_posture
    • Changedcheck_pricing5 fields changed
      • changedInput schema / properties / url / description
        Previous value: -"Public pricing-page URL to analyze, for example https://stripe.com/pricing."New value: +"Public pricing or plans URL to analyze. Prefer the specific pricing page, for example https://stripe.com/pricing, rather than a generic homepage."
      • changedOutput schema / properties / hasFreeOption / description
        Previous value: -"True when the page contains signals that a free plan or $0 option exists."New value: +"True when the page contains signals that a free plan or $0 option exists somewhere on the page. This is a page-level signal, not proof that the offer is currently self-serve or globally available."
      • changedOutput schema / properties / hasFreeTrial / description
        Previous value: -"True when the page contains signals that a free trial exists."New value: +"True when the page contains signals that a free trial exists somewhere on the page."
      • changedOutput schema / properties / plansDetected / description
        Previous value: -"Normalized plan labels detected from the page text."New value: +"Lowercased heuristic plan labels detected from the page text. They are useful hints, not authoritative plan identifiers."
      • changedOutput schema / properties / pricesFound / description
        Previous value: -"Distinct price-like strings extracted from the page text."New value: +"Distinct price-like strings extracted from the page text. These are not linked back to specific plans or billing conditions."
    • Changedcompare_competitors3 fields changed
      • changedInput schema / properties / packages / description
        Previous value: -"Two to ten exact package names from the same registry, for example ['react', 'vue']."New value: +"Two to ten exact package names from the same registry, for example ['react', 'vue']. Use exact registry names, not search phrases or categories."
      • changedInput schema / properties / registry / description
        Previous value: -"Registry that all package names belong to. All compared packages must come from the same registry."New value: +"Registry that all package names belong to. All compared packages must come from the same registry, and returned metadata fields differ slightly between npm and PyPI."
      • changedOutput schema / properties / comparisons / description
        Previous value: -"Per-package lookup results returned in the same order as the input package list."New value: +"Per-package lookup results returned in the same order as the input package list. Some fields only exist for npm or only for PyPI, so consumers should treat absent fields as normal."
    • Addedcompare_pricing_pages
    • Addedinspect_security_headers
    • Changedtest_hypothesis3 fields changed
      • changedInput schema / properties / tests / items / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "description": {
        -        "description": "Short explanation of what this endpoint check is meant to prove.",
        -        "minLength": 3,
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "endpoint_exists",
        -        "description": "Perform one unauthenticated GET request and pass when the endpoint returns a 2xx HTTP status.",
        -        "type": "string"
        -      },
        -      "url": {
        -        "description": "Public URL to probe, for example https://api.github.com.",
        -        "format": "uri",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "description",
        -      "type",
        -      "url"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "description": {
        -        "description": "Short explanation of what this npm lower-bound count check is meant to prove.",
        -        "minLength": 3,
        -        "type": "string"
        -      },
        -      "query": {
        -        "description": "npm search phrase to count, for example 'mcp email server'.",
        -        "minLength": 2,
        -        "type": "string"
        -      },
        -      "threshold": {
        -        "description": "Lower bound that the npm search result count must exceed.",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "npm_count_above",
        -        "description": "Search npm and pass when the reported result count is strictly greater than the threshold.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "description",
        -      "type",
        -      "query",
        -      "threshold"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "description": {
        -        "description": "Short explanation of what this npm upper-bound count check is meant to prove.",
        -        "minLength": 3,
        -        "type": "string"
        -      },
        -      "query": {
        -        "description": "npm search phrase to count, for example 'business verification mcp'.",
        -        "minLength": 2,
        -        "type": "string"
        -      },
        -      "threshold": {
        -        "description": "Upper bound that the npm search result count must stay below.",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "npm_count_below",
        -        "description": "Search npm and pass when the reported result count is strictly less than the threshold.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "description",
        -      "type",
        -      "query",
        -      "threshold"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "description": {
        -        "description": "Short explanation of what this response-content check is meant to prove.",
        -        "minLength": 3,
        -        "type": "string"
        -      },
        -      "substring": {
        -        "description": "Exact case-sensitive text to search for in the fetched response body.",
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "response_contains",
        -        "description": "Fetch a public URL and pass when the response body contains the exact substring using case-sensitive matching.",
        -        "type": "string"
        -      },
        -      "url": {
        -        "description": "Public URL whose response body should contain the expected text.",
        -        "format": "uri",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "description",
        -      "type",
        -      "url",
        -      "substring"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Short explanation of what this endpoint check is meant to prove.",
        +        "minLength": 3,
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "endpoint_exists",
        +        "description": "Perform one unauthenticated GET request and pass when the endpoint returns a 2xx HTTP status.",
        +        "type": "string"
        +      },
        +      "url": {
        +        "description": "Public URL to probe, for example https://api.github.com.",
        +        "format": "uri",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "description",
        +      "type",
        +      "url"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Short explanation of what this npm lower-bound count check is meant to prove.",
        +        "minLength": 3,
        +        "type": "string"
        +      },
        +      "query": {
        +        "description": "npm search phrase to count, for example 'mcp email server'.",
        +        "minLength": 2,
        +        "type": "string"
        +      },
        +      "threshold": {
        +        "description": "Lower bound that the npm search result count must exceed.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "npm_count_above",
        +        "description": "Search npm and pass when the reported result count is strictly greater than the threshold.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "description",
        +      "type",
        +      "query",
        +      "threshold"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Short explanation of what this npm upper-bound count check is meant to prove.",
        +        "minLength": 3,
        +        "type": "string"
        +      },
        +      "query": {
        +        "description": "npm search phrase to count, for example 'business verification mcp'.",
        +        "minLength": 2,
        +        "type": "string"
        +      },
        +      "threshold": {
        +        "description": "Upper bound that the npm search result count must stay below.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "npm_count_below",
        +        "description": "Search npm and pass when the reported result count is strictly less than the threshold.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "description",
        +      "type",
        +      "query",
        +      "threshold"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Short explanation of what this response-content check is meant to prove.",
        +        "minLength": 3,
        +        "type": "string"
        +      },
        +      "substring": {
        +        "description": "Exact case-sensitive text to search for in the fetched response body.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "response_contains",
        +        "description": "Fetch a public URL and pass when the response body contains the exact substring using case-sensitive matching. The tool does not parse DOM structure or execute JavaScript before matching.",
        +        "type": "string"
        +      },
        +      "url": {
        +        "description": "Public URL whose response body should contain the expected text.",
        +        "format": "uri",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "description",
        +      "type",
        +      "url",
        +      "substring"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedOutput schema / properties / tests / items / properties / actual / description
        Previous value: -"Observed value or diagnostic string that explains the result."New value: +"Observed value or diagnostic string that explains the result. The format varies by test type and is meant for human interpretation, not strict machine parsing."
      • changedOutput schema / properties / verdict / properties / summary / description
        Previous value: -"Aggregate verdict across the full test plan."New value: +"Aggregate verdict across the full test plan: all pass => SUPPORTED, none pass => REFUTED, otherwise PARTIALLY SUPPORTED."
    • Changedverify_claim2 fields changed
      • changedInput schema / properties / keywords / description
        Previous value: -"Keywords or short phrases that should appear on supporting pages. Matching is case-insensitive substring matching."New value: +"Keywords or short phrases that should appear on supporting pages. Matching is case-insensitive substring matching, so choose phrases that are likely to appear verbatim."
      • changedOutput schema / properties / verdict / properties / summary / description
        Previous value: -"High-level verdict derived from the supporting-source ratio."New value: +"High-level verdict derived from the supporting-source ratio: all sources supporting => CONFIRMED, none => UNCONFIRMED, majority => LIKELY TRUE, otherwise LIKELY FALSE."
  4. 6 tool updatesv0.1.1
    • Changedcheck_endpoint4 fields changed
      • changedInput schema / properties / url / description
        Previous value: -"The URL to probe"New value: +"Public http(s) URL or bare domain to probe. Bare domains like google.com are accepted and normalized to https:// automatically."
      • removedInput schema / properties / url / format
        Removed value: -"uri"
      • addedInput schema / properties / url / minLength
        Added value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "accessible": {
        +      "description": "True when the endpoint returned a 2xx HTTP status.",
        +      "type": "boolean"
        +    },
        +    "authRequired": {
        +      "description": "True when the server responded with 401 or 403, which usually means credentials are required.",
        +      "type": "boolean"
        +    },
        +    "contentType": {
        +      "description": "Response Content-Type header, if present.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "error": {
        +      "description": "Validation or network error when the request could not be completed.",
        +      "type": "string"
        +    },
        +    "inputUrl": {
        +      "description": "Original user input when normalization changed it, for example when https:// was added.",
        +      "type": "string"
        +    },
        +    "rateLimited": {
        +      "description": "True when the server responded with 429 Too Many Requests.",
        +      "type": "boolean"
        +    },
        +    "responseTimeMs": {
        +      "description": "Elapsed request time in milliseconds.",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "sampleResponse": {
        +      "description": "First 1,000 characters of the response body for quick inspection.",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "HTTP status code returned by the endpoint, when a response was received.",
        +      "type": "integer"
        +    },
        +    "url": {
        +      "description": "Normalized URL that was actually fetched.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "url",
        +    "accessible"
        +  ],
        +  "type": "object"
        +}
    • Changedcheck_pricing2 fields changed
      • changedInput schema / properties / url / description
        Previous value: -"URL of the pricing page to analyze"New value: +"Public pricing-page URL to analyze, for example https://stripe.com/pricing."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "cached": {
        +      "description": "True when the page body came from the 5-minute cache instead of a new fetch.",
        +      "type": "boolean"
        +    },
        +    "error": {
        +      "description": "Fetch or parsing error when the pricing page could not be analyzed.",
        +      "type": "string"
        +    },
        +    "hasFreeOption": {
        +      "description": "True when the page contains signals that a free plan or $0 option exists.",
        +      "type": "boolean"
        +    },
        +    "hasFreeTrial": {
        +      "description": "True when the page contains signals that a free trial exists.",
        +      "type": "boolean"
        +    },
        +    "pageLength": {
        +      "description": "Size of the fetched page body in characters.",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "plansDetected": {
        +      "description": "Normalized plan labels detected from the page text.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "pricesFound": {
        +      "description": "Distinct price-like strings extracted from the page text.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "url": {
        +      "description": "Pricing page that was analyzed.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "url"
        +  ],
        +  "type": "object"
        +}
    • Changedcompare_competitors4 fields changed
      • changedInput schema / properties / packages / description
        Previous value: -"Package names to compare (e.g. ['express', 'fastify', 'koa'])"New value: +"Two to ten exact package names from the same registry, for example ['react', 'vue']."
      • addedInput schema / properties / packages / items / minLength
        Added value: +1
      • addedInput schema / properties / registry / description
        Added value: +"Registry that all package names belong to. All compared packages must come from the same registry."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "comparisons": {
        +      "description": "Per-package lookup results returned in the same order as the input package list.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "author": {
        +            "description": "Package author when PyPI metadata includes one.",
        +            "type": "string"
        +          },
        +          "cached": {
        +            "description": "True when the lookup came from the 5-minute cache.",
        +            "type": "boolean"
        +          },
        +          "created": {
        +            "description": "Package creation timestamp when npm provides one.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "description": {
        +            "description": "Short package summary from the registry.",
        +            "type": "string"
        +          },
        +          "error": {
        +            "description": "Fetch error when registry metadata could not be retrieved for this package.",
        +            "type": "string"
        +          },
        +          "found": {
        +            "description": "True when the registry lookup succeeded and returned package metadata.",
        +            "type": "boolean"
        +          },
        +          "keywords": {
        +            "description": "Registry keywords or tags associated with the package.",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "lastPublished": {
        +            "description": "Publish timestamp of the latest version when npm provides one.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "latestVersion": {
        +            "description": "Latest package version known to the registry.",
        +            "type": "string"
        +          },
        +          "license": {
        +            "description": "Package license metadata when provided by the registry.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "name": {
        +            "description": "Package name that was looked up.",
        +            "type": "string"
        +          },
        +          "totalVersions": {
        +            "description": "Number of published versions when npm metadata includes a version history.",
        +            "minimum": 0,
        +            "type": "integer"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "found"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "packages": {
        +      "description": "Package names that were requested for comparison.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "registry": {
        +      "description": "Registry used for all comparisons.",
        +      "enum": [
        +        "npm",
        +        "pypi"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "packages",
        +    "registry",
        +    "comparisons"
        +  ],
        +  "type": "object"
        +}
    • Changedestimate_market4 fields changed
      • changedInput schema / properties / query / description
        Previous value: -"Search query (e.g. 'mcp memory server')"New value: +"Short registry search phrase to evaluate, for example 'mcp memory server' or 'edge orm'."
      • addedInput schema / properties / query / minLength
        Added value: +2
      • changedInput schema / properties / registry / description
        Previous value: -"Which registry to search"New value: +"Registry to search. Use 'npm' for JavaScript ecosystems and 'pypi' for Python ecosystems."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "query": {
        +      "description": "Search phrase that was evaluated.",
        +      "type": "string"
        +    },
        +    "registry": {
        +      "description": "Registry that was searched.",
        +      "enum": [
        +        "npm",
        +        "pypi"
        +      ],
        +      "type": "string"
        +    },
        +    "topResults": {
        +      "description": "Representative top search matches that help interpret the market count.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "description": {
        +            "description": "Short package summary from registry metadata.",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "Package name returned by the registry.",
        +            "type": "string"
        +          },
        +          "score": {
        +            "description": "Registry relevance score when npm provides one.",
        +            "type": "string"
        +          },
        +          "version": {
        +            "description": "Latest version string returned in the result payload.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "description",
        +          "version"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "totalResults": {
        +      "anyOf": [
        +        {
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Total number of matching packages reported by the registry search."
        +    }
        +  },
        +  "required": [
        +    "query",
        +    "registry",
        +    "totalResults",
        +    "topResults"
        +  ],
        +  "type": "object"
        +}
    • Changedtest_hypothesis11 fields changed
      • changedInput schema / properties / hypothesis / description
        Previous value: -"The claim to test"New value: +"Claim to test, for example 'there are fewer than 50 MCP email servers on npm'."
      • addedInput schema / properties / hypothesis / minLength
        Added value: +5
      • addedInput schema / properties / tests / description
        Added value: +"Ordered list of one to ten checks to run. Each test object uses only the fields required by its type."
      • removedInput schema / properties / tests / items / additionalProperties
        Removed value: -false
      • addedInput schema / properties / tests / items / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Short explanation of what this endpoint check is meant to prove.",
        +        "minLength": 3,
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "endpoint_exists",
        +        "description": "Perform one unauthenticated GET request and pass when the endpoint returns a 2xx HTTP status.",
        +        "type": "string"
        +      },
        +      "url": {
        +        "description": "Public URL to probe, for example https://api.github.com.",
        +        "format": "uri",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "description",
        +      "type",
        +      "url"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Short explanation of what this npm lower-bound count check is meant to prove.",
        +        "minLength": 3,
        +        "type": "string"
        +      },
        +      "query": {
        +        "description": "npm search phrase to count, for example 'mcp email server'.",
        +        "minLength": 2,
        +        "type": "string"
        +      },
        +      "threshold": {
        +        "description": "Lower bound that the npm search result count must exceed.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "npm_count_above",
        +        "description": "Search npm and pass when the reported result count is strictly greater than the threshold.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "description",
        +      "type",
        +      "query",
        +      "threshold"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Short explanation of what this npm upper-bound count check is meant to prove.",
        +        "minLength": 3,
        +        "type": "string"
        +      },
        +      "query": {
        +        "description": "npm search phrase to count, for example 'business verification mcp'.",
        +        "minLength": 2,
        +        "type": "string"
        +      },
        +      "threshold": {
        +        "description": "Upper bound that the npm search result count must stay below.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "npm_count_below",
        +        "description": "Search npm and pass when the reported result count is strictly less than the threshold.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "description",
        +      "type",
        +      "query",
        +      "threshold"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Short explanation of what this response-content check is meant to prove.",
        +        "minLength": 3,
        +        "type": "string"
        +      },
        +      "substring": {
        +        "description": "Exact case-sensitive text to search for in the fetched response body.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "response_contains",
        +        "description": "Fetch a public URL and pass when the response body contains the exact substring using case-sensitive matching.",
        +        "type": "string"
        +      },
        +      "url": {
        +        "description": "Public URL whose response body should contain the expected text.",
        +        "format": "uri",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "description",
        +      "type",
        +      "url",
        +      "substring"
        +    ],
        +    "type": "object"
        +  }
        +]
      • removedInput schema / properties / tests / items / properties
        Removed value: -{
        -  "description": {
        -    "type": "string"
        -  },
        -  "query": {
        -    "type": "string"
        -  },
        -  "substring": {
        -    "type": "string"
        -  },
        -  "threshold": {
        -    "type": "number"
        -  },
        -  "type": {
        -    "enum": [
        -      "endpoint_exists",
        -      "npm_count_above",
        -      "npm_count_below",
        -      "response_contains"
        -    ],
        -    "type": "string"
        -  },
        -  "url": {
        -    "type": "string"
        -  }
        -}
      • removedInput schema / properties / tests / items / required
        Removed value: -[
        -  "description",
        -  "type"
        -]
      • removedInput schema / properties / tests / items / type
        Removed value: -"object"
      • addedInput schema / properties / tests / maxItems
        Added value: +10
      • addedInput schema / properties / tests / minItems
        Added value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "hypothesis": {
        +      "description": "Hypothesis that was evaluated.",
        +      "type": "string"
        +    },
        +    "tests": {
        +      "description": "Per-test execution results in input order.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "actual": {
        +            "description": "Observed value or diagnostic string that explains the result.",
        +            "type": [
        +              "string",
        +              "number",
        +              "null"
        +            ]
        +          },
        +          "description": {
        +            "description": "Human-readable explanation of the check.",
        +            "type": "string"
        +          },
        +          "passed": {
        +            "description": "True when the test condition was satisfied.",
        +            "type": "boolean"
        +          },
        +          "type": {
        +            "description": "Test type that was executed.",
        +            "enum": [
        +              "endpoint_exists",
        +              "npm_count_above",
        +              "npm_count_below",
        +              "response_contains"
        +            ],
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "description",
        +          "type",
        +          "passed",
        +          "actual"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "verdict": {
        +      "additionalProperties": false,
        +      "description": "High-level verdict for the hypothesis.",
        +      "properties": {
        +        "failed": {
        +          "description": "Number of tests that failed.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "passed": {
        +          "description": "Number of tests that passed.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "summary": {
        +          "description": "Aggregate verdict across the full test plan.",
        +          "enum": [
        +            "SUPPORTED",
        +            "REFUTED",
        +            "PARTIALLY SUPPORTED"
        +          ],
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "passed",
        +        "failed",
        +        "summary"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "hypothesis",
        +    "tests",
        +    "verdict"
        +  ],
        +  "type": "object"
        +}
    • Changedverify_claim6 fields changed
      • changedInput schema / properties / claim / description
        Previous value: -"The factual claim to verify"New value: +"Plain-language claim to verify, for example 'AWS Business support includes 24/7 phone support'."
      • addedInput schema / properties / claim / minLength
        Added value: +5
      • changedInput schema / properties / evidence_urls / description
        Previous value: -"URLs to cross-reference against"New value: +"One to ten public documentation, pricing, policy, or support URLs that are likely to contain direct evidence for the claim."
      • changedInput schema / properties / keywords / description
        Previous value: -"Keywords that should appear if the claim is true"New value: +"Keywords or short phrases that should appear on supporting pages. Matching is case-insensitive substring matching."
      • addedInput schema / properties / keywords / items / minLength
        Added value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "claim": {
        +      "description": "Claim that was evaluated.",
        +      "type": "string"
        +    },
        +    "sources": {
        +      "description": "Per-source evidence results.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "accessible": {
        +            "description": "True when the evidence page could be fetched.",
        +            "type": "boolean"
        +          },
        +          "cached": {
        +            "description": "True when the page body came from the 5-minute cache.",
        +            "type": "boolean"
        +          },
        +          "error": {
        +            "description": "Fetch error when the evidence page could not be checked.",
        +            "type": "string"
        +          },
        +          "keywordsMatched": {
        +            "description": "Subset of supplied keywords that were found on the page.",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "keywordsTotal": {
        +            "description": "Total number of keywords the tool looked for on this page.",
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "matchRatio": {
        +            "description": "Matched-keyword ratio for this source, from 0 to 1.",
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "supports": {
        +            "description": "True when the page met the current support threshold of at least half of the supplied keywords.",
        +            "type": "boolean"
        +          },
        +          "url": {
        +            "description": "Evidence URL that was checked.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "url",
        +          "accessible",
        +          "supports"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "verdict": {
        +      "additionalProperties": false,
        +      "description": "Aggregate verdict across all supplied sources.",
        +      "properties": {
        +        "confidence": {
        +          "description": "Share of sources that supported the claim.",
        +          "maximum": 1,
        +          "minimum": 0,
        +          "type": "number"
        +        },
        +        "contradicting": {
        +          "description": "Number of sources not marked as supporting the claim.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "summary": {
        +          "description": "High-level verdict derived from the supporting-source ratio.",
        +          "enum": [
        +            "CONFIRMED",
        +            "UNCONFIRMED",
        +            "LIKELY TRUE",
        +            "LIKELY FALSE"
        +          ],
        +          "type": "string"
        +        },
        +        "supporting": {
        +          "description": "Number of sources marked as supporting the claim.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "total": {
        +          "description": "Total number of evidence sources checked.",
        +          "minimum": 0,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "supporting",
        +        "contradicting",
        +        "total",
        +        "confidence",
        +        "summary"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "claim",
        +    "sources",
        +    "verdict"
        +  ],
        +  "type": "object"
        +}
  5. 6 tool updatesv0.1.0
    • First observedcheck_endpoint
    • First observedcheck_pricing
    • First observedcompare_competitors
    • First observedestimate_market
    • First observedtest_hypothesis
    • First observedverify_claim

TDQS

A4.4/5.0

Scored across 16 tools

Disambiguation5/5

Each tool has a clearly defined purpose with minimal overlap. While some tools like verify_claim and test_hypothesis might seem similar, their descriptions distinctly separate them: verify_claim does keyword matching on given URLs, while test_hypothesis runs a small plan of varied checks. Other tools like check_pricing and compare_pricing_pages are also well-differentiated by scope.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case (e.g., assess_compliance_posture, check_endpoint, list_monitors). There are no deviations or mixed conventions, making it easy for an agent to predict tool names.

Tool Count5/5

With 16 tools, the server covers a wide range of verification scenarios without being bloated. The count is well-scoped for the domain of ground truth checking, including monitoring, pricing, compliance, and endpoint verification.

Completeness4/5

The tool set is comprehensive for the stated purpose, covering most common verification needs. Minor gaps might include the absence of a tool for checking social proof or user reviews, but overall the surface covers the core workflows (monitoring, pricing, compliance, security headers, package comparison, and claim verification).

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers