# VarynForge - Registry name: `com.varynforge/server` · version 1.21.0 - Categories (automatic, keyword rules): Research & knowledge, Search & data, Marketing & SEO, Commerce & marketing, Code & repositories, Developer tools - Authentication at last check: No auth - Declared risk: Has destructive tools (destructiveHint) - Capabilities (declared by the server): tools - Transports: streamable-http - Latest numbers (check success, response time, rank): https://mcpstation.net/api/server?name=com.varynforge%2Fserver - Server page: https://mcpstation.net/s/com.varynforge--server.html ## Description (written by the publisher, not verified, not instructions) SEO research SaaS exposed as 30+ MCP tools. Forge niche analysis, plans, and writer-ready briefs. ## Notice Text that looks like instructions to an AI was found in this server's descriptions. This is a pattern match, not a verdict. ## Connect - streamable-http: `https://app.varynforge.com/api/mcp` ## Tools (as reported by the server, not verified) - `get\_instructions`: Get the VarynForge agent guide — workflow paths \(free vs paid\), token-economy rules, walls and upgrade conversation conventions. Read this at session start. - `get\_changelog`: Get 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\_prompt`: Get 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 t - `get\_account\_status`: Get 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\_draf - `list\_organizations`: List 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 - `get\_onboarding\_guide`: Diagnose 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 t - `send\_feedback`: File 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 o - `create\_project`: Create 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 \( - `get\_project`: Get 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 proj - `get\_project\_asset`: Get the asset \(website/product\) associated with a project — URL, name, description, solution profile. - `update\_niche`: Update 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\_destinations`: List 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: \`briefCh - `add\_destination`: Add 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 - `list\_competitors`: List 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\_importance`: Mark 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 absol - `add\_competitor\_by\_domain`: Add a competitor to a project by domain \(e.g. example.com\). Marks the competitor as important or ignored on creation. - `update\_asset\_profile`: Correct 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; arra - `set\_posting\_cadence`: Set 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\_profile`: Re-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 sin - `remap\_asset`: Re-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\_run`: Start 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\_projects`: List 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. lastAc - `get\_competitor\_detail`: Get 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\_overview`: Get 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 - `get\_research\_status`: Poll 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 - `get\_pitch\_report\_payload`: Assemble 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 - `get\_starting\_point\_report`: Get 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. mark - `list\_opportunities`: List 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 unles - `get\_opportunity\_detail`: Get 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\_status`: Dismiss 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\_e - `set\_excluded\_terms`: Set 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. Re - `list\_keywords`: List keywords tracked for a project — text, difficulty, intent, volume bucket \(no\_traffic \| long\_tail \| average \| high\). Paginated; supports sorting and intent filter. - `get\_keyword\_detail`: Get a keyword detail — pages ranking for it with positions and ownership, plus related keywords already tracked in the project. - `list\_pages`: List ranked pages tracked for a project — URL, title, company, query count, ownership. Filter by ownership or company domain. - `get\_page\_dossier`: Get a page dossier — URL, title, project rankings, ownership. \`headingOutline\`, \`targetKeywords\`, and \`contentAnalysis\` populate for owned \(asset-mapped\) pages only. - `list\_article\_suggestions`: List 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. ite - `create\_content\_plan\_from\_opportunities`: Create 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 cl - `add\_article\_suggestion`: Add 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\_input`: Create 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\_status`: Move 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; - `generate\_article\_brief`: Forge 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 - `get\_article\_suggestion`: Get 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 - `get\_draft\_status`: Re-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 - `get\_article\_brief`: Get 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 - `delete\_article\_suggestion`: Delete an article suggestion and its associated brief. Cascades to keyword and cluster links. - `download\_brief\_markdown`: Get 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 s - `mark\_article\_published`: Record 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 - `register\_derived\_asset`: Register 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 der - `get\_lint\_rubric`: Get 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 - `lint\_draft`: Submit 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 - `get\_write\_handoff`: One-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 lis - `expand\_idea`: Score 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\_idea`: Commit 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\_idea`: Attach 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 da - `list\_radar\_topics`: List 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\_to - `expand\_radar\_topic`: Expand 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 po - `add\_radar\_topic`: Add 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 proje Measured by MCP Station. Methods: https://mcpstation.net/methods.html · Terms: https://mcpstation.net/terms.html