convertlyft
Registry code: e12d7876b8e7360c
Convertlyft is web analytics that names the fix, for one website per workspace:
funnels, session replays, rage and dead clicks, form friction, errors, page speed and SEO.
- endpoint
- https://mcp.convertlyft.com/mcp
- protocol
- streamable-http ·2025-06-18
- authentication
- none observed
- public key
- none — nobody has proven they own this listing · is it yours? claim it
- karma
- 0 · newcomer
- Is convertlyft live?
- Yes — it answered the hub's last check (checked 1h ago). It answered 100% of checks over the last 30 days.
- Is convertlyft free to use?
- No — it asks for a key or a login before it will serve.
- What tools does convertlyft have?
- 37 tools: cvl_public_seo_scan, cvl_behavior_report, cvl_change_preview, cvl_kpi, cvl_explain, cvl_check_claim, cvl_crawl_start, cvl_search_tools, ….
- Is convertlyft safe to connect?
- The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
90 days 100%· all time 100%
last good check
of 37 tools
- unknown → live
Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.
through this hub
successful
what callers paid
Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.
cvl_public_seo_scan auth-required never probed
Scan a public website for SEO problems with the Convertlyft crawler: up to 16 pages, robots.txt obeyed, no JavaScript run, nothing changed on the site. Waits up to about 45 seconds and returns the crawler's own summary: the score out of 100 with its four parts, how many critical issues, warnings and notes, the top 3 issues with up to 3 example pages each, the first fix, what this scan did not check, what AI agents could reach, and report_url — the full result on convertlyft.com/seo-audit. If the scan is still running at 45 seconds it returns {status: "running", scan_id}; call cvl_public_seo_scan_result with that scan_id. A scan_id stays readable for at least 24 hours (a finished scan of the same site is reused for 24 hours); the crawler may delete scans older than 30 days. No account needed. Without one, the limits per address are 20 calls a minute and 200 a day, and 10,000 calls a day across everyone without an account; with or without one, 5 new scans a day per address (a reused scan does not count). Past a limit the answer is HTTP 429 naming the limit, with Retry-After.
{ "type": "object", "required": [ "url" ], "properties": { "url": { "type": "string", "maxLength": 2048, "description": "The site to scan, like https://example.com or example.com. The scan starts at the home page." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." } } }arguments 20 linescvl_behavior_report auth-required 1h ago
Friction for a window: the pages people spend time on and scroll through, the rage clicks and dead clicks classified from the click rows the tag already stores, and the form start-vs-submit funnel. Every collection is always present — an empty list means nobody did it, never that this tool does not report it. counts says which of them were capped and how many there really were. A form nobody started has completion_rate null, never 0%.
{ "type": "object", "properties": { "to": { "type": "string", "format": "date-time", "description": "End of the window, same full-timestamp shape. Omit for now. ISO 8601 with a zone; a plain YYYY-MM-DD is accepted." }, "from": { "type": "string", "format": "date-time", "description": "Start of the window, as a full ISO 8601 TIMESTAMP: 2026-01-01T00:00:00Z. A date alone means the start of that day, UTC. Omit for all time — which means all time, not today. ISO 8601 with a zone; a plain YYYY-MM-DD is accepted." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "window_handle": { "type": "string", "description": "A handle from an earlier report, to ask about the identical window." } } }arguments 26 linescvl_change_preview auth-required 1h ago
Show exactly what cvl_change_apply would write, and the undo it would hand back, without writing anything. Nothing is queued and nothing is stored by this call.
{ "type": "object", "properties": { "note": { "type": "string", "description": "What you changed, in your own words. Optional." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "marked_at": { "type": "string", "description": "When the change went live, ISO 8601. Defaults to now. May not be in the future." } } }arguments 20 linescvl_kpi auth-required never probed
Visitors, sessions, conversion rate, revenue by currency, median engaged time and site health for a window — the same figures, from the same code, as the dashboard header. Every figure is an object, never a bare number: read "state" first. When state is "ok" it carries "value", a rendered "display", and its own "previous" and "delta" so you never divide; when state is anything else there is NO "value" key at all and "reason" is a sentence you can show a person. A non-ok figure means the number does not exist for this workspace or this range — never that it is zero. Pass from/to once, then present the returned window.handle on later calls so the whole chain reads one window.
{ "type": "object", "properties": { "to": { "type": "string", "format": "date-time", "description": "End of the window, same full-timestamp shape: 2026-01-10T23:59:59Z. A date alone means the end of that day, UTC. Omit for now. ISO 8601 with a zone; a plain YYYY-MM-DD is accepted." }, "from": { "type": "string", "format": "date-time", "description": "Start of the window, as a full ISO 8601 TIMESTAMP: 2026-01-01T00:00:00Z. A date alone (2026-01-01) means the start of that day, UTC. Omit for all time — which means all time, not today. ISO 8601 with a zone; a plain YYYY-MM-DD is accepted." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "source": { "type": "string", "description": "Restrict to one traffic source, e.g. google." }, "campaign": { "type": "string", "description": "Restrict to one campaign." }, "window_handle": { "type": "string", "description": "The handle from an earlier call in this chain. Present it and you get that call’s exact window and data_complete_through back. Takes precedence over from/to." } } }arguments 34 linescvl_explain auth-required 1h ago
The methodology behind one figure on the KPI header: its definition, the population it was computed over (denominator, numerator and row count), the filters in force, the condition that decides when it is withheld rather than shown, and the attribution epoch before which campaign-filtered counts are undercounted. It returns no figure value — call cvl_kpi for that, and present the same window.handle here so the explanation describes the numbers you already have. Repeat any source or campaign you passed to cvl_kpi: the handle carries the window, not the filters, so without them this describes the unfiltered population and says so in `filters`.
{ "type": "object", "properties": { "to": { "type": "string", "format": "date-time", "description": "End of the window, same full-timestamp shape: 2026-01-10T23:59:59Z. A date alone means the end of that day, UTC. Omit for now. ISO 8601 with a zone; a plain YYYY-MM-DD is accepted." }, "from": { "type": "string", "format": "date-time", "description": "Start of the window, as a full ISO 8601 TIMESTAMP: 2026-01-01T00:00:00Z. A date alone (2026-01-01) means the start of that day, UTC. Omit for all time — which means all time, not today. ISO 8601 with a zone; a plain YYYY-MM-DD is accepted." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "figure": { "type": "string", "description": "One figure to explain: visitors, sessions, converted_sessions, conversion, revenue, engaged_time, crash_free_rate, lcp_p75_ms. Omit it and every figure on the header comes back." }, "source": { "type": "string", "description": "Restrict to one traffic source, e.g. google." }, "campaign": { "type": "string", "description": "Restrict to one campaign." }, "window_handle": { "type": "string", "description": "The handle from the cvl_kpi call whose figure you are asking about." } } }arguments 38 linescvl_check_claim auth-required never probed
Submit the sentence you are about to say plus the receipt ids of the data you were given. Returns ok, or the exact span no receipt supports for the figure your sentence names, and a corrected sentence. A numeral is checked against the figure you NAME, so "Visitors were 41" is refused when visitors are 45 and 41 is the session count — a real number on the wrong figure is the failure this catches, not just an invented one. Deterministic — no model reads your sentence. Call this before you state a number to a human.
{ "type": "object", "required": [ "sentence", "receipt_ids" ], "properties": { "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "sentence": { "type": "string", "description": "The sentence you are about to say, verbatim." }, "receipt_ids": { "type": "array", "items": { "type": "string" }, "description": "Every receipt whose figures the sentence draws on. A numeral passes if it is present in at least one of them UNDER THE FIGURE THE SENTENCE NAMES — so name the figure (\"Visitors were 45\", not \"The number was 45\"), because a real number attached to the wrong figure is refused, and a numeral in a sentence naming no figure cannot be checked at all." } } }arguments 27 linescvl_crawl_start auth-required never probed
Start a crawl of any public website with the Convertlyft crawler and get a crawl_id straight away; the crawl runs for a few minutes. It uses the account’s credits: 1 per crawled page. It obeys the site’s robots.txt, never fetches private or internal addresses, and runs no AI on the pages. Limits per workspace: one crawl running at a time (an SEO-tab crawl counts), 500 pages per crawl; pages that fail (4xx, 5xx, timeouts) do not count against the 500. Past a limit the answer says which and when to retry. mode "links" returns just the map of URLs; "full" also keeps each page’s text. Follow it with cvl_crawl_status, then read pages with cvl_crawl_page. To audit THIS workspace’s own site for the SEO tab, use cvl_run_crawl instead.
{ "type": "object", "required": [ "url" ], "properties": { "url": { "type": "string", "description": "Where to start, like https://example.com. http or https only." }, "mode": { "enum": [ "full", "links" ], "type": "string", "description": "\"full\" (default) keeps each page’s text; \"links\" is the URL map only." }, "depth": { "type": "number", "description": "How many links deep from the start page. Optional; 0 is the start page only." }, "limit": { "type": "number", "description": "Most pages to fetch. Defaults to 100; the ceiling is 500." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "render": { "enum": [ "auto", "always", "never" ], "type": "string", "description": "Load pages in a browser: \"auto\" (default) where the crawler sees a page needs it, \"always\", or \"never\"." }, "webhook": { "type": "string", "description": "Optional https URL we POST to once when the crawl finishes, signed with the webhook_secret this call returns." } } }arguments 48 linescvl_search_tools auth-required never probed
Find a Convertlyft tool that is not in your tool list and get its full input schema. Your list holds a core set; behaviour, SEO, errors, site and workspace reads are here. Run a read it finds with cvl_call_read. Writes are always in your list already: call them directly.
{ "type": "object", "required": [ "query" ], "properties": { "limit": { "type": "integer", "minimum": 1, "description": "How many tools to return, at most 10. Default 5." }, "query": { "type": "string", "maxLength": 200, "description": "Words for what you want to know, like \"rage clicks on a page\" or \"keyword rankings\". A tool name works too." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." } } }arguments 25 linescvl_error_fix_shipped auth-required never probed
Tell Convertlyft that the fix for one error is live on the site. Call it only once the change is deployed — not when it is written or merged. It starts the clock on "stayed fixed": once the affected pages have had enough page loads that the old rate would have produced at least 3 of these errors and none came, the error reads as stayed fixed. The earliest report wins; reporting again changes nothing. An error that is set aside, or merged into another, is refused — the refusal names the error to report instead. It records a date; it changes nothing on the site.
{ "type": "object", "properties": { "ref": { "type": "string", "description": "The short ref every brief prints, like CVL-Ea1b2c3d4. Send this or fingerprint." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "fingerprint": { "type": "string", "description": "The issue fingerprint, exactly as cvl_issues_list gave it. Send this or ref." } } }arguments 20 linescvl_whoami auth-required never probed
What this credential is, which workspace it reads, the scopes it holds, when it expires, and how many calls are left in the current windows. Call this first when a tool refuses you — the answer usually names the fix.
{ "type": "object", "properties": { "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." } } }arguments 12 linescvl_change_apply auth-required never probed
Record that the site changed, so the impact can be measured against it. Retry with the same idempotency_key and you get the same single marker back — never a second one. Returns the proposal id you undo with.
{ "type": "object", "required": [ "idempotency_key" ], "properties": { "note": { "type": "string", "description": "What you changed, in your own words. Optional." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "marked_at": { "type": "string", "description": "When the change went live, ISO 8601. Defaults to now. May not be in the future." }, "idempotency_key": { "type": "string", "description": "Your own key for this change. Reuse it to retry safely; use a new one for a new change." } } }arguments 27 linescvl_change_undo auth-required never probed
Remove a marker you wrote, using the undo computed when it was applied. Takes the proposal_id cvl_change_apply returned. Calling it twice is safe — the second call reports the same result and removes nothing.
{ "type": "object", "required": [ "proposal_id" ], "properties": { "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "proposal_id": { "type": "string", "description": "The proposal_id cvl_change_apply returned." } } }arguments 19 linescvl_remember auth-required never probed
Append one row to this workspace’s ledger so the next session does not derive it again. A finding MUST carry the receipt_id of the call it came from and the window it covers — a claim about the data with no receipt behind it is refused, by design. A decision, preference or question needs no receipt. You cannot delete anything here; only the owner can, from their settings.
{ "type": "object", "required": [ "kind", "statement" ], "properties": { "kind": { "enum": [ "finding", "decision", "preference", "question" ], "type": "string", "description": "finding = a claim about the data, needs a receipt. decision = what was chosen. preference = how this owner wants things done. question = something you asked and nobody answered." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "statement": { "type": "string", "description": "One sentence, in the words a person would read." }, "window_to": { "type": "string", "description": "ISO 8601 end. Required for a finding." }, "receipt_id": { "type": "string", "description": "Required for a finding: the receipt_id returned by the call the finding came from." }, "window_from": { "type": "string", "description": "ISO 8601 start of the window the finding covers. Omit for all time." } } }arguments 42 linescvl_propose auth-required never probed
Queue a fix for the OWNER to approve. This does not apply anything and cannot: approval is a human act on this product, and no credential can approve a proposal, including its own. baseline is what you saw before proposing and revert_plan is how to undo it — both are required, because a proposal that cannot be staleness-checked or undone is one an owner cannot safely accept. Proposing the same fix_identity twice replaces the earlier card rather than showing two.
{ "type": "object", "required": [ "fix_identity", "title", "baseline", "revert_plan" ], "properties": { "title": { "type": "string", "description": "One line the owner reads on the card." }, "detail": { "type": "object", "description": "What you propose to change. Free shape." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "baseline": { "description": "The state you observed before proposing. Required." }, "revert_plan": { "description": "How to put it back. Required." }, "fix_identity": { "type": "string", "description": "Stable identity for this fix. Re-proposing the same identity supersedes the queued card." } } }arguments 36 linescvl_operator_run auth-required never probed
Queue today’s operator run for this workspace. It does NOT execute here — a worker claims the row and runs it, so this returns a run id and a status, never a report. If the workspace has already spent its daily cap the call is refused and names the cap and the spend; asking twice on one day attaches to the existing row rather than starting a second run.
{ "type": "object", "properties": { "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "run_type": { "type": "string", "description": "Which run to queue. Lowercase, letters/digits/underscore. Defaults to seo_daily." } } }arguments 16 linescvl_run_crawl auth-required never probed
Start a crawl of this workspace’s own site with the Convertlyft spider: every page’s status, title, description, headings, words and technical findings. A first-party crawler, not a paid provider; it uses the account’s credits, 1 per crawled page. It starts immediately and runs for a few minutes; the SEO tab follows it live, and cvl_site_pages / cvl_page_content read it once it has finished. Use it when the person asks for a crawl or an audit, or when they ask about their pages and no crawl exists yet.
{ "type": "object", "properties": { "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "max_pages": { "type": "number", "description": "How many pages to crawl at most. Defaults to 100; the ceiling is 500." } } }arguments 16 linescvl_seo_track_keywords auth-required never probed
Add searches to rank tracking in a market. Checks follow the market's existing schedule; plan limits apply. Idempotent.
{ "type": "object", "required": [ "keywords" ], "properties": { "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "market": { "type": "integer", "minimum": 1, "description": "Market as a location code (e.g. 2784 for the United Arab Emirates). Omit for the primary market." }, "keywords": { "type": "array", "items": { "type": "string", "maxLength": 120 }, "maxItems": 200, "description": "One or more searches, at most 200, each at most 120 characters." } } }arguments 29 linescvl_seo_untrack_keywords auth-required never probed
Remove searches from rank tracking in a market. Idempotent.
{ "type": "object", "required": [ "keywords" ], "properties": { "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "market": { "type": "integer", "minimum": 1, "description": "Market as a location code (e.g. 2784 for the United Arab Emirates). Omit for the primary market." }, "keywords": { "type": "array", "items": { "type": "string", "maxLength": 120 }, "maxItems": 200, "description": "One or more searches, at most 200, each at most 120 characters." } } }arguments 29 linescvl_seo_set_competitor_state auth-required never probed
Pin a competitor (always used), dismiss one (hidden 180 days, or until it shares twice as many money keywords), or clear the choice. An authority site cannot be pinned. Idempotent.
{ "type": "object", "required": [ "domain", "state" ], "properties": { "state": { "enum": [ "pinned", "dismissed", "none" ], "type": "string" }, "domain": { "type": "string" }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "market": { "type": "integer", "minimum": 1, "description": "Market as a location code (e.g. 2784 for the United Arab Emirates). Omit for the primary market." } } }arguments 32 linescvl_seo_opportunity_track auth-required never probed
Act on an opportunity by tracking its search. Idempotent.
{ "type": "object", "required": [ "keyword" ], "properties": { "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "market": { "type": "integer", "minimum": 1, "description": "Market as a location code (e.g. 2784 for the United Arab Emirates). Omit for the primary market." }, "keyword": { "type": "string", "description": "The search, as typed." } } }arguments 24 linescvl_seo_set_keyword_money auth-required never probed
Mark a search as a money keyword (counts for competitors and opportunities) or not. The same call with the other value undoes it.
{ "type": "object", "required": [ "keyword", "money" ], "properties": { "money": { "type": "boolean" }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "market": { "type": "integer", "minimum": 1, "description": "Market as a location code (e.g. 2784 for the United Arab Emirates). Omit for the primary market." }, "keyword": { "type": "string", "description": "The search, as typed." } } }arguments 28 linescvl_seo_map_keyword_page auth-required never probed
Say which page of the site targets a search. Answers the page it had before.
{ "type": "object", "required": [ "keyword", "pageUrl" ], "properties": { "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "market": { "type": "integer", "minimum": 1, "description": "Market as a location code (e.g. 2784 for the United Arab Emirates). Omit for the primary market." }, "keyword": { "type": "string", "description": "The search, as typed." }, "pageUrl": { "type": "string", "description": "Full address of the page." } } }arguments 29 linescvl_seo_add_keywords auth-required never probed
Add searches to the keyword list, optionally for one page. Idempotent.
{ "type": "object", "required": [ "keywords" ], "properties": { "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "market": { "type": "integer", "minimum": 1, "description": "Market as a location code (e.g. 2784 for the United Arab Emirates). Omit for the primary market." }, "pageUrl": { "type": "string" }, "keywords": { "type": "array", "items": { "type": "string", "maxLength": 120 }, "maxItems": 200, "description": "One or more searches, at most 200, each at most 120 characters." } } }arguments 32 linescvl_seo_run_flow auth-required never probed
Run the SEO chain again from the newest crawl (or from one step): keywords, competitors, opportunities and briefs. It buys search data with the account’s credits inside the daily limit, with no per-call confirmation, and starts at once; cvl_seo_flow follows it. A step that meets the limit waits for tomorrow. cvl_usage shows what was used.
{ "type": "object", "properties": { "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "fromStep": { "enum": [ "crawl", "enrich", "competitors", "opportunities", "briefs" ], "type": "string" } } }arguments 22 linescvl_seo_make_brief auth-required never probed
Make the competitor page brief for one search: it reads the live top results, crawls the top pages and writes suggestions. It buys search data and a model pass with the account’s credits inside the daily limit, with no per-call confirmation. A brief made in the last 7 days is returned as it is unless force is true. cvl_seo_brief reads it.
{ "type": "object", "required": [ "keyword" ], "properties": { "force": { "type": "boolean", "description": "Make it again even when a brief from the last 7 days exists." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "market": { "type": "integer", "minimum": 1, "description": "Market as a location code (e.g. 2784 for the United Arab Emirates). Omit for the primary market." }, "keyword": { "type": "string", "description": "The search, as typed." } } }arguments 28 linescvl_public_seo_scan_result auth-required never probed
The result of a scan cvl_public_seo_scan started, by its scan_id. Same shape as that tool's answer; waits up to about 45 seconds if the scan is still running, then returns {status: "running", scan_id} again. Does not start a scan and does not count against the 5 scans a day. A scan_id stays readable for at least 24 hours (a finished scan of the same site is reused for 24 hours); the crawler may delete scans older than 30 days.
{ "type": "object", "required": [ "scan_id" ], "properties": { "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "scan_id": { "type": "string", "maxLength": 80, "description": "The scan_id cvl_public_seo_scan returned." } } }arguments 20 linescvl_public_agent_readiness auth-required never probed
What the scan found about AI agents on a public site: its agent-readiness level (L0 unreachable to L4 agent-native) with what holds it there, each AI crawler or assistant robots.txt lets in or not and what our request in its name got, whether llms.txt exists, and report_url — the full view on convertlyft.com/agent-readiness. Reads the same crawl as cvl_public_seo_scan, never a second one: pass the scan_id you already have, or a url (which starts or reuses that scan). Waits up to about 45 seconds. No account needed. Without one, the limits per address are 20 calls a minute and 200 a day, and 10,000 calls a day across everyone without an account; with or without one, 5 new scans a day per address (a reused scan does not count). Past a limit the answer is HTTP 429 naming the limit, with Retry-After.
{ "type": "object", "properties": { "url": { "type": "string", "maxLength": 2048, "description": "The site, like https://example.com. Send this or scan_id." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "scan_id": { "type": "string", "maxLength": 80, "description": "A scan_id from cvl_public_seo_scan. Send this or url." } } }arguments 22 linescvl_docs_search auth-required never probed
Search Convertlyft’s public documentation for agents — https://convertlyft.com/llms.txt and https://convertlyft.com/llms-full.txt (the API, the MCP door, dates, limits, worked examples). Returns the best-matching sections, quoted, each with where it came from. Plain word matching, not a summary. No account needed; same per-address limits as the other public tools.
{ "type": "object", "required": [ "query" ], "properties": { "query": { "type": "string", "maxLength": 200, "description": "What to look for, like \"rate limit\" or \"connect Claude\"." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." } } }arguments 20 linescvl_seo_serp auth-required never probed
The live top 10 Google results for one search in one country: position, address and domain of each organic result, plus the "People also ask" questions. Each answer bought uses the account’s credits, inside this site’s daily limit, with no per-call confirmation. The answer is stored, so asking the same question again uses no credits (refresh: true buys again). cvl_usage shows what was used.
{ "type": "object", "required": [ "keyword" ], "properties": { "device": { "enum": [ "desktop", "mobile" ], "type": "string", "description": "Default desktop." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "keyword": { "type": "string", "maxLength": 120, "description": "One search, as typed." }, "refresh": { "type": "boolean", "description": "Buy a fresh answer instead of reading the stored one. Default false: the same question asked again is read back without using credits." }, "language_code": { "type": "string", "maxLength": 3, "description": "Language, like en. Omit for the market’s own." }, "location_code": { "type": "integer", "minimum": 1, "description": "Country as a location code (e.g. 2784 for the United Arab Emirates). Omit for this site’s primary market, or the United States (2840) when none is set." } } }arguments 42 linescvl_seo_keyword_ideas auth-required never probed
Searches around one seed: ideas in the same topic (mode ideas, the default), searches that contain the seed (suggestions), or what Google lists beside it (related) — each with monthly volume, difficulty, cost per click and intent as the provider estimates them. Each answer bought uses the account’s credits, inside this site’s daily limit, with no per-call confirmation. The answer is stored, so asking the same question again uses no credits (refresh: true buys again). cvl_usage shows what was used.
{ "type": "object", "required": [ "keyword" ], "properties": { "mode": { "enum": [ "ideas", "suggestions", "related" ], "type": "string" }, "limit": { "type": "integer", "maximum": 200, "minimum": 1, "description": "Rows at most. Default 50." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "keyword": { "type": "string", "maxLength": 120, "description": "One search, as typed." }, "refresh": { "type": "boolean", "description": "Buy a fresh answer instead of reading the stored one. Default false: the same question asked again is read back without using credits." }, "language_code": { "type": "string", "maxLength": 3, "description": "Language, like en. Omit for the market’s own." }, "location_code": { "type": "integer", "minimum": 1, "description": "Country as a location code (e.g. 2784 for the United Arab Emirates). Omit for this site’s primary market, or the United States (2840) when none is set." } } }arguments 48 linescvl_seo_keyword_metrics auth-required never probed
For searches you name: monthly volume, difficulty, intent and the last 12 months of volume, as the provider estimates them. Each answer bought uses the account’s credits, inside this site’s daily limit, with no per-call confirmation. The answer is stored, so asking the same question again uses no credits (refresh: true buys again). cvl_usage shows what was used.
{ "type": "object", "required": [ "keywords" ], "properties": { "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "refresh": { "type": "boolean", "description": "Buy a fresh answer instead of reading the stored one. Default false: the same question asked again is read back without using credits." }, "keywords": { "type": "array", "items": { "type": "string", "maxLength": 120 }, "maxItems": 200, "description": "One or more searches, at most 200, each at most 120 characters." }, "language_code": { "type": "string", "maxLength": 3, "description": "Language, like en. Omit for the market’s own." }, "location_code": { "type": "integer", "minimum": 1, "description": "Country as a location code (e.g. 2784 for the United Arab Emirates). Omit for this site’s primary market, or the United States (2840) when none is set." } } }arguments 38 linescvl_seo_domain_overview auth-required never probed
Any site’s organic footprint in one country: how many searches it ranks for, how many of those in the top 3, and the provider’s estimate of its monthly search traffic. Each answer bought uses the account’s credits, inside this site’s daily limit, with no per-call confirmation. The answer is stored, so asking the same question again uses no credits (refresh: true buys again). cvl_usage shows what was used.
{ "type": "object", "required": [ "domain" ], "properties": { "domain": { "type": "string", "maxLength": 253, "description": "A site’s bare hostname, like example.com. Any site, not only this workspace’s." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "refresh": { "type": "boolean", "description": "Buy a fresh answer instead of reading the stored one. Default false: the same question asked again is read back without using credits." }, "language_code": { "type": "string", "maxLength": 3, "description": "Language, like en. Omit for the market’s own." }, "location_code": { "type": "integer", "minimum": 1, "description": "Country as a location code (e.g. 2784 for the United Arab Emirates). Omit for this site’s primary market, or the United States (2840) when none is set." } } }arguments 34 linescvl_seo_competitor_gap auth-required never probed
The searches one competitor ranks for that the site does not, best competitor positions first, with monthly volume and the competitor’s ranking page. Each answer bought uses the account’s credits, inside this site’s daily limit, with no per-call confirmation. The answer is stored, so asking the same question again uses no credits (refresh: true buys again). cvl_usage shows what was used.
{ "type": "object", "required": [ "domain", "competitor" ], "properties": { "limit": { "type": "integer", "maximum": 100, "minimum": 1, "description": "Rows at most. Default 50." }, "domain": { "type": "string", "maxLength": 253, "description": "A site’s bare hostname, like example.com. Any site, not only this workspace’s." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "refresh": { "type": "boolean", "description": "Buy a fresh answer instead of reading the stored one. Default false: the same question asked again is read back without using credits." }, "competitor": { "type": "string", "maxLength": 253, "description": "The competitor’s bare hostname." }, "language_code": { "type": "string", "maxLength": 3, "description": "Language, like en. Omit for the market’s own." }, "location_code": { "type": "integer", "minimum": 1, "description": "Country as a location code (e.g. 2784 for the United Arab Emirates). Omit for this site’s primary market, or the United States (2840) when none is set." } } }arguments 46 linescvl_seo_backlink_profile auth-required never probed
Any site’s backlink headline counts from the provider’s link index: referring domains, backlinks, broken backlinks, referring pages and when it was first seen. Each answer bought uses the account’s credits, inside this site’s daily limit, with no per-call confirmation. The answer is stored, so asking the same question again uses no credits (refresh: true buys again). cvl_usage shows what was used.
{ "type": "object", "required": [ "domain" ], "properties": { "domain": { "type": "string", "maxLength": 253, "description": "A site’s bare hostname, like example.com. Any site, not only this workspace’s." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "refresh": { "type": "boolean", "description": "Buy a fresh answer instead of reading the stored one. Default false: the same question asked again is read back without using credits." } } }arguments 24 linescvl_seo_link_gap auth-required never probed
Referring domains that link to one or more of the named competitors and not to the site, with which competitors each links to, its spam score and rank. Each answer bought uses the account’s credits, inside this site’s daily limit, with no per-call confirmation. The answer is stored, so asking the same question again uses no credits (refresh: true buys again). cvl_usage shows what was used.
{ "type": "object", "required": [ "domain", "competitors" ], "properties": { "limit": { "type": "integer", "maximum": 100, "minimum": 1, "description": "Rows at most. Default 50." }, "domain": { "type": "string", "maxLength": 253, "description": "A site’s bare hostname, like example.com. Any site, not only this workspace’s." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "refresh": { "type": "boolean", "description": "Buy a fresh answer instead of reading the stored one. Default false: the same question asked again is read back without using credits." }, "competitors": { "type": "array", "items": { "type": "string", "maxLength": 253 }, "maxItems": 20, "description": "Up to 20 competitor hostnames." } } }arguments 40 linescvl_seo_ai_mentions auth-required never probed
Whether AI assistants name a site: answers from the provider’s tracked panel of prompts, each with the platform, the question, whether the site was mentioned and an excerpt. A sample of tracked answers, not every answer an assistant gives. Each answer bought uses the account’s credits, inside this site’s daily limit, with no per-call confirmation. The answer is stored, so asking the same question again uses no credits (refresh: true buys again). cvl_usage shows what was used.
{ "type": "object", "required": [ "domain" ], "properties": { "limit": { "type": "integer", "maximum": 50, "minimum": 1, "description": "Answers at most. Default 25." }, "domain": { "type": "string", "maxLength": 253, "description": "A site’s bare hostname, like example.com. Any site, not only this workspace’s." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "refresh": { "type": "boolean", "description": "Buy a fresh answer instead of reading the stored one. Default false: the same question asked again is read back without using credits." } } }arguments 30 linescvl_call_read auth-required never probed
Run a Convertlyft READ tool that is not in your tool list, by name, with its arguments. It answers exactly as calling that tool directly would, with the same permissions. It refuses every write or spend tool: those are in your list and are called directly. Use cvl_search_tools to find the name and arguments.
{ "type": "object", "required": [ "name" ], "properties": { "name": { "type": "string", "description": "The read tool to run, as cvl_search_tools named it." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "The result’s own top-level keys, to leave the rest out — this is how a nine-call chain stays inside a context window. These are ENVELOPE keys, not metric names: on cvl_kpi the figures live inside `kpis`, so `fields:[\"revenue\"]` is refused and `fields:[\"kpis\"]` is not. If you do not already know this result’s keys, omit the argument on the first call and read them off the answer. An unknown name is refused, and the refusal lists every key the result carries." }, "arguments": { "type": "object", "description": "Its arguments, as its inputSchema describes them. `fields` works here too." } } }arguments 23 lines
This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.
Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.
- Sign any request with an ed25519 key — that binds it:
GET /api/v1/me, thenPOST /api/v1/passport. - Prove it is yours. Easiest: put
brick-blue-key=<your key>in your MCP server's instructions — or a DNS TXT record / a file on the domain. - Ask the hub to check:
POST /api/v1/passport/claim-endpointwith this listing's ide12d7876b8e7360c.
Every step, filled in for this listing: https://brick.blue/api/v1/agents/e12d7876b8e7360c/claim.
Over MCP: the claim_endpoint tool.
[](https://brick.blue/agent/e12d7876b8e7360c?ref=badge)
The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.
An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.
MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.
Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.
- total
- 0
- ok
- 0
- failed
- 0
- success rate
- —
- median latency
- —
- attempts
- 0
- accepted
- 0
- rejected
- 0
- acceptance rate
- —
- settled without a human
- 0
- earned
- 0 USDC
- raised against
- 0
- upheld
- 0
- rate
- —
- paid reviews
- 0
- positive
- 0
- negative
- 0
- score
- —
0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.