Table of Contents
- What Groundlane is (per repo self-description, not inference)
- The three tools' responsibilities (not interchangeable)
- Why a remote MCP layer instead of local scripts
- Actual deployment and auth steps (from docs, not assumption)
- What this article verifies and what it does not claim
- What's next in the series
- References
🌏 繁體中文版
What Groundlane is (per repo self-description, not inference)
The repo describes Groundlane as an "open-source remote MCP server" providing "safe, provider-agnostic web search, retrieval, and deterministic extraction." Currently implemented scope (from the same source):
- Three remote MCP tools:
web_search,web_fetch,web_extract. - Ten search adapters: Tavily, Exa, Parallel, Browserbase, Brave, Firecrawl, SerpApi, Linkup, Serper, You.com.
- Self-hosted Reader (Mozilla Readability with a local fallback) outputting Markdown / text / HTML without requiring a browser backend.
- Optional hosted fallbacks: Jina Reader (reading) and Browserless (browser rendering), only invoked when explicitly enabled by the operator.
- Deployment targets: Cloudflare Worker + Container, plus Docker standalone and local Node modes.
- Authentication uses two separate secrets:
GROUNDLANE_AUTH_TOKEN(bearer token for headless / CLI clients) andOAUTH_OWNER_PASSPHRASE(gate for interactive cloud connector consent screens), which must differ and each be at least 32 random characters.
Important: 0.1.0 is explicitly marked as "early preview; no stable tool-contract guarantee yet." All technical descriptions in this series are records of the currently observable source and docs, not promises about a future stable release.
The three tools' responsibilities (not interchangeable)
The tool contracts can be read directly from the repo; no inference is needed:
| Tool | Main input | Main output | Determinism source |
|---|---|---|---|
web_search | Query string, optional provider, optional time range | Normalized result list with per-provider rank provenance and RRF-merged ranking, source URLs, canonical dedup evidence | Provider adapters + local merge logic |
web_fetch | URL, format (markdown / text / html), render strategy (auto / never / always) | Normalized content, finalUrl, engine, backend, truncated | Local HTTP + Readability; Jina / Browserless only when enabled |
web_extract | URL + CSS selector structure (no implicit LLM step) | Structured JSON matching selector nodes or attributes | Deterministic DOM extraction, no hidden model inference |
A key distinction: web_fetch and web_extract work without any search-provider key, because they operate on directly accessible URLs and local normalization. This matters for in-site applications (e.g. reference verification for articles, data collection for daily digests): as long as the target URL is reachable, retrieval and extraction can run without opening a search-provider account for every task.
Why a remote MCP layer instead of local scripts
Traditional approaches embed web access directly into the agent flow: a script calls requests.get or WebFetch, passes the content to the model, and moves on. That works for small experiments, but it exposes risks at scale:
- Provider lock-in: changing a search or retrieval source requires rewriting parsing and error handling.
- Blurred identity and resource boundaries: URLs, redirects, DNS answers, and browser subresources are all treated as trusted inputs, making SSRF risks easy to spread from the agent to the provider side.
- Insufficient determinism: if extraction relies on implicit model inference (e.g. "find the title on this page"), results cannot be explained line-by-line or reproduced across providers.
Groundlane responds by making the boundary explicit: authentication sits at the edge, providers are replaceable, extraction is selector-driven (deterministic), and default limits (URL policy, DNS/redirect checks, a single deadline, byte/output caps, concurrency limits) remain on the server side. The agent only needs to know which MCP tool to call and with which parameters — it does not manage each provider's credentials or parsing differences.
Actual deployment and auth steps (from docs, not assumption)
Minimal local start (Quick start):
git clone https://github.com/vincentxuu/groundlane.git
cd groundlane
pnpm install
pnpm exec playwright install chromium
cp .env.example .env
# set a long random GROUNDLANE_AUTH_TOKEN
pnpm dev
After start, the server exposes an authenticated Streamable HTTP MCP endpoint at http://localhost:8080/mcp. Search-provider keys are optional: without any, web_search is unavailable, but web_fetch and web_extract still work on directly accessible URLs.
Cloudflare deployment requires two different secrets (explicitly required, not optional):
GROUNDLANE_AUTH_TOKEN: bearer token for headless / CLI clients.OAUTH_OWNER_PASSPHRASE: gate for interactive cloud connector consent screens.
The separation is a security design, not a formality: if a consent screen is phished, the attacker gains OAUTH_OWNER_PASSPHRASE, which is different from the bearer token used by all headless clients, so it cannot be reused directly across every client.
What this article verifies and what it does not claim
Every technical claim in this article traces to verifiable sources:
github.com/vincentxuu/groundlaneREADME and docs (retrieved viacurland source inspection, not from training memory)..claude/skills/groundlaneskill, which referencesmcp__groundlane__*tool routes consistent with the three tools described here.- No unimplemented feature is introduced (e.g. "automatic crawl" or "cache-aware routing" are listed as "Next" in the self-description, not current features).
This article also explicitly marks the version as 0.1.0 early preview and repeats: any expectation about a future stable release should be verified against the official docs at that time, not taken from this series.
What's next in the series
To give readers a clear roadmap, the remaining four parts (scope only, not full content):
- Part 2: MCP Tool Practice — actual
web_search/web_fetch/web_extractcalls, parameter choices (provider, format, render), response structure, and error-handling patterns. - Part 3: Comparison with Traditional Approaches — comparing local
WebFetch,stealth_fetch,puppeteer, andrequestsflows on determinism, replaceability, identity boundary, and operational cost. - Part 4: In-Site Application — integrating existing
mcp__groundlane__*tools into reference verification and daily digest data collection, without inventing new features. - Part 5: Pitfalls and Best Practices —
timeout,selector,rendermode, error handling, version-change risk, and security boundary recommendations.
Shared principle across the series: technical descriptions are based on verifiable source and docs; in-site applications use existing skills and flows as facts; any mention of future features is explicitly labeled as "not yet implemented" or "subject to change in preview."
References
- Groundlane GitHub source (v0.1.0)
- Groundlane product description and docs (self-description including three tools, ten adapters, deployment steps, dual-auth mechanism)
- .claude/skills/groundlane skill (in-site MCP tool routes)
- Groundlane security notes (SECURITY.md) (SSRF risk, private vulnerability reporting process)
Loading...