Skip to main content
Glama

Ground Truth

Live fact-checking tools for AI agents.

Ground Truth gives AI agents read-only verification tools for live public data: free endpoint reachability checks, free security-header inspection, pricing-page scans, pricing-page comparisons, evidence-backed claim checks, package-market sizing, compliance scans, named package comparisons, and multi-step hypothesis tests.

You can use Ground Truth three ways:

  • Free endpoint and security-header checks for lightweight verification

  • Agentic pay-per-use with x402-compatible clients or an xpay proxy

  • A team subscription with X-API-Key billing and predictable monthly usage

MCP Cloudflare Workers ground-truth-mcp MCP server

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


Try This First

These two tools work without signup or an API key:

  • check_endpoint: verify that a public URL or API endpoint responds.

  • inspect_security_headers: inspect HSTS, CSP, frame protections, and related browser-facing security headers.

Example prompts:

  • "Use Ground Truth to check whether https://api.github.com responds."

  • "Use Ground Truth to inspect security headers for https://example.com."

  • "Before recommending this API, use Ground Truth to verify the endpoint is reachable."


Related MCP server: Demaciains MCP Server

What Ground Truth Verifies

Ground Truth helps agents check facts before they answer, recommend, or act.

Verification

What it checks

Example

Pricing claims

Pulls live pricing from product pages

"Does Stripe have a free tier?"

Pricing comparisons

Compares multiple pricing pages side by side

"Which vendor shows a free trial right now?"

Compliance posture

Scans trust pages for enterprise signals

"Does this vendor mention SOC 2, GDPR, and SCIM?"

Security posture

Inspects browser-facing security headers

"Does this app expose HSTS and CSP?"

Competitor existence

Checks whether real alternatives show up in npm or PyPI

"Are there edge-first Prisma alternatives?"

API endpoints

Confirms a URL exists and responds

"Does this endpoint return 200?"

All results come from live data and are cached for 5 minutes for faster repeat checks.


Complementary MCP Servers

Ground Truth is strongest when paired with a broader discovery or browser tool:

  • Tavily MCP Server for real-time web search and content discovery before you run a claim or pricing check.

  • Firecrawl MCP Server for deeper crawling and JS-heavy page extraction when raw HTML heuristics are not enough.

  • mcp-server-browserbase for interactive browser verification on pages that need clicks, auth, or client-side rendering.

These are complementary to Ground Truth rather than substitutes: they help you find or render the page, while Ground Truth helps you verify the resulting claim.

If you are filling in Glama related servers for this project, start with these three:

  • Tavily MCP Server

  • Firecrawl MCP Server

  • mcp-server-browserbase


Why AI Agents Need Verification

Training data goes stale. Docs change. Pricing changes. Competitors appear. Endpoints break. Policies move.

Ground Truth gives agents a way to check before they commit:

  • Before quoting a price, pull the live pricing page

  • Before comparing vendors, scan their live pricing pages side by side

  • Before repeating a compliance claim, scan the live trust page

  • Before asserting a security baseline, inspect the response headers

  • Before saying a competitor does not exist, search the live registry

  • Before recommending an API, confirm the endpoint responds

  • Before calling one package more popular, compare real package metadata

  • Before repeating a policy, verify the language on the current public page

The result is simple: agents that are less confident for the wrong reasons and more reliable when it matters.


Example Workflows

Verify a pricing claim

"Notion costs $8 per user per month for teams."

Use check_pricing on the live pricing page before repeating the number.

Check whether a competitor exists

"There is no good edge ORM alternative to Prisma."

Use estimate_market to search npm for edge orm and see what already exists.

Compare vendor pricing pages

"Vendor A is cheaper than Vendor B."

Use compare_pricing_pages to compare live pricing pages before repeating the claim.

Scan a trust page

"This vendor supports SOC 2, GDPR, and SCIM."

Use assess_compliance_posture before treating that as current fact.

Inspect browser-facing security headers

"This app has a strong public security baseline."

Use inspect_security_headers before making the claim.

Validate an API endpoint

"Use the OpenAI /v1/models endpoint to list available models."

Use check_endpoint before recommending it in docs, code, or support replies.

Compare package popularity

"Vue has overtaken React."

Use compare_competitors to compare live package metadata instead of guessing.

Test a market assumption

"There are fewer than 50 MCP tools on npm."

Use test_hypothesis with a count-based check and return the actual result.

Confirm whether a support policy applies

"AWS Business support includes 24/7 phone support."

Use verify_claim against the current AWS support page before treating that as fact.


Access Modes

Free

Free tier includes limited monthly endpoint and security-header checks.

  • check_endpoint

  • inspect_security_headers

  • 100 requests per calendar month

  • Tracked by Cloudflare client IP in production, or X-Anonymous-Client-Id for local/dev testing

  • No signup or API key required

Agentic pay-per-use

Paid tools also support agentic pay-per-use.

  • Use an x402-compatible MCP client, or put an xpay MCP proxy in front of this server

  • Tool pricing starts at $0.01 per call and varies by tool

  • Best for autonomous agents or variable workloads

  • Includes estimate_market, check_pricing, compare_pricing_pages, compare_competitors, verify_claim, assess_compliance_posture, and test_hypothesis

Team

Team subscription uses API-key billing with predictable monthly usage.

  • Requires X-API-Key with active billing

  • Default quota of 5,000 requests per calendar month

  • Monthly usage tracked per API key and tool

  • Includes all paid verification tools

View pricing


API Examples

Direct API with curl

Direct HTTP calls to /mcp are session-based. Initialize once, keep the returned mcp-session-id, then call tools with that header.

The examples below use the team plan with X-API-Key. For agentic pay-per-use, use an x402-capable MCP client or put an xpay proxy in front of this server.

SESSION_ID="$(curl -i -s -X POST https://ground-truth-mcp.anishdasmail.workers.dev/mcp \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "initialize",
    "params": {
      "protocolVersion": "2025-03-26",
      "capabilities": {},
      "clientInfo": {
        "name": "ground-truth-example",
        "version": "1.0.0"
      }
    },
    "id": 0
  }' | tr -d '\r' | awk '/^mcp-session-id:/ {print $2}')"

curl -X POST https://ground-truth-mcp.anishdasmail.workers.dev/mcp \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -H "Mcp-Session-Id: $SESSION_ID" \
  -H "X-API-Key: $GROUND_TRUTH_API_KEY" \
  -d '{
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "check_pricing",
      "arguments": {
        "url": "https://stripe.com/pricing"
      }
    },
    "id": 1
  }'

JavaScript fetch

const initResponse = await fetch("https://ground-truth-mcp.anishdasmail.workers.dev/mcp", {
  method: "POST",
  headers: {
    "Accept": "application/json, text/event-stream",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    jsonrpc: "2.0",
    method: "initialize",
    params: {
      protocolVersion: "2025-03-26",
      capabilities: {},
      clientInfo: {
        name: "ground-truth-example",
        version: "1.0.0",
      },
    },
    id: 0,
  }),
});

const sessionId = initResponse.headers.get("mcp-session-id");

if (!sessionId) {
  throw new Error("Missing mcp-session-id from initialize response");
}

const response = await fetch("https://ground-truth-mcp.anishdasmail.workers.dev/mcp", {
  method: "POST",
  headers: {
    "Accept": "application/json, text/event-stream",
    "Content-Type": "application/json",
    "Mcp-Session-Id": sessionId,
    "X-API-Key": process.env.GROUND_TRUTH_API_KEY,
  },
  body: JSON.stringify({
    jsonrpc: "2.0",
    method: "tools/call",
    params: {
      name: "compare_competitors",
      arguments: {
        packages: ["react", "vue"],
        registry: "npm",
      },
    },
    id: 1,
  }),
});

const result = await response.json();
console.log(result);

Free endpoint check

curl -X POST https://ground-truth-mcp.anishdasmail.workers.dev/mcp \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -H "Mcp-Session-Id: $SESSION_ID" \
  -d '{
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "check_endpoint",
      "arguments": {
        "url": "https://api.github.com"
      }
    },
    "id": 1
  }'

Lightweight request checks for free access, team-plan billing, invalid keys, inactive billing, quota enforcement, and active paid access live in test-usage-enforcement.sh.


MCP Setup

If you use Claude Desktop, Cursor, or another MCP client, Ground Truth can plug in as a verification tool for your agent.

MCP stands for Model Context Protocol. It is the standard that lets AI apps call external tools.

If you want agentic pay-per-use without changing your app code, register this MCP URL with xpay and share the resulting proxy URL instead.

Claude Desktop

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

{
  "mcpServers": {
    "ground-truth": {
      "url": "https://ground-truth-mcp.anishdasmail.workers.dev/mcp",
      "headers": {
        "X-API-Key": "gt_live_your_key_here"
      }
    }
  }
}

Cursor

Add this to .cursor/mcp.json in your project or ~/.cursor/mcp.json globally:

{
  "mcpServers": {
    "ground-truth": {
      "url": "https://ground-truth-mcp.anishdasmail.workers.dev/mcp",
      "headers": {
        "X-API-Key": "gt_live_your_key_here"
      }
    }
  }
}

Claude Code skill

If you want the same workflow without running a server, see claude-skill/.


Use Cases

Support

  • Verify a pricing claim before sending it to a customer

  • Check whether a support policy applies before escalating

  • Confirm an API endpoint exists before recommending it in a reply

  • Inspect public security headers before repeating a security claim

Product

  • Test whether a market assumption is true before writing a spec

  • Check whether a competitor exists before framing a roadmap

  • Compare package popularity before making a platform choice

  • Compare pricing pages before telling a team one vendor is cheaper

Compliance

  • Scan trust pages for SOC 2, GDPR, HIPAA, DPA, SSO, and SCIM signals

  • Verify pricing or packaging claims before repeating them internally

  • Check that a public terms or policy URL is reachable and current

Security & vendor diligence

  • Compare competitor pricing across live pages

  • Inspect browser-facing security headers before recommending or approving a vendor

  • Validate positioning claims with structured checks


Tool Reference

Tool

Tier

What it does

check_endpoint

Free

Checks whether a URL or API endpoint exists and responds

estimate_market

Paid

Counts packages in npm or PyPI for a search term

check_pricing

Paid

Extracts prices, plans, and free-tier signals from a page

inspect_security_headers

Free

Checks common browser-facing security headers on a public URL

compare_pricing_pages

Paid

Compares multiple live pricing pages side by side

compare_competitors

Paid

Compares packages side by side with live metadata

verify_claim

Paid

Checks whether live sources support or contradict a claim

assess_compliance_posture

Paid

Scans a trust page for compliance and enterprise-security signals

test_hypothesis

Paid

Runs pass/fail tests against a live-data assumption

Full reference: API_USAGE.md


Architecture

Ground Truth keeps the current Cloudflare Workers architecture:

  • Runtime: Cloudflare Workers

  • Storage: Durable Objects with SQLite for cache and usage logs

  • API keys: Cloudflare KV

  • Billing: Stripe team subscriptions plus x402-compatible pay-per-use

  • Protocol: MCP

  • Language: TypeScript


Distribution

Ground Truth is set up for multiple discovery and monetization paths:

  • Official MCP Registry publishing through server.json for ecosystem-wide discovery.

  • Smithery URL publishing. This server exposes Streamable HTTP at /mcp and a static server card at /.well-known/mcp/server-card.json for metadata fallback.

  • xpay MCP monetization. You can register the live /mcp URL with xpay to get a managed pay-per-tool proxy without changing the server code.

  • MCP Market directory listing for additional discovery.

  • Apify is optional if you want a separate marketplace-native Actor version later; the current project stays optimized for remote MCP delivery rather than an Actor-first runtime.


Development

cd ground-truth-mcp
npm install
npx wrangler dev

Deployment notes live in SETUP.md.


GitHub Releases

Stable GitHub releases are created automatically when you push a version tag that matches v*.

git tag v0.4.0
git push origin v0.4.0

That tag triggers .github/workflows/release.yml, which typechecks the project and publishes a GitHub release from the tag. This is the repo-side piece Glama uses to detect stable releases during maintenance scans.


Glama Release

Glama releases are Docker-based, not GitHub releases. This repo includes a Dockerfile that starts the Worker locally through Wrangler on port 3000.

docker build -t ground-truth-mcp .
docker run --rm -p 3000:3000 ground-truth-mcp

For the Glama flow:

  1. Claim the server in Glama.

  2. Open the Dockerfile admin page, use this repository Dockerfile, and run the deploy test.

  3. After the deploy test succeeds, click Make Release, choose a version, and publish.

  4. If the score page still shows No LICENSE, trigger a re-scan in the Glama admin interface after GitHub has recognized the root LICENSE file.

  5. If the score page still shows No related servers, use Add related servers in the claimed Glama UI and add Tavily MCP Server, Firecrawl MCP Server, and mcp-server-browserbase. That checklist item is managed on Glama's side rather than in glama.json.

If Glama generates an mcp-proxy-based build spec instead of using the repository Dockerfile, point the command at npm run start:glama:stdio. That bridge exposes the existing remote Ground Truth MCP endpoint over stdio so mcp-proxy can host it.


Documentation


Support


License

MIT — see LICENSE


Made by Anish Das

Last updated: April 29, 2026

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.

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

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

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

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

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

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

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

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

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

Output Schema

NameRequiredDescription
pagesYesPer-page pricing signals returned in input order.
summaryYesAggregate counts across all compared pricing pages.
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.

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

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.
delete_monitorDelete MonitorA
DestructiveIdempotent
Inspect

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

NameRequiredDescriptionDefault
monitor_idYesThe monitor ID to delete.

Output Schema

NameRequiredDescription
monitor_idYes
deletedYes
results_deletedYesNumber of result records also deleted.
errorNo
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.

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

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

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

NameRequiredDescription
periodYes
fromYes
toYes
summaryYes
changesYes
failuresYes
recommended_actionsYes
errorNo
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.

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

Output Schema

NameRequiredDescription
monitor_idYes
resultsYes
totalYes
errorNo
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.

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

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

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

Output Schema

NameRequiredDescription
monitorsYesList of monitors belonging to this API key.
totalYesTotal number of monitors returned.
errorNo
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.

NameRequiredDescriptionDefault

No parameters

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

NameRequiredDescriptionDefault
monitor_idYesThe monitor ID returned by create_monitor.

Output Schema

NameRequiredDescription
monitor_idYes
result_idYes
statusYes
changedYes
old_valueYes
new_valueYes
confidenceYes
evidenceYes
run_atYes
errorNo
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.

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

NameRequiredDescription
hypothesisYesHypothesis that was evaluated.
testsYesPer-test execution results in input order.
verdictYesHigh-level verdict for the hypothesis.
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.

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

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

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

TDQS

A4.4/5.0

Scored across 16 tools

Disambiguation5/5

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

Naming Consistency5/5

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

Tool Count5/5

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

Completeness4/5

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

Maintenance

ActivityNo data
ResponsivenessOutdated data

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    This server enables AI systems to integrate with Tavily's search and data extraction tools, providing real-time web information access and domain-specific searches.
    4
    21,505 npm
    2,477
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides 19 AI-powered business intelligence tools for tasks such as SEO audits, company enrichment, and market analysis. These services are accessible through a pay-per-use model utilizing the x402 protocol on the Base network.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Trust layer for AI agents: 22 pay-per-call x402 tools for scam and fraud checks, payment pre-flight, wallet screening, policy approvals, contact extraction and company research. Free preview with no wallet; paid calls settle in USDC on Base.
    22
    80 npm
    MIT