ground-truth-mcp
Ground Truth is an MCP server that gives AI agents read-only tools to verify facts, pricing, endpoints, and market assumptions against live public data.
check_endpoint(Free): Probe any URL/API endpoint to verify reachability — reports status code, auth requirements, response time, content type, rate limit headers, and a sample response structure.check_pricing(Pro): Fetch a product's live pricing page to extract price points, plan names, and free-tier signals.estimate_market(Pro): Count packages on npm or PyPI matching a search term, returning total count and top results with version and activity signals.compare_competitors(Pro): Compare 2–10 npm or PyPI packages side by side using version, description, and npm score.verify_claim(Pro): Cross-reference a factual claim against multiple live URLs using keyword/substring matching to determine if each source supports or contradicts it.test_hypothesis(Pro): Run structured pass/fail tests against live data — supportsendpoint_exists,npm_count_above,npm_count_below, andresponse_contains— returning per-test results and an overall verdict.
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 pageestimate_market- Search npm/PyPI for package countscompare_competitors- Compare packages side-by-sidecompare_pricing_pages- Compare multiple pricing pagesverify_claim- Verify claims against live sourcesassess_compliance_posture- Scan trust pages for compliance signalstest_hypothesis- Run multi-step verification tests
💡 Use Cases That Actually Matter
Before recommending an API
"Use the
/v1/usersendpoint 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/mcpHealth:
curl -I https://ground-truth-mcp.anishdasmail.workers.dev/.well-known/mcp/server-card.jsonRestart MCP client after config changes
No tool calls appearing
Use exact tool name:
check_endpointDo 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
Copy → Paste → See 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
Made by Anish Das
Last updated: July 9, 2026 - Activation-focused rewrite
Available Tools
16 toolsassess_compliance_postureCompliance Signal ScanARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public trust, security, compliance, or policy URL to scan. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Compliance or trust page that was analyzed. |
| cached | No | True when the page body came from the 5-minute cache. |
| matchedSignals | No | Signal names that were detected on the page. |
| signals | No | Boolean scan results for common enterprise compliance and security signals. |
| pageLength | No | Size of the fetched page body in characters. |
| error | No | Fetch or parsing error when the page could not be analyzed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior. The description adds valuable context about the tool's limitations ('not proof of certification or legal sufficiency') and the types of signals it scans for, going beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences: the first states the action and purpose, the second lists specific signal types, and the third caveats limitations. Every sentence adds value with no waste, and the key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with a complete schema and output schema, the description provides thorough context: what it scans, what it looks for, and its limitations. No critical information is missing for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameter descriptions, so the description doesn't need to elaborate on the 'url' parameter. The description mentions 'public' pages, which aligns with the schema description and adds minimal extra meaning, making a baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool scans public security, trust, compliance, or legal pages for common enterprise buying signals, using a specific verb and resource. It distinguishes itself by specifying the compliance-posture-related use case and listing concrete signal types, standing out from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use the tool ('before you claim a vendor supports a particular compliance posture') and notes it is a signal scanner, not proof. It does not explicitly name alternatives or exclusions, but the context is sufficient for an agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_endpointEndpoint Reachability CheckARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public http(s) URL or bare domain to probe. Bare domains like google.com are accepted and normalized to https:// automatically. |
Output Schema
| Name | Required | Description |
|---|---|---|
| inputUrl | No | Original user input when normalization changed it, for example when https:// was added. |
| url | Yes | Normalized URL that was actually fetched. |
| accessible | Yes | True when the endpoint returned a 2xx HTTP status. |
| status | No | HTTP status code returned by the endpoint, when a response was received. |
| contentType | No | Response Content-Type header, if present. |
| responseTimeMs | No | Elapsed request time in milliseconds. |
| authRequired | No | True when the server responded with 401 or 403, which usually means credentials are required. |
| rateLimited | No | True when the server responded with 429 Too Many Requests. |
| sampleResponse | No | 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. |
| error | No | Validation or network error when the request could not be completed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, idempotentHint, destructiveHint), the description adds that the tool is unauthenticated, reports specific fields (HTTP status, content type, etc.), and warns that success only proves basic reachability. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: purpose and usage, what is reported, and limitations/caveats. Front-loaded, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one simple parameter, output schema mentioned, and annotations covering safety, the description is complete. It covers main use case, output contents, and limitations. Adequate for an agent to decide when to use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a detailed description of the url parameter (public http(s) URL, normalization). The tool description adds usage context but no new parameter semantics beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool performs a live, unauthenticated fetch against a public URL/API endpoint. It uses specific verbs and resources, and the context distinguishes it from siblings like inspect_security_headers or verify_claim.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('simply whether an endpoint currently responds') and when not to use (authenticated flows, POST side effects, JavaScript execution, deeper business logic). Provides clear guidance on appropriate use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_pricingPricing Page ScanARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public pricing or plans URL to analyze. Prefer the specific pricing page, for example https://stripe.com/pricing, rather than a generic homepage. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Pricing page that was analyzed. |
| cached | No | True when the page body came from the 5-minute cache instead of a new fetch. |
| pricesFound | No | Distinct price-like strings extracted from the page text. These are not linked back to specific plans or billing conditions. |
| plansDetected | No | Lowercased heuristic plan labels detected from the page text. They are useful hints, not authoritative plan identifiers. |
| hasFreeOption | No | 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. |
| hasFreeTrial | No | True when the page contains signals that a free trial exists somewhere on the page. |
| pageLength | No | Size of the fetched page body in characters. |
| error | No | Fetch or parsing error when the pricing page could not be analyzed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive. The description adds valuable behavioral context: results are cached for 5 minutes, and JavaScript-rendered, logged-in, or heavily obfuscated pricing details can be missed. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: purpose first, then usage context, then limitations and caching. Every sentence provides meaningful information with no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simple scope, the description fully covers what the tool does, its limitations, cache behavior, and return content. With annotations and output schema also present, this is complete for an agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single url parameter, with a clear description. The tool description adds extra guidance: 'Prefer the specific pricing page, for example https://stripe.com/pricing, rather than a generic homepage.' This enriches the parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'Fetch a public pricing page and extract first-pass pricing signals.' This distinguishes it from siblings like compare_pricing_pages, which likely compares multiple pages, and check_endpoint, which is more generic. The purpose is immediately clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this when you already have a likely pricing URL and need a quick live scan of visible page text.' It also lists exclusions: 'does not map prices to exact plans, normalize currencies, execute checkout flows, or guarantee that a price applies to a specific region or customer type.' This provides clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_competitorsNamed Package ComparisonARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| packages | Yes | Two to ten exact package names from the same registry, for example ['react', 'vue']. Use exact registry names, not search phrases or categories. | |
| registry | No | 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. | npm |
Output Schema
| Name | Required | Description |
|---|---|---|
| packages | Yes | Package names that were requested for comparison. |
| registry | Yes | Registry used for all comparisons. |
| comparisons | Yes | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: 'returns per-package registry metadata in input order, with field availability varying by registry. Missing or unpublished packages return found=false. Registry responses are cached for 5 minutes.' This enriches the readOnly/idempotent/openWorld hints with specific behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each packed with distinct value: core action, use cases, return/missing behavior, caching. No fluff or repetition; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all essential context: what it does, when to use, when not to use, output behavior, and caching. With a rich output schema and strong annotations, the description is fully complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both packages and registry are already well-described in the schema. The description only reinforces 'exact package names' without adding meaningfully new parameter-level information, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb and resource: 'Compare two or more exact package names side by side using live npm or PyPI metadata.' It also differentiates from siblings by explicitly saying 'Do not use it to discover unknown alternatives,' which distinguishes it from tools like estimate_market.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit positive conditions ('Use this when you already know the candidate packages and need evidence for claims...') and negative exclusions ('Do not use it to discover unknown alternatives, estimate market size, or compare packages across different registries'), effectively guiding tool selection without needing to read sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_pricing_pagesPricing Page ComparisonARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| pages | Yes | Two to five named pricing pages to compare side by side. |
Output Schema
| Name | Required | Description |
|---|---|---|
| pages | Yes | Per-page pricing signals returned in input order. |
| summary | Yes | Aggregate counts across all compared pricing pages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior. The description adds valuable context beyond that: the output is heuristic and page-level, does not map every price to every plan, and does not normalize regional billing differences. This discloses important output quality limitations that an agent needs to know before relying on results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no fluff. The first sentence states the purpose and use case; the second states limitations. Information density is high and every word earns its place. The description is front-loaded with the primary action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single well-documented parameter, strong annotations, and an output schema (not shown but present), the description covers what the tool does, when to use it, and its limitations. There are no obvious gaps in the agent's ability to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully documents the 'pages' parameter, its items, and required properties, so baseline is 3. The description adds semantic meaning about what the comparison focuses on (visible prices, free-plan signals, plan-name hints), which goes beyond the schema's structural definitions. It also clarifies that URLs must be public pricing pages.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('Compare two to five public pricing pages side by side') and its scope. It distinguishes itself from siblings by emphasizing a quick, live comparison of visible prices, free-plan signals, and plan-name hints, which is distinct from broader competitor analysis or single-page checks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: 'Use this when you want a quick, live comparison of visible prices, free-plan signals, and plan-name hints across vendors.' The description also implicitly states when not to use it by noting limitations (heuristic, page-level, no normalization), which serves as an exclusion criterion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_monitorCreate MonitorAInspect
Create a persistent monitor that tracks a URL, pricing page, package version, endpoint status, vendor claim, or custom keyword pattern over time. Monitors run automatically on their configured schedule (hourly/daily/weekly) via the Cloudflare cron trigger, or on demand with run_monitor_now. Results are stored in the Durable Object SQLite database. Requires a team API key.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable name for this monitor. | |
| target_type | Yes | What 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_value | Yes | Primary 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. | |
| instructions | No | Supplementary instructions. For vendor_claim: the URL to check. For custom_prompt: comma-separated keywords. Optional for other types. | |
| schedule | No | How often the monitor runs automatically. manual means only via run_monitor_now. | daily |
| notification_destination | No | Optional destination for change alerts (email or webhook URL). Stored for future use. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Unique monitor ID. |
| name | Yes | Monitor name. |
| target_type | Yes | Monitor target type. |
| target_value | Yes | Monitor target value. |
| schedule | Yes | Monitor schedule. |
| created_at | Yes | Creation timestamp ISO 8601. |
| error | No | Error message if creation failed. |
TDQS
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.
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.
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.
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.
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.
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 MonitorADestructiveIdempotentInspect
Permanently delete a monitor and all its stored results. This action cannot be undone. Requires a team API key.
| Name | Required | Description | Default |
|---|---|---|---|
| monitor_id | Yes | The monitor ID to delete. |
Output Schema
| Name | Required | Description |
|---|---|---|
| monitor_id | Yes | |
| deleted | Yes | |
| results_deleted | Yes | Number of result records also deleted. |
| error | No |
TDQS
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.
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.
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.
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.
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.
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 SearchARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Short registry search phrase to evaluate, for example 'mcp memory server' or 'edge orm'. | |
| registry | No | Registry to search. Use 'npm' for JavaScript ecosystems and 'pypi' for Python ecosystems. | npm |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | Search phrase that was evaluated. |
| registry | Yes | Registry that was searched. |
| totalResults | Yes | Total number of matching packages reported by the registry search. |
| topResults | Yes | Representative top search matches that help interpret the market count. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, and non-destructive. The description adds valuable behavioral context: responses are cached for 5 minutes, and results reflect search relevance not market share, which complements the annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise sentences deliver purpose, usage, exclusions, and caching behavior with no filler. The most important information is front-loaded in the first sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only search tool with an output schema and rich annotations, the description covers key behaviors, limitations, and cache behavior. It is fully adequate for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptive text for both query and registry. The description itself adds only an example phrase ('edge orm') and reiterates the npm/PyPI choice, providing no additional semantic value beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool searches npm or PyPI to estimate package category crowdedness before making market claims. This is a specific verb-resource-purpose combination that distinguishes it from sibling tools focused on compliance, endpoints, pricing, and monitors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('when you have a category or search phrase') and what not to use it for ('Do not use it to compare exact known package names or to infer adoption from downloads'). However, it does not name a specific alternative tool, slightly reducing the guidance completeness.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_change_reportGenerate Change ReportARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | Report period. daily covers the past 24 hours, weekly covers the past 7 days. | daily |
| include_unchanged | No | When true also lists monitors with no detected changes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| period | Yes | |
| from | Yes | |
| to | Yes | |
| summary | Yes | |
| changes | Yes | |
| failures | Yes | |
| recommended_actions | Yes | |
| error | No |
TDQS
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.
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.
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.
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.
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.
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 ResultsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| monitor_id | Yes | The monitor ID to retrieve results for. | |
| limit | No | Maximum number of results to return, newest first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| monitor_id | Yes | |
| results | Yes | |
| total | Yes | |
| error | No |
TDQS
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.
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.
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.
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.
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.
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 InspectionARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public http(s) URL or bare domain to inspect. Bare domains are normalized to https:// automatically. |
Output Schema
| Name | Required | Description |
|---|---|---|
| inputUrl | No | Original user input when normalization changed it. |
| url | Yes | Normalized URL that was fetched. |
| accessible | Yes | True when the endpoint returned an HTTP response. |
| status | No | HTTP status code returned by the endpoint. |
| https | Yes | True when the normalized URL used https. |
| presentCount | No | Number of tracked security headers that were present. |
| score | No | Heuristic security-header score based on how many tracked headers were present. |
| headers | No | Tracked response headers and their raw values when present. |
| missingRecommended | No | Tracked headers that were not present on the response. |
| error | No | Validation or network error when the request could not be completed. |
TDQS
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.
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.
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.
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.
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.
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 MonitorsARead-onlyIdempotentInspect
List all monitors owned by this API key, with last run status and schedule. Requires a team API key.
| Name | Required | Description | Default |
|---|---|---|---|
| active_only | No | When true returns only active monitors. Set false to include paused monitors. |
Output Schema
| Name | Required | Description |
|---|---|---|
| monitors | Yes | List of monitors belonging to this API key. |
| total | Yes | Total number of monitors returned. |
| error | No |
TDQS
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.
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.
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.
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.
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.
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 DiscoveryARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| freeTools | Yes | Tools available in the free tier with no API key required. |
| paidTools | Yes | Tools requiring team API key or agentic payment. |
| monitorTools | Yes | Monitor management tools requiring team API key. |
| serverVersion | Yes | Current server version. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| monitor_id | Yes | The monitor ID returned by create_monitor. |
Output Schema
| Name | Required | Description |
|---|---|---|
| monitor_id | Yes | |
| result_id | Yes | |
| status | Yes | |
| changed | Yes | |
| old_value | Yes | |
| new_value | Yes | |
| confidence | Yes | |
| evidence | Yes | |
| run_at | Yes | |
| error | No |
TDQS
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.
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.
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.
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.
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.
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 TestARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| hypothesis | Yes | Claim to test, for example 'there are fewer than 50 MCP email servers on npm'. | |
| tests | Yes | Ordered list of one to ten checks to run. Each test object uses only the fields required by its type. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hypothesis | Yes | Hypothesis that was evaluated. |
| tests | Yes | Per-test execution results in input order. |
| verdict | Yes | High-level verdict for the hypothesis. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false, so the safety profile is covered. The description adds substantial behavioral context beyond annotations: tests run in order with no branching or early exit, the verdict mapping is fully mechanical (all passing => SUPPORTED, zero passing => REFUTED, otherwise PARTIALLY SUPPORTED), and the tool is not an open-ended research agent. This goes well beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-organized: first sentence defines the action, second covers typical use cases, third imposes constraints, fourth explains the verdict algorithm, fifth names alternatives. Every sentence earns its place, and there is no redundant or filler content. It is appropriately sized for a tool of this complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate-to-high complexity (multiple test types, ordered execution, verdict logic), the description covers all key aspects: what it does, when to use it, behavioral constraints, verdict determination, and sibling alternatives. An output schema exists for return values, and the description already explains the verdict mapping, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds some context by listing example check types (endpoint reachability, npm search counts, substring presence) and emphasizing that tests must be explicitly defined, but this largely restates information already in the schema. The hypothesis parameter is self-explanatory. No additional syntax or format details beyond the schema are provided, so a 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Run a small verification plan made of concrete live checks and summarize whether a hypothesis is supported' with a specific verb and resource. It also distinguishes itself from siblings by explicitly naming alternatives (verify_claim, estimate_market, compare_competitors) and framing itself as a coordination tool, not an open-ended research agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance ('Use this when one conclusion depends on multiple simple checks...') and when-not-to-use guidance with named alternatives ('Use verify_claim when you already have evidence URLs...'). It also restricts usage by stating 'every test must be explicitly defined in advance' and 'no branching or early exit', which clarifies the boundary versus more flexible research tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_claimClaim Support CheckARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| claim | Yes | Plain-language claim to verify, for example 'AWS Business support includes 24/7 phone support'. | |
| evidence_urls | Yes | One to ten public documentation, pricing, policy, or support URLs that are likely to contain direct evidence for the claim. | |
| keywords | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| claim | Yes | Claim that was evaluated. |
| sources | Yes | Per-source evidence results. |
| verdict | Yes | Aggregate verdict across all supplied sources. |
TDQS
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.
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.
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.
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.
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.
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.
8 tool updates
v0.5.1- Added
create_monitor - Added
delete_monitor - Added
generate_change_report - Added
get_monitor_result - Added
list_monitors - Added
list_resources - Added
run_monitor_now - Changed
test_hypothesis1 field changed- changed
Input schema / properties / tests / items / anyOfPrevious 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" + } +]
3 tool updates
v0.4.4- Changed
assess_compliance_posture10 fields changed- added
Output schema / properties / signals / properties / dataResidency / descriptionAdded value: +"True when the page references data residency, data regions, or regional storage controls." - added
Output schema / properties / signals / properties / dpa / descriptionAdded value: +"True when the page references a data processing agreement or DPA." - added
Output schema / properties / signals / properties / encryption / descriptionAdded value: +"True when the page references encryption, data encrypted at rest, or data encrypted in transit." - added
Output schema / properties / signals / properties / gdpr / descriptionAdded value: +"True when the page references GDPR or the General Data Protection Regulation." - added
Output schema / properties / signals / properties / hipaa / descriptionAdded value: +"True when the page references HIPAA compliance language." - added
Output schema / properties / signals / properties / iso27001 / descriptionAdded value: +"True when the page references ISO 27001 certification or compliance language." - added
Output schema / properties / signals / properties / scim / descriptionAdded value: +"True when the page references SCIM provisioning." - added
Output schema / properties / signals / properties / soc2 / descriptionAdded value: +"True when the page references SOC 2 or SOC2 compliance language." - added
Output schema / properties / signals / properties / sso / descriptionAdded value: +"True when the page references SSO or single sign-on." - added
Output schema / properties / signals / properties / subprocessorList / descriptionAdded value: +"True when the page references subprocessors or a subprocessor list."
- Changed
check_endpoint1 field changed- changed
Output schema / properties / sampleResponse / descriptionPrevious 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."
- Changed
compare_pricing_pages13 fields changed- added
Output schema / properties / pages / items / properties / cached / descriptionAdded value: +"True when this page body came from the 5-minute cache." - added
Output schema / properties / pages / items / properties / error / descriptionAdded value: +"Fetch or parsing error for this specific pricing page when it could not be analyzed." - added
Output schema / properties / pages / items / properties / hasFreeOption / descriptionAdded value: +"True when this page contains visible text suggesting a free plan, free tier, or $0 option." - added
Output schema / properties / pages / items / properties / hasFreeTrial / descriptionAdded value: +"True when this page contains visible text suggesting a free trial." - added
Output schema / properties / pages / items / properties / name / descriptionAdded value: +"Short vendor or product label from the input page object." - added
Output schema / properties / pages / items / properties / pageLength / descriptionAdded value: +"Size of this fetched page body in characters." - added
Output schema / properties / pages / items / properties / plansDetected / descriptionAdded value: +"Lowercased heuristic plan labels detected on this page, such as free, pro, team, or enterprise." - added
Output schema / properties / pages / items / properties / pricesFound / descriptionAdded value: +"Distinct price-like strings extracted from this page. These are page-level hints and are not mapped to specific plans." - added
Output schema / properties / pages / items / properties / url / descriptionAdded value: +"Pricing page URL that was fetched for this named vendor." - added
Output schema / properties / summary / properties / pagesCompared / descriptionAdded value: +"Number of pricing pages included in the comparison." - added
Output schema / properties / summary / properties / pagesWithFreeOption / descriptionAdded value: +"Number of pages with page-level text suggesting a free plan, free tier, or $0 option." - added
Output schema / properties / summary / properties / pagesWithFreeTrial / descriptionAdded value: +"Number of pages with page-level text suggesting a free trial." - added
Output schema / properties / summary / properties / pagesWithVisiblePrices / descriptionAdded value: +"Number of pages where at least one price-like string was detected."
7 tool updates
v0.4.0- Added
assess_compliance_posture - Changed
check_pricing5 fields changed- changed
Input schema / properties / url / descriptionPrevious 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." - changed
Output schema / properties / hasFreeOption / descriptionPrevious 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." - changed
Output schema / properties / hasFreeTrial / descriptionPrevious 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." - changed
Output schema / properties / plansDetected / descriptionPrevious 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." - changed
Output schema / properties / pricesFound / descriptionPrevious 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."
- Changed
compare_competitors3 fields changed- changed
Input schema / properties / packages / descriptionPrevious 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." - changed
Input schema / properties / registry / descriptionPrevious 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." - changed
Output schema / properties / comparisons / descriptionPrevious 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."
- Added
compare_pricing_pages - Added
inspect_security_headers - Changed
test_hypothesis3 fields changed- changed
Input schema / properties / tests / items / anyOfPrevious 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" + } +] - changed
Output schema / properties / tests / items / properties / actual / descriptionPrevious 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." - changed
Output schema / properties / verdict / properties / summary / descriptionPrevious 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."
- Changed
verify_claim2 fields changed- changed
Input schema / properties / keywords / descriptionPrevious 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." - changed
Output schema / properties / verdict / properties / summary / descriptionPrevious 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."
6 tool updates
v0.1.1- Changed
check_endpoint4 fields changed- changed
Input schema / properties / url / descriptionPrevious 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." - removed
Input schema / properties / url / formatRemoved value: -"uri" - added
Input schema / properties / url / minLengthAdded value: +1 - changed
Output 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" +}
- Changed
check_pricing2 fields changed- changed
Input schema / properties / url / descriptionPrevious value: -"URL of the pricing page to analyze"New value: +"Public pricing-page URL to analyze, for example https://stripe.com/pricing." - changed
Output 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" +}
- Changed
compare_competitors4 fields changed- changed
Input schema / properties / packages / descriptionPrevious 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']." - added
Input schema / properties / packages / items / minLengthAdded value: +1 - added
Input schema / properties / registry / descriptionAdded value: +"Registry that all package names belong to. All compared packages must come from the same registry." - changed
Output 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" +}
- Changed
estimate_market4 fields changed- changed
Input schema / properties / query / descriptionPrevious value: -"Search query (e.g. 'mcp memory server')"New value: +"Short registry search phrase to evaluate, for example 'mcp memory server' or 'edge orm'." - added
Input schema / properties / query / minLengthAdded value: +2 - changed
Input schema / properties / registry / descriptionPrevious value: -"Which registry to search"New value: +"Registry to search. Use 'npm' for JavaScript ecosystems and 'pypi' for Python ecosystems." - changed
Output 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" +}
- Changed
test_hypothesis11 fields changed- changed
Input schema / properties / hypothesis / descriptionPrevious value: -"The claim to test"New value: +"Claim to test, for example 'there are fewer than 50 MCP email servers on npm'." - added
Input schema / properties / hypothesis / minLengthAdded value: +5 - added
Input schema / properties / tests / descriptionAdded value: +"Ordered list of one to ten checks to run. Each test object uses only the fields required by its type." - removed
Input schema / properties / tests / items / additionalPropertiesRemoved value: -false - added
Input schema / properties / tests / items / anyOfAdded 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" + } +] - removed
Input schema / properties / tests / items / propertiesRemoved 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" - } -} - removed
Input schema / properties / tests / items / requiredRemoved value: -[ - "description", - "type" -] - removed
Input schema / properties / tests / items / typeRemoved value: -"object" - added
Input schema / properties / tests / maxItemsAdded value: +10 - added
Input schema / properties / tests / minItemsAdded value: +1 - changed
Output 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" +}
- Changed
verify_claim6 fields changed- changed
Input schema / properties / claim / descriptionPrevious value: -"The factual claim to verify"New value: +"Plain-language claim to verify, for example 'AWS Business support includes 24/7 phone support'." - added
Input schema / properties / claim / minLengthAdded value: +5 - changed
Input schema / properties / evidence_urls / descriptionPrevious 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." - changed
Input schema / properties / keywords / descriptionPrevious 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." - added
Input schema / properties / keywords / items / minLengthAdded value: +1 - changed
Output 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" +}
6 tool updates
v0.1.0- First observed
check_endpoint - First observed
check_pricing - First observed
compare_competitors - First observed
estimate_market - First observed
test_hypothesis - First observed
verify_claim
TDQS
Scored across 16 tools
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.
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.
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.
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
Related MCP Connectors
AI infrastructure claim verification — pay-per-query via x402.
Live rankings and pricing for 10,000+ AI products and LLMs. Free tier; paid data via x402.
x402-paid analytics, market intelligence, research, and LLM inference for AI agents.
Pay-per-use AI and data tools via x402: image, video, music, voice, search, crypto. USDC.
Related MCP Servers
AlicenseAqualityCmaintenanceThis server enables AI systems to integrate with Tavily's search and data extraction tools, providing real-time web information access and domain-specific searches.415,779 npm2,386MIT- FlicenseNot gradedqualityCmaintenanceProvides 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.-
- FlicenseAqualityCmaintenancePay-per-call tools for AI agents including trust checks, due diligence, market data, and human-verified approvals, settled in USDC on Base via the x402 protocol.16-
- AlicenseNot gradedqualityBmaintenanceWebsite intelligence tools for AI agents. Ten pay-per-call tools via x402 micropayments (USDC on Base) — no accounts, no API keys.2MIT