# Changelog

All notable changes to MCP Scraper are documented here. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project follows semantic versioning for published packages.

## [Unreleased]

## [0.66.6] - 2026-08-26

### Fixed

- Google Search Console bulk URL Inspection now uses one bounded provider batch request, preserves successful URL results beside localized failures, and no longer inherits the former one-minute connected-tool cutoff.

## [0.66.5] - 2026-08-25

### Fixed

- Local Sourcebook submissions now distinguish accepted processing from publication, tell MCP clients to keep checking until the run is terminal, and return a plain-language completion message with the exact live listing URL.

## [0.66.4] - 2026-08-25

### Added

- Connected-service discovery now returns a tenant-owned `userLabel` plus verified provider account ID, email, name, and identity status so agents can select the intended account when one integration has multiple connections.
- Managed OAuth connections now retain non-secret provider identity metadata and support owner-scoped account names through the dashboard API.

### Fixed

- Nango tenant tags are no longer presented as the external provider account, preventing the MCP Scraper login from being mistaken for the Google, Slack, GitHub, Zoom, or other authorized identity.

## [0.66.3] - 2026-08-25

### Changed

- Runtime MCP discovery now omits output schemas across hosted OAuth, API-key, npm stdio, and MCPB clients, while the complete generated developer contract continues to supply typed Node and Python SDK outputs.

### Fixed

- Restored compatibility for strict MCP clients that could connect successfully but silently register zero tools when the complete output-schema catalog was advertised; tool calls retain both readable content and structured results.

## [0.66.2] - 2026-08-24

### Changed

- Hosted MCP, npm stdio, and MCPB now advertise every recorded tool output schema from one canonical contract; the former `none`, `essential`, and `all` environment profiles no longer change `tools/list`.
- Ordinary PAA calls continue to wait directly for their result, while Task-capable hosted clients start the same work immediately and poll its persisted status without routing the run through a scheduler.
- Direct PAA Tasks now allow three total managed-browser attempts, keeping the first two retryable browser interruptions or verification challenges inside the same Task and billing hold before exposing a terminal failure.

### Fixed

- Direct PAA Tasks no longer sit in an external event queue before browser work begins; the request runtime starts provider work immediately and uses its existing 800-second execution window.
- Complete output-schema advertising no longer causes Task-capable tools to be serialized as already-completed calls; hosted Task starts are validated and returned through the Task extension seam before terminal output validation.
- Replaying an idempotent request returns the existing run and never redispatches it, preserving duplicate-charge protection without turning replay into job recovery.
- Public npm artifacts no longer embed a developer-machine path for optional site-audit ZIP classification; installs use portable configuration and keep the existing LLM fallback when that dataset is absent.

## [0.66.1] - 2026-08-24

### Changed

- Task-capable MCP clients now run long PAA research as a durable job with live, preserved progress instead of tying the work lifecycle to one request window; legacy synchronous callers retain a bounded compatibility wait.
- The npm install card and MCPB description now share one manually curated current-release message.
- MCPB releases are now deterministic, self-contained server bundles with enforced archive-size, file-count, source-map, and `node_modules` gates instead of shipping the repository dependency tree; npm publishing also rejects source maps or unexpected dist size and file growth.

### Fixed

- Replaying a still-running durable PAA request now returns its existing job before concurrency enforcement, avoiding a false capacity error and duplicate charge risk.
- MCP Task polling now reads both structured MCP output and JSON text envelopes, reports question, row, or city progress, and preserves terminal failure and cancellation states.
- Client-side timeout errors now say that the caller stopped waiting without claiming that active durable server work was cancelled.

## [0.66.0] - 2026-08-24

### Added

- `lead_list_enrich` accepts up to three model-authored `peopleQueryTemplates`, interpolated safely across business rows with explicit maximum-search billing.

### Fixed

- Owner and leadership enrichment now uses focused role queries, reads AI Overview alongside organic evidence, preserves AI citation provenance, and stops searching once the requested people bound is filled instead of issuing one hard-coded multi-role query.
- Google harvests now retry closed browser, page, or context sessions with a fresh bounded browser attempt and return the actionable `browser_session_interrupted` code if all attempts fail, instead of a misleading non-retryable generic outage.
- Disabled internal browser credentials are classified as first-party service failures, while concurrency-limit rejections are recorded with their actual active and entitled slot counts for support diagnosis without retaining the customer's search text.

## [0.65.1] - 2026-08-24

### Fixed

- Background site workflows now retain their required `url` in MCP Task start receipts, preventing output-schema validation from rejecting `extract_site`, `analyze_site_similarity`, or `audit_site` before the caller receives its durable task handle.

## [0.65.0] - 2026-08-24

### Added

- Added `analyze_site_similarity`, a durable owner-scoped MCP workflow that JavaScript-renders up to 500 live pages, removes repeated template blocks from embedding input, computes dedicated raw-cosine page-pair scores and threshold clusters, and delivers rendered-page evidence plus CSV/JSONL results with corpus and model provenance.

### Fixed

- Sitemap discovery now expands CDATA-wrapped `<loc>` values emitted by common WordPress sitemap generators, preventing similarity crawls from silently collapsing to the start page.

## [0.64.1] - 2026-08-24

### Fixed

- Aligned the `lead_list_import` structured output schema with its mapping suggestions so live CSV, TSV, rows, and XLSX imports can return each suggestion's acceptance decision without failing MCP output validation.

## [0.64.0] - 2026-08-24

### Added

- Added owner-scoped lead-list upload, free CSV/TSV/XLSX import inspection, and durable supplied-list enrichment with replay-safe billing, row checkpoints, cooperative cancellation, explicit identity/contact provenance, and seven-day CSV/XLSX results across coding and chat MCP clients.
- Added opt-in exact-domain email recovery from bounded search-result snippets after selected first-party pages remain email-empty, with primary and secondary email columns, source provenance, and successful-search settlement.
- Added opt-in owner and leadership discovery to `lead_list_enrich`, returning bounded role evidence and company-matched LinkedIn profile candidates without opening LinkedIn pages or treating indexed snippets as verified employment.

### Fixed

- Page extraction now accepts content-rich pages that merely load background challenge scripts and exits the existing bounded browser wait as soon as delayed page content becomes usable, while true interstitials remain challenged.

## [0.63.2] - 2026-08-24

### Fixed

- Kept base-plan, bundled and standalone Memory, and concurrency-pack entitlements active while Stripe retries a `past_due` renewal, while terminal subscription states still remove access.
- Reused an existing active, trialing, or past-due base subscription during plan changes instead of risking a duplicate subscription when the local subscription reference is missing.
- Replaced unavailable credit-top-up guidance with the supported larger-plan path and a terminal upgrade command that lists only publicly purchasable tiers.

## [0.63.1] - 2026-08-23

### Fixed

- Preserved non-enumerable acquired HTML and main-content HTML when the background Inngest worker adds sitemap and Wayback provenance, so every newly completed durable export can serve the HTML representation promised by its request.
- Requests for a representation absent from an older export now return the non-retryable `site_export_format_unavailable` contract with manifest guidance instead of a retryable 500 `site_export_read_failed` response.
- Made the preferred `preserveMedia` option force durable background extraction just like its deprecated `downloadImages` alias, including for small crawls.

## [0.63.0] - 2026-08-23

### Added

- Added owner-scoped durable site-export storage and direct REST/MCP readers for complete per-page JSON, acquired HTML, Markdown, and preserved images, alongside a reconstructable ZIP with checksums and provenance manifests.
- Added `site_export_read` and `site_export_image`, bringing the unified MCP surface to 254 tools and giving text-only and multimodal AI clients bounded, resumable access to bulk extraction results.
- Added structured component warnings when optional rendering, screenshot, branding, or media packaging fails after static page extraction succeeds.

### Changed

- Replaced hand-rolled HTML parsing in page, site, and media extraction with one Cheerio/parse5 document parser and removed the 40,000-character Markdown truncation.
- Site exports now persist large HTML and Markdown bodies as compressed, checksummed owner-scoped chunks instead of placing them in job metadata, while progress distinguishes discovered, attempted, successful, failed, and remaining pages.
- Full-page screenshots use a bounded lazy-load sweep followed by Playwright's native full-page capture.

### Fixed

- Preserved reviewed public timeout, page, browser, rate-limit, and export error envelopes across REST, jobs, MCP, and reconciliation paths instead of collapsing them to `service_unavailable`; raw vendor, billing, filesystem, and internal diagnostic details remain private.
- Job and site-export settlement now reports `refund_pending` until a failed-call refund actually succeeds, then records `refunded`, avoiding false billing assurances during reconciliation.

## [0.60.0] - 2026-08-17

### Added

- Transparent Commons has its own semantic search. `commons_index_documents` had carried `embedding_status`, `vector_ref` and provider columns since launch with 231 documents queued and none ever embedded. An embedding worker now drains that queue on every cron tick, using the same Jina model Memory uses, into a platform-scoped `commons_index_vectors` table in the shared Postgres. Nothing about it touches a personal Memory vault: the corpus is public and account-independent.
- `commons_search_entities` gained `mode`: `hybrid` (default) fuses semantic candidates with exact term matching and ranks title-first, `lexical` matches terms only, `semantic` ignores term matching. Semantic candidates enter the result set rather than only re-ranking lexical hits, so a query with no shared vocabulary still finds the right entity — "tools that let an AI assistant browse the web" returns Web scraping, Model Context Protocol and AI agent, where lexical returns nothing.
- `POST /commons/index/embed` and `GET /commons/index/status` for operating the index directly.

## [0.59.0] - 2026-08-17

### Added

- Every published editorial article now has its own URL. `GET /commons/publications/{subdomain}/articles/{articleSlug}/site` server-renders a standalone article page with its own canonical, Open Graph tags, and `Article` JSON-LD that declares the edition as its `CollectionPage`. An edition-scoped form is available at `/editions/{editionSlug}/articles/{articleSlug}/site`.

### Changed

- The reading-room app reads and writes real article paths instead of an `?article=` query parameter, so an article is shareable, crawlable, and independently canonical. Legacy `?article=` links still resolve.

## [0.58.0] - 2026-08-17

### Added

- `commons_update_editorial_article` replaces the Markdown of one article in a published edition without resupplying the others. Every edition already stored each article's source; the edit reads them, swaps the named article, re-renders, and publishes the next revision with the rest byte-identical. Guarded by `baseRevision` and `idempotencyKey`.
- `commons_get_publication` accepts `includeArticles` to return stored article sources and slugs. Owner-only and off by default: reading a publication by name never returns sources, and the payload is large.

### Fixed

- Published editions never returned their article sources. `articles_json` was written on every publish and omitted from the edition mapper, so no API response carried it — which made a single-article edit look impossible and forced a full 100-article resubmission to change one paragraph.

## [0.57.3] - 2026-08-16

### Fixed

- Local Sourcebook exact-place matching no longer rejects a Google listing that appends a service tagline to the business name. `nameOverlap` divided the intersection by the larger token set, so "Meljestic Spa" against "Meljestic Spa: Laser hair removal and Skincare" scored 0.33 against a 0.6 threshold and could never publish — even though the submitted name is fully contained in the Google name and Maps linked the same domain. Identity now also accepts containment of the smaller token set (which must carry two distinctive tokens) or a Maps listing that links the submitted domain. Wrong domain, wrong state, missing address, and single-generic-token still reject.
- `acquisition_error` is now returned as `acquisitionError` on the submission. It was written on every failure and never selected back, so no response explained why a listing failed.
- `local_sourcebook_submission_status` and `local_sourcebook_refresh` now state what a failed status means, that coverage counters are only written on success (so zeroed counters do not mean the crawl never ran), and that a replayed refresh still re-runs acquisition.

## [0.57.2] - 2026-08-16

### Fixed

- Blob storage no longer falls back to the local filesystem on a serverless deployment. `BLOB_READ_WRITE_TOKEN` was empty in production, so `getBlobStore()` returned a local store and every write through it — the scrape-vault fallback document and Instagram media downloads — was saved to an ephemeral path inside the function and handed back as a `file://` URL no request could read. Without a token a serverless deployment now returns a store that refuses to write and says why.

## [0.57.1] - 2026-08-16

### Fixed

- Commons image hosting resolves the dedicated public store token and refuses to store anything unless the resolved store is Vercel Blob. `BLOB_READ_WRITE_TOKEN` is empty in production, so the previous release would have written a `file://` path into a public wiki entity instead of failing; hosting now fails loudly with `image_storage_unconfigured`.

### Added

- `scripts/backfill-commons-images.ts` hosts the still-reachable featured images and article media on Commons storage, rewrites the entity, and records a contribution-ledger entry per rewrite. Dry run by default; `--apply` to write. Run against production: 15 featured images and 20 media sets moved onto Commons hosting; 26 sources were already dead 404s and one SVG is rejected by policy.

## [0.57.0] - 2026-08-16

### Fixed

- Transparent Commons now hosts its own images. Entities stored whatever third-party URL an author supplied and the public wiki hotlinked it, so 26 of 41 live pages had a broken featured image once the source site rotated its uploads. `commons_submit_entity` downloads external images, validates them, stores them permanently, and rewrites the entity to the hosted copy, so a foreign image URL can no longer be persisted.
- Commons search no longer matches a term inside an unrelated word or ranks purely by recency. Searching `CIA` returned eight physical-therapy pages — matching inside `fascia`, `myofascial`, and `special` — while missing the article with CIA in its title. Terms now match on word boundaries and results are scored title > tags/keywords > description > governed claims > body before the recency tiebreak.
- See Also concepts resolve to pages whose slug was shortened by hand, not only to pages whose slug matches their title.

### Added

- `commons_host_image` hosts an image from a public https URL or base64 bytes and returns the permanent Commons URL. JPEG, PNG, GIF, and WebP up to 10 MB; SVG is rejected because the wiki serves images to the public web. Identical bytes are stored once and reused. URL fetches enforce https, reject private, loopback, link-local, and carrier-grade NAT addresses, cap redirects, and verify the real bytes rather than the declared content type.

## [0.56.1] - 2026-08-16

### Fixed

- See Also concepts now link to pages written after the mention. A related link stored with `needsLink: true` is resolved against published entities by normalized title on every read, so `commons_get_entity`, `commons_search_entities`, and the public `/wiki/` projection return a real slug instead of an unresolved concept. 37 dangling mentions across 16 concepts linked immediately, and `commons_list_needs_links` now reports only concepts that genuinely have no page.

## [0.56.0] - 2026-08-16

### Fixed

- Transparent Commons entity edits now publish. A missing or stale `baseRevision` previously made the write land as a `pending_review` proposal that nothing in the system could approve, so the edit was parked permanently after charging the caller. Edits apply on top of the current revision and the divergence is recorded on the public contribution ledger.
- A Commons proposal that is not applied is refunded, so an `always_review` hold no longer costs 10 or 2 Credits for a row that never publishes.
- `commons_submit_entity`, the validation warnings, the entity profile contract, and the server instructions no longer describe the removed block-on-conflict behavior.

### Added

- `commons_get_proposal` reads back one `commons_submit_entity` proposal owned by the calling account, including its review reason and whether it has been applied. The REST route already existed with no tool bound to it.

## [0.55.0] - 2026-08-14

### Added

- Added a generated public product contract for tool counts, subscription entitlements, add-on pricing, and rate-policy versions, with contract checks that keep server, documentation, and SDK projections aligned.
- Added a repeatable, secret-free 30-day SERP/PAA rate-basis report that records workload and provider-cost provenance, exposes evidence limitations, and verifies the current 60-Credit SERP and 400-plus-10-per-question PAA schedule against the 2.5x Scale-plan value floor.

### Changed

- Parallel capacity is now sold in quantity-based $5/month packs that add 2 browsers each on any plan. Existing add-on subscriptions safely map to one pack when their quantity is absent, and operators can dry-run a customer-, subscription-, and price-validated reconciliation before applying corrections.
- Capacity-pack checkout and invoices now state the two-browser benefit, $5 monthly cadence, and cancellation terms; each successful payment triggers an emailed Stripe receipt.
- Connected-account contracts now describe the public credential transport as `managed_oauth` instead of exposing a replaceable implementation vendor.

### Fixed

- REST and MCP failures now preserve actionable, vendor-neutral error codes, types, retry guidance, charge status, and safe account details. CAPTCHA responses explain temporary challenge pressure, while concurrency limits identify the active limit and capacity-upgrade path instead of collapsing to generic service unavailability.
- Corrected MCP pricing descriptions and structured schemas so SERP Intelligence, Credit information, concurrency-pack quantities, and connected-account usage rates match the generated public rate contract.
- Capacity-pack cancellation now verifies both customer ownership and the pack price before ending the add-on, so independent Sonic subscriptions remain untouched.

## [0.54.4] - 2026-08-14

### Fixed

- Reddit Google discovery now retries one fresh managed SERP session when the first page is unexpectedly empty or fails, before entering the slower Reddit-browser fallback. Successful discovery still uses one Google search.

## [0.54.3] - 2026-08-14

### Fixed

- Reddit Google discovery now keeps its first-page managed SERP result instead of risking the entire discovery on a second-page navigation. The SERP-only route uses one attempt and an explicit one-question no-op bound, removing the inherited `maxQuestions: 100` diagnostic while preserving the original query and 30-day filter.

## [0.54.2] - 2026-08-14

### Changed

- Reddit topic discovery now uses managed Google `site:reddit.com` search with week, 30-day, and all-time filters. Discovered links open on normal Reddit through the browser's untouched default stealth configuration, wait through automatic challenges for up to 300 seconds, and use old Reddit only as a fallback; direct fallback discovery likewise tries the normal Reddit search bar first.

## [0.54.1] - 2026-08-13

### Fixed

- Editorial Reading Room artifacts now load inside privacy-preserving sandboxed previews when browser storage is unavailable, while retaining saved reading preferences wherever storage is permitted.

## [0.54.0] - 2026-08-13

### Added

- Added `personal_authority_v2`, a separately versioned personal-site renderer with bounded palettes, accessible hexadecimal brand-color overrides, selectable self-contained typography, a public preview, and a machine-readable example.
- Added `blog_article_v1`, a long-form editorial renderer with sidebar media, expandable disclosure and FAQ sections, a sticky scroll-aware table of contents, sharing and citation tools, author attribution, public previews, and reusable Tailwind v4 source assets.

### Changed

- Expanded scheduled artifact persistence, public view links, examples, and renderer dispatch to the complete five-template catalog while preserving the existing renderer families.

## [0.53.1] - 2026-08-12

### Changed

- Repriced Google SERP lookups to 60 credits per search and original-query PAA harvests to a 400-credit base plus 10 credits per returned question. Same-page SERP feature flags are included, failed work remains refundable, and unused PAA question estimates settle down to actual output.
- A managed Browser API is now the preferred production transport for stateless Google SERP and original-query PAA harvests when configured. Existing persistent `serpIdentity` profiles continue to use their fixed browser identity.
- `search_serp` now defaults to organic results plus Google entity IDs, while `harvest_paa` adds continually expanded original-query questions, answers, and source titles and URLs. Local pack, forums, videos, AI surfaces, and What People Are Saying are opt-in through individual flags or `includeAllSerpFeatures`.
- Removed Google's `num=100` parameter and tuned PAA expansion to inspect only the newly clicked row at a measured 700 ms interaction cadence with bounded recovery. Loaded answers and sources are retained even when Google collapses an accordion.
- Routed durable PAA work through the long-running scrape function and expanded its timeout budget for verified browser-driven click expansion without losing billing settlement or job completion.

### Fixed

- Corrected the AI-visible `search_serp` and `harvest_paa` contracts to disclose their canonical Credit rates and refund behavior, documented every public input field including nested objects and union branches, clarified persisted Memory vault selection, and upgraded release verification from tool-name parity to semantic schema and metadata parity.

## [0.53.0] - 2026-08-11

### Added

- Added account-scoped persistent SERP identities that bind saved browser cookies and storage to one reusable static ISP network address. Creation immediately opens `google.com` and returns a takeover URL so the user can clear consent or CAPTCHA before closing and saving the profile; the identity can then be selected with `serpIdentity` on `search_serp` or `harvest_paa`. Existing stateless search behavior remains the default.

## [0.52.4] - 2026-08-11

### Changed

- `location` now sets the Google UULE parameter and nothing else on `search_serp`, `harvest_paa`, and `capture_serp_snapshot`. The server sends your query to Google exactly as written and no longer appends the location to the search text, so a caller who phrases a query one way is never silently searched a different way. Tool descriptions were rewritten to match: put the place in `query` when it should appear in the search terms.
- Google Maps still carries location in its search text because Maps sends no UULE, but `maps_search` no longer repeats a place the query already names.

### Fixed

- Google location targeting now resolves against the official Google Ads geotargets list (21,693 US places and 219 countries) instead of 62 hand-written cities. Every US state, and cities outside that shortlist, previously produced a well-formed UULE wrapping a name Google does not recognize — a silent mis-targeting for most locations. `New York` also returned New York City for a state-level request.
- Unresolved and ambiguous locations are now reported in `debug` output as `locationResolved`, `locationMatchSource`, and `locationAmbiguousCandidates` rather than failing silently.

## [0.52.3] - 2026-08-11

### Fixed

- Removed a remaining anti-bot infrastructure brand from the browser screenshot contract and added it to the generated public-surface policy so hosted and stdio discovery cannot regress.

## [0.52.2] - 2026-08-11

### Changed

- Published the changelog with the npm artifact, added canonical repository and support links, and pinned `mcpscraper-memory-tools` 1.14.2 so package consumers can inspect the complete release history without changing the 246-tool MCP contract from 0.52.1.

### Fixed

- Restored missing comparison links across the published release history, including the RAG-first 0.52.1 contract.

## [0.52.1] - 2026-08-10

### Changed

- Memory discovery now routes through hybrid Smart RAG before vault or note inventories, with the retrieval-versus-inventory boundary repeated in each relevant tool description so clients that skip server discovery still choose correctly.

### Fixed

- Removed replaceable infrastructure vendor names from MCP server instructions and tool descriptions, and added a generated-contract lint that prevents those names from returning in hosted or stdio discovery surfaces.

## [0.52.0] - 2026-08-10

### Added

- Added opt-in Google Maps listing-photo collection to `maps_place_intel`, including owner/all scope, bounded gallery traversal, evidence-labeled ownership, direct AI image blocks, and owner-scoped ZIP manifests readable through `archive_read`.
- Added opt-in static-plus-rendered website media preservation to `extract_url`, including lazy and responsive discovery, variant collapse, completion evidence, bounded AI image blocks, and owner-scoped ZIP manifests.

### Changed

- Website branding now ranks JSON-LD and rendered site-identity evidence for logos, keeps only same-family logo variants, and reports certifications, accreditations, awards, memberships, partner/customer marks, press mentions, and trust marks separately as evidence-bounded proof images.
- Site extraction now excludes non-page URLs and non-HTML responses from browser fallback, identifies WordPress attachment pages, and requires meaningful main text before treating a document as a text page.

### Fixed

- Prevented HTTP 403/429 and Cloudflare-style challenge interstitials from being returned as page content; browser fallback now escalates once from stealth headless to a bounded stealth headful attempt and reports unresolved challenges explicitly.
- Made rendered brand-color extraction framework-agnostic across utility CSS and CMS output by normalizing modern CSS color functions, rejecting transparent values and challenge pages, ranking visible semantic CTAs and explicit brand variables, and returning provenance for every selected color.

## [0.51.2] - 2026-08-09

### Added

- Added explicit account-wide `memory-list({ allVaults: true })` inventory with aggregate note and folder totals plus complete per-vault metadata groups, while preserving the existing single-vault default.

### Fixed

- Prevented exhaustive Memory requests and release proofs from presenting the default logical-vault count as the complete account total; account-wide vault reads run sequentially to avoid the database contention reproduced by parallel fan-out.

## [0.51.1] - 2026-08-09

### Fixed

- Ensured the hosted in-process `memory-list` path returns the complete derived `folders` inventory promised by the public tool contract, matching the HTTP fallback and npm-installed MCP behavior.

## [0.51.0] - 2026-08-09

### Changed

- Clarified the Memory MCP contract so agents distinguish exhaustive vault inventory, ranked recall, exact note reads, and full exports; made `memory-list` return the complete derived folder inventory; and required read-merge-write edits with `baseRevision` instead of mistaking `memory-put` for a partial text patch.
- Expanded editorial reading rooms and Commons editorial editions from 40 to 100 articles, with structured article/card images, Markdown body images, collection and article Open Graph images, required alt text, visible image provenance fields, and responsive rendering.

### Fixed

- Made `reddit_trending` fall back to a bounded direct Reddit search when Google discovery is empty or unavailable, preserve the requested recency window, and return explicit degraded/retry/refund signals instead of collapsing an empty upstream SERP into a generic `service_unavailable` error.

## [0.50.0] - 2026-08-07

### Added

- Added attention measurement to the X-Ray Pixel: a `page_engagement` beacon that accumulates only visible time, flushes on `visibilitychange` and `pagehide`, re-attributes dwell to the outgoing path on single-page-app navigation, and reports capped engaged milliseconds with maximum scroll depth.
- Added average time on page, bounce rate, exit rate, engagement rate, average scroll depth, views per session, and measured-pageview coverage to the content report, its exports, and the `analytics_get_content` MCP tool.
- Added server-side column sorting and path search to the content report so ordering spans the whole result set rather than the current page.

### Fixed

- Markdown exports no longer discard every row; content, acquisition, and conversion reports now render their rows as a table beneath the summary instead of ending after the site totals.
- The content report's engagement-event count no longer counts the new engagement beacon as a visitor interaction.

## [0.49.0] - 2026-08-05

### Added

- Added governed Transparent Commons relationship claims with TPW-S identifiers, evidence and dispute metadata, deterministic RFC 9264 JSON linksets, HTTP discovery and policy profiles, and the read-only `commons_get_entity_linkset` MCP tool.

## [0.48.0] - 2026-08-05

### Added

- Added Thorbit-owned X-Ray site analytics with separate site pixels, exact-path event capture, detected-domain approval, form-to-contact attribution, customer-journey reporting, campaign links, governed exports, forecasts, and responsive line, bar, donut, heatmap, United States choropleth, and Sankey visualizations.
- Added 24 MCP analytics tools so agents can manage pixels, read and filter reports, inspect identity and conversion journeys, create tracked campaign links, export governed data, and schedule reports through the released MCP surface.
- Added the Thorbit entitlement bridge with a 30-day trial, qualifying-subscription checks, API-key recovery flow, and fail-closed production enforcement without consuming MCP Scraper Credits.
- Added the registered News Publisher website renderer with alternating panorama, mosaic, and tile desks; a complete article-page preview with editor picks and inline related-story modules; a responsive discussion drawer; provenance-validated reader, editorial, and MCP Scraper prompt identities; primary publication routes; a separate press room; an accountable editor; ten required trust pages; and secure scheduled-result view-link support.
- Added `get_artifact_template_example` so agents can inspect each registered preset's safe defaults, authoring guidance, structured example input, machine-readable JSON, and public visual preview pages without depending on the Templates dashboard.

### Changed

- Expanded the unified MCP catalog from 220 to 245 tools and added X-Ray workflow guidance to the server instructions.
- Turned `list_artifact_templates` into case-insensitive template search with renderer-family filtering, presented template creation as Save Template, and explicitly routed reusable-site work away from the one-off Editorial Reading Room renderer.

### Fixed

- Kept the article’s inline related-story module inside the article column and made every promoted-story tile equal-sized at desktop and mobile breakpoints without unpinning the desktop Editor’s Picks rail.
- Routed Personal Authority and Editorial Reading Room preview images and interactive demos through `mcpscraper.dev` so the Templates catalog no longer requests missing assets from the public-domain gateway.

## [0.47.0] - 2026-08-05

### Added

- Added the registered Personal Authority renderer for responsive individual professional sites, with initials-based image placeholders and configurable navigation, social, authority, consultation, learning, services, proof, and closing-call-to-action sections.

### Changed

- Generalized saved artifact-template contracts and MCP tool descriptions so registered renderer families can expose their own validated inputs and configuration without granting callers arbitrary HTML, CSS, JavaScript, identity, storage, or publishing authority.
- Expanded scheduled-result artifact and public view-link contracts to support Personal Authority output while preserving existing Editorial Reading Room records during the SQLite constraint migration.
- Requires `mcpscraper-memory-tools` 1.14.0 so hosted MCP clients expose the same registered template catalog as Memory.

## [0.46.0] - 2026-08-04

### Added

- Added one owner-scoped Transparent Commons editorial publication per subscriber, with a globally unique chosen subdomain, prepare-and-validate contracts, idempotent claiming and publishing, immutable edition revisions, and permanent publication, archive, and edition URLs.

## [0.45.0] - 2026-08-04

### Added

- Let Local Sourcebook callers select a governed Schema.org `LocalBusiness` subtype during preparation, then compile evidence-backed business, service, area, image, rating, FAQ, and breadcrumb JSON-LD for the published profile without accepting arbitrary caller-authored schema.

### Changed

- Charge a predictable 10 Credits to create and 2 Credits to revise either a Local Sourcebook directory listing or Transparent Commons wiki entity, with preparation and validation free, idempotent retries protected, and Sourcebook evidence acquisition included in the fixed price.

## [0.44.4] - 2026-08-04

### Fixed

- Return `home-services.localsourcebook.com` as the canonical public hostname for home-service listings instead of exposing the internal `home` category key in customer-facing URLs.
- Re-project canonical URLs when reading existing published revisions so older listings adopt the corrected hostname without a recrawl.

## [0.44.3] - 2026-08-04

### Fixed

- Return the exact canonical `localsourcebook.com` profile, reviews, state, and nationwide directory URLs from Local Sourcebook preparation, capture, owner-status, and refresh results.
- Add nationwide and category-wide published-listing reads so the directory can expose every state rather than depending on a hard-coded preview market.
- Direct MCP clients to give users the clickable Local Sourcebook profile URL whenever reporting that a listing is live.

## [0.44.2] - 2026-08-04

### Changed

- Automatically publish each successful Local Sourcebook acquisition as the exact immutable revision compiled from MCP Scraper evidence, including bounded or source-limited results with transparent collection receipts.
- Retired owner-authored listing replacement payloads from the public API and MCP contract; subscribers now submit business identity and tags, then request evidence reacquisition when public facts need to change.
- Keep administrator rejection and unpublishing as exception controls while preventing moderated records from being republished through an owner refresh.

## [0.44.1] - 2026-08-04

### Fixed

- Routed the Local Sourcebook owner, public reader, and Transparent Commons paths to the production API function so the released MCP tools and public reads reach their mounted server handlers.

## [0.44.0] - 2026-08-04

### Added

- Added the subscriber-owned Local Sourcebook listing surface: MCP tools and authenticated API routes create, inspect, revise, and refresh submissions, while immutable revisions and an admin-only publication boundary prevent one subscriber from editing another subscriber's record.
- Added category-and-state public listing reads plus explicit acquisition receipts for broad site coverage, genuine images, and source-bounded review capture without claiming completeness beyond what each source exposed.
- Expanded Local Sourcebook acquisition plans to inspect team and staff pages so genuine staff photography can populate profiles when the business publishes it.
- Added a governed Local Sourcebook write sequence modeled on MCP Memory: callers inspect the contract and canonical tags, prepare and validate a proposed listing, then capture an owner-scoped draft with idempotency and revision protection.
- Added the durable paid acquisition worker that crawls up to 100 business pages, validates the exact Google Maps identity, requests up to 500 complete reviews, retains genuine media and staff candidates, compiles services and service areas, and records explicit partial-data and billing receipts before admin review.
- Added Transparent Commons as a governed public knowledge graph with nine MCP tools for entity search, Wikipedia-style reads, adaptive prepare-and-validate contracts, idempotent proposal writes, contribution ledgers, unresolved See Also discovery, and account-scoped saved filters.
- Added platform-owned Commons indexing across article bodies, evidence, media, related entities, tags, keywords, and JSON-LD while keeping personal Memory and reader state outside the public graph.

### Fixed

- Kept the last approved listing revision public while an owner refresh is queued or under review, and aligned the Local Sourcebook reader API response shape with the frontend contract.
- Prevented preferred media-preservation options from conflicting with deprecated aliases injected by MCP schema defaults before a hosted crawl could start.

## [0.43.6] - 2026-08-04

### Fixed

- Connected-service and Search Console JSONL exports now return exact MCP-native readback instructions, allowing hosted and npm-installed agents to consume private artifacts through the authenticated `report_artifact_read` tool when their sandbox cannot reach the optional signed download URL.

### Changed

- Direct site crawls now identify as MCP Scraper instead of using a legacy sibling-product crawler name, while standalone media downloads no longer declare a crawler identity. Browser-backed tools continue to inherit the running browser's native user agent.

## [0.43.5] - 2026-08-04

### Fixed

- Restored Claude Web OAuth initiation by keeping static discovery documents outside the database migration gate, reducing ordinary serverless cold starts to one schema-receipt lookup, and returning bounded retryable authorization errors instead of leaving clients hanging.
- Moved the completed site-extraction counter repair out of request startup and into an explicit, versioned release migration so historical data remains repairable without repeating a global write on every new runtime instance.

## [0.43.4] - 2026-08-03

### Added

- Added the project-scoped blog-post worker so the repository-owned content pipeline can delegate research, framing, writing, and assembly tasks through its bundled Codex skill and runtime tooling.

### Fixed

- Browser-backed tools now inherit the running browser's current user agent instead of injecting pinned Chrome or Safari identities; same-session media downloads reuse that detected identity, while unrelated HTTP downloads no longer impersonate a stale browser.
- Hosted SERP and PAA harvests remain headful while an internal two-key canary can exercise the same harvest path headlessly; the former request-header override no longer lets live callers select the experimental mode.

## [0.43.3] - 2026-08-03

### Fixed

- Synchronized the public Markdown and AI-readable pricing copy with the canonical 14-credit headful `search_serp` runtime rate, while keeping `capture_serp_snapshot` documented as a 14-credit hold that settles to 4 credits when its capture is proven headless.

## [0.43.2] - 2026-08-03

### Changed

- Kept proxy selection and ZIP routing inside the scraper runtime instead of exposing provider controls in the public MCP schemas; the reliable direct-egress retry behavior remains unchanged.
- Updated the embedded Memory tool surface to `mcpscraper-memory-tools` 1.13.3 so valid tiny images receive embeddable sanitized previews.

## [0.43.1] - 2026-08-03

### Fixed

- Rebuilt the Claude Desktop MCPB after final dependency resolution and restored exact package, bundle, checksum, and README release parity. The `0.43.0` npm candidate was not published.

## [0.43.0] - 2026-08-03

### Added

- Adopted the official MCP v2 runtime across HTTP and stdio, including MCP Tasks for resumable work, elicitation-based recovery, cache metadata, array-root output schemas, and typed structured results.
- Added deployment-aware artifact delivery so large scrape outputs can be returned inline, saved to hosted Memory, or emitted as AI-readable local files and archives when running through local stdio.
- Added governed image handoff into hosted Memory, including artifact-backed image sources and explicit image preservation controls for scrape workflows.
- Added measurable catalog modes, deterministic tool ordering, capability-family discovery, and release gates for catalog size, descriptions, schemas, annotations, and server instructions.

### Changed

- Updated the Google scraper transport to use a current browser identity, disable the harmful stealth path, and remove residential and ISP retry branches that reduced successful captures.
- Connected hosted actions now enforce owner-scoped authorization and replay-safe idempotency while local-only filesystem inputs are excluded from hosted schemas.
- Connected scrape pricing is consistently advertised and billed at 2 credits for a page, 2 credits for a SERP, and 5 credits for an AI answer.
- MCP Scraper now depends on `mcpscraper-memory-tools` 1.13.1 for the released governed image Memory surface.

### Security

- Separated hosted Memory destinations from local filesystem delivery and prevented hosted callers from proposing server filesystem paths.
- Added trust-boundary checks for third-party content, connected actions, artifact ownership, and deployment-specific tool contracts.
- Updated Hono and the image-decoding dependency chain to patched releases before exposing the new hosted surface.

### Removed

- Retired obsolete public agent guides, generated social-card assets, and legacy MCP bundle metadata that no longer represented a consumed product surface.

## [0.42.2] - 2026-08-03

### Fixed

- Unified MCP clients can list schedules created before artifact templates existed; the embedded Memory tool now normalizes those actions to the canonical no-artifact selection.

## [0.42.1] - 2026-07-30

### Fixed

- Routed scheduled-result, artifact-template, and public artifact-view requests
  to the production API function instead of the frontend/static fallback.
- Updated the API bridge to call the exact hosted Memory tool names advertised
  by `tools/list`, restoring live result and template reads and mutations.

## [0.42.0] - 2026-07-30

### Added

- Added the MCP Scraper side of a unified Scheduled Results inbox: strict
  owner-scoped result/template API proxies, stable opaque run references,
  structured MCP tools, and idempotent opened/archive mutations.
- Added immutable saved artifact-template contracts with the first registered
  `editorial_reading_room_v1` renderer, durable private scheduled HTML
  artifacts, and signed scheduler rendering that binds account identity to the
  API-key-derived private-artifact owner.
- Added independently revocable, 1–30 day one-artifact view links whose bearer
  tokens are hashed at rest and whose public metadata/content routes are
  no-store, no-referrer, noindex, sandbox-ready, and state neutral.

### Changed

- Scheduled action create/edit contracts now explicitly carry either
  `No artifact` or one exact immutable saved template version; choosing no
  artifact continues normal Memory-note and vault output.

## [0.41.1] - 2026-07-30

### Fixed

- Slack export provider-call idempotency now includes the exact history range and page limit, so a later export of the same channel cannot conflict with an earlier export that used different bounds.

## [0.41.0] - 2026-07-30

### Added

- Added resumable whole-channel Slack exports to `export_connected_service_data`, including server-owned history pagination, bounded threaded-reply retrieval, provider-aware rate-limit delays, private JSONL delivery, and retrieval-ready week, file, and link metadata without automatically joining channels. Completed archives can retain raw embedded evidence alongside exact-query message rows and participant/weekly activity summaries.

### Changed

- Git-triggered Vercel deployments now run for the backend production branch only, preventing unused pull-request branches from creating incomplete API previews while preserving automatic production deployment from `main`.
- The Vault Universe graph is now assembled from entitled notes in one server request instead of requiring the browser to request every note separately.

## [0.40.3] - 2026-07-30

### Security

- Customer-facing tool and API failures no longer expose internal service names, vendor URLs, organization billing state, browser-session identifiers, proxy identifiers, or cleanup telemetry. Unexpected infrastructure failures now return a stable first-party `service_unavailable` response while full diagnostics remain server-side.

### Added

- Asynchronous PAA harvests now run as durable Inngest jobs with progressive answer checkpoints, an idempotent billing hold and settlement, and a private seven-day compressed DOM artifact that can be reparsed without repeating the Google request.
- Added a bounded live canary for the production PAA capture path and focused coverage for queue ownership, runtime budgets, artifact policy, and AI-generated PAA answer citations.

### Changed

- PAA browser work now uses Kernel's co-located Playwright execution with stealth mode's default managed proxy and native browser metadata. Location is expressed only through Google UULE, CAPTCHA solver waiting is capped at 60 seconds, and a fresh session is allowed once only when no useful data was captured.
- PAA invocations stop browser work at 250 seconds inside the 280-second application budget, reserving 30 seconds for persistence, cleanup, and settlement. The legacy cron worker no longer claims Inngest-owned PAA jobs.

### Fixed

- PAA extraction now reads the dedicated AI-generated answer body and aria-labelled citations while ignoring hidden placeholder answers in collapsed rows.
- A private DOM artifact storage outage now returns the already-checkpointed PAA capture as a partial completed result instead of failing the whole durable job.
- Local live-test output is ignored so captured DOM and canary artifacts cannot become repository clutter.

## [0.40.2] - 2026-07-29

### Fixed

- npm publication now builds the package before packing, ensuring clean release worktrees include the executable `dist/` files. This release supersedes the incomplete `0.40.1` registry artifact.

## [0.40.1] - 2026-07-29

### Added

- Added the repository-owned money-keyword landing-page skill, including SERP-fingerprint differentiation, product deconstruction, real-output proof requirements, responsive route-parity validation, and reusable implementation templates.

### Fixed

- Installed MCP clients once again reach connected services through the canonical machine API routes, restoring `list_service_connections`, connection tests, provider reads, schema discovery, and gated actions instead of returning the public integrations page or Vercel 404 responses.
- Production builds no longer invoke the retired legacy dashboard and OG-page generators after those frontend sources moved out of this repository.
- Workshop reminders now use warmer, use-case-led copy and a soft-blue “bring this with you” prompt card while preserving the standalone brain, white reading surface, and blue action button. Existing scheduled reminders can be safely refreshed through a dry-run-first operator command.
- Workshop email headers now use the standalone transparent brain mark without a square tile around it.
- Workshop confirmation, waitlist, reminder, and Field Notes follow-up emails now use the current MCP Scraper brain mark, a blue branded heading above a white reading surface, and a blue action button with white text.
- Confirmed workshop registrants now receive a separate, retry-safe Field Notes reading guide with three-sentence introductions to all 22 workshop notes.
- Workshop confirmation emails and reminders no longer fail when Resend's optional contact or segment sync is unavailable. The attendee remains retryable, receives the transactional event messages, and can be organized in Resend later without consuming another seat.

### Changed

- Specialist landing-page generation now has a version-controlled source on `main` instead of depending on an untracked local skill directory.
- August workshop registrations now schedule event-only Resend reminders 48 hours, 24 hours, and one hour before the live start. The registration ledger records each reminder independently and safely backfills a newly added future reminder without resending confirmations or existing reminders.

## [0.39.0] - 2026-07-28

### Added

- Added `editorial_reading_room_guide`, `create_editorial_reading_room`, and `renew_editorial_reading_room_download` so agents can turn fully authored, source-grounded collections into one self-contained mobile-first editorial reading surface. Hosted clients receive a private renewable HTML artifact; local stdio clients receive a non-overwriting HTML file they can open directly.
- Added public-domain routing, sitemap entries, and a canonical `robots.txt` declaration for the Web Scraping for AI Agents and Web Scraping MCP Server use-case pages.
- Added an owned August workshop registration path with an authoritative capacity and waitlist ledger, attached calendar invitations for the live Zoom room, server-only join-link delivery, dedicated Resend segment/topic membership, and branded event confirmations that do not opt attendees into general marketing.
- Added retry-safe, event-only Resend reminders scheduled for 24 hours and one hour before the August 6 live workshop, with each scheduled email recorded separately in the registration ledger.

## [0.38.2] - 2026-07-28

### Fixed

- Credit-wallet reconciliation now uses compare-and-swap retries instead of overwriting concurrent debits with a stale lot projection; overlapping expiration sweeps record each expired lot exactly once; and Stripe webhook failures remain retryable until their side effects finish. New database guards also reject invalid lot balances and duplicate migration lots without rewriting historical accounts that still require manual review.

## [0.38.1] - 2026-07-28

### Fixed

- Credit wallets now keep legacy migration, Stripe invoice grants, ordinary debits, FIFO lot allocation, ledger history, and cached balances inside atomic database operations. This prevents concurrent requests from minting duplicate migration credit, creating post-migration-era phantom lots, or overdrawing individual lots below zero. Operators also have SHA-confirmed, idempotent repair tooling that records durable before/plan/after receipts and automatically reduces only high-confidence production drift.
- Stripe subscription invoices with a recognized tier but a zero total no longer grant a fresh monthly credit allowance.

## [0.38.0] - 2026-07-28

### Added

- `archive_read` opens bounded public HTTPS ZIP files, including the `bundleUrl` returned by `check_site_export`. Omit `path` to list files, select an exact UTF-8 text path for windowed reading, or set `depositToLibrary:true` to preserve the complete selected source in the tenant Library vault with sanitized archive-and-entry provenance.

### Security

- ZIP processing rejects private-network and unsafe redirect targets, encrypted entries, symbolic links, traversal paths, unsupported binary inline reads, excessive entry or expanded-size totals, oversized readable files, and suspicious compression ratios.

## [0.37.1] - 2026-07-28

### Fixed

- Ships memory-tools 1.10.1 so `merge-memory-tags` no longer fails with a unique-index violation when the canonical tag is not already a registry row.

## [0.37.0] - 2026-07-28

### Added

- `merge-memory-tags` on the memory surface collapses a duplicate tag into the canonical one across the whole account, retagging every note and recording the retired spelling as an alias.
- Operators can adjust a customer's credits from one admin endpoint at `/admin/credits`, which grants, revokes, edits, and reverses adjustments, and a companion lookup that reports the current balance, active credit lots with the next expiry date, every prior adjustment, and recent ledger activity. Each adjustment requires a reason and records the operator who made it. Adjustments are idempotent under a caller-supplied reference, so an interrupted or repeated request cannot pay out or take credits twice. Editing an adjustment changes its effective amount and moves only the difference; reversing one restores the current amount and locks it from further edits. Credit movements remain append-only — no ledger row is rewritten or deleted — and every amendment is kept with its actor and timestamp. Guardrails reject non-whole or non-positive amounts, missing or too-short reasons, revokes that would overdraw a wallet, deactivated accounts, adjustments above 100,000 credits without explicit confirmation, and anything above a 10,000,000 hard ceiling.
- Wallet grants can now be applied through an idempotent primitive that commits the credit lot, the balance update, and the ledger row as one all-or-nothing batch behind a durable receipt, matching the protection debits already had. Startup migration adds the three tables this requires (`billing_credits`, `admin_credit_adjustments`, `admin_credit_adjustment_events`) automatically on first boot after deployment.

## [0.36.0] - 2026-07-27

### Added

- Added durable whole-site extraction and audit jobs with idempotent dispatch, persisted progress, resumable reconciliation, bounded responses, private artifact bundles, and explicit partial-result evidence.
- Added `directory_workflow`, `directory_workflow_status`, and `location_markets` so agents can build and monitor regional business directories against hosted GeoNames-derived market data without holding one request open.
- Added `map_wayback_snapshots` plus Wayback-aware page and site extraction for availability inventories, selected-page timelines, multi-month replay bundles, and capture matrices.
- Added the standalone Tampa recovery directory and mobile-responsive vault app source packages, including evidence-backed listing pages, resource guides, legal routes, responsive navigation, and build/deployment configuration.
- Added connected-service cost telemetry and exact usage settlement for browser, Nango function, proxy, and compute activity, with durable receipts and retry-safe reconciliation.
- Added the repo-owned blog-post pipeline, product/email operating guides, MCP Bible private proof-of-concept contracts, and generated marketing/email assets used by the current product surfaces.

### Changed

- Expanded the unified MCP catalog to 170 tools (81 scraper/browser/workflow/billing/connection tools and 89 memory tools), with regenerated manifests, package metadata, public skill guidance, and tool-craft reports.
- Maps search can now request configured services and areas served, and reports service-enrichment attempts explicitly when provider pages do not expose them.
- SERP/PAA harvests now retry structurally degraded captures when usable primary evidence is missing and report the final degradation instead of silently accepting an empty success.
- CLI agent installation now rolls back partial configuration changes when a later install step fails.

### Fixed

- Zoom transcript exports now stay on the scheduler-backed adapter until the main MCP has an equivalent exporter, preventing valid `zoom_transcripts` requests from failing with `INVALID_ARGUMENT`.
- Zoom transcript synchronization now discovers VTT recording files through recording metadata and downloads them through the authenticated Nango proxy instead of repeatedly calling Zoom's heavily rate-limited transcript-content action.
- Build scripts and repo-agent helpers now load TypeScript through Node's `--import tsx` hook instead of the `tsx` CLI, avoiding Unix IPC socket failures in managed sandboxes.

## [0.34.1] - 2026-07-26

### Fixed

- `query_fanout_workflow` now keeps hosted OAuth/HTTP fan-out results inline even when callers send `export: true`, instead of trying to create inaccessible browser-service files. Installed stdio/MCPB clients still receive optional local JSON/CSV/TSV/HTML exports; a local export failure no longer discards the captured research.
- The MCPB download metadata and checksum now match the current package bundle, and the tool-craft lint checks the generated runtime manifest instead of a deleted source manifest.
- Current public copy now reflects the complete 167-tool catalog (78 scraper/browser/workflow/billing/connection tools plus 89 memory tools).

### Changed

- All video transcription (`youtube_transcribe`, `facebook_ad_transcribe`, `facebook_video_transcribe`, `google_ads_transcribe`, `instagram_transcribe`) now uses one uniform pricing model: a flat base charge (20,000 mc) plus a per-minute-of-video rate (200 mc/min), reconciled after transcription to the real video length. Replaces the previous mix of YouTube's flat 200 mc/min (which sat below vendor cost on audio-fallback videos) and the others' `vendor_cost x 3` model. Wizper's real cost is a few compute-seconds per call regardless of length, so a flat + per-minute charge cleanly covers it at ~4-6x margin.

## [0.34.0] - 2026-07-24

### Changed

- `reddit_trending` now discovers threads through a Google `site:reddit.com <topic>` search with a real recency window (new `window` = `week`|`month`, default month) instead of Reddit's own logged-out search, which had degraded to returning site-wide junk regardless of the query. It then scrapes **all** discovered threads in parallel (bounded concurrency) for genuine upvotes, comments, and questions, and ranks by engagement. `maxThreads` default raised to 20 (scrape-all) with a 40 ceiling and is the adjustable cost cap; scraping respects a soft deadline and reports `partial: true` with `candidatesFound`/`threadsScraped` if it stops early rather than exceeding the request limit. `includeComments: false` is now a genuinely cheap discovery-only mode (relevant thread list, no scraping, no per-thread billing). Billing is unchanged per operation (one discovery debit + `reddit_thread` per scraped thread + `reddit_comment` per captured comment, each refunded on failure). Response drops `searchUrl`/`attempts`/`proxied` in favor of `searchQuery`, `candidatesFound`, and `partial`.

### Added

- `search_serp` accepts an optional `recency` window (`day`|`week`|`month`|`year`) that applies Google's "past day/week/month/year" time filter (`tbs=qdr:*`) to the query, including page 2. Omit it for all-time results — with `recency` unset the request URL is byte-identical to before, so existing SERP/PAA behavior is unchanged. Useful for "what is being said this week" queries and pairs naturally with a `site:` operator (e.g. `site:reddit.com <topic>`).

- The SERP/PAA and Maps search retry ladders now append two strictly-last-resort attempts through the disposable backup proxy pool when it is configured and the whole normal ladder has been exhausted (skipped once the request's soft deadline has passed; each backup proxy is deleted after its attempt, win or lose). With the backup environment variables unset, attempt counts and behavior are unchanged.

- New `reddit_trending` MCP tool registers the `POST /reddit/trending` endpoint on every MCP surface (stdio, hosted, and scheduled-action agents): discover the last 30 days of top Reddit conversations for a topic (optionally one subreddit), ranked by engagement (upvotes + 2x comments), with the real questions people asked per thread plus a flat deduped questions list. The tool defaults `maxThreads` to 5 (REST allows up to 25) because each scraped thread takes ~30s against the ~300s request ceiling; its guidance steers wide scans to `includeComments:false` discovery sweeps first, then targeted `reddit_thread` calls on the winners. Server instructions now split Reddit routing: `reddit_thread` reads ONE known thread URL, `reddit_trending` DISCOVERS what a niche is talking about. Unified tool catalog grows from 166 to 167 tools (copy surfaces updated to 166 = 77 scraper/browser/workflow/billing/connection + 89 memory).

- Optional backup residential proxy pool via environment configuration. When the standard per-attempt proxy rotation is fully exhausted (Reddit and G2 review retries, and SERP/Maps proxy resolution ending in a create-error fallback), one strictly last-resort attempt runs through a disposable backup proxy, which is deleted immediately after use win or lose. With the environment variables unset, behavior is unchanged.
- New `POST /reddit/trending` REST endpoint ("Trending"): given a topic (optionally scoped to one subreddit), it scans the last 30 days of Reddit via an old-Reddit top/month search, ranks the hottest threads by engagement (upvotes + 2x comments), optionally scrapes the top threads' bodies and comments, and surfaces the live questions people are asking — per-thread `topQuestions` plus a flat deduped `questions` list with source thread URLs, and totals for threads, upvotes, and comments. Billing reuses the existing rates only: one `reddit_thread` debit for the discovery page, plus a normal `reddit_thread` + per-comment `reddit_comment` debit for each thread actually scraped, with the same refund-on-failure semantics as `POST /reddit/thread` (partial results bill only what succeeded). REST only for now; the MCP tool registration ships separately.
- `GET /schedule-actions/:id/runs` returns a scheduled action's real per-run history (newest first, up to 100 entries) proxied from the memory service's new `list-scheduled-action-runs` tool, so the dashboard's History column can show actual runs instead of "coming soon".
- `PUT /schedule-actions/:id` edits an existing scheduled action's description, vault, cadence, timeOfDay, and timezone in place via the memory service's new `update-scheduled-action` tool, preserving the action's id, status, connections, and run history; gated behind the paid scheduling tier like create and resume.
- New `GET /billing/summary` endpoint computes never-stale charge totals live from the credit ledger on every request (no cache, no materialized values): spent, refunded, granted, and purchased credits plus per-operation spend breakdown for the current calendar month (default) or a rolling 30-day window, alongside the current balance and the projected monthly connected-account charge.
- Communications inbox backend: operator broadcasts are now stored per user in a new `inbox_messages` table and readable from the dashboard API. `GET /inbox` lists a user's messages (newest first, read/unread state, no bodies), `GET /inbox/:id` returns the full markdown body, `POST /inbox/:id/opened` records the first in-product open (idempotent), and `DELETE /inbox/:id` soft-deletes. A new internal `POST /api/internal/inbox/broadcast` endpoint (same `x-internal-secret` auth as the other internal routes) fans one message out to all active users or a specific email list, reporting unknown emails as skipped.

### Fixed

- `search_serp` now runs every attempt in a headful browser instead of saving headful for the final escalation only. Headless Google search attempts were being CAPTCHA-blocked at very high rates (a controlled probe measured 0/8 headless vs 8/8 headful on identical queries), so the earlier rungs were mostly wasted; PAA harvests already ran headful on every attempt and are unchanged.
- Dashboard session restoration now uses a lightweight non-cached bootstrap response instead of waiting for balance reconciliation and full job-history statistics before the dashboard can render.

## [0.33.7] - 2026-07-24

### Added

- The private Sonic annual partner offer is now actually buyable. `/sonic` advertised a $300/yr offer whose CTA pointed at `/dashboard?offer=sonic-annual`; nothing read that parameter and `/dashboard` is auth-gated, so buyers hit the signup wall, lost the offer, and landed on a plan list that deliberately excludes it. Zero subscriptions had ever been sold. A new `/sonic/claim` page (in the dashboard app, rendered before sign-up so the offer survives account creation) opens embedded Stripe checkout for the $300 credits-only or $414 Memory Pro bundle and returns the buyer to the claim page on success. A new `GET /billing/offer/:slug` endpoint serves price, credits, expiry, and add-on details so the page cannot drift from what Stripe charges. Both Sonic prices moved to a dedicated `MCP Scraper — Sonic Annual` Stripe product so invoices and the billing portal stop naming the Starter plan.

### Fixed

- `mcp-scraper-cli billing subscribe` reported annual plans as monthly, printing "$25/mo - 2,500,000 credits/mo" for a plan that charges $300 once a year, because `monthly_usd` carries a monthly-equivalent for annual tiers. Subscription tiers now publish the amount actually charged and its interval, and the CLI renders both, plus whether credits expire and whether Memory Pro is included.
- Buying a plan that bundles Memory Pro while already paying for the standalone $19/month Memory subscription left both charges running. The bundle overwrote the stored Memory subscription id with its own, so the standalone subscription kept billing and the pointer needed to cancel it was gone. The standalone subscription is now wound down at period end and the stored record is no longer repointed.
- The reverse of that leak: a subscriber whose plan already includes Memory Pro could open the Memory page and buy a second Memory subscription, because `POST /memory/checkout` never checked. It now refuses with `memory_already_included` before creating a Stripe session, and Memory entitlement resolves from the plan tier as well as the stored plan column, so a bundled subscriber stays on Pro with no standalone record.
- The billing page told every customer that credits last 3 months, which is untrue for partner-offer credits that never expire. The copy now follows the customer's actual tier.
- The terminal checkout error hint listed private partner tiers alongside the public plans.

## [0.33.6] - 2026-07-23

### Fixed

- Dashboard integration-billing copy (Getting Started, Integrations, Scheduler, and account settings panels) still described the retired $3/month Stripe subscription charge for connected accounts. Updated every surface to the actual 15,000-credit wallet debit shipped in 0.33.5, and closed a related regression where the dashboard's default connection-fee display had silently fallen back to a hardcoded value after the 0.33.5 rate-policy field rename.

## [0.33.5] - 2026-07-23

### Added

- Threaded support reply capture now links each inbound and outbound email to one People contact, one Issues problem thread, and ordered Communication history. Replies sent from the forwarded support inbox pass through a private thread address so the operator can answer normally without losing the outbound side of the conversation.

### Changed

- Connected-account billing no longer routes through a real Stripe subscription line item. Connecting an account now draws 15,000 credits directly from the user's own balance (blocking the connection with a clear insufficient-credits message if they're short), and renewals debit the same way inside the plan's own renewal webhook. No Stripe API calls remain in this path.

### Fixed

- `maps_place_intel` with `includeServices: true` now reaches the exact Google Business Profile through organic local results, expands the full Services and Areas Served dialogs, ignores hidden duplicate dialogs, and retries blocked panel sessions. This restores complete configured service and service-area lists instead of truncated summaries or false `unavailable` results; `maps_search` service enrichment uses the same full-list extractor.
- Core startup migration now verifies required schema objects before trusting a migration receipt and repairs a missing `credit_lots.never_expires` column, preventing schema drift or partial application from taking authenticated billing routes offline.
- DMARC aggregate reports are acknowledged by the Resend webhook without being forwarded into the support inbox or stored as customer-support messages.

## [0.33.4] - 2026-07-22

### Changed

- Cleaned up two stale `proxyZip` descriptions on the maps/directory tools that referenced a removed proxy option. No behavior change.

## [0.33.3] - 2026-07-22

### Changed

- Tightened tool descriptions to describe intent without internal routing detail. Affects the `proxyMode`, `proxyZip`, `debug`, and `rotateProxies` field descriptions on the search/maps tools. No behavior change.

## [0.33.2] - 2026-07-22

### Changed

- Blocked-search diagnostics now list up to 8 attempts (was 5), so the full `maps_search` transport ladder is visible when a search is CAPTCHA-blocked.

## [0.33.1] - 2026-07-22

### Changed

- `maps_search` now runs an **8-attempt** transport ladder on the default route (was 4), so it has more chances to land on a clean egress IP when Google is CAPTCHA-blocking. Each attempt is a fresh browser session on a fresh IP; the tiers are 2× default stealth ISP, 2× stealth ISP via cross-site redirect, 2× direct egress via redirect, then 2× direct egress (the last headful). Only failed attempts run — a first-attempt success still returns immediately.

## [0.33.0] - 2026-07-22

### Removed

- The residential proxy option (`proxyMode: "location"`) is no longer accepted by the Google Search and Maps tools — `maps_search`, `search_serp`/`harvest_paa`, `directory_workflow`, and the maps-based workflows now offer only `configured` and `none`. Residential is frequently CAPTCHA-blocked on Google and is not a supported route there; a request that still passes `"location"` is rejected (Search/workflows) or treated as clean egress (Maps). Residential remains in use where it works well — G2, Reddit, and YouTube — unchanged.

### Changed

- Google localization now comes only from `gl` (country) plus the place in the search query. The `uule` geo parameter — verified not to reliably localize on its own — is no longer sent on Google Maps and Maps-adjacent search URLs; the location rides in the query text instead, which is the part that actually works. (Google Search/PAA still send `uule` for now.)
- The dashboard's Maps and SERP forms now collect **Country** and **City** as separate fields instead of a single "Location" input. Country sets `gl`; City is added to the search terms. Only country-level targeting is reliable without residential proxies, which is why there is no state/region field.

## [0.32.3] - 2026-07-22

### Added

- `gmail_search_contacts`: aggregates Gmail search results into deduplicated sender contacts, instead of requiring a separate get-message call per raw MIME message.

### Changed

- New service connections now default to having actions enabled, so connected-action sends work without a separate enable step. Existing connections are unchanged.

### Fixed

- `maps_search` now returns a real `cid` and `cidDecimal` for each business. The finder cards carry Google's feature id (`0x…:0x…`, the second half being the CID) in each result's "Directions" link, which the extractor was ignoring — so every result reported `cid: null`. It now reads that link, decodes the CID, and sets `placeUrl` to the canonical `https://www.google.com/maps?cid=<id>` (a stable place link) instead of a name-based search URL. No extra page visits or cost.
- Subscription tier changes (Growth/Scale upgrades) now bill immediately. Previously the prorated charge was deferred to the next invoice cycle, so no invoice fired and no credits were granted for up to a month after an upgrade.
- Tier upgrades now grant the correct plan's credits. The `invoice.paid` webhook could read the old, cheaper tier's price line from a proration invoice and grant that smaller credit amount; it now resolves the tier from the subscription's live base plan.
- Connected-action sends and creates for Gmail, Slack, Google Calendar, and Zoom now work. They previously failed with "An action tool is required" because the route passed no action name to the connection layer.

## [0.32.2] - 2026-07-22

### Changed

- `maps_search` now applies a transport ladder across its retry attempts so it can recover from Google soft-blocks instead of only retrying the same way. The first attempt is unchanged (Kernel's default stealth ISP proxy, direct navigation). Subsequent retries switch to direct egress and arrive at Google through a cross-site redirect (the combination that measurably clears blocks a cold navigation triggers); the final escalation attempt uses direct egress without the redirect and accepts any egress country. This only affects the `proxyMode: 'none'` default path and only its retries — a first-attempt success behaves exactly as before.

## [0.32.1] - 2026-07-22

### Fixed

- `maps_search` returned zero results after reaching Google's local-results finder: the finder's business cards are `div[role="heading"]` elements, but the extractor was selecting `button` elements containing an `h3` — a stale DOM assumption that matched nothing (it was masked until now because the old cold-`udm` entry always blocked before extraction ran). Rewrote the card extraction to anchor on the real heading elements, which also now populates each result's `websiteUrl`.

## [0.32.0] - 2026-07-22

### Changed

- `maps_search` now reaches Google's local-results finder the human way — it loads the organic results page and clicks "More businesses" instead of cold-loading the `udm=1` finder URL, which Google reliably CAPTCHA'd. This fixes the empty-result blocking on local business searches.

### Added

- Optional `includeServices` on `maps_search` to enrich each returned business with its configured services and areas served (adds a page visit per business; no review cards). Results gain `services`, `areasServed`, and `profileDetailsStatus`.
- Internal, opt-in SERP anti-block transport (off by default, no behavior change unless enabled): redirect-arrival routing, a US-egress gate, and a retry-fresh strategy for the organic/PAA path.

## [0.31.0] - 2026-07-21

### Added

- Organizations vault across every memory surface: a durable hub per company or organization, split out of People, with its own contract (required `organization_name`, socials, linked people/deals/projects), Vault App workspace tab, `/vault/api` validation, and prepare-write guidance that never invents an organization from an email domain.
- Required and recommended field governance for all 16 memory vaults: category (`domain`) is now validated and required on Knowledge, Library, and Examples and Inspirations; Communication requires `channel`; Issues require `severity`; Experiments require `hypothesis` and `metric`. Recommended fields warn without blocking.
- Optional, encouraged (never enforced) note sections: project hubs support Requirements, Evidence, Open Questions, and a Keep-a-Changelog-style dated Changelog; Knowledge supports "When Not To Apply"; Issues support "Workaround".
- New CRM-parity fields: Tasks `recurrence` and `snoozed_until`, Deals `probability`, People `birthday` and `socials`.

### Changed

- The Inspiration vault is now "Examples and Inspirations" and the Communications vault is now "Communication"; the former names keep working permanently at every tool input.
- The Omni-Chat naming is now "Inbox" across tool descriptions and the dashboard vault guide, which now lists all 16 vaults.
- Hosted MCP instructions, stdio memory tool schemas, and the generated tool manifest regenerated for the 16-vault taxonomy.

## [0.30.0] - 2026-07-21

### Added

- Added relationship-first CRM guidance for connected Gmail, Calendar, and Slack work: agents inspect existing People records, gather bounded source evidence, resolve identities, preserve provenance, verify writes, and report ambiguous records without sending or changing provider data.

### Changed

- Projects now accept the user-facing `project_type` values `codebase`, `personal`, `work`, and `client` while retaining the existing `project_kind` compatibility value for stored records.
- Vault activity notes now resolve and attach to a real People record before they are written to the relationship-event ledger, preventing unlinked communication records.

## [0.29.1] - 2026-07-20

### Fixed

- Restored Tasks as independent Inbox todos with optional People, Project, Deal, and Communication links; agents and the Vault API no longer require or infer a Project for task capture.
- Published the canonical People contact-card contract: Call, Text, Email, Note, Contact info, Memories, Deals, Projects, and Activity. Verified Gmail and Google Calendar facts now become linked Communication or Calendar records with stable provider references, never inferred contacts or bulk-imported history.

## [0.29.0] - 2026-07-20

### Added

- Added a first-class Deals vault to the Vault API and MCP tool manifest, with governed People, Deal, Project, Task, and Communication relationships.
- Added explicit Overview review state for pending email approvals and communication attention. Approval and denial write state only; they never send email.

### Changed

- Defined Projects as codebases, known client projects, personal projects, or continuing workstreams; new Tasks require a verified project rather than an Inbox/free-floating record.
- Updated public MCP instructions and write-tool descriptions to search first and ask rather than inventing missing people, projects, or deal parties.

## [0.28.3] - 2026-07-20

### Added

- Added a revision-checked task-only deletion route for the Vault Task workspace. It refuses non-Task vault records and never exposes general note deletion through the Vault link.

## [0.28.2] - 2026-07-20

### Added

- Added editable board stages and phases, task completion and project-linked task/activity/milestone records, and email-draft review actions to the Vault API. Accepting a draft records approval only; it does not send email.

### Fixed

- Bounded and retried Vault workspace reads so a large account no longer fans out into hundreds of simultaneous memory reads that can deadlock the backing store.
- Stopped presenting legacy untyped People and Communications notes as people or email drafts, preventing raw memory titles from polluting the typed Vault views.

## [0.28.1] - 2026-07-20

### Changed

- Consolidated the Vault App into the existing mcpscraper-web Next.js application at mcpscraper.dev/vault while keeping its authenticated API bridge in MCP Scraper.
- Removed the duplicate standalone Vault frontend and its separate deployment topology.

### Fixed

- Routed new Vault links and browser access through the root domain, retaining the independently revocable Vault link lifecycle and leaving Omni-Chat unchanged.

## [0.28.0] - 2026-07-20

### Added

- Added the mobile-first Vault App for people, organizations, deals, projects, and task records, preserving the established Rapport overview and Sprout task-composer interactions.
- Added independent `get_vault_app_link` and `revoke_vault_app_link` tools plus dedicated bearer-link storage, so Vault App access can be revoked without affecting Chat links.
- Added a same-origin Vault API that reads and writes the existing record vaults through a tokenized Vault App link.

### Changed

- Registered the Vault App routes and tool cutovers in the aggregate MCP server while retaining the existing Chat UI and Chat link system unchanged.

## [0.27.0] - 2026-07-17

### Changed

- Google Maps discovery now traverses localized Google local-results cards and their profile dialogs, then closes each dialog before continuing through the ranked list. Optional `includeServices` returns configured services and areas served without collecting review cards.
- Maps and directory searches now default to the direct localized Google route (query + UULE + `gl` + `hl`) instead of asserting residential proxy geolocation as the location mechanism.

## [0.26.3] - 2026-07-17

### Fixed

- MCP Scraper stdio and MCPB memory calls now execute through the hosted aggregate MCP tool registration, preventing a lagging standalone memory backend from returning output that fails the locally advertised schema.

## [0.26.2] - 2026-07-16

### Fixed

- Connected-service calls now preserve actionable provider failures instead of reporting every MCP invocation error as a transport outage.
- Search Console connection tests now make a safe `list-sites` probe, so a disabled Google Search Console API is reported before analysis begins.

## [0.26.1] - 2026-07-16

### Fixed

- MCP connected-service tools now use the stable `/schedule-connections` machine route, avoiding the public `/integrations` page rewrite while retaining main-MCP ownership behind the route.

## [0.26.0] - 2026-07-16

### Added

- Added the read-only `test_service_connection` MCP tool so clients can distinguish a temporary provider outage from an OAuth lifecycle problem before recommending reconnect.
- Added canonical main-MCP integration routes, signed scheduler execution routes, connected-account billing controls, and a bounded legacy migration command.

### Changed

- The main MCP now owns connected-account credentials, provider policy, direct Nango transport, operational health, and usage settlement; Mastra remains responsible for schedules, orchestration, bindings, and checkpoints.
- Connection inventory and dashboard status now separate OAuth lifecycle state from current operational health, and the unified MCP inventory contains 163 tools.
- Resend remains explicitly scheduler-owned and is excluded from the Nango migration.

## [0.25.0] - 2026-07-16

### Added

- Added a default Skills vault for reusable skill packages, requiring `scripts/` plus `references/`, `templates/`, or both.
- Added Smart RAG memory retrieval with exact vault, tag, date, type, kind, and metadata filters; three default query variants; 50 fused candidates; bounded one-hop graph expansion from eight seeds with five neighbors each; and Jina reranking to 30 results.

### Changed

- Memory instructions now strongly direct clients to inspect the complete tag inventory and related notes before choosing tags or links.

## [0.24.0] - 2026-07-16

### Added

- Added six API-only Google Search Console batch actions for URL inspection, Search Analytics comparisons, property management, and sitemap management. Every batch is bounded and returns per-item receipts; destructive batches default to dry-run and require explicit confirmation.

## [0.23.0] - 2026-07-16

### Added

- Scheduled Google Search Console sync now maintains one typed tenant-owned `gsc_performance_*` table per connection, with indexed dimensions and metrics, idempotent overlap upserts, and cleanup when the connection is revoked.
- `export_search_console_table_data` filters persisted Search Console rows and creates a private renewable JSONL artifact without refetching Google.

### Changed

- Search Console synchronization now processes a bounded production-scale slice of up to 50,000 rows per occurrence and exposes the resulting `tableName` for `table-describe`, `table-query`, and filtered download workflows.
- MCP instructions, tool schemas, generated manifests, dashboard integration details, scheduler copy, and documentation now distinguish fresh live-API exports from synchronized table data.

### Fixed

- Search Console record identities are now stable hashes instead of null-delimited strings that PostgreSQL JSONB rejects.
- Legacy connection digests can no longer claim Search Console connections or overwrite their structured table schema.

## [0.22.0] - 2026-07-16

### Changed

- Calendar event creation now requires a meaningful description and an explicit attendees array, and forwards both fields to Google Calendar.
- Zoom meeting creation now requires an agenda. Invitees must be added to the corresponding Calendar event because Zoom meeting creation does not send calendar invitations.

### Fixed

- Gmail sends now use the dedicated simple-input MCP tool and construct the MIME message and base64url payload server-side.
- Gmail subjects support Unicode encoding and reject newline-based header injection.

### Migration

- Callers creating Calendar events must provide `description` and `attendees`; use `attendees: []` only when there is intentionally no invitee.
- Callers creating Zoom meetings must provide `agenda`.

## [0.21.5] - 2026-07-16

### Added

- Google Search Console as a first-class Nango connection with six bounded reads and four gated property and sitemap actions.
- A deterministic `search_console_performance` export that can run immediately, on a schedule, or into private Memory with bounded pagination and continuation.

### Changed

- Dashboard, onboarding guidance, public docs, generated tool contracts, and SDK examples now describe the Search Console connection and export workflow consistently.

### Added

- A private Sonic annual subscription entitlement with 2.5 million non-expiring Credits, plus an optional combined annual price that provisions Memory Pro at 50% off, with the partner page routed through the production domain.
- A `/data-deletion` page with standalone Meta/Facebook data-deletion instructions, linked from the Privacy and Terms footers.
- `connection_sync` execution mode for scheduled actions: deterministic, read-only ingestion from bound service connections as an alternative to agent-driven runs.
- Resend inbound email handling and transactional templates.

### Fixed

- Restored the `Billing` page, `RATE_CARD`, and related components, which a prior commit accidentally deleted along with the old Docs page, causing a blank screen on Billing and Credits.
- `/me` no longer runs its balance and usage-stats queries sequentially.
- `/history` no longer ships every row's full raw result inline; the History viewer now fetches a row's full result on demand.
- Dashboard tabs no longer refetch history and balance data on every tab switch.

## [0.21.4] - 2026-07-14

### Fixed

- SERP and SERP Intelligence capture now settle to the actual headless/headful rate: 4 Credits for headless execution or 14 Credits when anti-bot escalation requires headful mode.
- Optional embedded SERP Intelligence page snapshots are now held and settled at 1 Credit per attempted URL, and their browser launches cannot overwrite the SERP mode used for billing.
- SERP Intelligence holds and refunds are now idempotent and recoverable across retries and ambiguous database responses; conflicting reuse of an `Idempotency-Key` is rejected without a second charge.
- SERP Intelligence MCP responses now reflect the real nested API payload, including accurate result, snapshot, attempt, failure, and Credit counts; structured `targets` can be used without a redundant `urls` array.
- Successful charged captures no longer become retryable failures when best-effort request audit logging is unavailable.
- Serverless database initialization now uses a versioned schema-ready fast path and a bounded 20-second gate instead of replaying 84 remote DDL statements on every cold start.
- Browser-agent and cost-telemetry schemas now use concurrency-safe, one-query readiness checks before running legacy DDL.
- Oversized duplicate payloads in `request_events` are replaced with byte-count and SHA-256 integrity metadata, preventing further multi-gigabyte audit-table growth without changing caller responses or canonical job/export artifacts.

## [0.11.0] - 2026-07-11

### Added

- A connected-service catalog for Gmail, GitHub, Slack, Google Calendar, Drive, Analytics, LinkedIn, Facebook, YouTube, Xero, Zoom, X, and other supported providers.
- The `read_service_connection` MCP tool for calling only the approved read tools exposed by a connected account.
- Permission-gated live actions for Gmail, Slack, Google Calendar, and Zoom.
- Service-connection vaults and scheduled digests for durable connected-account history.

### Changed

- The integrations screen now shows the exact read and action tools available for every connected account.
- Write actions remain unavailable until the account owner explicitly enables them.
- Provider-specific connection data is normalized into one agent-facing contract.

[Unreleased]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.66.6...HEAD
[0.66.6]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.66.5...v0.66.6
[0.66.5]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.66.4...v0.66.5
[0.66.4]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.66.3...v0.66.4
[0.66.3]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.66.2...v0.66.3
[0.66.2]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.66.1...v0.66.2
[0.66.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.66.0...v0.66.1
[0.66.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.65.1...v0.66.0
[0.65.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.65.0...v0.65.1
[0.65.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.64.1...v0.65.0
[0.64.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.64.0...v0.64.1
[0.64.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.63.2...v0.64.0
[0.63.2]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.63.1...v0.63.2
[0.63.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.63.0...v0.63.1
[0.63.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.60.0...v0.63.0
[0.55.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.54.4...v0.55.0
[0.54.4]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.54.3...v0.54.4
[0.54.3]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.54.2...v0.54.3
[0.54.2]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.54.1...v0.54.2
[0.54.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.54.0...v0.54.1
[0.54.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.53.1...v0.54.0
[0.53.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.53.0...v0.53.1
[0.53.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.52.4...v0.53.0
[0.52.4]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.52.3...v0.52.4
[0.52.3]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.52.2...v0.52.3
[0.52.2]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.52.1...v0.52.2
[0.52.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.52.0...v0.52.1
[0.52.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.51.2...v0.52.0
[0.51.2]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.51.1...v0.51.2
[0.51.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.51.0...v0.51.1
[0.51.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.50.0...v0.51.0
[0.50.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.49.0...v0.50.0
[0.49.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.48.0...v0.49.0
[0.48.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.47.0...v0.48.0
[0.47.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.46.0...v0.47.0
[0.46.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.45.0...v0.46.0
[0.45.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.44.4...v0.45.0
[0.44.4]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.44.3...v0.44.4
[0.44.3]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.44.2...v0.44.3
[0.44.2]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.44.1...v0.44.2
[0.44.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.44.0...v0.44.1
[0.44.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.43.6...v0.44.0
[0.43.6]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.43.5...v0.43.6
[0.43.5]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.43.4...v0.43.5
[0.43.4]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.43.3...v0.43.4
[0.43.3]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.43.2...v0.43.3
[0.43.2]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.43.1...v0.43.2
[0.43.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.43.0...v0.43.1
[0.43.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.42.2...v0.43.0
[0.42.2]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.42.1...v0.42.2
[0.42.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.42.0...v0.42.1
[0.42.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.41.1...v0.42.0
[0.41.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.41.0...v0.41.1
[0.41.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.40.3...v0.41.0
[0.40.3]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.40.2...v0.40.3
[0.40.2]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.40.1...v0.40.2
[0.40.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.39.0...v0.40.1
[0.39.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.38.2...v0.39.0
[0.38.2]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.38.1...v0.38.2
[0.38.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.38.0...v0.38.1
[0.38.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.36.0...v0.38.0
[0.37.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.37.0...v0.37.1
[0.37.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.36.0...v0.37.0
[0.36.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.35.1...v0.36.0
[0.34.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.34.0...v0.34.1
[0.34.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.33.7...v0.34.0
[0.33.7]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.33.6...v0.33.7
[0.33.6]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.33.5...v0.33.6
[0.33.5]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.33.4...v0.33.5
[0.33.4]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.33.3...v0.33.4
[0.33.3]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.33.2...v0.33.3
[0.33.2]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.33.1...v0.33.2
[0.33.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.33.0...v0.33.1
[0.33.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.32.3...v0.33.0
[0.32.3]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.32.2...v0.32.3
[0.32.2]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.32.1...v0.32.2
[0.32.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.32.0...v0.32.1
[0.32.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.31.0...v0.32.0
[0.31.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.30.0...v0.31.0
[0.30.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.29.1...v0.30.0
[0.29.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.29.0...v0.29.1
[0.29.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.28.3...v0.29.0
[0.28.3]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.28.2...v0.28.3
[0.28.2]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.28.1...v0.28.2
[0.28.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.28.0...v0.28.1
[0.28.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.27.0...v0.28.0
[0.27.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.26.3...v0.27.0
[0.26.3]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.26.2...v0.26.3
[0.26.2]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.26.1...v0.26.2
[0.26.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.26.0...v0.26.1
[0.26.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.25.0...v0.26.0
[0.25.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.24.0...v0.25.0
[0.24.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.23.0...v0.24.0
[0.23.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.22.0...v0.23.0
[0.22.0]: https://github.com/VilovietaSEO/mcp-scraper/releases/tag/v0.22.0
[0.21.5]: https://github.com/VilovietaSEO/mcp-scraper/releases/tag/v0.21.5
[0.21.4]: https://github.com/VilovietaSEO/mcp-scraper/releases/tag/v0.21.4
[0.11.0]: https://github.com/VilovietaSEO/mcp-scraper/releases/tag/v0.11.0
