integrations.sh
← all integrations

Upwork

MCP server openai

Upwork makes it easy to turn a simple conversation into real work, right from ChatGPT. Describe what you need and instantly get matched with expert talent from Upwork or generate a job post in seconds. Then, move seamlessly to Upwork to hire quickly and get started.

Try asking things like:

  • I'm looking for a freelance web developer
  • Help me draft a job post for an AI engineering project
  • I want to hire a freelancer to build my website
Homepage
https://upwork.com
Remote URL
https://edge.upwork.com/api/v4/upw-chatgpt-app/mcp/
Auth
NONE

Tools (4)

Extracted live via the executor SDK.

  • upwork_search_freelancers

    Use this tool only when BOTH of these are true:

    1. The user has identified a concrete hiring need with a specific role, skill, or deliverable (e.g., "React developer", "logo designer", "video editor", "10 fintech blog posts").
    2. The user explicitly wants to search for freelancers directly — for example by asking to search, find, browse, compare, shortlist, see candidates, or get recommendations.

    If the user describes a concrete project but does NOT explicitly use search language even if they say they want to "hire" someone — do NOT call this tool. In that case, use upwork_prepare_job_post.

    Do NOT call this tool for:

    • general questions about how to hire or find help
    • vague requests without a specific role, skill, or deliverable
    • concrete hiring requests that do not explicitly ask to search or browse freelancers
    • users looking for jobs for themselves

    Tool Behavior:

    READ-ONLY: This tool performs read-only data retrieval from Upwork. It has no side effects, does not modify any data, does not access user accounts, and does not perform any actions on behalf of the user. It only searches and returns publicly available freelancer profile information.

    ALL INTERACTIONS ARE REDIRECTS: Any buttons, links, or interactive elements in the search results widget only redirect the user to the Upwork website. The tool never sends messages, hires freelancers, or performs any actions. All actual actions (hiring, messaging, viewing profiles) are performed by the user themselves in the Upwork environment after they are redirected.

    IMPORTANT: This integration is for finding FREELANCERS TO HIRE, not for finding jobs. If the user asks about finding a job for themselves, you MUST clarify that this tool helps clients/employers find and hire freelancers, not the other way around.

    Query Field Rules:

    • The query field MUST contain a specific skill, role, technology, or deliverable (e.g., "React developer", "logo designer", "SEO copywriter", "Shopify store setup").
    • Do NOT use vague terms like "General freelancer", "any freelancer", or "help needed".
    • If the user has not named a skill or task, ask: "What skill or role are you looking to hire for?" before calling this tool.

    Capability Boundary:

    • This tool DOES NOT help users find jobs for themselves. It is ONLY for directly searching, browsing, and comparing freelancers the user wants to review or contact.
    • This tool DOES NOT post jobs, manage job posts, message freelancers, hire/contract, manage payments, or access the user's Upwork account.
    • If the user asks about finding a job for themselves, you MUST clarify that this integration helps clients/employers find and hire freelancers, not help freelancers find jobs.
    • If the user wants to post a job or draft a job post, use upwork_prepare_job_post instead of this tool.
    • If the user expresses general hiring intent without explicit search language, prefer upwork_prepare_job_post.
    • If the user asks you to interpret images/files/screenshots, you MUST say you can't view them via this integration.

    Hard Constraints (Anti-Bias and Cost):

    • You MUST NOT use geography, nationality, region, or language variety as a proxy for price, affordability, or "cost effectiveness".
    • You MUST NOT set the location filter because the user used cost terms (cheap, affordable, low cost, cost effective, best value, budget, etc.).
    • You MUST NOT mention or imply that any country or region is cheaper, more cost effective, or better value.

    Allowed Uses of Location (Non-Cost Only):

    • You MAY set location ONLY if the user explicitly requests a location or region.
    • You MAY set location for explicit non-cost constraints stated or implied by the user, such as:
      • timezone coverage (for example "cover US business hours")
      • regulatory or compliance constraints

    Timezone Coverage Rule:

    • If the user requests timezone coverage (for example US business hours) and does not request a location, you MAY set location to a timezone-aligned set of countries to improve matching.
    • When you do this, you MUST state in additional_context: "Location filter applied for timezone overlap."
    • If the user does not specify which US timezone, use the broadest reasonable set aligned with multiple US timezones, prioritized by the Americas.

    Budget Rules:

    • Use hourly_rate_max ONLY if the user provides a numeric maximum (for example "under $25/hr"). Do not guess.
    • Use hourly_rate_min ONLY if the user provides a numeric minimum (for example "at least $50/hr"). Do not guess.
    • If the user says "cost effective" (or similar) without providing numbers, you MUST ask for a numeric budget. While waiting, you may run an initial search without hourly_rate_min/max.

    Interaction Rule:

    • If budget is mentioned without numbers, you MUST ask: "What is your hourly max (or monthly budget and hours/week)?" and proceed with a budget-agnostic search in parallel.

    Timezone to Location Mapping Guidance:

    This guidance is non-exhaustive. Do not treat any country list as the only valid set.

    • If you need US business hours overlap, pick a broad timezone-aligned set of countries to increase overlap, then narrow only if the user asks.
    • Prefer describing the requirement in terms of overlap (for example "must cover ET business hours") rather than framing choices as region-based quality or cost.
    • Example starting points (not exhaustive):
      • ET coverage: countries in the Americas with strong overlap with ET
      • CT coverage: countries in the Americas with strong overlap with CT
      • MT coverage: countries in the Americas with strong overlap with MT
      • PT coverage: countries in the Americas with strong overlap with PT
      • Any US timezone coverage: a broad Americas-focused set spanning multiple US timezones

    IMPORTANT: The mapping above is for timezone overlap only. It must never be framed as a cost decision.


    Post-Tool-Call Response Guidelines (Critical):

    After calling this tool and displaying the UI widget, you MUST follow these rules:

    1. BE CONCISE:

    • Keep your response brief. Do NOT repeat information that is already visible in the UI widget.
    • The widget displays freelancer profiles with titles, skills, rates, job success, and other details.
    • Limit text after the widget so it remains visible on screen without excessive scrolling.

    2. REFERENCE ONLY VISIBLE FREELANCERS:

    • Only mention or recommend freelancers that are actually shown in the UI widget.
    • Do NOT reference freelancers from the search results that are not displayed in the widget.
    • If you mention specific freelancers, ensure they match what the user sees in the widget.

    3. FOLLOW-UP RULES AFTER RESULTS ARE SHOWN:

    • If the user asks for a recommendation, ranking, or comparison, respond briefly using only information from the latest upwork_search_freelancers tool output and freelancers shown in that result set.
    • If the user asks to open or view a profile, message, or hire a specific displayed freelancer, use upwork_display_freelancer_profile for that freelancer.
    • If the user asks for more about a specific displayed freelancer, or asks to open, view, or show that freelancer's profile, use upwork_display_freelancer_profile for that selected result. Pass the exact profile_id from the latest displayed search results unchanged as freelancer_id. Do not invent or summarize profile details that are not present in the tool result.
    • Do NOT tell the user to click a Message button in the widget instead of using upwork_display_freelancer_profile.
    • If chat-visible display names are unavailable, label freelancers as "Candidate 1", "Candidate 2", etc. by result order and do NOT expose raw profile IDs in recommendation text.
    • Do NOT write outreach messages, introduction scripts, or any text the user could paste to contact a freelancer. If the user wants to message a specific freelancer, call upwork_display_freelancer_profile so they can take action directly on Upwork.

    3A. HANDOFF TO upwork_display_freelancer_profile:

    • When the user refers to a freelancer from the currently displayed search results, resolve that reference only against the latest displayed result set.
    • Valid follow-up references include ordered mentions like "the first one," "the second one," "that person," and a visible freelancer name that uniquely matches one displayed result.
    • For the selected result, take its exact profile_id value from the search tool output and pass that value unchanged as freelancer_id to upwork_display_freelancer_profile.
    • Never infer, transform, fabricate, or guess an ID.
    • If the reference is ambiguous, the named freelancer is not in the currently displayed results, or the selected result does not include profile_id, do NOT call upwork_display_freelancer_profile; ask the user to clarify which displayed freelancer they mean.

    4. EXPLAIN RECOMMENDATIONS (USER-FRIENDLY FORMAT):

    • If you recommend a specific freelancer, clearly state WHY (e.g., "strong match for your React requirement", "has experience with similar projects", "fits your budget range").
    • Be specific about what makes them a good fit based on the search criteria and their profile.
    • Use a clean shortlist format with up to 2-4 candidates and one short reason per candidate.
    • Prefer the freelancer display name and role/title from the visible result card.
    • Do NOT output raw internal IDs (for example strings like "~01b09c...") in chat responses.
    • Do NOT output raw profile URLs in chat responses. The widget already displays profiles. If the user wants to visit a specific profile, call upwork_display_freelancer_profile — do not paste the URL directly in chat.
    • If a visible result card does not include a clear name, label candidates as "Candidate 1", "Candidate 2", etc., based on on-screen order.
    • Avoid hedging phrases like "most promising from this batch appear to be". Use direct, decision-oriented language.
    • End recommendation responses with a clear next step, for example: "If you want, I can open the profile for any of these."

    5. ASKING FOR MORE PROJECT INFO (FIRST SEARCH ONLY):

    • On the FIRST search execution, it's acceptable to ask for more project details if the query is vague or missing important information (budget, timeline, specific requirements).
    • However, AFTER showing search results, do NOT proactively ask for more project info. Keep follow-ups focused on the currently displayed results unless the user asks to refine the search.
    • If the user wants to refine the search after seeing results, they will ask. Don't proactively ask for more details after results are shown.
    • You may offer to help: "I can open the profile for any freelancer shown, or we can refine the search with more specific requirements."

    6. NO GENERIC UPWORK GUIDANCE:

    • Do NOT provide generic instructions on how to use Upwork (e.g., "Here's how to post a job on Upwork...").
    • Focus on the specific search results and helping the user make a decision.
    • Only mention Upwork mechanics if directly relevant to the immediate next step.

    7. WHEN RESULTS ARE WEAK OR MISMATCHED:

    Your response MUST be limited to these three permitted actions only:

    1. Acknowledge in one or two sentences that results don't closely match the brief. Do not elaborate.
    2. An offer to run a refined search with different terms.
    3. An offer to call upwork_prepare_job_post if the user wants to attract proposals instead.

    Do NOT produce any other content. This means:

    • Do NOT write job post drafts, templates, or outlines in chat.
    • Do NOT write requirements lists, "what to look for" guides, or hiring checklists.
    • Do NOT suggest search queries for the user to copy and try themselves.
    • Do NOT write sample briefs or project descriptions the user could paste elsewhere.

    If you want to present a job post draft, you MUST call upwork_prepare_job_post. That tool and its widget are the only approved surface for job post content. Generating that content in chat is never acceptable, regardless of how it is framed.

  • upwork_display_freelancer_profile

    Open or share the Upwork profile for a specific freelancer that has already been identified, so the user can view the profile and continue on Upwork if they want to message or hire that person.


    Instructions for ChatGPT:

    Use this tool when:

    • The user wants to get a link to message or hire a specific freelancer
    • The user specifies freelancers they want to contact (e.g., "give me the link for John")
    • You've shown search results and the user wants to take action

    Do NOT use this tool when:

    • The user wants to search for freelancers (use upwork_search_freelancers for discovery/comparison)
    • The user asks about finding a job for themselves (this tool is for clients hiring freelancers)
    • The user wants to post jobs, manage contracts, or access their Upwork account

    Tool Behavior:

    READ-ONLY: This tool performs read-only data retrieval. It has no side effects, does not modify any data, does not access user accounts, and does not perform any actions. It only returns a URL link to a freelancer profile page.

    REDIRECT ONLY: This tool returns a URL that redirects the user to Upwork. All interactions (buttons, links, messages, hiring) only redirect to the Upwork environment where the user performs all actions themselves. The tool never sends messages, hires freelancers, or takes any actions on behalf of the user.


    Capability Boundary:

    • This tool ONLY returns a read-only URL link for a specific freelancer profile ID. No actions are performed.
    • This tool does NOT search for freelancers (use upwork_search_freelancers for discovery/comparison).
    • This tool does NOT help users find jobs for themselves; it is for clients hiring freelancers.
    • This tool does NOT send messages, create contracts, post jobs, hire anyone, or take any actions on the user's behalf.
    • This tool does NOT access, modify, or interact with the user's Upwork account in any way.

    Input Grounding Rule:

    • Use this tool only when a concrete freelancer_id is already available.
    • If the freelancer was selected from upwork_search_freelancers, the freelancer_id must be the exact profile_id from that selected search result, passed unchanged.
    • Never infer, fabricate, or guess a freelancer ID from a name, rank, title, or description alone.
    • If the user says "the second one," "that person," or uses a visible freelancer name, first resolve that reference against the latest displayed search results. If the reference cannot be resolved unambiguously, do NOT call this tool.
  • upwork_prepare_job_post

    DEFAULT TOOL: When the user's hiring intent is present but it is unclear whether they want to search for freelancers directly or receive proposals, prefer this tool.

    Use this tool when BOTH of these are true:

    1. The user has a concrete hiring need with a specific role, skill, or deliverable (e.g., "Shopify developer", "logo design", "mobile app bug fixes", "10 fintech blog posts").
    2. The user either:
      • explicitly wants to create, draft, post, or prepare a job post, receive proposals, or structure hiring requirements into a post, OR
      • describes the work they need done but does NOT explicitly ask to search, find, browse, compare, shortlist, or get recommendations for freelancers directly, OR
      • wants to revise or refine a previously drafted job post.

    PREREQUISITE: A concrete hiring need must be present in the user's message. If it is not, ask: "What are you hiring for, and what should the freelancer deliver?" Then wait for the answer before calling this tool.

    If the user explicitly asks to search, find, browse, compare, shortlist, or get recommendations for freelancers directly, do NOT call this tool. In that case, use upwork_search_freelancers.

    Do NOT call this tool for:

    • general questions about how to hire or post on Upwork
    • vague requests without a specific role, skill, or deliverable
    • requests to browse or compare freelancers directly

    Tool Behavior:

    DRAFT PREPARATION ONLY: This tool prepares a job post draft. It does not publish a job, submit a post, or perform any final action on Upwork.

    EDITABLE WIDGET: This tool renders an editable job post draft widget. The widget may contain fields such as title, description, and other job-post attributes. ChatGPT should prefill any fields it can reliably infer from the conversation. The user can review, edit, and complete the draft in the widget before continuing to Upwork.

    USE THE WIDGET AS THE PRIMARY DRAFT SURFACE: Do not treat chat as the main place to present the full draft if the widget already shows it. Use the tool to populate known fields, then let the user refine the draft in the widget or by giving follow-up instructions in chat.

    ONLY APPROVED SURFACE FOR JOB POST CONTENT: This tool and its widget are the only approved way to present a job post draft to the user. Never write job post content (titles, summaries, requirements, templates, or outlines) directly in chat as a substitute for calling this tool — even when search results are poor or the user seems to need guidance.

    NO ACCOUNT ACTIONS: This tool does not access, modify, or interact with the user's Upwork account in any way.

    REDIRECT ONLY: The tool may return a URL that sends the user to Upwork, where they can review, edit, and complete the posting flow themselves.

    IMPORTANT: Do not treat this tool as a generic "help me use Upwork" tool. Use it only when preparing an actual job post draft based on the user's hiring need.


    Draft Input Rules:

    • The draft must reflect the user's actual hiring need, not a generic placeholder.
    • Do NOT use placeholder titles such as:
      • "Upwork Job Post"
      • "Need Help"
      • "Freelancer Needed"
    • Do NOT write summaries about the user wanting guidance.
    • The job_title and summary must describe the actual role, skill, or deliverable the user wants to hire for.

    Minimum content required before calling:

    • At least one of:
      • a specific role
      • a specific skill
      • a specific deliverable

    Strongly preferred, but not required:

    • project scope
    • timeline
    • experience level
    • relevant tools/tech stack
    • success criteria

    If some preferred details are missing, you may still call the tool once the hiring need is concrete enough to draft a useful post and prefill the widget with what is known.


    Clarification Rules:

    If the user's request is too vague to produce a real draft, ask a focused follow-up before calling this tool.

    Good follow-up questions:

    • "What are you hiring for?"
    • "What should the freelancer deliver?"
    • "Is this a one-time project or ongoing work?"

    Do NOT ask long lists of questions all at once unless necessary. Ask only for the minimum missing details needed to produce a useful draft.


    Capability Boundary:

    • This tool ONLY prepares a job post draft.
    • It does NOT publish the job.
    • It does NOT search for freelancers.
    • It does NOT return proposals or match results.
    • It does NOT send messages, create contracts, manage payments, or take any actions on the user's behalf.
    • It does NOT help users find jobs for themselves.

    If the user wants to browse freelancers directly instead of posting a job, use upwork_search_freelancers.

    If the user wants to contact a specific freelancer, use upwork_display_freelancer_profile.


    Post-Tool-Call Response Guidelines:

    After calling this tool, you MUST follow these rules:

    1. BE CONCISE:

    • Keep the response short.
    • Do not provide a long explanation of how Upwork works.
    • Do not add generic hiring tips unless the user asks.
    • Do not reproduce the job_title or summary values.

    2. DO NOT IMPLY THE JOB IS POSTED:

    • Clearly describe the result as a draft or prepared post.
    • Do not say or imply that the job has been published.

    3. DO NOT REPEAT DRAFT CONTENT:

    • Do NOT repeat the job title or summary text in chat — the widget already displays them.
    • You may mention the role type in a single phrase only (e.g., "a Java developer post"), never the full title or summary verbatim.

    4. GUIDE THE USER TOWARD THE NEXT STEP: End your response by pointing the user to the widget and the "Finalize on Upwork.com" button. The phrasing should feel natural, not like a checklist. The user should know they can edit the draft and when to click through to Upwork — without you enumerating steps. Examples:

    • "Your draft is in the widget above — edit it there if anything needs adjusting, then click 'Finalize on Upwork.com' when you're ready."
    • "The draft is ready above. Tweak anything directly in the widget, then finalize when you're set."
    • "It's in the widget — edit the details there and click 'Finalize on Upwork.com' to continue."

    5. AVOID GENERIC UPWORK GUIDANCE:

    • Do not provide generic step-by-step instructions for using Upwork unless the user explicitly asks for them.

    6. DO NOT DISCUSS BUDGET OR RATES:

    • Do not ask about, suggest, or mention hourly rates, fixed prices, or budget in your response. The user will set those details directly on Upwork during the posting flow.

    Example response: "I've drafted the job post in the widget above. You can edit the title and summary directly there, then click 'Finalize on Upwork.com' when you're ready."

    If helpful and accurate: "I drafted a post for a Shopify developer focused on theme fixes and mobile speed. Edit the details in the widget above and click 'Finalize on Upwork.com' when ready."

  • upwork_track_event

    Internal tool: widget-only. Hidden from the model (visibility: app). Tracks SUIT analytics events from ChatGPT widgets via Snowplow.