Skip to main content
Glama
README.md
# brandcheck

Does your brand actually show up when a buyer asks an AI
assistant for a recommendation? brandcheck is a small
keyless bridge to the hosted AskedThrice measurement
service, which asks real buyer questions to OpenAI,
Anthropic and Gemini and reports what they answered —
not what they claim they would answer.

There is no score from 0 to 100. A finished measurement
reports a verdict in three bands, how many of the buyer
questions the brand won, which competitors were named
instead, and which providers actually answered. The
service is free, needs no signup and no API key, and
allows one measurement per domain every 30 days; that
quota lives upstream, and a `quota_reached` answer
passes through this client untouched.

## Tools

- `start_visibility_check` — start a measurement for a
  brand. Required: `brand` (the brand name as customers
  write it), `website` (the domain, like
  `yourbrand.com`) and `category` (what the business
  sells, in plain words). Optional: `competitors` (up
  to 5 real competitors, comma separated), `location`
  (where the business competes) and `language` (`en` or
  `es`, the language the buyer questions are asked in).
  Returns a `runId`.
- `get_visibility_check` — collect a measurement by
  its `runId`. Returns status `running` while the
  providers are still answering, so poll every 20 to 30
  seconds (a measurement takes about a minute); when
  ready it reports the verdict and the counts.

Nothing is validated or counted locally: arguments are
forwarded exactly as given, and the upstream result
content comes back verbatim, including any `isError`
flag.

## Configuration

- `ASKEDTHRICE_MCP_URL` (optional) — override the
  hosted endpoint. Defaults to
  `https://mcp.askedthrice.com/mcp`.
- `ASKEDTHRICE_TIMEOUT_MS` (optional) — per-request
  timeout in milliseconds. Defaults to `60000`.

Failures use three renderings (this rebuild's own,
labelled): a JSON-RPC error from the upstream becomes
`askedthrice error: <message>`, an unparseable upstream
response becomes `askedthrice error: malformed
response`, and a request that cannot be completed —
including a timeout — becomes `askedthrice
unreachable`.

### Forwarding mechanics

The bridge internals are a labelled reconstruction (the
Streamable HTTP session pattern): on the first call the
client POSTs an `initialize` request (protocolVersion
`2025-03-26`, empty capabilities, clientInfo name
`brandcheck`), captures the `mcp-session-id` response
header when one is returned, POSTs
`notifications/initialized`, then POSTs the `tools/call`
request with the session header attached when captured.
The session is reused for the life of the process.
Every POST carries `Content-Type: application/json` and
`Accept: application/json, text/event-stream`, and
responses may be plain JSON or SSE.

## CLI

Each tool is a subcommand taking one JSON argument
string:

```bash
npx @reneturcios/brandcheck start_visibility_check '{"brand":"Acme","website":"acme.com","category":"project management tool","competitors":"Asana, Monday"}'
npx @reneturcios/brandcheck get_visibility_check '{"runId":"run-123"}'
npx @reneturcios/brandcheck --version
```

Output is the forwarded result content as JSON. Exit
codes: `0` on success, `1` on an `isError` result, `2`
on a usage error.

## MCP server

```bash
npx -y @reneturcios/brandcheck mcp
```

MCP client config:

```json
{
  "mcpServers": {
    "brandcheck": {
      "command": "npx",
      "args": ["-y", "@reneturcios/brandcheck", "mcp"]
    }
  }
}
```

## Docker

```bash
docker run -i ghcr.io/cloudcorprecords/brandcheck
docker run --rm ghcr.io/cloudcorprecords/brandcheck get_visibility_check '{"runId":"run-123"}'
```

## Development

```bash
npm install
npm run build   # tsc -> dist/
npm test        # tsx --test test/*.test.ts (fake fetch only, no network)
npm run dev     # run the CLI from source
```

## License

MIT — Copyright (c) 2026 Rene Turcios