Freelance MCP Server
Allows searching for freelance gigs, generating AI-powered proposals, negotiating rates, and optimizing profiles on Upwork.
Click on "Deploy 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., "@Freelance MCP Server Find Python freelance gigs under $1000"
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.
Freelance MCP Server - Installation and Usage Guide
A comprehensive freelance platform aggregator MCP server that helps users find gigs, generate proposals, negotiate rates, and optimize their freelance profiles using AI
š Documentation Quick Links
QUICK_REFERENCE.md - Quick commands & tool reference
VALIDATION_STATUS.md - Test results & production status
DEBUG_REPORT.md - Bug fixes & debugging summary
STRUCTURE.md - Project organization & file structure
FINAL_SUMMARY.md - Complete debugging summary
Related MCP server: Upwork MCP Server
š Quick Start for Claude Desktop Users
Want to use this with Claude Desktop right away? Follow these 3 steps:
Get a GROQ API Key (free): Visit console.groq.com, sign up, and create an API key
Add to Claude Desktop config - Edit your
claude_desktop_config.json:Windows:
%APPDATA%\Claude\claude_desktop_config.jsonMac:
~/Library/Application Support/Claude/claude_desktop_config.json
Add this to the
mcpServerssection (replace paths and keys with yours):{ "mcpServers": { "freelance": { "command": "uv", "args": [ "run", "--with", "mcp", "--with", "python-dotenv", "--with", "langchain-groq", "--with", "pydantic", "C:\\path\\to\\your\\freelance_server.py", "stdio" ], "env": { "GROQ_API_KEY": "gsk_your_key_here", "OWNER_COUNTRY_CODE": "1", "OWNER_PHONE_NUMBER": "5551234567" } } } }Restart Claude Desktop and start using commands like:
"Search for Python gigs under $1000"
"Show me freelance market trends"
"Generate a proposal for gig upwork_001"
Need more detailed instructions? See Integration with Claude Desktop below.
File Structure
mcp-server-1/
āāā freelance_server.py # Main MCP server (run this!)
āāā requirements.txt # Dependencies
āāā .env.example # Environment template
āāā README.md # This file
āāā STRUCTURE.md # Detailed structure guide
ā
āāā core/ # Core modules
āāā database/ # Database layer
āāā mcp_extensions/ # MCP protocol extensions
āāā utils/ # Utilities
ā
āāā tests/ # Test suite
āāā examples/ # Example code
āāā docs/ # Documentation
ā
āāā .github/ # GitHub templates & workflowsSee STRUCTURE.md for complete directory documentation.
Quick Start
1. Prerequisites
Python 3.8 or higher
pip package manager
Git (optional, for cloning repositories)
2. Installation
# Install required dependencies
uv pip install -r requirements.txt
# Or install individual packages
uv pip install mcp langchain-groq pydantic python-dotenv3. Environment Setup
Create a .env file in your project directory with your API keys:
# Windows
echo GROQ_API_KEY=your_actual_key_here > .env
echo OWNER_COUNTRY_CODE=1 >> .env
echo OWNER_PHONE_NUMBER=5551234567 >> .env
# Linux/Mac
cat > .env << EOF
GROQ_API_KEY=your_actual_key_here
OWNER_COUNTRY_CODE=1
OWNER_PHONE_NUMBER=5551234567
EOFRequired Environment Variables:
GROQ_API_KEY- Your Groq API key (get from https://console.groq.com/)OWNER_COUNTRY_CODE- Country code without + (e.g., 1 for US, 44 for UK)OWNER_PHONE_NUMBER- Phone number without country code or special charactersMCP_AUTH_TOKEN- (Optional) Authentication token for advanced setups
4. Get GROQ API Key
Visit Groq Console
Sign up or log in
Create a new API key
Copy it to your
.envfile
5. Run the Server
Option A: Test Server Directly (for development)
# Test server in stdio mode
python freelance_server.py stdio
# Or with uv and dependencies
uv run --with mcp --with python-dotenv --with langchain-groq --with pydantic freelance_server.py stdioOption B: Use with Claude Desktop (recommended)
See the Integration with Claude Desktop section below for full setup instructions.
6. Run the Client
# Check environment setup
python freelance_client.py --check-env
# Run automated demo
python freelance_client.py --mode demo
# Run interactive mode
python freelance_client.py --mode interactiveFile Structure
your-project/
āāā freelance_server.py # MCP Server (main server file)
āāā freelance_client.py # MCP Client (optional - for testing)
āāā freelance_client2.py # MCP Client (alternative implementation)
āāā main.py # Demo file
āāā requirements.txt # Dependencies
āāā .env # Environment variables (create this)
āāā README.md # This guide
āāā setup.py # Setup configurationUsage Examples
Automated Demo Mode (Recommended)
python freelance_client.py --mode demoThis will run through all features automatically:
š Gig searching and filtering
š¤ User profile creation and analysis
š AI-powered proposal generation
š° Rate negotiation strategies
š Code review with quality metrics
š Automated code debugging and fixing
ā” Profile optimization recommendations
š Resource access and market insights
Interactive Mode
python freelance_client.py --mode interactiveAvailable commands in interactive mode:
search- Search for matching gigsprofile- Create user profileanalyze- Analyze profile fit for gigsproposal- Generate AI proposalsnegotiate- Get rate negotiation helpreview- Review code qualitydebug- Debug and fix code issuesoptimize- Get profile optimization tipsresources- Access market datademo- Run full automated demoquit- Exit
Key Features Demonstrated
1. Gig Search and Matching
# Example: Search for React gigs under $1000
result = client.search_gigs(
skills=["JavaScript", "React", "TypeScript"],
max_budget=1000,
project_type="fixed_price"
)2. AI-Powered Proposal Generation
# Generate personalized proposals using ChatGroq LLM
proposal = client.generate_proposal(
gig_id="upwork_001",
user_profile=profile_data,
tone="professional"
)3. Code Review Tool
# Analyze code quality and get suggestions
review = client.code_review(
file_path="./src/component.js",
review_type="general"
)4. Code Debug Tool
# Automatically fix common code issues
debug_result = client.code_debug(
file_path="./buggy_code.js",
issue_description="Replace var with let/const",
fix_type="auto"
)5. Rate Negotiation
# Get AI-powered negotiation strategies
negotiation = client.negotiate_rate(
current_rate=40,
target_rate=65,
justification_points=["6+ years experience", "Proven track record"]
)Technical Architecture
MCP Communication Flow
Client (freelance_client.py)
āļø (stdio transport)
Server (freelance_server.py)
āļø (LLM calls)
ChatGroq API (Langchain integration)Server Capabilities
Tools: 10+ interactive tools for gig management
Resources: Market data and profile access
Prompts: Template-based interactions
LLM Integration: ChatGroq for AI features
Client Features
Async Communication: Full async/await support
Error Handling: Comprehensive error recovery
Demo Mode: Automated feature showcase
Interactive Mode: Manual command interface
Environment Validation: Setup verification
Troubleshooting
Common Issues
1. "ChatGroq not initialized" Error
# Make sure GROQ_API_KEY is set
python freelance_client.py --check-env
# Add your key to .env file
echo "GROQ_API_KEY=your_key_here" >> .env2. "freelance_server.py not found" Error
# Make sure the server file is in the same directory
ls -la freelance_server.py
# Or adjust the path in freelance_client.py3. Module Import Errors
# Install missing dependencies
pip install -r requirements.txt
# Or check what's missing
python freelance_client.py --check-env4. Server Connection Issues
# Make sure server file is executable
python freelance_server.py stdio # Test server directly
# Check for syntax errors in server file
python -m py_compile freelance_server.pyDebug Mode
Enable detailed logging by setting environment variable:
export MCP_DEBUG=1
python freelance_client.py --mode demoManual Server Testing
Test the server independently:
# Run server in stdio mode
python freelance_server.py stdio
# Run server with SSE transport
python freelance_server.py sse
# Run server with HTTP transport
python freelance_server.py streamable-httpAdvanced Usage
Custom Configuration
Modify freelance_client.py to customize:
Server connection parameters
Demo scenarios and data
Error handling behavior
Output formatting
Integration with Claude Desktop (Recommended)
Step 1: Create Environment File
Create a .env file in your project directory:
# Windows
copy NUL .env
# Linux/Mac
touch .envAdd your API keys to .env:
GROQ_API_KEY=your_groq_api_key_here
MCP_AUTH_TOKEN=your_optional_auth_token
OWNER_COUNTRY_CODE=1
OWNER_PHONE_NUMBER=5551234567Step 2: Get GROQ API Key
Visit Groq Console
Sign up or log in
Navigate to API Keys section
Create a new API key
Copy and paste it into your
.envfile
Step 3: Locate Claude Desktop Config
Windows:
%APPDATA%\Claude\claude_desktop_config.jsonMac:
~/Library/Application Support/Claude/claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
Step 4: Update Claude Desktop Config
Open claude_desktop_config.json and add the freelance server configuration:
{
"mcpServers": {
"freelance": {
"command": "uv",
"args": [
"run",
"--with", "mcp",
"--with", "python-dotenv",
"--with", "langchain-groq",
"--with", "pydantic",
"/absolute/path/to/your/freelance_server.py",
"stdio"
],
"env": {
"GROQ_API_KEY": "your_groq_api_key_here",
"MCP_AUTH_TOKEN": "your_optional_auth_token",
"OWNER_COUNTRY_CODE": "1",
"OWNER_PHONE_NUMBER": "5551234567"
}
}
}
}Important Notes:
Replace
/absolute/path/to/your/freelance_server.pywith the actual full path to yourfreelance_server.pyfileOn Windows, use double backslashes:
C:\\Users\\YourName\\MCPs\\freelance_server.pyOn Mac/Linux, use forward slashes:
/Users/YourName/MCPs/freelance_server.pyReplace all placeholder values with your actual API keys and phone number
Windows Example:
{
"mcpServers": {
"freelance": {
"command": "C:\\Users\\YourName\\.local\\bin\\uv.EXE",
"args": [
"run",
"--with", "mcp",
"--with", "python-dotenv",
"--with", "langchain-groq",
"--with", "pydantic",
"C:\\Users\\YourName\\MCPs\\mcp-server-1\\freelance_server.py",
"stdio"
],
"env": {
"GROQ_API_KEY": "gsk_xxxxxxxxxxxxxxxxxxxxx",
"MCP_AUTH_TOKEN": "your_optional_auth_token",
"OWNER_COUNTRY_CODE": "1",
"OWNER_PHONE_NUMBER": "5551234567"
}
}
}
}Step 5: Restart Claude Desktop
Completely quit Claude Desktop (not just close the window)
Reopen Claude Desktop
The freelance server should now be available
Step 6: Verify Installation
In Claude Desktop, try asking:
"Search for Python freelance gigs under $500"
"Show me current freelance market trends"
"Validate the owner phone number"
Troubleshooting Claude Desktop Integration:
Server shows as "failed":
Check the logs: Open the "Open Logs Folder" from the error
Look for
ModuleNotFoundError- means dependencies are missingVerify all
--withpackages are included in args
"Server disconnected" error:
Ensure
stdiois the last argument in args arrayCheck that the path to
freelance_server.pyis absolute and correctVerify
uvis installed: Runuv --versionin terminal
Environment variables not loading:
Double-check the
.envfile exists in the same directory asfreelance_server.pyVerify env values in
claude_desktop_config.jsonmatch your.envfileMake sure there are no extra quotes or spaces
Finding uv path (Windows):
where.exe uvFinding uv path (Mac/Linux):
which uv
Alternative: Manual Installation Method
If you prefer to install dependencies globally instead of using --with flags:
# Install dependencies globally with uv
uv pip install mcp python-dotenv langchain-groq pydantic
# Then use simpler config
{
"mcpServers": {
"freelance": {
"command": "uv",
"args": [
"run",
"/path/to/freelance_server.py",
"stdio"
],
"env": {
"GROQ_API_KEY": "your_key_here",
"OWNER_COUNTRY_CODE": "1",
"OWNER_PHONE_NUMBER": "5551234567"
}
}
}
}Integration with ngrok for Remote Access
If you want to access your MCP server remotely via HTTPS:
# 1. Download and install ngrok
# Visit: https://ngrok.com/download
# 2. Add your authtoken (sign up at ngrok.com to get one)
ngrok config add-authtoken <your_token>
# 3. Start your MCP server on a specific port
python freelance_server.py sse --port 8080
# 4. In another terminal, expose it with ngrok
ngrok http 8080
# 5. Use the provided HTTPS URL to connect remotely
# Example: https://abc123.ngrok.ioNote: For production use, consider implementing proper authentication and security measures.
API Extensions
The client can be extended to:
Connect to live freelance platform APIs
Integrate with local databases
Add custom analysis tools
Support additional LLM providers
Performance Notes
First run may be slower due to server startup
LLM calls require internet connection and API credits
Code review processes files up to 50MB
Concurrent gig searches are supported
Server maintains in-memory cache for demos
Security Considerations
API keys are loaded from environment variables only
File operations are sandboxed to current directory
No sensitive data is logged
Server runs in isolated process
Backup files include timestamps for safety
Available MCP Tools
Once integrated with Claude Desktop, you'll have access to these tools:
š Search & Discovery
search_gigs- Search for freelance gigs by skills, budget, project type, and platformvalidate- Validate server owner's phone number
š¤ Profile Management
create_user_profile- Create a new freelancer profile with skills and ratesanalyze_profile_fit- Analyze how well a profile matches a specific gigoptimize_profile- Get AI-powered profile optimization recommendations
š Proposals & Negotiation
generate_proposal- Generate personalized proposals using AInegotiate_rate- Get rate negotiation strategies and messages
š» Code Tools
code_review- Review code quality with metrics and suggestionscode_debug- Debug and automatically fix code issues
š Tracking
track_application_status- Track and analyze application performance
š Resources
freelance://profile/{profile_id}- Access user profile datafreelance://gigs/{platform}- Get gigs from specific platformsfreelance://market-trends- View current market trends and insights
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
This project is open source and available under the MIT License.
Support
For issues, questions, or contributions, please visit the GitHub repository.
Available Tools
17 toolsanalyze_profile_fitC
Analyze how well a user profile fits a specific gig
Args:
profile_data: User profile information
gig_id: ID of the gig to analyze fit for
Inputs: gig_id (required), profile_data (required). Returns: result
analyze_skill_demandB
Analyze market demand for specific skills
Args:
skills: List of skills to analyze
use_real_api: Use real API or mock data
Returns:
Market insights for each skill including demand, rates, and trends
Inputs: skills (required), use_real_api. Returns: result
calculate_pricing_strategyB
Calculate optimal pricing strategy for a specific gig using AI
Args:
gig_id: ID of the gig
skills: Your skills
user_rate_min: Your minimum hourly rate
user_rate_max: Your maximum hourly rate
success_rate: Your historical success rate (0-100)
Returns:
Optimal pricing recommendation with strategy
Inputs: gig_id (required), skills (required), success_rate, user_rate_max, +1 more. Returns: result
code_debugB
Debug and fix issues in a code file
Args:
file_path: Path to the code file to debug
issue_description: Description of the issue to fix
fix_type: Type of fix (auto, manual, suggest)
backup: Whether to create a backup before making changes
Inputs: file_path (required), issue_description (required), backup, fix_type. Returns: result
code_reviewB
Review code file and provide feedback using LLM analysis
Args:
file_path: Path to the code file to review
review_type: Type of review (general, security, performance, style)
Inputs: file_path (required), review_type. Returns: result
create_user_profileC
Create a new user profile
Args:
name: Full name
title: Professional title
skills_data: List of skills with levels and experience
hourly_rate_min: Minimum hourly rate
hourly_rate_max: Maximum hourly rate
location: Location/timezone
languages: List of languages spoken
Inputs: name (required), title (required), location (required), languages (required), +3 more. Returns: result
generate_portfolioC
Auto-generate professional portfolio
Args:
name: Your name
title: Professional title
skills: List of skills
years_experience: Years of experience
project_history: List of past projects
Returns:
Generated portfolio in HTML and Markdown
Inputs: name (required), title (required), skills (required), project_history, +1 more. Returns: result
generate_proposalB
Generate a personalized proposal for a specific gig using Langchain ChatGroq
Args:
gig_id: ID of the gig to generate proposal for
user_profile: User profile information
tone: Tone of the proposal (professional, friendly, confident)
include_portfolio: Whether to include portfolio references
custom_message: Additional custom message to include
Inputs: gig_id (required), user_profile (required), tone, custom_message, +1 more. Returns: result
get_smart_recommendationsB
Get AI-powered gig recommendations with success prediction and optimal pricing
Args:
skills: List of skills to match against
max_budget: Maximum budget filter
min_budget: Minimum budget filter
platforms: Platforms to search
top_n: Number of recommendations to return
use_real_api: Use real API or mock data
Returns:
AI-powered recommendations with win probability, optimal pricing, and strategy
Inputs: skills (required), top_n, platforms, max_budget, +2 more. Returns: result
negotiate_rateB
Generate rate negotiation strategy and message using Langchain ChatGroq
Args:
current_rate: Current offered rate
target_rate: Desired rate
project_complexity: Complexity level (low, medium, high)
justification_points: List of points to justify higher rate
Inputs: target_rate (required), current_rate (required), project_complexity, justification_points. Returns: result
optimize_profileB
Provide profile optimization recommendations using LLM analysis
Args:
profile_id: ID of the profile to optimize
target_niche: Specific niche to optimize for (optional)
Inputs: profile_id (required), target_niche. Returns: result
research_client_intelC
Research client quality and reliability
Args:
client_data: Client information (id, rating, reviews, total_spent, etc.)
Returns:
Detailed client intelligence report
Inputs: client_data (required). Returns: result
search_gigsC
Search for freelance gigs based on skills and criteria
Args:
skills: List of skills to match against
max_budget: Maximum budget/rate to filter by
min_budget: Minimum budget/rate to filter by
project_type: Type of project (fixed_price, hourly, retainer, contest)
platforms: List of platforms to search (upwork, freelancer, etc.)
use_real_api: Use real API integration (True) or mock data (False)
Inputs: skills (required), platforms, max_budget, min_budget, +2 more. Returns: result
send_notificationB
Send notification through specified channel
Args:
channel: Notification channel (email, slack, discord, console, webhook)
title: Notification title
message: Notification message
data: Optional additional data
Returns:
Send status
Inputs: title (required), channel (required), message (required), data. Returns: result
setup_auto_biddingB
Configure automatic bidding agent
Args:
enabled: Enable auto-bidding
min_match_score: Minimum match score (0-1)
max_bids_per_day: Maximum bids per day
min_budget: Minimum budget to consider
max_budget: Maximum budget to consider
auto_apply: Actually submit bids (True) or just draft (False)
skills: Required skills filter
Returns:
Auto-bid configuration status
Inputs: skills, enabled, auto_apply, max_budget, +3 more. Returns: result
track_application_statusC
Track and analyze freelance application performance
Args:
applications: List of application data with status updates
Inputs: applications (required). Returns: result
validateB
Return the server owner's phone number in the required format:
{country_code}{number}
Example: 919876543210 (for +91-9876543210)
This reads one of:
- OWNER_PHONE (single env var containing the full digits, e.g. 15551234567)
- OWNER_COUNTRY_CODE and OWNER_PHONE_NUMBER (e.g. 1 and 5551234567)
It strips non-digit characters and returns the digits-only string.
Inputs: no named parameters. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelogā¦
TDQS
Scored across 17 tools
Most tools have distinct purposes, but there is overlap between search_gigs and get_smart_recommendations, and between analyze_profile_fit and calculate_pricing_strategy, which could cause confusion. The descriptions help differentiate them, but an agent might still misselect.
Most tool names follow a consistent verb_noun pattern, but there are exceptions like 'validate' (no noun) and 'send_notification' (verb_noun but slightly inconsistent with others). Overall, the naming is mostly predictable.
With 17 tools, the count is on the higher side for a freelance assistant but each tool appears to have a specific role. It's slightly heavy but reasonable for the domain's breadth.
The tool set covers many aspects like profile management, gig search, proposal generation, and code review, but lacks explicit tools for applying to gigs, managing contracts, or handling payments, which are core to freelancing. There are notable gaps that could hinder full workflow.
Maintenance
Related MCP Connectors
Freelance marketplace for AI agents: find gigs and jobs, bid, order, pay in USDC on Solana, deliver.
Tasks, timers and earnings for freelancers and agencies: your AI agent works where you get paid.
Log hours and invoice clients from your AI chat. Time tracking and invoicing for freelancers.
Find AI agents to do work, hire them, and list yourself so others hire you. Free, no signup.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceConnects AI agents to Upwork's GraphQL API, enabling job discovery, proposal management, profile tracking, and analytics.40 npm2MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to interact with the Upwork freelance marketplace, including job search, proposal management, contract tracking, and earnings monitoring.261MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to search multilingual freelance listings, post and manage offers, send messages, and negotiate deals with human approval via Telegram.MIT
- FlicenseNot gradedqualityBmaintenanceEnables AI agents to search a shared catalog of projects, roles, orders, participants, and mentors, create and update listings or profiles, draft proposals, and search and apply across external freelance and job platforms while keeping platform credentials local.12-