Skip to main content
Glama
alialtunar

pricing-time-machine-mcp

by alialtunar

pricing-time-machine-mcp

See how any SaaS pricing page changed over the years. An MCP server that reads archived copies of pricing pages from the Wayback Machine and pulls out the plans and prices, so Claude (or any MCP client) can tell you when a competitor raised prices, renamed plans or dropped a free tier.

No API keys. No scraping of live sites. One line to install.

You:    How did Notion's pricing change since 2022?
Claude: [compare_pricing → notion.so/pricing, 2022-03 vs latest]
        • Personal Pro ($4/mo billed yearly) is gone; the cheapest paid plan is now
          Plus at $10 per member/month.
        • Team ($8/user/mo) became Business at $20 per member/month: 2.5×.
        • Free is still $0.

Summarized from real tool output: archived copies of 31 Mar 2022 and 7 Sep 2026.

Notion pricing in 2022 vs 2026, compared by pricing-time-machine

Why

You want to know

Without it

With pricing-time-machine

When a competitor raised prices

Click through dozens of Wayback snapshots by hand

pricing_timeline lists price periods and every change

What their plans looked like in 2021

Find a snapshot, read the page

pricing_at returns prices with plan names and billing hints

How a whole market moved

Days of spreadsheet work

compare_competitors puts 2-8 pricing pages side by side at any date

Related MCP server: CostBench MCP Server

How it works

flowchart LR
    C[Claude / MCP client] -->|tool call| S[pricing-time-machine-mcp]
    S --> I[Wayback CDX index: which months were archived]
    S --> W[Archived page closest to a date]
    W --> X[Extract prices: amount, currency, /mo /yr, per user, plan guess, context]
    X -->|compact table + page text around prices| C

The server does the deterministic part (finding snapshots, extracting prices, grouping periods). The model does the interpretation: which price belongs to which plan and what a change means. Archived pages never change, so they are cached on disk (~/.cache/pricing-time-machine).

Install

Requires uv.

Claude Code

claude mcp add pricing-time-machine -- uvx pricing-time-machine-mcp

Claude Desktop / Cursor (claude_desktop_config.json / .cursor/mcp.json)

{
  "mcpServers": {
    "pricing-time-machine": {
      "command": "uvx",
      "args": ["pricing-time-machine-mcp"]
    }
  }
}

Tools

Tool

What it does

pricing_timeline

Reads N archived copies across the years, groups identical prices into periods, lists what was added/removed

pricing_at

Prices on the page closest to a date, with plan guess, billing hints, context and the page text around them

compare_pricing

One page at two dates: both price tables plus added/removed prices

compare_competitors

2–8 pricing pages side by side at the same date

pricing_snapshots

Which months/years have an archived copy

Prompts: pricing_history_report (one company, the full story with dates), competitor_pricing (a market then vs now).

Dates can be 2021, 2021-06, 2021-06-15 or latest; the closest archived copy is used and its date is always shown.

Try these

  • "How did Slack's pricing change since 2016? Show every price increase in %."

  • "Compare the pricing of Notion, Coda and ClickUp today and in 2021."

  • "What did Figma charge for Professional in 2019?"

  • "Run pricing_history_report for linear.app/pricing."

Limits (set by the source)

  • Only pages the Wayback Machine archived. Most popular pricing pages have monthly copies going back years.

  • Pages that draw prices with JavaScript are empty in the archive; the server says so and you can try a nearby date.

  • Plan names are guesses from nearby headings; the context column and page text let the model check them.

  • archive.org is slow (10–30 s per page) and sometimes briefly offline; the server retries with backoff and caches everything it reads.

Part of the keyless MCP series

Open-source MCP servers that answer one market question each, with public data and no API keys.

Server

Question it answers

review-miner-mcp

What do users hate about competitor apps and games? (App Store + Steam reviews)

pricing-time-machine-mcp (this one)

How did a SaaS pricing page change over the years? (Wayback Machine)

hn-hiring-trends-mcp

Which skills are tech companies hiring for, and which are rising? (HN Who is hiring)

model-price-radar-mcp

What does each LLM cost, and did it get cheaper? (OpenRouter + price history)

launch-detector-mcp

What is a company about to launch? (certificate transparency logs)

Development

uv sync --extra dev
uv run pytest                          # offline tests with a mocked Wayback Machine
uv run python scripts/smoke_live.py    # live check against archive.org (1-3 min)
uv run --with rich python scripts/demo.py notion.so/pricing 2022-03   # terminal demo (vhs docs/demo.tape records the GIF)
npx @modelcontextprotocol/inspector uv run pricing-time-machine-mcp   # click-through UI

MIT © Ali Altunar

Available Tools

5 tools
compare_competitorsB
Read-onlyIdempotent

Prices of 2-8 competitors' pricing pages side by side, as archived closest to the same date.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo'YYYY', 'YYYY-MM', 'YYYY-MM-DD' or 'latest'. The closest archived copy is used.latest
urlsYes2-8 pricing pages, e.g. ['notion.so/pricing', 'coda.io/pricing'].
response_formatNo'markdown' (default) or 'json'.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint, covering safety and idempotency. The description adds that archives are used 'closest to the same date', which is useful context about data sourcing, but doesn't elaborate on rate limits, response structure, or error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single concise sentence that front-loads the core action and includes key constraints (2-8 competitors, same date). No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given annotations and a full schema with output schema, the description is largely complete. It could mention alternatives or usage context, but the essential information for calling the tool correctly is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are fully documented in the schema. The description adds nothing beyond what's in the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action (compares prices side by side) and resource (competitors' pricing pages). However, it doesn't distinguish itself from siblings like compare_pricing – the name 'compare_competitors' and description imply a similar function but no explicit differentiation is provided.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No indication of when to use this tool versus alternatives like compare_pricing or pricing_snapshots. The description merely states what it does, leaving selection criteria unclear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_pricingA
Read-onlyIdempotent

Compare one pricing page at two dates: prices and plans on each, plus what was added/removed.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesPricing page, e.g. 'notion.so/pricing' or 'https://slack.com/pricing'.
date_aYes'YYYY', 'YYYY-MM', 'YYYY-MM-DD' or 'latest'. The closest archived copy is used.
date_bNo'YYYY', 'YYYY-MM', 'YYYY-MM-DD' or 'latest'. The closest archived copy is used.latest
response_formatNo'markdown' (default) or 'json'.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered without description help. The description adds that the result is a structured before/after diff (prices, plans, additions/removals), which is useful, but does not discuss the archived-snapshot fallback beyond what the schema already states.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence, front-loaded with the core action and followed by the concrete return content. Zero filler; every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and 100% param coverage, the definition supplies everything needed to invoke the tool correctly and even previews the comparison result. The only shortfall is the absence of guidance on how it relates to sibling comparison/list tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so date formats, the 'latest' keyword, the default date_b and the url example are all documented in the schema. The description adds no parameter-level syntax or constraints beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Compare) and resource (one pricing page at two dates) and enumerates the outputs: prices and plans on each date plus additions/removals. An agent can distinguish this from pricing_at or pricing_timeline, which target a single point or series rather than a two-date diff.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The two-date framing implies when to reach for it, but there is no explicit when-not guidance and no sibling is named as an alternative. An agent must infer the selection criteria from context rather than reading it in the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pricing_atA
Read-onlyIdempotent

Prices on a pricing page as archived closest to a date: each price with its plan guess, billing hints and context, plus the page text around the prices so you can read the plans.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesPricing page, e.g. 'notion.so/pricing' or 'https://slack.com/pricing'.
dateNo'YYYY', 'YYYY-MM', 'YYYY-MM-DD' or 'latest'. The closest archived copy is used.latest
max_text_charsNoPage text around the prices to include (0 = none).
response_formatNo'markdown' (default) or 'json'.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds useful behavioral context beyond annotations: it discloses that the tool returns historical archival data closest to a date, and that results include plan guesses, billing hints, context, and surrounding page text.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that immediately states the core operation before elaborating on returned content. It is efficient with no filler, though the dense colon-separated clauses could be slightly clearer if split.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has full schema coverage, an output schema, and rich annotations, so the description need not cover return values or safety in depth. It completes the picture with archival semantics and expected output content, missing only secondary details such as rate limits or authentication requirements.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents url, date, max_text_chars, and response_format thoroughly. The description adds only high-level meaning ('as archived closest to a date' and 'page text around the prices') without detailed syntax or constraints beyond what the schema provides, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: extracting prices from a pricing page as archived closest to a given date, including plan guesses and surrounding page text. This is more specific than a generic retrieval tool, though it does not explicitly name a sibling like pricing_timeline or compare_pricing as an alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus pricing_snapshots, pricing_timeline, compare_pricing, or compare_competitors. The phrase 'as archived closest to a date' implies a point-in-time use case, but the description never states when this is preferable or when it should be avoided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pricing_snapshotsA
Read-onlyIdempotent

List the dates the Wayback Machine archived a page (one per month or year). Use it to see how far back history goes and to pick dates for pricing_at.

ParametersJSON Schema
NameRequiredDescriptionDefault
perNoOne capture per 'month' (default) or 'year'.month
urlYesPricing page, e.g. 'notion.so/pricing' or 'https://slack.com/pricing'.
to_yearNoOptional year bound, e.g. 2019.
from_yearNoOptional year bound, e.g. 2019.
response_formatNo'markdown' (default) or 'json'.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered. The description adds useful behavioral context about archive granularity (one capture per month/year), but says nothing about ordering, pagination, or result volume for a potentially long history.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, purpose first, routing second. Every clause earns its place with no redundancy against the title or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value shape needn't be described, and the safety profile is covered by annotations. The description covers purpose and routing well, with only minor gaps around result ordering or size.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents url, per, from_year, to_year, and response_format with examples. The description adds only the month/year granularity notion, which the `per` parameter description already conveys, so no meaningful lift beyond baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: listing Wayback Machine archive dates for a page, with granularity (one per month or year) called out. It clearly distinguishes itself from pricing_at by framing itself as the date-selection step. An agent can tell what it returns without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names a use case ('see how far back history goes') and routes to a sibling ('pick dates for pricing_at'). It lacks any when-not-to-use or mention of the other siblings like pricing_timeline, so it stops just short of the top score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pricing_timelineA
Read-onlyIdempotent

How a pricing page's prices changed over the years. Reads points archived copies spread across the range, groups identical price sets into periods and lists what was added/removed.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesPricing page, e.g. 'notion.so/pricing' or 'https://slack.com/pricing'.
pointsNoHow many copies to read across the range (more = slower).
to_yearNoOptional year bound, e.g. 2019.
from_yearNoOptional year bound, e.g. 2019.
response_formatNo'markdown' (default) or 'json'.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and open-world, so safety is covered. The description adds real behavioral context the annotations lack: it reads `points` archived copies across the range, groups identical price sets into periods, and reports additions/removals – telling the agent what the call actually does and roughly what it returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the purpose front-loaded and the mechanism second; no filler, no repetition of the name or schema fields beyond what is needed for orientation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't detail return values, and it still sketches the output shape (periods, added/removed). For a 5-parameter read tool the coverage is nearly complete, with the only gap being any hint of cost/latency tradeoffs beyond the points note.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter (url, points, from_year, to_year, response_format) is already documented with examples and constraints. The description restates the `points` sampling behavior ('more = slower') which the schema already conveys, adding no new semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (a pricing page's prices) and the temporal scope (changed over the years), so the agent can distinguish it from a point-in-time tool. However it never names or contrasts the siblings pricing_snapshots, pricing_at, or compare_pricing, leaving the timeline/at-a-moment distinction to be inferred.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use or when-not-to-use guidance, and no sibling alternative is mentioned. The second sentence explains the mechanism (reads archived copies, groups into periods) rather than telling the agent when this tool is the right choice over pricing_at or pricing_snapshots.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv0.1.0
    • First observedcompare_competitors
    • First observedcompare_pricing
    • First observedpricing_at
    • First observedpricing_snapshots
    • First observedpricing_timeline

TDQS

A3.9/5.0

Scored across 5 tools

Disambiguation4/5

Each tool has a distinct query shape: listing archive dates, prices at one date, history over a range, two-date comparison, and multi-competitor comparison. There is mild overlap since pricing_at, pricing_timeline, and compare_pricing all return pricing data, but the descriptions make the boundaries (single vs. range vs. two-date vs. multi-page) clear enough to pick correctly.

Naming Consistency4/5

Names split into a coherent pricing_* family (snapshots, at, timeline) for single-page temporal queries and a compare_* family for comparisons, which is readable and predictable. It is not a strict single verb_noun convention (pricing_at is noun_preposition), so it's slightly short of perfect.

Tool Count5/5

Five tools is well-scoped for a niche Wayback pricing-history server, with each tool earning its place by covering a distinct query pattern. No redundant or filler tools.

Completeness5/5

The surface covers the full read-only lifecycle: discovering available dates, reading prices at a point, tracking a single page's history, comparing two dates of the same page, and comparing competitors at a common date. There are no obvious dead ends for the stated purpose.

Maintenance

ActivityNo data
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    A dated log of SaaS price changes across 494 tools: old price, new price and verification date for every move, plus category-level pulse and the biggest recorded increases.
    36 npm
    2
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables access to verified software-pricing intelligence for over 3,290 products, including true costs, hidden fees, negotiation data, price history, and TCO calculations, all sourced and dated.
    8
    6 npm
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    MCP server for PriceTrack that enables AI assistants to search live SaaS pricing, view verified price changes, and compare products side-by-side across 33,000+ vendors.
    4
    34 npm
    MIT