MCP server that exposes 28 tools for the Kwork freelance marketplace — browse projects, submit offers, manage orders, send messages, and more.
Built with FastMCP 3.x and pykwork.
Highlights
- Tool annotations — read-only, write, and destructive hints for safer agent interactions
- Input validation — all parameters validated before API calls
- Auto-relogin — automatic session refresh on 401 errors
- Error sanitization — internal details stay in logs, not in agent responses
- Rate limiting — built-in sliding window rate limiter
Setup
Requirements
- uv
- Kwork account (login/password or API token)
Install
When using uv no specific installation is needed. We will use uvx to directly run kwork-mcp.
Alternatively, install via pip:
pip install kwork-mcp
Or from source:
git clone https://github.com/simonether/kwork-mcp.git
cd kwork-mcp
uv sync
Configure
| Variable | Required | Default | Description |
|---|---|---|---|
KWORK_LOGIN |
yes* | — | Kwork login |
KWORK_PASSWORD |
yes* | — | Kwork password |
KWORK_TOKEN |
yes* | — | Auth token (skips login) |
KWORK_PHONE_LAST |
no | — | Last 4 digits of phone (2FA) |
KWORK_PROXY_URL |
no | — | Proxy (HTTP / SOCKS4 / SOCKS5) |
KWORK_TIMEOUT |
no | 30 |
Request timeout in seconds |
KWORK_RPS_LIMIT |
no | 2 |
Requests per second |
KWORK_BURST_LIMIT |
no | 5 |
Burst limit |
KWORK_TOKEN_FILE |
no | ~/.kwork_token |
Token persistence path |
*Either KWORK_TOKEN or both KWORK_LOGIN + KWORK_PASSWORD.
Auth priority: KWORK_TOKEN env → saved token file → fresh login.
Proxy URL formats:
KWORK_PROXY_URL=http://proxy.example.com:8080
KWORK_PROXY_URL=socks5://proxy.example.com:1080
KWORK_PROXY_URL=socks5://user:password@proxy.example.com:1080
Usage
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"kwork": {
"command": "uvx",
"args": ["kwork-mcp"],
"env": {
"KWORK_LOGIN": "your_login",
"KWORK_PASSWORD": "your_password"
}
}
}
}
Claude Code
claude mcp add kwork -e KWORK_LOGIN=your_login -e KWORK_PASSWORD=your_password -- uvx kwork-mcp
VS Code
Add to .vscode/mcp.json:
{
"mcp": {
"servers": {
"kwork": {
"command": "uvx",
"args": ["kwork-mcp"],
"env": {
"KWORK_LOGIN": "your_login",
"KWORK_PASSWORD": "your_password"
}
}
}
}
}
stdio
uvx kwork-mcp
Tools
Profile (4 tools)
| Tool | Description |
|---|---|
get_me |
Current user profile, rating, balance |
get_connects |
Connect count for exchange offers |
get_user_info |
Public user info by ID |
search_users |
Search users by name or username |
Projects (4 tools)
| Tool | Description |
|---|---|
list_projects |
Browse exchange projects with filters |
get_project |
Project details by ID |
search_projects |
Search by text query |
get_exchange_info |
Exchange marketplace stats |
Offers (4 tools)
| Tool | Description |
|---|---|
list_my_offers |
Your exchange offers |
get_offer |
Offer details by ID |
submit_offer |
Submit offer to a project (costs 1 connect) |
delete_offer |
Delete an offer |
Orders (3 tools)
| Tool | Description |
|---|---|
list_worker_orders |
Seller orders (all statuses) |
get_order_details |
Order details by ID |
send_order_for_approval |
Submit work for buyer review |
Dialogs (6 tools)
| Tool | Description |
|---|---|
list_dialogs |
Conversations with latest messages |
get_dialog |
Messages by username |
send_message |
Send direct message |
edit_message |
Edit a sent message by ID |
delete_message |
Delete a sent message by ID |
mark_dialog_read |
Mark as read |
Kworks (4 tools)
| Tool | Description |
|---|---|
list_my_kworks |
Your services grouped by status |
get_kwork_details |
Kwork details by ID |
start_kwork |
Activate a paused kwork |
pause_kwork |
Pause an active kwork |
Categories (2 tools)
| Tool | Description |
|---|---|
list_categories |
Full category tree |
get_favorite_categories |
User's favorite categories |
Notifications (1 tool)
| Tool | Description |
|---|---|
list_notifications |
User notifications |
Development
uv sync --dev
uv run python -m pytest tests/ -x -v --cov=kwork_mcp --cov-report=term-missing
uv run ruff check .
uv run ruff format --check .
License
Release files for kwork-mcp 0.2.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| kwork_mcp-0.2.3.tar.gz | 135.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| kwork_mcp-0.2.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 164.9 kB
Release files / kwork_mcp-0.2.3.tar.gz
| Download URL | kwork_mcp-0.2.3.tar.gz |
|---|---|
| Size | 135.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
662c2165e2cdbbf8d4427681fb18820d5f33ef7f2f0ad998e4251a846474f9db
|
|
BLAKE2b-256 checksum How to use checksums |
20d4e7296da615d34ed5469927235a6781453f28897310649123741e04757ce6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / kwork_mcp-0.2.3-py3-none-any.whl
| Download URL | kwork_mcp-0.2.3-py3-none-any.whl |
|---|---|
| Size | 29.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a604f58c824099fd0527f447935f3fec478cedbbe431280909c8a9225c300196
|
|
BLAKE2b-256 checksum How to use checksums |
242c937e0555f98641e4739ebe68c15ca83aa1913a63b5ae0b91dc49867b1a9f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|