VarynForge
SEO research SaaS exposed as 30+ MCP tools. Forge niche analysis, plans, and writer-ready briefs.
Connect it
Settings → Connectors → Add custom connector
URL: https://app.varynforge.com/api/mcpSettings → Apps & Connectors → Advanced → Developer mode
Create connector with URL: https://app.varynforge.com/api/mcp{
"mcpServers": {
"server": {
"url": "https://app.varynforge.com/api/mcp"
}
}
}claude mcp add --transport http server https://app.varynforge.com/api/mcp{
"servers": {
"server": {
"type": "http",
"url": "https://app.varynforge.com/api/mcp"
}
}
}57 tools, verified live
get_instructionsread-onlyGet the VarynForge agent guide â workflow paths (free vs paid), token-economy rules, walls and upgrade conversation conventions. Read this at session start.
get_changelogread-onlyGet the URL of the VarynForge product changelog â what shipped, newest first, in plain markdown. Fetch it when the operator asks what is new, and in the days after a send_feedback report to check whether the gap they hit has been closed.
get_writer_system_promptread-onlyGet the writer system prompt for drafting one content type from its brief. The writer works with your Varyn account context: every channel prompt binds to the brief, its acceptance rubric, and the opportunity behind the brief fetched from the account, and degrades to generic writing advice without them. Pass `channel` (article | x | linkedin | reels | youtube) â each channel has its own methodol
get_account_statusread-onlyGet the operator account status â the organization whose plan/credits/limits this payload describes (plans and usage limits are per-organization; see list_organizations), current plan, available credits, brief quota state, the lint_draft daily verification cap (applies on every tier; check lint_drafts_remaining_today before a verification loop), the idea_checks allowance (check_idea is daily- AN
list_organizationsread-onlyList the organizations this account belongs to â id, name, your role (owner | admin | member), is_personal, plan, and member_count â plus pending invitations awaiting a response (accept them in the web app). Plans, credits, and usage limits are per-organization, and a project belongs to exactly one organization. Pass an organizationId to create_project to target a specific organization, or to
get_onboarding_guideread-onlyDiagnose where the operator is in their VarynForge journey and get a guided setup path. Call when the operator asks to set up VarynForge, get started, or seems unsure what to do next â and always when list_projects returns empty. Returns the server-derived stage, a stage-tailored pitch to relay to the operator, a setup checklist with done/pending status per step, and the ranked next_actions queu
send_feedbackFile a note to the VarynForge team: a bug, a missing capability, a friction point, or an operator idea. Call when you hit something VarynForge cannot do, a confusing tool result, or the operator voices frustration or a wish. Whenever the task would benefit from a capability this tool list does not offer, file a missing_capability BEFORE you settle for a workaround with existing tools, even if they
create_projectCreate a new project â pass either a website URL or a niche description (or both). Returns projectId immediately; niche analysis and asset mapping run async. Poll get_project until niche.analysisStatus is ready. When the operator says whose site this is, pass siteRelation: mine (their own), client (an existing client), or prospect (a site they are pitching) â ask only if it is ambiguous, never
get_projectread-onlyGet one project â its canonical name (operator-set, falling back to site brand then niche name), niche profile, target audience, current research status, and postsPerWeek (the operatorâs publishing cadence, settable via set_posting_cadence; sizes the pitch reportâs 90-day sequence). Address the project by `name`; `niche.name` is the market niche, not the project name.
get_project_assetread-onlyGet the asset (website/product) associated with a project â URL, name, description, solution profile.
update_nichecan modifyUpdate a niche profile â name, industry, language, country, target customer, core problem, related terms. Use after the operator refines their market definition; omitted fields keep their current values.
list_destinationsread-onlyList the project's destinations â where the operator publishes (website, youtube_channel, tiktok, instagram, x, linkedin, local_business). Destination type ids are the `format` labels lint_draft stores drafts under. Each row carries its capabilities so you never cross-reference other tools: `briefChannel` is the brief/lint channel the type maps onto (null for open slots), `verifiable` says lint_
add_destinationAdd a destination to a project â where the operator publishes. Pass `type` (website | youtube_channel | instagram | tiktok | x | linkedin | local_business) and `name` with `state: 'detected'` for a destination that already exists and belongs to the operator (website name = the domain like yourdomain.com; social types = the handle, @ optional), or `state: 'planned'` for one they intend to build (
list_competitorsread-onlyList companies for a project â marked competitors (important / default / ignored) and SERP-discovered companies (unmarked). Sorted important â default â unmarked â ignored, then by domain. Pass `importance` to filter to one bucket. Capped at 100.
set_competitor_importancecan modifyMark a competitor important, default, or ignored. Important applies a 1.25Ã boost on opportunity scores for clusters where the competitor ranks top-10. Scores are then normalized 0-100 against the highest-scoring cluster, so other clusters may appear to drop in relative ranking even when their absolute (raw) scores did not change â cross-check via get_opportunity_detail.rawOpportunityScore. Ign
add_competitor_by_domainAdd a competitor to a project by domain (e.g. example.com). Marks the competitor as important or ignored on creation.
update_asset_profilecan modifyCorrect the inferred profile of the project asset â description, primary offer, benefits, key differentiators, use cases. Use when get_project_asset shows claims that contradict what the operator actually sells (profileStaleAt set, or the operator says so). Only the fields you pass are written; arrays replace the whole list. No re-crawl happens. Clears the profileStaleAt flag.
set_posting_cadencecan modifySet how many articles per week the operator actually publishes (1-14). Sizes the pitch reportâs 90-day content sequence; read back via get_project.postsPerWeek.
resync_asset_profilecan modifyRe-read the project website and re-infer the asset profile (name, description, primary offer, benefits, differentiators, use cases) from its current content. Use before rendering a report when get_pitch_report_payload flags assetProfile.syncedBeforeRun â the stored profile facts may have drifted since they were written. Overwrites the profile facts (fields the site no longer supports inferring a
remap_assetcan modifyRe-crawl the project website and refresh its owned pages. Use when get_project_asset shows mappingStatus "error" or owned pages look stale. Rate-limited per site; returns an error naming the wait time if the cooldown is active.
start_research_runcan modifyStart a research run for a project â discovers keywords, evaluates competitors, and writes opportunity clusters. Consumes one credit. Returns `{ runId }`; poll get_research_status for progress. Returns `{ entitlement }` instead when the operator is on the free plan.
list_projectsread-onlyList all projects for the authenticated operator â paginated, sortable by createdAt, niche, or industry. `name` is the canonical project name (operator-set, falling back to site brand then niche name) â match operator references against it; `niche.name` is the market niche, distinct metadata. lastActivityAt is the most recent change to the project or any of its content pieces â when the oper
get_competitor_detailread-onlyGet a competitor company detail in a project context â domain, name, importance, top pages in the project SERPs, and top keywords they rank for.
get_project_overviewread-onlyGet the at-a-glance read on a project â niche summary, keyword stats, nextActions (the ranked queue of what to do next in this project â offer its first entry when the operator asks "what now?"), and topPriorities: the ranked queue of article suggestions (best first â priorityScore desc; radar-born suggestions carry no score until briefed and rank oldest-first below scored ones; source tells
get_research_statusread-onlyPoll the latest research run for a project â runId, status, current pipeline phase, progress percent, elapsed seconds, and structured failure diagnostics when failed. failure carries failureClass (upstream_timeout | upstream_rate_limited | invalid_input | internal | unknown), the phase the run died in, retryable (true = transient upstream issue, safe to retry; false = retrying will fail again â
get_pitch_report_payloadread-onlyAssemble the client-ready pitch report payload for a completed research run â niche + solution profile, competitor landscape, ranked opportunity map holding GAPS ONLY (0-100 normalized; demand sized as volumeBucket buckets, no search-volume numbers by design; each entry carries overlapStatus net_new|partial plus siteOverlap â covered-keyword share + closest owned pages), coveredOpportunities a
get_starting_point_reportread-onlyGet the free starting-point report for a project â a client-facing document assembled from setup-time data: positioning (niche + market profile), the site and its current content inventory, the curated competitor set, and early rising-topic signals. Free on every plan, no research run required. markdown is the ready-to-send render; the structured fields are the same data for custom rendering. lo
list_opportunitiesread-onlyList content opportunity clusters sorted by opportunity score. Goal filters: fast_wins, high_intent, authority_building, competitor_gap. coverage filters by site-coverage status and defaults to ["gap","partial"] â clusters the site already COVERS (ranks top-10 for a cluster keyword) are hidden unless "covered" is included (refresh candidates). Dismissed clusters (set_opportunity_status) are hidd
get_opportunity_detailread-onlyGet a cluster detail â top-20 keywords by score, top-10 ranked pages by position, top-5 competitor podium, linked article suggestions, and rawOpportunityScore (un-normalized; list_opportunities returns the 0-100 normalized version).
set_opportunity_statuscan modifyDismiss or restore an opportunity cluster. status=dismissed hides it from list_opportunities and the create_content_plan_from_opportunities harvest; status=default restores it. Dismissal lasts until the next research run rewrites the project clusters â for a durable "not my product" signal use set_excluded_terms. Removing a cluster from the pool changes the 0-100 normalization of every remaining
set_excluded_termscan modifySet the project-level exclusion terms â products or topics the operator explicitly does NOT sell (e.g. "wedding suite", "free template", "printing"). Keywords mentioning any term are down-weighted in opportunity scoring and dropped from the content-plan harvest, before results reach the operator. Replaces the whole list; pass [] to clear. Survives research re-runs, unlike per-cluster dismissal.
list_keywordsread-onlyList keywords tracked for a project â text, difficulty, intent, volume bucket (no_traffic | long_tail | average | high). Paginated; supports sorting and intent filter.
get_keyword_detailread-onlyGet a keyword detail â pages ranking for it with positions and ownership, plus related keywords already tracked in the project.
list_pagesread-onlyList ranked pages tracked for a project â URL, title, company, query count, ownership. Filter by ownership or company domain.
get_page_dossierread-onlyGet a page dossier â URL, title, project rankings, ownership. `headingOutline`, `targetKeywords`, and `contentAnalysis` populate for owned (asset-mapped) pages only.
list_article_suggestionsread-onlyList article suggestions for a project â title, status, priority, cluster, intent, source, publishedAt, scheduledFor, and a per-channel distributions rollup ({ channel, count, latestAt, scheduledFor } per channel the content went out on). Use distributions to spot gaps from the list alone â e.g. items with no linkedin entry have no LinkedIn post yet â without per-item reads. Page through sug
create_content_plan_from_opportunitiesCreate a content plan by harvesting the top-30 opportunity clusters from a completed research run. Auto-creates article suggestions linked to each cluster. Left out of the harvest: dismissed clusters (set_opportunity_status), keywords matching the project exclusion terms (set_excluded_terms), and clusters the site already covers (>=80% of keywords covered â refresh work on existing pages surface
add_article_suggestionAdd a bare article suggestion to a content plan (title + optional intent and reasoning). For richer input that produces a brief-ready suggestion, use create_article_suggestion_with_input.
create_article_suggestion_with_inputCreate a brief-ready article suggestion from the operator's own input. Auto-resolves a default content plan; creates/links search-query rows for the keywords; returns suggestionId + contentPlanId. Free-tier compatible (no research run required).
update_article_statuscan modifyMove an article through the production pipeline. Statuses: planned, generating_brief, brief_ready, drafting, draft_ready, reviewing, ready_to_publish, published. For the published transition use mark_article_published instead â it records the live URL, which Search Console outcome tracking keys off; setting status to published here records no URL. When the article is scheduled to go live later (
generate_article_briefForge a writer-ready brief from an article suggestion. `channel` picks the brief template: article (default, SEO article outline), reels (hook/beats/shot list), youtube (retention beats/chapters), x (thread posts), linkedin (carousel slide deck: cover hook, one-idea slides, recap, CTA). A suggestion holds one brief per channel â generating a second channel adds a brief without touching the other
get_article_suggestionread-onlyGet article suggestion details â metadata, cluster context, brief availability, registered derived assets (carousels, social posts), target keywords with volumes. Call get_article_brief for the full brief. Status semantics: generating_brief with briefQueuedAt set means the brief is QUEUED behind the free daily cap (forges automatically at reset); briefQueuedAt null means actively forging.
get_draft_statusread-onlyRe-read an article suggestion's verification state without re-linting: the suggestion's single pipeline status plus, per destination `format`, the stored draft and the latest gate receipt (verdict, per-check detail, thresholds) from its last lint_draft submission. Free and uncapped â always use this instead of lint_draft to recover a known verdict. Pass `format` to read one destination including
get_article_briefread-onlyGet the full content brief for an article suggestion. A suggestion holds one brief per channel â pass `channel` (article default | reels | youtube | x | linkedin) to pick which. Every brief carries hookStatement (one verbatim-usable hook sentence naming the reader payoff); article briefs also carry keyStats (a stat bank of { claim, value, source, sourceUrl } entries for evidence blocks and data
delete_article_suggestioncan modifyDelete an article suggestion and its associated brief. Cascades to keyword and cluster links.
download_brief_markdownGet a brief as inline markdown the host agent can use as a writing prompt. Pass format=markdown_inline, and `channel` (article default) to pick which of the suggestionâs per-channel briefs to render. Returns the brief assembled into a single markdown string capped at ~8K chars â markdown only; the structured fields are get_article_briefâs job and are omitted here.
mark_article_publishedcan modifyRecord that an article went live at a URL. Flips the suggestion to published, writes the distribution ledger row, stamps the Passport, and pings IndexNow. Call it only once the URL actually resolves â the IndexNow ping fires immediately, and a ping for a dead URL is wasted (search engines crawl, hit the 404, drop it; nothing re-pings later). For a CMS-scheduled article, set scheduledFor via upda
register_derived_assetRegister a derived asset (LinkedIn carousel PDF, social post, video, image) produced from an article suggestion. Appends a distribution-ledger row so the suggestion shows everything it produced â the article plus its derivatives â for content-ROI reporting (get_article_suggestion returns them as derivedAssets). Pass `channel` (reels | youtube | x | linkedin) so the app can show per-channel dis
get_lint_rubricread-onlyGet the verification rubric for an article suggestion: the submission format for the channel (markdown | --- separated thread | post-with-slides | production script), required vs advisory checks, the exact numeric limits each check grades against (checkParams), plus the brief fields lint_draft reads (keywords, outline, FAQ, channel payload). Pass `channel` to read the rubric of that channel's brie
lint_draftSubmit a draft for verification against its brief. Returns a pass/flag verdict with per-check detail. Pass moves the article to ready_to_publish; flag moves it to draft_ready for revision. `channel` (article | reels | youtube | x | linkedin) declares WHICH of the suggestion's per-channel briefs the draft is graded against AND the submission shape â always pass it for non-article content; when om
get_write_handoffread-onlyOne-call writer handoff: returns a compact writing payload for an article suggestion (brief essentials, keywords, acceptance criteria, lint instructions). Compact by design â FAQs cap at 6 and long sections degrade to fit a deep-link budget; the FULL brief is get_article_brief and the full check list is get_lint_rubric, so verify against those, not this. deepLinks (ChatGPT/Claude URLs embedding
expand_ideaScore a raw article idea against the project's niche without writing anything to the plan. Returns a title, angle, search intent, related queries, a coarse demand estimate, and a 0-100 niche-fit score. Pass the returned fields to accept_idea to commit the idea as a brief-ready suggestion.
accept_ideaCommit an expanded idea (from expand_idea) to the content plan as a brief-ready article suggestion. Stores the verbatim idea as provenance, lands the suggestion in generating_brief, and forges its brief automatically (free tier: queues past the daily cap). Returns the new suggestionId.
check_ideaAttach real search data to one article idea that is already in the project â runs one live Google search per target keyword and returns volume bands and the pages currently ranking for each. Use after create_article_suggestion_with_input, or on any existing suggestion the operator wants judged on data instead of instinct. Opportunity score and cluster placement are returned only when the project
list_radar_topicsread-onlyList the latest emergent-topic radar snapshot for a project: rising narrative topics (label, summary, momentum, novelty, drivers, evidence) with per-topic index and how many article suggestions were already added from each. Returns null when the project has no radar snapshot yet. Use expand_radar_topic to turn a topic into article angles.
expand_radar_topicExpand one radar topic (by signalObservationId + topicIndex from list_radar_topics) into 3-6 candidate article angles with title, intent, and editorial positioning; each angle is flagged when a near-duplicate already exists in the content plan. Optionally pass customPov for angles from a specific point of view. No writes â pass chosen angles to add_radar_topic.
add_radar_topicAdd selected angles from a radar topic to the content plan as radar-born article suggestions (provenance preserved; exact-title duplicates skipped). Angles come from expand_radar_topic; call list_radar_topics first to get signalObservationId + topicIndex. Auto-creates the content plan when the project has none. Each added suggestion lands in generating_brief and its brief forges automatically (fre
Alternatives in Search & Research
Compare →SSSEO SkillA
Free Google Search Console MCP: your real GSC, Google Analytics and keyword data for AI agents.
GitHitsA
Search public open-source code, documentation, metadata, vulnerabilities, changelogs, and examples.
CMClinicaltrialsgov MCP ServerA
Search ClinicalTrials.gov: find studies, retrieve results, match patients to candidate trials.
ESG Hub MCP ServerA
ESG knowledge base for AI agents: hybrid search, glossary, frameworks, industries, graph traversal.
pmndrs docsA
Search and read the docs and examples of react-three-fiber, drei, zustand, jotai... from your agent
PMPubmed MCP ServerA
Search PubMed/Europe PMC, fetch articles and full text (PMC/EPMC/Unpaywall), citations, MeSH terms.