Search jobs
search_jobsCall start_job_search before the first search in a conversation, for how to work through a search with the user.
Search Joeb's job postings with a natural-language query and return the best matches as ranked text rows.
Returns the top limit matches (default 25, at most 100), best first,
one row each:
{rank}. [{id}] {title} — {company} · {place} · {remote|on-site} · {seniority} · {salary} · posted {age}
A fact the posting lacks is left out. The bracketed id is the job's
first 12 characters; every tool takes it back, as it takes any unique
prefix of 8 or more characters. detail sets how much a row shows:
"brief" is that one line (about 70 tokens), "summary" (the default)
adds the job's Smart Digest summary, and "digest" adds the company,
the day to day, the requirements and the posting's URL. The raw
posting text is never included; get_jobs with include_posting=true
reads it.
There is no offset. Every search leaves out the jobs the user has liked, dismissed or marked applied (list_saved_jobs lists them) and the postings of companies the user has blocked (list_blocked_companies lists the blocks). So to get the next matches, record the user's decisions with update_jobs, then run the same search again. A job left undecided normally comes back near the top, as an unswiped card would, though not for certain: each search re-reads the query, and the listings can refresh between runs. To look further without deciding, raise limit.
A requirement no filter covers (visa sponsorship, office locations, tech stack, benefits) goes in the query: ranking weighs the query against each posting's content. Then confirm it on the candidates with detail="digest" or get_jobs(include_posting=true) before telling the user a job meets it.
The reply's first lines count the matches and say whether the location was applied, ignored (a remote_only search) or could not be applied, in which case the search covered the whole US and the user should be told. A reply holds at most 40,000 characters: rows that would cross that are left out, and its last lines say how many.
Limited to 5 searches per minute per user, shared with the Joeb web app. Past the limit the search fails with an error saying how many seconds to wait. Refine the query and search again rather than retrying the same search.
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"query": "<query>"
},
"name": "search_jobs"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many of the top-ranked matches to return, from 1 to 100. | |
| query | Yes | What the user is looking for, in plain language: the role, skills, domain and anything else that matters. | |
| detail | No | How much of each job its row shows: "brief", one line of facts; "summary", that line and the Smart Digest summary; "digest", the summary plus the company, the day to day, the requirements and the posting's URL. | summary |
| posted | No | Only jobs posted within the last "week" or "month". Omit it for any time. | |
| remote | No | "remote_only", "onsite_only", or "all", which is the same as omitting it. | |
| location | No | A specific US city to search around, e.g. "Austin, TX". Omit it to search the whole US. A region, a state or a place outside the US can't be filtered on, and a remote_only search ignores it. | |
| radius_km | No | How far around location to search, in kilometers. Omit it for the default radius. | |
| seniority | No | Only jobs at these levels. Empty or omitted: every level. |