# Citation Intelligence (npm · @automatelab/citation-intelligence)

Check what Perplexity, Claude, ChatGPT, Gemini, and Google AI Overviews cite for any query.

- Trust score: 66/100 (medium)
- Change this week: +15
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- npm · `@automatelab/citation-intelligence`: 66/100 (this document), [markdown](https://verifymcp.io/servers/automatelab-tech-citation-intelligence/automatelab-citation-intelligence.md), [page](https://verifymcp.io/servers/automatelab-tech-citation-intelligence/automatelab-citation-intelligence)

## Channel facts

- Registry: `npm`
- Package: `@automatelab/citation-intelligence`
- Version: `0.12.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 70/100
  - No malware found by supply-chain analysis.
  - CVE check failed: a known high-severity CVE affects undici 7.25.0, a direct dependency. A fixed version is available.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (140 of 145), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 55 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 83/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 4378 tokens (~145/item across 30 items; 26 tools + 4 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add automatelab-tech-citation-intelligence -- npx -y @automatelab/citation-intelligence
```

### Codex

```bash
codex mcp add automatelab-tech-citation-intelligence -- npx -y @automatelab/citation-intelligence
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "automatelab-tech-citation-intelligence": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@automatelab/citation-intelligence"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add automatelab-tech-citation-intelligence --command npx --arg -y --arg @automatelab/citation-intelligence
```

### Hermes

```yaml
mcp_servers:
  automatelab-tech-citation-intelligence:
    command: "npx"
    args: ["-y", "@automatelab/citation-intelligence"]
```

### Other

```json
{
  "mcpServers": {
    "automatelab-tech-citation-intelligence": {
      "command": "npx",
      "args": [
        "-y",
        "@automatelab/citation-intelligence"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 66, +4)

- [functional improvement] Stability: unverified → 0.27

### 2026-08-02 (score 62, +37)

- [security regression] GHSA-frvp-7c67-39w9 affects this package: high
- [security regression] CVE-2026-6733 affects this package: high
- [security regression] CVE-2026-12151 affects this package: high
- [security regression] CVE-2026-9697 affects this package: high
- [security regression] CVE-2026-9678 affects this package: high
- [security regression] CVE-2026-6734 affects this package: high
- [security regression] CVE-2026-41907 affects this package: high
- [security regression] CVE-2026-11525 affects this package: high
- [security regression] CVE-2026-9679 affects this package: high
- [security regression] Provenance: unverified → fail
- [security regression] Known CVEs: unverified → fail
- [security improvement] Install scripts: unverified → pass
- [security improvement] Malware scan: unverified → pass
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional improvement] Schema quality: unverified → excellent
- [functional improvement] License: unverified → pass
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional] Licence: MIT

### 2026-07-31 (score 25, +19)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 6, −45)

- [security regression] Malware scan: pass → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional regression] Tool coverage: 100 → unverified

### 2026-07-27 (score 51)

First indexed and scored.

## MCP tools (26)

### `citations_check` (~247 tokens)

Return URLs cited by an AI engine (Perplexity, Claude, ChatGPT, Gemini, or Bing) for a query. Use this when an agent or user wants to see what sources an AI search engine grounds answers on. Requires at least one engine API key; auto-picks the first available.

Input parameters:

- `engine` (string): Engine to query. • perplexity / google_ai_mode — consumer_scrape: closest to real product behavior. • claude / openai / gemini — api_proxy: API-tier call, may differ from consumer product. • bing_ser…
- `max_results` (integer): Maximum citations to return.
- `perplexity_model` (string): Perplexity model override (e.g. 'sonar', 'sonar-pro', 'sonar-reasoning'). Only used when engine='perplexity'. Defaults to 'sonar-pro'.
- `query` (string, required): The search query to test (what would a user ask an AI?)

Output parameters:

- `cached` (boolean): Whether the result was served from the local cache.
- `citations` (array): Cited URLs ordered by rank.
- `engine` (string): Engine used for this response.
- `fetched_at` (string): UTC ISO-8601 timestamp of the fetch.
- `interpretation_note` (string): Guidance on how to interpret results from this engine.
- `query` (string): The query that was executed.
- `raw_answer` (string|null): Raw answer text from the engine, if available. Absent for web_rank engines (bing_serp, brave_serp) that return ranked URLs without a synthesized answer.
- `surface` (string): Engine surface type: consumer_scrape, api_proxy, or web_rank.

### `domain_am_i_cited` (~171 tokens)

Check whether a domain is cited by an AI engine across a cluster of queries. Returns per-query presence, rank, and a citation-rate summary. Use to measure visibility for a brand, product, or content site in AI search.

Input parameters:

- `domain` (string, required): Domain to check, e.g. 'automatelab.tech' (without protocol).
- `engine` (string): LLM engine to check for citations. 'auto' runs all available LLM engines and returns per-engine breakdown + cross-engine consensus. Pin to a specific engine to reduce cost. 'bing_serp' and 'brave_ser…
- `queries` (array, required): Queries to test the domain against. 1-20 queries per call.

Output parameters:

- `consensus` (object): Cross-engine consensus stats (multi_engine mode).
- `domain` (string): The domain that was checked.
- `engine` (string): Engine used (single_engine mode only).
- `engines` (array): Per-engine summary rows (multi_engine mode).
- `fetched_at` (string): UTC ISO-8601 timestamp.
- `mode` (string): Whether one or multiple engines were queried.
- `per_engine` (array): Full per-engine detail (multi_engine mode).
- `results` (array): Per-query results (single_engine mode).
- `summary` (object): Aggregate summary (single_engine mode).
- `surface` (string): Engine surface type (single_engine mode only).

### `signals_ai_overview` (~95 tokens)

Check whether Google shows an AI Overview for a query, and which URLs it cites. Uses SerpAPI (free tier: 100/month). Set SERPAPI_KEY.

Input parameters:

- `hl` (string): Language code, default 'en'.
- `location` (string): Location string, e.g. 'United States'. Affects AI Overview eligibility.
- `query` (string, required): Search query to check for Google AI Overview.

Output parameters:

- `ai_overview_present` (boolean): Whether Google returned an AI Overview for this query.
- `ai_overview_text` (string|null): AI Overview text, if present.
- `cached` (boolean): Whether the result was served from local cache.
- `fetched_at` (string): UTC ISO-8601 timestamp.
- `query` (string): The query checked.
- `sources` (array): URLs cited in the AI Overview.

### `domain_cited_for` (~128 tokens)

List queries that the given domain has been cited for, served from the local cache. Build up a corpus by calling check_citations or am_i_cited first; cited_for queries it without spending API budget.

Input parameters:

- `domain` (string, required): Domain to look up, e.g. 'automatelab.tech'.
- `engine` (string): Filter by engine. Omit to include all.
- `limit` (integer): Maximum results.
- `since` (string): ISO date floor, e.g. '2026-01-01'. Only return entries fetched on or after this date.

Output parameters:

- `domain` (string): Domain that was looked up.
- `engine_filter` (string): Engine filter applied, if any.
- `results` (array): Cache entries where this domain was cited.
- `since` (string): ISO date floor applied, if any.
- `source` (string): Always 'local_cache' — no external calls made.
- `total` (number): Total entries returned.

### `citations_predict` (~85 tokens)

Score citation likelihood for a URL from public signals (Wikipedia link presence, schema.org markup, /llms.txt, GitHub and Reddit references, canonical hygiene, HTTPS). No LLM fired - all heuristic. Returns 0-100 score, grade, signal breakdown, and ranked fixes.

Input parameters:

- `url` (string, required): URL to score for citation likelihood. Must be absolute http(s).

Output parameters:

- `fetched_at` (string): UTC ISO-8601 timestamp.
- `fixes` (array): Ranked list of concrete improvements to raise the score.
- `grade` (string): Letter grade (A-F) derived from the score.
- `score` (number): 0-100 citation likelihood score.
- `signals` (object): Per-signal boolean/numeric values used to compute the score.
- `url` (string): URL that was scored.

### `panel_track` (~174 tokens)

Save, load, or list named query panels. A panel is a persisted set of queries you want to monitor over time (e.g. editorial-watchlist). Use action=save with queries[] to create, action=load to read, action=list to enumerate. Panels live under <config>/panels/<name>.json.

Input parameters:

- `action` (string): 'save' writes the panel, 'load' returns an existing panel, 'list' enumerates all panels.
- `domain` (string): Default domain to track for this panel, e.g. 'automatelab.tech'.
- `name` (string, required): Panel name, e.g. 'editorial-watchlist'. Used to save and recall the query set.
- `queries` (array): Queries to save under this panel. Omit to read the existing panel.

Output parameters:

- `error` (string): Error message when the panel was not found.
- `panel` (object): The panel object that was saved or loaded.
- `panels` (array): All panel names (action=list).
- `saved` (boolean): True when action=save succeeded.

### `panel_run` (~175 tokens)

Run a saved panel through am_i_cited and append a timestamped snapshot. Side effects: makes external API calls to the configured AI engine (costs API quota); writes one snapshot file to disk at <config>/snapshots/<panel>/<iso>.json. Requires at least one engine API key (same as am_i_cited). Returns per-query citation presence and a citation_rate summary for the run. Use panel_track to create a panel first; use citations_trend to read the accumulated trend after multiple runs.

Input parameters:

- `domain` (string): Override the panel's default domain for this run.
- `engine` (string): AI engine to query. Use bing_serp/brave_serp for web_rank comparison only — am_i_cited will refuse them.
- `name` (string, required): Panel name previously saved via track_queries.

Output parameters:

- `saved_to` (string): Absolute file path of the snapshot that was written.
- `snapshot` (object): The snapshot that was appended.

### `report_visibility` (~332 tokens)

Turnkey AI visibility report for a domain across a query set. Composes check_citations over every query (or a saved panel) and returns the metrics AI-visibility trackers sell as a dashboard, in one call: mention frequency (citation_rate), share_of_voice vs competitors, average rank when cited, and brand sentiment from the answer text. Side effects: one check_citations call per query (costs API quota for uncached queries; cached queries are free). Returns structured summary + top_domains + per_query, plus a rendered Markdown report (include_markdown=true) suitable for a public page. Provide queries[] or a panel name. Same engine selection as check_citations.

Input parameters:

- `brand_terms` (array): Brand name variants to detect in answer text for sentiment (defaults to the domain's second-level label).
- `competitors` (array): Optional competitor domains to surface explicitly in the share-of-voice table.
- `domain` (string, required): The domain you are measuring visibility for (e.g. automatelab.tech).
- `engine` (string): AI engine to query. 'auto' picks the first configured key. Same selection as check_citations.
- `include_markdown` (boolean): If true (default), include a rendered Markdown report under `markdown`.
- `max_results` (integer): Max citations to pull per query.
- `panel` (string): Name of a saved panel (see panel_track) to pull queries from. Provide this OR `queries`.
- `queries` (array): Queries to run. Provide this OR `panel`. Each is sent to the AI engine via check_citations.

Output parameters:

- `error` (string)
- `markdown` (string): Rendered Markdown report. Present when include_markdown=true.
- `per_query` (array)
- `summary` (object)
- `top_domains` (array): Share-of-voice table, most-cited domains first.

### `citations_trend` (~167 tokens)

Report citation rate over time for a panel from stored snapshots. Read-only; cache-only — makes no API calls to any AI engine and costs no API quota. Reads snapshot files from <config>/snapshots/<panel>/. Returns: snapshots[] (one entry per panel_run invocation, each with timestamp and citation_rate), plus per-query deltas (gained/lost/unchanged) comparing first vs last snapshot. Returns an empty series when no snapshots exist yet. No auth required. No rate limits. Use panel_run to accumulate snapshots first; use since to restrict the time window.

Input parameters:

- `panel` (string, required): Panel name to report on.
- `since` (string): ISO date floor, e.g. '2026-01-01'. Only include snapshots on or after.

Output parameters:

- `domain` (string): Domain tracked by the panel.
- `first_taken_at` (string): Timestamp of the oldest snapshot.
- `last_taken_at` (string): Timestamp of the newest snapshot.
- `panel` (string): Panel name.
- `query_deltas` (array): Per-query changes between first and last snapshot.
- `series` (array): Time-series of citation rates, one entry per snapshot.
- `snapshots` (number): Number of snapshots available.

### `competitors_compare` (~82 tokens)

Run predict_citation on 2-10 URLs and return a side-by-side signal table plus a list of signals where the URLs diverge. Use to compare your URL to top-cited competitors for the same query.

Input parameters:

- `urls` (array, required): URLs to compare side-by-side. 2-10 URLs. One is typically yours and the rest are cited competitors.

Output parameters:

- `diverging_signals` (array): Signals where at least one URL differs from the others.
- `fetched_at` (string): UTC ISO-8601 timestamp.
- `rows` (array): Per-URL predict_citation rows (or { url, error } on failure).

### `signals_wikipedia` (~178 tokens)

List Wikipedia articles that reference the given domain. Read-only. One HTTPS GET to the Wikipedia API (en.wikipedia.org/w/api.php?action=query&list=exturlusage). No auth required; no API keys; no rate limits beyond Wikipedia's public API fair-use policy (~1 request/second). Returns article titles and URLs. Wikipedia backlinks are the highest-lift signal for LLM training corpora — a domain cited from Wikipedia is far more likely to appear in AI training data and citation pools. Use lang to query non-English Wikipedias.

Input parameters:

- `domain` (string, required): Domain to search for, e.g. 'automatelab.tech' (without protocol).
- `lang` (string): Wikipedia language subdomain, e.g. 'en', 'de', 'fr'.
- `limit` (integer): Maximum mention rows to return.

Output parameters:

- `domain` (string): Domain that was searched.
- `fetched_at` (string): UTC ISO-8601 timestamp.
- `lang` (string): Wikipedia language subdomain used.
- `mentions` (array): List of Wikipedia articles that cite the domain.
- `total` (number): Number of Wikipedia articles referencing this domain.

### `audit_sitemap` (~113 tokens)

Fetch a sitemap.xml (or sitemap index) and run predict_citation on every URL. Returns results sorted worst-score-first. Surfaces systemic issues across a whole site in one pass. Zero engine keys needed.

Input parameters:

- `concurrency` (integer): Parallel predict_citation calls. Higher is faster but more rate-limit risk.
- `limit` (integer): Max URLs to score. Sitemap is sliced after parsing.
- `sitemap_url` (string, required): URL of sitemap.xml (or a sitemap index). Nested sitemaps are followed.

Output parameters:

- `audited` (number): Number of URLs that were scored.
- `average_score` (number): Mean predict_citation score across scored URLs.
- `errors` (array): URLs whose audit threw an error.
- `fetched_at` (string): UTC ISO-8601 timestamp.
- `sitemap_url` (string): The sitemap URL that was audited.
- `total_urls` (number): Total URLs found in the sitemap.
- `worst_first` (array): Up to 20 lowest-scoring URLs, worst first.

### `competitors_compete` (~151 tokens)

End-to-end competitive snapshot for a single query. Calls check_citations to get the cited URLs, then runs compare_domains on your_url vs the top cited competitors. Returns your score, the average competitor score, and the gap.

Input parameters:

- `engine` (string): AI engine to query for the citation set. 'auto' picks the first available key.
- `max_competitors` (integer): How many cited URLs to compare against your_url. Capped at 9 (compare_domains accepts max 10 URLs total including yours).
- `query` (string, required): Search query to test (what would a user ask an AI?).
- `your_url` (string, required): Your URL to benchmark against the cited competitors.

Output parameters:

- `average_competitor_score` (number|null): Mean score across competitor URLs.
- `comparison`: Full compare_domains result.
- `competitors` (array): Competitor URLs that were compared.
- `engine` (string): Engine used for the citation fetch.
- `fetched_at` (string): UTC ISO-8601 timestamp.
- `query` (string): The query that was tested.
- `score_gap` (number|null): your_score minus average_competitor_score.
- `your_in_citations` (boolean): Whether your URL appeared in the engine's citation list.
- `your_score` (number|null): predict_citation score for your URL (null on error).
- `your_url` (string): Your URL that was benchmarked.

### `citations_freshness` (~129 tokens)

Score how recent the pages cited for a query are. Calls check_citations, then collects dateModified for each cited URL, returns a 0-100 recency_score (halflife=365d) plus per-URL freshness bucket (fresh/current/stale/ancient/unknown). Surfaces queries where AI cites old content - opportunity to ship fresher.

Input parameters:

- `engine` (string): AI engine to query for the citation set.
- `max_results` (integer): How many cited URLs to inspect.
- `query` (string, required): Search query whose cited URLs to score for freshness.

Output parameters:

- `average_days_old` (number|null): Mean age in days across URLs with a detectable dateModified.
- `buckets` (object): Freshness bucket distribution.
- `engine` (string): Engine used.
- `fetched_at` (string): UTC ISO-8601 timestamp.
- `note` (string)
- `per_url` (array): Per-URL freshness details.
- `query` (string): The query whose citations were scored.
- `recency_score` (number): 0-100 average recency weight across cited URLs (halflife=365d).

### `domain_cited_for_diff` (~153 tokens)

Diff cited_for between two time windows for a domain. Returns queries gained (cited now, not before baseline_until) and queries lost (cited before, not since current_since). Cache-only, no API spend. Use to track citation drift over time after publishing or migrating content.

Input parameters:

- `baseline_until` (string, required): ISO date (or ISO datetime). Baseline window = all cache entries fetched on or before this timestamp.
- `current_since` (string): ISO date floor for the 'current' window. Defaults to baseline_until.
- `domain` (string, required): Domain to diff, e.g. 'automatelab.tech'.
- `engine` (string): Filter by engine. Omit to include all.

Output parameters:

- `baseline_until` (string): Upper bound of the baseline window.
- `counts` (object)
- `current_since` (string): Lower bound of the current window.
- `domain` (string): Domain that was diffed.
- `engine_filter` (string): Engine filter applied, if any.
- `fetched_at` (string): UTC ISO-8601 timestamp.
- `gained` (array): Queries gained (newly cited) since the baseline.
- `lost` (array): Queries lost (were cited, no longer are).
- `source` (string)
- `unchanged_queries` (array): Queries cited in both windows.

### `signals_gsc_gap` (~223 tokens)

Join Google Search Console performance with am_i_cited per query. Surfaces queries where the domain ranks well in Google but is not cited in AI - the closest editorial wins. Requires GCP service account creds (credentials_path or GOOGLE_APPLICATION_CREDENTIALS env).

Input parameters:

- `credentials_path` (string): Path to GCP service account JSON. Defaults to env GOOGLE_APPLICATION_CREDENTIALS.
- `domain` (string, required): Domain to analyze, e.g. 'automatelab.tech'. Used both for the GSC site URL and the citation check.
- `end_date` (string, required): ISO date for GSC range end, e.g. '2026-05-01'.
- `engine` (string): AI engine for the citation check.
- `queries` (array, required): Queries to cross-reference. 1-20 per call.
- `site_url` (string): Override the GSC siteUrl. Defaults to 'sc-domain:<domain>'.
- `start_date` (string, required): ISO date for GSC range start, e.g. '2026-04-01'.

Output parameters:

- `closest_wins` (array): Queries where domain ranks in Google top-10 but is not AI-cited (the editorial gap).
- `domain` (string): Domain analyzed.
- `engine` (string): Engine used for the citation check.
- `range` (object): GSC date range.
- `rows` (array): Per-query GSC + AI citation cross-reference.
- `site_url` (string): GSC siteUrl used.

### `signals_bing_gap` (~190 tokens)

Join Bing Webmaster Tools query stats with am_i_cited per query. Surfaces queries where the domain ranks well in Bing but is not cited in AI - the closest editorial wins. Bing's index backs Copilot/ChatGPT/Perplexity grounding, so a Bing rank gap is an LLM-citation gap. Requires BING_WEBMASTER_API_KEY (Bing Webmaster Tools -> Settings -> API Access).

Input parameters:

- `domain` (string, required): Domain to analyze, e.g. 'automatelab.tech'. Used for the citation check.
- `engine` (string): AI engine for the citation check.
- `queries` (array, required): Queries to cross-reference. 1-20 per call.
- `site_url` (string): Verified Bing Webmaster site URL. Defaults to 'https://<domain>/'. Bing uses the https origin WITH a trailing slash, NOT the sc-domain: form GSC uses.

Output parameters:

- `closest_wins` (array): Queries where domain ranks in Bing top-10 but is not AI-cited (the editorial gap).
- `domain` (string): Domain analyzed.
- `engine` (string): Engine used for the citation check.
- `rows` (array): Per-query Bing rank + AI citation cross-reference.
- `site_url` (string): Bing Webmaster siteUrl used (https origin with trailing slash).

### `audit_schema` (~113 tokens)

Deep schema.org validation for a URL. Parses every JSON-LD block and microdata node, checks required fields per @type (Article needs headline+author+datePublished, FAQPage needs mainEntity, HowTo needs step, etc.), and flags missing fields and malformed JSON-LD. Returns issues list and a valid/invalid verdict. Use to fix structured-data bugs that predict_citation flags but can't explain.

Input parameters:

- `url` (string, required): URL whose JSON-LD and microdata to validate against schema.org expected fields.

Output parameters:

- `fetched_at` (string): UTC ISO-8601 timestamp.
- `issues` (array): Validation issues found.
- `json_ld_blocks` (number): Total JSON-LD blocks found.
- `json_ld_parse_errors` (number): Number of JSON-LD blocks that failed to parse.
- `microdata_types_present` (array): Schema types found via microdata (itemtype).
- `note` (string)
- `schema_types_present` (array): @type values found across all JSON-LD blocks.
- `summary` (object)
- `url` (string): URL that was audited.

### `audit_llms_txt` (~208 tokens)

Generate an llms.txt file (https://llmstxt.org spec) from a sitemap. Parses sitemap.xml + nested indexes, groups URLs by top-level path, and emits a Markdown document with H1+description+sectioned link lists. Set fetch_titles=true to pull <title> per URL (slower, richer output).

Input parameters:

- `fetch_titles` (boolean): If true, fetch each URL to extract <title> for richer links. Slower (one HEAD-ish GET per URL). Default false uses the URL path as the link text.
- `limit` (integer): Max URLs to include. Truncated after sitemap parse, before title fetch.
- `site_description` (string): One-paragraph site description placed under the H1. Optional but strongly recommended.
- `site_title` (string, required): Site title - top H1 in the generated llms.txt file.
- `sitemap_url` (string, required): URL of sitemap.xml (or sitemap index). Nested sitemaps are followed.

Output parameters:

- `content` (string): Generated llms.txt file content; save to /llms.txt at site root.
- `fetched_at` (string): UTC ISO-8601 timestamp.
- `note` (string)
- `sections` (number): Number of top-level sections in the generated file.
- `sitemap_url` (string): Sitemap URL that was processed.
- `titles_fetched` (number): Number of pages fetched to extract <title>.
- `total_urls_in_sitemap` (number): Total URLs found in the sitemap.
- `urls_included` (number): URLs included after applying the limit.

### `signals_answer_box` (~150 tokens)

Locate where each cited URL appears in the AI's raw answer text. Calls check_citations, finds the first mention of each citation's URL (or hostname) in raw_answer, and bins by char position into early/middle/late thirds. Surfaces whether your URL is cited up-front or buried near the end. Returns 'unknown' for engines without raw_answer (Bing, Brave).

Input parameters:

- `engine` (string): AI engine to query. web_rank engines (bing_serp, brave_serp) lack raw_answer and will return position 'unknown'.
- `max_results` (integer): Max citations to locate.
- `query` (string, required): Search query whose AI answer to measure citation positions on.

Output parameters:

- `answer_chars` (number): Total length of the engine's raw answer in characters.
- `buckets` (object): Count of citations per position bucket.
- `citations_total` (number): Total citations returned by the engine.
- `engine` (string): Engine used.
- `fetched_at` (string): UTC ISO-8601 timestamp.
- `note` (string)
- `positions` (array): Per-citation position in the AI answer.
- `query` (string): The query that was tested.

### `citations_provenance` (~156 tokens)

Fan a query out across multiple AI engines and report per-URL cross-engine consensus. Returns each unique cited URL with the list of engines that cited it, plus a consensus_urls list (URLs cited by ALL engines). High engine_count = strong cross-engine citation signal; engine_count=1 = engine-specific.

Input parameters:

- `engines` (array): Engines to query. If omitted, uses all LLM engines with a configured API key (perplexity, claude, openai, gemini, google_ai_mode). Include bing_serp/brave_serp only when you explicitly want web_rank…
- `max_results` (integer): Max citations per engine.
- `query` (string, required): Search query to fan out across multiple engines.

Output parameters:

- `consensus_urls` (array): URLs cited by ALL succeeding engines (requires >=2 engines).
- `engines` (array): Per-engine run summary.
- `engines_queried` (number)
- `engines_succeeded` (number)
- `fetched_at` (string): UTC ISO-8601 timestamp.
- `note` (string)
- `per_url` (array): All unique cited URLs sorted by cross-engine consensus (engine_count desc).
- `query` (string): The query that was fanned across engines.
- `summary` (object)

### `citations_evidence` (~183 tokens)

Extract the cited snippet from the AI engine's raw answer for each citation. Calls check_citations, then for each returned URL finds the first mention in raw_answer and returns a context window plus the nearest quoted span or containing sentence. Use to see *why* an engine cited a URL, not just *that* it did. Returns 'not found' for engines without raw_answer (Bing, Brave).

Input parameters:

- `context_chars` (integer): Half-width of the snippet window around each citation mention (chars). Total snippet is up to 2x this.
- `engine` (string): AI engine to query. web_rank engines (bing_serp, brave_serp) lack raw_answer and return no evidence.
- `max_results` (integer): Max citations to extract evidence for.
- `query` (string, required): Search query whose AI answer to extract citation evidence from.

Output parameters:

- `citations_total` (number)
- `engine` (string): Engine used.
- `evidence` (array): Per-citation evidence extracted from the raw answer.
- `evidence_found` (number): Citations whose URL was located in the raw answer.
- `fetched_at` (string): UTC ISO-8601 timestamp.
- `has_raw_answer` (boolean): Whether the engine returned a raw answer.
- `note` (string)
- `query` (string): The query whose answer was analyzed.
- `raw_answer_chars` (number): Length of the engine's raw answer.

### `audit_crawler_access` (~180 tokens)

Verify that major AI crawlers (GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot, CCBot, Google-Extended, Applebot-Extended, Bytespider, Meta-ExternalAgent, plus real-time fetch UAs) can fetch a URL. Parses robots.txt and does a live GET with each bot's User-Agent. Surfaces robots.txt blocks AND UA-based gating that breaks AI citation.

Input parameters:

- `bots` (array): Override the default bot list. Each entry is a User-Agent token (e.g. 'GPTBot', 'ClaudeBot').
- `fetch_with_ua` (boolean): If true, do a live GET as each bot's User-Agent and report status. Disable to only parse robots.txt (no extra requests).
- `url` (string, required): Page URL to test for AI crawler access.

Output parameters:

- `bots` (array): Per-bot access verdict combining robots.txt + live UA test.
- `fetched_at` (string): UTC ISO-8601 timestamp.
- `note` (string)
- `robots_error` (string|null): Error message if robots.txt fetch failed.
- `robots_present` (boolean): Whether a non-empty robots.txt was found.
- `robots_status` (number|null): HTTP status of the robots.txt fetch.
- `robots_url` (string): robots.txt URL that was parsed.
- `summary` (object)
- `url` (string): The URL that was audited.

### `audit_sitemap_map` (~160 tokens)

Cross-reference a sitemap with the citation cache. For each sitemap URL, reports whether it appears in cached citations (and how many queries/engines cited it). Inverse of audit_sitemap: not 'how citable is each URL', but 'has each URL actually been cited yet'. Cache must be primed via check_citations or run_panel first.

Input parameters:

- `domain` (string): Domain to look up citations for. If omitted, inferred from the sitemap host.
- `limit` (integer): Max sitemap URLs to consider.
- `since` (string): ISO date floor; only count citations recorded on or after this date.
- `sitemap_url` (string, required): URL of sitemap.xml (or a sitemap index). Nested sitemaps are followed.

Output parameters:

- `citations_in_cache` (number): Total citation cache entries for this domain.
- `coverage_pct` (number): Percentage of sitemap URLs that have been cited (0-100).
- `domain` (string): Domain whose citation cache was queried.
- `fetched_at` (string): UTC ISO-8601 timestamp.
- `mapped` (number): URLs found in the citation cache.
- `mapped_urls` (array): Sitemap URLs present in the cache, sorted by citation count desc.
- `note` (string)
- `since` (string)
- `sitemap_url` (string): The sitemap that was processed.
- `total_urls` (number): Total sitemap URLs considered.
- `unmapped` (number): URLs not yet seen in the citation cache.
- `unmapped_urls` (array): Sitemap URLs not yet cited (up to 200).

### `competitors_canonical_set` (~184 tokens)

Fan a query across engines and aggregate citations by registered domain (not URL). Returns top competitor domains ranked by cross-engine consensus, with per-engine breakdown and top URLs per domain. Use to identify the canonical competitor set for a query - the domains every engine treats as authoritative.

Input parameters:

- `engines` (array): Engines to query. If omitted, uses all LLM engines with a configured API key (google_ai_mode, perplexity, claude, openai, gemini). Include bing_serp/brave_serp only for web_rank comparison.
- `exclude_domains` (array): Domains to filter out (e.g. your own brand, Wikipedia, Reddit). Suffix-match.
- `max_results` (integer): Max citations per engine.
- `query` (string, required): Search query to fan out across engines.
- `top_n` (integer): Max competitor domains to return.

Output parameters:

- `domains` (array): Competitor domains ranked by cross-engine consensus.
- `engines` (array): Per-engine run summary.
- `engines_queried` (number)
- `engines_succeeded` (number)
- `excluded_domains` (array): Registered domains that were filtered out.
- `fetched_at` (string): UTC ISO-8601 timestamp.
- `note` (string)
- `query` (string): The query that was fanned across engines.
- `top_n` (number): Maximum domains returned.
- `total_unique_domains` (number): Total unique competitor domains found before top_n truncation.

### `audit_structured_data` (~133 tokens)

Suggest missing JSON-LD additions for a URL. Fetches the page, detects existing schema types, and returns ready-to-paste templates for types that are missing but signalled by page content (BlogPosting from og:type=article or bylines, FAQPage from Q&A pairs, HowTo from numbered steps, BreadcrumbList from nested paths, Organization on homepages). Templates are pre-filled from page metadata where possible; fields marked FILL: require manual completion.

Input parameters:

- `url` (string, required): URL to inspect for missing JSON-LD. The page is fetched and its content signals are used to suggest schema types.

Output parameters:

- `fetched_at` (string): UTC ISO-8601 timestamp.
- `note` (string)
- `schema_types_present` (array): @type values already present on the page.
- `signals_detected` (object): Content signals detected (e.g. og:type=article).
- `suggestions` (array): Schema additions suggested for this page.
- `summary` (object)
- `url` (string): URL that was inspected.

## Diagnostics

Captured diagnostic sections: Provenance, Vulnerabilities, Dependencies. The full working is on the page: https://verifymcp.io/servers/automatelab-tech-citation-intelligence/automatelab-citation-intelligence#diagnostics

## Score history

- 2026-08-03: 66
- 2026-08-02: 62
- 2026-08-01: 25
- 2026-07-31: 25
- 2026-07-30: 6
- 2026-07-28: 51
- 2026-07-27: 51

## Links

- npm package: https://www.npmjs.com/package/@automatelab/citation-intelligence
- Socket report: https://socket.dev/npm/package/@automatelab/citation-intelligence
- Repository: https://github.com/AutomateLab-tech/citation-intelligence
- Website: https://automatelab.tech/products/mcp/citation-intelligence/
- Changelog RSS feed: https://verifymcp.io/servers/automatelab-tech-citation-intelligence/automatelab-citation-intelligence/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/automatelab-tech-citation-intelligence/automatelab-citation-intelligence/changelog.json
- HTML version of this page: https://verifymcp.io/servers/automatelab-tech-citation-intelligence/automatelab-citation-intelligence
