Skip to main content
Glama

AstraVerify Domain Trust Check

Domain Trust report (both scores)

get_report
Idempotent

Both AstraVerify scores for a domain, plus a shareable report link. Reach for this first on any broad question - "is my domain set up right?", "check my domain", "what should I fix first?" - and use the single-subject tools only once the person has narrowed it to email or to the website. Input: a bare domain like example.com. Returns the Email Security score, the Discoverability score, every open fix ranked critical then important then informational, and report_url. Work down that order. Some findings are marked as needing no action - a weak key the provider generates and the owner cannot replace, for instance - so do not present those as work. Unlike the other tools here, this one creates something: report_url is a snapshot of these findings saved to a new unlisted page at astraverify.com/r/..., and that page is what the person can send to whoever administers the domain. It opens later without rescanning, after the scan itself has aged out. Running the tool again on an unchanged scan returns the same page rather than a second one. Nothing is written anywhere the person owns. Set include_history to answer "has this improved?" or "did my fix land?": it adds the first and latest reading of each score, the move between them, and only the dates the score actually changed. A domain we have not watched before says so rather than reporting a flat line.

Input Schema

NameRequiredDescriptionDefault
domainYesThe domain to check, as the person gave it (no scheme, no path). Reserved names such as example.com are refused.
refreshNoForce a fresh scan instead of the cached result (rate limited)
include_historyNoAlso return how these scores have moved over time, and when

Output Schema

NameRequiredDescriptionDefault
domainYes
historyNoPresent only when include_history was set.
live_urlNoThe live page, which rescans when the result is stale
report_urlNoSaved snapshot (/r/<id>) that opens without a rescan; safe to share
request_idNoreq_... for this call. Quote it when reporting a problem with the result.
website_atNoWhen the domain asked about serves no website but its registrable domain does, that domain's discoverability result. The score belongs to `domain` here, not to the domain in the request.
email_securityYes
discoverabilityNo
recommendationsNoBoth scans, ranked by severity
discoverability_errorNo
email_cache_age_secondsNo
discoverability_cache_age_secondsNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedInput schema / properties / include_history
      Added value: +{
      +  "description": "Also return how these scores have moved over time, and when",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / history
      Added value: +{
      +  "description": "Present only when include_history was set.",
      +  "properties": {
      +    "discoverability": {
      +      "properties": {
      +        "change": {
      +          "description": "Points between the first and latest reading. Null when there is only one.",
      +          "type": [
      +            "integer",
      +            "null"
      +          ]
      +        },
      +        "first": {
      +          "properties": {
      +            "at": {
      +              "type": "string"
      +            },
      +            "change": {
      +              "description": "Points moved since the previous reading",
      +              "type": [
      +                "integer",
      +                "null"
      +              ]
      +            },
      +            "grade": {
      +              "type": "string"
      +            },
      +            "open_fixes": {
      +              "type": "integer"
      +            },
      +            "score": {
      +              "type": "integer"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "latest": {
      +          "properties": {
      +            "at": {
      +              "type": "string"
      +            },
      +            "change": {
      +              "description": "Points moved since the previous reading",
      +              "type": [
      +                "integer",
      +                "null"
      +              ]
      +            },
      +            "grade": {
      +              "type": "string"
      +            },
      +            "open_fixes": {
      +              "type": "integer"
      +            },
      +            "score": {
      +              "type": "integer"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "readings": {
      +          "type": "integer"
      +        },
      +        "transitions": {
      +          "description": "Only the readings where the score moved",
      +          "items": {
      +            "properties": {
      +              "at": {
      +                "type": "string"
      +              },
      +              "change": {
      +                "description": "Points moved since the previous reading",
      +                "type": [
      +                  "integer",
      +                  "null"
      +                ]
      +              },
      +              "grade": {
      +                "type": "string"
      +              },
      +              "open_fixes": {
      +                "type": "integer"
      +              },
      +              "score": {
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "verdict": {
      +          "description": "One sentence, safe to quote. Says plainly when there is no history yet.",
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "email_security": {
      +      "properties": {
      +        "change": {
      +          "description": "Points between the first and latest reading. Null when there is only one.",
      +          "type": [
      +            "integer",
      +            "null"
      +          ]
      +        },
      +        "first": {
      +          "properties": {
      +            "at": {
      +              "type": "string"
      +            },
      +            "change": {
      +              "description": "Points moved since the previous reading",
      +              "type": [
      +                "integer",
      +                "null"
      +              ]
      +            },
      +            "grade": {
      +              "type": "string"
      +            },
      +            "open_fixes": {
      +              "type": "integer"
      +            },
      +            "score": {
      +              "type": "integer"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "latest": {
      +          "properties": {
      +            "at": {
      +              "type": "string"
      +            },
      +            "change": {
      +              "description": "Points moved since the previous reading",
      +              "type": [
      +                "integer",
      +                "null"
      +              ]
      +            },
      +            "grade": {
      +              "type": "string"
      +            },
      +            "open_fixes": {
      +              "type": "integer"
      +            },
      +            "score": {
      +              "type": "integer"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "readings": {
      +          "type": "integer"
      +        },
      +        "transitions": {
      +          "description": "Only the readings where the score moved",
      +          "items": {
      +            "properties": {
      +              "at": {
      +                "type": "string"
      +              },
      +              "change": {
      +                "description": "Points moved since the previous reading",
      +                "type": [
      +                  "integer",
      +                  "null"
      +                ]
      +              },
      +              "grade": {
      +                "type": "string"
      +              },
      +              "open_fixes": {
      +                "type": "integer"
      +              },
      +              "score": {
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "verdict": {
      +          "description": "One sentence, safe to quote. Says plainly when there is no history yet.",
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  2. Changed4 schema fields changed
    • addedOutput schema / properties / discoverability / properties / website_at / properties / components
      Added value: +{
      +  "description": "Component headlines only; scan this domain for the checks behind them",
      +  "items": {
      +    "properties": {
      +      "key": {
      +        "type": "string"
      +      },
      +      "max": {
      +        "type": "integer"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "points": {
      +        "type": "integer"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / discoverability / properties / website_at / properties / report_url
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / website_at / properties / components
      Added value: +{
      +  "description": "Component headlines only; scan this domain for the checks behind them",
      +  "items": {
      +    "properties": {
      +      "key": {
      +        "type": "string"
      +      },
      +      "max": {
      +        "type": "integer"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "points": {
      +        "type": "integer"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / website_at / properties / report_url
      Added value: +{
      +  "type": "string"
      +}
  3. Changed2 schema fields changed
    • addedOutput schema / properties / discoverability / properties / website_at
      Added value: +{
      +  "description": "When the domain asked about serves no website but its registrable domain does, that domain's discoverability result. The score belongs to `domain` here, not to the domain in the request.",
      +  "properties": {
      +    "cache_age_seconds": {
      +      "type": "integer"
      +    },
      +    "domain": {
      +      "type": "string"
      +    },
      +    "grade": {
      +      "type": "string"
      +    },
      +    "open_fixes": {
      +      "type": "integer"
      +    },
      +    "score": {
      +      "type": "integer"
      +    },
      +    "verdict": {
      +      "type": "string"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / website_at
      Added value: +{
      +  "description": "When the domain asked about serves no website but its registrable domain does, that domain's discoverability result. The score belongs to `domain` here, not to the domain in the request.",
      +  "properties": {
      +    "cache_age_seconds": {
      +      "type": "integer"
      +    },
      +    "domain": {
      +      "type": "string"
      +    },
      +    "grade": {
      +      "type": "string"
      +    },
      +    "open_fixes": {
      +      "type": "integer"
      +    },
      +    "score": {
      +      "type": "integer"
      +    },
      +    "verdict": {
      +      "type": "string"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  4. Changed2 schema fields changed
    • addedOutput schema / properties / discoverability / properties / request_id
      Added value: +{
      +  "description": "req_... for this call. Quote it when reporting a problem with the result.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / request_id
      Added value: +{
      +  "description": "req_... for this call. Quote it when reporting a problem with the result.",
      +  "type": "string"
      +}
  5. Changed4 schema fields changed
    • addedOutput schema / properties / discoverability / properties / held_back
      Added value: +{
      +  "description": "Points the cap holds back while a fix is open (89 cap) or a critical one is (69). Not taken from any component: sum(components.points) - held_back = score",
      +  "type": "integer"
      +}
    • changedOutput schema / properties / discoverability / properties / raw / description
      Previous value: -"Before the cap rules that hold the headline back while a fix is open"New value: +"What the components add up to, before the cap"
    • addedOutput schema / properties / email_security / properties / held_back
      Added value: +{
      +  "description": "Points the cap holds back while a fix is open (89 cap) or a critical one is (69). Not taken from any component: sum(components.points) - held_back = score",
      +  "type": "integer"
      +}
    • changedOutput schema / properties / email_security / properties / raw / description
      Previous value: -"Before the cap rules that hold the headline back while a fix is open"New value: +"What the components add up to, before the cap"
  6. Changed39 schema fields changed
    • addedOutput schema / properties / discoverability / properties / canonical_host
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / discoverability / properties / cdn
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / discoverability / properties / grade / description
      Previous value: -"A+ to F"New value: +"A+ to F, or null alongside a null score"
    • changedOutput schema / properties / discoverability / properties / grade / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / discoverability / properties / inconclusive
      Added value: +{
      +  "description": "The site could not be fetched, so the scan could not be completed. A failure to measure, not a finding about the site.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / discoverability / properties / not_applicable
      Added value: +{
      +  "description": "The domain publishes no web address, so there is no website to assess. Not a low score: score and grade are null and there are no recommendations. verdict names the domain to scan instead.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / discoverability / properties / not_checked
      Added value: +{
      +  "description": "Parts skipped in this scan",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / discoverability / properties / reason
      Added value: +{
      +  "description": "Why score is null, when it is",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / discoverability / properties / recommendations / items / properties / fix / description
      Previous value: -"The exact change to publish: a DNS record (name, type, value) or a file or tag (kind, label, value, where)"New value: +"The exact change to publish: a DNS record (name, type, value) or a file or tag (kind, label, value, where). Null when there is nothing to publish, for example \"turn on DKIM in your provider\"."
    • changedOutput schema / properties / discoverability / properties / recommendations / items / properties / fix / properties / kind / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / discoverability / properties / recommendations / items / properties / fix / properties / label / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / discoverability / properties / recommendations / items / properties / fix / properties / name / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / discoverability / properties / recommendations / items / properties / fix / properties / note / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / discoverability / properties / recommendations / items / properties / fix / properties / type / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / discoverability / properties / recommendations / items / properties / fix / properties / value / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / discoverability / properties / recommendations / items / properties / fix / properties / where / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / discoverability / properties / recommendations / items / properties / fix / type
      Previous value: -"object"New value: +[
      +  "object",
      +  "null"
      +]
    • changedOutput schema / properties / discoverability / properties / score / description
      Previous value: -"Out of 100, exactly as astraverify.com shows it"New value: +"Out of 100, exactly as astraverify.com shows it. Null when not_applicable or inconclusive is set."
    • changedOutput schema / properties / discoverability / properties / score / type
      Previous value: -"integer"New value: +[
      +  "integer",
      +  "null"
      +]
    • addedOutput schema / properties / discoverability / properties / verdict / description
      Added value: +"One sentence on what engines can do with the site"
    • addedOutput schema / properties / discoverability / properties / verified_component
      Added value: +{
      +  "description": "Set by verify_fix: the component re-checked",
      +  "type": "string"
      +}
    • changedOutput schema / properties / email_security / properties / recommendations / items / properties / fix / description
      Previous value: -"The exact change to publish: a DNS record (name, type, value) or a file or tag (kind, label, value, where)"New value: +"The exact change to publish: a DNS record (name, type, value) or a file or tag (kind, label, value, where). Null when there is nothing to publish, for example \"turn on DKIM in your provider\"."
    • changedOutput schema / properties / email_security / properties / recommendations / items / properties / fix / properties / kind / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / email_security / properties / recommendations / items / properties / fix / properties / label / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / email_security / properties / recommendations / items / properties / fix / properties / name / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / email_security / properties / recommendations / items / properties / fix / properties / note / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / email_security / properties / recommendations / items / properties / fix / properties / type / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / email_security / properties / recommendations / items / properties / fix / properties / value / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / email_security / properties / recommendations / items / properties / fix / properties / where / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / email_security / properties / recommendations / items / properties / fix / type
      Previous value: -"object"New value: +[
      +  "object",
      +  "null"
      +]
    • changedOutput schema / properties / recommendations / items / properties / fix / description
      Previous value: -"The exact change to publish: a DNS record (name, type, value) or a file or tag (kind, label, value, where)"New value: +"The exact change to publish: a DNS record (name, type, value) or a file or tag (kind, label, value, where). Null when there is nothing to publish, for example \"turn on DKIM in your provider\"."
    • changedOutput schema / properties / recommendations / items / properties / fix / properties / kind / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / recommendations / items / properties / fix / properties / label / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / recommendations / items / properties / fix / properties / name / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / recommendations / items / properties / fix / properties / note / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / recommendations / items / properties / fix / properties / type / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / recommendations / items / properties / fix / properties / value / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / recommendations / items / properties / fix / properties / where / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / recommendations / items / properties / fix / type
      Previous value: -"object"New value: +[
      +  "object",
      +  "null"
      +]
  7. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "discoverability": {
      +      "properties": {
      +        "cache_age_seconds": {
      +          "description": "Age of the result; 0 means it was scanned just now",
      +          "type": "integer"
      +        },
      +        "capped": {
      +          "type": "boolean"
      +        },
      +        "components": {
      +          "items": {
      +            "description": "One scored area of the domain",
      +            "properties": {
      +              "enabled": {
      +                "type": "boolean"
      +              },
      +              "key": {
      +                "type": "string"
      +              },
      +              "max": {
      +                "type": "integer"
      +              },
      +              "name": {
      +                "type": "string"
      +              },
      +              "points": {
      +                "type": "integer"
      +              },
      +              "summary": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "key",
      +              "name",
      +              "points",
      +              "max"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "domain": {
      +          "type": "string"
      +        },
      +        "grade": {
      +          "description": "A+ to F",
      +          "type": "string"
      +        },
      +        "open_fixes": {
      +          "description": "Findings above info level",
      +          "type": "integer"
      +        },
      +        "raw": {
      +          "description": "Before the cap rules that hold the headline back while a fix is open",
      +          "type": "integer"
      +        },
      +        "recommendations": {
      +          "items": {
      +            "properties": {
      +              "component": {
      +                "type": "string"
      +              },
      +              "fix": {
      +                "description": "The exact change to publish: a DNS record (name, type, value) or a file or tag (kind, label, value, where)",
      +                "properties": {
      +                  "kind": {
      +                    "type": "string"
      +                  },
      +                  "label": {
      +                    "type": "string"
      +                  },
      +                  "name": {
      +                    "type": "string"
      +                  },
      +                  "note": {
      +                    "type": "string"
      +                  },
      +                  "type": {
      +                    "type": "string"
      +                  },
      +                  "value": {
      +                    "type": "string"
      +                  },
      +                  "where": {
      +                    "type": "string"
      +                  }
      +                },
      +                "type": "object"
      +              },
      +              "id": {
      +                "type": "string"
      +              },
      +              "scan": {
      +                "enum": [
      +                  "email",
      +                  "discoverability"
      +                ],
      +                "type": "string"
      +              },
      +              "severity": {
      +                "enum": [
      +                  "critical",
      +                  "important",
      +                  "info"
      +                ],
      +                "type": "string"
      +              },
      +              "tags": {
      +                "items": {
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              },
      +              "title": {
      +                "type": "string"
      +              },
      +              "why": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "id",
      +              "severity",
      +              "title"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "report_url": {
      +          "description": "The report page for this domain on astraverify.com",
      +          "type": "string"
      +        },
      +        "score": {
      +          "description": "Out of 100, exactly as astraverify.com shows it",
      +          "type": "integer"
      +        },
      +        "verdict": {
      +          "type": "string"
      +        }
      +      },
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "discoverability_cache_age_seconds": {
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "discoverability_error": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "domain": {
      +      "type": "string"
      +    },
      +    "email_cache_age_seconds": {
      +      "type": "integer"
      +    },
      +    "email_security": {
      +      "properties": {
      +        "cache_age_seconds": {
      +          "description": "Age of the result; 0 means it was scanned just now",
      +          "type": "integer"
      +        },
      +        "capped": {
      +          "type": "boolean"
      +        },
      +        "components": {
      +          "items": {
      +            "description": "One scored area of the domain",
      +            "properties": {
      +              "enabled": {
      +                "type": "boolean"
      +              },
      +              "key": {
      +                "type": "string"
      +              },
      +              "max": {
      +                "type": "integer"
      +              },
      +              "name": {
      +                "type": "string"
      +              },
      +              "points": {
      +                "type": "integer"
      +              },
      +              "summary": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "key",
      +              "name",
      +              "points",
      +              "max"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "domain": {
      +          "type": "string"
      +        },
      +        "grade": {
      +          "description": "A+ to F",
      +          "type": "string"
      +        },
      +        "open_fixes": {
      +          "description": "Findings above info level",
      +          "type": "integer"
      +        },
      +        "raw": {
      +          "description": "Before the cap rules that hold the headline back while a fix is open",
      +          "type": "integer"
      +        },
      +        "recommendations": {
      +          "items": {
      +            "properties": {
      +              "component": {
      +                "type": "string"
      +              },
      +              "fix": {
      +                "description": "The exact change to publish: a DNS record (name, type, value) or a file or tag (kind, label, value, where)",
      +                "properties": {
      +                  "kind": {
      +                    "type": "string"
      +                  },
      +                  "label": {
      +                    "type": "string"
      +                  },
      +                  "name": {
      +                    "type": "string"
      +                  },
      +                  "note": {
      +                    "type": "string"
      +                  },
      +                  "type": {
      +                    "type": "string"
      +                  },
      +                  "value": {
      +                    "type": "string"
      +                  },
      +                  "where": {
      +                    "type": "string"
      +                  }
      +                },
      +                "type": "object"
      +              },
      +              "id": {
      +                "type": "string"
      +              },
      +              "scan": {
      +                "enum": [
      +                  "email",
      +                  "discoverability"
      +                ],
      +                "type": "string"
      +              },
      +              "severity": {
      +                "enum": [
      +                  "critical",
      +                  "important",
      +                  "info"
      +                ],
      +                "type": "string"
      +              },
      +              "tags": {
      +                "items": {
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              },
      +              "title": {
      +                "type": "string"
      +              },
      +              "why": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "id",
      +              "severity",
      +              "title"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "report_url": {
      +          "description": "The report page for this domain on astraverify.com",
      +          "type": "string"
      +        },
      +        "score": {
      +          "description": "Out of 100, exactly as astraverify.com shows it",
      +          "type": "integer"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "live_url": {
      +      "description": "The live page, which rescans when the result is stale",
      +      "type": "string"
      +    },
      +    "recommendations": {
      +      "description": "Both scans, ranked by severity",
      +      "items": {
      +        "properties": {
      +          "component": {
      +            "type": "string"
      +          },
      +          "fix": {
      +            "description": "The exact change to publish: a DNS record (name, type, value) or a file or tag (kind, label, value, where)",
      +            "properties": {
      +              "kind": {
      +                "type": "string"
      +              },
      +              "label": {
      +                "type": "string"
      +              },
      +              "name": {
      +                "type": "string"
      +              },
      +              "note": {
      +                "type": "string"
      +              },
      +              "type": {
      +                "type": "string"
      +              },
      +              "value": {
      +                "type": "string"
      +              },
      +              "where": {
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "id": {
      +            "type": "string"
      +          },
      +          "scan": {
      +            "enum": [
      +              "email",
      +              "discoverability"
      +            ],
      +            "type": "string"
      +          },
      +          "severity": {
      +            "enum": [
      +              "critical",
      +              "important",
      +              "info"
      +            ],
      +            "type": "string"
      +          },
      +          "tags": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "why": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "severity",
      +          "title"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "report_url": {
      +      "description": "Saved snapshot (/r/<id>) that opens without a rescan; safe to share",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "domain",
      +    "email_security"
      +  ],
      +  "type": "object"
      +}
  8. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false; the description goes well beyond them by explaining *why* it is not read-only (it creates an unlisted report_url snapshot), that the page persists after the scan ages out, that re-running on an unchanged scan returns the same page, and that nothing is written anywhere the person owns. It also flags findings that require no action and the include_history behavior on first-time domains.

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

Conciseness4/5

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

The description is long, but it is front-loaded with purpose and routing before the return-value and behavioral detail, and nearly every sentence carries non-obvious information. Minor redundancy: enumerating the returned scores and ranked fixes overlaps with the output schema and with the schema's own coverage.

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

Completeness5/5

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

For a tool with a create-side effect, an output schema, and full parameter coverage, the description fills the remaining gaps: report persistence, idempotency, the critical/important/informational ranking order, and the 'no action needed' caveat. Nothing an agent needs to call or interpret it is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning for include_history — it names the exact question it answers ('has this improved?', 'did my fix land?') and specifies it returns first/latest readings, the delta, and only dates the score changed. Caching/idempotency context also informs refresh, though refresh itself is not elaborated.

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

Purpose5/5

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

States a specific verb and resource — returns both AstraVerify scores for a domain plus a shareable report link — and explicitly distinguishes itself from the single-subject siblings (check_email_security, check_discoverability). An agent can tell exactly what this tool returns and when it is the right one without opening any schema.

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

Usage Guidelines5/5

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

Gives explicit routing: 'Reach for this first on any broad question' and 'use the single-subject tools only once the person has narrowed it to email or to the website.' Both the when and the when-not are stated, with the alternative named.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources