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 indicate readOnly, idempotent. The description adds important caveats: it is a 'signal scanner, not proof of certification or legal sufficiency,' and lists signals scanned. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that are front-loaded with purpose and usage, followed by a list of scanned signals and a caveat. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of output schema and annotations, the description is sufficiently complete: it covers purpose, when to use, what is scanned, and limitations. No gaps for an agent to misuse the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single 'url' parameter. The description adds meaningful context by specifying the type of URLs acceptable (public trust, security, compliance, policy pages) and listing what signals are scanned, enhancing the schema's basic description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool scans public compliance/trust pages for enterprise buying signals, listing specific items like SOC 2, ISO 27001. It distinctively targets compliance posture verification, differentiating it from siblings like check_endpoint or check_pricing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description specifies when to use: 'before you claim a vendor supports a particular compliance posture.' It also clarifies what it is not ('signal scanner, not proof'). However, it does not explicitly mention when not to use or provide alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_endpointEndpoint Reachability 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?
Annotations already provide readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds further behavioral context by explaining it's unauthenticated, reports HTTP status, content type, elapsed time, auth/rate-limit signals, and a response sample, and notes that success only proves basic reachability at fetch time. This goes beyond annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three well-structured sentences. The first sentence states purpose and when to use, the second explains what the tool reports, and the third provides a strong 'do not use' warning. Every sentence is essential and adds value, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter and an output schema), the description covers purpose, usage guidelines, behavioral details, and limitations comprehensively. It tells the agent when to use, what it returns, and what not to expect, making it fully sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has one parameter (url) with 100% description coverage. The description adds extra information beyond the schema by specifying that bare domains are accepted and normalized to https:// automatically, which helps the agent understand how to provide the URL.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool performs a live, unauthenticated fetch against a public URL or API endpoint, and specifies its purpose: to check reachability before recommending, documenting, or building on top of an endpoint. It distinguishes from siblings by focusing on simple reachability questions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool (before recommending, documenting, or building on top) and provides clear alternatives: it should not be used for authenticated flows, POST side effects, JavaScript execution, or deeper business logic. This gives the agent explicit guidance on when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_pricingPricing Page 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 provide readOnly, idempotent, openWorld hints. Description adds valuable behavioral context: returns cache information, results cached for 5 minutes, extracts heuristic labels and free signals, and warns about limitations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is four sentences, front-loaded with main action, no unnecessary words. Each sentence adds essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given single parameter and existence of output schema, description fully covers what the tool does, returns, and its limitations. It is complete for an agent to decide and use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameter description, providing clear guidance on URL format. Description reinforces the context of having a likely pricing URL. Additional advice on preferring specific pages over generic homepages adds value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool fetches a public pricing page and extracts first-pass pricing signals. It specifies the specific verb 'fetch' and resource 'pricing page', and distinguishes from siblings like compare_pricing_pages by focusing on a single URL quick scan.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this when you already have a likely pricing URL and need a quick live scan.' Lists what it does not do (map prices to exact plans, normalize currencies, etc.) and limitations (JS-rendered, logged-in pages may be missed).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_competitorsNamed Package 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?
Discloses return format (per-package registry metadata in input order), field variability by registry, handling of missing packages (found=false), and caching (5 minutes). Annotations already show read-only, non-destructive, idempotent, open-world; description adds useful context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with purpose, then use cases, output behavior, and caching/exclusions. No wasted words, well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 2 parameters, output schema, rich annotations, and description covering inputs, outputs, edge cases (missing packages), prohibitions, and caching, the tool is fully specified for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers both parameters with descriptions; description reinforces with examples ('react', 'vue') and constraints (exact names, same registry). Since schema coverage is 100%, baseline is 3; description adds marginal extra meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'compare' and resource 'exact package names using live npm or PyPI metadata'. It differentiates from sibling tools like estimate_market by focusing on known packages, not discovery.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (known candidates needing evidence for claims like newer, maintained, different licenses) and when not to use (discovery, market size, cross-registry). Provides clear exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_pricing_pagesPricing Page 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 readOnlyHint true, destructiveHint false, idempotentHint true, openWorldHint true. The description adds valuable behavioral context: output is heuristic and page-level, and clarifies what the tool does not do (mapping every price or normalizing regional billing). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two sentences, both front-loaded with key information. Every word adds value—no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (not shown but indicated), the description adequately explains the tool's behavior, limitations, and usage. It is complete enough for an agent to invoke correctly without additional clarification.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description adds extra context about how the parameters are used (name as label in output, url as page URL) and the overall purpose, which enriches the agent's understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Compare') and resource ('public pricing pages') and clearly defines the scope (two to five, side-by-side). It distinguishes this tool from siblings such as 'compare_competitors' and 'check_pricing' by focusing on live, heuristic comparison of visible prices and signals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use: 'Use this when you want a quick, live comparison...' and sets expectations by noting limitations (heuristic, page-level, does not map every price or normalize regional differences). It provides clear context for appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_monitorCreate MonitorAInspect
Create a persistent monitor that tracks a URL, pricing page, package version, endpoint status, vendor claim, or custom keyword pattern over time. Monitors run automatically on their configured schedule (hourly/daily/weekly) via the Cloudflare cron trigger, or on demand with run_monitor_now. Results are stored in the Durable Object SQLite database. Requires a team API key.
| 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 mark the tool as read-only and idempotent. The description adds valuable context: responses are cached for 5 minutes and results reflect search counts, not market share. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with a clear front-loaded purpose, followed by usage guidelines and behavioral notes. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has only two parameters, full schema coverage, and rich annotations, the description covers all necessary aspects: purpose, usage, limitations, and caching behavior. Output schema handles return value documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already fully documents both parameters. The description mentions 'live result counts plus representative matches' as output but does not add parameter-specific meaning beyond what's in the schema. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches npm or PyPI to estimate market crowdedness, with a specific verb ('Search') and resource (package registries). It distinctly differs from sibling tools that focus on compliance, security, or pricing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use (evaluating category crowdedness) and when not to use (comparing exact packages, inferring adoption from downloads). It also mentions caching behavior and provides context about what the tool reflects.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_change_reportGenerate Change 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?
The description discloses key behavioral traits: tests run in order with no branching, no early exit, and the verdict is mechanical. Annotations already indicate readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true, which are consistent with the description. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (5 sentences) and well-structured, with the most important information front-loaded. Every sentence adds value: purpose, usage, behavioral details, and alternatives.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multi-step with multiple test types) and the presence of annotations and output schema, the description is complete. It covers the verdict logic, ordering constraints, and coordination nature, leaving no obvious gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds overall context about the coordination role and test execution logic, which helps the agent understand how to construct the 'tests' array, even though it doesn't add new details per parameter beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Run a small verification plan made of concrete live checks and summarize whether a hypothesis is supported.' It uses specific verbs ('run', 'summarize') and distinguishes from siblings like verify_claim, estimate_market, and compare_competitors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use this tool ('when one conclusion depends on multiple simple checks') and provides alternatives for other scenarios. It also clarifies what the tool is not ('not an open-ended research agent') and lists specific use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_claimClaim Support 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. Dates show when Glama detected each change.
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
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
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
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.
x402-paid tools: EU company & sanctions data, web search, LLM chat, crypto intel, x402 monitoring.
Related MCP Servers
AlicenseAqualityDmaintenanceThis server enables AI systems to integrate with Tavily's search and data extraction tools, providing real-time web information access and domain-specific searches.420,8992,370MIT- FlicenseNot gradedqualityDmaintenanceProvides 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
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/anish632/ground-truth-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server