Install
$ agentstack add skill-varnan-tech-opendirectory-pricing-finder ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Pricing Finder
Tell it your product URL or description. It finds 5 competitors, fetches their actual pricing pages, and returns a complete pricing intelligence report: dominant model in your space, benchmark price table, feature gate analysis, positioning map, and a concrete pricing recommendation for your product.
Zero required API keys. Runs entirely on free pip dependencies. Optional API keys improve quality.
Zero-hallucination policy: Every price point, tier name, and feature gate in the output must trace to fetched pricing page content or a DuckDuckGo search snippet. This applies to:
- Competitor prices: extracted verbatim from fetched page content only
- "Contact Sales": recorded as-is, never estimated or replaced with a number
- Tier names: copied exactly from the page, not paraphrased
- Feature lists: extracted from page content, not inferred from product knowledge
- Positioning observations: derived from the benchmark table data only
Common Mistakes
| The agent will want to... | Why that's wrong | |---|---| | Fill in "Contact Sales" with an estimated price | Never estimate enterprise pricing. Record it as "Contact Sales" exactly. | | Use training knowledge for competitor prices | Every price must trace to fetched page content or a search snippet. | | Skip the competitor confirmation step | Always show discovered competitors and wait for confirmation. Wrong competitors = wrong benchmarks. | | Recommend a price without referencing benchmark data | Every price recommendation must cite a specific number from the benchmark table. | | Mark a page as high quality when content /dev/null \ || echo "ERROR: Missing dependencies. Run: pip install ddgs requests beautifulsoup4 html2text"
**If dependencies are missing:** Stop immediately. Tell the user: "Missing Python dependencies. Run this to install them: `pip install ddgs requests beautifulsoup4 html2text` -- all free, no accounts needed. Then try again."
**If only API keys are missing:** Continue. DuckDuckGo and requests+BS4 are the free defaults.
Derive product slug:
```bash
PRODUCT_SLUG=$(python3 -c "
from urllib.parse import urlparse
import sys, re
url = 'URL_HERE'
if url.startswith('http'):
host = urlparse(url).netloc.replace('www.', '')
print(host.split('.')[0])
else:
print(re.sub(r'[^a-z0-9]', '-', url[:30].lower()).strip('-'))
")
echo "Product slug: $PRODUCT_SLUG"
Step 2: Parse Input
Collect from the conversation:
product_url: the URL to fetch (required, unless user pastes a description directly)geography: optional -- US / Europe / India / global. Default: US
If the user provides only a pasted description (no URL): Skip Steps 3 and 4. Go directly to Step 4 (product analysis) using the pasted text as product_content. Set page_source to user_description and note in data_quality_flags.
If neither URL nor description: Ask: "What is the URL of your product or startup? Or paste a short description: what it does, who it's for, and what makes it different."
Step 3: Fetch Product Page
Primary: Firecrawl (if FIRECRAWLAPIKEY is set)
curl -s -X POST https://api.firecrawl.dev/v1/scrape \
-H "Authorization: Bearer $FIRECRAWL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "URL_HERE", "formats": ["markdown"], "onlyMainContent": true}' \
| python3 -c "
import sys, json
d = json.load(sys.stdin)
content = d.get('data', {}).get('markdown', '') or d.get('markdown', '')
print(f'Fetched via Firecrawl: {len(content)} characters')
open('/tmp/pf-product-raw.md', 'w').write(content)
"
Fallback: requests + BS4 (free, always available)
python3 ', a['industry_taxonomy']['l2'], '>', a['industry_taxonomy']['l3'])
print('Differentiators:')
for d in a['differentiators']:
print(f' - {d}')
"
Step 4b: Phase 1 -- Competitor Discovery
ls scripts/research.py 2>/dev/null && echo "script found" || echo "ERROR: scripts/research.py not found -- cannot continue"
python3 scripts/research.py \
--phase discover \
--product-analysis /tmp/pf-product-analysis.json \
--output /tmp/pf-competitors-raw.json
Print results for AI review:
python3 -c "
import json
data = json.load(open('/tmp/pf-competitors-raw.json'))
print(f'Searches run: {len(data[\"competitor_searches\"])}')
for s in data['competitor_searches']:
print(f'\nQuery: {s[\"query\"]}')
for r in s.get('results', [])[:6]:
print(f' - {r[\"title\"]} | {r[\"url\"]}')
print(f' {r.get(\"snippet\",\"\")[:150]}')
"
AI instructions: Read the search results above. Pick exactly 5 competitor companies that:
- Are named in the search result titles or snippets
- Are in the same L3 niche as the product being analyzed
- Are actual software products (not agencies, list articles, or review sites)
- Are distinct from each other
For each competitor write: name, url, pricing_url (their pricing page -- infer as [url]/pricing if not found in snippets), description (one sentence from snippet), source_url.
Step 5: Competitor Confirmation
python3 0:
failures.append(f'INFO: {nf} field(s) marked "not found in page data"')
if 'data_quality_flags' not in result:
result['data_quality_flags'] = []
result['data_quality_flags'].extend(failures)
json.dump(result, open('/tmp/pf-final.json', 'w'), indent=2)
print(f'QA complete. {len(failures)} issues.')
for f in failures:
print(f' - {f}')
if not failures:
print('All QA checks passed.')
PYEOF
Present the output:
## Pricing Intel: [product_name]
Date: [today] | Competitors: [list] | Geography: [geography]
---
### Your Product
[one_line_description]
Differentiators: [list]
---
### 1. Pricing Model Analysis
Dominant model: [dominant_model] ([N]/5 competitors)
[model_explanation -- 2-3 sentences on why this model dominates the space]
Free tier: [N]/5 competitors | Free trial: [N]/5 | Annual discount: typical [X]%
---
### 2. Price Point Benchmark Table
| Competitor | Model | Entry | Mid | Top | Free tier | Free trial | Data quality |
|---|---|---|---|---|---|---|---|
[one row per competitor from benchmark_table]
Market ranges:
- Entry tier: $[min]-$[max]/mo (median $[median])
- Mid tier: $[min]-$[max]/mo (median $[median])
- Enterprise: [enterprise_floor]
---
### 3. Feature Gate Analysis
Always free: [always_free list]
Always behind paid: [always_paid list]
Most variable across competitors: [most_variable list]
---
### 4. Competitive Positioning Map
Cheap + simple: [competitor] at $[X]/mo
Middle market: [competitors] at $[X]-$[Y]/mo
Enterprise: [competitor] (Contact Sales)
Underserved gap: [underserved_gap -- specific observation]
---
### 5. Recommended Pricing for [product_name]
Model: [model] -- [model_justification]
Entry: [entry_price] -- [entry_justification]
Mid: [mid_price] -- [mid_justification]
Top: [top_price] -- [top_justification]
Free tier: [Yes/No] -- [free_tier_justification]
Annual discount: [annual_discount] -- [annual_justification]
Gate behind paid: [gate_behind_paid] -- [gate_justification]
---
Data notes: [data_quality_flags or "None"]
Saved to: docs/pricing-intel/[PRODUCT_SLUG]-[DATE].md
Save to file and clean up:
DATE=$(date +%Y-%m-%d)
OUTPUT_FILE="docs/pricing-intel/${PRODUCT_SLUG}-${DATE}.md"
mkdir -p docs/pricing-intel
echo "Saved to: $OUTPUT_FILE"
rm -f /tmp/pf-product-raw.md /tmp/pf-product-analysis.json \
/tmp/pf-competitors-raw.json /tmp/pf-competitors-confirmed.json \
/tmp/pf-pricing-raw.json /tmp/pf-pricing-extracted.json \
/tmp/pf-patterns.json /tmp/pf-final.json
echo "Temp files cleaned up."
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: Varnan-Tech
- Source: Varnan-Tech/opendirectory
- License: MIT
- Homepage: https://www.opendirectory.dev
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.