Epovest
REMOTE · MCP.EPOVEST.COM · SCANNED SEP 20
With Epovest, businesses make AIs recommend them.
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 → Why this is hard to score →
Endpoint Security97
- 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 supports Client ID Metadata Documents, the current MCP client-registration mechanism. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
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
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
claude mcp add --transport http com-epovest-ai-visibility 'https://mcp.epovest.com/mcp'
{
"mcpServers": {
"com-epovest-ai-visibility": {
"url": "https://mcp.epovest.com/mcp"
}
}
} {
"servers": {
"com-epovest-ai-visibility": {
"type": "http",
"url": "https://mcp.epovest.com/mcp"
}
}
} [mcp_servers.com-epovest-ai-visibility] url = "https://mcp.epovest.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"com-epovest-ai-visibility": {
"type": "remote",
"url": "https://mcp.epovest.com/mcp",
"enabled": true
}
}
} openclaw mcp add com-epovest-ai-visibility --url 'https://mcp.epovest.com/mcp' --transport streamable-http
mcp_servers:
com-epovest-ai-visibility:
url: "https://mcp.epovest.com/mcp" {
"McpServers": {
"com-epovest-ai-visibility": {
"Transport": "http",
"Url": "https://mcp.epovest.com/mcp"
}
}
} assistant mcp add com-epovest-ai-visibility -t streamable-http -u 'https://mcp.epovest.com/mcp'
{
"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.
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
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 |
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 →
restore_surface_check Bring a check of your own back to a checklist ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| check | string | yes | The key of the check of your own, exactly as listed by list_surfaces in checklist.custom (add_surface_check returns it too). |
| surface_id | string | yes | The UUID of the surface: call list_surfaces to find it. |
No output schema declared.
No examples provided.
set_link_targets Set the free addresses of the brand ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| link_targets | array | yes | The FULL list of the free addresses, as absolute http(s) URLs. It replaces the previous one. |
| project_id | string | yes | UUID of the project: call list_projects to find it. |
No output schema declared.
No examples provided.
start_competitor_scan Arm a 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.
| Name | Type | Req | Description |
|---|---|---|---|
| competitor_scan_id | string | yes | The UUID of the competitor scan: call list_competitor_scans to find it. |
No output schema declared.
No examples provided.
start_tracker Start a 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.
| Name | Type | Req | Description |
|---|---|---|---|
| tracker_id | string | yes | The UUID of the tracker: call list_trackers to find it. |
No output schema declared.
No examples provided.
survey_now Survey a tracker 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.
| Name | Type | Req | Description |
|---|---|---|---|
| tracker_id | string | yes | The UUID of the tracker: call list_trackers to find it. |
No output schema declared.
No examples provided.
tick_surface_checklist Verify or set aside checklist cells of a surface ~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…
| Name | Type | Req | Description |
|---|---|---|---|
| surface_id | string | yes | The UUID of the surface: call list_surfaces to find it. |
| ticks | array | yes | The cell moves. Nothing else on the checklist changes. |
No output schema declared.
No examples provided.
topup_credits Buy 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.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number | – | Credits 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_minor | integer | – | Credits 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 Update the 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.
| Name | Type | Req | Description |
|---|---|---|---|
| billing_address | array | – | Postal 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_country | string | – | Billing 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_number | string | – | Intra-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. |
| language | string | – | The language we write to this account in: emails, and the hosted payment page of a top-up. |
| name | string | – | Legal name of the account, the one printed on its invoices. |
| timezone | string | – | The 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 Correct the questions, set the rescan cadence ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| competitor_scan_id | string | yes | The UUID of the competitor scan: call list_competitor_scans to find it. |
| questions | array | – | The 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_cadence | string|null | – | How often the scan runs again: "weekly", "monthly", or null to stop it. |
No output schema declared.
No examples provided.
update_corroboration Update a 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.
| Name | Type | Req | Description |
|---|---|---|---|
| corroboration_id | string | yes | The UUID of the corroboration: call list_corroborations to find it. |
| label | string | – | Display 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. |
| monitoring | string | – | How 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… |
| notes | string | – | Free notes: the passage that mentions the brand, the contact, how the page came about. |
| published_on | string | – | The 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_channel | string | – | Whether 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… |
| url | string | – | Absolute 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 Edit a 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.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | What kind of action this is; it files the entry for filtering. "other" covers anything else. |
| entry_id | string | yes | The UUID of the logbook entry: call get_logbook to find it (only manual entries carry an id). |
| label | string | – | Short wording of the action, e.g. "Site translated into Spanish": it is what the annotation shows next to the citation curves. |
| notes | string | – | Free notes: context, links, details of the action. |
| occurred_at | string | – | When 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_id | string | – | The 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 Update the canon of a project ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| canon_address | string | – | Postal address, as written on a listing. Language-neutral: the same string everywhere, like the other facts. |
| canon_category | string | – | Category label for listings and structured data. |
| canon_email | string | – | Public email address of the brand. |
| canon_language | string | – | Short 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_name | string | – | Registered 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_long | string | – | The two-sentence version, when the surface allows it. |
| canon_one_liner | string | – | One-sentence signature of the brand. |
| canon_perks | array | – | The 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_phone | string | – | Phone number, international prefix included. |
| canon_short | string | – | THE one-sentence description third-party pages reuse as is. |
| canon_website | string | – | The 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_whatsapp | string | – | WhatsApp number, international prefix included. |
| project_id | string | yes | UUID of the project: call list_projects to find it. |
No output schema declared.
No examples provided.
update_quest Edit a 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.
| Name | Type | Req | Description |
|---|---|---|---|
| notes | string | – | Free notes: context, links, what done looks like. |
| quest_id | string | yes | The UUID of the quest: call list_quests to find it. |
| title | string | – | Short 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 Update a 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.
| Name | Type | Req | Description |
|---|---|---|---|
| label | string | – | Display 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). |
| languages | array | – | Languages of the surface, as short codes like "en" or "pt-br". A sent list replaces the previous one. |
| notes | string | – | Free registry notes: who owns the account, access, context. |
| surface_id | string | yes | The UUID of the surface: call list_surfaces to find it. |
| type | string | – | What 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… |
| url | string | – | Absolute http(s) address of the surface. |
No output schema declared.
No examples provided.
update_surface_check Correct a check of your own ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| check | string | yes | The key of the check of your own, exactly as listed by list_surfaces in checklist.custom (add_surface_check returns it too). |
| label | string | – | The new wording of the check, up to 120 characters. |
| restates_canon | boolean | – | true when the check restates the WORDING of the canon, false when it constates something else. |
| surface_id | string | yes | The UUID of the surface: call list_surfaces to find it. |
No output schema declared.
No examples provided.
update_tracker Update a 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.
| Name | Type | Req | Description |
|---|---|---|---|
| analysts | array | – | The 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_prompt | string | – | The instruction of the custom_prompt analyst. Required when that analyst is selected. |
| discovery | boolean | – | Suggest new keywords spotted in the answers. |
| engines | array | – | The 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… |
| frequency | string | – | How 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,… |
| keywords | array | – | Names to detect in the answers: your brand and the names you compare against. Flag yours as favorite. |
| next_survey_at | string | – | When 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_survey | boolean | – | Email 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_id | string | – | The 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… |
| prompts | array | – | The questions asked to the AI engines at every survey, phrased exactly as a customer would ask them. |
| resolution | string | – | Repetitions of every question per engine and survey: hd=1, full_hd=3, 4k=6, 8k=9. Answers are stochastic; more repetitions sharpen the rates. |
| title | string | – | Display name of the tracker. |
| tracker_id | string | yes | The UUID of the tracker: call list_trackers to find it. |
No output schema declared.
No examples provided.
verify_corroboration Check a corroboration against its page, now ~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…
| Name | Type | Req | Description |
|---|---|---|---|
| corroboration_id | string | yes | The UUID of the corroboration: call list_corroborations to find it. |
No output schema declared.
No examples provided.
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.