GigNGo MCP Server

Seven read-only tools over real US local-services data — who does what work where, what homeowners are actually posting, and which markets answer a job when one is posted. No API key, no account, no signup.

POST https://gigngo.org/mcp 7 tools No auth Protocol 2025-06-18 50 states

Connect

The server speaks Streamable HTTP. Point any MCP client at the endpoint below — there is nothing to install and nothing to authenticate.

Claude Code

claude mcp add --transport http gigngo https://gigngo.org/mcp

Claude Desktop / any client using a JSON config

{
  "mcpServers": {
    "gigngo": {
      "type": "http",
      "url": "https://gigngo.org/mcp"
    }
  }
}

Raw JSON-RPC, to check it yourself

curl -s -X POST https://gigngo.org/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
GET returns 405, and that is correct. There is no server-initiated SSE stream, and the MCP spec asks for 405 in that case. If your client reports a 405 on GET /mcp, it is talking to the right server the wrong way — use POST.

The seven tools

ToolWhat it answers
search_local_workersWho does this trade near this city or state? Returns public profiles — name, bio, skills, per-skill rates, service area, profile URL.
get_worker_profileThe full public profile for one local, by profile slug.
list_service_categoriesThe 30 top-level service slugs — house-cleaning, handyman, moving-help and so on. Call this before guessing a slug.
check_service_availabilityWhich services have active locals in a given state or city, with counts. Answers "can I get X done in Y?" without a search.
browse_open_tasksOpen jobs homeowners have posted, with the budget they set, the category, the age, and how many locals have applied.
get_area_demand_densityPer-market: jobs posted, locals who applied, share of jobs that got any reply, and median hours to a first applicant.
get_platform_infoCoverage, category counts, app links, matching model, API docs.

The part other marketplaces do not publish

Price tables are easy to find and mostly guesswork — a survey asking people what they think they paid. What is hard to find is whether a posted job actually gets answered, because it is the number that makes a marketplace look bad. get_area_demand_density is that number, per city, and it is served straight.

Live as of 7 September 2026, over a rolling 90-day window:

345 jobs posted across 214 areas
160 applications
110 jobs (31.9%) received at least one applicant
 81 of 214 areas saw any applicant at all

Los Angeles, CA   22 jobs   19 applicants   45.5% answered   median 435h to first reply
Passaic, NJ        1 job     4 applicants    100% answered   median  32h to first reply
Every rate is shrunk toward the platform mean before ranking, and the raw numbers are still returned unmodified. One job that happened to get three replies is a 100% response rate and means nothing; ranking on that recommends coin flips. Each row carries a confidence value — jobs ÷ (jobs + 10) — so you can tell a real market from a lucky one. Passaic above sits at 0.09. Los Angeles sits at 0.69. Filter with minJobs when you need the fundable shortlist rather than the heat map.

What this data is not

Reading these honestly will save you from building on something that is not there.

  • There are no reviews. rating and reviewCount exist in the response shape and are empty for every worker on the platform. Do not rank on them, and do not present them to a user as a quality signal.
  • Open jobs include expired ones by default. Of 358 jobs currently returned by browse_open_tasks, 227 are past their expiry. expired is derived at read time and every task carries it; meta.expiredIncluded reports the count whether or not you filter. Pass expired: false if you want a live board. The default includes them because changing it would silently move the board under existing consumers.
  • Supply is thin and honestly so. This is an early marketplace. Most city-and-service pairs have one local, not ten. check_service_availability returns the real count; treat a count of 1 as a count of 1.
  • Nobody is vetted. GigNGo does not run background checks or verify credentials, and no field in this API should be read as though it does.
  • Free text is redacted, and the marker is visible. Job titles, descriptions and details pass through contact-info redaction before they are served, leaving [phone removed] rather than deleting silently. If you are building a dataset, that marker is signal, not noise.

Conventions

  • Locations are lowercase hyphenated slugs. Full state names — new-york, florida — and city slugs like los-angeles. Two-letter codes are accepted for state and normalised.
  • Service slugs come from list_service_categories. There are 30 top-level services and 337 finer-grained category ids underneath them; the finer ids resolve to a top-level slug, and an unrecognised one resolves to null rather than being folded into other.
  • Rate limit: 200 requests per 15 minutes per IP. The response carries X-RateLimit-Reset.
  • Tasks carry no service radius. Matching is worker-side: each local sets the distance they are notified within. The default is 25 miles and the most common setting is 75.

The same data over plain REST

Every MCP tool wraps a public REST route, so if you are not running an MCP client the data is still one curl away. The OpenAPI description is at /api/openapi.json and the browsable reference at /api/docs.

curl -s 'https://gigngo.org/api/v1/tasks/open?limit=5&expired=false'
curl -s 'https://gigngo.org/api/v1/tasks/density?minJobs=5'
curl -s 'https://gigngo.org/api/v1/platform/info'

Machine-readable discovery lives at /.well-known/mcp.json, and a plain-text summary for crawlers at /llms.txt.

Who runs it

GigNGo is a local-services marketplace built and run by one person in Grand Rapids, Michigan. Homeowners post everyday jobs; nearby locals claim them directly. There is no commission and no lead fee — locals pay a flat monthly subscription instead — so the price a homeowner agrees is the price the local keeps.

Questions, a bug, or a tool you wish existed: [email protected].