Install
openclaw skills install @jerrykik/research-growth-signalsopenclaw skills install @jerrykik/research-growth-signalsUse one connected SignalDig MCP to turn a user's natural-language question into the smallest sufficient Social or SEO research request. SignalDig owns source selection within the requested direction, parameter conversion, native pagination, background execution, deduplication, and public-data filtering.
This Skill has no data of its own. Before research, inspect the visible MCP tools for both research_social_signals and research_seo_signals. The server alias and any local tool namespace are client-defined; use the exact visible identifiers and never construct an mcp__<alias>__<tool> name.
If the required tool is unavailable, the connection fails, or authentication is rejected, stop. Never simulate results from general knowledge. Tell the user that SignalDig is not connected and direct them to Connect SignalDig. Do not expose endpoints, configuration internals, or machine error codes in that failure response.
research_social_signals for public discussions, posts, authors, native engagement, or cross-platform social evidence.research_seo_signals for keyword demand, intent, related queries, SERP, trends, competitors, GEO visibility, backlinks, ranked keywords, or traffic evidence.analysis_id values separate.action="submit", the natural-language request, and the smallest explicit business scope accepted by the live schema.analysis_id in conversation state.queued or running, wait for retry_after_seconds and call the same tool with action="get", view="status", and that analysis_id. Never resubmit merely because work is slow.
Treat the top-level task status as authoritative: coverage counts and stop reasons in a non-terminal
response are provisional and must never be used to infer source failure or exhaustion.completed, partial, or failed. Reuse the terminal analysis for later questions unless the user explicitly asks for a refresh or changes scope.coverage as the actual retrieval boundary. Preserve limitations; never describe partial evidence as exhaustive or representative.scope.data_scopes list containing the smallest useful evidence set for the user's goal. Never omit it and rely on service defaults.backlink_analysis, ranked_keywords, and bulk_traffic_estimation are target-level evidence with distinct cost and meaning. Include any combination that is reasonably necessary for the requested outcome; do not bundle unrelated families merely because a target was supplied.geo_score is a domain-only US/en score with benchmark and citation evidence. Use it alone,
provide scope.domain, omit scope.keyword, and never mix it with geo_analysis or other scopes.refresh=false is the default. Use refresh=true only when the user explicitly requests fresh collection.analysis_id. Provide a full item export only when requested.Translate the user's request into the live research_social_signals schema:
request: focused natural-language retrieval goal.scope.platforms: only explicitly requested supported platforms.search: structured topic, concepts, entities, language, and source-scoped constraints only when the user stated them. Never write native search operators here.result_budget.total: the requested total upper bound, or a modest default when absent. Use result_budget.per_source only when the user explicitly allocates counts by source.research_depth: use quick, standard, or deep only to reflect the user's stated depth; default to standard.refresh: normally false.Use the same research_social_signals Tool for entity retrieval, but do not mix entity targets
with topic-search scope or search fields:
operation="post_detail" and pass target.post_ids with 1–100 unique
decimal Post IDs. Use IDs from a prior trusted result or extract the numeric status ID from a
public X URL; never invent an ID.operation="user_account_post" and pass exactly one target.user_id (24-character profile
token) or target.share_url. Do not use a visible account number or nickname as user_id.operation="user_posts" and pass exactly one
target.user_id or target.share_url. This is a separate bounded post retrieval task and
returns a new analysis_id; it does not continue a user_account_post task.request as the short natural-language retrieval goal. Do not send scope, search,
result_budget, or max_results for these three entity operations.analysis_id with the same tool and explicit status/results protocol. X
details and Xiaohongshu user posts use social_posts; Xiaohongshu account results can be read
from social_profiles and social_posts using separate result reads with the same analysis ID.user_account_post operation; use user_posts for posts-only retrieval and explain
that it is a new bounded task rather than a continuation of a previous result.Do not encode provider-native sort values, search IDs, page numbers, native language operators, or continuation tokens. When the user asks for up to 200 matching Xiaohongshu items, submit result_budget.total=200; the service owns bounded page traversal and reports the achieved count.
Bind engagement constraints to their named source. Likes, replies, and reposts apply only to X; score and comments apply only to Reddit. Do not translate one platform's metric into another. If the user says only “popular” or “high engagement,” omit a numeric constraint and let the service report actual coverage.
Zhihu supports bounded public topic retrieval through the same Social Tool and social_posts Dataset. Do not call or mention a legacy Zhihu-specific Tool. Treat a returned source limit or unsupported language/time constraint as coverage information; do not resubmit with guessed native parameters.
Translate the user's request into the live research_seo_signals schema:
request: the natural-language research goal.scope.market and scope.language: normalized business inputs required by the live schema.scope.keyword: required for every SEO scope except domain-only geo_score; omit it for geo_score.scope.domain for traditional keyword/SERP/trend research, competitor analysis, GEO visibility,
and domain-level Geo Score evidence.scope.target for backlink analysis, ranked-keyword inventory, or traffic estimation when the target is a domain, subdomain, or webpage URL. Do not send both domain and target.scope.data_scopes: required, explicit, non-empty, unique, and limited to the smallest useful evidence set supported by the user's goal.scope.search_engine: set only from the user's explicit engine choice; otherwise use the service default.research_depth: default standard.refresh: normally false.Keep research language separate from response language. Do not expose or construct provider tasks, locations, endpoints, devices, or internal capability names.
Supported SEO scope families are keyword_overview, domain_rank_overview, related_keywords, serp,
google_trends, x_recent_search, competitor_analysis, geo_analysis, geo_score, backlink_analysis,
ranked_keywords, and bulk_traffic_estimation. Do not submit bulk_pages_summary through the
unified Tool; it is not part of the current public Research result contract.
Use these as semantic examples for target-level scopes:
| User's direct evidence need | Allowed scope |
|---|---|
| Incoming links, referring domains, or link profile | backlink_analysis |
| Queries or keywords for which the target currently ranks | ranked_keywords |
| Estimated organic or paid traffic for the target | bulk_traffic_estimation |
These examples are not keyword triggers. Infer the evidence needed from the requested outcome and
context. A broad site audit does not automatically require all three, but a request to explain organic
visibility may reasonably combine ranking and traffic evidence even if the user does not name those
Datasets. When one goal needs both domain-based evidence and target-level evidence, submit the minimum
separate analyses required by the mutually exclusive scope.domain and scope.target inputs, keep their
analysis_id values separate, and synthesize only after both reach a terminal state.
view="status" to check one analysis_id or an ordered analysis_ids collection without returning result bodies.view="results" only for terminal or partially terminal work. Select one Dataset per call and use the same ordered analysis collection for every page.dataset="social_posts". For SEO, use the Dataset matching the requested evidence family:
keyword_overview, domain_rank_overview, related_keywords, serp_results, google_trends,
x_recent_search, ranked_keywords, backlinks, competitor_domains, geo_mentions, geo_score, or
traffic_estimation.keyword_overview, domain_rank_overview, google_trends, geo_score, and
traffic_estimation) return one public record and do not provide a next cursor. Do not retry or
invent pagination for them.related_keywords, serp_results, x_recent_search, ranked_keywords,
backlinks, competitor_domains, and geo_mentions) may return multiple records and can expose
page.next_cursor; continue only when page.has_more=true.page_size to the number of records useful for the current reasoning step. Treat it as an upper bound because response-size safety may return fewer records.page.next_cursor, passed back as result_cursor with the same tool, analysis IDs in the same order, and the same Dataset.N more pages, read at most N additional pages and stop early when
page.has_more=false. A page shorter than page_size is not an end condition by itself.view remain compatible, but prefer the explicit status/results protocol for new work.analysis_id and status so a later turn can resume with get; do not submit again.partial: use available evidence and identify the missing coverage.failed: say SignalDig could not complete the requested research and suggest retrying later. Never reconstruct technical causes from hidden fields.Read references/mcp-contract.md before the first live call or when interpreting a response whose live schema differs from this Skill.