pricing-time-machine-mcp
Provides historical pricing analysis for ClickUp by reading archived ClickUp pricing pages from the Wayback Machine, extracting plan names, prices, billing periods, and changes over time.
Provides historical pricing analysis for Coda by reading archived Coda pricing pages from the Wayback Machine, extracting plan names, prices, billing periods, and changes over time.
Provides historical pricing lookups for Figma from archived Figma pricing pages, such as retrieving what Figma charged for Professional in a given year.
Provides pricing history reports for Linear from archived linear.app/pricing pages, extracting plan and price changes over time.
Provides historical pricing analysis for Notion by reading archived Notion pricing pages and extracting plans, prices, billing periods, and changes such as dropped free tiers or renamed plans.
Enables timeline and comparison analysis of Slack's pricing changes from archived Slack pricing pages, including price increases over time.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@pricing-time-machine-mcpHow did Notion's pricing change since 2022?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.

Why
You want to know | Without it | With pricing-time-machine |
When a competitor raised prices | Click through dozens of Wayback snapshots by hand |
|
What their plans looked like in 2021 | Find a snapshot, read the page |
|
How a whole market moved | Days of spreadsheet work |
|
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| CThe 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-mcpClaude 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 |
| Reads N archived copies across the years, groups identical prices into periods, lists what was added/removed |
| Prices on the page closest to a date, with plan guess, billing hints, context and the page text around them |
| One page at two dates: both price tables plus added/removed prices |
| 2–8 pricing pages side by side at the same date |
| 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 |
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) |
Which skills are tech companies hiring for, and which are rising? (HN Who is hiring) | |
What does each LLM cost, and did it get cheaper? (OpenRouter + price history) | |
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 UIMIT © Ali Altunar
Available Tools
5 toolscompare_competitorsBRead-onlyIdempotent
Prices of 2-8 competitors' pricing pages side by side, as archived closest to the same date.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | 'YYYY', 'YYYY-MM', 'YYYY-MM-DD' or 'latest'. The closest archived copy is used. | latest |
| urls | Yes | 2-8 pricing pages, e.g. ['notion.so/pricing', 'coda.io/pricing']. | |
| response_format | No | 'markdown' (default) or 'json'. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_pricingARead-onlyIdempotent
Compare one pricing page at two dates: prices and plans on each, plus what was added/removed.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Pricing page, e.g. 'notion.so/pricing' or 'https://slack.com/pricing'. | |
| date_a | Yes | 'YYYY', 'YYYY-MM', 'YYYY-MM-DD' or 'latest'. The closest archived copy is used. | |
| date_b | No | 'YYYY', 'YYYY-MM', 'YYYY-MM-DD' or 'latest'. The closest archived copy is used. | latest |
| response_format | No | 'markdown' (default) or 'json'. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_atARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Pricing page, e.g. 'notion.so/pricing' or 'https://slack.com/pricing'. | |
| date | No | 'YYYY', 'YYYY-MM', 'YYYY-MM-DD' or 'latest'. The closest archived copy is used. | latest |
| max_text_chars | No | Page text around the prices to include (0 = none). | |
| response_format | No | 'markdown' (default) or 'json'. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_snapshotsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| per | No | One capture per 'month' (default) or 'year'. | month |
| url | Yes | Pricing page, e.g. 'notion.so/pricing' or 'https://slack.com/pricing'. | |
| to_year | No | Optional year bound, e.g. 2019. | |
| from_year | No | Optional year bound, e.g. 2019. | |
| response_format | No | 'markdown' (default) or 'json'. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_timelineARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Pricing page, e.g. 'notion.so/pricing' or 'https://slack.com/pricing'. | |
| points | No | How many copies to read across the range (more = slower). | |
| to_year | No | Optional year bound, e.g. 2019. | |
| from_year | No | Optional year bound, e.g. 2019. | |
| response_format | No | 'markdown' (default) or 'json'. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
5 tool updates
v0.1.0- First observed
compare_competitors - First observed
compare_pricing - First observed
pricing_at - First observed
pricing_snapshots - First observed
pricing_timeline
TDQS
Scored across 5 tools
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.
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.
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.
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
Related MCP Connectors
Extract and structure pricing pages from any SaaS site: plans, tiers, and features.
Live SaaS pricing: current plans, verified price changes, and comparisons for 33,000+ products.
Extract structured pricing tiers and addons from any SaaS pricing page URL. Built for AI agents.
B2B SaaS competitor pricing changes, strategic moves, market landscapes, reports and comparisons.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA 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 npm2MIT
- AlicenseAqualityBmaintenanceEnables 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.86 npmMIT
- FlicenseNot gradedqualityBmaintenanceProvides verified pricing data for SaaS, AI tools, and LLMs across 490+ tools. No API key required, returns sourced records with attribution links.3-
- AlicenseAqualityBmaintenanceMCP 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.434 npmMIT