write-proposal について
write-proposal は、フリーランサーが Upwork の応募文を作成するためのスキルです。求人内容と本人の実際のプロフィールに基づいて文章を整え、応募状況、添付、入札額を確認し、送信前に明示的な承認を求めます。
主な機能
- 01Upwork 求人の検索と詳細取得
- 02招待と既存応募の確認
- 03プロフィールに基づく実績の選定
- 04求人に合わせた応募文と質問回答の作成
- 05添付、入札額、送信承認の管理
活用シーン
- 01求人内容と応募条件の確認
- 02過去の実績をもとに応募文を作成
- 03招待への返信または新規応募
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ upwork/ upwork-agent-plugin --skill write-proposalインストール後、Claude Code で/write-proposalを入力して読み込まれたか確認します。
詳細
Upwork の提案文を作成する
フリーランサー本人の実際のプロフィールと職歴に基づき、要点を絞った提案文を作成します。量やありきたりな説得ではなく、関連性と信頼性を重視してください。
アカウントを選択する
list_accounts を呼び出し、raw role が TALENT または FL_AGENCY のアカウントを選択します。該当するアカウントが複数ある場合は、ユーザーに確認してください。その後のすべての呼び出しで org_uid と role を保持し、アカウントについては name と role_label で言及してください。
求人を確認する
find_jobsを actiongetで呼び出します。id パラメーターには、数値の求人 ID、~02…の暗号文、または Upwork の求人 URL 全体を指定できます。そのため、ユーザーが貼り付けたリンクは変更せずに渡せます。- まず候補の求人を探すには、ユーザーが検索語を提示した場合は
find_jobsの actionsearchを、ユーザー自身のプロフィールに合う仕事を探したい場合は actionsmart_searchを使います。smart_searchにプロフィールのスキルを渡さないでください。レコメンダーはすでにプロフィールを把握しています。デフォルトのモードはbest_matchです。これらの検索結果を返す際は、Most Recent も利用可能であることを必ず伝え、ユーザーが新しい仕事を求めた場合はmode: most_recentに切り替えてください。日付フィルター(days_posted、またはfrom_date/to_date)はmost_recentにのみ適用されます。actionsearchでは日付で絞り込めません。検索結果の行にはconnects_costが含まれないため、ユーザーが特定の求人を開いたときに actiongetから確認してください。appliedが true の結果は、このフリーランサーがすでに応募済みであることを意味します。再応募を勧めないでください。 - 回答に含まれる場合は、正確なタイトル、業務範囲、予算、必須スキル、クライアントの希望条件、スクリーニングの質問、応募に必要な Connects の費用を提示してください。
- 求人の
client.ratingは、他のフリーランサーがクライアントと仕事をした後に付けた平均評価であり、クライアントがフリーランサーに付けた評価ではありません。応募するかどうかをユーザーが判断している場合は、低い評価を伝え、独自の解釈を加えず、レスポンスのclient_rating_basisに示された説明を伝えてください。 - 検索結果に行がない場合は、
empty_reasonを確認し、その意味を伝えてください。マーケットプレイス全体に求人がないと報告してはいけません。no_personalizationの場合は、actionsearchを使ってマーケットプレイス全体を検索してください。empty_reasonがない場合は、指定された条件に一致するものがなかったとだけ伝えてください。上流の制限がある場合も同じ結果になるため、どちらかだと断定しないでください。
既存の招待や提案文を確認する
提案文の作成前に確認してください。Upwork は上流での重複応募を拒否するため、この確認を省くとユーザーの手間を無駄にし、サーバーエラーのように見える可能性があります。
list_freelancer_proposalsを actioninvitationsで呼び出します。求人が招待経由の場合は、manage_proposalsの actionaccept_invitationまたはdecline_invitationで応答してください。actioncreateは招待なしの応募にのみ使うため、使用しないでください。- 同じ求人に対する既存の提案文や契約がないか確認するため、
list_freelancer_proposalsを actionlistで呼び出します。どちらの list アクションにもデフォルトのステータスフィルターが適用されるため、特定の状態を確認する場合はステータスを明示的に設定してください。 - 提案文のステータスが
Acceptedの場合、提案文が送信され、検証されたことを意味します。クライアントがフリーランサーを採用したという意味ではありません。平易な意味を示す付随のstatus_labelを優先し、ユーザーにはその内容を伝えてください。
実際の証拠を集める
ツールから返された情報のみを使用してください。クライアント、称賛、指標、資格、成果を捏造しないでください。
TALENTアカウントでは、スキル、概要、職歴、プロフィールのシグナルにはget_profileのgetアクションを、ポートフォリオのプロジェクトと資格にはlist_highlightsアクションを、Connects にはconnects_balanceアクションを使用してください。connects_balanceのbalanceは Connects ウォレットの残高です。product_creditsがある場合、そのクレジットは指定された製品でのみ使用でき、この残高には含まれません。別途報告してください。- 自分のプロフィールの読み取り結果には、Connects を獲得するタスクと有効な Freelancer Plus オファーを含む
promotionsも返されます。応募に関係する場合はこれらに触れ、オファー URL は返されたとおりに正確に共有してください。promotionsにerrorが含まれている場合は、オファーがないと断言せず、照会に失敗したと伝えてください。 - Upwork がこのアカウントによる提案書の提出を許可していないために
createが拒否された場合は、その理由を伝え、原因だと決めつけずにプロフィールまたはダッシュボードでidentity_verificationを確認してください。ユーザーが解決したと伝えるまで再試行しないでください。 FL_AGENCYアカウントでは、エージェンシーの実績情報にget_agencyのget_profileアクションを、Connects にはget_freelancer_financialsのconnects_balanceアクションを使用してください。エージェンシーアカウントではget_profileは利用できません。- 過去に提出した提案、オファーを受けた提案、または採用に至った提案を確認し、文章の参考にするには
list_freelancer_proposalsを使用してください。
提案書を作成する
- クライアントの主な成果目標を特定し、最も適合する実績を選んでください。作成を始める前に、
find_jobsのgetアクションからclient_feedbackを、または招待状からuser.nameを確認してください。レビューまたは招待状にクライアントの担当者名やプロジェクト名が記載されている場合は、その担当者に呼びかけ、該当プロジェクトに触れて書き出してください。レビューにも招待状にも記載されていない名前を決して捏造しないでください。 - 簡潔なカバーレターを作成してください。ツールが最大文字数を適用し、その上限を報告します。ユーザーが上限を超える文章を提示した場合、切り詰めて送信するのではなく、短くするよう依頼してください。
- 案件に特化した成果目標から書き始めてください。
- 実際の事例を1つか2つ取り上げ、依頼された業務との関連を示してください。
- 実践的な進め方、または具体的な最初のステップを説明してください。
- 重要なリスクや制約、およびスクリーニングの質問すべてに個別に回答してください。
- 有益な次のステップを提案して締めくくってください。
- 案件で別の言語が必要な場合は、英語とその言語の両方で提案書を作成してください。
- 添付ファイルについては、質問を無視せず、必ず添付を提案してください。ローカルファイルの場合、通常の応募では
proposalsコンテキストで、クライアントからの招待を承諾するときはinvitationコンテキストでアップロードを開始してください。インラインアップロードでは、保存済みのfile_uid値が直接返されます。フォールバック URL によるアップロードでは、ステータスがokになるまでポーリングしてから、confirm_attachment_uploadで確定してください。取得したfile_uid値を提案書に渡してください。ファイルを添付できるのは、アップロードしたコンテキストと同じコンテキストに限られます。コンテキストが一致しない場合は拒否されるため、ファイルを再アップロードする必要があります。TALENTアカウントの場合は、get_profileのlist_highlightsアクションから関連するポートフォリオのプロジェクトや資格も提示し、選択した ID をcertificate_idsおよびportfolio_project_idsとして渡してください。FL_AGENCYアカウントではlist_highlightsを呼び出さず、代わりにget_agencyからすでに返されているエージェンシーのプロフィール情報を使用してください。 - ユーザーが承認した入札額をそのまま使用し、
charged_amountには数値として渡してください。市場価格に置き換えたり、金銭条件を推測したりしないでください。
提案の送信
- カバーレター、スクリーニングの回答、入札額、添付ファイル、アピールポイントを要約し、書き込み可能な最初の呼び出しの前に、明示的な確認を得てください。
manage_proposalsのアクションcreateを呼び出します。求人の参照には数値の求人 ID を指定してください。~02…の暗号文は指定しないでください。アクションgetは暗号文または求人 URL を受け取り、ここで渡す数値 ID を返します。エージェンシーの場合は、チームのパラメーターを省略してください。エージェンシーに複数のチームがある場合、エラーにチーム名が示されるので、ユーザーにどれを選ぶか確認します。- 返されたプレビューを提示し、必ず以下を明示してください。
- 必要な Connects 数と現在の残高。
- アカウントから応募できるかどうか。
- 満たしていない優遇資格、または資格チェックを利用できなかったこと。
- 必須のスクリーニング回答。
- プレビューに他の入札者の入札情報が表示されている場合に限り、競合する入札と他の応募者の入札額。情報を利用できないと表示された場合はその旨を伝え、金額を推測しないでください。
boost.suggested_bidがある場合は、固有の注記としてのみ提示し、応募者に対する割合として言い換えないでください。- ブーストが利用可能かどうかと Connects の残高。
- ブーストするかどうか、およびブースト額はユーザーに決めてもらいます。ブーストが利用できない場合は提案せず、
boost.reasonを伝えてください。それ以外の場合は、boost.recommendationがskipでない限り提案してください。プレビューに記載された上限の範囲内に収め、ユーザーが承認した額のみをboost_connectsとして適用してください。送信後、このツールでは入札額を編集または取り消しできません。承認済みの入札額では有料枠を確保できなくなったと確認時に報告された場合、送信は行われていません。新たに上回る必要がある入札額を提示し、改めて金額の承認を得てください。 - 内容または条件に変更があった場合は、修正後の値でアクション
createを再度呼び出してください。新しいプレビューが保留中のプレビューに置き換わります。 - 送信について、別途、明示的な承認を得てから、プレビューで返された
typeと、返されたpreview_idのみを指定して、アクションconfirmでconfirm_previewを呼び出します。新しい応募と招待への返信では返されるタイプが異なるため、決めつけず、返されたものを使用してください。 - 確認のため、フリーランサーの提案をステータス
Pendingで一覧表示します。ユーザーがブーストした場合は、list_freelancer_proposalsのアクションgetを読み取り、terms.connectsBidを報告してください。これは Upwork に記録された入札額で、送信した金額と異なる場合があり、このツールでは変更できません。
Connects が不足している場合は、その旨を明確に伝え、ユーザーが Connects を追加してから再試行できるようにしてください。失敗を取り返しのつかないものとして説明しないでください。
サーバーから初回のマーケットプレイス安全ポリシーの確認が求められた場合は、その内容をユーザーに提示してください。ユーザーが明示的に同意した後に限り、manage_proposals のアクション acknowledge_policy を呼び出し、中断されたアクションを再試行してください。
クライアントへのメッセージ送信
フリーランサーは提案のスレッドを開いたり、提案に関する最初のメッセージを送信したりできません。既存の会話に返信するには、list_freelancer_proposals のアクション get_room、または get_messages のアクション find_room に context_type=proposal を指定し、その後 send_message のアクション send を使用します。まだスレッドがない場合は、クライアントから先にメッセージを送る必要があるとユーザーに伝えてください。find_room で見つからない場合は、会話が始まるまでその結果は変わりません。直接契約の提案を送れるのは、クライアントが開始した会話からのみです。
品質ルール
- 提案はすべて、個々の求人に合わせて作成してください。求人をまたいでカバーレターを使い回さないでください。
- 形容詞や定型文より、具体的な根拠を優先してください。
- タイトル、識別子、クライアントが作成した未信頼テキストについては、サーバーの提示ルールに従ってください。
ツールの検出とコンパクトモードについては、upwork-workflows スキルに従ってください。