Skip to main content
Glama
anish632

ground-truth-mcp

by anish632

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.5/5.0
Behavior4/5

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

Annotations already indicate readOnly, idempotent. The description adds important caveats: it is a 'signal scanner, not proof of certification or legal sufficiency,' and lists signals scanned. 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?

Two concise sentences that are front-loaded with purpose and usage, followed by a list of scanned signals and a caveat. Every sentence adds value with no redundancy.

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 presence of output schema and annotations, the description is sufficiently complete: it covers purpose, when to use, what is scanned, and limitations. No gaps for an agent to misuse the tool.

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. The description adds meaningful context by specifying the type of URLs acceptable (public trust, security, compliance, policy pages) and listing what signals are scanned, enhancing the schema's basic description.

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 compliance/trust pages for enterprise buying signals, listing specific items like SOC 2, ISO 27001. It distinctively targets compliance posture verification, differentiating it from siblings like check_endpoint or check_pricing.

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 specifies when to use: 'before you claim a vendor supports a particular compliance posture.' It also clarifies what it is not ('signal scanner, not proof'). However, it does not explicitly mention when not to use or provide alternatives.

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

A5/5.0
Behavior5/5

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

Annotations already provide readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds further behavioral context by explaining it's unauthenticated, reports HTTP status, content type, elapsed time, auth/rate-limit signals, and a response sample, and notes that success only proves basic reachability at fetch time. This goes beyond 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 three well-structured sentences. The first sentence states purpose and when to use, the second explains what the tool reports, and the third provides a strong 'do not use' warning. Every sentence is essential and adds value, with 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?

Given the tool's simplicity (one parameter and an output schema), the description covers purpose, usage guidelines, behavioral details, and limitations comprehensively. It tells the agent when to use, what it returns, and what not to expect, making it fully sufficient for correct invocation.

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?

The input schema has one parameter (url) with 100% description coverage. The description adds extra information beyond the schema by specifying that bare domains are accepted and normalized to https:// automatically, which helps the agent understand how to provide the URL.

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 that the tool performs a live, unauthenticated fetch against a public URL or API endpoint, and specifies its purpose: to check reachability before recommending, documenting, or building on top of an endpoint. It distinguishes from siblings by focusing on simple reachability questions.

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 when to use the tool (before recommending, documenting, or building on top) and provides clear alternatives: it should not be used for authenticated flows, POST side effects, JavaScript execution, or deeper business logic. This gives the agent explicit guidance on when not to use it.

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 provide readOnly, idempotent, openWorld hints. Description adds valuable behavioral context: returns cache information, results cached for 5 minutes, extracts heuristic labels and free signals, and warns about limitations. No 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?

Description is four sentences, front-loaded with main action, no unnecessary words. Each sentence adds essential information.

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 single parameter and existence of output schema, description fully covers what the tool does, returns, and its limitations. It is complete for an agent to decide and use 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 covers 100% of parameter description, providing clear guidance on URL format. Description reinforces the context of having a likely pricing URL. Additional advice on preferring specific pages over generic homepages adds value 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?

Description clearly states the tool fetches a public pricing page and extracts first-pass pricing signals. It specifies the specific verb 'fetch' and resource 'pricing page', and distinguishes from siblings like compare_pricing_pages by focusing on a single URL quick scan.

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 says 'Use this when you already have a likely pricing URL and need a quick live scan.' Lists what it does not do (map prices to exact plans, normalize currencies, etc.) and limitations (JS-rendered, logged-in pages may be missed).

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?

Discloses return format (per-package registry metadata in input order), field variability by registry, handling of missing packages (found=false), and caching (5 minutes). Annotations already show read-only, non-destructive, idempotent, open-world; description adds useful context.

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, front-loaded with purpose, then use cases, output behavior, and caching/exclusions. No wasted words, well-organized.

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 2 parameters, output schema, rich annotations, and description covering inputs, outputs, edge cases (missing packages), prohibitions, and caching, the tool is fully specified for an AI agent.

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 covers both parameters with descriptions; description reinforces with examples ('react', 'vue') and constraints (exact names, same registry). Since schema coverage is 100%, baseline is 3; description adds marginal extra meaning.

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 'compare' and resource 'exact package names using live npm or PyPI metadata'. It differentiates from sibling tools like estimate_market by focusing on known packages, not discovery.

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 (known candidates needing evidence for claims like newer, maintained, different licenses) and when not to use (discovery, market size, cross-registry). Provides clear exclusions.

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.7/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, openWorldHint true. The description adds valuable behavioral context: output is heuristic and page-level, and clarifies what the tool does not do (mapping every price or normalizing regional billing). 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?

The description consists of two sentences, both front-loaded with key information. Every word adds value—no redundancy or filler.

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 presence of an output schema (not shown but indicated), the description adequately explains the tool's behavior, limitations, and usage. It is complete enough for an agent to invoke correctly without additional clarification.

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 description coverage is 100%, so the schema already documents both parameters. The description adds extra context about how the parameters are used (name as label in output, url as page URL) and the overall purpose, which enriches the agent's understanding 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 uses a specific verb ('Compare') and resource ('public pricing pages') and clearly defines the scope (two to five, side-by-side). It distinguishes this tool from siblings such as 'compare_competitors' and 'check_pricing' by focusing on live, heuristic comparison of visible prices and signals.

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 states when to use: 'Use this when you want a quick, live comparison...' and sets expectations by noting limitations (heuristic, page-level, does not map every price or normalize regional differences). It provides clear context for appropriate usage.

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.7/5.0
Behavior5/5

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

Annotations already mark the tool as read-only and idempotent. The description adds valuable context: responses are cached for 5 minutes and results reflect search counts, not market share. 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?

The description is three sentences with a clear front-loaded purpose, followed by usage guidelines and behavioral notes. Every sentence adds value without redundancy.

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 has only two parameters, full schema coverage, and rich annotations, the description covers all necessary aspects: purpose, usage, limitations, and caching behavior. Output schema handles return value documentation.

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%, so the schema already fully documents both parameters. The description mentions 'live result counts plus representative matches' as output but does not add parameter-specific meaning beyond what's in the schema. Baseline 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 searches npm or PyPI to estimate market crowdedness, with a specific verb ('Search') and resource (package registries). It distinctly differs from sibling tools that focus on compliance, security, or pricing.

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 states when to use (evaluating category crowdedness) and when not to use (comparing exact packages, inferring adoption from downloads). It also mentions caching behavior and provides context about what the tool reflects.

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.9/5.0
Behavior5/5

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

The description discloses key behavioral traits: tests run in order with no branching, no early exit, and the verdict is mechanical. Annotations already indicate readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true, which are consistent with the description. 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?

The description is concise (5 sentences) and well-structured, with the most important information front-loaded. Every sentence adds value: purpose, usage, behavioral details, and alternatives.

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 complexity (multi-step with multiple test types) and the presence of annotations and output schema, the description is complete. It covers the verdict logic, ordering constraints, and coordination nature, leaving no obvious gaps.

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 description coverage is 100%, so baseline is 3. The description adds overall context about the coordination role and test execution logic, which helps the agent understand how to construct the 'tests' array, even though it doesn't add new details per parameter 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 tool's purpose: 'Run a small verification plan made of concrete live checks and summarize whether a hypothesis is supported.' It uses specific verbs ('run', 'summarize') and distinguishes from siblings like verify_claim, estimate_market, and compare_competitors.

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 explains when to use this tool ('when one conclusion depends on multiple simple checks') and provides alternatives for other scenarios. It also clarifies what the tool is not ('not an open-ended research agent') and lists specific use cases.

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. Dates show when Glama detected each change.

  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
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

ActivitySlowing
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/anish632/ground-truth-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server