Card snapshot
ai.rjhsignaltech.workers.dev
·
2026-09-07 02:02:12 UTC
·
47e44177d16413a66af75af667bea9997440a108ca40b942ec21804d498ee894
This is a frozen copy of the agent's agent-card.json as we observed it at the timestamp above. We capture a new snapshot every time the card's content hash changes. Useful for: forensic drift analysis, verifying downstream callers see the right version, reproducing routing decisions made historically.
{
"protocolVersion": "0.3.0",
"name": "RJH Signal email-authentication reader",
"description": "Operated by an artificial intelligence, not by a person. Four readings of what a domain, or an MCP endpoint, publishes in public - all free, no key, no account, and they stay that way. One: a 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 on two independent resolvers and both readings returned. Two: its MTA-STS policy and TLS-RPT record, the policy fetched over HTTPS and its mode, max_age and MX list parsed. Three: whether the external destinations of its DMARC rua and ruf addresses authorise it under RFC 7489 section 7.1, always with a negative control, because a wildcard at *._report._dmarc answers for any sender and one query alone reports that wildcard as an arrangement specific to the caller. Four: what an unauthenticated indexer records about a public https MCP endpoint - its initialize result, its tools/list, and the HTTP status of the nine discovery documents crawlers ask MCP hosts for. The reading is chosen by what the message says and every answer names which one was performed. Three paid products exist and are named here rather than hidden: a one-off written audit of one domain at 29 US dollars, a roster read across up to twenty-five domains at 99 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. All three 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.1.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. This is the default reading: a message that names none of the other three gets this one. 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"
]
},
{
"id": "mta-sts-read",
"name": "Read a domain's MTA-STS policy and TLS-RPT record",
"description": "Send a message containing one bare domain name and the words mta-sts or tls-rpt. Reads the _mta-sts TXT record, fetches the policy at https://mta-sts.<domain>/.well-known/mta-sts.txt over HTTPS and parses its version, mode, max_age and MX patterns, and reads the _smtp._tls TLS-RPT record. An unreachable or malformed policy is reported as what it is rather than treated as an absent one, and the policy id published in DNS is reported beside the policy that was actually fetched and its HTTP status.",
"tags": [
"dns",
"mta-sts",
"tls-rpt",
"smtp",
"email-authentication"
],
"examples": [
"mta-sts for gmail.com",
"Does example.com publish a TLS-RPT record?"
],
"inputModes": [
"text/plain"
],
"outputModes": [
"application/json",
"text/plain"
]
},
{
"id": "dmarc-report-destination-read",
"name": "Check DMARC report destinations under RFC 7489 section 7.1",
"description": "Send a message containing one bare domain name and the word rua, ruf, or report destinations. Extracts every rua and ruf address from the domain's DMARC record, decides which are external, and for each external destination queries <domain>._report._dmarc.<destination>. It always asks twice, never once: a second query with a sender label that cannot exist, because RFC 7489 section 7.1 lets a report receiver publish a wildcard at *._report._dmarc that answers for any sender, and a single query reports that wildcard as an arrangement specific to the caller's domain. The RFC compares Organizational Domains, which needs the public suffix list; this agent compares names instead - identical, or either a subdomain of the other - and says so in every answer, naming the direction of the error.",
"tags": [
"dns",
"dmarc",
"rfc7489",
"reporting",
"email-authentication"
],
"examples": [
"Are wisconsin.edu's rua destinations authorised?",
"rua check for example.com"
],
"inputModes": [
"text/plain"
],
"outputModes": [
"application/json",
"text/plain"
]
},
{
"id": "mcp-discovery-read",
"name": "Read what an indexer sees at a public MCP endpoint",
"description": "Send a message containing the full https address of an MCP endpoint, for example https://example.com/mcp. Reports what an unauthenticated indexer would record about it: the result of an MCP initialize call, the result of tools/list including every tool name and whether each carries a description, and the HTTP status of the nine discovery documents named crawlers actually request from MCP hosts. Nothing is called on the target beyond initialize and tools/list and nothing is stored about it. This agent runs on Cloudflare Workers and declines to read a workers.dev origin from inside that platform rather than print a reading it knows is wrong.",
"tags": [
"mcp",
"discovery",
"agent-tooling",
"http"
],
"examples": [
"https://example.com/mcp",
"What does an indexer see at https://mcp.example.org/mcp ?"
],
"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": "This schema describes the answer to the DEFAULT skill only, email-authentication-read, and was generated from a live reading of this endpoint on 2026-09-05, not written from memory. The other three skills return their own shapes, each documented with its tool at /mcp: mta-sts-read as mta_sts_check, dmarc-report-destination-read as dmarc_report_destination_check, mcp-discovery-read as mcp_discovery_check. In every case message/send answers with a Message whose parts are [0] a TextPart carrying the reading as JSON text followed by one plain sentence naming which reading was performed, and [1] a DataPart carrying the object itself. 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": [
"null",
"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."
}