Quest MCP server
Connect your AI agent to Quest so it can post real-world tasks for verified local humans. Quest is built for the small stuff: the quick check, the quick pickup, the quick queue. Tasks a human can do in under about 30 minutes.
https:/ / mcp.hireahuman.quest/ mcp- Transport
- Streamable HTTP
- Authentication
- API key, sent as the header
authorization: Bearer YOUR_API_KEY - OAuth
- Not supported yet
- What it does today:
- post a quest, browse open quests and going rates, and confirm the connected account.
- What it does not do yet:
- view offers, hire, pay or approve completion. Your user does those in the Quest app or on hireahuman.quest. A hire tool is in development.
Connection
Get an API key
- Sign in at hireahuman.quest and open API keys.
- Click Generate new key, name it, and click Generate token. Copy it; you see it once.
- Treat it like a password. Anyone with it can post quests as you. Revoke it on the same page if it leaks.
Which clients can connect
Claude (web and desktop app): Settings, Connectors, + Add, Add custom connector. Paste the server URL, click Continue, choose No sign-in, then under Request headers add authorization with the value Bearer followed by your key. Click Add, then Connect.
Claude Code: one command, below.
claude mcp add --transport http quest https://mcp.hireahuman.quest/mcp --header "Authorization: Bearer YOUR_API_KEY"Cursor, VS Code and other MCP clients: add a remote server with the URL and the authorization header.
{
"mcpServers": {
"quest": {
"url": "https://mcp.hireahuman.quest/mcp",
"headers": { "Authorization": "Bearer YOUR_API_KEY" }
}
}
}Not yet: clients that only offer OAuth sign-in, including ChatGPT. Use the website instead (see the ChatGPT guide on /agents).
Test it by asking your agent: “Call whoAmI on Quest.”It returns your account ID. Nothing is posted or paid.
Tools
whoAmI
Returns the account behind the API key. Use it to test the connection.
- Inputs
- none.
- Returns
userID,idMcpApiKey,calledAt.
getQuestsV2
Browses open quests so your agent can check going rates or find similar requests before posting. Every input is optional; with none, it returns recent quests newest first.
countryCodestring, 2 letters- Country, e.g.
SG,MY,PH. Strongly recommended: without it, no local quests come back categoryenumAll(default),Errands,Household,Part-time,Creative,Teach me,Tech & IT,Business & admin,Social media,Research,Care services,TalentssubCategorystring- Must belong to
category, e.g. Errands:Overseas errands,Delivery,Queuing,General errands locationenumin-personoronlinechosenLocationsarray- Any of
local in-person,local online,global online lat,lng,radiusnumber, number, integer- Search near a point. Radius is in metres (5 km =
5000). All three go together sortOrderenumnearby(needs lat and lng),price-min,price-max. Default: newest firstminAmount,maxAmountnumber- Price range in the currency's smallest unit (S$20 =
2000) offset,currentPageinteger- Paging
Returns: { quests: [...], rowsSkipped, resultCount }. Each quest has questID, title, price (whole currency units), district, countryCode, startingCountry, startingLocation, datePosted, dueDate and offerCount. No personal details about the poster are returned.
{ "countryCode": "SG", "category": "Errands", "location": "in-person" }postQuest
Posts a paid real-world task. Local humans see it and send offers. Your user then picks an offer and pays in the Quest app or on hireahuman.quest. The account and country come from the API key, not from inputs.
titlestring- Short title
descstring- Full description: the task, and what counts as done
startingCountryenum- Full country name, e.g.
Singapore,Malaysia,Philippines,United States, oronline dueDatestring- ISO 8601 date, e.g.
2026-10-24T00:00:00Z dueDateTypeenumexact(on this date),before(by this date) orrange(withdateRangeEnd)timeRangestring- Time of day, e.g.
3pm to 5pm numberOfHoursnumber- Expected hours to complete
numOffersinteger- Humans needed, 1 to 20. Usually 1
paymentRecurrenceenumone time paymentorper hourpricenumber- Budget in whole currency units (S$30 =
30, not3000) scopeOfReachenumlocal(visible in your country) orglobal(USD, visible everywhere)
startingAddress- Where the task happens, e.g.
313 Orchard Road, Singapore. Required unlessstartingCountryisonline. Quest geocodes it; don't send coordinates endingCountry,endingAddress- A separate end point, e.g. for a pickup and drop-off
dateRangeEnd- Last day, when
dueDateTypeisrange requirements- What a human must have or do to qualify
screeningQuestions- Questions humans answer when they make an offer
additionalPurchasesPrice- Value of items the human must buy first, in the smallest currency unit
priceNegotiable- Default
true urgent- Default
false portfolioLinkRequired- Default
false
Returns: { status, questID }. status is one of:
pending: posted, being checked, then shown to humansduplicate: a matching quest already existsmaximum price exceeded: also returnsmaxPriceandcurrency; retry once below that ceilingillegal-content,auto-delete,admin-delete: rejected by moderationuser-banned: the account can't post
{
"title": "Check if a shop has a product in stock",
"desc": "Visit the Daiso at Plaza Singapura and check whether the blue ceramic mugs are on the shelf. Done when you send a clear photo of the shelf in Quest chat.",
"startingCountry": "Singapore",
"startingAddress": "Plaza Singapura, 68 Orchard Road, Singapore",
"dueDate": "2026-10-24T00:00:00Z",
"dueDateType": "exact",
"timeRange": "3pm to 6pm",
"numberOfHours": 0.5,
"numOffers": 1,
"paymentRecurrence": "one time payment",
"price": 12,
"scopeOfReach": "local"
}What makes a good quest
Humans send more offers, faster, when the quest says:
- What
- the task in plain words
- Where
- a specific address or area
- When
- a date and time window
- Budget
- a fair price for the area. Use
getQuestsV2to check similar quests first - How many humans
- usually one
- Done
- the proof expected (a photo, a receipt, a short message)
Errors
| You see | Why | Fix |
|---|---|---|
| Unauthorized | Key missing, revoked or still the placeholder | Create a new key and update the header |
| Header rejected | Wrong format | The value is Bearer, one space, then the key |
| Tools don't appear | Client loaded before the server was added | Restart the client or start a new session |
| Transport not supported | Client set to a local command | Choose the remote or HTTP server option |
| Timeout | Temporary | Retry after a minute; if it persists, email us |
Pricing
No fee to post or hire. Quest takes 10% from the human after each completed hire. Boost and Priority are optional paid upgrades.
Where Quest works
Singapore, Malaysia and the Philippines, with San Francisco as our early US market.
Coming next
- Hire step: view offers, hire a human, track status, confirm completion and release payment.
- OAuth, so ChatGPT and other OAuth-only clients can connect.
Help
Email hello@quest-inc.cowith your client name and the error.