Turn traceable signals into content decisions
Documents
SEO Signal Research
Try itResearch traceable SEO demand signals
What it does
SignalDig SEO research skill — REQUIRES the daily-growth-signals MCP server and a SignalDig API key; installing this Skill does not connect the MCP server, and never fabricate or simulate results when the MCP tools are unavailable. Retrieve evidence-backed SEO data for a keyword, domain, market, and language through the SignalDig MCP server. Use for keyword metrics, related-keyword discovery, SERP observations, Google Trends evidence, ranked-keyword inventories, competitor/GEO/backlink analysis, market comparison, and other requests that need traceable SEO data. Confirm which data family the user actually needs when a generic keyword request is ambiguous, call only the smallest sufficient scope, and reuse a prior request_id or stable idempotency_key before creating a duplicate submit. Do not make the user's SEO or growth decision.
The skill document
Research SEO Signals
Turn a natural-language SEO research goal into the smallest sufficient asynchronous SignalDig MCP request, then return an organized, evidence-linked report. Use the MCP result as evidence, not as permission to invent facts or make the user's final prioritization decision.
Efficiency stance: Prefer reuse of prior terminal results, narrow scopes, and a concise default report. Do not re-fetch the same logical research or re-dump full arrays unless the user asks for a refresh or a full export.
MCP Availability Gate (Mandatory)
This Skill is a workflow spec only; it has no data of its own. Every live result comes from the
daily-growth-signalsMCP server, which requires a valid SignalDig API key. Installing this Skill does not connect the MCP server — the two are separate installs.
Before starting any research, verify that the daily-growth-signals MCP
server is connected and its tools are visible (e.g.
submit_keyword_research_signals, submit_specific_seo_data,
get_keyword_research_signals, submit_competitor_analysis,
submit_geo_analysis, submit_backlink_analysis).
If the MCP server is not configured, its tools are missing, the API key is invalid, or an initial connection fails:
- Stop immediately. Do not start the workflow, do not poll, and do not emit any metrics, rankings, evidence IDs, source URLs, or "results".
- Never simulate, guess, or answer from general knowledge. A knowledge-based reply is NOT a valid Skill output and misleads the user into thinking the Skill ran.
- Tell the user plainly: this Skill needs the
daily-growth-signalsMCP server athttps://mcp.signaldig.com/data/seo/mcpand a SignalDig API key (get one at → API Keys). Point to references/setup-guide.md for client-specific steps, then stop.
Only when the tools are available may the workflow proceed, and every substantive claim must cite a real tool result.
Execution Contract
- Use the SignalDig MCP tools for live demand-signal research.
- Use only the SEO MCP product surface. Social evidence belongs to
research-social-signals; conditional recommendations belong todecide-content-opportunitiesand the Decision MCP. - Map the user's goal to the smallest sufficient data-scope combination. Use
submit_specific_seo_datafor one family,submit_keyword_research_signalswithdata_scopesfor any multi-family subset, andget_keyword_research_signalsto query either job. - Use
submit_competitor_analysisfor competitor research,submit_geo_analysisfor AI-search/GEO visibility, andsubmit_backlink_analysisfor a site's backlinks and referring domains. These tools own provider query details; do not construct low-level provider requests. - Treat the MCP tool schema and returned fields as the source of truth.
- Preserve every
request_idandidempotency_keyused in this conversation until the task is finished. - Separate observed evidence from interpretation in every answer.
- If this Skill conflicts with the live MCP tool schema, follow the live schema.
Hard Rules
- Reuse before submit. Before any submit, search this conversation for a prior job with the same logical research identity. If a matching
request_idexists, call onlyget_keyword_research_signals. Do not create a new request for the same data. - Stable idempotency. Always build and send a stable
idempotency_keyfor a logical research request. On tool errors, client timeouts, ambiguous failures, or retries of the same logical request, reuse that exact key. Do not invent a new key for the same keyword/domain/market/language/scopes. - Select one submit tool at most once per logical research need after reuse checks fail, then poll. Never create a second request merely because the first request is still
pendingorrunning. - Never invent metrics, evidence, URLs, timestamps, source availability, or successful nodes.
- Never cite an evidence ID that is absent from the terminal result.
- Never treat a
partialresult as fully complete. State exactly which evidence is unavailable. - Never fetch or summarize the body of a search-result page as part of this Skill. Use only returned links and structured observations.
- Never turn signals into an automatic go/no-go SEO decision. Explain what the evidence supports and let the user decide.
- Keep machine field names unchanged, but write the user-facing answer in the requested language.
- Never use the aggregate submit tool merely to obtain one data family. Use the narrowest
data_scopethat satisfies the user's goal. - Default report depth is concise. Do not paste every array item unless the user explicitly asks for a full export or complete dump. When concise, still preserve exact metric values you do cite and disclose the full counts returned.
- Do not refresh live data just to rephrase an earlier answer. Reuse the prior terminal result unless the user asks for a refresh or the prior result is missing required scopes.
- Confirm ambiguous scope before calling. A generic request such as “查一下这个关键词”“研究这个词” or “看看关键词数据” does not authorize all data families. Briefly ask which data the user needs, using plain-language choices. Do not submit while the required scope remains ambiguous.
- Do not ask a scope question when the user's goal already identifies the needed family or families. Map the goal directly and retrieve only those scopes.
- Omit
data_scopesonly when the user explicitly asks for comprehensive/all-family research or when every family is demonstrably necessary to answer an already specific request. Never equate a unified MCP endpoint with permission for full retrieval.
Logical Research Identity
Treat two research goals as the same logical request when all of the following match after normalization:
keyword(exact seed string)domain(hostname only)market(ISO alpha-2)language(research language)- selected
data_scope/data_scopesset (order-independent) search_enginewhen the selected scope includesserp- optional user-declared refresh flag is absent
Build:
idempotency_key = "seo-signals:" + keyword + "|" + domain + "|" + market + "|" + language + "|" + sorted_scopes + "|engine=" + search_engine
Where sorted_scopes is the selected scopes joined by commas in stable sorted order, or all when the complete set is intentionally requested. Do not put personal or confidential data into the key.
Keep a session ledger (in agent working memory) shaped like:
logical_id -> { idempotency_key, request_id, status, terminal_at, scopes }
Update the ledger after every successful submit or get.
Workflow
- Identify the user's research goal, seed keyword, target domain, research language, response language, desired answer depth (
concisedefault,fullonly if requested), and whether they asked to refresh. - Normalize
marketto an ISO 3166-1 alpha-2 country code such asUS. - Normalize research
languageto an ISO language or supported BCP 47 code such asenorzh-TW. - If research language is absent, infer it from the target market and keyword only when unambiguous; otherwise default to
en. - Determine response language separately from research language: honor an explicit answer-language request, otherwise use the user's conversation language, and default to English only when neither is clear.
- Ask for a missing keyword or domain that cannot be safely inferred.
- Inventory the data families needed to answer the request. If the user only names a keyword or asks for generic “keyword data/research,” pause before any live call and ask which of these they need: keyword metrics and intent, related keywords, current search results/SERP, or search trends. Allow one or more choices and explain them in user language, not only enum names.
- If exactly one family is needed, plan
submit_specific_seo_data. If two or more families are needed, plansubmit_keyword_research_signalswith exactly those values indata_scopes. Omitdata_scopesonly when all supported families are required. - Build the stable
idempotency_keyfrom the logical research identity. - Reuse gate (mandatory before submit):
- If the session ledger or conversation already has a
request_idfor this identity, callget_keyword_research_signals(request_id)only. - If status is
completeorpartialand the user did not ask to refresh, validate and answer from that result. Stop. - If status is
pendingorrunning, continue polling thatrequest_idonly. Do not submit again. - If status is
failedand the user wants a retry, prefer resubmit with the sameidempotency_keyso the retry keeps the same logical identity. - If no prior
request_idis known, still send the stableidempotency_keyon first submit so client retries collapse to one run.
- If the session ledger or conversation already has a
- Call the selected submit tool only when the reuse gate requires a new submit: pass
keyword,domain,market, researchlanguage, scopes, and the sameidempotency_key. - Store the returned
request_id,status,is_terminal,poll_after_seconds, andexecution_deadline_atin the session ledger. - If
is_terminalis false, wait forpoll_after_secondswhen provided, then callget_keyword_research_signalswith the samerequest_id. - Continue polling while status is
pendingorrunning. Do not resubmit. - Stop when
is_terminalis true or the client reaches a firm execution deadline. - For
completeorpartial, validate the result before interpreting it. - For
failed, report the stable error and a safe next step. Retry only when the error is explicitly retryable or the user requests a new attempt, always reusing the prioridempotency_keyfor that logical identity. - Return observations first, evidence second, limitations third, and optional follow-up research last.
Data Scope Selection
Use the following exact mapping:
keyword_overview: keyword metrics, properties, backlink/SERP summaries, and embedded search intent.related_keywords: related keyword discovery and their returned metrics.serp: organic results, SERP features, target-domain presence, and traceability URL.google_trends: interest timeline, geographic interest, and related top/rising queries.
Use the dedicated analysis tools when the request is about competitors, AI-search visibility/LLM mentions, or backlinks/referring domains. Keep those analysis families separate from the traditional SEO scope selection.
Map common user wording without another question when the intent is clear:
- “搜索量、CPC、竞争度、关键词属性或搜索意图” →
keyword_overview - “相关词、长尾词、扩展词或更多关键词” →
related_keywords - “当前排名、搜索结果、SERP 特性或目标域名是否出现” →
serp - “热度变化、时间趋势、地区热度或上升查询” →
google_trends
If wording spans multiple rows, select only those rows. If it matches none clearly, ask a short scope question before calling. Do not propose all families as the default or describe them as a mandatory bundle.
For SERP requests, use search_engine="bing" when the user explicitly asks for Bing/必应; otherwise omit it and keep the Google default. Do not expose or construct DataForSEO task parameters, endpoint paths, device settings, depth, or location payloads in the MCP call; the service implementation owns those details.
Use one combined submit when the answer needs two or more families; do not split one logical combination into several requests. Omit data_scopes only for a complete all-family research request.
When a prior terminal result already covers a superset of the needed scopes (for example prior all and now only serp), reuse that request_id and answer from the needed family only. Do not submit a narrower job just to re-fetch overlapping data.
When a prior result is a subset of what is now needed, submit only for the missing scopes if the tools allow a scoped request; do not re-request families already present unless the user asks to refresh.
Input Model
Translate the user's request into these fields:
keyword: the exact seed query to investigate; preserve meaningful punctuation and product names.domain: the target hostname without scheme, path, query, or fragment.market: a two-letter country code. Do not send city names or free-form country names.language: the research language sent to the data service; it does not control the final answer language.data_scope/data_scopes: the smallest single family or multi-family combination needed for the goal.search_engine: optional SERP engine selector,googleorbing; it defaults togoogleand does not change non-SERP data families.idempotency_key: stable retry and reuse identifier for the same logical request.
Use these defaults:
- Default research language:
enwhen no unambiguous market-specific language can be inferred. - Default response language: the user's conversation language, otherwise
en. - Default output depth: concise.
- Default polling behavior: follow
poll_after_seconds. - Default decision stance: evidence summary, not recommendation.
- Default freshness: reuse prior terminal result in-session; refresh only when the user asks.
- Default SERP engine: use Google when the user does not name an engine. If the user asks for Bing/必应, pass
search_engine="bing"; do not fetch Bing by default.
The traditional SEO function remains submit_specific_seo_data; it supports the existing SEO families and can select Google or Bing for serp. Bing fields may differ from Google, so interpret the returned result and field_semantics rather than assuming identical structure.
Do not silently replace an unsupported market-language pair with another country or language. Report the rejected pair and ask the user to choose a supported alternative.
State Machine
Handle states exactly as follows:
pending: accepted but not started; wait and poll the samerequest_id.running: in progress; wait and poll the samerequest_id.complete: terminal result with all required nodes completed; reuse viagetfor later questions.complete: terminal usable result. Freshness-only codessignaldig_stale_dataandsignaldig_unknown_freshnessstay on complete; treat them as quality notes, not outages.partial: terminal usable result with missing coverage such assignaldig_no_matching_dataorsignaldig_analysis_unavailable; report both usable evidence and missing families. Do not retry empty-result codes.failed: terminal failure; reporterror.code, summarizeerror.message, and do not fabricate a result. Retry only with the sameidempotency_keywhen appropriate. Treatsignaldig_data_unavailableas a service outage, not as missing keyword data.
Trust is_terminal as the primary stop signal. Use status to explain the outcome. A missing result in a non-terminal response is normal.
Result Validation
Before writing the answer:
- Confirm the terminal envelope has the same
request_idreturned by submit or previously reused. - Confirm
result.querymatches the requested keyword, domain, market, and language. - Read
status,limitations,usage, andresult.field_semanticsbefore interpreting any raw or normalized result field. Apply each matching entry'sunit,meaning, andcaveats; do not replace the live glossary with remembered source definitions. - Inventory all families expected for the selected request before summarizing. For a scoped request, require only its selected family plus
evidence,signals,limitations, andusage; do not misreport intentionally unrequested families as missing. - For full depth only: count every array and include every relevant item. For concise depth: report counts and the strongest items, and state that more rows are available from the same
request_id. - Build a set of available
evidence_idvalues for any claim you make. - Verify every cited
evidence_refsandcounter_evidence_refsitem points to that set. - Treat metrics, intent, search observations, trend evidence, and audience evidence as separate evidence families.
- Mark stale timestamps, unavailable nodes, sparse results, and conflicting evidence explicitly.
- Do not infer absence of demand from absence of one optional evidence family.
- If
usage.cachedis true after a resubmit, treat it as reuse of an existing result and mention it only when freshness matters.
Interpretation Rules
- Label direct result fields as observations.
- Label synthesis across multiple evidence items as inference.
- Prefer corroborated signals supported by more than one evidence family.
- Surface counter-evidence next to the claim it weakens.
- Explain confidence using evidence quality and coverage, not intuition.
- Distinguish keyword demand from target-domain fit.
- Distinguish search intent from content format.
- Distinguish current observations from durable trends.
- Use returned URLs only as traceability links; do not claim to have read their page bodies.
- Mention usage metadata only when it is relevant to the user's requested methodology or freshness explanation.
- Preserve values and units exactly for any figure you report. Do not round, merge, deduplicate, or translate keyword strings, URLs, timestamps, IDs, counts, ranks, or metric values unless the user explicitly requests a transformed view.
- Prefer tables for arrays, but keep concise depth unless full export was requested.
Language Rules
- Treat MCP
languageas research scope only. Never use it as the sole signal for response language. - Honor an explicit response-language request even when it differs from the MCP research language.
- Without an explicit response-language request, answer in the user's conversation language; default to English only when that language is unclear.
- Keep codes, tool names, IDs, enum values, URLs, and JSON property names unchanged.
- Do not copy the language of incidental evidence when it conflicts with the selected response language.
- When response language differs from research language, preserve the submitted research language in a concise methodology note.
Response Format
Concise (default)
Summary: two to four evidence-grounded observations.- Key metrics / patterns needed for the goal, with exact values cited.
- A short evidence note with the strongest supporting IDs or URLs.
Limitations: all limitations that affect the claim.Source job:request_id(and whether this answer reused a prior job).- Optional next steps: offer full export or a scoped refresh only if useful.
Full (only when the user asks for complete dump / full export)
Provide every section relevant to the selected request:
SummaryKeyword overview(all returned overview fields)Related keywords(every item)SERP(every organic result and feature)Google Trends(every returned point/query/region)X recent search(every returned post)Evidence and signals(every item and reference IDs)Limitations and usageNext steps
For a comparison request, use one row per keyword or market and keep definitions consistent across rows. Reuse prior jobs per row when available. Do not compare requests with different markets or languages without labeling that difference.
Failure Recovery
- Unsupported market or language: report the exact normalized pair and ask for an alternative. Do not substitute silently.
- Request not found: verify the original
request_id. Do not immediately create a new request; retrygetonce, then resubmit only with the sameidempotency_keyif the user still needs the research. - Tool unavailable: report that live research could not be completed; do not guess at internal causes or fabricate results.
- Polling deadline reached: return the current status and
request_id; do not submit again automatically. Later turns must resume withgeton thatrequest_id. - Partial terminal result: use successful evidence and clearly isolate limitations. Reuse this job for follow-ups that only need the successful families.
- Unknown evidence reference: omit the unsupported claim and report the consistency issue.
- Retry after failure: prefer the prior
idempotency_keyfor the same logical identity. Create a new key only when the user changes keyword, domain, market, language, or scopes, or explicitly asks for a distinct new job.
Examples
Reuse prior job in the same conversation:
User: Research "AI SEO tools" for example.com in US English.
(agent submits once, stores request_id)
User: Summarize the demand signals again more briefly.
(agent calls get on the same request_id only; no new submit)
Single-market research (first time):
Use $research-seo-signals to research "AI SEO tools" for example.com in the US English market.
Localized research:
Use $research-seo-signals to research "herramientas SEO con IA" for example.com in the US Spanish market and answer in Spanish.
Evidence-focused follow-up (must reuse prior terminal job when available):
Use $research-seo-signals to summarize only the strongest supported demand and intent observations, including counter-evidence and limitations.
Single-family request:
Use $research-seo-signals to fetch only the organic SERP data for "AI SEO tools" for example.com in the US English market.
Ambiguous request (confirm before calling):
User: 帮我查一下关键词“AI SEO 工具”。
Agent: 你具体需要哪类底层数据:搜索量/CPC/竞争度与意图、相关关键词、当前 SERP,还是 Google Trends 趋势?可以选一项或多项。我会只请求你需要的数据。
Combined request:
Use $research-seo-signals to research only SERP patterns and Google Trends for "AI SEO tools" for example.com in the US English market.
Explicit refresh:
Use $research-seo-signals to refresh the SERP data for "AI SEO tools" for example.com in the US English market.
Reference
Read references/mcp-contract.md before the first live call, when interpreting terminal envelopes, or when diagnosing tool and request-state errors.
Related skills
Runs SERP and keyword research via the Crawlora API — Google, Bing, Brave, DuckDuckGo, and Yahoo search results plus Google Trends interest-over-time and related/rising queries — returning clean JSON. Use when the user wants search-engine rankings, SERP snapshots, autocomplete/keyword suggestions, or trend data instead of scraping result pages.
Collect and analyze public social and SEO data
Collect and analyze public SEO data
Buy market data and real-world actions per call with USDC (x402, no signup, no API key) from agent.connskill.com - keyword volume by location, Google SERP snapshots with AI-overview and PAA blocks, site audits with a real crawl, backlinks, competitors, SMS verification numbers, receive-only inboxes, GDPR-compliant LLM chat hosted in Germany, and a trust check for other x402 sellers. Use when an agent needs SEO or SERP data, a phone number or inbox for a verification, EU-hosted inference, or wants to vet an x402 seller before paying it.
Evidence-backed competitor and market analysis