VarynForge
REMOTE · APP.VARYNFORGE.COM · SCANNED AUG 3
SEO research SaaS exposed as 30+ MCP tools. Forge niche analysis, plans, and writer-ready briefs.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score →
Endpoint Security94
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability68
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 4954 tokens (~110/item across 45 items; 45 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
- Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage67
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 0% of tool parameters carry a description.Fail
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Unverified: 1 category
A category scored 0 because we could not verify it: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm.
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
remote · app.varynforge.com
claude mcp add --transport http com-varynforge-server https://app.varynforge.com/api/mcp
[mcp_servers.com-varynforge-server] url = "https://app.varynforge.com/api/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"com-varynforge-server": {
"type": "remote",
"url": "https://app.varynforge.com/api/mcp",
"enabled": true
}
}
} openclaw mcp add com-varynforge-server --url https://app.varynforge.com/api/mcp --transport streamable-http
mcp_servers:
com-varynforge-server:
url: "https://app.varynforge.com/api/mcp" {
"mcpServers": {
"com-varynforge-server": {
"type": "http",
"url": "https://app.varynforge.com/api/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 3 Aug 26 +35
- Transport: unverified → pass ▲ security
- Authorization: Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. security
- MCP protocol: unverified → pass ▲ functional
- Tool coverage: unverified → 100 ▲ functional
- First check of Tool coverage: 0 functional
- First check of Schema quality: fail functional
- First check of Schema quality: fail functional
- First check of Schema quality: good functional
- 31 Jul 26 +14
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 30 Jul 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 27 Jul 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 26 Jul 26 24
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 3 Aug 2026 · Probed https://app.varynforge.com/api/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=*.varynforge.com | CN=YR2,O=Let's Encrypt,C=US | 3 Jul 2026 | 1 Oct 2026 | RSA 2048 | SHA256-RSA | 558095d2f94a26d43f58c0f27dc3a198e98 |
| SANs: *.varynforge.com, varynforge.com | ||||||
| CN=YR2,O=Let's Encrypt,C=US (CA) | CN=Root YR,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | RSA 2048 | SHA256-RSA | 4ebd24947e24d394802d84a52fd5b319 |
| CN=Root YR,O=ISRG,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | RSA 4096 | SHA256-RSA | f24b6d17f9d9ad7cb1c9fea78782699f |
DNSSEC insecure
Validation of app.varynforge.com. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| varynforge.com. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Enforced and verified
The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.
| Result | Enforced and verified |
|---|---|
| Enforced | On tool calls |
| HTTP status | 200 |
WWW-Authenticate challenge Bearer resource_metadata="https://app.varynforge.com/api/auth/.well-known/oauth-protected-resource"
Bearer resource_metadata="https://app.varynforge.com/api/auth/.well-known/oauth-protected-resource" | Header | Value |
|---|---|
| strict-transport-security | max-age=63072000; includeSubDomains; preload |
| x-content-type-options | nosniff |
| x-frame-options | DENY |
| referrer-policy | strict-origin-when-cross-origin |
| permissions-policy | camera=(), microphone=(), geolocation=(), interest-cohort=() |
Protected resource metadata
| Document | https://app.varynforge.com/api/auth/.well-known/oauth-protected-resource |
|---|---|
| Retrieved | Yes |
| Resource | https://app.varynforge.com |
| Authorisation server | https://app.varynforge.com |
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://app.varynforge.com/api/mcp | Verified | 200 | |
| http (plaintext) | http://app.varynforge.com/api/mcp | HTTPS enforced | 308 | https://app.varynforge.com/api/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.
accept_idea ~137
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.
| Name | Type | Req | Description |
|---|---|---|---|
| angle | string | yes | — |
| demandEstimate | string | — | — |
| ideaText | string | yes | — |
| nicheFit | integer | — | — |
| projectId | string | yes | — |
| reasoning | string | — | — |
| relatedQueries | array | — | — |
| searchIntent | string | yes | — |
| title | string | yes | — |
No output schema declared.
No examples provided.
add_article_suggestion ~83
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.
| Name | Type | Req | Description |
|---|---|---|---|
| contentPlanId | string | yes | — |
| intent | string | — | — |
| projectId | string | yes | — |
| reasoning | string | — | — |
| title | string | yes | — |
No output schema declared.
No examples provided.
add_competitor_by_domain ~59
Add a competitor to a project by domain (e.g. example.com). Marks the competitor as important or ignored on creation.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | yes | — |
| importance | string | yes | — |
| projectId | string | yes | — |
No output schema declared.
No examples provided.
add_radar_topic ~159
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 project has none. Each added suggestion lands in generating_brief and its brief forges automatically (free tier: queues past the daily cap and forges at reset) — do not also call generate_article_brief. Returns the created suggestionIds.
| Name | Type | Req | Description |
|---|---|---|---|
| angles | array | yes | — |
| projectId | string | yes | — |
| signalObservationId | string | yes | — |
| topicAngleTotal | integer | — | — |
| topicIndex | integer | yes | — |
No output schema declared.
No examples provided.
create_article_suggestion_with_input ~130
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).
| Name | Type | Req | Description |
|---|---|---|---|
| angle | string | — | — |
| primaryKeyword | string | yes | — |
| projectId | string | yes | — |
| reasoning | string | — | — |
| searchIntent | string | — | — |
| secondaryKeywords | array | — | — |
| targetAudience | string | — | — |
| title | string | yes | — |
| wordCountTarget | integer | — | — |
No output schema declared.
No examples provided.
create_content_plan_from_opportunities ~48
Create a content plan by harvesting the top-30 opportunity clusters from a completed research run. Auto-creates article suggestions linked to each cluster.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | — |
No output schema declared.
No examples provided.
create_project ~95
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.
| Name | Type | Req | Description |
|---|---|---|---|
| extras | array | — | — |
| nicheDescription | string | — | — |
| originDescription | string | — | — |
| originInput | string | — | — |
| originType | string | — | — |
| website | string | — | — |
No output schema declared.
No examples provided.
delete_article_suggestion ~34
Delete an article suggestion and its associated brief. Cascades to keyword and cluster links.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | — |
No output schema declared.
No examples provided.
download_brief_markdown ~118
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 structured fields are get_article_brief’s job and are omitted here.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | — | — |
| format | string | yes | — |
| projectId | string | yes | — |
| suggestionId | string | yes | — |
No output schema declared.
No examples provided.
expand_idea ~86
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.
| Name | Type | Req | Description |
|---|---|---|---|
| ideaText | string | yes | — |
| projectId | string | yes | — |
No output schema declared.
No examples provided.
expand_radar_topic ~122
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 point of view. No writes — pass chosen angles to add_radar_topic.
| Name | Type | Req | Description |
|---|---|---|---|
| customPov | string | — | — |
| projectId | string | yes | — |
| signalObservationId | string | yes | — |
| topicIndex | integer | yes | — |
No output schema declared.
No examples provided.
generate_article_brief ~230
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 holds one brief per channel — generating a second channel adds a brief without touching the others. When the suggestion already has an article brief, channel briefs DERIVE from it (its key points, hook, and keyStats flow into the channel shape) and are free — they do not consume a daily brief slot. Idempotent per channel: if that channel already has a brief, returns it without consuming a slot; pass `force: true` to regenerate it. Free tier: 10/day for article briefs and non-derived channel briefs. Returns `{ entitlement }` when the daily cap is reached.
| Name | Type | Req | Description |
|---|---|---|---|
| articleSuggestionId | string | yes | — |
| channel | string | — | — |
| force | boolean | — | — |
| projectId | string | yes | — |
No output schema declared.
No examples provided.
get_account_status ~58
Get the operator account status — current plan, available credits, brief quota state, locked paid tools, the upgrade URL, and next_actions: the ranked cross-project queue of what to do next. Read on session start and after a wall hit.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_article_brief ~203
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 keyStats (a stat bank of { claim, value, source, sourceUrl } entries for evidence blocks and data slides). Pass compact=true to drop referenceArticles (informational only). internalLinks, curatedTargetQueries, and targetKeywords always populate. When the requested channel's brief does not exist yet, returns { hasBrief: false, briefStatus: 'queued' | 'forging' | 'none', queuedUntil } — 'queued' means the forge is waiting for the free daily cap to reset at queuedUntil; poll after that moment.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | — | — |
| compact | boolean | — | — |
| suggestionId | string | yes | — |
No output schema declared.
No examples provided.
get_article_suggestion ~95
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 free daily cap (forges automatically at reset); briefQueuedAt null means actively forging.
| Name | Type | Req | Description |
|---|---|---|---|
| suggestionId | string | yes | — |
No output schema declared.
No examples provided.
get_competitor_detail ~58
Get a competitor company detail in a project context — domain, name, importance, top pages in the project SERPs, and top keywords they rank for.
| Name | Type | Req | Description |
|---|---|---|---|
| companyId | string | yes | — |
| projectId | string | yes | — |
No output schema declared.
No examples provided.
get_instructions ~42
Get the VarynForge agent guide — workflow paths (free vs paid), token-economy rules, walls and upgrade conversation conventions. Read this at session start.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_keyword_detail ~48
Get a keyword detail — pages ranking for it with positions and ownership, plus related keywords already tracked in the project.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | — |
| queryHash | string | yes | — |
No output schema declared.
No examples provided.
get_lint_rubric ~135
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 (keywords, outline, FAQ, channel payload). Pass `channel` to read the rubric of that channel's brief (article default) — use the same channel you will pass to lint_draft. Fetch this before writing so the draft passes on the first submission.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | — | — |
| suggestionId | string | yes | — |
No output schema declared.
No examples provided.
get_onboarding_guide ~112
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 the operator, a setup checklist with done/pending status per step, and the ranked next_actions queue. Diagnose before prescribing: never run the welcome pitch on an operator whose stage says producing.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_opportunity_detail ~77
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).
| Name | Type | Req | Description |
|---|---|---|---|
| clusterId | string | yes | — |
| projectId | string | yes | — |
No output schema declared.
No examples provided.
get_page_dossier ~64
Get a page dossier — URL, title, project rankings, ownership. `headingOutline`, `targetKeywords`, and `contentAnalysis` populate for owned (asset-mapped) pages only.
| Name | Type | Req | Description |
|---|---|---|---|
| pageId | string | yes | — |
| projectId | string | yes | — |
No output schema declared.
No examples provided.
get_project ~32
Get one project — its niche profile, target audience, and current research status.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | — |
No output schema declared.
No examples provided.
get_project_asset ~38
Get the asset (website/product) associated with a project — URL, name, description, solution profile.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | — |
No output schema declared.
No examples provided.
get_project_overview ~152
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 suggestions carry no score until briefed and rank oldest-first below scored ones; source tells you why score/cluster may be null). Entries already at ready_to_publish or published are done, not next — "do the next piece" = the first entry whose status still needs work (planned, brief_ready, drafting, draft_ready, reviewing).
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | — |
No output schema declared.
No examples provided.
get_research_status ~58
Poll the latest research run for a project — runId, status, progress percent, elapsed seconds, and last error if failed. Token-light: returns a small fixed shape, no step payloads.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | — |
No output schema declared.
No examples provided.
get_write_handoff ~121
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 list is get_lint_rubric, so verify against those, not this. deepLinks (ChatGPT/Claude URLs embedding the payload) is null over MCP — it exists for web users without a connected agent.
| Name | Type | Req | Description |
|---|---|---|---|
| suggestionId | string | yes | — |
No output schema declared.
No examples provided.
get_writer_system_prompt ~110
Get the writer system prompt for drafting one content type from its brief. Pass `channel` (article | x | linkedin | reels | youtube) — each channel has its own methodology: article covers voice adaptation, structure rules, and the acceptance checklist; x covers thread mechanics; linkedin covers post + carousel slides; reels and youtube cover the production script (brief -> script -> video). Load the prompt for the channel you are about to draft; article is the default.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | yes | — |
No output schema declared.
No examples provided.
lint_draft ~364
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 draft is graded against AND the submission shape — always pass it for non-article content; when omitted, the channel is inferred from `format`. Submission shapes (get_lint_rubric returns the same spec + the numeric limits): article = markdown draft; x = thread text with one post per --- separated section, NO links in post bodies (put links in a reply); linkedin = post/caption text first, optional --- separated carousel slides after, NO links in the body (put links in the first comment); reels/youtube = the production SCRIPT — the process is brief -> script -> video, this gate validates the script, and the video is produced after it passes (published URL is recorded at publish time, not here). `format` labels the storage destination: prefer one of the project's destination type ids (see list_destinations) so receipts and drafts group per destination — re-submitting the same `format` replaces that destination's draft, a different `format` keeps both. The response reports the suggestion's post-lint `status` and a `nextAction` hint; `thresholds` is the article ratio block on the article channel and null otherwise (channel limits live in get_lint_rubric checkParams). Daily-capped; re-submitting an unchanged draft is served from cache.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | — | — |
| draft | string | yes | — |
| format | string | — | — |
| suggestionId | string | yes | — |
No output schema declared.
No examples provided.
list_article_suggestions ~189
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. items with no linkedin entry have no LinkedIn post yet — without per-item reads. Page through suggestions; call get_article_suggestion for the full record. Status semantics: generating_brief with briefQueuedAt set means the brief is QUEUED behind the free daily cap and forges automatically at cap reset (get_article_brief returns queuedUntil); generating_brief with briefQueuedAt null means it is actively forging — re-check within a minute.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | — | — | — |
| limit | number | yes | — |
| projectId | string | yes | — |
| status | — | — | — |
No output schema declared.
No examples provided.
list_competitors ~87
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.
| Name | Type | Req | Description |
|---|---|---|---|
| importance | string | — | — |
| limit | number | yes | — |
| projectId | string | yes | — |
No output schema declared.
No examples provided.
list_destinations ~137
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, and they map onto brief channels (website/local_business → article, tiktok/instagram → reels, youtube_channel → youtube, x → x, linkedin → linkedin). `state` distinguishes live destinations (detected/discovered) from planned ones. An empty list means the operator has not configured destinations — fall back to the brief channel name as the lint_draft `format` label.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | — |
No output schema declared.
No examples provided.
list_keywords ~78
List keywords tracked for a project — text, difficulty, intent, volume bucket (no_traffic | long_tail | average | high). Paginated; supports sorting and intent filter.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | — | — | — |
| filters | object | — | — |
| limit | number | yes | — |
| projectId | string | yes | — |
| sorting | array | — | — |
No output schema declared.
No examples provided.
list_opportunities ~78
List content opportunity clusters sorted by opportunity score. Goal filters: fast_wins, high_intent, authority_building, competitor_gap.
| Name | Type | Req | Description |
|---|---|---|---|
| activeMetaCluster | — | — | — |
| cursor | — | — | — |
| excludeInContentPlan | boolean | — | — |
| goal | — | — | — |
| limit | number | yes | — |
| projectId | string | yes | — |
No output schema declared.
No examples provided.
list_pages ~68
List ranked pages tracked for a project — URL, title, company, query count, ownership. Filter by ownership or company domain.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | — | — | — |
| filters | object | — | — |
| limit | number | yes | — |
| projectId | string | yes | — |
| sorting | array | — | — |
No output schema declared.
No examples provided.
list_projects ~88
List all projects for the authenticated operator — paginated, sortable by createdAt, niche, or industry. lastActivityAt is the most recent change to the project or any of its content pieces — when the operator says "my project" without naming one, the highest lastActivityAt is the right pick.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | — | — | — |
| limit | number | yes | — |
| sorting | array | — | — |
No output schema declared.
No examples provided.
list_radar_topics ~85
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_topic to turn a topic into article angles.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | — |
No output schema declared.
No examples provided.
mark_article_published ~200
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 the 404, drop it; nothing re-pings later). For a CMS-scheduled article, set scheduledFor via update_article_status and stay in ready_to_publish: publish auto-detect attests it (and pings IndexNow) when it appears. Use this instead of update_article_status for the published transition — a status flip alone records no URL, and without a URL the article is invisible to Search Console outcome tracking (clicks/impressions on the Earnings page). Also works on an already-published suggestion to attach a missing or corrected URL.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | — |
| publishedUrl | string | yes | — |
No output schema declared.
No examples provided.
register_derived_asset ~202
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 derivedAssets). Pass `channel` (reels | youtube | x | linkedin) so the app can show per-channel distribution status; register again with a new URL for repeat posts on the same channel — every registration is kept. `scheduledFor` records a future post date from an external scheduler (Buffer etc.) for display only — VarynForge never posts on your behalf. Derivative rows never affect publish status or Search Console attribution; use mark_article_published for the article itself.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | — | — |
| kind | string | yes | — |
| scheduledFor | string | — | — |
| suggestionId | string | yes | — |
| url | string | yes | — |
No output schema declared.
No examples provided.
remap_asset ~65
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.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | — |
No output schema declared.
No examples provided.
send_feedback ~145
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. Do NOT file entitlement walls (PAYMENT_REQUIRED / RATE_LIMITED / FEATURE_LOCKED payloads) — those are working as designed. Feedback is a note to the team, never a ticket: do not promise the operator it will be fixed.
| Name | Type | Req | Description |
|---|---|---|---|
| detail | string | — | — |
| kind | string | yes | — |
| projectId | string | — | — |
| summary | string | yes | — |
| toolContext | string | — | — |
No output schema declared.
No examples provided.
set_competitor_importance ~129
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 absolute (raw) scores did not change — cross-check via get_opportunity_detail.rawOpportunityScore. Ignored hides the competitor from competitor surfaces and the editorial-score pipeline.
| Name | Type | Req | Description |
|---|---|---|---|
| companyId | string | yes | — |
| importance | string | yes | — |
| projectId | string | yes | — |
No output schema declared.
No examples provided.
start_research_run ~70
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | — |
No output schema declared.
No examples provided.
update_article_status ~182
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; setting status to published here records no URL. When the article is scheduled to go live later (CMS/external scheduler), pass scheduledFor with the planned date — it shows in the app and holds the "stalled at ready_to_publish" flag until the schedule lapses; do NOT call mark_article_published before the URL is live, publish auto-detect attests it (and pings IndexNow) when it actually appears.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | — |
| lastActor | string | — | — |
| scheduledFor | — | — | — |
| status | string | yes | — |
No output schema declared.
No examples provided.
update_niche ~83
Update a niche profile — name, industry, language, country. Use after the operator refines their market definition.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | — | — |
| id | string | yes | — |
| industry | string | — | — |
| language | string | — | — |
| name | string | yes | — |
| relatedTerms | array | — | — |
| targetCustomer | string | — | — |
No output schema declared.
No examples provided.