PriceScout
# PriceScout
PriceScout is an AI-powered chatbot that researches and tracks LLM inference pricing across providers. It scrapes provider pricing pages with Firecrawl, uses Claude to pull out structured pricing data, and stores everything in a local SQLite database so it can answer pricing questions and comparisons without re-scraping every time.
Providers currently covered:
- **cloudrift** — https://www.cloudrift.ai/inference
- **deepinfra** — https://deepinfra.com/pricing
- **fireworks** — https://fireworks.ai/pricing#serverless-pricing
- **groq** — https://groq.com/pricing
## How it works
- `server.py` is an MCP server (built with FastMCP) exposing two tools: `scrape_websites`, which pulls pricing pages via Firecrawl and caches the results under `scraped_content/`, and `extract_scraped_info`, which looks up previously scraped content by provider name, URL, or domain.
- `client.py` is the chat client. It connects to the pricing server plus an MCP SQLite server and an MCP filesystem server, routes each query through Claude with tool access, and — whenever a response contains pricing details — asks Claude to extract structured plan data and writes it into the `pricing_plans` table.
- `server_config.json` wires up the three MCP servers (`llm_inference`, `sqlite`, `filesystem`) that the client connects to.
## Setup
1. Create a virtual environment with `uv` and sync dependencies: `uv sync`
2. Add an Anthropic API key and a Firecrawl API key to `.env` (`ANTHROPIC_API_KEY`, `FIRECRAWL_API_KEY`)
3. Run the client: `uv run client.py`
## Usage
Once running, ask things like:
- "How much does cloudrift ai (https://www.cloudrift.ai/inference) charge for deepseek v3?"
- "How much does deepinfra (https://deepinfra.com/pricing) charge for deepseek v3?"
- "Compare cloudrift ai and deepinfra's costs for deepseek v3"
Type `show data` at any point to see recently stored pricing entries, or `quit` to exit.
TDQS
Scored across 2 tools
The two tools have distinct roles: one collects and stores scraped content, the other retrieves information by identifier. Some potential confusion exists because 'extract' could imply scraping, but the descriptions clarify the separation.
Both tool names use lowercase snake_case with a clear verb-first pattern (extract_scraped_info, scrape_websites), making them consistent and descriptive.
Only two tools is minimal for a service, but they cover a focused scrape-and-query workflow. It is slightly below the typical well-scoped range.
The workflow is functional: scrape_websites returns provider names and extract_scraped_info retrieves details. List/delete/update operations are missing but not essential for the apparent basic price-scout purpose.