Skip to main content
Glama
522,894 tools. Updated 2026-09-06 13:24

"Freelancer" matching MCP tools:

  • 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); task_id (string, required — the task_id returned by start_attachment_upload for these files). Only file_uid values that get_upload_status reports as done for that task_id can be confirmed; anything else is refused. Upload sessions last 30 minutes, so confirm promptly. Files uploaded through the inline component are already stored and must NOT be confirmed. Use the same context as the upload session that produced the file_uid values.
    ConnectorOAuth
  • 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.
    ConnectorOAuth
  • 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).
    ConnectorOAuth
  • 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; if requiring all of them yields no matches the tool relaxes the broadest skill by ontology and retries, falling back to list order when the ontology cannot rank them, so list the most important first. The response then carries a note naming which skills were relaxed and which are still required — relay it so the user knows what was given up), 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 public profile: skills, employment and education history, job aggregates (completed jobs, total earnings, feedback), portfolio projects when readable — check portfolio_available and relay the note when it is false — and the per-contract work history in work_history (AGEX-1733): each contract's title, dates, status, amount earned and the client's review. Check work_history_available and relay work_history_note when it is false; an absent section is NOT evidence the freelancer has no contracts. Params: profile_key (string — starts with ~ e.g. ~01abc123, from search results) or person_id (string — the numeric user.id returned by list_client_proposals); supply either one. 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: Recommend freelancers for one of the client's own job postings, ranked by Upwork's own matching for that job — the same list the "Invite freelancers" page shows. Prefer this over find_freelancers action=search whenever the client has a job posting: the ranking uses the whole posting, not a keyword query. Params: job_id or job_posting_id (string, required — a numeric owned posting ID from get_job_posting action=list; the posting must belong to the selected organization), query (string, optional — free text that RE-RANKS the recommendations toward those terms. It is a relevance boost, not a filter: the list stays the same size and may still contain profiles that do not mention the terms, so do not promise the user it excludes anything. Use the real filters below when they need a hard constraint), skills (array of string, optional — folded into the same free-text boost; the posting's own skills already inform the ranking), available_now (boolean), hire_me_now (boolean), country (string), state (string), region (string — continent, e.g. Europe), subregion (string — UN subregion), languages (array of string — language codes, e.g. en, es), english_level (basic/conversational/fluent/native, or a rank 1-4), job_success_min (number, 0-100 — the UI presets are 80 and 90), top_rated (boolean), top_rated_plus (boolean), rising_talent (boolean), rate_min / rate_max (number — hourly rate range), earnings_min / earnings_max (number — total earned, USD), hours_billed_min / hours_billed_max (number), limit (integer, 1–10, default 10), offset (number, default 0), use_job_category (boolean, default false — set true to additionally scope results to the job's own category, as the Invite Freelancers page's preselected filter does. The job id already drives the ranking, so this only narrows the pool; it is not needed for relevance). WHEN PRESENTING RESULTS, show for each freelancer the fields that are present, because these are what the Upwork page itself shows and the user is comparing against it: name, title, country, hourly_rate, total_earnings (already bucketed for display, e.g. "$50K+" — present it as given, never as an exact figure), job_success_score (as a Job Success percentage), top_rated (the talent badge — Top Rated Plus, Top Rated or Rising Talent), available_now, and recommendation_reason. Do not silently drop the badge or the earnings when they are present. A row with boosted=true is a PAID AD PLACEMENT: say so using boosted_label, and never present it as a purely earned ranking — organic_position gives the rank it would have held unpaid. When preselected_filters is present, tell the user which filters came from their job post and that they can be dropped. Results are LEAN CARDS: no description, no skills list. Call get_profile with profile_key for full detail. person_id is the freelancerId for invite_freelancer; profile_key (starts with ~) is for get_profile. Do not interchange them. 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. - smart_search_keywords: Keyword search for freelancers built from a job posting's skills. SUPERSEDED by action=smart_search, which asks Upwork for the actual recommendations for the job; use this only when explicitly asked to compare the two rankings. It reads the posting's classification skills, folds them into one free-text query and runs the generic freelancer search, so it cannot surface recommendation reasons or boosted placements. Params: job_id or job_posting_id (string, required — owned posting ID from get_job_posting action=list).
    ConnectorOAuth
  • 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.
    ConnectorOAuth
  • 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).
    Connector
    Destructive
    OAuth

Matching MCP Servers

Matching MCP Connectors

  • 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, fallback_url and expires_at. After the user submits files in the inline UI, poll get_upload_status with task_id until status is ok. The session expires 30 minutes after it is created: keep the task_id, and if the user has not finished by then start a new upload rather than trying to confirm against the expired one.
    ConnectorOAuth
  • Evaluate S-Corporation tax election viability by calculating reasonable officer salary split, SECA/FICA payroll tax shield, administrative overhead costs, and net tax savings under IRS Rev. Rul. 74-44. Behavior: Deterministic, idempotent calculation with zero external side effects. Splits net business profit into W-2 officer wages and Schedule K-1 shareholder distributions. Applies 15.3% FICA to salary only (exempting distributions), accounts for employer-half FICA deduction, deducts annual CPA corporate filing and payroll processing fees, and computes the mathematical breakeven net profit threshold. Usage Guidelines: Use when a US small business owner, single-member LLC, or high-earning freelancer is considering electing S-Corp status to reduce self-employment taxes. Do not use for retirement account contribution limits; use solo_401k_shield instead.
    ConnectorNo auth
  • Solve the exact minimum billable hourly rate required to achieve a target net spendable cash income, factoring in unpaid weeks, non-billable administrative drag, deductible overhead, health insurance, and SECA self-employment taxes. Behavior: Deterministic, idempotent calculation with zero external side effects. Numerically solves the gross revenue needed so that Gross - Expenses - Health - SECA Tax - Income Tax equals Target Net Cash. Divides required gross revenue by actual billable hours (accounting for vacation weeks and non-billable admin/marketing percentage) to derive the hourly billable floor. Usage Guidelines: Use when a freelancer, consultant, or agency owner wants to set their baseline hourly rate to support their personal lifestyle budget. Do not use when directly benchmarking against a specific W-2 salary offer; use contractor_parity instead.
    ConnectorNo auth
  • Accept a specific bid on a job, as that job's poster. Moves the job to in_progress. Only the job's poster can do this -- the bidder accepting their own bid is rejected, as is anyone who isn't the poster. Charges the poster the full bid amount into escrow; requires a saved payment method, and the bidder must have a completed Stripe Connect payout account (checked again here even though submit_bid already required it, since time can pass between the two).
    Connector
    Destructive
    No auth
  • Withdraw your own bid on a job, as the bidder who placed it. Only possible while the job is still open and your bid hasn't been accepted. No reason required. This is permanent and cannot be undone: once you withdraw, you cannot bid on that job again, and there is no way to replace or restore the withdrawn bid. Do not withdraw in order to re-bid at a different amount -- the second bid will be rejected with already_bid.
    Connector
    Destructive
    No auth
  • Quantify cross-border payment fee drag and calculate net landed local currency across 6 global payout rails (Wise, Deel, Stripe, Payoneer, PayPal, and SWIFT wire) against mid-market FX benchmark rates. Behavior: Deterministic, idempotent calculation with zero external side effects. Models fixed per-transaction wire fees, percentage platform fees, and hidden foreign exchange percentage spreads for each provider. Returns ranked table with landed payout amounts, total drag percentage, hidden FX markup, and savings versus worst-case rail. Usage Guidelines: Use when an international freelancer, remote worker, or cross-border vendor needs to determine the cheapest payout rail or invoice amount in USD. Do not use for domestic US employee vs contractor parity; use contractor_parity instead.
    ConnectorNo auth
  • Use this when a freelancer or business owner asks how much estimated tax to pay or whether they are underpaid for the year. Computes federal self-employment and income tax on annualized income, the safe-harbor target, per-quarter amounts and due dates, plus California's 30/40/0/30 installment timing.
    ConnectorNo auth
  • List jobs on Freelance Clearing (equivalent to the Browse page's Jobs tab). Defaults to OPEN jobs only, which are the ones you can bid on -- pass status to reach in-progress, completed or cancelled work, all of which is public record. Results are paginated; read the pagination block rather than assuming the first page is everything.
    ConnectorNo auth
  • List what one user has posted and bid on -- the same lists the website's profile page shows to anyone. Same shape as get_my_jobs: one merged list of rows tagged role 'poster' or 'bidder', with the same pagination. A bidder row carries is_accepted, which is how you find the jobs somebody actually WORKED ON rather than merely bid for. Note that bids on jobs that are still OPEN are not shown for anybody but yourself -- bidding is sealed until a job leaves the open state, so this returns fewer bidder rows for another user than it does for you.
    ConnectorNo auth
  • Send a message on a job to a specific other participant. If you're the poster, the recipient must be someone who has actually bid on the job. If you're a bidder, the recipient must be the poster.
    Connector
    Destructive
    No auth
  • Ask the poster to close an in-progress job, as the freelancer working on it. Use this after delivering, when the poster has gone quiet. It starts a 7-day clock: if the poster marks the job complete or cancels it, that resolves the job normally, and if the poster sends any message on the job the request is cleared and you can ask again later. Only the accepted freelancer on the job may call this, and only while the job is in progress. Asking again while a request is already pending does nothing and does not restart the clock: the original request time is returned unchanged. Returns close_requested_at and the derived releases_at. releases_at is the EARLIEST moment the release can happen, not an appointment: a sweep runs hourly, so the job resolves at or shortly after it. Do not treat a job still in progress one second past releases_at as a fault.
    ConnectorNo auth
  • 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.
    Connector
    Destructive
    OAuth
  • Calculate tax liabilities, statutory benefits, and net take-home cash between W-2 salaried employment and 1099 independent contractor billing, solving the exact breakeven billing rate ($/hr). Behavior: Deterministic, idempotent calculation with zero external side effects. Computes federal FICA (Social Security up to statutory wage base and Medicare), federal income tax brackets, state income tax, employer health subsidy, 401(k) match, PTO value, SECA tax with 50% above-the-line deduction, and Section 199A QBI deduction. Returns net spendable cash for both employment models, complete tax breakdowns, effective tax rates, and the exact breakeven hourly rate. Usage Guidelines: Use when an individual or hiring manager is deciding between a W-2 salaried offer and a 1099 contractor contract. Do not use for solo freelancer baseline rate setting without a W-2 benchmark; use billable_floor instead.
    ConnectorNo auth
  • Fetch full detail for a single job by id, regardless of its status (open, in progress, completed, or cancelled). Two close-request fields: close_requested_at is set while the accepted freelancer has asked the poster to close, and is cleared if the poster sends any message on the job; auto_released_at is set only if that request ran its full 7 days unanswered and the payment was released automatically. A completed job with auto_released_at set was never marked complete by the poster.
    ConnectorNo auth
  • List the bids on a job. While the job is still open, only the job's poster can see the list (so bidders can't see each other's pitches) -- calling this as anyone else fails with an error rather than returning an empty list, so you can tell 'not visible to you' apart from 'genuinely no bids yet.' Once the job is no longer open (in_progress, completed, or cancelled), bid history is public to everyone. Each bid includes the bidder's rating average and count.
    ConnectorNo auth