Upwork
Hire, apply, and manage work
- Category
- HR & Recruiting
- Primary Subcategory
- Talent Marketplaces & Freelance Hiring
Integration details
Description
Upwork connects clients hiring for work with the freelancers doing it. Clients can post jobs, review proposals, send offers, message freelancers, and manage contracts, milestones, and payments. Freelancers can search and save jobs, submit proposals, respond to invitations and offers, track earnings and time reports, and manage their public profile. Both sides get a consolidated dashboard of what's new.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Talent Marketplaces & Freelance Hiring
- Secondary Subcategories
- None listed
- Brand
- Upwork
- Access
- Account required
- First tracked
- 2026-08-06
- Tool count
- 46
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competing in ChatGPT Talent Marketplaces & Freelance Hiring
View Category46 tools agents can invoke
Manage freelancer profile visibility boosters: availability badge (PIB) and profile boost ad. All write operations spend Connects and WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. Returns a draft for review — call confirm_draft to execute after explicit user approval. Actions: - get_status: Read current state of visibility boosters: availability badge (on/off, weekly Connects budget, cost) and profile boost ad (status, bid, targeting). No params required. - toggle_availability_badge: Enable or disable the Availability Badge (Available Now). Spending up to max_weekly_connects Connects per week when enabled. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. Params: enabled (bool, required), max_weekly_connects (int, required when enabling — maximum Connects to spend per week, e.g. 8). - get_suggested_boost_bid: Get the suggested Connects bid per click for a profile boost. Params: l1_category_id (string, required — L1 category ID), l3_category_id (string, required — L3 specialty ID). - create_profile_boost: Create a profile boost ad to appear at the top of search results. Charged only when a client clicks. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. Params: bid_connects (int, required — Connects per click), l1_category_id (string, required), l3_category_id (string, required), daily_budget (int, optional — max Connects/day), total_budget (int, optional — lifetime Connects cap), end_date (string, optional — yyyy-mm-dd). - manage_profile_boost: Stop, pause, restart, or update an existing profile boost ad. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. Params: action (string, required — one of: stop, pause, restart, update), ad_id (string, required), bid_connects (int, optional — for update), daily_budget (int, optional — for update), total_budget (int, optional — for update), end_date (string, optional — yyyy-mm-dd, for update).
upwork__boost_profile
End a contract with a reason code, optionally attaching a freelancer review (six 1–5 scores + a comment). Runs through MCP (draft -> confirm_draft). Use list_contracts action=end_reasons to look up reason codes first. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. Returns a draft for review — call confirm_draft to execute after explicit user approval. Actions: - end: Prepare a contract-end draft. Params: contract_id (string, required), reason_id (string, required). Optional freelancer review: quality_score, skills_score, communication_score, availability_score, deadlines_score, cooperation_score (integers 1–5) and comment (string). Provide all six scores together for a complete review.
upwork__end_contract
Confirm uploaded files so they are retained in Upwork storage. Uses the same attachment backends as start_attachment_upload. Requires the upload context and the file_uid values returned from upload. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. You MUST present full action details and receive explicit approval before executing. Each write requires separate confirmation even if the user said "approve all". Actions: - confirm: context (string, required) selects the attachment backend: messages = room message attachments (requires room_id); proposals = job-application/proposal attachments; offer = offer attachments; milestones = milestone attachments; job = job posting attachments; invitation = attachments when a freelancer accepts a client invitation. If the user did not clearly say where the file belongs, ask which context they want before calling start_attachment_upload. Params: file_ids (array of strings, required — file_uid values to confirm). Use the same context as the upload session that produced the file_uid values.
upwork__confirm_attachment_upload
Search for freelancers and view profiles. Actions: - search: Search freelancer profiles. Params: query (string — the ROLE or intent as a short phrase, e.g. "WordPress developer" or a job title; it is keyword AND-matched against profile text, so keep it short. Do NOT list skill keywords here — pass those as skills. Putting the same terms in both query and skills double-filters and over-narrows the results; prefer skills for concrete technologies and leave query for the role, or omit query when skills already capture the need), skills (array of string — each is matched as a structured skill filter/facet like the marketplace UI, not concatenated into the free-text query. Skills are AND-matched, so list the most important first; if requiring all of them yields no matches the tool relaxes the least-central skills and returns a note saying how many were applied), rate_min (number), rate_max (number) (each must be greater than 0; rate_min cannot exceed rate_max; omit a bound to leave it open), country (string), state (string — filter by location state/region), regions (array of string — continents: Africa, Americas, Antarctica, Asia, Europe, Oceania), subregions (array of string — UN subregions, e.g. Northern America, Western Europe, South-Eastern Asia), talent_type (freelancer/agency — freelancer returns independent freelancers, agency returns agencies), job_success_min (number, 0-100 — minimum Job Success Score. The marketplace UI offers three standard choices: "Any job success" (omit this filter), "80% & up" (job_success_min=80), and "90% & up" (job_success_min=90) — offer these presets when the user asks to filter by job success; any other 0-100 value is also accepted, values outside 0-100 are rejected), top_rated (boolean — filter to Top Rated freelancers), top_rated_plus (boolean — filter to Top Rated Plus), rising_talent (boolean — filter to Rising Talent), contract_to_hire (boolean — open to contract-to-hire), offers_consultations (boolean — offers consultations), timezones (array of string — Upwork timezone labels, e.g. "UTC-05:00 Eastern Time (US & Canada)", "UTC+00:00 London" — NOT IANA names), languages (array of string — language codes, e.g. en, es), english_level (basic/conversational/fluent/native, or a rank number 1-4 — minimum English proficiency), earnings_min (number), earnings_max (number) (total earned amount range, USD; each must be > 0), no_earnings (boolean — freelancers with no earnings yet), hours_billed_min (number), hours_billed_max (number) (hours-billed range), total_jobs_min (number), total_jobs_max (number) (completed-jobs range), title (string — filter by freelancer title), limit (integer, 1–10, default 10), offset (number, default 0 — must be >= 0). All filters are optional. Each result has two distinct IDs: 'personId' (use it as freelancerId for invite_freelancer) and 'profile_key' (starts with ~, use it for get_profile). Do not interchange them. For hiring via manage_offers create_draft, first call get_profile with profile_key to obtain vendor_org_uid, then pass vendor_user_id=personId and vendor_org_uid. Each result includes job_success_score (the freelancer's Job Success Score, 0-100) when available — the same scale as the job_success_min filter. Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - get_profile: Get a freelancer's full profile. Params: profile_key (string, required — starts with ~ e.g. ~01abc123, from search results). Returns vendor_org_uid (the freelancer's org for hiring, pass it to manage_offers create_draft) and vendor_org_type (individual/agency) when available. - smart_search: Auto-fetch a job's required skills and search for matching freelancers. Falls back to the job's category/occupation when classification skills are missing or not indexed yet. Params: job_id or job_posting_id (string, required — owned posting ID from get_job_posting action=list).
upwork__find_freelancers
Search and view marketplace job postings. Actions: - search: Search for jobs matching filters. Params: query (string), job_type (fixed/hourly), experience_level (entry_level/intermediate/expert), budget_min (number), budget_max (number) (each must be greater than 0; budget_min cannot exceed budget_max; omit a bound to leave it open), workload (full_time/part_time/as_needed), verified_payment_only (boolean — only jobs from clients with a verified payment method), proposals_min (number), proposals_max (number) (filter by number of proposals already submitted; e.g. proposals_max=5 for jobs with fewer than 5 proposals), client_hires_min (number), client_hires_max (number) (filter by the client's past hire count; e.g. client_hires_min=0, client_hires_max=0 for clients with no hires, or client_hires_min=10 for 10+). Range bounds must be >= 0 and min cannot exceed max; omit a bound to leave it open. sort (recency/relevance/client_total_charge/client_rating — how to order results; omit for the default recency order), previous_clients_only (boolean — only jobs from clients you have worked with before), timezone (string — filter by the client's timezone), location (string — filter by the client's location), limit (integer, 1–10, default 10), cursor (string — omit for the first page; to fetch the next page, repeat the SAME filters with cursor set to the endCursor from the previous response's pageInfo, and only when pageInfo.hasNextPage is true). A client's preferred qualifications are NOT in search results — use get on a specific job to see them. Each result includes proposal_count (proposals submitted so far). Hire/invite liveness (total_hired, invites_sent) is NOT in search — use get on a specific job before assuming it is still open. There is NO created_after/date filter — the signed-in marketplace search API exposes none (the public search has days_posted, but find_jobs uses the signed-in search for sort and extra filters). For the freshest jobs use sort=recency (already the default order); each result carries created_date/published_date for client-side narrowing to a time window. Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - get: Get full details of a job posting including client company info, work history, connects, and the client's preferred qualifications (returned as preferred_qualifications: e.g. contractor_type, minimum job success score, English level, rising_talent, earnings). When present, surface the preferred qualifications to the user so they know what the client is looking for. The response includes connects_cost (the Connects required to apply), connects_balance, and can_apply when available. Params: id or job_id (string, required — the numeric id from find_jobs action=search, a ~02… ciphertext, or a full Upwork job URL, e.g. https://www.upwork.com/jobs/~0212345 — all accepted directly, no need to extract or reformat the id yourself). If this returns access denied for a marketplace job ID, use get_job_posting action=get_marketplace with the same id. - smart_search: Auto-fetch your profile skills and search matching jobs. Params: cursor (string, optional — omit for the first page; to fetch the next page repeat with cursor set to the endCursor from the previous response's pageInfo, only when pageInfo.hasNextPage is true).
upwork__find_jobs
Browse your saved (favorite) job postings. Use find_jobs action=get for full job details. Use save_job action=save or action=unsave to update bookmarks. Actions: - list: List saved jobs for the current freelancer. Params: limit (integer, 1–10, default 10), offset (number, default 0), job_ids (array of string, optional — filter by job IDs), followed (boolean, optional — filter by followed state). Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - count: Get the number of saved jobs. No params.
upwork__find_saved_jobs
View account info and organization details. Actions: - get_user_details: Get user details. Params: id (string, optional — defaults to current user). - get_organization: Get current organization. No params. - get_company: Get the company details of the organization you are acting as. To read a different account of yours, call again with that org_uid. For a marketplace job's client, use find_jobs action=get with the job ID instead. No params.
upwork__get_account
Manage your agency: view teams, members, and organization details. Use get_messages list_rooms to view rooms. Actions: - list_agencies: List agencies you belong to. No params required. - list_teams: List teams (child organizations) in the current org. Params: limit (integer, 1–10, default 10). Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - list_members: List staff members in the current org. Params: limit (integer, 1–10, default 10). Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply.
upwork__get_agency
Get a consolidated overview of what's new: invitations, offers, messages, matching jobs, contracts, plus agency teams and members — all in one call. Access is scoped by your agency role. Actions: - check: Check all activity sources in parallel. No params required.
upwork__get_agency_dashboard
Get a consolidated overview of what's new: proposals received (grouped by job), pending offers, messages, and contract updates — all in one call. Actions: - check: Check all activity sources in parallel. No params required.
upwork__get_client_dashboard
View client financial reports: timesheets, work diaries, work-diary snapshots, and transaction history. timesheets organization_id defaults to org_uid. transactions may require elevated org permissions. Actions: - summary: Get the client Weekly financial summary for one ISO week (mirrors Reports → Weekly summary): total charged and hours, the hourly/fixed breakdown, and the Top-5 contracts and Top-5 activities by charge. All charged amounts in this summary are USD, reported by the response-level currency field. Params: from_date (string, yyyy-mm-dd, optional — selects the week containing this date; defaults to the current week). The summary is a single Monday–Sunday week. Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - timesheets: Get timesheets (hours logged on your contracts). Params: organization_id (string — defaults to org_uid), from_date (string, yyyy-mm-dd), to_date (string, yyyy-mm-dd, max 53 weeks from from_date) — at least one date required; when only from_date is set, to_date defaults to today, contract_ids (array of string), limit (number). Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - work_diary: Get work diaries (time cells: activity level, screenshots, keyboard/mouse activity). With NO contract_id it returns all work diaries across the company for a single day — the marketplace 'All work diaries' view. Pass contract_id to drill into one contract's diary. Params: contract_id (string, optional — a contract id from list_contracts; omit for the company-wide view), date (string, optional — yyyy-mm-dd, defaults to today UTC), activity (string, optional filter), sort_by (string, optional), paging (string, optional — company view only). - snapshots: Drill into one work-diary snapshot (a contract at a point in time): mouse/keyboard event counts, memo, task, status, and hasScreenshot — activity metadata, NOT the screenshot image. Use work_diary for the diary view; use this only for per-timestamp detail. Params: input (object, required) with contractId (string) and timestamp (integer — Unix epoch seconds, e.g. a snapshotDateTime rawValue from work_diary). - work_days: Get work days. Params: input (object, required). - transactions: Get transaction history. Params: ace_ids (array of accounting entity ID strings, optional — auto-resolved from org context if omitted), from_date (string, yyyy-mm-dd), to_date (string, yyyy-mm-dd) — when both dates are omitted, defaults to the last 30 days; when only from_date is set, to_date defaults to today (max 53 weeks from from_date). limit (number, default 25, max 200 — returns the most recent N transactions; total_count reports how many exist). May require elevated org permissions on some accounts. Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply.
upwork__get_client_financials
Retrieve a pending server-stored draft without consuming it. Actions: - get: Get a pending draft for review. Params: type (required — the draft type), id (required — the draft_id returned by the creating action).
upwork__get_draft
Get a consolidated overview of what's new: invitations, offers, messages, matching jobs, contract updates, and connects balance — all in one call. Actions: - check: Check all activity sources in parallel. No params required.
upwork__get_freelancer_dashboard
View your own financial data as a freelancer or agency: earnings and transaction history, connects balance, and time report. Use this to verify a payment or earnings release. Actions: - summary: Get your earnings summary for a period (the Weekly financial summary): per-client totals (earned, billed, fee, tax) and per-job billings, plus overall totals. This is the answer to "how much did I earn" — use transactions only for the full line-item ledger. Params: from_date (string, yyyy-mm-dd), to_date (string, yyyy-mm-dd) — when both omitted, defaults to the last 30 days. Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - transactions: Get transaction/earnings history. Params: ace_ids (array of accounting entity ID strings, optional — auto-resolved from org context if omitted), from_date (string, yyyy-mm-dd), to_date (string, yyyy-mm-dd) — at least one date required. accounting_entity_id (string, optional — single ACE ID shortcut, auto-resolved if omitted). limit (number, default 25, max 200 — returns the most recent N transactions; total_count reports how many exist). Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - connects_balance: Get connects balance and recent usage history. Shows current balance breakdown (free, paid, rollover) and recent connects transactions with job titles. Params: limit (integer, 1–10, default 10). - timesheets: Get your timesheets (hours logged on your contracts). Params: organization_id (string — defaults to org_uid), from_date (string, yyyy-mm-dd), to_date (string, yyyy-mm-dd, max 53 weeks from from_date) — at least one date required; when only from_date is set, to_date defaults to today, contract_ids (array of string), limit (integer, 1–10, default 10). Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply.
upwork__get_freelancer_financials
View your owned job postings and search the marketplace. Use action=list to obtain posting IDs for list_client_proposals and list_client_invitations. Prior postings are useful templates when creating new jobs. Actions: - get: Get an owned job posting by ID (from get_job_posting action=list). Params: job_id or job_posting_id. For marketplace jobs use find_jobs action=get or get_job_posting action=get_marketplace. - search_marketplace: Search marketplace job postings. Params: query (string), filters (object). Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - get_marketplace: Get a marketplace job posting by ID. Params: id (the numeric id, a ~02… ciphertext, or a full Upwork job URL — all accepted directly). - list: List the selected organization's owned job postings (not marketplace), paginated. Params: title (string, optional — partial-match filter applied upstream), limit (integer, 1–10, default 10), page (integer, default 1). Returns total_count, has_more, and next_page, plus postings[] with id, title, status, access, type, created_time, updated_time, premium, and the applicant funnel (applicants, shortlisted, messaged, offered, hired, pending_invitations, new_applicants). Use the ids for list_client_proposals / list_client_invitations; to page, call again with page=next_page. Each entry is a SUMMARY, not the full posting: description, budget, skills, screening questions and invites-sent are not included — call action=get with the id when you need them. Applicant counts ARE included, so answering "how many applied/were hired" needs no follow-up call. Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply.
upwork__get_job_posting
List rooms, find rooms by context, and read messages. Actions: - list_rooms: List your rooms, newest-created first and sorted by latest activity within the page — NOT a global most-recent-first inbox, and the count of rooms is not available, so never state a total. Page with cursor while hasMore is true. Params: room_type (ALL/GROUP/ONE_ON_ONE/INTERVIEW, default ALL), unread_only (boolean, optional), active_since (RFC3339 timestamp, optional — filters weakly upstream, do not rely on it to find recent conversations). unread_only=true and active_since cannot be combined. sort_order (ASC/DESC, default DESC), limit (integer, 1–100, default 10), cursor (string, optional — next_cursor from a prior list for the next page; alias: after). Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - find_room: Find a room by context. Params: context_type (contract/offer/proposal/one_on_one, required), context_id (string, required), organization_id (string, required for one_on_one). For context_type=proposal: Freelancers (TALENT): cannot initiate a proposal room or send the first message on a proposal — the client must contact you first. To reply, use an existing room from list_freelancer_proposals action=get_room or get_messages action=find_room (context_type=proposal). If no room exists yet, tell the user the client needs to message first. - list_messages: List messages in a room, NEWEST FIRST — the default page is the tail of the conversation, not the whole thread. Before summarising a thread or answering whether something was ever discussed, page back with cursor while hasMore is true; the message count is not available, so never state one. Params: room_id (string, required), limit (integer, 1–100, default 20), cursor (string, optional — next_cursor from a prior call for the next page of older messages; alias: after). message_count is present only once the whole thread has been read (hasMore false); while paging, the number of messages in the room is unknown. Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - get_message: Get a single message. Params: room_id (string, required), story_id (string, required).
upwork__get_messages
View freelancer profile, transaction history, and connects balance. Actions: - get: Get a freelancer profile. Params: profile_key (string, optional — starts with ~ e.g. ~01abc123, from search results). If omitted, returns the current user's own profile. - list_highlights: List your certificates and portfolio projects that can be attached to a proposal as highlights. Returns certificates (id, name) and portfolio_projects (id, title). When drafting a proposal, offer to attach the most relevant ones and pass the chosen ids to manage_proposals create as certificate_ids / portfolio_project_ids. No params. - transactions: Get transaction/earnings history. Params: ace_ids (array of accounting entity ID strings, optional — auto-resolved from org context if omitted), from_date (string, yyyy-mm-dd), to_date (string, yyyy-mm-dd) — at least one date required. accounting_entity_id (string, optional — single ACE ID shortcut, auto-resolved if omitted). limit (number, default 25, max 200 — returns the most recent N transactions; total_count reports how many exist). Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - connects_balance: Get connects balance and recent usage history. Shows current balance breakdown (free, paid, rollover) and recent connects transactions with job titles. Params: limit (integer, 1–10, default 10).
upwork__get_profile
Get the going hourly rate range for similar jobs to guide a job's hourly budget — the same From/To range Upwork shows in the Budget step. Read-only. Use it while helping a client set an hourly budget so the suggested rate reflects the market. Actions: - get: Get the suggested hourly rate range for a job. Params: experience_level (string, required — 'entry', 'intermediate', or 'expert'); and one of occupation_id (string — from the job classification) or project_text (string — the job title/description, used to infer the occupation). Returns rate_low / rate_high (USD/hr) and based_on_jobs (sample size).
upwork__get_rate_insights
Returns file_uid values for files a user uploaded through the web UI. Action name is get (not get_status). Upload tasks expire after a short TTL. Actions: - get: Get uploaded file metadata. Params: task_id (string, required). Returns file_uid values and file metadata. Does not return file content.
upwork__get_upload_status
Invite a freelancer to a job posting. Use list_jobs to see your jobs and how many invites remain on each, then send returns a draft — call confirm_draft with type='invitation' to send. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. Returns a draft for review — call confirm_draft to execute after explicit user approval. Call get_tool_help(tool_name="invite_freelancer") for the actions, parameters, and how to use this tool.
upwork__invite_freelancer
List or get client job invitations for one owned job posting. Requires job_reference from get_job_posting action=list (postings[].id). Invitations are per-job only — there is no list_all. Actions: - list: List active invitations for a job, or get one invitation when invitation_id is set. Params: job_posting_id, job_id, or job_reference (string, required — owned posting ID from get_job_posting action=list), invitation_id (string, optional — when set, returns that invitation only; organizationId_eq comes from org_uid), limit (integer, 1–10, default 10) — list only), cursor (string, optional — pageInfo.endCursor from a prior list for the next page; alias: after; list only). Org comes from org_uid on execute_tool. Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply.
upwork__list_client_invitations
View proposals on your job postings. Use action=list_all to discover proposals across all postings without a job_posting_id. Use action=list when you already have job_posting_id from get_job_posting action=list. Prior proposals can provide context for drafting offers. Actions: - list: List proposals for a job. Params: job_posting_id or job_id (string, required — from get_job_posting action=list), status (string), shortlisted (bool — only proposals the client shortlisted), limit (integer, 1–50, default 50), cursor (string, optional — pageInfo.endCursor from a prior list for the next page; alias: after). The response includes totalCount and pageInfo; when the user wants to review all applicants, page through with cursor until hasNextPage is false. Use list_all to discover proposals without a posting id. Declined proposals carry get_unavailable=true — that list card is the complete view; do not call get on their id. Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - get: Get full proposal details. Does not work for declined proposals (see list/list_all's get_unavailable flag) — use the list card for those instead. Params: id or proposal_id (string, required). - list_all: List proposals across all your job postings. Params: status (string, optional), limit_per_job (integer, 1–10, default 10). Declined proposals carry get_unavailable=true — that list card is the complete view; do not call get on their id. Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - metadata: Get valid proposal metadata (durations, engagement values). No params needed.
upwork__list_client_proposals
View and search your contracts and time reports. ID provenance: use action=search to discover rows; for CLIENT search results use node.contract.id (not node.id) as contract_id. Offer ids for list_offers/get come from list_offers or manage_offers list, not from list_contracts search. See docs/id-chaining.md. Actions: - search: Discover contracts/offers — call this FIRST. For freelancers: vendor_id (string, defaults to your user ID). For clients: searches clientOffers automatically. Common: contract_statuses (array: ACTIVE, CLOSED, PAUSED), start_date_before (string), end_date_after (string), limit (integer, 1–10, default 10), offset (number, default 0). Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - list: Fetch known contracts by ID only — do NOT use for discovery. Params: ids (string[], required, 1–100). Obtain ids from search (node.contract.id) or get. Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - get: Get full contract details by contract ID. Authoritative milestone read for active/fixed-price contracts: offer.milestones includes dueDateTime, state (plus state_label), depositAmount, fundedAmount, paid, and submissionCount — no offer-ID chaining needed. Params: contract_id (string, required). - get_original_proposal: Get the original proposal for a contract. Params: id (string, required). - timesheets: Get timesheets (time report) for contracts. Params: organization_id (string — defaults to org_uid), from_date (string, yyyy-mm-dd), to_date (string, yyyy-mm-dd, max 53 weeks from from_date) — at least one date required; when only from_date is set, to_date defaults to today, contract_ids (array of string), limit (integer, 1–10, default 10). Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - end_reasons: Get valid reason codes for ending a contract. Params: reason_type (required enum: CONTRACT_END_HOURLY | CONTRACT_END_FIXED).
upwork__list_contracts
View your freelancer proposals and received invitations. Prior proposals are useful examples when drafting new proposals. Note: the status 'Accepted' means the proposal was submitted and validated (NOT that the client accepted you) — each result includes a status_label with the plain-English meaning. Start with recent submitted (Accepted) proposals; when looking for the strongest templates, also check Offered/Hired examples. Actions: - list: List your proposals with status (plus status_label), bid terms, created/modified dates, job id/title, and cover letter text. Params: status (string, default Accepted — which means 'submitted'; values: Accepted=submitted, Offered=offer received, Hired, Activated=invitation accepted, Pending=processing, Declined, Withdrawn, Archived), sort_field (CREATEDDATETIME/MODIFIEDDATETIME, default CREATEDDATETIME), sort_order (ASC/DESC, default DESC), limit (integer, 1–10, default 10), cursor (string, optional — pageInfo.endCursor from a prior list for the next page; alias: after). Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - invitations: List invitations you received from clients. The 'id' field in each result is the invitation_uid needed for manage_proposals action=accept_invitation. Each result includes jobPosting (id + title); for full job details call find_jobs action=get with jobPosting.id. Params: status (string, default pending), job_posting_id (string, optional — only invitations for that job), sort_field (CREATED, default CREATED), sort_order (ASC/DESC, default ASC), limit (integer, 1–10, default 10), cursor (string, optional — pageInfo.endCursor from a prior list for the next page; alias: after). Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - get: Get full details of a proposal. Params: id or proposal_id (string, required — from list). - get_room: Get the messaging room for a proposal. Params: proposal_id (string, required). Freelancers (TALENT): cannot initiate a proposal room or send the first message on a proposal — the client must contact you first. To reply, use an existing room from list_freelancer_proposals action=get_room or get_messages action=find_room (context_type=proposal). If no room exists yet, tell the user the client needs to message first.
upwork__list_freelancer_proposals
View milestone state for a fixed-price contract. Returns each milestone's state (NotFunded, Active, Submitted, Paid, …), deposit/funded/paid amounts (both rawValue and displayValue are in dollars), submission count, and — for submitted milestones — the submission deliverables with downloadable links (uploaded_by_role marks FREELANCER vs CLIENT files). Use after list_contracts to check status before submit_milestones, or after the client funds/releases payment on the web. Actions: - list: List milestones for a contract. Params: contract_id (string, required — from list_contracts search/get).
upwork__list_milestones
View and list offers. Use list_mine to see all offers for your org. Use get to fetch full details of a specific offer. The 'id' from these results is the offer_id needed for manage_proposals action=accept_invitation. Actions: - get: Get full offer details by offer ID. Milestones match list_contracts get / manage_offers get (dueDateTime, state + state_label, depositAmount, fundedAmount, paid, submissionCount). For active contracts prefer list_contracts action=get. Params: offer_id or id (string, required — from list/list_mine here; NOT clientOffers node.id from list_contracts search). - get_attachments: List the file attachments on an offer (documents the client attached to the offer), each with its file name and a downloadable link. Params: offer_id or id (string, required — the offer ID). Returns fileName and link per attachment; present each as a markdown link (the link is presigned and expires in about 15 minutes). - list: List offers for your account — offers you sent (client) or received (freelancer). No filter needed; the tool uses your org_uid automatically. Results are newest first. Params: limit (integer, 1–10, default 10), page (integer, default 1), Optional: states (array of strings to filter by offer state — use role-appropriate values; returned offer state matches these keys). Client: sent, awaiting_acceptance, contract_started, awaiting_approval, expired, denied, draft, withdrawn, canceled. Freelancer/agency: awaiting_your_acceptance, contract_started, awaiting_client_approval, expired, denied, draft, withdrawn, canceled. Do NOT pass searchAttribute, id, or a filter object. Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply. - list_mine: List your offers (same as list). Results are newest first. Params: limit (integer, 1–10, default 10), page (integer, default 1), Optional: states (array of strings to filter by offer state — use role-appropriate values; returned offer state matches these keys). Client: sent, awaiting_acceptance, contract_started, awaiting_approval, expired, denied, draft, withdrawn, canceled. Freelancer/agency: awaiting_your_acceptance, contract_started, awaiting_client_approval, expired, denied, draft, withdrawn, canceled. Optional params are refinements: do not silently invent values. If the user makes a broad request, briefly surface the most relevant available refinements and proceed with only the required params plus context the user already provided. Ask before applying optional filters when the user asks for a selective result such as best, top, cheapest, near me, urgent, or only. After returning results, mention useful refinements the user can apply.
upwork__list_offers
Manage proposals on your job postings while reviewing applicants: shortlist/un-shortlist and decline. To HIRE an applicant, use manage_offers create_draft instead (accepting a proposal is an offer). WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. You MUST present full action details and receive explicit approval before executing. Each write requires separate confirmation even if the user said "approve all". Actions: - shortlist: Shortlist (or un-shortlist) a proposal on your job posting. Shortlisting flags a promising applicant for later review; it does NOT hire them (to hire, use manage_offers create_draft). Params: proposal_id (string, required), job_posting_id (string, required — numeric posting id), shortlisted (bool, optional — default true; pass false to un-shortlist). - decline: Decline a proposal on your job posting. Returns a draft — present it and call confirm_draft with type='proposal_decline' and the returned draft_id to actually decline (the freelancer is notified). Params: proposal_id (string, required), job_posting_id (string, required), reason (string — human-readable reason, auto-matched to valid reasons), message (string, optional message to applicant). Optional params are user choices: do not silently invent values. Briefly surface relevant optional inputs before the action when they could affect the outcome. If the user does not choose them, proceed with only required params plus context the user already provided.
upwork__manage_client_proposals
Create or update a job posting. For create, returns a draft for review before posting. Use confirm_draft to publish after approval. Provide skills as human-readable names (e.g., 'React', 'WordPress') — they are resolved automatically. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. Returns a draft for review — call confirm_draft to execute after explicit user approval. Call get_tool_help(tool_name="post_job") for the actions, parameters, and how to use this tool.
upwork__post_job
WRITE milestone management. create, edit, delete, and reject run through MCP (draft -> confirm_draft). fund (activate) and approve move money — funding escrow and releasing payment — so they are completed by you on Upwork and return a link, NOT a draft. No list/get actions — inspect milestone state via list_contracts action=get (offer.milestones includes state, amounts, paid, submissionCount). WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. Returns a draft for review — call confirm_draft to execute after explicit user approval. Call get_tool_help(tool_name="manage_milestones") for the actions, parameters, and how to use this tool.
upwork__manage_milestones
Create draft offers and manage offers to freelancers. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. Creates a draft that must be finalized on upwork.com by the user. Call get_tool_help(tool_name="manage_offers") for the actions, parameters, and how to use this tool.
upwork__manage_offers
Submit, edit, or withdraw freelancer proposals. Also accept or decline client job invitations. For client offers, use respond_to_offer. Freelancers (TALENT): cannot initiate a proposal room or send the first message on a proposal — the client must contact you first. To reply, use an existing room from list_freelancer_proposals action=get_room or get_messages action=find_room (context_type=proposal). If no room exists yet, tell the user the client needs to message first. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. Returns a draft for review — call confirm_draft to execute after explicit user approval. Call get_tool_help(tool_name="manage_proposals") for the actions, parameters, and how to use this tool.
upwork__manage_proposals
Save freelancers to your talent lists ("Your Lists"), create lists, and browse the freelancers in a list. Get freelancer_id (personId) from find_freelancers. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. You MUST present full action details and receive explicit approval before executing. Each write requires separate confirmation even if the user said "approve all". Actions: - list_lists: List your talent lists ("Your Lists"). No params. Returns each list's list_id (only for custom lists), list_type, title, and talent_count. - create_list: Create a new talent list. Params: title (string, required), description (string, optional). - delete_list: Delete a talent list. Params: list_id (string, required — a custom list's id). - save: Save (favorite) a freelancer. Params: freelancer_id (string, required — personId from find_freelancers), list_id (string, optional — a custom list's id from list_lists). OMIT list_id to add to your default "Favorites" list, which the tool creates automatically if it doesn't exist yet. - unsave: Remove a freelancer from a list. Params: freelancer_id (string, required), list_id (string, optional — the custom list to remove from; omit to remove from your default "Favorites" list). - list_talents: List the freelancers in a list. Params: list_id (string, optional — a custom list's id; omit to list all saved freelancers across your lists), limit (integer, 1–20, default 20), offset (number, default 0). Note: newly saved freelancers may take a moment to appear here — use lists_for_talent for an immediate check. - lists_for_talent: Show which of your lists a freelancer is in. Params: freelancer_id (string, required — personId).
upwork__manage_talent_lists
Accept, decline, or request changes to a client offer. Use this tool for all offer responses. 'decline' and 'request_changes' run through MCP (draft -> confirm_draft). 'accept' is legally binding and must be completed by you on Upwork — it returns a link. Use list_offers action=list_mine to find your offers and the offer ID. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. Returns a draft for review — call confirm_draft to execute after explicit user approval. Actions: - accept: Get the Upwork link to ACCEPT an offer. Accepting is legally binding (it starts the contract) and must be done by the person on Upwork — this returns a finalize_url, it does NOT accept the offer. The offer_id must come from list_offers (action=list_mine or get). Params: offer_id (string, required). - decline: Decline an offer from a client (not binding). Returns a draft — present it and call confirm_draft with type='offer_decline' to execute. The offer_id must come from list_offers (action=list_mine or get). Params: offer_id (string, required), reason (string, optional — one of: terms, busy, duplicate, no_response, spam, error, other, requirements), message (string, optional — message to the client). - request_changes: Request changes to an offer / counter-offer (NOT binding — the client must approve and send an updated offer). Returns a draft — present it and call confirm_draft with type='offer_request_changes' to submit. Params: offer_id (string, required — the offer to change), description (string, required — the changes you're requesting), hourly_rate (string, required — requested rate, e.g. '55.00'), currency (string, default USD), weekly_limit (number, optional), message (string, optional — note to the client).
upwork__respond_to_offer
Save or unsave (favorite) marketplace job postings. Get job_id from find_jobs (search or get). Browse saved jobs with find_saved_jobs. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. You MUST present full action details and receive explicit approval before executing. Each write requires separate confirmation even if the user said "approve all". Actions: - save: Save a job to your saved jobs list. Params: job_id (string, required — job posting ID). - unsave: Remove a job from your saved jobs list. Params: job_id (string, required — job posting ID).
upwork__save_job
Create rooms and send messages. Freelancers (TALENT): cannot initiate a proposal room or send the first message on a proposal — the client must contact you first. To reply, use an existing room from list_freelancer_proposals action=get_room or get_messages action=find_room (context_type=proposal). If no room exists yet, tell the user the client needs to message first. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. You MUST present full action details and receive explicit approval before executing. Each write requires separate confirmation even if the user said "approve all". Actions: - create_room: Create a group room. Params: input (object, required — RoomCreateInputV2). - send: Send a message to a room. Params: room_id (string, required), message (string, required unless file_attachments is set; max 10240 characters — if the user's text is longer, ask them to shorten it rather than sending it truncated). file_attachments (array, optional — each item needs file_id and file_name from start_attachment_upload; include image_id when present). - send_to_user: Send a message to a user (auto-creates 1-on-1 room if needed). Starting a conversation with a freelancer you are not yet connected to uses one of a limited number of new connections per day; the response includes remaining_connections. Optionally attach a job via job_posting_id to share it — the recipient gets a link plus a job id their assistant can open with find_jobs get. Params: user_id (string, required), org_id (string, required — recipient's org ID), job_posting_id (string, optional), message (string, required unless file_attachments is set; max 10240 characters — if the user's text is longer, ask them to shorten it rather than sending it truncated). file_attachments (array, optional — each item needs file_id and file_name from start_attachment_upload; include image_id when present). - message_proposal: Send a message to a proposal applicant (auto-creates room if needed). Params: job_posting_id (string, required), proposal_id (string, required), message (string, required unless file_attachments is set; max 10240 characters — if the user's text is longer, ask them to shorten it rather than sending it truncated). file_attachments (array, optional — each item needs file_id and file_name from start_attachment_upload; include image_id when present). - edit: Edit a sent message. Params: room_id (string, required), story_id (string, required), message (string, required unless file_attachments is set; max 10240 characters — if the user's text is longer, ask them to shorten it rather than sending it truncated).
upwork__send_message
View or change how MCP tools are presented. full_list shows all tools directly; search_execute uses search_tools/execute_tool indirection. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. You MUST present full action details and receive explicit approval before executing. Each write requires separate confirmation even if the user said "approve all". Actions: - get: Get the current tool mode preference. No params required. - set: Set the tool mode preference. Params: mode (string, required — 'full_list' or 'search_execute'). Takes effect on next session/reconnect.
upwork__set_tool_mode
View or change per-tool write confirmation settings. Write tools default to 'always_ask'. Set 'always_allow' to let an agent run a specific tool without asking for confirmation first — useful for automated flows. This applies in search_execute mode only, and it never bypasses the draft-confirm gate: a destructive write still requires a separate confirm_draft with the draft_id. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. You MUST present full action details and receive explicit approval before executing. Each write requires separate confirmation even if the user said "approve all". Actions: - get: Get permission for a tool or all tools. Params: tool_name (string, optional — omit to list all). - set: Set permission for a tool. Params: tool_name (string, required), permission (string, required — 'always_ask' or 'always_allow').
upwork__set_tool_permission
Requests a secure file upload from the user. Creates a short-lived upload session and returns task_id plus fallback_url. In MCP App-capable hosts, an inline upload UI may appear; otherwise share fallback_url with the user. The inline upload UI supports up to 7 MB per file. The fallback_url page supports up to 100 MB per file and 300 MB total; use it for larger files. Never ask for base64 text or local file paths. Before calling upload, you MUST know the upload context. Ask the user to choose messages, proposals, offer, milestones, job, or invitation when it is not obvious from the conversation. Never guess a context. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. You MUST present full action details and receive explicit approval before executing. Each write requires separate confirmation even if the user said "approve all". Actions: - upload: Create a secure, short-lived file upload session for the user. context (string, required) selects the attachment backend: messages = room message attachments (requires room_id); proposals = job-application/proposal attachments; offer = offer attachments; milestones = milestone attachments; job = job posting attachments; invitation = attachments when a freelancer accepts a client invitation. If the user did not clearly say where the file belongs, ask which context they want before calling start_attachment_upload. Params: reason (string, optional — why you need the file); room_id (string, required when context is messages). Returns task_id and fallback_url. After the user submits files in the inline UI, poll get_upload_status with task_id until status is ok.
upwork__start_attachment_upload
Confirm and execute a previously prepared draft for job postings, proposals, invitation accepts, invitations, milestones, profile updates, and offer decline / request-changes. Requires draft_id from the prior draft action. Do NOT use to ACCEPT an offer — accepting is finalized on upwork.com via the finalize_url returned by respond_to_offer accept. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. You MUST present full action details and receive explicit approval before executing. Each write requires separate confirmation even if the user said "approve all". Actions: - confirm: Confirm and execute a draft using draft_id only. Params: type (string, required), draft_id (string, required — from the create draft response). Do not pass the returned params; they are loaded from server storage.
upwork__confirm_draft
Submit milestones for client review. Use this to request approval on completed milestone work. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. Returns a draft for review — call confirm_draft to execute after explicit user approval. Actions: - submit: Submit a milestone for client review/approval. Params: milestone_id (string, required), message (string, required — note to the client), amount (object, optional — { decimal_amount: string, currency: string } to submit a partial amount), attachments (array of strings, optional — file uids to attach as deliverables; upload them first with the 'milestones' upload context).
upwork__submit_milestones
Update contract conditions. pause and restart run through MCP (draft -> confirm_draft). Changing the weekly hours limit is completed by you on Upwork and returns a link, not a direct change. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. Returns a draft for review — call confirm_draft to execute after explicit user approval. Actions: - pause: Prepare a contract pause draft. Params: contract_id (string, required), message (string). - restart: Prepare a draft to restart a paused contract. Params: contract_id (string, required), message (string). - update_hourly_limit: Get the Upwork link to change a contract's weekly hours limit. Changing the limit notifies the freelancer and must be done by you on Upwork — this returns a finalize_url, it does NOT change the limit. Params: contract_id (string, required).
upwork__update_contract
Change the content of a pending server-stored draft without executing it. Send only the fields being changed; they are merged over the stored params. Returns a fresh preview AND A NEW draft_id that requires new user approval before confirm_draft — the previous draft_id is invalidated, so an edit can never be confirmed under the approval the user gave for the previous content. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. You MUST present full action details and receive explicit approval before executing. Each write requires separate confirmation even if the user said "approve all". Actions: - update: Change fields on a pending draft. Params: type (required), id (required — the draft_id), content (required object — only the fields being changed, merged over the stored params), mode (optional — 'merge' default, or 'replace' to swap the whole payload), remove_fields (optional array of field paths to delete). The response preview must be shown to the user and explicitly re-approved before confirmation, and confirm_draft must use the NEW draft_id returned here — the id passed in is invalidated by the edit (previous_draft_id in the response names it).
upwork__update_draft
Manage freelancer profile: availability, employment, languages, education, and other experience. WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION WRITE OPERATION — REQUIRES EXPLICIT USER CONFIRMATION. Returns a draft for review — call confirm_draft to execute after explicit user approval. Call get_tool_help(tool_name="update_profile") for the actions, parameters, and how to use this tool.
upwork__update_profile
Get the full reference for a tool: its complete description and input schema, including every action and all required and optional parameters. Call this before using a tool whose listed description is brief and you need the full field list. Params: - tool_name (string, required) — the tool to describe (a name from search_tools or the tool list).
List your available Upwork accounts (Freelancer, Client, Agency). Call this first.
App-only tool that persists files uploaded through the inline MCP App UI. The model does not call this tool.
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Upwork alternatives on ChatGPT?
As of 2026-09-02, Upwork competes with GetMeDesign, Hacesfalta, NannyFYI, Simera, ココナラ in ChatGPT Talent Marketplaces & Freelance Hiring, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.