mcpField
F
freelance-gig-finder

freelance-gig-finder

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

关于 freelance-gig-finder

按技能在多个招聘平台搜索近期自由职业和合同岗位的 Skill,指导并行搜索、筛选和去重;使用前要求安装并登录 TinyFish CLI。

主要功能

  1. 01搜索五个招聘平台
  2. 02并行运行平台搜索
  3. 03按发布时间筛选
  4. 04去重跨平台岗位
  5. 05要求安装并登录 TinyFish CLI

适用场景

  1. 01查找符合技能的近期项目
  2. 02跨平台比较合同岗位
  3. 03按预算或地区缩小范围

安装

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

$npx skills add https://github.com/tinyfish-io/tinyfish-cookbook --skill freelance-gig-finder

安装后在 Claude Code 中输入/freelance-gig-finder确认已加载。

详细介绍

自由职业机会搜索器

同时搜索 Upwork、Contra、We Work Remotely、Freelancer 和 Toptal,寻找符合你技能的新鲜自由职业和合同机会——筛选近期发布的职位,避免看到过时信息。

运行前检查(必需)

调用 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 步 — 收集输入

你需要:

  • 技能或职位 — 例如:React developer、Python、UI/UX designer、copywriter、DevOps、mobile developer
  • 预算偏好(可选)— 例如:hourly、fixed price、$50+/hr
  • 发布时间范围(可选)— 默认搜索过去 7 天内发布的职位

如果未提供技能,请先询问。


第 2 步 — 并行搜索

同时启动所有 Agent。

# Agent 1 — Upwork
tinyfish agent run \
  --url "https://www.upwork.com/nx/search/jobs/?sort=recency&q={SKILL_ENCODED}" \
  "You are on Upwork job search results for '{SKILL}', sorted by most recent.
   Extract the first 8 visible job listings.
   For each listing extract:
   - title
   - client description snippet (what they need)
   - budget (hourly rate range or fixed price if shown)
   - posted time (e.g. '2 hours ago', 'yesterday')
   - required skills listed
   - job type (hourly/fixed)
   - direct URL to the listing
   STRICT RULES:
   - Do NOT click any listing
   - Read only what is visible in the search result cards
   - Only include listings posted within the last 7 days
   - Maximum 8 listings then stop
   Return JSON array: [{title, description, budget, posted, skills: [], job_type, url}]" \
  --sync > /tmp/fg_upwork.json &

# Agent 2 — Contra
tinyfish agent run \
  --url "https://contra.com/opportunities?query={SKILL_ENCODED}&sort=recent" \
  "You are on Contra job listings for '{SKILL}', sorted by newest.
   Extract the first 8 visible job listings.
   For each listing extract:
   - title
   - client/company name
   - description snippet
   - budget or rate (if shown)
   - posted time
   - required skills
   - direct URL
   STRICT RULES:
   - Do NOT click any listing
   - Read only what is visible in the listing cards
   - Maximum 8 listings then stop
   - If no results found, return {found: false}
   Return JSON array: [{title, client, description, budget, posted, skills: [], url}]" \
  --sync > /tmp/fg_contra.json &

# Agent 3 — We Work Remotely
tinyfish agent run \
  --url "https://weworkremotely.com/remote-jobs/search?term={SKILL_ENCODED}" \
  "You are on We Work Remotely job search results for '{SKILL}'.
   Extract the first 8 visible job listings.
   For each listing extract:
   - title
   - company name
   - category (e.g. Front-End, Back-End, Design, etc.)
   - posted date
   - direct URL to the listing
   STRICT RULES:
   - Do NOT click any listing
   - Read only what is visible in the search results
   - Maximum 8 listings then stop
   - If no results, return {found: false}
   Return JSON array: [{title, company, category, posted, url}]" \
  --sync > /tmp/fg_wwr.json &

# Agent 4 — Freelancer.com
tinyfish agent run \
  --url "https://www.freelancer.com/jobs/?keyword={SKILL_ENCODED}" \
  "You are on Freelancer.com job listings for '{SKILL}'.
   Extract the first 8 visible job listings.
   For each listing extract:
   - title
   - budget range (fixed or hourly)
   - number of bids (if shown)
   - posted time
   - required skills listed
   - direct URL
   STRICT RULES:
   - Do NOT click any listing
   - Read only what is visible in the listing cards
   - Maximum 8 listings then stop
   Return JSON array: [{title, budget, bids, posted, skills: [], url}]" \
  --sync > /tmp/fg_freelancer.json &

# Agent 5 — LinkedIn (contract/freelance filter)
tinyfish agent run \
  --url "https://www.linkedin.com/jobs/search/?keywords={SKILL_ENCODED}&f_JT=C%2CF&f_WT=2&sortBy=DD" \
  "You are on LinkedIn job search results for '{SKILL}' filtered to Contract and Freelance jobs, remote, sorted by most recent.
   Extract the first 8 visible job listings.
   For each listing extract:
   - title
   - company name
   - location or remote status
   - posted time
   - salary or rate if shown
   - direct URL
   STRICT RULES:
   - Do NOT click any listing
   - Read only what is visible in the job cards
   - Maximum 8 listings then stop
   Return JSON array: [{title, company, location, posted, salary, url}]" \
  --sync > /tmp/fg_linkedin.json &

wait

echo "=== UPWORK ===" && cat /tmp/fg_upwork.json
echo "=== CONTRA ===" && cat /tmp/fg_contra.json
echo "=== WWR ===" && cat /tmp/fg_wwr.json
echo "=== FREELANCER ===" && cat /tmp/fg_freelancer.json
echo "=== LINKEDIN ===" && cat /tmp/fg_linkedin.json

运行前,替换:

  • {SKILL} — 例如:React developer
  • {SKILL_ENCODED} — URL 编码后的内容,例如:React%20developer

第 3 步 — 筛选并展示

合并所有结果,删除出现在多个平台上的重复职位,并仅保留过去 7 天内发布的职位。按发布时间排序,最新的排在最前。

## Freelance Gigs — {SKILL}
*Scraped live from Upwork · Contra · We Work Remotely · Freelancer · LinkedIn*
*{N} listings found · Posted in the last 7 days · {date}*

---

### 🔥 Fresh Listings

#### {Title}
**Platform:** {platform} · **Posted:** {posted}
**Budget:** {budget or rate}
**Skills:** {skills}
{description snippet}
🔗 {url}

---

#### {Title}
[same structure]

---
[up to 15 listings total, sorted by most recent]

---

### 📊 Quick Summary

| Platform | Listings Found | Avg Budget |
|---|---|---|
| Upwork | {n} | {avg} |
| Contra | {n} | - |
| We Work Remotely | {n} | - |
| Freelancer | {n} | {avg} |
| LinkedIn | {n} | {avg} |

---

### 💡 Tips for These Listings
{1-2 sentences of context — e.g. "Upwork has the most volume but high competition. Contra listings tend to be higher quality clients at better rates. LinkedIn contract roles are typically longer engagements."}

特殊情况

  • Upwork 需要登录才能查看职位 — 提取登录限制出现前可见的内容,并注明此限制
  • 未找到符合技能要求的职位 — 尝试其他表述(例如,“React” → “React.js”、“frontend developer”;“Python” → “Python developer”、“Django”)
  • 技能非常冷门 — We Work Remotely 和 LinkedIn 可能会有更丰富的结果;对于常见技能,Upwork 和 Freelancer 通常有更多职位
  • 用户需要特定预算范围 — 运行前,在 Upwork 和 Freelancer 的 URL 中添加预算筛选条件
  • 用户位于特定国家/地区 — 说明 Upwork 和 Freelancer 面向全球,但部分职位可能限制工作地点;LinkedIn 可以按国家/地区筛选
  • 所有平台返回的结果都很少 — 建议用户几天后再查看,或放宽技能条件(例如,将“React Native”改为“React”)

评论

支持 Markdown