com.clawhard/studio
Registry code: 1f526206eeb2d8ec
Clawhard Studio: small tools for jobs an AI cannot do reliably alone. Use tokendiet_count_tokens for exact token counts and context-window fit; swatch_check_contrast, swatch_fix_contrast, swatch_pick_text_color, swatch_make_scale, swatch_convert_color and swatch_check_pairs for exact WCAG color contrast, the nearest passing color and 50-950 palettes; meridian tools for the real current time, DST-correct time zone conversion and meeting slots; halves_settle_up for the fewest payments that settle a group (halves_create_group_link for a shared page); runsheet_create_schedule for a live shareable…
- endpoint
- https://mcp.clawhard.com/mcp
- door code
- 2420ee527d387936
- protocol
- streamable-http ·2025-06-18
- authentication
- none observed
- public key
- none — nobody has proven they own this listing · is it yours? claim it
- karma
- 0 · newcomer
- Is com.clawhard/studio live?
- Yes — it answered the hub's last check (checked 2h ago). It answered 100% of checks over the last 30 days.
- Is com.clawhard/studio free to use?
- Yes — the hub reached it with no key and no payment.
- What tools does com.clawhard/studio have?
- 25 tools: meridian_meeting_slots, tokendiet_count_tokens, slopscore_check_website, tells_check_writing, runsheet_create_schedule, halves_settle_up, halves_create_group_link, doorman_check_robots_txt, ….
- Is com.clawhard/studio safe to connect?
- The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
90 days 100%· all time 100%
last good check
of 25 tools
- unknown → live
- unknown → live
Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.
through this hub
successful
what callers paid
Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.
aitab_list_ai_plans open 2h ago
Use when the user asks what AI plans cost (ChatGPT, Claude, Gemini, Perplexity, Cursor, Copilot, Midjourney and others), or before aitab_total_ai_subscriptions to look up plan keys. Returns each service with its plans, USD monthly and yearly list prices and the key to pass on. Prices were checked on official pages and carry a checked date; plans marked estimate are unconfirmed. No input. Prefer this over remembering prices, which change often.
{ "type": "object", "properties": {} }arguments 4 linesmeridian_meeting_slots unknown never probed
Use to schedule a call across several places. Scans the day in 15-minute steps and ranks start times so the most people are inside working hours and nobody is at night, using each place's real offset and DST for that date. Returns up to 5 slots with each person's local start and end, and says plainly when no time works for everyone. Defaults: working hours 9 to 17, 60 minutes, date today in the first place.
{ "type": "object", "required": [ "places" ], "properties": { "date": { "type": "string", "maxLength": 10, "description": "Date YYYY-MM-DD, local to the first place. Default today." }, "count": { "type": "integer", "maximum": 8, "minimum": 1, "description": "How many slots to return, default 5." }, "places": { "type": "array", "items": { "type": "string", "maxLength": 60, "minLength": 1 }, "maxItems": 8, "minItems": 2, "description": "Where each attendee is, e.g. [\"San Francisco\",\"London\",\"Tokyo\"]." }, "end_hour": { "type": "integer", "maximum": 24, "minimum": 1, "description": "Working day end hour, default 17." }, "start_hour": { "type": "integer", "maximum": 23, "minimum": 0, "description": "Working day start hour, default 9." }, "duration_minutes": { "type": "integer", "maximum": 480, "minimum": 15, "description": "Meeting length in minutes, multiple of 15. Default 60." } } }arguments 48 linestokendiet_count_tokens unknown never probed
Use when the user asks how many tokens a text, prompt, log, document or code paste is, whether it fits a context window (128K, 200K, 1M), or how big something is before they send it to an AI. Returns the exact o200k token count (GPT-4o family and later; Claude and Gemini usually within about 15%), plus words, characters and how much of each window it uses. Language models cannot count their own tokens, so call this instead of estimating. Example: {"text": "<the text to measure>"}. Not for shortening text.
{ "type": "object", "required": [ "text" ], "properties": { "text": { "type": "string", "description": "The text to count (up to 200,000 characters)." } } }arguments 12 linesslopscore_check_website unknown never probed
Use when the user asks whether a website, landing page or app looks AI-generated or generic, wants a design critique of a live URL, or asks "does my site look like AI slop?". Fetches the page and checks 19 habits (purple-blue gradients, buzzword copy, glassmorphism, icon-card grids, template headlines, app-builder fingerprints and more), then returns a 0-100 score, a verdict, each habit found with the evidence and how to fix it, and the habits that were not found. It is a habit check, not an AI detector. Public http(s) pages only. Example: {"url": "https://example.com"}.
{ "type": "object", "required": [ "url" ], "properties": { "url": { "type": "string", "description": "Public website address, for example example.com or https://example.com/pricing" } } }arguments 12 linestells_check_writing unknown never probed
Use when the user asks whether a piece of writing sounds like AI, wants an email, post, essay or cover letter checked for chatbot habits before sending, or wants to know which phrases to fix. Returns a 0-100 score, a verdict, and each habit found (chatbot words like "delve" and "tapestry", "not X, it's Y" framing, em-dash overuse, assistant filler, fake suspense, stiff transitions, markdown leftovers and more) with examples and why readers notice it. It is a habit check, not an AI detector, and short texts give rough scores. Example: {"text": "<the draft to check>"}. To rewrite, use your own judgment on the flagged habits.
{ "type": "object", "required": [ "text" ], "properties": { "text": { "type": "string", "description": "The writing to check (up to 60,000 characters)." } } }arguments 12 linesrunsheet_create_schedule unknown never probed
Use when the user wants a shareable run-of-show or day-of schedule for a wedding, conference, shoot or other event that guests or crew can open on their phone and that updates live when edited. Creates the page and returns a view link to share with everyone and a private edit link to keep. Start from a template (wedding, conf, shoot, blank) or pass your own items. Example: {"name": "Maya and Sam wedding", "date": "2026-09-12", "timezone": "America/New_York", "template": "wedding"} or {"name": "Offsite", "items": [{"time": "09:00", "title": "Welcome", "duration_minutes": 30}]}. Creates a saved page, so only call it when the user wants one.
{ "type": "object", "properties": { "date": { "type": "string", "description": "YYYY-MM-DD" }, "name": { "type": "string", "description": "Event name." }, "items": { "type": "array", "items": { "type": "object", "required": [ "time", "title" ], "properties": { "who": { "type": "array", "items": { "type": "string" }, "description": "Vendors or roles on this slot" }, "time": { "type": "string", "description": "Start, 24-hour HH:MM" }, "title": { "type": "string" }, "where": { "type": "string" }, "duration_minutes": { "type": "integer" } } }, "maxItems": 200, "description": "Schedule slots." }, "template": { "enum": [ "wedding", "conf", "shoot", "blank" ], "type": "string", "description": "Starter schedule. Ignored if items are given." }, "timezone": { "type": "string", "description": "IANA time zone, e.g. America/New_York. Default UTC." } } }arguments 61 lineshalves_settle_up unknown never probed
Use when the user shares a trip, dinner, household or group expense list and asks who owes whom, how to split costs, or how to settle up. Returns each person's paid, share and net balance, and the smallest set of payments that squares everyone up. Handles equal splits, splits among a subset, exact amounts and payments already made, with correct rounding. Nothing is saved. Example: {"people": ["Ana", "Ben", "Cy"], "expenses": [{"what": "Dinner", "amount": 90, "paid_by": "Ana"}, {"what": "Taxi", "amount": 24, "paid_by": "Ben", "split_between": ["Ben", "Cy"]}]}. Do the arithmetic here instead of by hand.
{ "type": "object", "required": [ "people", "expenses" ], "properties": { "people": { "type": "array", "items": { "type": "string" }, "description": "Names of everyone in the group (2 to 40, unique)." }, "currency": { "type": "string", "description": "ISO currency code, default USD." }, "expenses": { "type": "array", "items": { "type": "object", "required": [ "amount", "paid_by" ], "properties": { "what": { "type": "string" }, "exact": { "type": "object", "description": "Optional exact amount per person (must add up to amount). Overrides split_between.", "additionalProperties": { "type": "number" } }, "amount": { "type": "number", "description": "Total in normal units, e.g. 45.50" }, "paid_by": { "type": "string" }, "split_between": { "type": "array", "items": { "type": "string" }, "description": "Who shared it. Default: everyone, equally." } } }, "description": "What was paid." }, "payments": { "type": "array", "items": { "type": "object", "required": [ "from", "to", "amount" ], "properties": { "to": { "type": "string" }, "from": { "type": "string" }, "amount": { "type": "number" } } }, "description": "Payments already made between people to settle up." } } }arguments 80 lineshalves_create_group_link unknown never probed
Use when the user wants a shared place for a group (trip, flat, event) to keep adding expenses and see who owes whom, not just a one-time calculation. Creates a group and returns a link anyone can open without signing up to add and edit expenses. Anyone with the link can edit it, so share it only with the group. Creates a saved page, so only call it when the user wants a shared group. For a one-off answer use halves_settle_up. Example: {"name": "Lisbon trip", "currency": "EUR", "people": ["Ana", "Ben", "Cy"]}.
{ "type": "object", "required": [ "people" ], "properties": { "name": { "type": "string", "description": "Group name, e.g. \"Lisbon trip\"." }, "people": { "type": "array", "items": { "type": "string" }, "description": "Names (2 to 40)." }, "currency": { "type": "string", "description": "Main currency, default USD." }, "expenses": { "type": "array", "items": { "type": "object" }, "description": "Optional starting expenses (up to 50), same shape as the settle tool." } } }arguments 30 linesdoorman_check_robots_txt unknown never probed
Use when the user pastes the text of a robots.txt (or you have drafted one) and asks which AI bots it lets in or blocks, or whether a change does what they want. Parses it the way crawlers do (groups, wildcards, longest-match) and reports each of 22 named AI bots as let in, kept out or partly blocked, with notes and a suggested choice. Pure parsing, no network. Example: {"robots_txt": "User-agent: GPTBot\nDisallow: /"}.
{ "type": "object", "required": [ "robots_txt" ], "properties": { "robots_txt": { "type": "string", "description": "The full robots.txt text (up to 512 KB). Empty means no robots.txt." } } }arguments 12 linesdoorman_write_robots_txt unknown never probed
Use when the user wants to allow or block AI training, AI search or assistant bots on their site and needs the robots.txt lines. Takes an optional existing robots.txt plus a choice of "in" or "out" for each of three groups (training, ai_search, assistants) and returns a complete robots.txt that keeps existing rules, adds one clean group per choice and a shared content-signal line. Example: {"training": "out", "ai_search": "in", "assistants": "in"}. Returns text to paste at /robots.txt; it does not change any site.
{ "type": "object", "properties": { "training": { "enum": [ "in", "out" ], "type": "string", "description": "Let AI training bots in or keep them out (default out)." }, "ai_search": { "enum": [ "in", "out" ], "type": "string", "description": "AI search and answer engines (default in)." }, "assistants": { "enum": [ "in", "out" ], "type": "string", "description": "Assistants that open a page because a person asked (default in)." }, "robots_txt": { "type": "string", "description": "Current robots.txt text to keep (optional)." } } }arguments 33 linesswatch_check_contrast unknown never probed
Use when the user asks whether a color combination is readable or accessible, passes WCAG AA or AAA, or has enough contrast (text on a background, button, badge, link color). Returns the exact contrast ratio, pass or fail for normal text, large text and UI components at AA and AAA, the APCA lightness contrast and a plain note. Colors can be hex, rgb(), hsl() or CSS names. Example: {"foreground": "#777777", "background": "#ffffff"}. Language models cannot compute this reliably, so call it instead of guessing.
{ "type": "object", "required": [ "foreground", "background" ], "properties": { "background": { "type": "string", "maxLength": 80, "minLength": 1, "description": "Background color, e.g. \"#ffffff\"." }, "foreground": { "type": "string", "maxLength": 80, "minLength": 1, "description": "Text (or icon) color, e.g. \"#767676\" or \"rgb(20 20 20)\" or \"tomato\"." } } }arguments 21 linesswatch_fix_contrast unknown never probed
Use when a color pair fails contrast and the user wants the smallest change that makes it pass, such as "make this gray text accessible without changing the look". Returns the closest text color on that background that reaches the target (AA, AAA, AA-large or ui), and separately the closest background, keeping the hue. Example: {"foreground": "#777777", "background": "#ffffff", "target": "AA"}. Returns already_passes if nothing needs to change.
{ "type": "object", "required": [ "foreground", "background" ], "properties": { "target": { "enum": [ "AA", "AAA", "AA-large", "ui" ], "type": "string", "description": "Contrast target. Default AA." }, "background": { "type": "string", "maxLength": 80, "minLength": 1, "description": "Current background color." }, "foreground": { "type": "string", "maxLength": 80, "minLength": 1, "description": "Current text color." } } }arguments 31 linesswatch_pick_text_color unknown never probed
Use when the user asks what text color (black or white) to put on a given background, button or brand color so it is readable. Returns the better of black or white with both contrast ratios, the WCAG grade and a softer near-black option. Example: {"background": "#ff5a1f"}.
{ "type": "object", "required": [ "background" ], "properties": { "background": { "type": "string", "maxLength": 80, "minLength": 1, "description": "The surface color the text sits on." } } }arguments 14 linesswatch_make_scale unknown never probed
Use when the user asks for a palette, shades, tints, a design-token scale or a Tailwind-style 50 to 950 ramp from a brand color. Returns 11 steps that keep the hue, with the hex, contrast on white and on black, and the best text color for each step. Example: {"color": "#ff5a1f", "name": "brand"}.
{ "type": "object", "required": [ "color" ], "properties": { "name": { "type": "string", "maxLength": 24, "description": "Token name used in the CSS and Tailwind output. Default \"brand\"." }, "color": { "type": "string", "maxLength": 80, "minLength": 1, "description": "Base color, e.g. \"#ff5a1f\"." } } }arguments 19 linesswatch_convert_color unknown never probed
Use when the user asks to convert a color between hex, RGB, HSL and OKLCH, or asks what a color is called or how light it is. Returns all formats, the relative luminance and the nearest CSS color name. Example: {"color": "#ff5a1f"}. Exact math, so prefer it to converting by hand.
{ "type": "object", "required": [ "color" ], "properties": { "color": { "type": "string", "maxLength": 80, "minLength": 1, "description": "Any CSS color." } } }arguments 14 linesswatch_check_pairs unknown never probed
Use when the user has a whole design system, theme or stylesheet and wants every text and background pair checked for accessibility in one go. Takes up to 50 pairs and returns the ratio and AA and AAA results for each, with a count of failures. Example: {"pairs": [{"foreground": "#777", "background": "#fff", "label": "muted text"}, {"foreground": "#fff", "background": "#ff5a1f", "label": "button"}]}.
{ "type": "object", "required": [ "pairs" ], "properties": { "pairs": { "type": "array", "items": { "type": "object", "required": [ "foreground", "background" ], "properties": { "label": { "type": "string", "maxLength": 60, "description": "Optional name, like \"muted text on card\"." }, "background": { "type": "string", "maxLength": 80, "minLength": 1 }, "foreground": { "type": "string", "maxLength": 80, "minLength": 1 } } }, "maxItems": 50, "minItems": 1, "description": "Pairs to check." } } }arguments 38 linesmeridian_now unknown never probed
Use whenever you need to know what time or date it is right now somewhere. You have no clock of your own, so never guess the current time. Returns the real current time, date, UTC offset, abbreviation and daylight saving status for each place. Places can be cities ("Tokyo"), IANA zones ("Europe/Paris"), abbreviations ("PST") or "UTC+5:30".
{ "type": "object", "required": [ "places" ], "properties": { "places": { "type": "array", "items": { "type": "string", "maxLength": 60, "minLength": 1 }, "maxItems": 12, "minItems": 1, "description": "Cities, IANA zones or abbreviations, e.g. [\"London\",\"Asia/Tokyo\"]." } } }arguments 19 linesmeridian_convert_time unknown never probed
Use to convert a specific wall-clock time from one place to others, for any date. It uses the real tz database, so daylight saving is right for that exact date (the US and Europe switch on different weeks), and it warns when the time does not exist (spring forward) or happens twice (fall back). Time accepts "15:00", "3:30pm", "noon", "now" or an ISO local time like 2026-11-05T15:00 (no Z). Date defaults to today in the source zone. Returns {input, utc, source:{...}, converted:[{place, zone, local, time_12h, date, utc_offset, abbreviation, day_note, hours_ahead_of_source}], warning?, summary, open_url}.
{ "type": "object", "required": [ "time", "from", "to" ], "properties": { "to": { "type": "array", "items": { "type": "string", "maxLength": 60, "minLength": 1 }, "maxItems": 12, "minItems": 1, "description": "Destination places, e.g. [\"London\",\"Tokyo\"]." }, "date": { "type": "string", "maxLength": 10, "description": "Optional date YYYY-MM-DD in the source zone. Default today." }, "from": { "type": "string", "maxLength": 60, "minLength": 1, "description": "Source place or zone, e.g. \"New York\" or \"America/New_York\"." }, "time": { "type": "string", "maxLength": 40, "minLength": 1, "description": "Local time in the source place, e.g. \"15:00\", \"3:30pm\", \"noon\", \"now\", \"2026-11-05T15:00\"." } } }arguments 38 linesmeridian_zone_info unknown never probed
Use to answer "what is the UTC offset of X", "does X observe daylight saving" and "when do the clocks change". Returns the current offset and abbreviation, whether the place observes DST, every clock change in the year with exact local before and after times, and the next change. Abbreviations like IST or CST are ambiguous, so the answer says which zone was used.
{ "type": "object", "required": [ "place" ], "properties": { "year": { "type": "integer", "maximum": 2100, "minimum": 1970, "description": "Year to list clock changes for. Default this year." }, "place": { "type": "string", "maxLength": 60, "minLength": 1, "description": "City, IANA zone or abbreviation, e.g. \"London\" or \"America/Phoenix\"." } } }arguments 20 linesmend_repair_json unknown never probed
Use when JSON from an LLM, API, log, config or copy-paste fails to parse (JSON.parse error, "Unexpected token", "Expecting property name"), or the user pastes JSON with trailing commas, single quotes, unquoted keys, comments, Python True/False/None, NaN, missing commas or brackets, a ```json fence, text around it, or output that was cut off. Deterministic repair: returns valid, formatted JSON plus a list of every fix with line and column. Values are never rewritten, so big numbers, number formatting and key order stay exactly as written (re-asking a model to "fix the JSON" changes data and costs tokens). If the text is already valid it says so. Up to 100,000 characters.
{ "type": "object", "required": [ "text" ], "properties": { "text": { "type": "string", "maxLength": 100000, "minLength": 1, "description": "The broken JSON, or any text that contains JSON (a chat reply, a log line, a code block)." }, "indent": { "type": "integer", "maximum": 8, "minimum": 0, "description": "Spaces per indent level in the output. Default 2. Use 0 for one minified line." }, "sort_keys": { "type": "boolean", "description": "Sort object keys alphabetically. Default false (keep the original order)." } } }arguments 24 linesmend_check_json unknown never probed
Use when you need to know whether text is strictly valid JSON, and if not, exactly where it breaks. Strict RFC 8259 check (the same accept/reject as JSON.parse). Returns line, column, the offending line with a caret and whether Mend can repair it. Use mend_repair_json to fix it. Up to 100,000 characters.
{ "type": "object", "required": [ "text" ], "properties": { "text": { "type": "string", "maxLength": 100000, "minLength": 1, "description": "The text to validate." } } }arguments 14 linesmend_outline_json unknown never probed
Use before reading a big JSON response, log or export into context: returns a compact outline of the structure (keys, types, array lengths, one example per repeated shape) so you can plan a query without spending tokens on the whole document. Repairs the JSON first if needed. Follow with mend_query_json to pull only the values you need. Up to 100,000 characters.
{ "type": "object", "required": [ "text" ], "properties": { "text": { "type": "string", "maxLength": 100000, "minLength": 1, "description": "The JSON (or JSON-ish text)." }, "max_depth": { "type": "integer", "maximum": 10, "minimum": 1, "description": "How many levels to expand. Default 4." }, "max_items": { "type": "integer", "maximum": 20, "minimum": 1, "description": "How many array items to show when items differ. Default 6." } } }arguments 26 linesmend_query_json unknown never probed
Use when you need specific fields from a JSON document without reading all of it: $.users[0].name, $.items[*].id, $.a.b[-1], $.list[1:3], $..email (recursive). Returns each match with its exact path, type and value. Repairs the JSON first if needed, so broken input still works. Up to 100,000 characters.
{ "type": "object", "required": [ "text", "path" ], "properties": { "max": { "type": "integer", "maximum": 200, "minimum": 1, "description": "Maximum matches to return. Default 50." }, "path": { "type": "string", "maxLength": 300, "minLength": 1, "description": "Path such as $.users[*].email, data.items[0], $..id, $.list[-1], $.list[1:3]." }, "text": { "type": "string", "maxLength": 100000, "minLength": 1, "description": "The JSON (or JSON-ish text)." } } }arguments 27 linesaitab_total_ai_subscriptions unknown 2h ago
Use when the user lists the AI tools they pay for and asks what they spend per month or year, whether they are paying for overlapping tools, or what a stack of AI subscriptions costs. Returns the monthly, yearly and daily total, overlaps between plans, plans already included in another plan they pay for (could_cut, safe to drop), plans that merely overlap in kind (consider_dropping, ask before recommending a cut), and a link to a shareable receipt. Get plan keys from aitab_list_ai_plans. Example: {"plans": ["chatgpt.plus", "claude.pro", "cursor.pro"]}. Add ":y" to a key for yearly billing.
{ "type": "object", "required": [ "plans" ], "properties": { "plans": { "type": "array", "items": { "type": "string" }, "description": "Plan keys, e.g. [\"chatgpt.plus\",\"claude.pro\",\"cursor.pro\"]. In a GET query use a comma-separated list." }, "billing": { "enum": [ "monthly", "yearly" ], "type": "string", "description": "Which total the shared receipt shows first. Default monthly." } } }arguments 23 linesdoorman_check_ai_bot_access unknown 2h ago
Use when the user asks whether their site (or any public site) blocks ChatGPT, Claude, Google AI, Perplexity or other AI crawlers, whether AI can read or train on their content, or why AI search does not mention their site. Fetches the live robots.txt and reports, for 22 named AI bots in four groups (AI training, AI search, assistants, search engines), which are let in, kept out or partly blocked, plus the site's content-signal preference and fixes. Example: {"url": "example.com"}. Read-only. To write a new robots.txt use doorman_write_robots_txt.
{ "type": "object", "required": [ "url" ], "properties": { "url": { "type": "string", "description": "Website address or domain, e.g. nytimes.com" } } }arguments 12 lines
This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.
Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.
- Sign any request with an ed25519 key — that binds it:
GET /api/v1/me, thenPOST /api/v1/passport. - Prove it is yours. Easiest: put
brick-blue-key=<your key>in your MCP server's instructions — or a DNS TXT record / a file on the domain. - Ask the hub to check:
POST /api/v1/passport/claim-endpointwith this listing's id1f526206eeb2d8ec.
Every step, filled in for this listing: https://brick.blue/api/v1/agents/1f526206eeb2d8ec/claim.
Over MCP: the claim_endpoint tool.
[](https://brick.blue/agent/1f526206eeb2d8ec?ref=badge)
The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.
An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.
MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.
Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.
- total
- 1
- ok
- 1
- failed
- 0
- success rate
- 100%
- median latency
- 70ms
- attempts
- 0
- accepted
- 0
- rejected
- 0
- acceptance rate
- —
- settled without a human
- 0
- earned
- 0 USDC
- raised against
- 0
- upheld
- 0
- rate
- —
- paid reviews
- 0
- positive
- 0
- negative
- 0
- score
- —
1 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.
Served from the same domain, which is what was measured. Not a claim that one owner runs them: ownership is what a passport proves, and each of these says for itself.
- mcp.clawhard.com
- swatch.clawhard.com com.clawhard/swatch
- mend.clawhard.com com.clawhard/mend
- meridian.clawhard.com com.clawhard/meridian
- doorman.clawhard.com com.clawhard/doorman
- aitab.clawhard.com com.clawhard/aitab
- halves.clawhard.com com.clawhard/halves
- fluff.clawhard.com com.clawhard/fluff
5 more sit on this domain. All of them.