mcpField
F
freelance-gig-finder

freelance-gig-finder

github.com/tinyfish-io生産性2.3k44 回インストール1 週間前に更新
リポジトリ

freelance-gig-finder について

スキルに合う新着のフリーランス案件や契約求人を複数の求人プラットフォームで探すスキルです。検索の並列実行、絞り込み、重複排除を案内し、TinyFish CLIの導入と認証を前提とします。

主な機能

  1. 015つの求人プラットフォームを検索
  2. 02各プラットフォームを並列検索
  3. 03掲載日の新しさで絞り込み
  4. 04プラットフォーム間の重複排除
  5. 05TinyFish 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 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」)

コメント