Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Epovest

REMOTE · MCP.EPOVEST.COM · SCANNED SEP 20

With Epovest, businesses make AIs recommend them.

Available components

0 this week 92 Trust /100
Trust breakdown (7 categories)

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 → Why this is hard to score →

Endpoint Security97
Transport & Reachability100
Schema Quality & AI Usability64
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 18627 tokens (~278/item across 67 items; 67 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 Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 99% of tool parameters carry a description.Partial
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 68 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Install

How do I install the Epovest MCP server?

Epovest is a hosted endpoint at https://mcp.epovest.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · mcp.epovest.com

# add to Claude Code
claude mcp add --transport http com-epovest-ai-visibility 'https://mcp.epovest.com/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "com-epovest-ai-visibility": {
      "url": "https://mcp.epovest.com/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "com-epovest-ai-visibility": {
      "type": "http",
      "url": "https://mcp.epovest.com/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.com-epovest-ai-visibility]
url = "https://mcp.epovest.com/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-epovest-ai-visibility": {
      "type": "remote",
      "url": "https://mcp.epovest.com/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add com-epovest-ai-visibility --url 'https://mcp.epovest.com/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  com-epovest-ai-visibility:
    url: "https://mcp.epovest.com/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "com-epovest-ai-visibility": {
      "Transport": "http",
      "Url": "https://mcp.epovest.com/mcp"
    }
  }
}
# add to Vellum
assistant mcp add com-epovest-ai-visibility -t streamable-http -u 'https://mcp.epovest.com/mcp'
// mcp.json
{
  "mcpServers": {
    "com-epovest-ai-visibility": {
      "type": "http",
      "url": "https://mcp.epovest.com/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

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.

  • 5 Sept 26 0
    • Tool “start_tracker” rewrote its description, which is the text the model reads security
    • Tool “update_tracker” rewrote its description, which is the text the model reads security
    • “create_tracker” reworded the description of “next_survey_at” cosmetic
    • “update_tracker” reworded the description of “next_survey_at” cosmetic
  • 28 Aug 26 0
    • Stability: fail → pass security
  • 26 Aug 26 +1
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 24 Aug 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 91 to 94.

  • 23 Aug 26 0
    • “create_tracker” reworded the description of “engines” cosmetic
    • “update_tracker” reworded the description of “engines” cosmetic

    2 cosmetic changes on this day. Switch on “Show cosmetic changes” to see them.

  • 20 Aug 26 0
    • Tool “create_logbook_entry” rewrote its description, which is the text the model reads security
    • Tool “get_logbook” rewrote its description, which is the text the model reads security
    • Tool “list_quests” rewrote its description, which is the text the model reads security
    • Tool “update_logbook_entry” rewrote its description, which is the text the model reads security
    • “create_logbook_entry” added an optional parameter “quest_id” cosmetic
    • “get_logbook” added an optional parameter “quest_id” cosmetic
    • “update_logbook_entry” added an optional parameter “quest_id” cosmetic
  • 18 Aug 26 0
    • Tool “convert_corroboration_to_surface” rewrote its description, which is the text the model reads security
    • Tool “create_corroboration” rewrote its description, which is the text the model reads security
    • Tool “create_surface” rewrote its description, which is the text the model reads security
    • Tool “dismiss_corroboration_candidate” rewrote its description, which is the text the model reads security
    • Tool “list_corroboration_candidates” rewrote its description, which is the text the model reads security
    • New tool “list_source_channels” functional
  • 17 Aug 26 0
    • Tool “create_competitor_scan” rewrote its description, which is the text the model reads security
    • Tool “list_competitor_scans” rewrote its description, which is the text the model reads security
    • Tool “update_competitor_scan” rewrote its description, which is the text the model reads security
    • “create_competitor_scan” reworded the description of “subjects” cosmetic
    • “update_competitor_scan” reworded the description of “rescan_cadence” cosmetic
Diagnostics

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 20 Sept 2026 · Probed https://mcp.epovest.com/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=mcp.epovest.com CN=WE1,O=Google Trust Services,C=US 6 Sept 2026 5 Dec 2026 ECDSA 256 ECDSA-SHA256 9f9b89c7da9d8d7b0e5bb6715c3aae5c
SANs: mcp.epovest.com
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of mcp.epovest.com. Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
epovest.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 realm="epovest-api", resource_metadata="https://mcp.epovest.com/.well-known/oauth-protected-resource/mcp"

Bearer realm="epovest-api", resource_metadata="https://mcp.epovest.com/.well-known/oauth-protected-resource/mcp"
Header Value
strict-transport-security max-age=31536000; includeSubDomains
content-security-policy frame-ancestors 'none'
x-content-type-options nosniff
x-frame-options DENY
referrer-policy strict-origin-when-cross-origin

Protected resource metadata

Document https://mcp.epovest.com/.well-known/oauth-protected-resource/mcp
Retrieved Yes
Resource https://mcp.epovest.com/mcp
Authorisation server https://app.epovest.com

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://mcp.epovest.com/mcp Verified 200
http (plaintext) http://mcp.epovest.com/mcp HTTPS enforced 301 https://mcp.epovest.com/mcp
MCP tools · 67 exposed · ~18,363 tokens

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. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
restore_surface_check ~130

Bring a check of your own back to the checklist of a surface, with the cells it had: it becomes work again, so the page needs it verified to count as aligned. The checks to bring back are listed by list_surfaces in checklist.custom, with deleted true. Restoring a check already in the checklist answers the same.

NameTypeReqDescription
checkstringyesThe key of the check of your own, exactly as listed by list_surfaces in checklist.custom (add_surface_check returns it too).
surface_idstringyesThe UUID of the surface: call list_surfaces to find it.

No output schema declared.

No examples provided.

set_link_targets ~182

Set the addresses of the brand that are neither its canonical website nor a page of the surface registry: a satellite domain the customer does not want to keep aligned, a tracking link, a partner page. They are set ONCE for the project and serve every line of the corroboration registry, present and future, so there is nothing to set line by line. The list you send REPLACES the previous one, and the answer returns what the project now holds, derived addresses included: read it back to confirm. An empty list keeps only the derived ones. Call get_link_targets first, and confirm with the user before replacing.

NameTypeReqDescription
link_targetsarrayyesThe FULL list of the free addresses, as absolute http(s) URLs. It replaces the previous one.
project_idstringyesUUID of the project: call list_projects to find it.

No output schema declared.

No examples provided.

start_competitor_scan ~123

Arm a prepared scan: the engine is asked, and the prepaid balance is debited by the amount `estimated_cost_minor` announced on the scan. SPENDS: read that amount to the person and get their go-ahead before calling. The answers land within a few minutes; read the places back with get_competitor_scan. Safe to replay: a scan already armed answers with itself instead of paying for a second one.

NameTypeReqDescription
competitor_scan_idstringyesThe UUID of the competitor scan: call list_competitor_scans to find it.

No output schema declared.

No examples provided.

start_tracker ~156

Start or restart the measurement of a tracker against the prepaid credit balance. The first survey runs there and then, whatever the frequency, unless the tracker carries a next_survey_at still in the future: with one set, nothing runs until that moment, which is how a tracker comes back on a date of the person's choosing. Restarting a paused tracker picks its schedule back up, at whatever configuration it carries now. Refused with insufficient_credits when the balance does not cover one survey; that answer carries top_up_url, the page where the person adds credit, so give it to them. Starting an already active tracker changes nothing.

NameTypeReqDescription
tracker_idstringyesThe UUID of the tracker: call list_trackers to find it.

No output schema declared.

No examples provided.

survey_now ~207

Run one survey of a measuring tracker right now, on top of its schedule. Its settings stay as they are: same anchor, same frequency, and the next scheduled survey keeps its date. On a tracker whose frequency is on_demand, this is how every survey after the first one happens. It debits the prepaid credit balance like any survey, and the point joins the score series marked on_demand. The answer carries the survey id: read the results back with get_results, or the raw answers with get_responses. While one is still running, calling again answers that survey instead of starting a second one. Refused with insufficient_credits when the balance does not cover it, and that answer carries top_up_url, the page where the person adds credit, so give it to them. Refused with tracker_not_active when the tracker is not measuring yet: start_tracker first.

NameTypeReqDescription
tracker_idstringyesThe UUID of the tracker: call list_trackers to find it.

No output schema declared.

No examples provided.

tick_surface_checklist ~518

Record what a surface actually carries, cell by cell, as many moves as you want in one call. The items are listed by list_surfaces as checklist.items: the template of the surface type (stable keys such as title_tag or llms_txt), then the checks the customer added of their own (add_surface_check), which tick here exactly like the rest, at their key. Most of them are yours to check (a title tag, JSON-LD, an llms.txt all read with a simple fetch). Three moves per cell. VERIFY (done true, or nothing): the item is constated on the page; an item of canon kind (checklist.kinds) is stamped with the current canon version and wording, so its verification stays fresh until the wording moves, and needs the canon set first. SET ASIDE (dismissed true plus a short reason): the item does not apply on THIS surface (an author bio, a field the platform does not offer); durable across canon revisions, reversible, never hidden from the counts. CLEAR (done false, or dismissed false): the cell returns to blank. A site-wide item (checklist.site_items: the llms.txt, one file at the root of the site, written in the canonical language of the project) is one cell for the whole site, without a language. Only the cells you send change; an unknown item or language, a set-aside without reason or a contradictory move refuses the whole batch and says what exists. The ALIGNED status derives from the cells listed in checklist.required, the canon items plus the checks of the customer: verifying the last one aligns the surface and dates it in the journal. The goal is a surface with no required cell left undecided: work every one of them to a verdict, verified when the page carries it or set aside with a reason when the item does not apply here. Leaving a cell untouched is not a neutral skip, it holds the surface in needs_update and hides whether the page was ever checked, so go through the whole checklist and not only the cells easy to confirm. And setting aside the LAST canon cell is refused, because…

NameTypeReqDescription
surface_idstringyesThe UUID of the surface: call list_surfaces to find it.
ticksarrayyesThe cell moves. Nothing else on the checklist changes.

No output schema declared.

No examples provided.

topup_credits ~347

Prepare a top-up of the prepaid credit balance and return the hosted payment link. Nothing is charged by this call: hand payment_url to the user, the payment happens there, and they approve the amount on that page. When the user names an amount, that amount wins: pass it as `amount`, exactly the number they said. Amounts are always in the wallet currency of the account, which get_credits gives: if they name another currency, tell them, never convert one currency into another yourself. When they leave it to you, take one of the amounts get_credits already suggests in `suggested_topups[]` and pass its `amount_minor`: they are derived from what this account consumes, they clear the floor, and each says the runway it buys in `covers_months`. Name the one you picked and what it covers. Nothing to compute, and nothing to convert. Send one of the two, never both. The minimum top-up is 10.00 (1000 minor units). Once paid, the balance updates on its own and paused trackers resume.

NameTypeReqDescription
amountnumberCredits to buy, in MAJOR units of the wallet currency: what a person says. 50 means 50.00, and 12.5 means 12.50. Use this one when the user names the amount, exactly as they said it. Minimum 10.00.
amount_minorintegerCredits to buy, in MINOR units of the wallet currency: 5000 means 50.00. Use this one when you compute the amount from the cost grid, which is in minor units too. Minimum 1000.

No output schema declared.

No examples provided.

update_account_settings ~387

Change the settings of the account. Send only what the user is changing: every setting you leave out keeps its value. `billing_country`, `billing_address` and `intra_eu_vat_number` clear when you send null; `name`, `language` and `timezone` keep their value on null, so name the language or the time zone you want. A postal address and a VAT number travel with `billing_country`: send the country in the same call. What you write here goes on the next invoices of the account, and the invoices already issued keep the details they carry.

NameTypeReqDescription
billing_addressarrayPostal address of the account, one string per line, like ["12 Example Street", "75001 Paris"]. The list replaces the previous address; [] or null clears it. Three lines at most, so the address block…
billing_countrystringBilling country, as an ISO 3166-1 alpha-2 code: "FR", "US", "BR". It decides the tax treatment of the next invoices, so it is the country of the entity being billed, not where the user happens to be.
intra_eu_vat_numberstringIntra-EU VAT number, for an account billed in an EU member state: the two-letter country code followed by the national number, like "FR12345678901". It goes on the invoices of the account.
languagestringThe language we write to this account in: emails, and the hosted payment page of a top-up.
namestringLegal name of the account, the one printed on its invoices.
timezonestringThe time zone the hours of the account are shown in, as an IANA identifier: "Europe/Paris", "America/New_York", "UTC".

No output schema declared.

No examples provided.

update_competitor_scan ~356

Correct a scan still in draft, and set the cadence of one already armed. `questions` is where the measurement is won: send the questions to KEEP, with the wording you want asked. A question of the scan left out of the list is removed, and the amount announced by `estimated_cost_minor` follows, so this is also how the person spends less. Nothing is charged until start_competitor_scan, so rewriting costs nothing; a scan already measured keeps its questions (409) and a new one asks something else. `rescan_cadence` sets how often an armed scan runs again: "weekly" or "monthly" sets it, null stops it. Weekly widens the list faster and spends as often; monthly follows the pace a corpus of third-party pages moves at. Each pass widens the list rather than refreshing it, because two checks of the same question do not cite the same pages, and what one check found the next one keeps. SPENDS on every pass, the same amount as the first one, so name it to the person before setting a cadence. It states a STATE and replays safely both ways: setting the cadence already in place moves nothing, and stopping it leaves the accumulated list intact.

NameTypeReqDescription
competitor_scan_idstringyesThe UUID of the competitor scan: call list_competitor_scans to find it.
questionsarrayThe questions to KEEP, in the order to ask them. A sent list REPLACES the questions of the scan: one left out is removed. Draft only.
rescan_cadencestring|nullHow often the scan runs again: "weekly", "monthly", or null to stop it.

No output schema declared.

No examples provided.

update_corroboration ~488

Update the sheet of a corroboration: only the fields you send change (an empty label goes back to the derived one, an empty notes or published_on clears it). Correcting the url ALWAYS recomputes the source: the two never drift apart. It also carries monitoring, the cadence at which the page is read again on its own, which is why watching a page needs no tool of its own. To say a page is gone, use archive_corroboration instead: editing never takes anything down.

NameTypeReqDescription
corroboration_idstringyesThe UUID of the corroboration: call list_corroborations to find it.
labelstringDisplay name of the page. OMIT IT: it is derived from the address (domain and path). Send an empty string to go back to the derived one.
monitoringstringHow often the page is read again on its own: "off" (the default), "daily", "weekly" or "monthly". Each executed check costs 0.02 USD from the prepaid balance and returns the same two findings as veri…
notesstringFree notes: the passage that mentions the brand, the contact, how the page came about.
published_onstringThe day the page was PUBLISHED, as YYYY-MM-DD. Distinct from the recording day, and the one that means something against the citation curves. Omit it when unknown: it is never guessed.
request_channelstringWhether someone can be asked to change the page: "available" (a contact or a process exists), "none" (nobody to ask), "unknown" (not filled in, the default). It gates the refresh suggestions of the q…
urlstringAbsolute http(s) address of the EXACT page where the third party talks about the brand, never the home page of the site.

No output schema declared.

No examples provided.

update_logbook_entry ~344

Edit a manual logbook entry: only the fields you send change (empty notes clear them). It is the customer's own logbook: a typo or a wrong date is simply corrected. quest_id files an entry under a quest after the fact, and null files it back under the project alone. Tool events cannot be edited: they are derived from the canon and surface registries.

NameTypeReqDescription
categorystringWhat kind of action this is; it files the entry for filtering. "other" covers anything else.
entry_idstringyesThe UUID of the logbook entry: call get_logbook to find it (only manual entries carry an id).
labelstringShort wording of the action, e.g. "Site translated into Spanish": it is what the annotation shows next to the citation curves.
notesstringFree notes: context, links, details of the action.
occurred_atstringWhen the action HAPPENED, ISO 8601 date or datetime, read as UTC without an offset. Distinct from the recording time: when the user says "yesterday" or "last week", compute and pass that date. Omitte…
quest_idstringThe quest of the same project this action moves forward, which is how a quest gets its own dated trail: call list_quests to find it. The entry stays an entry of the logbook of the project, it just sa…

No output schema declared.

No examples provided.

update_project_canon ~586

Revise the brand canon of a project. Field by field: a provided field replaces the current wording (an empty string clears it), an omitted field is kept as is. Any actual change records the NEXT canon version (numbered, immutable; version_created true in the answer); sending identical wording records nothing. The canon lives in ONE language, its canonical language (canon_language): it is never translated, changing the language is a revision like any other. The canon is meant to be STABLE: revising it is a rare and deliberate move, and every surface that reuses the wording will need to be brought back in phase with the new version. Confirm with the user before revising.

NameTypeReqDescription
canon_addressstringPostal address, as written on a listing. Language-neutral: the same string everywhere, like the other facts.
canon_categorystringCategory label for listings and structured data.
canon_emailstringPublic email address of the brand.
canon_languagestringShort code of the ONE language the canon is written in, like "en" or "pt-br". On a project whose canon is not posted yet, send it with at least one wording: the canon is the wording, and the language…
canon_legal_namestringRegistered name of the company that operates the brand, with its jurisdiction when the user states it ("Acme Holdings, LLC, Delaware, United States"). Language-neutral, like the other facts: the AIs…
canon_longstringThe two-sentence version, when the surface allows it.
canon_one_linerstringOne-sentence signature of the brand.
canon_perksarrayThe distinctive claims of the brand, in the order they should be hammered, written in the canonical language. Facts that hold and can be corroborated ("works without a subscription"), never superlati…
canon_phonestringPhone number, international prefix included.
canon_shortstringTHE one-sentence description third-party pages reuse as is.
canon_websitestringThe canonical address of the brand website, the one that identifies the entity. A bare domain is enough ("example.com" completes to "https://example.com"). ONE URL only: the other addresses of the br…
canon_whatsappstringWhatsApp number, international prefix included.
project_idstringyesUUID of the project: call list_projects to find it.

No output schema declared.

No examples provided.

update_quest ~136

Edit a quest: only the fields you send change (empty notes clear them). It is the customer's own file: a typo or a sharpened wording is simply corrected. The status changes through its own moves, complete_quest, dismiss_quest and reopen_quest.

NameTypeReqDescription
notesstringFree notes: context, links, what done looks like.
quest_idstringyesThe UUID of the quest: call list_quests to find it.
titlestringShort wording of the move, e.g. "Get our MCP server listed on the AI tool directories": it is what the file shows.

No output schema declared.

No examples provided.

update_surface ~368

Update the registry sheet of a surface: only the fields you send change (a sent languages list replaces the previous one; an empty label or notes clears it). No journal line is ever written here: an alignment is earned with tick_surface_checklist, cell by cell. Languages ARE the columns of the checklist, so declaring the language of a single-language page renames its column and carries its verified cells along. When the change leaves no single destination (a language dropped from a page that keeps others, one column split into several), the columns that leave the model come back in dropped_checklist_columns with what they held; their cells stay stored, and declaring the language again brings them back. The status of the answer is derived from the cells that read NOW, so read it back rather than assuming it held.

NameTypeReqDescription
labelstringDisplay name of the surface. OMIT IT on creation: it is derived from the url (the handle on a known place, the host and path on a website).
languagesarrayLanguages of the surface, as short codes like "en" or "pt-br". A sent list replaces the previous one.
notesstringFree registry notes: who owns the account, access, context.
surface_idstringyesThe UUID of the surface: call list_surfaces to find it.
typestringWhat kind of surface this is; it picks the checklist to come. OMIT IT on creation: the type is derived from the url by the catalogue of places (github.com is GitHub, an unknown host is the brand webs…
urlstringAbsolute http(s) address of the surface.

No output schema declared.

No examples provided.

update_surface_check ~195

Correct a check of your own on a surface: its label, and whether it restates the canon. Only what you send changes. The key never moves, being the coordinate of the cells already recorded, so renaming a check keeps every tick it carries. Turning restates_canon on makes a tick recorded without a canon stamp perish, which is the honest reading: the page was never checked against a wording.

NameTypeReqDescription
checkstringyesThe key of the check of your own, exactly as listed by list_surfaces in checklist.custom (add_surface_check returns it too).
labelstringThe new wording of the check, up to 120 characters.
restates_canonbooleantrue when the check restates the WORDING of the canon, false when it constates something else.
surface_idstringyesThe UUID of the surface: call list_surfaces to find it.

No output schema declared.

No examples provided.

update_tracker ~782

Update the configuration of a tracker: only the fields you send change. Keywords, analysts and the title apply in place. Changing the prompts, engines, frequency or resolution of a version that HAS measured creates a new version: the score series continues across versions, and the response carries the new tracker id (version_created says when). A version that has not measured yet is amended in place and keeps its id, so version_created is false. A PAUSED tracker takes all of it, the collection settings included: the call writes the configuration and nothing else, no survey runs and no credit is spent, and what you set takes effect at the next start_tracker. That is the way to move a paused tracker to fewer engines or a slower frequency before paying for another survey. Send next_survey_at to say when that survey runs. A sent list replaces the previous one entirely.

NameTypeReqDescription
analystsarrayThe lenses that score every survey. keyword_presence and share_of_voice are deterministic; sentiment and custom_prompt are AI analysts billed per analyzed response.
custom_promptstringThe instruction of the custom_prompt analyst. Required when that analyst is selected.
discoverybooleanSuggest new keywords spotted in the answers.
enginesarrayThe AI engines surveyed. A check is priced per engine, in USD: chatgpt 0.10, claude 0.20, gemini 0.10, perplexity 0.10, mistral 0.10, grok 0.20. Claude and Grok read more sources per answer, and thei…
frequencystringHow often a survey runs. on_demand puts the tracker on no schedule at all: starting it runs one survey, and every survey after that is one you ask for with survey_now. Pick it for a one-off reading,…
keywordsarrayNames to detect in the answers: your brand and the names you compare against. Flag yours as favorite.
next_survey_atstringWhen the next survey runs, ISO 8601, strictly in the future; read as UTC without an offset. Later surveys keep that day and time at the pace of the frequency. On a PAUSED tracker it is kept and read…
notify_on_surveybooleanEmail the account owner and managers each time a survey closes with fresh data, so the results reach them on their own. On by default; send false to keep this tracker silent.
project_idstringThe project the tracker is filed under: the UUID of a project of the account (call list_projects), or "default" for none. Pure organization, editable at any time. Omitted on creation the tracker file…
promptsarrayThe questions asked to the AI engines at every survey, phrased exactly as a customer would ask them.
resolutionstringRepetitions of every question per engine and survey: hd=1, full_hd=3, 4k=6, 8k=9. Answers are stochastic; more repetitions sharpen the rates.
titlestringDisplay name of the tracker.
tracker_idstringyesThe UUID of the tracker: call list_trackers to find it.

No output schema declared.

No examples provided.

verify_corroboration ~497

Read the page again and report what it says today. One pass returns two findings, dated, and included at no cost. On the MENTION: the passage around the brand is archived on the line (the sentence that names it, one before, one after), and the finding says unchanged, changed (the passage moved, worth re-reading), figures (the passage moved on NUMBERS only, such as a rank or a counter: a fact to read, and changed_at stays where it was) or gone (the page did not answer). When a change was found, excerpt_before carries the passage as it stood BEFORE changed_at: compare it with excerpt to state what moved, in words, without reading the whole page. On the LINK: every link of the page towards an address of the brand, derived from the canon website and from the surface registry of the project, with its rel tokens (nofollow, sponsored, ugc, or none), its target and title attributes, its anchor text, its exact destination with the resolved redirect chain and the HTTP code of that destination, whether it sits in the main content or outside it, and its dates; the finding says unchanged, changed (changes lists what moved: rel, anchor, target, placement, appeared), gone, or none, which means the page carries no such link and is a normal state. The reply also carries how the page reads (readability: "html" when it reads, "blocked" when an anti-bot stands in front of it, "unreachable" when it did not answer, "no_page" when the address answers with something that is not a page, "unreadable" when it answers HTML with no text in it, "pending" while no reading has completed yet), the number of outbound links of the page, and what the page declares about itself (noindex, page_nofollow, canonical_elsewhere). Read readability before deciding a move: an anti-bot is a fact of the world, while a page that did not answer is worth reading again. Everything here is a FACT: the third party has the final say, so nothing closes, nothing counts, and nothing is taken down on its own. Use it to dec…

NameTypeReqDescription
corroboration_idstringyesThe UUID of the corroboration: call list_corroborations to find it.

No output schema declared.

No examples provided.

Common questions

What is the Epovest MCP server?

Epovest is an MCP server listed in the public MCP registry as com.epovest/ai-visibility. With Epovest, businesses make AIs recommend them. This page covers its hosted endpoint (https://mcp.epovest.com/mcp).

Is the Epovest MCP server safe to use?

Epovest scores 92 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Epovest MCP server expose?

Epovest exposes 67 tools: list_trackers, create_tracker, update_tracker, start_tracker, survey_now, and 62 more. Their descriptions and schemas cost roughly 18,363 tokens of context every time the server is loaded.

Does the Epovest MCP server require authentication?

Yes. Epovest asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the Epovest MCP server still maintained?

Epovest is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.