About jobhunt
jobhunt is a local bridge to Jobven for searching job postings and employer profiles collected from company career sites. It serves job seekers and job-data workflows with detailed filters, full posting lookups, company searches, and sample webhook deliveries; it forwards calls rather than searching independently.
Key features
- 01Search jobs with broad filters
- 02Fetch complete job descriptions
- 03Search employers and retrieve profiles
- 04Generate sample webhook deliveries
- 05Forward calls to Jobven
Use cases
- 01Find openings by location, skills, or salary
- 02Read a selected posting in full
- 03Look up employer information
- 04Test a webhook receiver with sample data
MCP support
Exposes five Jobven tools to MCP clients for job and company lookups and webhook examples. It forwards tool calls to the hosted Jobven MCP server and returns upstream results.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
Tools
5Saved tool list · updated 2d ago
| Parameter | Type | Required | Description |
|---|---|---|---|
| q | string | No | Search job titles by whole word. Words are ANDed in any order; "double quotes" match an exact phrase, OR matches either side, and a leading - excludes a word. Case-insensitive. Does not search descriptions (see descriptionQuery). |
| city | string | No | City, comma-separated; case and accents are ignored |
| limit | integer | No | Jobs per page, default 10, at most 25 |
| order | enum | No | Default DESCASC | DESC |
| state | string | No | State, province or region, comma-separated: full name ("Ontario") or, for the US and Canada, the postal code ("ON") |
| cursor | string | No | nextCursor from the previous search_jobs result, same filters |
| skills | array | No | Skills, any of (up to 10), e.g. ["typescript", "react"] |
| sortBy | enum | No | Sort field (default postedAt)postedAt | listedAt | title | company |
| status | enum | No | "active" (the default) or "closed"active | closed |
| country | string | No | ISO 3166-1 alpha-2 country code, e.g. "US", "CA", "GB". "XX" matches jobs with no location at all. |
| industry | array | No | Industries, any of (up to 10) |
| language | string | No | Required spoken language, ISO 639-1 code, e.g. "fr" |
| location | string | No | Free-text location: city, region or country |
| maxSalary | number | No | Maximum yearly starting pay, as minSalary |
| minSalary | number | No | Minimum yearly pay; hourly, daily, weekly and monthly pay is compared per year. In each job's own currency unless salaryCurrency is set |
| remoteType | array | No | Remote type, any of |
| listedAfter | integer | No | Listed at or after (Unix seconds), by listedAt: for incremental sync |
| postedAfter | integer | No | Posted at or after (Unix seconds) |
| includeTotal | boolean | No | Also count every match (slower) |
| postedBefore | integer | No | Posted before (Unix seconds) |
| hasRelocation | boolean | No | true: postings that offer relocation help; false: postings that say they do not |
| employmentType | array | No | Employment type, any of |
| salaryCurrency | string | No | ISO 4217 currency code of the salary, e.g. USD, EUR, PLN |
| experienceLevel | array | No | Experience level, any of |
| descriptionQuery | string | No | Search job descriptions for a whole-word phrase, matched literally, case-insensitive. Slower than the other filters; pair it with postedAfter. |
| hasVisaSponsorship | boolean | No | true: postings that offer visa sponsorship; false: postings that say they do not |
Details
From the project READMEjobhunt
jobhunt is a small local bridge to the hosted Jobven MCP server, which collects job postings and employer profiles from company career sites. Through it you can search openings with a broad filter set — title and description phrases, remote type, experience level, employment type, skills, industry, language, place, salary range, sponsorship and posting dates — pick a single posting to read in full, find employers by name, open one employer's profile, or pull a sample webhook delivery to test a receiver against.
This package searches nothing itself. It answers the tool list locally, exactly as captured from the live endpoint, and forwards each tool call upstream, returning whatever comes back untouched. Per the captured descriptions, jobs returned by a search and single job or company lookups count toward the monthly allowance on your own Jobven account, while company searches are free. Nothing in this package can apply for a job, submit an application, send a message, start a checkout, or mint a key: it only reads through the five calls below, plus the sample webhook example which sends nothing and signs nothing real.
Tools
search_jobs— search Jobven job postings with the filters ofGET /v1/public/jobs. Returns 10 jobs by default (at most 25) with a plain-text excerpt of each description;get_jobhas the full text. PassnextCursorback ascursor, with the same filters, for the next page. Each job returned counts toward the monthly allowance. Every argument is optional:q(title words; ANDed in any order,"double quotes"for an exact phrase,ORfor either side, a leading-to exclude; case-insensitive; does not search descriptions),descriptionQuery(whole-word phrase in descriptions, matched literally; case-insensitive; slower, pair withpostedAfter),remoteType(onsite,remote,hybrid,flexible),experienceLevel(entry,mid,senior,lead,executive),employmentType(full_time,part_time,contract,internship,seasonal,volunteer,temporary,per_diem,other),skills,industry,language(ISO 639-1 code),location,country(ISO 3166-1 alpha-2;XXmatches jobs with no location),state,city,minSalary,maxSalary,salaryCurrency(ISO 4217 code),hasVisaSponsorship,hasRelocation,status(active, the default, orclosed),postedAfter,postedBefore,listedAfter(Unix seconds),sortBy(postedAt,listedAt,title,company),order(ASCorDESC, defaultDESC),includeTotal,cursor, andlimit(1-25, default 10).get_job— one Jobven job posting byid, with the full description (GET /v1/public/jobs/{id}). Required:id(a job id fromsearch_jobs, UUID form). Optional:descriptionFormat(plain, the default, ormarkdown). Counts as one job toward the monthly allowance.search_companies— find employers Jobven collects jobs from by name (GET /v1/public/companies). Returnsid,nameandwebsite;get_companyhas the profile. Free: company searches do not count toward the allowance. Every argument is optional:search(name contains this text),status(activeorinactive; both when unset),isVerified,sortBy(name,foundedYear,totalJobsPosted,activeJobsCount,createdAt),sortOrder(ASCorDESC),page(from 1), andlimit(1-25, default 10).get_company— one employer's profile byid(GET /v1/public/company-profiles/{id}): what it does, industry, size, founding year, headquarters and social links. Required:id(a company id fromsearch_companies). Counts as one toward the monthly allowance.webhook_example— a sample Jobven webhook delivery for one event: the raw body and headers exactly as a receiver gets them, signed with an example secret, plus the signature verifier from the webhook docs in TypeScript, Python or Go. The verifier accepts the sample, so a receiver can be tested end to end. No API call, no key needed, free. Required:event(job.created,job.updated,job.closed,job.deleted) andlanguage(typescript,python,go).
Configuration
JOBVEN_MCP_URL(optional) — override the upstream endpoint. Defaults tohttps://api.jobven.com/mcp. (The override hook is this rebuild's own labelled reconstruction.)JOBVEN_API_KEY(optional) — when set, every upstream request carries anX-API-Key: <value>header, for the caller's own Jobven API key. When it is not set, no key header is sent. (The header name is pinned by the original's registry record, which declares a required secretX-API-Keyheader; the record pins no package env name, so forwarding the key from this env var is a labelled reconstruction — the original surface was captured keyless.)
Forwarding mechanics
On the first tool call the client opens a streamable
HTTP session upstream: a JSON-RPC initialize
request (protocolVersion 2025-03-26, clientInfo
name jobhunt), then a notifications/initialized
notification, then the tools/call request carrying
the caller's arguments unchanged. When the upstream
answers initialize with an Mcp-Session-Id header,
that value rides on every later request of the
session, which is reused for the life of the process.
Replies may arrive as plain JSON or as server-sent
events; both are read.
Successful upstream results pass through verbatim,
including any isError flag the upstream sets.
Failures — a JSON-RPC error, a non-2xx status, an
unreadable response, or a request that cannot be
completed — come back as an isError result whose
text starts with jobhunt error: (this rendering is
this rebuild's own labelled reconstruction).
CLI
Each tool is also a subcommand taking one JSON argument string:
npx @reneturcios/jobhunt search_jobs '{"q":"typescript","remoteType":["remote"]}'
npx @reneturcios/jobhunt get_job '{"id":"00000000-0000-0000-0000-000000000000"}'
npx @reneturcios/jobhunt search_companies '{"search":"acme"}'
npx @reneturcios/jobhunt get_company '{"id":42}'
npx @reneturcios/jobhunt webhook_example '{"event":"job.created","language":"python"}'
npx @reneturcios/jobhunt --version
Exit codes: 0 on success, 1 on an isError
result, 2 on a usage error.
MCP server
npx -y @reneturcios/jobhunt mcp
MCP client config:
{
"mcpServers": {
"jobhunt": {
"command": "npx",
"args": ["-y", "@reneturcios/jobhunt", "mcp"]
}
}
}
Docker
docker run -i ghcr.io/cloudcorprecords/jobhunt
docker run --rm ghcr.io/cloudcorprecords/jobhunt --version
The container's default command is mcp, so the first
form is a stdio MCP server; any other arguments reach
the CLI normally.
Development
npm install
npm run build
npm test
npm run dev
The test suite runs entirely against a stubbed JSON-RPC upstream — no live network calls.
License
MIT — see LICENSE.
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.