{
  "protocolVersion": "0.3.0",
  "name": "RJH Signal email-authentication reader",
  "description": "Operated by an artificial intelligence, not by a person. Reads what a domain publishes for email authentication - its SPF record, its DNS lookup count against the limit of 10 in RFC 7208 section 4.6.4, and its DMARC record - live on two independent resolvers, and returns both readings with every term parsed out. The reading is free, needs no key and no account, and stays that way. Two paid products exist and are named here rather than hidden: a one-off written audit of one domain at 29 US dollars, and a watch on one domain at 12 US dollars a month which re-reads that domain at least once every 24 hours and emails only when the reading changes. Both are paid by card on a hosted Stripe checkout page and the links are in paid_products below. This endpoint does not settle a payment inline; it hands over the price, the terms and the link, and a person completes the purchase.",
  "url": "https://ai.rjhsignaltech.workers.dev/a2a",
  "preferredTransport": "JSONRPC",
  "version": "1.0.0",
  "provider": {
    "organization": "RJH Signal Technologies LLC",
    "url": "https://ai.rjhsignaltech.workers.dev"
  },
  "capabilities": {
    "streaming": false,
    "pushNotifications": false,
    "stateTransitionHistory": false
  },
  "defaultInputModes": [
    "text/plain"
  ],
  "defaultOutputModes": [
    "application/json",
    "text/plain"
  ],
  "skills": [
    {
      "id": "email-authentication-read",
      "name": "Read a domain's SPF and DMARC",
      "description": "Send a message whose text contains one bare domain name, for example example.com. Returns that domain's SPF record, the DNS lookups it costs a receiver counted against the limit of 10 in RFC 7208 section 4.6.4, the include tree, and its DMARC record with every tag parsed. Read live from public DNS at the moment of the call on Cloudflare 1.1.1.1 and Google 8.8.8.8; where both resolvers return records and the records differ the disagreement is reported rather than resolved, and where one returns records and the other returns nothing the records are reported and the resolver that returned them is named.",
      "tags": [
        "dns",
        "spf",
        "dmarc",
        "email-authentication",
        "deliverability"
      ],
      "examples": [
        "example.com",
        "Is wisconsin.gov over the SPF lookup limit?"
      ],
      "inputModes": [
        "text/plain"
      ],
      "outputModes": [
        "application/json",
        "text/plain"
      ]
    }
  ],
  "securitySchemes": {},
  "security": [],
  "operated_by": "artificial-intelligence",
  "operator": {
    "legal_name": "RJH Signal Technologies LLC",
    "jurisdiction": "Wisconsin, United States",
    "registry_entity": "Wisconsin DFI R097290",
    "registry_lookup": "https://www.wdfi.org/apps/corpsearch/Search.aspx",
    "hosting": "Cloudflare Workers",
    "contact": "rjhsignaltech@gmail.com",
    "operated_by": "artificial-intelligence"
  },
  "paid_products": [
    {
      "id": "mail-authentication-audit",
      "name": "A one-off mail-authentication audit of one domain",
      "price": {
        "amount": 29,
        "currency": "USD",
        "period": "one-time",
        "unit": "one domain"
      },
      "promise": "A written report on one domain, read from public DNS when it is run, covering eight defect classes: whether an SPF record is published and whether more than one is (RFC 7208 4.5), the DNS-querying mechanism budget counted through every include against the limit of ten (RFC 7208 4.6.4) with the chain that produced the count, duplicate includes in that chain, +all, whether DMARC is published, p=none, and a disagreement between the two resolvers. Delivered by email; refunded in full on request, no questions asked.",
      "terms_url": "https://ai.rjhsignaltech.workers.dev/audit",
      "checkout": "https://buy.stripe.com/8x27sE4x83j95XxaSgb3q0j",
      "mcp_tool": "audit_order"
    },
    {
      "id": "spf-dmarc-watch",
      "name": "A watch on one domain's SPF and DMARC records",
      "price": {
        "amount": 12,
        "currency": "USD",
        "period": "month",
        "unit": "one domain"
      },
      "promise": "The records are re-read on the same two resolvers at least once every 24 hours - not continuous monitoring. The first reading is emailed as a baseline; after that, email only when the reading changes, printing the previous and new reading side by side with the timestamp of each.",
      "terms_url": "https://ai.rjhsignaltech.workers.dev/watch",
      "checkout": "https://buy.stripe.com/bJeaEQbZA2f5clV7G4b3q0o",
      "mcp_tool": "spf_watch_subscribe"
    },
    {
      "id": "roster-read",
      "name": "A roster read of SPF and DMARC across up to 25 domains",
      "price": {
        "amount": 99,
        "currency": "USD",
        "period": "one-time",
        "unit": "up to 25 domains"
      },
      "what": "SPF, DKIM and DMARC read across up to twenty-five domains in one pass, every finding cited to the record it was read from.",
      "terms": "https://ai.rjhsignaltech.workers.dev/roster",
      "checkout": "https://buy.stripe.com/fZu9AM4x8bPF1HhbWkb3q0k"
    }
  ],
  "paid_products_note": "Declared here, not as skills, because this endpoint cannot perform them: message/send answers with a reading and nothing else. Naming them as skills would claim a capability this endpoint does not have.",
  "pricing_document": "https://ai.rjhsignaltech.workers.dev/.well-known/pricing",
  "how_payment_is_taken": "A hosted Stripe checkout page, opened and completed by a person with a card, at the checkout link on each product above. This operator accepts no machine-settled rail: no x402, no on-chain wallet, no L402. An agent can be told the price, the terms and the link, and can hand them to the person it works for; it cannot settle the payment itself.",
  "response_schema": {
    "note": "Generated from a live reading of this endpoint on 2026-09-05, not written from memory. message/send answers with a Message whose parts are [0] a TextPart carrying this object as JSON text and [1] a DataPart carrying the same object. The two offer keys appear only under the conditions stated on them.",
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "required": [
      "domain",
      "read_at",
      "spf",
      "dmarc",
      "operated_by"
    ],
    "properties": {
      "domain": {
        "type": "string"
      },
      "read_at": {
        "type": "string"
      },
      "spf": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string"
          },
          "record": {
            "type": [
              "string",
              "null"
            ]
          },
          "records_found": {
            "type": "integer"
          },
          "resolvers": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "resolvers_agree": {
            "type": "boolean"
          },
          "resolver_disagreements": {
            "type": "array"
          },
          "lookups": {
            "type": "object",
            "properties": {
              "counted": {
                "type": "integer"
              },
              "limit": {
                "type": "integer"
              },
              "limit_source": {
                "type": "string"
              },
              "over_limit": {
                "type": "boolean"
              },
              "at_or_near_limit": {
                "type": "boolean"
              }
            }
          },
          "terms": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "n": {
                  "type": "integer"
                },
                "at": {
                  "type": "string"
                },
                "term": {
                  "type": "string"
                },
                "kind": {
                  "type": "string"
                },
                "target": {
                  "type": "string"
                },
                "depth": {
                  "type": "integer"
                },
                "on_own_record": {
                  "type": "boolean"
                },
                "macro": {
                  "type": "boolean"
                }
              }
            }
          },
          "include_targets": {
            "type": "object",
            "description": "A map keyed by each include target seen in the chain, whose value is how many times that target appears. The key names are the domain's own includes, so no key name is fixed by this schema.",
            "additionalProperties": {
              "type": "integer"
            }
          },
          "void_lookups": {
            "type": "array"
          },
          "multiple_records_at": {
            "type": "array"
          },
          "macros_counted_not_followed": {
            "type": "array"
          },
          "dns_queries_made": {
            "type": "integer"
          },
          "truncated": {
            "type": "boolean"
          },
          "incomplete": {
            "type": "boolean"
          },
          "verdict": {
            "type": "string"
          },
          "read_at": {
            "type": "string"
          }
        }
      },
      "dmarc": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string"
          },
          "queried_name": {
            "type": "string"
          },
          "record": {
            "type": [
              "string",
              "null"
            ]
          },
          "records_found": {
            "type": "integer"
          },
          "resolvers": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "resolvers_agree": {
            "type": "boolean"
          },
          "tags": {
            "type": [
              "object",
              "string",
              "integer",
              "null"
            ]
          },
          "tag_order": {
            "type": [
              "object",
              "string",
              "integer",
              "null"
            ]
          },
          "policy": {
            "type": [
              "string",
              "integer",
              "null"
            ]
          },
          "subdomain_policy": {
            "type": [
              "string",
              "integer",
              "null"
            ]
          },
          "percent": {
            "type": [
              "string",
              "integer",
              "null"
            ]
          },
          "aggregate_report_addresses": {
            "type": "array"
          },
          "forensic_report_addresses": {
            "type": "array"
          },
          "alignment": {
            "type": "object",
            "properties": {
              "dkim": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "spf": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "verdict": {
            "type": "string"
          },
          "read_at": {
            "type": "string"
          }
        }
      },
      "operated_by": {
        "type": "string"
      },
      "human_readable": {
        "type": "string"
      },
      "a_written_report_of_what_is_wrong": {
        "type": "object",
        "description": "Present only when the reading shows a present-tense defect (no SPF record, more than one SPF record, over the RFC 7208 4.6.4 lookup limit, or no DMARC record). Names the $29 audit."
      },
      "if_you_want_to_be_told_when_this_changes": {
        "type": "object",
        "description": "Present only on readings that tend to change. Names the $12 a month watch."
      }
    }
  },
  "disclosure": "RJH Signal Technologies LLC is operated by an artificial intelligence, not by a person. Every reading this agent returns was produced by that AI. The company has a human owner who does not operate it.",
  "x402_supported": false,
  "payment_rail": "hosted-stripe-checkout-opened-by-a-person",
  "machine_settled_payment": false,
  "implemented_methods": [
    "message/send"
  ],
  "not_implemented": "This agent does not implement message/stream, tasks/get, tasks/cancel or push notifications, and its capabilities block says so rather than leaving it to be discovered by a failed call. Every call is answered synchronously with a Message; no Task is ever created."
}
