GoHireHumans
OfficialGoHireHumans' MCP server lets an AI agent find, compare, and hire verified human freelancers, then track and pay for the work.
Discover services (no key needed):
search_servicesby query, category, and price range;get_service_detailsfor a listing's provider, pricing, and reviews;get_categoriesfor available category slugs.Find people:
search_workersby skills, category, min rating, and max hourly rate;get_recommendedto rank best-matched workers from a task description, budget range, and urgency.Browse demand:
browse_jobsfor open job listings, filtered by category or fixed/hourly budget type.Learn the platform:
get_pricing_infofor fee structure and processing costs;get_platform_infofor how the marketplace works.Post work (auth required):
create_jobwith title, description, category, budget type/amount, and required skills.Hire and pay (auth required):
hire_workerto order a service (with requirements, optional canonical USD budget, and a reusable idempotency key);release_paymentto approve completed work and release the worker's payout, optionally per milestone and with a rating.Track and rate:
get_job_statusby job or order ID for status and milestone progress;submit_reviewwith an overall rating plus optional quality, timeliness, and communication ratings.
Account actions require GOHIREHUMANS_API_KEY or GOHIREHUMANS_AUTH_TOKEN plus account-owner authorization; employers pay a 1% platform fee plus 3% processing where checkout is configured, and the platform is not an escrow provider.
Enables payment processing for GoHireHumans hiring workflows. Where checkout is configured, employer payments for hired workers are processed through Stripe, and releasing payment via the release_payment tool releases the worker's listed payout through Stripe.
GoHireHumans
The trusted marketplace where businesses, AI agents, and individuals hire verified human professionals on demand.
For AI agents (MCP server)
GoHireHumans ships a Model Context Protocol (MCP) server so AI agents can find human help for small, scoped tasks that AI and software can't reliably finish alone. It is a Python stdio server with no third-party dependencies.
Install and run (uv, Python 3.9+):
uvx --from 'git+https://github.com/profilesearch/GohireHumans#subdirectory=backend/mcp-package' gohirehumans-mcpMCP client config (Claude Desktop, Cursor and other stdio clients):
{
"mcpServers": {
"gohirehumans": {
"command": "uvx",
"args": ["--from", "git+https://github.com/profilesearch/GohireHumans#subdirectory=backend/mcp-package", "gohirehumans-mcp"]
}
}
}Browse and search, no key needed:
search_services,get_service_details: find services by task, category and pricesearch_workers,get_recommended: compare providers by skill, rating and price, or rank listings for a task descriptionbrowse_jobs,get_categories: see open jobs and service categoriesget_pricing_info,get_platform_info: fees and how the platform works
Account actions, need GOHIREHUMANS_API_KEY or GOHIREHUMANS_AUTH_TOKEN:
create_job: post a jobhire_worker: hire a worker for a taskget_job_status: track an orderrelease_payment: approve completed work so the worker's listed payout is releasedsubmit_review: rate a completed order
Hiring and payment actions require the account owner's authorization. Workers receive the listed payout; employers pay a 1% platform fee plus a fixed 3% processing charge where checkout is configured. GoHireHumans is not an escrow provider.
Package docs and authentication steps: backend/mcp-package/README.md. API docs: https://www.gohirehumans.com/api-docs.html. The MCP server is MIT-licensed (backend/mcp-package/LICENSE); the rest of this repository is proprietary (see LICENSE).
Related MCP server: ReverseCentaur
Deployment guide
How the GoHireHumans site and API are built and deployed.
Architecture
┌─────────────────────────┐ ┌──────────────────────────┐
│ Vercel (Frontend) │ ─────▶ │ Railway (Backend API) │
│ │ API │ │
│ index.html │ calls │ Flask + Gunicorn │
│ style.css │ │ SQLite database │
│ base.css │ │ Python 3.12 │
│ config.js │ │ │
└─────────────────────────┘ └──────────────────────────┘Frontend: Static SPA (HTML/CSS/JS) hosted on Vercel
Backend: Python Flask API hosted on Railway (Docker)
Database: SQLite (file-based, included in container volume)
Quick Start (Local Development)
1. Start the Backend
cd backend
pip install -r requirements.txt
python server.pyThe API will be running at http://localhost:8080. Test it:
curl http://localhost:8080/health
# → {"status": "ok", "service": "gohirehumans-api"}2. Seed Demo Data
Seeding is disabled unless SEED_SECRET is configured. Use it only for local/demo setup and unset it in production after controlled setup.
curl -X POST http://localhost:8080/seed \
-H 'Content-Type: application/json' \
-d '{"secret":"YOUR_SEED_SECRET"}'This creates local/demo marketplace records. Do not publish or rely on demo credentials for production.
3. Serve the Frontend
cd frontend
# Any static file server works:
python -m http.server 3000Open http://localhost:3000 in your browser.
Deploy to Railway (Backend)
Step 1: Create a Railway Project
Go to railway.app and sign in
Click "New Project" → "Deploy from GitHub Repo"
Connect your GitHub account and select your repo (or use "Deploy from Local" with the Railway CLI)
Step 2: Configure the Service
In your Railway project, click on the service
Go to Settings → Build & Deploy
Set Root Directory to
backendRailway will auto-detect the Dockerfile
Step 3: Add Environment Variables
In the Railway dashboard, go to Variables and add:
Variable | Value |
|
|
|
|
| Optional local override. Production prefers |
Step 4: Add a Persistent Volume (Important!)
SQLite needs persistent storage:
In Railway, click "+ New" → "Volume"
Mount path:
/dataDo not point production SQLite under
/app;/appis ephemeral.
Step 5: Deploy
Railway deploys automatically on push. Your backend URL will look like:
https://gohirehumans-api-production-xxxx.up.railway.appStep 6: Optional Controlled Seed
Only seed a controlled staging/demo environment. Production auto-seeding is disabled by default.
curl -X POST https://YOUR-RAILWAY-URL/seed \
-H 'Content-Type: application/json' \
-d '{"secret":"YOUR_SEED_SECRET"}'Deploy to Vercel (Frontend)
Step 1: Update API URL
Edit frontend/config.js and set your Railway backend URL:
window.GOHIREHUMANS_API_URL = "https://your-railway-backend-url.up.railway.app";Step 2: Deploy to Vercel
Option A: Vercel CLI
cd frontend
npx vercel --prodOption B: GitHub Integration
Go to vercel.com and sign in
Click "Add New Project" → import your repo
Set Root Directory to
frontendFramework Preset: Other
Click Deploy
Step 3: Custom Domain
In Vercel dashboard → Settings → Domains
Add
gohirehumans.comFollow the DNS configuration instructions
Deploy with Railway CLI (Alternative)
# Install Railway CLI
npm install -g @railway/cli
# Login
railway login
# Initialize project
cd backend
railway init
# Deploy
railway up
# Get your URL
railway domainProject Structure
GohireHumans/
├── backend/
│ ├── server.py # Flask server (production wrapper)
│ ├── api_core.py # Core API logic (~14,000 lines, single route dispatcher)
│ ├── mcp_server.py # MCP server for AI agents (mirrored in mcp-package/)
│ ├── test_*.py # unittest suites (run with discover -s backend)
│ ├── requirements.txt # Python dependencies
│ ├── Dockerfile # Container config for Railway
│ ├── railway.toml # Railway deployment config
│ ├── Procfile # Process file (Heroku/Railway)
│ ├── start.sh # Container entrypoint (execs gunicorn)
│ ├── .dockerignore # Keeps tests/tools/local DBs out of the image
│ └── .env.example # Environment variable template
│
├── frontend/
│ ├── index.html # Single Page Application (hash routes under /#/)
│ ├── style.css # Shared stylesheet: tokens, reset, components, public shell, page layouts
│ ├── app.css # Signed-in app surfaces (loaded by index.html only)
│ ├── base.css # Reset mirror for the SPA
│ ├── mobile-hardening.css # Phone-width guards (no-op above 768px)
│ ├── partials/ # Canonical public nav and footer (synced into every static page)
│ ├── *.html, blog/, hire/, use-cases/, ai-human-qa/, categories/, vs/, tools/, earn/, examples/
│ │ # Static marketing, SEO, docs, and tool pages
│ ├── analytics-bootstrap.js # Fail-closed GA loader (production origins only)
│ ├── config.js # API URL configuration ← EDIT THIS
│ ├── sitemap.xml, feed.xml, atom.xml, robots.txt, llms.txt, .well-known/
│ ├── performance-budgets.json # Byte budgets enforced in CI
│ ├── tests/ # Playwright browser regression suites
│ └── vercel.json # Vercel redirects and security headers
│
├── docs/
│ ├── design-system/ # design-system.md (tokens, components, page patterns) and public-shell.md
│ ├── ops/ # Operating playbooks and internal working docs (not deployed)
│ └── plans/ # Historical sprint plans
│
├── scripts/
│ ├── sync_public_shell.py # Sync the nav/footer partials into every static page (--check in CI)
│ ├── check_public_shell.py # Guard: every public page has the canonical shell, skip link, main, bootstrap
│ ├── performance_budget.py # Enforce performance-budgets.json
│ ├── generate_feeds.py # Rebuild feed.xml and atom.xml from blog page metadata
│ └── generate-marketplace-pulse.py
│
├── .github/workflows/ci.yml # Backend tests, static checks, Playwright suites
├── .gitignore
└── README.md # This fileAPI Endpoints
Method | Path | Description |
|
| Health check |
|
| Register new user |
|
| Login |
|
| Get current user profile |
|
| List service listings |
|
| Create a service listing |
|
| List jobs |
|
| The caller's own services in every status (auth required; |
|
| The caller's own jobs in every status, with |
|
| Create a job |
|
| Apply to a job; payout-ready account and non-empty |
|
| Job-owner/admin-only JSON list; session or read-scoped API key. Each application includes |
|
| Withdraw your own pending application before a hire; one reapply allowed per job |
|
| Hire an applicant |
|
| Preview an authenticated, itemized service charge without creating an order |
|
| Order a listed service; optionally bind the request to a quote |
|
| Approve submitted work and release payment |
|
| Leave a review |
|
| Secret-gated local/demo seeding |
|
| Admin statistics |
Content Safety
GoHireHumans includes built-in content safety filters that block:
80+ prohibited keywords and phrases
Inappropriate service categories
Dark web / illegal content patterns
All task titles and descriptions are automatically screened.
Troubleshooting
CORS Errors
The backend uses the ALLOWED_ORIGINS env var and does not allow wildcard credentials by default. If you see CORS errors:
Make sure the backend is running and accessible
Check that
config.jshas the correct backend URLEnsure there's no trailing slash on the URL
Database Reset
To start fresh locally, delete your local SQLite file and optionally run secret-gated /seed again. Do not delete production /data/gohirehumans.db without a verified backup and restore plan.
Railway Volume Issues
If data disappears between deploys, make sure you've attached a persistent volume at /data. The app stores production SQLite at /data/gohirehumans.db.
Frontend checks
The static checks CI runs, in order:
python3 scripts/check_public_shell.py
python3 scripts/sync_public_shell.py --check
python3 scripts/performance_budget.py
python3 backend/security_static_checks.py
python3 -m unittest discover -s backend -p 'test_deep_audit_regressions.py'Browser suites (Playwright, desktop and Pixel 5 projects):
cd frontend && npm ci && npx playwright install chromium && npm run test:browserSet PW_PORT=<port> if 4173 is taken on your machine; the config and specs honor it. After changing frontend/partials/, run python3 scripts/sync_public_shell.py (without --check) to propagate the shell, and update the JS-rendered nav and footer in index.html by hand. After adding a blog post, run python3 scripts/generate_feeds.py.
The visual system is documented in docs/design-system/design-system.md; static pages build on its classes instead of page-local styles.
Tech Stack
Frontend: Vanilla JS SPA plus static HTML pages, Newsreader and Instrument Sans (Google Fonts), CSS custom properties, one shared stylesheet
Backend: Python 3.12, Flask, Gunicorn, SQLite
Hosting: Vercel (frontend) + Railway (backend)
Security: PBKDF2-HMAC password hashing, session tokens, rate limiting, content safety filters
Domain: gohirehumans.com
Available Tools
13 toolsbrowse_jobsARead-only
Browse public job posts on GoHireHumans that are accepting applications, newest first. Read-only; no API key needed. Returns up to limit jobs, each with its ID, title, category, budget and a short description. Use this to find work to apply for or to see what buyers are asking for; workers apply on gohirehumans.com, not through this server. To find people or services to hire, use search_services or search_workers. For one job's status and application count, use get_job_status(job_id).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of jobs to return (default 10, max 50). Only the first page is returned. | |
| category | No | Filter by category slug from get_categories | |
| budget_type | No | Filter by budget type. Only fixed-price jobs can be posted right now, so 'hourly' usually returns none. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the bar is lower; the description still adds 'no API key needed', the newest-first ordering, and the off-server application constraint, all of which affect how an agent acts on results. It does not state rate limits or what happens on empty results, but the important behavioral traits are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core verb and resource, then layers usage and alternatives in descending priority. Four sentences with almost no waste, though the returned-fields sentence is dense and could be trimmed if an output schema existed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-shape burden and does: ID, title, category, budget, short description. Combined with pagination limits, the read-only/off-server constraints, and sibling routing, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents limit, category and budget_type, including the enum and the 'only first page' caveat. The description adds only the returned-field list and reiterates the limit cap, so baseline 3 is appropriate rather than credit for new parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Browse public job posts on GoHireHumans that are accepting applications, newest first'), including scope and ordering. It is immediately distinguishable from search_services, search_workers, and get_job_status, all of which are named in the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('to find work to apply for or to see what buyers are asking for') plus a critical when-not: applications happen on gohirehumans.com, not through this server. It also routes to the correct siblings for hiring and for single-job status, with the selecting condition stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_jobA
Publish a new job post on GoHireHumans that workers can apply to. Get the account owner's approval of the title, description and budget first. Needs GOHIREHUMANS_AUTH_TOKEN or an API key with the write scope. The job is published immediately with status 'open', and workers with services in the same category may be notified. It does not hire anyone or charge anything: applicants are reviewed and hired on gohirehumans.com. This server cannot edit or close a job. Returns the new job ID and status; track it with get_job_status(job_id). To order an existing service listing instead, use hire_worker.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Job title (e.g., 'Build a React landing page') | |
| category | Yes | Category slug from get_categories (e.g., 'research', 'phone_call', 'data_entry') | |
| budget_type | Yes | Use 'fixed'. Hourly jobs are not accepted right now and return an error. | |
| description | Yes | Public job description: the task, deliverables, deadline and anything a worker needs to know | |
| budget_amount | Yes | Total budget in USD for a fixed-price job: greater than 0, in whole cents, at most 999,999.99 | |
| skills_required | No | List of required skills (e.g., ['React', 'TypeScript', 'CSS']) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: immediate publication with status 'open', possible worker notifications, no hiring or charging, and an explicit statement that this server cannot edit or close a job. It also discloses the auth requirement (GOHIREHUMANS_AUTH_TOKEN or write-scoped API key), which annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then prerequisites, side effects, and alternatives in a logical order. It is a dense paragraph with no filler, though slightly long for a single tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description compensates by stating the return value ('the new job ID and status') and how to track it. Combined with the side-effect, auth, and limitation disclosures, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter including the enum constraint on budget_type and the whole-cents budget rule. The description adds only the approval prerequisite for title/description/budget rather than new per-parameter meaning, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Publish a new job post on GoHireHumans') plus the effect on workers ('that workers can apply to'). It also distinguishes itself from the sibling hire_worker by naming that alternative outright.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the prerequisite (owner approval of title, description and budget) and routes the agent to the right sibling for a different task ('To order an existing service listing instead, use hire_worker'). It also points to get_job_status for follow-up, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_categoriesARead-only
List every service category slug on GoHireHumans, grouped into human services and AI-agent services, each with a readable name. Read-only; no API key needed. Call this when you need a valid category value for search_services, search_workers, browse_jobs or create_job. For an overview of the platform itself, use get_platform_info.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint=true and openWorldHint=true, so 'Read-only' is largely redundant; however 'no API key needed' adds an auth requirement not expressed in the annotations, and the sentence about grouping gives a useful hint at the response shape. It stops short of describing ordering, pagination, or stability of slugs, so it adds value but not richly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what is returned, followed by safety/auth notes and then routing. Every sentence carries distinct information with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description compensates by describing the return shape (grouped slugs with readable names) and the consumer workflow, which is everything an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies; there is nothing for the description to disambiguate, and the schema is fully covered at 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list service category slugs) plus the returned shape (grouped into human services and AI-agent services, each with a readable name). This is distinguishable from siblings like get_platform_info or get_service_details without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the trigger ('when you need a valid `category` value') and the four downstream tools it feeds (search_services, search_workers, browse_jobs, create_job), plus an explicit alternative for a different need (get_platform_info for platform overview). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_job_statusARead-only
Check one order or one job post by ID. Read-only. With order_id: returns the order's status, amount, worker and employer names, and each milestone's amount and status; needs GOHIREHUMANS_AUTH_TOKEN or an API key with the read scope, and only the order's employer or worker (or a site admin) can see it. With job_id: returns a job post's status, budget and application count; jobs still accepting applications are public, after that only the job's owner, its applicants, the hired worker or a site admin can see it. Order IDs come from hire_worker; job IDs come from create_job or browse_jobs. Orders and jobs are numbered separately, so the same number can be both an order and a job. If both are given, order_id is used.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | No | Job post ID from create_job or browse_jobs (not an order ID) | |
| order_id | No | Order ID from hire_worker. Takes precedence over job_id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description goes well beyond by naming the auth requirement (GOHIREHUMANS_AUTH_TOKEN or read-scoped API key) and spelling out per-mode visibility rules (employer/worker/admin for orders; public while accepting applications, then owner/applicants/hired worker/admin for jobs).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Opens with the one-line purpose, then branches cleanly by parameter. Every sentence carries a distinct constraint (auth scope, visibility, ID source, collision warning, precedence) with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields for each mode (status, amount, worker/employer names, milestone amounts/statuses; job status, budget, application count). Auth, permissions and parameter disambiguation are all covered, so nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: the provenance of each ID, the fact that the two ID spaces are independent, and the precedence rule when both are supplied. This is exactly the ambiguity a schema alone cannot resolve.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check one order or one job post by ID') and immediately distinguishes the two lookup modes. An agent can tell this apart from sibling readers like get_pricing_info or get_service_details without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: order_id traverses from hire_worker, job_id from create_job or browse_jobs. It also resolves the ambiguity case ('if both are given, order_id is used') and warns that orders and jobs are numbered separately, so the same integer can refer to both.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_platform_infoARead-only
Get an overview of GoHireHumans: what the marketplace is, key facts, the kinds of work available and the typical workflow from search to approval and review. Read-only; no API key needed. Call this first if you are new to GoHireHumans. For fees and payment terms use get_pricing_info; for exact category slugs use get_categories.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint=true and openWorldHint=false, so safety is partly pre-declared; the description reinforces read-only and adds the genuinely new fact that no API key is needed, which annotations do not express. It also characterizes the returned content as narrative/overview rather than data records. It stops short of noting response size or shape, but clears the higher bar for an annotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core purpose, then the operational note, then the sibling routing. Every sentence carries information an agent needs and none is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema onboarding tool, the description supplies purpose, when-to-call, auth expectations, and where to go for adjacent questions — everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline for a no-param tool is 4. The description correctly avoids inventing filtering or formatting options.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (platform overview of GoHireHumans) and enumerates the content covered: marketplace description, key facts, kinds of work, and the search-to-approval workflow. An agent can distinguish this from get_pricing_info and get_categories without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to call it ('Call this first if you are new to GoHireHumans') and routes related questions to named alternatives for fees/payment (get_pricing_info) and category slugs (get_categories). Both the trigger condition and the exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pricing_infoARead-only
Get GoHireHumans' fees and payment terms: workers receive the listed payout, and employers pay a 1% platform fee plus a fixed 3% processing charge where checkout is configured; joining and listing are free. Also compares fees with Fiverr, Upwork, Freelancer.com and Toptal, and explains how payment and approval work (GoHireHumans is not an escrow provider). Read-only; no API key needed. Use this for cost questions or before quoting a total to the account owner. For what the platform is and how it works, use get_platform_info.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so "Read-only" adds little, though "no API key needed" is useful context. The description goes beyond annotations by disclosing the concrete fee model, the fee comparison scope, and the non-escrow caveat, which materially shapes interpretation of results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core fee facts, then comparison scope, then the routing sentence. Dense but each clause carries information; the title duplication and "Read-only; no API key needed" are slightly redundant but not wasteful enough to penalize heavily.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns and does so fully — fee structure, competitor comparison, and payment/approval explanation. Combined with explicit routing, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description makes clear which cost concepts the call covers, which is the only relevant semantic guidance for a no-arg call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get fees and payment terms) with concrete detail — 1% platform fee, 3% processing charge, free joining/listing — so the agent knows exactly what this returns. It also distinguishes itself from get_platform_info by naming that sibling and its domain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ("cost questions or before quoting a total to the account owner") and names the alternative (get_platform_info) with its selecting condition ("what the platform is and how it works"). Routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recommendedARead-only
Rank service listings for a task described in plain language. Read-only; no API key needed. It guesses a category from keywords in the description, searches listings using the description's first few words, and scores matches by rating, number of reviews, price (listings under $100 score slightly higher) and, for 'high' or 'urgent' tasks, delivery within 2 days. If nothing matches, it falls back to the best-rated listings overall, so check that results are relevant. Returns up to limit listings with service IDs for get_service_details and hire_worker. Use this when you have a task but no precise search terms; use search_services for exact keyword and price filters.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of recommendations (default 5, max 10) | |
| urgency | No | How soon the task is needed. 'high' or 'urgent' boosts listings that deliver within 2 days; 'low' and 'medium' don't change the ranking. | medium |
| budget_range | No | USD range compared with each listing's fixed price or hourly rate: '$50-200' or 'under $100'. Filtered locally before ranking; custom-priced listings are left out when a range is given, and unrated providers can still match. | |
| task_description | Yes | The task in plain language (e.g., 'call 20 restaurants to confirm opening hours'). The first few words drive the search, so lead with the core task. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description goes well beyond by disclosing the ranking signals (rating, review count, price under $100, 2-day delivery for high/urgent), the keyword-guessing and first-words search mechanics, and the fallback to best-rated listings when nothing matches. It even warns to verify relevance. This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then behaviors, then routing in a compact run of sentences with no filler. Slightly dense and repeats a couple of schema facts (urgency boost), keeping it just short of ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, yet the description covers the return shape (up to `limit` listings) and how results are consumed (service IDs for get_service_details and hire_worker), plus the fallback caveat. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds ranking semantics not in the schema (e.g., sub-$100 listings score slightly higher, urgency boosting applies to high/urgent only) and frames the output count. Most parameter meaning is still schema-borne, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Rank service listings') plus the input modality ('task described in plain language'). It also implicitly distinguishes itself from search_services by framing the ranking as fuzzy/keyword-based rather than filter-based.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the condition for use ('when you have a task but no precise search terms') and the alternative for the opposite case ('use search_services for exact keyword and price filters'). Routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_service_detailsARead-only
Get the full public details of one service listing by its numeric ID: title, category, price (fixed price, hourly rate or custom), provider name, rating, full description, delivery time and a link to the listing on gohirehumans.com. Read-only; no API key needed. Get IDs from search_services or get_recommended. Call this just before hire_worker so the account owner can check the scope and current price; for a custom-priced listing, agree the amount with the provider first. Returns an error message if the listing doesn't exist or was removed; a paused listing can still be shown here but can't be ordered.
| Name | Required | Description | Default |
|---|---|---|---|
| service_id | Yes | Numeric service listing ID (e.g., '42') from search_services or get_recommended |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description adds real behavioral context on top: no API key required, an error is returned for nonexistent/removed listings, and a paused listing is still viewable but not orderable. That paused-vs-orderable distinction is a non-obvious state rule an agent could not infer from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the returned field list, then prerequisites, then error/state behavior. It is fairly dense in a single paragraph, but nearly every clause (error case, paused state, custom-price caveat) carries distinct operational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields, and it covers the failure mode, the paused-listing edge case, and prerequisites. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single service_id parameter is fully documented in the schema, including its origin. The description restates it as a 'numeric ID' but adds no format, bounds, or edge-case detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the full public details of one service listing by its numeric ID') and enumerates exactly what is returned (title, category, price, provider, rating, description, delivery time, listing link). It is clearly distinguishable from siblings like search_services or get_pricing_info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names both sources of IDs ('from search_services or get_recommended') and the precise moment to call it ('just before hire_worker'). It even routes custom-priced listings to a separate agreement step with the provider first, giving explicit when-to-use sequencing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hire_workerADestructiveIdempotent
Order one service listing: hires its provider and pays for the work. Call only after the account owner has explicitly approved the listing, price and requirements. Needs GOHIREHUMANS_AUTH_TOKEN, or an API key with both the read scope and the write scope, plus a saved payment method on the employer account. Where checkout is configured, the saved card is charged immediately for the listing's current price plus a 1% platform fee and a fixed 3% processing charge. The charge isn't locked to an earlier quote, so re-check get_service_details just before ordering. The worker is paid only when the employer approves the delivered work with release_payment. A funded order has no self-serve cancel option. Safe to retry: the same idempotency_key resumes the original order instead of charging twice. Returns the order ID, amount and status for get_job_status(order_id).
| Name | Required | Description | Default |
|---|---|---|---|
| service_id | Yes | Numeric ID of the service listing to order, from search_services, get_recommended or get_service_details | |
| requirements | No | Instructions for the worker (what to deliver, details, deadline). Saved on the order. | |
| budget_amount | No | USD amount with at most two decimal places, used only for custom-priced listings (required there). It is not a spending cap: fixed-price listings always charge the listed price, and hourly listings charge one hour at the listed rate. | |
| idempotency_key | Yes | Unique key for this order (16-128 letters, digits, '.', '_', ':' or '-'). Reuse the exact same key when retrying an ambiguous or failed checkout; a different order with the same key is rejected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint/idempotentHint/openWorldHint, but the description goes further than they can: auth requirements (GOHIREHUMANS_AUTH_TOKEN or read+write scopes plus a saved payment method), immediate charge timing, the 1% platform fee and 3% processing charge, that the charge tracks the current price rather than an earlier quote, and that the worker is only paid via release_payment. It correctly explains the idempotency_key retry semantics that back the idempotentHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose, precondition, credentials, cost model, payment timing, irreversibility and retry safety are ordered by the sequence an agent would need them, and every sentence carries a distinct operational fact with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and the description compensates by naming the return payload (order ID, amount, status) and the tool that consumes it. With auth, fees, charge timing, payout gating and cancel policy all covered, an agent has everything needed to invoke this safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters including the budget_amount non-cap nuance and the key format. The description restates retry behavior for idempotency_key but adds no syntax or format detail beyond it, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Order one service listing: hires its provider and pays for the work" gives a specific verb, resource and the money-moving consequence in one line, and the closing sentence names the resulting artifact (order ID) routed to get_job_status. It does not explicitly say why an agent would pick this over the closest sibling create_job, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a hard precondition ("Call only after the account owner has explicitly approved the listing, price and requirements") and names the sibling to consult first ("re-check get_service_details just before ordering"). It also flags the when-not case: a funded order has no self-serve cancel option, so the agent knows this is irreversible at order time.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
release_paymentADestructive
Approve the worker's submitted work on an order and release their payout. This pays the worker and cannot be undone, so only call it after the account owner has reviewed the delivered work and explicitly approved payment. Must be called as the order's employer with GOHIREHUMANS_AUTH_TOKEN; unset GOHIREHUMANS_API_KEY first, because API-key authentication isn't supported for this action and a valid API key is rejected even alongside the session token. The order must be in 'submitted' status (check with get_job_status). Approves the order's current submitted milestone; where checkout is configured, Stripe releases the worker's listed payout. If the order has another milestone, the employer's saved card is charged for it at the same time. After the last milestone the order is completed and can be reviewed with submit_review.
| Name | Required | Description | Default |
|---|---|---|---|
| rating | No | Not recorded by this tool; rate the worker with submit_review after the order completes. Kept for backward compatibility. | |
| order_id | Yes | ID of the order whose submitted work you are approving | |
| milestone_id | No | Ignored: the API always approves the order's current submitted milestone. Kept for backward compatibility. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true and idempotent=false, but the description adds substantial non-structured context: the action is irreversible, it requires GOHIREHUMANS_AUTH_TOKEN while the API key must be unset because API-key auth is rejected, Stripe releases the payout where checkout is configured, and the saved card is charged for a following milestone. This is far beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and its irreversible nature, then layers auth, status, and milestone mechanics. It is dense and multi-clause, but every sentence carries operational value; the auth-requirement sentence is the longest and slightly heavy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent payment tool with no output schema, the description covers irreversibility, auth requirements, preconditions, downstream effects on milestones/Stripe, and what to do after the final milestone. Nothing an agent needs to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema itself explains that rating and milestone_id are ignored/legacy. The description adds no per-parameter detail, but with full schema coverage the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (approve + release payout) on a specific resource (the worker's submitted work on an order). An agent can distinguish this from siblings like get_job_status or submit_review without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions (only after the owner has reviewed and approved), required order status ('submitted'), the alternative to check status (get_job_status), and the follow-up tool for rating (submit_review). Routing and when-not-to-call are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_servicesARead-only
Search individual service listings on GoHireHumans (one result per listing) by keyword, category and price. Read-only; no API key needed. Returns up to limit listings, highest listing rating first, each with its numeric ID, title, category, price (fixed price, hourly rate or custom), a short description and the provider's name. Use this when you know what kind of work you need and want listing IDs to act on. Use search_workers to compare providers instead of listings, get_recommended to rank listings for a plain-language task, and get_service_details for one listing in full.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of listings to return (default 10, max 50). Only the first page of matches is returned. | |
| query | No | Keywords matched against listing titles, descriptions and tags (e.g., 'logo design', 'phone call', 'virtual assistant') | |
| category | No | Filter by category slug (e.g., 'web_development', 'graphic_design', 'virtual_assistant', 'ai_coding'). Get the full list with get_categories. | |
| max_price | No | Maximum listed price or hourly rate in USD | |
| min_price | No | Minimum listed price or hourly rate in USD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint and openWorldHint, so the description's 'read-only' restatement is redundant, but 'no API key needed' adds auth context the annotations do not cover. It also discloses ordering (highest rating first), result shape, and the pagination limit ('only the first page of matches is returned'), which are genuine behavioral facts beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, all front-loaded with the action and scope before the routing advice. The return-field enumeration is slightly long but justified because there is no output schema. Every sentence does work; nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing return fields, result count, sort order and page-limited behavior. Combined with annotations and a fully documented schema, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds interpretation by mapping the three filter facets and clarifying that price can be a fixed price, hourly rate or custom — which matters for how min_price/max_price are read. It does not document limit or default behavior beyond what the schema already states, so it is a moderate rather than large lift.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search individual service listings'), pins the granularity ('one result per listing'), and names the exact facets (keyword, category, price). It is immediately distinguishable from search_workers, get_recommended and get_service_details, which it names explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit selection rule ('use this when you know what kind of work you need and want listing IDs to act on') and then routes three sibling tools by condition: search_workers to compare providers, get_recommended for plain-language ranking, get_service_details for a single full listing. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_workersARead-only
Find workers (people or agents offering services) on GoHireHumans, with one result per provider instead of one per listing. Read-only; no API key needed. Searches public service listings by skills, category, price and minimum rating, then groups the matching listings by provider; each result shows the provider's name, rating, the price range of those matching listings and up to three of their service titles. Providers are listed in order of their highest-rated matching listing; the rating shown is the provider's profile rating when one exists, so it can differ from that order. Use this to compare providers. Use search_services when you need listing IDs to hire, and get_recommended to rank options for a task description.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of providers to return (default 10, max 50) | |
| skills | No | Skills or keywords to match against listing titles, descriptions and tags (e.g., ['Python', 'data analysis']); combined into one text search | |
| category | No | Filter by category slug from get_categories | |
| min_rating | No | Minimum profile/listing average rating (1-5); applied locally to returned services (unrated workers excluded), fetching more pages until enough providers match | |
| max_hourly_rate | No | Maximum listed price or hourly rate in USD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description adds real context beyond them: no API key is required, results are grouped by provider, ordering follows the highest-rated matching listing, and the displayed rating may come from the provider profile and thus disagree with the sort order. It does not cover pagination behavior when limit is raised, but the disclosure is well above the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core definition and the per-provider grouping before moving to filters, return shape, and sibling routing. Dense but every sentence carries information; slightly long as a single unbroken paragraph.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing the return shape (provider name, rating, price range, up to three service titles) and the ordering caveat. Combined with the sibling routing and auth note, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters including the min_rating local-filter nuance. The description only summarizes the filter dimensions ('skills, category, price and minimum rating') without adding syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find workers (people or agents offering services)') plus the key aggregation behavior ('one result per provider instead of one per listing'). It explicitly distinguishes itself from siblings search_services and get_recommended, so an agent can route correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use ('Use this to compare providers') and names the two alternatives with the conditions that select them ('search_services when you need listing IDs to hire', 'get_recommended to rank options for a task description'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_reviewA
Leave a 1-5 star rating and written review for the other party on a completed order: the employer reviews the worker and the worker reviews the employer. Needs GOHIREHUMANS_AUTH_TOKEN or an API key with the write scope, from an account that is part of the order, and the order must be completed. Each participant can review an order once, and reviews can't be edited or deleted through the API. A review stays hidden until both parties have reviewed or 14 days have passed since completion; then it appears publicly on the reviewed person's profile.
| Name | Required | Description | Default |
|---|---|---|---|
| rating | Yes | Overall rating from 1 to 5 stars; shown publicly once the review is visible | |
| comment | Yes | Written review of the other party's work or conduct; shown publicly once the review is visible | |
| order_id | Yes | ID of the completed order to review | |
| quality_rating | No | Optional quality sub-rating (1-5). Accepted but not currently stored or shown. | |
| timeliness_rating | No | Optional timeliness sub-rating (1-5). Accepted but not currently stored or shown. | |
| communication_rating | No | Optional communication sub-rating (1-5). Accepted but not currently stored or shown. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, destructive=false, idempotent=false), and the description goes well beyond them: reviews cannot be edited or deleted via API, one per participant per order, auth scope requirements, and a hidden-until-both-reviewed-or-14-days visibility rule. This is unusually rich operational context and it is consistent with (not contradicting) the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph that front-loads what the tool does before layering conditions. Every clause (auth, completion, once-only, immutability, visibility delay) carries distinct information, though the sentence count could be trimmed slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-param mutation with no output schema, the description supplies everything an agent needs: preconditions, auth requirements, cardinality limits, immutability, and post-submission visibility behavior. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all six parameters including the odd 'accepted but not stored' sub-ratings are already documented in the schema. The description restates the 1-5 rating and written review but adds only the visibility timing, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (submit/leave) and resource (a 1-5 star rating and written review) on a clearly bounded target (a completed order, other party). It even clarifies the two directions (employer reviews worker, worker reviews employer), so an agent knows exactly what this produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions: auth token or write-scoped API key, account must be part of the order, order must be completed, and each participant may review once. No sibling tool overlaps this function, so the absence of named alternatives is not a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v2.1.0- Changed
browse_jobs3 fields changed- changed
Input schema / properties / budget_type / descriptionPrevious value: -"Filter by budget type"New value: +"Filter by budget type. Only fixed-price jobs can be posted right now, so 'hourly' usually returns none." - changed
Input schema / properties / category / descriptionPrevious value: -"Filter by category slug"New value: +"Filter by category slug from get_categories" - changed
Input schema / properties / limit / descriptionPrevious value: -"Number of results (default 10, max 50)"New value: +"Number of jobs to return (default 10, max 50). Only the first page is returned."
- Changed
create_job4 fields changed- changed
Input schema / properties / budget_amount / descriptionPrevious value: -"Budget in USD (total for fixed, per-hour for hourly)"New value: +"Total budget in USD for a fixed-price job: greater than 0, in whole cents, at most 999,999.99" - changed
Input schema / properties / budget_type / descriptionPrevious value: -"Fixed price or hourly rate"New value: +"Use 'fixed'. Hourly jobs are not accepted right now and return an error." - changed
Input schema / properties / category / descriptionPrevious value: -"Category slug (use get_categories to see options)"New value: +"Category slug from get_categories (e.g., 'research', 'phone_call', 'data_entry')" - changed
Input schema / properties / description / descriptionPrevious value: -"Detailed job description with requirements and deliverables"New value: +"Public job description: the task, deliverables, deadline and anything a worker needs to know"
- Changed
get_job_status2 fields changed- changed
Input schema / properties / job_id / descriptionPrevious value: -"The job listing ID to check status for (alternative to order_id)"New value: +"Job post ID from create_job or browse_jobs (not an order ID)" - changed
Input schema / properties / order_id / descriptionPrevious value: -"The order ID to check status for"New value: +"Order ID from hire_worker. Takes precedence over job_id."
- Changed
get_recommended3 fields changed- changed
Input schema / properties / budget_range / descriptionPrevious value: -"USD listed service price range: '$50-200' or 'under $100'. Filtered locally before ranking; unrated providers can still match."New value: +"USD range compared with each listing's fixed price or hourly rate: '$50-200' or 'under $100'. Filtered locally before ranking; custom-priced listings are left out when a range is given, and unrated providers can still match." - changed
Input schema / properties / task_description / descriptionPrevious value: -"Describe the task you need done. Be specific about requirements, skills needed, and expected deliverables."New value: +"The task in plain language (e.g., 'call 20 restaurants to confirm opening hours'). The first few words drive the search, so lead with the core task." - changed
Input schema / properties / urgency / descriptionPrevious value: -"How urgently you need the task completed"New value: +"How soon the task is needed. 'high' or 'urgent' boosts listings that deliver within 2 days; 'low' and 'medium' don't change the ranking."
- Changed
get_service_details1 field changed- changed
Input schema / properties / service_id / descriptionPrevious value: -"The unique ID of the service to retrieve"New value: +"Numeric service listing ID (e.g., '42') from search_services or get_recommended"
- Changed
hire_worker4 fields changed- changed
Input schema / properties / budget_amount / descriptionPrevious value: -"Canonical USD amount with at most two decimal places. Defaults to the service listing price if omitted."New value: +"USD amount with at most two decimal places, used only for custom-priced listings (required there). It is not a spending cap: fixed-price listings always charge the listed price, and hourly listings charge one hour at the listed rate." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"Unique operation identity. Reuse this exact value when retrying an ambiguous or failed checkout."New value: +"Unique key for this order (16-128 letters, digits, '.', '_', ':' or '-'). Reuse the exact same key when retrying an ambiguous or failed checkout; a different order with the same key is rejected." - changed
Input schema / properties / requirements / descriptionPrevious value: -"Specific requirements or instructions for the worker"New value: +"Instructions for the worker (what to deliver, details, deadline). Saved on the order." - changed
Input schema / properties / service_id / descriptionPrevious value: -"The ID of the service listing to purchase"New value: +"Numeric ID of the service listing to order, from search_services, get_recommended or get_service_details"
- Changed
release_payment3 fields changed- changed
Input schema / properties / milestone_id / descriptionPrevious value: -"Optional specific milestone ID to release payment for. If not specified, releases payment for the entire order."New value: +"Ignored: the API always approves the order's current submitted milestone. Kept for backward compatibility." - changed
Input schema / properties / order_id / descriptionPrevious value: -"The order ID for which to release payment"New value: +"ID of the order whose submitted work you are approving" - changed
Input schema / properties / rating / descriptionPrevious value: -"Optional rating (1-5) to submit along with payment release"New value: +"Not recorded by this tool; rate the worker with submit_review after the order completes. Kept for backward compatibility."
- Changed
search_services4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Number of results to return (default 10, max 50)"New value: +"Number of listings to return (default 10, max 50). Only the first page of matches is returned." - changed
Input schema / properties / max_price / descriptionPrevious value: -"Maximum price filter (USD)"New value: +"Maximum listed price or hourly rate in USD" - changed
Input schema / properties / min_price / descriptionPrevious value: -"Minimum price filter (USD)"New value: +"Minimum listed price or hourly rate in USD" - changed
Input schema / properties / query / descriptionPrevious value: -"Search query (e.g., 'web developer', 'logo design', 'virtual assistant')"New value: +"Keywords matched against listing titles, descriptions and tags (e.g., 'logo design', 'phone call', 'virtual assistant')"
- Changed
search_workers5 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"Filter by service category"New value: +"Filter by category slug from get_categories" - changed
Input schema / properties / limit / descriptionPrevious value: -"Number of results (default 10, max 50)"New value: +"Number of providers to return (default 10, max 50)" - changed
Input schema / properties / max_hourly_rate / descriptionPrevious value: -"Maximum hourly rate in USD"New value: +"Maximum listed price or hourly rate in USD" - changed
Input schema / properties / min_rating / descriptionPrevious value: -"Minimum profile/listing average rating (1-5); applied locally to returned services (unrated workers excluded)"New value: +"Minimum profile/listing average rating (1-5); applied locally to returned services (unrated workers excluded), fetching more pages until enough providers match" - changed
Input schema / properties / skills / descriptionPrevious value: -"Required skills to search for (e.g., ['Python', 'data analysis'])"New value: +"Skills or keywords to match against listing titles, descriptions and tags (e.g., ['Python', 'data analysis']); combined into one text search"
- Changed
submit_review6 fields changed- changed
Input schema / properties / comment / descriptionPrevious value: -"Written review of the worker's performance"New value: +"Written review of the other party's work or conduct; shown publicly once the review is visible" - changed
Input schema / properties / communication_rating / descriptionPrevious value: -"Communication rating (1-5)"New value: +"Optional communication sub-rating (1-5). Accepted but not currently stored or shown." - changed
Input schema / properties / order_id / descriptionPrevious value: -"The order ID to review"New value: +"ID of the completed order to review" - changed
Input schema / properties / quality_rating / descriptionPrevious value: -"Quality of work rating (1-5)"New value: +"Optional quality sub-rating (1-5). Accepted but not currently stored or shown." - changed
Input schema / properties / rating / descriptionPrevious value: -"Rating from 1 to 5 stars"New value: +"Overall rating from 1 to 5 stars; shown publicly once the review is visible" - changed
Input schema / properties / timeliness_rating / descriptionPrevious value: -"Timeliness/delivery speed rating (1-5)"New value: +"Optional timeliness sub-rating (1-5). Accepted but not currently stored or shown."
13 tool updates
v0.1.0- First observed
browse_jobs - First observed
create_job - First observed
get_categories - First observed
get_job_status - First observed
get_platform_info - First observed
get_pricing_info - First observed
get_recommended - First observed
get_service_details - First observed
hire_worker - First observed
release_payment - First observed
search_services - First observed
search_workers - First observed
submit_review
TDQS
Scored across 13 tools
Most tools are distinct, and the descriptions actively cross-reference each other (e.g. search_services vs search_workers vs get_recommended, get_platform_info vs get_pricing_info vs get_categories). The only real overlap is that search_services and get_recommended both return listing IDs, which could occasionally be confused, but the guidance on when to use each is clear.
Every tool follows a snake_case verb_noun pattern (get_pricing_info, search_services, create_job, hire_worker, release_payment, submit_review). No mixing of conventions or vague verbs.
13 tools is well within the ideal 3-15 range and each covers a distinct step of the search-hire-pay-review or job-posting workflow. No redundant or filler tools.
The hire/pay/review lifecycle is well covered, but the job-post side has a notable gap: create_job exists with no edit or close/delete counterpart (explicitly unsupported), leaving a dead end for managing a posted job. Order cancellation and provider messaging are also absent, though some of these are platform limitations.
Maintenance
Related MCP Connectors
Search, hire and pay a verified human per job from any AI. Humans are handles; AIs call them.
Find tasks for people and AI; publish, claim, discuss and deliver work with verified-email access.
Hire humans for tasks agents cannot do: errands, calls, photos, verification. Escrowed, verified.
Order fixed-price digital tasks done by people: find a service, pick a package, pay via Stripe.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI agents to search for and hire humans for real-world tasks.3326 npm9MIT

ReverseCentaurofficial
AlicenseAqualityBmaintenanceWe make it easy for AI agents to hire humans ethically and fairly.68 npmMIT- AlicenseNot gradedqualityCmaintenanceDelegates real-world digital tasks to vetted humans directly from AI chat. Provides tools to get quotes, post tasks, and check status with escrow protection.25 npmMIT
- AlicenseAqualityDmaintenanceHuman Menu is a marketplace where AI clients post tasks for human workers.105 npmMIT