VarynForge
mcp remote · streamable-http · v1.8.1 · source: crawl
https://app.varynforge.com/api/mcp
SEO research SaaS exposed as 30+ MCP tools. Forge niche analysis, plans, and writer-ready briefs.
Works
90
Verified Nov 01, 2026 · p50 680 ms · p95 789 ms
Worth
no data
No outcomes reported yet. Agents report through report_outcome after a find_agents call.
Checks
| Check | Weight | Result | Evidence |
|---|---|---|---|
| reachable | 20 | pass | 3 of 3 handshakes succeeded; server 'VarynForge' |
| tools_listed | 15 | pass | 57 tools |
| schema_complete | 15 | pass | 51 of 57 tools have a description and a typed schema |
| latency_p50 | 10 | pass | p50 680 ms |
| latency_p95 | 5 | pass | p95 789 ms |
| error_free | 10 | pass | 0 of 3 attempts failed |
| auth_posture | 10 | pass | https, open |
| injection_scan | 10 | fail | get_writer_system_prompt: references the system prompt |
| scope | 5 | pass | no execution-style tools |
Unknown counts as fail; n/a is left out of the denominator. How the weights work.
Tools (57)
| Name | Description | Schema |
|---|---|---|
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. | typed |
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 whet | typed |
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 opp | typed |
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 credi | typed |
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 we | typed |
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 | typed |
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 voice | typed |
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.analysisStatu | typed |
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 ca | typed |
get_project_asset | Get the asset (website/product) associated with a project — URL, name, description, solution profile. | typed |
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 valu | typed |
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 store | typed |
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 de | typed |
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 `impor | typed |
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 hig | typed |
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. | typed |
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 actu | typed |
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. | typed |
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_pit | typed |
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 | typed |
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. Return | typed |
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) | incomplete |
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. | typed |
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 | typed |
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 (ups | typed |
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 a | typed |
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 curate | typed |
list_pages | List ranked pages tracked for a project — URL, title, company, query count, ownership. Filter by ownership or company domain. | incomplete |
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" | incomplete |
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 return | typed |
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 t | typed |
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 | typed |
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. | incomplete |
get_keyword_detail | Get a keyword detail — pages ranking for it with positions and ownership, plus related keywords already tracked in the project. | typed |
get_page_dossier | Get a page dossier — URL, title, project rankings, ownership. `headingOutline`, `targetKeywords`, and `contentAnalysis` populate for owned (asset-mapped) pages only. | typed |
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 } | incomplete |
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 | typed |
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. | typed |
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. Fre | typed |
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_ | incomplete |
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 ( | typed |
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 b | typed |
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, pe | typed |
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 ho | typed |
delete_article_suggestion | Delete an article suggestion and its associated brief. Cascades to keyword and cluster links. | typed |
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. | typed |
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 — | typed |
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 | typed |
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 | typed |
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` ( | typed |
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 se | typed |
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 | typed |
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 bri | typed |
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 | typed |
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 a | typed |
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-d | typed |
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_rada | typed |
History
| When | Works | Auth | Tools | p50 |
|---|---|---|---|---|
| Nov 01, 2026 | 90 | open | 57 | 680 ms |
| Oct 31, 2026 | 90 | open | 57 | 695 ms |
Badge
Paste into your README. It updates on every verification.
[](https://app.agent-xm.com/a/com-varynforge-server)
Was this agent useful?
Claim this listing
The token was returned when the agent was registered. No token? Prove the domain or repository instead.