SEO research platform exposing niche analysis, content planning, and writer-ready brief generation as tools.
Do not connect
A critical issue was found. Do not connect this server as-is.
Scanned 1 month ago Due for re-check
A server can change after it's graded. Re-run the automated scan to refresh this report.
This grade is deterministic and reproducible: the same server surface always yields the same grade under a given algorithm version. It is a real automated assessment computed by the MCPGrade engine from what the probe actually observed — not a fabricated or opinion score. It is not a manual human pentest, so it can miss context-specific risks.
Every signal below was measured directly by the automated probe. The grade is derived only from evidence like this — nothing is assumed.
The VarynForge MCP server exposes 57 tools, focused primarily on developer and AI capabilities. Its published description reads: "SEO research platform exposing niche analysis, content planning, and writer-ready brief generation as tools". It communicates over Streamable HTTP using the 2025-06-18 protocol revision, and does not require authorization to connect. MCPGrade currently rates VarynForge F — a critical issue was found and the server should not be connected as-is. Its most notable findings include "Hidden instructions in a tool description" and "Cross-tool shadowing". This report is a deterministic, reproducible automated assessment: the same observed surface always yields the same grade under a given algorithm version, and it is refreshed as new scans arrive and free to read — but it is not a substitute for a manual human security review. Always re-check VarynForge's advertised tools, transport security, and authorization posture before connecting an autonomous agent or sharing sensitive context with it.
Add VarynForge to an MCP client using the endpoint below. Review the grade and findings above before granting an autonomous agent access.
MCP endpoint
https://app.varynforge.com/api/mcpStreamable HTTP transport. This is the MCP endpoint, not a website — paste it into your MCP client server list rather than a browser.
Captured passively during the read-only scan. Click any value to find servers that match it.
The tools this server advertises via tools/list — names, purposes, and the parameters each accepts, exactly as enumerated read-only.
Get the VarynForge agent guide — workflow paths (free vs paid), token-economy rules, walls and upgrade conversation conventions. Read this at session start.
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
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
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
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
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
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
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
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
Get the asset (website/product) associated with a project — URL, name, description, solution profile.
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
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
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
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
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
Add a competitor to a project by domain (e.g. example.com). Marks the competitor as important or ignored on creation.
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
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.
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
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
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
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)
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 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
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
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
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
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"
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
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
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
List keywords tracked for a project — text, difficulty, intent, volume bucket (no_traffic | long_tail | average | high). Paginated; supports sorting and intent filter.
Get a keyword detail — pages ranking for it with positions and ownership, plus related keywords already tracked in the project.
List ranked pages tracked for a project — URL, title, company, query count, ownership. Filter by ownership or company domain.
Get a page dossier — URL, title, project rankings, ownership. `headingOutline`, `targetKeywords`, and `contentAnalysis` populate for owned (asset-mapped) pages only.
List article suggestions for a project — title, status, priority, cluster, intent, source, publishedAt, scheduledFor, and a per-channel distributions rollup ({ channel, count, latestAt, scheduledFor }
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
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 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
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_
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 (
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
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
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
Delete an article suggestion and its associated brief. Cascades to keyword and cluster links.
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.
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 —
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
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
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` (
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
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
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
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
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
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
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
Sorted worst-first. Each finding shows its severity, what it means, its OWASP MCP Top-10 mapping, and a recommended fix — the check id links to the exact methodology row that produced it.
tool: get_writer_system_prompt
A tool description contains imperative text aimed at the model (e.g. "ignore previous", "before answering read …").
ompt Get writer system prompt Get the writer system prompt for drafting one cRecommendationRemove model-directed instructions from tool descriptions.
tool: get_changelog
A tool description tries to alter the model’s use of another tool.
he days after a send_feedback report to check whether the gap they hit has beRecommendationDescriptions must describe only their own tool.
tool: get_account_status
A tool description tries to alter the model’s use of another tool.
ganization; see list_organizations), current plan, available credits, brief quotaRecommendationDescriptions must describe only their own tool.
tool: list_organizations
A tool description tries to alter the model’s use of another tool.
nization, or to get_account_status to read that organization’s caps.RecommendationDescriptions must describe only their own tool.
tool: get_onboarding_guide
A tool description tries to alter the model’s use of another tool.
and always when list_projects returns empty. Returns the server-derived stageRecommendationDescriptions must describe only their own tool.
tool: send_feedback
A tool description tries to alter the model’s use of another tool.
no reply — read get_changelog over the following days to see whether the gapRecommendationDescriptions must describe only their own tool.
tool: create_project
A tool description tries to alter the model’s use of another tool.
nizationId (see list_organizations) to create the project in a specific organizatiRecommendationDescriptions must describe only their own tool.
tool: get_project
A tool description tries to alter the model’s use of another tool.
e, settable via set_posting_cadence; sizes the pitch report’s 90-day sequence). AddRecommendationDescriptions must describe only their own tool.
tool: list_destinations
A tool description tries to alter the model’s use of another tool.
— add one with add_destination, or fall back to the brief channel name as theRecommendationDescriptions must describe only their own tool.
tool: set_competitor_importance
A tool description tries to alter the model’s use of another tool.
cross-check via get_opportunity_detail.rawOpportunityScore. Ignored hides the competitRecommendationDescriptions must describe only their own tool.
tool: update_asset_profile
A tool description tries to alter the model’s use of another tool.
cases. Use when get_project_asset shows claims that contradict what the operatorRecommendationDescriptions must describe only their own tool.
tool: set_posting_cadence
A tool description tries to alter the model’s use of another tool.
; read back via get_project.postsPerWeek.RecommendationDescriptions must describe only their own tool.
tool: resync_asset_profile
A tool description tries to alter the model’s use of another tool.
g a report when get_pitch_report_payload flags assetProfile.syncedBeforeRun — the storedRecommendationDescriptions must describe only their own tool.
tool: remap_asset
A tool description tries to alter the model’s use of another tool.
pages. Use when get_project_asset shows mappingStatus "error" or owned pages lookRecommendationDescriptions must describe only their own tool.
tool: start_research_run
A tool description tries to alter the model’s use of another tool.
runId }`; poll get_research_status for progress. Returns `{ entitlement }` insteadRecommendationDescriptions must describe only their own tool.
tool: get_research_status
A tool exposes a free-text/webhook/feedback parameter with no honest purpose — a classic exfil channel.
ead of waiting. Token-light: returns a small fixed shape, no step payRecommendationRemove side-channel parameters; constrain tool inputs.
tool: get_research_status
A tool description tries to alter the model’s use of another tool.
n-light: returns a small fixed shape, no step payloads.RecommendationDescriptions must describe only their own tool.
tool: get_pitch_report_payload
A tool description tries to alter the model’s use of another tool.
choice between resync_asset_profile first and rendering with the profile as-is, andRecommendationDescriptions must describe only their own tool.
tool: get_starting_point_report
A tool description tries to alter the model’s use of another tool.
ted run, prefer get_pitch_report_payload: that is the full report.RecommendationDescriptions must describe only their own tool.
tool: list_opportunities
A tool description tries to alter the model’s use of another tool.
issed clusters (set_opportunity_status) are hidden, and keywords matching the projectRecommendationDescriptions must describe only their own tool.
tool: get_opportunity_detail
A tool description tries to alter the model’s use of another tool.
(un-normalized; list_opportunities returns the 0-100 normalized version).RecommendationDescriptions must describe only their own tool.
tool: set_opportunity_status
A tool description tries to alter the model’s use of another tool.
d hides it from list_opportunities and the create_content_plan_from_opportunitiesRecommendationDescriptions must describe only their own tool.
tool: list_article_suggestions
A tool description tries to alter the model’s use of another tool.
ggestions; call get_article_suggestion for the full record. Status semantics: generatiRecommendationDescriptions must describe only their own tool.
tool: create_content_plan_from_opportunities
A tool description tries to alter the model’s use of another tool.
issed clusters (set_opportunity_status), keywords matching the project exclusion termsRecommendationDescriptions must describe only their own tool.
tool: add_article_suggestion
A tool description tries to alter the model’s use of another tool.
suggestion, use create_article_suggestion_with_input.RecommendationDescriptions must describe only their own tool.
tool: update_article_status
A tool description tries to alter the model’s use of another tool.
transition use mark_article_published instead — it records the live URL, which SearchRecommendationDescriptions must describe only their own tool.
tool: generate_article_brief
A tool description tries to alter the model’s use of another tool.
d hoping. Free tier: 10/day for article briefs and non-derived channel briRecommendationDescriptions must describe only their own tool.
tool: get_article_suggestion
A tool description tries to alter the model’s use of another tool.
h volumes. Call get_article_brief for the full brief. Status semantics: generatinRecommendationDescriptions must describe only their own tool.
tool: get_draft_status
A tool description tries to alter the model’s use of another tool.
aft to recover a known verdict. Pass `format` to read one destination inclRecommendationDescriptions must describe only their own tool.
tool: get_draft_status
The text tells the model WHEN to call this tool relative to others ("always call first", "before any other tool", "chain to X tool") — a toxic-flow injection that hijacks the agent’s orchestration rather than describing the tool.
and uncapped — always use this instead of lint_draft to recover a known verdicRecommendationTool metadata must describe only the tool, never sequence the agent’s calls.
tool: download_brief_markdown
A tool description tries to alter the model’s use of another tool.
ured fields are get_article_brief’s job and are omitted here.RecommendationDescriptions must describe only their own tool.
tool: mark_article_published
A tool description tries to alter the model’s use of another tool.
us for the published transition — a status flip alone records no URL, andRecommendationDescriptions must describe only their own tool.
tool: register_derived_asset
A tool exposes a free-text/webhook/feedback parameter with no honest purpose — a classic exfil channel.
parameter "url"RecommendationRemove side-channel parameters; constrain tool inputs.
tool: register_derived_asset
A tool description tries to alter the model’s use of another tool.
-ROI reporting (get_article_suggestion returns them as derivedAssets). Pass `channel`RecommendationDescriptions must describe only their own tool.
tool: get_lint_rubric
A tool description tries to alter the model’s use of another tool.
he brief fields lint_draft reads (keywords, outline, FAQ, channel payload)RecommendationDescriptions must describe only their own tool.
tool: lint_draft
A tool description tries to alter the model’s use of another tool.
emaining are in get_account_status limits); re-submitting an unchanged draft is seRecommendationDescriptions must describe only their own tool.
tool: get_write_handoff
A tool description tries to alter the model’s use of another tool.
e FULL brief is get_article_brief and the full check list is get_lint_rubric, soRecommendationDescriptions must describe only their own tool.
tool: expand_idea
A tool description tries to alter the model’s use of another tool.
urned fields to accept_idea to commit the idea as a brief-ready suggestion.RecommendationDescriptions must describe only their own tool.
tool: accept_idea
A tool description tries to alter the model’s use of another tool.
nded idea (from expand_idea) to the content plan as a brief-ready article sRecommendationDescriptions must describe only their own tool.
tool: check_idea
A tool description tries to alter the model’s use of another tool.
d of instinct. Opportunity score and cluster placement are returned only wRecommendationDescriptions must describe only their own tool.
tool: list_radar_topics
A tool description tries to alter the model’s use of another tool.
apshot yet. Use expand_radar_topic to turn a topic into article angles.RecommendationDescriptions must describe only their own tool.
tool: expand_radar_topic
A tool description tries to alter the model’s use of another tool.
topicIndex from list_radar_topics) into 3-6 candidate article angles with title,RecommendationDescriptions must describe only their own tool.
tool: add_radar_topic
A tool description tries to alter the model’s use of another tool.
o not also call generate_article_brief. Returns the created suggestionIds.RecommendationDescriptions must describe only their own tool.
The server accepts tool enumeration (and likely invocation) with no authentication.
RecommendationRequire OAuth 2.1 authorization for any server exposing non-public tools.
tool: update_niche
The server advertises open-world / broadly-scoped capabilities.
annotations.destructiveHint = trueRecommendationScope tools to the minimum needed.
tool: set_competitor_importance
The server advertises open-world / broadly-scoped capabilities.
annotations.destructiveHint = trueRecommendationScope tools to the minimum needed.
tool: update_asset_profile
The server advertises open-world / broadly-scoped capabilities.
annotations.destructiveHint = trueRecommendationScope tools to the minimum needed.
tool: set_posting_cadence
The server advertises open-world / broadly-scoped capabilities.
annotations.destructiveHint = trueRecommendationScope tools to the minimum needed.
tool: resync_asset_profile
The server advertises open-world / broadly-scoped capabilities.
annotations.destructiveHint = trueRecommendationScope tools to the minimum needed.
tool: remap_asset
The server advertises open-world / broadly-scoped capabilities.
annotations.destructiveHint = trueRecommendationScope tools to the minimum needed.
tool: start_research_run
The server advertises open-world / broadly-scoped capabilities.
annotations.destructiveHint = trueRecommendationScope tools to the minimum needed.
tool: set_opportunity_status
The server advertises open-world / broadly-scoped capabilities.
annotations.destructiveHint = trueRecommendationScope tools to the minimum needed.
tool: set_excluded_terms
The server advertises open-world / broadly-scoped capabilities.
annotations.destructiveHint = trueRecommendationScope tools to the minimum needed.
tool: update_article_status
The server advertises open-world / broadly-scoped capabilities.
annotations.destructiveHint = trueRecommendationScope tools to the minimum needed.
tool: delete_article_suggestion
The server advertises open-world / broadly-scoped capabilities.
annotations.destructiveHint = trueRecommendationScope tools to the minimum needed.
tool: mark_article_published
The server advertises open-world / broadly-scoped capabilities.
annotations.destructiveHint = trueRecommendationScope tools to the minimum needed.
tool: lint_draft
An unusually long description is a common injection-padding tactic.
description length 2168 charsRecommendationKeep descriptions concise.
Vantaj uptime monitoring via MCP — manage monitors, heartbeats, incidents, and status pages.
Unified gateway to Algeria's TKAWEN ecosystem: commerce, certification, and AI tools.
Provides access to the Cohereon Doctrine AI safety framework with governance components, tiered access, and agent onboarding.
Agentic rails for complex workflows with receipts, fees, and MCP tool access.
Structural TC39 spec lookup for ECMA-262 and ECMA-402 in AI agents, SHA-pinned and offline-first.
Structural TC39 spec lookup for ECMA-262 and ECMA-402 in AI agents, SHA-pinned and offline-first.