@stravue/mcp
An MCP server for Stravue. It gives an AI agent a
research assistant, not a screenshot API: point it at a site with an ask
("pricing and plans"), and Stravue maps the site, picks the pages that answer
the ask, and returns clean full-page desktop and mobile frames with the reason
each page was picked. Every capture also gets a browsable share link and a
presentation-ready deck.
Runs over stdio. Works with Claude Code, Claude Desktop, Cursor, and any other
MCP client.
What it can and cannot do
It captures public pages, full-page, on desktop and phone, with drafted
comments and a written reason for every pick, and it exports real decks.
It will not sign in to sites, pass paywalls or human-verification checks
(it reports them honestly instead), click through flows, submit forms, or
reach private addresses. Captures take minutes, not milliseconds: start one
with capture, then poll get_capture. Up to 30 pages per capture, 120
requests per 5 minutes per key, and captures spend the account's normal
plan allowance — a capture that produces nothing refunds itself. Agent
captures are tagged as machine-made and never train Stravue's page-picking
judgment.
60-second setup
-
Get an API key: sign in at stravue.com, open your
account page, and create a key. It is shown once — copy it. Keys look like
sk_stravue_live_.... Captures spend your plan's normal allowance.
-
Add the server to your client.
Claude Code:
claude mcp add stravue --env STRAVUE_API_KEY=sk_stravue_live_... -- npx -y @stravue/mcp
Claude Desktop (claude_desktop_config.json) or Cursor (.cursor/mcp.json):
{
"mcpServers": {
"stravue": {
"command": "npx",
"args": ["-y", "@stravue/mcp"],
"env": {
"STRAVUE_API_KEY": "sk_stravue_live_..."
}
}
}
}
Config is env only:
STRAVUE_API_KEY | Required. Created on your stravue.com account page. |
STRAVUE_BASE_URL | Optional. Defaults to https://stravue.com. |
Tools
map_site
{ url } → the site's page URLs from its sitemap, navigation, or a browser
render. Honest failure fields pass through: blocked: true means a bot wall
refused the browser; redirectsTo means the site lives at another host;
hadSitemap: false with few urls means the site genuinely offers no map.
capture
{ urls?, site?, ask?, project?, device?, region? } → starts a capture and
returns { id, status, share_url } immediately. Two modes:
urls (1-30): capture exactly those pages.
site + ask: Stravue maps the site and picks the pages that answer the
ask. ask is capped at 200 characters here so the same ask works across
every Stravue endpoint. If nothing on the site matches the ask, the API
answers 422 rather than capturing a guess.
A capture takes minutes. Poll get_capture with the returned id.
get_capture
{ id } → status, ask, share_url and the frames captured so far. Each frame
carries picked_why (why the page was picked) and, when a page hit a wall, a
one-word failure: challenge, blank, sparse, or http_<status>. A page
that produced nothing is absent, never faked.
export_deck
{ id } → downloads the presentation-ready .pptx to a temporary file and
returns the file path.
export_markdown
{ id } → the machine-oriented Markdown export, returned inline. The right
way for an agent to read a capture's content.
Every tool response includes the capture's share link when one exists — it is
the browsable result, made to be handed to a human.
Rates and quota
- 120 requests per key per 5 minutes →
429. Poll every 15-30 seconds.
- A capture spends your plan's normal allowance →
402 with a plain reason
when it runs out. A capture that produces zero pages refunds itself.
- Errors always carry the server's own message; the server never invents a
result.
License
MIT.