mcpField
S
salary-market-scanner

salary-market-scanner

github.com/tinyfish-io生产力2.3k40 次安装1 周前更新
代码仓库

关于 salary-market-scanner

salary-market-scanner 是面向薪酬调研的技能,通过实时抓取招聘网站和薪资数据库,汇总特定职位与地点的薪酬信息。它要求先检查 TinyFish CLI 与认证状态,并按地区选择数据来源。

主要功能

  1. 01抓取招聘网站和薪资数据库
  2. 02按职位与地点扫描薪资
  3. 03汇总多个来源的数据
  4. 04处理地点与职位变体
  5. 05统一不同币种的薪资

适用场景

  1. 01比较特定地区的职位薪酬
  2. 02评估远程岗位的薪资范围
  3. 03查询特定公司的薪酬数据
  4. 04判断现有薪资是否具竞争力

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/tinyfish-io/tinyfish-cookbook --skill salary-market-scanner

安装后在 Claude Code 中输入/salary-market-scanner确认已加载。

详细介绍

薪资市场扫描器

抓取实时招聘网站和薪资数据库,为任意职位和地点查找真实的薪酬数据——不是过时的调查结果,而是公司目前实际发布和支付的薪酬。

预检(必需)

在调用 TinyFish 之前,始终运行这两项检查:

1. 是否已安装 CLI?

which tinyfish && tinyfish --version || echo "TINYFISH_CLI_NOT_INSTALLED"

如果未安装,请停止并告知用户:

安装 TinyFish CLI:npm install -g @tiny-fish/cli

2. 是否已通过身份验证?

tinyfish auth status

如果未通过身份验证,请停止并告知用户:

你需要 TinyFish API 密钥。请在此处获取:https://agent.tinyfish.ai/api-keys

然后进行身份验证:

tinyfish auth login

两项检查均通过后才能继续。


第 1 步 — 收集输入

你需要:

  • 职位名称 / 角色 — 例如 Senior Software Engineer、ML Engineer、Product Designer、DevOps Engineer
  • 地点 — 例如 London、Singapore、San Francisco、Remote
  • 工作年限(可选)— 例如 3-5 years、senior、entry level
  • 特定公司(可选)— 用户想了解某家特定公司的薪酬时填写

如果未提供地点,请先询问再继续。不同市场的薪资数据差异可能非常大。


第 2 步 — 并行扫描薪资

同时启动所有 Agent。数据来源因地点而异——请纳入最相关的来源。

# Agent 1 — Levels.fyi (best for tech roles, especially US/global big tech)
tinyfish agent run \
  --url "https://www.levels.fyi/t/{ROLE_SLUG}/?country={COUNTRY}" \
  "You are on Levels.fyi showing compensation data for {ROLE} in {LOCATION}.
   Extract:
   - Median total compensation
   - Base salary range (p25 to p75)
   - Bonus range
   - Stock/equity range (if shown)
   - Sample size (number of data points)
   - Top companies listed and their compensation ranges
   - Any breakdown by years of experience if visible
   STRICT RULES:
   - Do NOT click any company or individual entry
   - Read only the aggregate data visible on the page
   - If no data for this location, return {found: false, reason: 'no data for location'}
   Return JSON: {found: bool, median_total, base_p25, base_p75, bonus_range, equity_range, sample_size, top_companies: [{company, base, total}], yoe_breakdown: []}" \
  --sync > /tmp/sal_levels.json &

# Agent 2 — Glassdoor salaries
tinyfish agent run \
  --url "https://www.google.com/search?q=glassdoor+{ROLE_ENCODED}+salary+{LOCATION_ENCODED}+site:glassdoor.com/Salaries" \
  "You are on Google search results. Find the most relevant Glassdoor salary page for {ROLE} in {LOCATION} and click it.
   On the Glassdoor salary page extract:
   - Median base salary
   - Salary range (low to high)
   - Number of salary reports
   - Additional pay (bonus, profit sharing) range if shown
   - Top companies paying for this role if listed
   STRICT RULES:
   - Click only the first Glassdoor salary result
   - Do NOT click any other links after landing on Glassdoor
   - Read only the aggregate salary data visible on the page
   - If the page asks you to sign in, extract whatever is visible before the gate
   Return JSON: {median_base, salary_low, salary_high, report_count, additional_pay_range, top_companies: [{company, salary}]}" \
  --sync > /tmp/sal_glassdoor.json &

# Agent 3 — LinkedIn Jobs (extract posted salary ranges from active listings)
tinyfish agent run \
  --url "https://www.linkedin.com/jobs/search/?keywords={ROLE_ENCODED}&location={LOCATION_ENCODED}&f_SB2=1&sortBy=DD" \
  "You are on LinkedIn job search results for {ROLE} in {LOCATION}, filtered to show salary information, sorted by date.
   For each job listing card visible on the page:
   - Click into the listing to open the job detail panel on the right
   - Look for the salary range in the detail panel (often shown near the top under the job title)
   - Extract: job title, company name, salary range, employment type
   - Go back to the listing and repeat for the next one
   STRICT RULES:
   - Only extract listings that show an explicit salary — skip those without
   - Maximum 10 listings then stop
   - Do NOT navigate away from the search results page
   Return JSON array: [{title, company, salary_range, employment_type}]" \
  --sync > /tmp/sal_linkedin.json &

# Agent 4 — Indeed salaries
tinyfish agent run \
  --url "https://www.indeed.com/career/{ROLE_INDEED}/salaries?from=top_sb&l={LOCATION_ENCODED}" \
  "You are on Indeed's salary page for {ROLE} in {LOCATION}.
   Extract:
   - Average base salary
   - Salary range (low to high)
   - Number of salary reports
   - Salary by experience level (if shown: entry, mid, senior)
   - Top paying companies for this role (if listed)
   STRICT RULES:
   - Do NOT click any links
   - Read only the aggregate data on this page
   Return JSON: {average_salary, salary_low, salary_high, report_count, by_experience: [{level, salary}], top_companies: [{company, salary}]}" \
  --sync > /tmp/sal_indeed.json &

wait

echo "=== LEVELS ===" && cat /tmp/sal_levels.json
echo "=== GLASSDOOR ===" && cat /tmp/sal_glassdoor.json
echo "=== LINKEDIN ===" && cat /tmp/sal_linkedin.json
echo "=== INDEED ===" && cat /tmp/sal_indeed.json

运行前,请替换:

  • {ROLE} — 易读的职位名称,例如 Senior Software Engineer
  • {ROLE_ENCODED} — URL 编码后的职位名称,例如 Senior%20Software%20Engineer
  • {ROLE_SLUG} — Levels.fyi 使用的 slug,例如 software-engineer
  • {ROLE_INDEED} — Indeed 使用的格式,例如 software-engineer
  • {LOCATION} — 例如 London、Singapore
  • {LOCATION_ENCODED} — URL 编码后的地点,例如 London%2C%20England
  • {COUNTRY} — Levels.fyi 使用的国家代码,例如 GB、SG、US

第 3 步 — 综合市场情况

整合所有来源的数据,并计算汇总区间。

## Salary Market Report — {ROLE} · {LOCATION}

*Live data scraped from Levels.fyi, Glassdoor, LinkedIn, and Indeed*
*{date} · Based on {N} total data points*

---

### 💰 Compensation Summary

| | Low | Median | High |
|---|---|---|---|
| **Base Salary** | {low} | {median} | {high} |
| **Total Comp** (incl. bonus/equity) | {low} | {median} | {high} |

> All figures in {CURRENCY}. "Total comp" includes base + annual bonus + annualized equity where data is available.

---

### 📊 By Experience Level

| Level | Typical Base |
|---|---|
| Entry (0-2 yrs) | {range} |
| Mid (3-5 yrs) | {range} |
| Senior (6+ yrs) | {range} |
| Staff / Principal | {range} |

*(Skip levels where no data was found)*

---

### 🏢 What Companies Are Posting

From active LinkedIn job listings with disclosed salaries:

| Company | Role | Posted Range |
|---|---|---|
| {company} | {title} | {range} |

---

### 🏆 Top Paying Companies

*(From Levels.fyi and Glassdoor)*
| Company | Median Base | Median Total |
|---|---|---|
| {company} | {base} | {total} |

---

### 📈 Market Signals

{2-3 sentences on what the data says about this market — is it competitive, is there a wide spread, are companies being transparent about pay?}

---

### 🔍 Data Sources
- Levels.fyi: {sample_size} data points / not found
- Glassdoor: {report_count} salary reports / not found  
- LinkedIn: {N} active listings with disclosed salaries
- Indeed: {report_count} salary reports / not found

特殊情况

  • Levels.fyi 没有该地点的数据 — 主要参考 Glassdoor 和 Indeed;注明 Levels.fyi 的数据偏向美国大型科技公司
  • 职位名称不常见 — 尝试常见的变体(例如,“ML Engineer” → “Machine Learning Engineer”、“AI Engineer”)
  • 地点是小城市 — 扩大范围至全国或最近的大城市,并注明这一调整
  • 远程职位 — 同时抓取用户所在国家和美国市场的数据,并同时呈现两者(远程职位通常采用美国薪酬范围)
  • 非科技类职位 — 跳过 Levels.fyi(仅限科技行业),主要参考 Glassdoor 和 Indeed
  • 薪资以不同货币显示 — 统一换算为当地货币,并注明所用汇率
  • 用户询问自己的薪资是否有竞争力 — 呈现数据后,询问用户目前的收入并给出直接评价

评论

支持 Markdown