Shruwd

See how AI answers talk about your brand, and what to fix.

Community: Submitted by a user or imported; check the owner before granting accessOnlineNo sign-inGlobalFreeRead-only

What it can do

  • Shruwd Get Workspace: The plan, the entitlements in force (brands, the workspace-wide prompt pool, members, engines, cadence, history window, rechecks per month, and maxVisibleFindings — how many find
  • Shruwd List Brands: The active brands the caller can reach, with their prompt and competitor counts and the caller's role on each.
  • Shruwd Get Brand: One brand with its pipeline health: last successful cycle, next scheduled cycle, run success rate, log-ingest continuity and connection states. Check this before treating a flat metr

What data it sees

Do you need an account

No: the server works without sign-in

See how AI answers talk about your brand, and what to fix.

Shruwd tracks how often your brand shows up in Google AI Overviews, AI Mode and ChatGPT answers, and who gets cited instead. It explains why you're missing and tells you what to change. After you ship a fix, it checks again to show whether it worked.

What you can do from your assistant

  • Set up a brand in one conversation: add prompts and competitors, or have Shruwd suggest them
  • Check visibility: mention rate, share of voice and citation share against your competitors, plus how each is trending
  • Read the answers: the actual AI responses behind every number
  • Work through findings: see what's holding you back and the recommended fix, then mark it done when you've shipped it
  • Watch AI crawlers: which AI bots reach your site and what they fetch

Connecting

Sign in with your Shruwd account when you connect. There's no API key to paste.

shruwd.io

How to connect

How to connect Shruwd to Claude

The server address to paste into Claude settings:

https://shruwd--devindaymore.run.tools

  1. Open Claude (claude.ai or the desktop app).
  2. Go to Settings → Connectors.
  3. Click Add custom connector.
  4. Paste the server address copied below into Remote MCP server URL and click Add.
  5. In a chat, click + → Connectors and switch the new connector on.

Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.

Authorization

After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.

How to connect Shruwd to ChatGPT

The server address to paste into ChatGPT settings:

https://shruwd--devindaymore.run.tools

  1. Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
  2. Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
  3. Open Settings → Connectors and click Create.
  4. Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
  5. Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
  6. In a new chat open + → Apps/Connectors and enable the connector.

OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.

Authorization

On first use ChatGPT opens the service's sign-in window. Sign in and approve access.

How to connect Shruwd to Cursor

The server address to paste into Cursor settings:

https://shruwd--devindaymore.run.tools

Fastest: click Open in Cursor below and confirm the prompt.

Manually:

  1. In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
  2. Paste the JSON copied below into ~/.cursor/mcp.json (per project: .cursor/mcp.json in the repo root).
  3. Save the file. The server appears in the MCP list; authorize it there if asked.

Authorization

If the service needs sign-in, an authorize button appears next to the server in the MCP list.

Server tool list (28)

Raw names from tools/list. Only developers need these.

shruwd_get_workspaceThe plan, the entitlements in force (brands, the workspace-wide prompt pool, members, engines, cadence, history window, rechecks per month, and maxVisibleFindings — how many findings the plan shows in full), usage against the period allowance including activePrompts against promptsAllowance, whether the caller is the workspace owner or a member, and the brands the caller can reach with their role on each. Call this first: the role on a brand decides which of these tools are allowed on it. Usage is the whole workspace's, since the pools are shared.
shruwd_list_brandsThe active brands the caller can reach, with their prompt and competitor counts and the caller's role on each.
shruwd_get_brandOne brand with its pipeline health: last successful cycle, next scheduled cycle, run success rate, log-ingest continuity and connection states. Check this before treating a flat metric as a signal — "nothing ran" and "nothing was mentioned" look identical in a chart.
shruwd_create_brandCreates a brand, its self entity (one alias = the name, one domain = the registrable domain) and the first measurement cycle. If the account has no workspace yet, one is created on the free tier. The response says which engines the plan measures and whether a first cycle was planted. On the free tier "snapshot" is "planned" or "already_taken": a domain gets one free measurement ever, across all accounts. Add competitors first (shruwd_add_competitor), then every prompt in one shruwd_add_prompts call: the first cycle starts within minutes of the first prompts and measures only the prompts and competitors that exist then. The name is the brand's own first alias, so a short (six characters or fewer) or common-word name is refused with context_terms_required until contextTerms are given, as for a competitor. Requires the workspace owner: a key held by a member is refused with 403 insufficient_role.
shruwd_update_brandRenames a brand or changes its timezone. The name is for display; matching uses the self entity's aliases (shruwd_set_entity). The timezone moves the day boundary for cycles and rollups from the next cycle on. The domain cannot change: it defines the self entity, so a new domain is a new brand.
shruwd_archive_brandArchives a brand. Nothing is deleted; scheduling stops and history stays. Requires the workspace owner: a key held by a member is refused with 403 insufficient_role. Ask before using this.
shruwd_list_promptsThe brand's prompts. With an engine, each prompt carries its coverage over the window: how often the brand was mentioned in answers to it. Per-prompt n is small (three repetitions per cycle), so coverage is often insufficient_data; that is correct, not missing data.
shruwd_add_promptsAdds prompts — the questions asked of each engine every cycle. Write them the way a buyer would type them, without the brand name unless the intent is navigational. 1–500 characters each. The batch is atomic: if it would exceed the plan's prompt allowance — one pool shared across every brand in the workspace, not a per-brand limit — nothing is added and the error carries limit, current and submitted. On a new brand the first measurement starts within minutes of the first prompts and covers only what exists then, so add its competitors before this and every prompt in one call.
shruwd_update_promptEdits a prompt by its promptGroupId. Changing text or intent creates a new version under the same group — history stays attached to the version that produced it. tags and active change in place. Reactivating counts against the plan limit.
shruwd_remove_promptDeactivates a prompt. Nothing is deleted; its history stays readable.
shruwd_list_entitiesThe brand itself (isSelf) and every competitor, each with the exact aliases, domains, exclusions and context terms that decide what counts as a mention or a citation.
shruwd_add_competitorAdds a competitor. Matching is exact, on word boundaries — no fuzzy matching, ever — because a false positive silently corrupts every metric. That is also why a short name or alias (six characters or fewer) or a common English word ("Arc", "Linear", "Notion") is refused without contextTerms: those names appear in sentences that are not about the company. Give one or two category words as context terms ("project management", "crm") and the mention counts only when one appears nearby. Include the competitor's domain so citations of it are attributed. On a new brand, add competitors before any prompt: the first measurement starts as soon as prompts exist, and a competitor added after it is not in it.
shruwd_set_entitySets the DESIRED aliases, domains, exclusions and context terms of an entity (the brand's own self entity included). Send the full lists: what is missing is closed as of now, what is new is added, what is unchanged is untouched, and past measurements keep the aliases that were valid when they ran. Read shruwd_list_entities first.
shruwd_remove_entityCloses a competitor as of now. The brand's own entity cannot be removed.
shruwd_list_suggestionsNames the AI answers use that the brand does not track yet — the products a person would recognise as competitors but never added. Each comes with the share of answers that named it (e.g. 0.34 = in 34% of a prompt cluster's responses) and, when the answers linked it, its domain. Review them with the user: accept the real competitors (they then count in share of voice), dismiss the rest. Suggestions appear only after a measurement cycle has closed.
shruwd_accept_suggestionTurns a suggestion into a tracked competitor, with exactly the rules of shruwd_add_competitor: exact aliases only, and a short or common-word name or alias is refused until contextTerms are given. The name and the linked domain are prefilled from the suggestion; pass aliases, domains, exclusions or contextTerms to adjust. Confirm with the user before accepting.
shruwd_dismiss_suggestionNot a competitor. Quiet for ninety days; suggested again only if the answers still name it.
shruwd_run_measurementSchedules a measurement cycle now: every active prompt, on every entitled engine, repeated as the plan sets (three times on weekly plans, once for the free snapshot). It starts at once and completes over the following day; this response contains only the cycle id. Watch it with shruwd_list_cycles, then read shruwd_get_visibility and shruwd_list_findings. A cycle spends the period's run allowance (see shruwd_get_workspace); weekly plans already run one per week, so use this for a first read or after a change worth measuring. On the free tier it is the single free measurement.
shruwd_list_cyclesRecent measurement cycles, newest first, with state (pending, running, complete, partial, failed, skipped_quota) and run counts. "partial" means some runs failed; "skipped_quota" means the allowance, the plan or billing stopped it. On a weekly plan the newest is next week's cycle, still pending: the newest that is not pending is the current measurement, and its results are in once it is complete or partial.
shruwd_get_visibilityMention rate and share of voice for the brand and each competitor on one engine over a window (default: last 30 days), plus per-prompt coverage. Each metric is {state: "ok", point, lo, hi, n} — a proportion with its 95% interval — or {state: "insufficient_data"} when fewer than ten responses exist, or {state: "undefined"}. A metric with state insufficient_data is NOT zero; do not report it as a number, and do not compare two metrics whose intervals overlap as if one were higher. "asOf" is the day the numbers describe. "historyFrom" is set when the window was clamped to the plan's history. "modelIds" lists the provider models seen; a change there can move metrics on its own. engine defaults to google_aio: call once per engine the brand measures (its engines) and report each separately.
shruwd_get_visibility_seriesThe window metric at every cycle close in a range (default: the last ninety days, 30-day window): for the brand and each competitor, mention rate and share of voice per close, each a {state: "ok", point, lo, hi, n} metric or an explicit non-number. Use it to answer "is this changing" — but two points whose intervals overlap have NOT moved, and a change across a "modelChanges" entry may be the provider's model rather than the brand (the comparison is confounded). "series" is index-aligned with "points"; null means no rollup row for that close.
shruwd_get_crawlersWhich AI crawlers fetched the brand's site, from its server logs, over a window. verifiedHits were confirmed against the vendor's published IP ranges; unverifiedHits merely claimed the user-agent, which anyone can send. Only verified hits are a signal, and the two are never summed. "live_retrieval" bots fetch pages to answer a question now, so a page they cannot fetch cannot be cited in those answers; "training" crawlers collect pages for model training. "coverage" says whether log ingest has been continuous — if not, an absence of hits means nothing.
shruwd_list_findingsDiagnoses, ordered by severity, then confidence, then estimated impact. Each has a specific recommendation: what to change, where, and which metric should move. confidence: "observed" was measured from first-party data; "inferred" follows a reliable pattern; "heuristic" is a plausible cause that could not be confirmed — treat it as a hypothesis, not a fact. By default the open, acknowledged, fix_applied and rechecking findings; pass states to change that. "queued" counts open findings held back by the weekly cap. On plans that cap visible findings, "locked" counts the rest by severity: they exist and are not returned. When locked.count is above zero, never present the returned findings as the complete set — say how many are withheld.
shruwd_suggest_setupReads the brand's homepage and drafts ten prompts and up to six competitors. Nothing is saved to the brand: show the draft to the user, then add each competitor they confirm with shruwd_add_competitor, passing its aliases and contextTerms from the draft, and after that the prompts they keep, in one shruwd_add_prompts call. Returns the stored draft when one exists unless regenerate is true. Three drafts per brand per day; a new draft can take up to a minute.
shruwd_list_answersThe latest individual AI answers for the brand, newest first: the prompt, the engine, whether the brand was named and at what rank, the competitors named and the pages cited. Evidence, not a metric: never compute a rate from these; use shruwd_get_visibility, which withholds numbers below ten answers.
shruwd_get_findingOne finding with its full evidence, recommendation, and the history of state changes. A finding the plan does not show in full — one counted in a findings list's "locked" — is refused with 403 not_entitled: it exists, the plan withholds it.
shruwd_transition_findingMoves a finding: "acknowledged" (seen), "fix_applied" (the recommended change is live), or "dismissed". Order matters: an open finding must be acknowledged before fix_applied, or the call is refused with 409 invalid_transition. fix_applied captures a baseline of the affected prompts and starts a fourteen-day clock; a recheck then measures again, and the finding becomes "resolved" ONLY if the movement gates pass (non-overlapping intervals and at least five points of change), else "not_moved". ACCESS findings are instead confirmed from the site's own logs, robots.txt or page, with no wait and no recheck spent. Neither resolved nor not_moved can be set here. Do not mark fix_applied until the change is actually deployed; the baseline is taken at that moment. A finding withheld by the plan is refused with 403 not_entitled.
shruwd_create_ingest_tokenMints the token the brand's server sends its access logs with, and returns the endpoint to POST them to plus a `setup` object with three routes: an HTTP log drain (Vercel, Netlify, Fly), a Cloudflare Logpush HTTP destination (Enterprise zones; the destinationUrl embeds the token), or the reference forwarder Worker (any other Cloudflare plan or CDN-served site). The token is shown once and never again; previous tokens are revoked. Ask which platform the site runs on, then give the user that route's values verbatim. Logs power the crawler view and the highest-confidence findings. Requires the admin role on the brand: a key held by an editor or viewer there is refused with 403 insufficient_role.