Skip to main content
Glama

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-mcp

MCP 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 price

  • search_workers, get_recommended: compare providers by skill, rating and price, or rank listings for a task description

  • browse_jobs, get_categories: see open jobs and service categories

  • get_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 job

  • hire_worker: hire a worker for a task

  • get_job_status: track an order

  • release_payment: approve completed work so the worker's listed payout is released

  • submit_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.py

The 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 3000

Open http://localhost:3000 in your browser.


Deploy to Railway (Backend)

Step 1: Create a Railway Project

  1. Go to railway.app and sign in

  2. Click "New Project" → "Deploy from GitHub Repo"

  3. Connect your GitHub account and select your repo (or use "Deploy from Local" with the Railway CLI)

Step 2: Configure the Service

  1. In your Railway project, click on the service

  2. Go to Settings → Build & Deploy

  3. Set Root Directory to backend

  4. Railway will auto-detect the Dockerfile

Step 3: Add Environment Variables

In the Railway dashboard, go to Variables and add:

Variable

Value

PORT

8080 (Railway usually sets this automatically)

FLASK_DEBUG

false

DATABASE_PATH

Optional local override. Production prefers /data/gohirehumans.db.

Step 4: Add a Persistent Volume (Important!)

SQLite needs persistent storage:

  1. In Railway, click "+ New" → "Volume"

  2. Mount path: /data

  3. Do not point production SQLite under /app; /app is ephemeral.

Step 5: Deploy

Railway deploys automatically on push. Your backend URL will look like:

https://gohirehumans-api-production-xxxx.up.railway.app

Step 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 --prod

Option B: GitHub Integration

  1. Go to vercel.com and sign in

  2. Click "Add New Project" → import your repo

  3. Set Root Directory to frontend

  4. Framework Preset: Other

  5. Click Deploy

Step 3: Custom Domain

  1. In Vercel dashboard → Settings → Domains

  2. Add gohirehumans.com

  3. Follow 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 domain

Project 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 file

API Endpoints

Method

Path

Description

GET

/health

Health check

POST

/auth/register

Register new user

POST

/auth/login

Login

GET

/profile

Get current user profile

GET

/services

List service listings

POST

/services

Create a service listing

GET

/jobs

List jobs

GET

/me/services

The caller's own services in every status (auth required; page, per_page, status, include_removed)

GET

/me/jobs

The caller's own jobs in every status, with application_count (auth required)

POST

/jobs

Create a job

POST

/jobs/{id}/apply

Apply to a job; payout-ready account and non-empty cover_message required, optional http(s) portfolio_url; incomplete payout setup returns 403 payout_setup_required

GET

/jobs/{id}/applications

Job-owner/admin-only JSON list; session or read-scoped API key. Each application includes worker_payout_ready (boolean synced hint), suggested_rank (1–3 or null), and suggestion_reasons (up to three fixed-copy strings, empty when not suggested). Only eligible, payout-ready pending/shortlisted applicants on open/reviewing fixed-price jobs with hiring enabled are suggested; no padding, no numeric score. Hiring still re-checks Stripe live; the buyer chooses.

DELETE

/jobs/{id}/apply

Withdraw your own pending application before a hire; one reapply allowed per job

POST

/jobs/{id}/hire

Hire an applicant

GET

/services/{id}/quote

Preview an authenticated, itemized service charge without creating an order

POST

/services/{id}/order

Order a listed service; optionally bind the request to a quote

POST

/orders/{id}/approve

Approve submitted work and release payment

POST

/orders/{id}/review

Leave a review

POST

/seed

Secret-gated local/demo seeding

GET

/admin/dashboard

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:

  1. Make sure the backend is running and accessible

  2. Check that config.js has the correct backend URL

  3. Ensure 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:browser

Set 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 tools
browse_jobsA
Read-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).

NameRequiredDescriptionDefault
limitNoNumber of jobs to return (default 10, max 50). Only the first page is returned.
categoryNoFilter by category slug from get_categories
budget_typeNoFilter by budget type. Only fixed-price jobs can be posted right now, so 'hourly' usually returns none.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
titleYesJob title (e.g., 'Build a React landing page')
categoryYesCategory slug from get_categories (e.g., 'research', 'phone_call', 'data_entry')
budget_typeYesUse 'fixed'. Hourly jobs are not accepted right now and return an error.
descriptionYesPublic job description: the task, deliverables, deadline and anything a worker needs to know
budget_amountYesTotal budget in USD for a fixed-price job: greater than 0, in whole cents, at most 999,999.99
skills_requiredNoList of required skills (e.g., ['React', 'TypeScript', 'CSS'])

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_categoriesA
Read-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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_statusA
Read-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.

NameRequiredDescriptionDefault
job_idNoJob post ID from create_job or browse_jobs (not an order ID)
order_idNoOrder ID from hire_worker. Takes precedence over job_id.

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_infoA
Read-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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_infoA
Read-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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_service_detailsA
Read-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.

NameRequiredDescriptionDefault
service_idYesNumeric service listing ID (e.g., '42') from search_services or get_recommended

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_workerA
DestructiveIdempotent

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).

NameRequiredDescriptionDefault
service_idYesNumeric ID of the service listing to order, from search_services, get_recommended or get_service_details
requirementsNoInstructions for the worker (what to deliver, details, deadline). Saved on the order.
budget_amountNoUSD 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_keyYesUnique 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

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines5/5

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_paymentA
Destructive

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.

NameRequiredDescriptionDefault
ratingNoNot recorded by this tool; rate the worker with submit_review after the order completes. Kept for backward compatibility.
order_idYesID of the order whose submitted work you are approving
milestone_idNoIgnored: the API always approves the order's current submitted milestone. Kept for backward compatibility.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_servicesA
Read-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.

NameRequiredDescriptionDefault
limitNoNumber of listings to return (default 10, max 50). Only the first page of matches is returned.
queryNoKeywords matched against listing titles, descriptions and tags (e.g., 'logo design', 'phone call', 'virtual assistant')
categoryNoFilter by category slug (e.g., 'web_development', 'graphic_design', 'virtual_assistant', 'ai_coding'). Get the full list with get_categories.
max_priceNoMaximum listed price or hourly rate in USD
min_priceNoMinimum listed price or hourly rate in USD

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_workersA
Read-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.

NameRequiredDescriptionDefault
limitNoNumber of providers to return (default 10, max 50)
skillsNoSkills or keywords to match against listing titles, descriptions and tags (e.g., ['Python', 'data analysis']); combined into one text search
categoryNoFilter by category slug from get_categories
min_ratingNoMinimum profile/listing average rating (1-5); applied locally to returned services (unrated workers excluded), fetching more pages until enough providers match
max_hourly_rateNoMaximum listed price or hourly rate in USD

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
ratingYesOverall rating from 1 to 5 stars; shown publicly once the review is visible
commentYesWritten review of the other party's work or conduct; shown publicly once the review is visible
order_idYesID of the completed order to review
quality_ratingNoOptional quality sub-rating (1-5). Accepted but not currently stored or shown.
timeliness_ratingNoOptional timeliness sub-rating (1-5). Accepted but not currently stored or shown.
communication_ratingNoOptional communication sub-rating (1-5). Accepted but not currently stored or shown.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 10 tool updatesv2.1.0
    • Changedbrowse_jobs3 fields changed
      • changedInput schema / properties / budget_type / description
        Previous 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."
      • changedInput schema / properties / category / description
        Previous value: -"Filter by category slug"New value: +"Filter by category slug from get_categories"
      • changedInput schema / properties / limit / description
        Previous 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."
    • Changedcreate_job4 fields changed
      • changedInput schema / properties / budget_amount / description
        Previous 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"
      • changedInput schema / properties / budget_type / description
        Previous value: -"Fixed price or hourly rate"New value: +"Use 'fixed'. Hourly jobs are not accepted right now and return an error."
      • changedInput schema / properties / category / description
        Previous value: -"Category slug (use get_categories to see options)"New value: +"Category slug from get_categories (e.g., 'research', 'phone_call', 'data_entry')"
      • changedInput schema / properties / description / description
        Previous value: -"Detailed job description with requirements and deliverables"New value: +"Public job description: the task, deliverables, deadline and anything a worker needs to know"
    • Changedget_job_status2 fields changed
      • changedInput schema / properties / job_id / description
        Previous 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)"
      • changedInput schema / properties / order_id / description
        Previous value: -"The order ID to check status for"New value: +"Order ID from hire_worker. Takes precedence over job_id."
    • Changedget_recommended3 fields changed
      • changedInput schema / properties / budget_range / description
        Previous 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."
      • changedInput schema / properties / task_description / description
        Previous 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."
      • changedInput schema / properties / urgency / description
        Previous 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."
    • Changedget_service_details1 field changed
      • changedInput schema / properties / service_id / description
        Previous value: -"The unique ID of the service to retrieve"New value: +"Numeric service listing ID (e.g., '42') from search_services or get_recommended"
    • Changedhire_worker4 fields changed
      • changedInput schema / properties / budget_amount / description
        Previous 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."
      • changedInput schema / properties / idempotency_key / description
        Previous 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."
      • changedInput schema / properties / requirements / description
        Previous value: -"Specific requirements or instructions for the worker"New value: +"Instructions for the worker (what to deliver, details, deadline). Saved on the order."
      • changedInput schema / properties / service_id / description
        Previous 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"
    • Changedrelease_payment3 fields changed
      • changedInput schema / properties / milestone_id / description
        Previous 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."
      • changedInput schema / properties / order_id / description
        Previous value: -"The order ID for which to release payment"New value: +"ID of the order whose submitted work you are approving"
      • changedInput schema / properties / rating / description
        Previous 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."
    • Changedsearch_services4 fields changed
      • changedInput schema / properties / limit / description
        Previous 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."
      • changedInput schema / properties / max_price / description
        Previous value: -"Maximum price filter (USD)"New value: +"Maximum listed price or hourly rate in USD"
      • changedInput schema / properties / min_price / description
        Previous value: -"Minimum price filter (USD)"New value: +"Minimum listed price or hourly rate in USD"
      • changedInput schema / properties / query / description
        Previous 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')"
    • Changedsearch_workers5 fields changed
      • changedInput schema / properties / category / description
        Previous value: -"Filter by service category"New value: +"Filter by category slug from get_categories"
      • changedInput schema / properties / limit / description
        Previous value: -"Number of results (default 10, max 50)"New value: +"Number of providers to return (default 10, max 50)"
      • changedInput schema / properties / max_hourly_rate / description
        Previous value: -"Maximum hourly rate in USD"New value: +"Maximum listed price or hourly rate in USD"
      • changedInput schema / properties / min_rating / description
        Previous 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"
      • changedInput schema / properties / skills / description
        Previous 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"
    • Changedsubmit_review6 fields changed
      • changedInput schema / properties / comment / description
        Previous 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"
      • changedInput schema / properties / communication_rating / description
        Previous value: -"Communication rating (1-5)"New value: +"Optional communication sub-rating (1-5). Accepted but not currently stored or shown."
      • changedInput schema / properties / order_id / description
        Previous value: -"The order ID to review"New value: +"ID of the completed order to review"
      • changedInput schema / properties / quality_rating / description
        Previous value: -"Quality of work rating (1-5)"New value: +"Optional quality sub-rating (1-5). Accepted but not currently stored or shown."
      • changedInput schema / properties / rating / description
        Previous value: -"Rating from 1 to 5 stars"New value: +"Overall rating from 1 to 5 stars; shown publicly once the review is visible"
      • changedInput schema / properties / timeliness_rating / description
        Previous value: -"Timeliness/delivery speed rating (1-5)"New value: +"Optional timeliness sub-rating (1-5). Accepted but not currently stored or shown."
  2. 13 tool updatesv0.1.0
    • First observedbrowse_jobs
    • First observedcreate_job
    • First observedget_categories
    • First observedget_job_status
    • First observedget_platform_info
    • First observedget_pricing_info
    • First observedget_recommended
    • First observedget_service_details
    • First observedhire_worker
    • First observedrelease_payment
    • First observedsearch_services
    • First observedsearch_workers
    • First observedsubmit_review

TDQS

A4.4/5.0

Scored across 13 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness3/5

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

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers