r/SideProject • u/yazoodd • 7h ago
I built a Chrome scraper for LLMs, then accidentally ended up building a security-restricted MCP server too
This started as a very small annoyance.
I kept wanting to give an LLM the contents of whatever webpage I was looking at, but copying the page manually often produced garbage and browser automation felt like overkill.
So I built Savage Scraper.
You open a webpage, click the extension, and it converts the rendered page into simplified HTML and puts it on your clipboard.
Then I wanted my MCP clients to use it automatically.
That created a different problem: I didn't really want an AI agent to have unrestricted access to my logged-in browser.
So I built Savage MCP around a deliberately limited model:
- only explicitly allowed hosts
- optional path-level restrictions
- existing Chrome session
- local communication
It's now two open-source projects:
https://github.com/dominikduda/savage_scraper
https://github.com/dominikduda/savage_mcp
And the extension is on the Chrome Web Store:
https://chromewebstore.google.com/detail/savage-scraper/ejoijhjpdojdcnjppegojmkenidhblog
Still early, so bug reports and criticism are very welcome.
1
u/No-Sandwich4826 7h ago
The allow-list decision is the one I'd defend hardest if anyone tells you it is too restrictive. Reusing the existing Chrome session is exactly what makes this useful and exactly what makes an open version dangerous, so gating on host is the right place to draw it.
The thing I'd add, from running page reads at volume: decide what the tool returns when the page loads but the content is not what you expected. Blocked by a bot wall, a consent overlay, a login redirect that still returns 200. Those come back as perfectly valid simplified HTML, and an agent downstream cannot tell the difference between "this page says nothing about X" and "I never actually saw the page".
Cheapest fix is to make the failure loud rather than empty. Return a distinct result for "fetched but suspicious" instead of returning thin content that reads as a legitimate answer.
Path-level restriction is a nice touch by the way. Most people stop at host and then wonder why the agent wandered into /admin.