write-proposal
Installation
SKILL.md
Write an Upwork proposal
Create a focused proposal grounded in the freelancer's real profile and work history. Optimize for relevance and credibility, not volume or generic persuasion.
Select the account
Call list_accounts and choose an account whose raw role is TALENT or FL_AGENCY. Ask the user when more than one is eligible. Retain org_uid and role for every later call, but refer to the account by name and role_label.
Read the job
- Call
find_jobswith actionget. Its id parameter accepts a numeric job id, a~02…ciphertext, or a full Upwork job URL, so a link the user pasted can be passed through unchanged. - To find candidate jobs first, use
find_jobsactionsearchwhen the user supplies search terms, or actionsmart_searchwhen they want work matched to their own profile. Do not pass profile skills intosmart_search; the recommender already knows the profile. Its default mode isbest_match. Whenever you return those results, say that Most Recent is also available, and switch tomode: most_recentwhen they ask for the newest work. Date filters (days_posted, orfrom_date/to_date) apply only tomost_recent; actionsearchcannot filter by date. Search rows do not includeconnects_cost; read that from actiongetwhen the user opens a specific job. A result withappliedtrue means this freelancer already applied — do not recommend applying again. - Surface the exact title, scope, budget, required skills, client preferences, screening questions, and the Connects cost to apply when the response includes them.
- A job's
client.ratingis the average score other freelancers gave that client after working with them, not the client's rating of freelancers. Surface a low rating when the user is deciding whether to apply, and relay the response'sclient_rating_basisframing rather than inventing your own. - When a search returns no rows, read
empty_reasonand say what it means; do not report that the marketplace is empty. Ifno_personalization, use actionsearchfor the whole marketplace. When there is noempty_reason, say only that nothing matched these criteria; an upstream restriction looks the same, so do not assert either.
Rule out an existing invitation or proposal
Do this before drafting. Upwork rejects a duplicate application upstream, so skipping the check wastes the user's turn and can look like a server fault.