upwork-mcp
Integrates with Upwork's GraphQL API to provide tools for job searching, proposal management, profile tracking, contract monitoring, and analytics, enabling AI agents to manage freelancer activities on Upwork.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@upwork-mcpsearch for remote frontend jobs under $5000"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Upwork MCP Server
A Model Context Protocol server that connects AI agents to Upwork's GraphQL API — enabling job discovery, proposal management, profile tracking, and analytics.
Features
Official API Integration: Uses Upwork's GraphQL API with OAuth 2.0 authentication
Job Search: Search and filter job postings with advanced criteria
Proposal Management: Submit, update, track, and withdraw proposals
Saved Jobs: Bookmark jobs for later review and get personalized recommendations
Profile Management: View your freelancer profile, skills, and completeness
Contract Tracking: Monitor active contracts and earnings
Time Reports: Query work history and time logs
Rate Limiting: Built-in rate limiting to stay within API quotas
Type-Safe: Written in TypeScript with full type definitions
Related MCP server: ClickUp MCP Server
Quick Start
Option 1: npm (Recommended)
# Install globally
npm install -g @furkankoykiran/upwork-mcp
# Or use with npx (no installation needed)
npx @furkankoykiran/upwork-mcpOption 2: With Claude Code (One-Line Setup)
claude mcp add upwork -- npx -y @furkankoykiran/upwork-mcpThen set your credentials:
export UPWORK_CLIENT_ID="your_client_id"
export UPWORK_CLIENT_SECRET="your_client_secret"And authenticate:
npx @furkankoykiran/upwork-mcp authOption 3: From Source
git clone https://github.com/furkankoykiran/upwork-mcp.git
cd upwork-mcp
npm install
npm run buildAuthentication
1. Get API Credentials
Go to Upwork Developer Portal
Create a new API application
Note your Client ID and Client Secret
2. Configure and Authenticate
# Set your credentials as environment variables
export UPWORK_CLIENT_ID="your_client_id"
export UPWORK_CLIENT_SECRET="your_client_secret"
# Run authentication
npx @furkankoykiran/upwork-mcp authThis will:
Open your browser with the Upwork OAuth authorization page
Wait for you to log in and authorize the application
Save your access token locally
3. Verify Authentication
npx @furkankoykiran/upwork-mcp checkConfiguration
The server requires the following environment variables:
Variable | Description | Required |
| Your Upwork OAuth Client ID | Yes |
| Your Upwork OAuth Client Secret | Yes |
| Upwork GraphQL API URL (default: https://api.upwork.com/graphql) | No |
With Claude Code
Add to your MCP configuration (~/.config/claude-code/settings.json):
{
"mcpServers": {
"upwork": {
"command": "npx",
"args": ["-y", "@furkankoykiran/upwork-mcp"],
"env": {
"UPWORK_CLIENT_ID": "your_client_id",
"UPWORK_CLIENT_SECRET": "your_client_secret"
}
}
}
}Available Tools
Profile Tools (4 tools)
Tool | Description |
| Get your freelancer profile, skills, rate, and Job Success Score |
| Check profile completeness score and missing fields |
| List all skills on your profile |
| Get your current connects balance |
Job Search Tools (2 tools)
Tool | Description |
| Search job postings with filters (keyword, budget, category, etc.) |
| Get full details of a specific job posting |
Proposal Tools (6 tools)
Tool | Description |
| List your submitted proposals with status filter |
| Get detailed proposal information including cover letter |
| Submit a new proposal (uses Connects) |
| Update an existing proposal (pending only) |
| Withdraw a submitted proposal |
| Get proposal statistics and success rates |
Saved Jobs Tools (3 tools)
Tool | Description |
| List your saved/bookmarked jobs |
| Save or unsave a job to bookmarks |
| Get personalized job recommendations |
Contract Tools (2 tools)
Tool | Description |
| List your active and past contracts |
| Get detailed information about a specific contract |
Analytics Tools (1 tool)
Tool | Description |
| Get time report for work history and hours logged |
Total: 18 tools
Example Usage
Search for Jobs
Search for Upwork jobs with keyword "TypeScript" and hourly rate between $50-$100Submit a Proposal (with Dry Run)
Submit a proposal for job ~0123456789012345678 with cover letter "I am experienced..." bid amount $75 hourly, dry_run=trueList Proposals
List my pending Upwork proposalsSave a Job
Save job ~0123456789012345678Get Job Recommendations
Get personalized job recommendationsSafety Features
Dry Run Mode
All mutation tools (submit_proposal, update_proposal, withdraw_proposal) support a dry_run parameter that previews the action without executing it:
{
"job_id": "~0123456789012345678",
"cover_letter": "Your cover letter here...",
"bid_amount": 50,
"bid_type": "hourly",
"dry_run": true
}Validation
Cover letters must be 50-5000 characters
Bid amounts must be greater than 0
Proposal updates only work on pending proposals
Rate Limits
The server implements conservative rate limiting to avoid exceeding Upwork's API quotas:
10 requests per second
300 requests per minute
40,000 requests per day
Rate limits are automatically enforced with token bucket algorithm.
Troubleshooting
Authentication Issues
# Clear existing token
npx @furkankoykiran/upwork-mcp logout
# Re-authenticate
npx @furkankoykiran/upwork-mcp authToken Expired
The server automatically attempts to refresh tokens when they expire. If this fails:
npx @furkankoykiran/upwork-mcp authRate Limit Errors
If you hit rate limits, the server will automatically retry with exponential backoff. For persistent issues, wait a few minutes before retrying.
Development
# Clone the repository
git clone https://github.com/furkankoykiran/upwork-mcp.git
cd upwork-mcp
# Install dependencies
npm install
# Watch mode (rebuilds on changes)
npm run dev
# Run tests
npm test
# Lint code
npm run lint
# Format code
npm run formatSee CONTRIBUTING.md for detailed contribution guidelines.
Project Structure
upwork-mcp/
├── src/
│ ├── index.ts # MCP server entry point
│ ├── auth/ # OAuth 2.0 authentication
│ ├── client/ # Upwork API client with rate limiting
│ ├── queries/ # GraphQL queries and mutations
│ ├── tools/ # MCP tool implementations
│ └── types/ # TypeScript type definitions
├── .github/
│ ├── workflows/ # CI/CD workflows (CI, CodeQL, Release, Stale)
│ ├── pull_request_template/
│ ├── ISSUE_TEMPLATE/ # Issue templates (Bug, Feature, Question)
│ ├── CONTRIBUTING.md # Contribution guidelines
│ ├── CODE_OF_CONDUCT.md # Community guidelines
│ ├── SECURITY.md # Security policy
│ └── SUPPORT.md # Support guidelines
├── dist/ # Compiled output (gitignored)
├── node_modules/ # Dependencies (gitignored)
├── eslint.config.js # ESLint configuration
├── tsconfig.json # TypeScript configuration
├── package.json # Project metadata
├── CHANGELOG.md # Version history
├── LICENSE # MIT License
└── README.md # This fileLicense
MIT © Furkan Köykıran - see LICENSE file for details.
Links
Acknowledgments
fieldjoshua/upwork-mcp-server - Reference for GraphQL mutations
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/furkankoykiran/upwork-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server