MCP server
Connect AI agents and MCP clients to JobsPipe — search live job postings with your API key over the Model Context Protocol.
JobsPipe runs a Model Context Protocol server so AI agents and MCP-capable clients (Claude, Cursor, and custom MCP hosts) can search live job postings directly, without you writing any HTTP code.
The server speaks MCP over Streamable HTTP at:
https://mcp.jobspipe.dev/mcpHow it works
The MCP server is a thin layer over the JobsPipe API. You authenticate with the same API key you use for the REST API — a key that starts with jp_live_. The server forwards your requests to the API under that key, so:
- Results, sources, and freshness are identical to the REST API.
- Usage counts against your plan, and your plan's quota and rate limits apply.
- There is no separate login, OAuth flow, or extra secret to manage.
Create or copy a key from your dashboard, then pass it as a bearer token on the connection:
Authorization: Bearer jp_live_xxxxxxxxxxxxxxxxxxxxxxxxA request without a valid jp_live_ key is rejected with 401 Unauthorized.
Connect a client
Claude Code
claude mcp add --transport http jobspipe https://mcp.jobspipe.dev/mcp \
--header "Authorization: Bearer jp_live_xxxxxxxxxxxxxxxxxxxxxxxx"Claude Desktop / other connector UIs
Add a custom connector (remote MCP server) with:
- URL:
https://mcp.jobspipe.dev/mcp - Header:
Authorization=Bearer jp_live_xxxxxxxxxxxxxxxxxxxxxxxx
Generic MCP config
Clients that read a JSON config (Cursor and similar) use the streamable-HTTP form:
{
"mcpServers": {
"jobspipe": {
"url": "https://mcp.jobspipe.dev/mcp",
"headers": {
"Authorization": "Bearer jp_live_xxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
}Once connected, the tools below appear automatically and the agent can call them.
Tools
| Tool | Description |
|---|---|
search_jobs | Search live job postings from 30+ sources, normalized into one schema. |
list_pricing_plans | List JobsPipe plans with monthly price, job quota, and max results per call. |
search_jobs
Every filter is optional and combined with AND. The most useful inputs:
| Parameter | Type | Description |
|---|---|---|
job_title_or | string[] | Match jobs whose title contains any of these phrases. |
job_title_not | string[] | Exclude jobs whose title contains any of these phrases. |
description_or | string[] | Match jobs whose description contains any of these phrases. |
company_name_or | string[] | Match jobs from any of these exact company names. |
job_country_code_or | string[] | ISO country codes to include, e.g. ["US","GB"]. |
region_or | string[] | US states and Canadian provinces as ISO 3166-2 codes, e.g. ["US-NY","CA-ON"]. |
employment_type_or | string[] | full-time, part-time, contract, temporary, internship. |
source_or | string[] | Match any collector source, e.g. ["linkedin","greenhouse"]. |
source_not | string[] | Exclude sources, e.g. ["indeed","linkedin"] for ATS-direct only. |
job_seniority_or | string[] | Seniority levels to include. |
remote | boolean | true returns remote-only, false excludes remote. |
work_arrangement_or | string[] | remote, hybrid or onsite — finer than remote, which reads false for hybrid and onsite alike. |
posted_at_gte | string | Only postings on or after this date (YYYY-MM-DD). |
posted_at_max_age_days | number | Only postings newer than this many days. |
limit | number | Max rows to return (capped by your plan). |
offset | number | Pagination offset. |
include_total_results | boolean | Populate metadata.total_results (slightly slower). |
work_arrangement is not populated yet, so work_arrangement_or currently matches zero jobs — it fills in as postings are re-ingested and backfilled. Use remote until then.
A typical agent call:
{
"job_title_or": ["data engineer"],
"remote": true,
"posted_at_max_age_days": 14,
"limit": 25,
"include_total_results": true
}The response mirrors the REST API: a metadata block (with total_results and a next_cursor for paging) and a data array of normalized postings — title, company, location, country, salary range, seniority, posting date, and the apply URL. Each posting also carries sources (every board it was seen on, not just the first), last_seen_at and verified_at (when a recheck last confirmed the posting was live, and when we last looked at all), and is_manager and job_function where they are known — is_manager is what separates a principal individual contributor from an actual director, since seniority files both under "director". See the job schema for the full shape and for how much of the corpus carries each field.
Use cases
- Job-search copilots. Give an agent natural-language access to live postings — "find remote senior Rust roles posted this week" becomes a single
search_jobscall with filters. - Sales and recruiting intelligence. New postings are a strong buying and outreach signal. An agent can watch for companies hiring a specific role or stack and feed that into a CRM or sequencing tool.
- Market and hiring-trend research. Use
include_total_resultswith date and location filters to size demand — how many remote data-engineering roles opened in the US in the last 14 days. - Dataset enrichment. Pull normalized postings for a list of
company_name_ortargets to attach live hiring activity to an existing account list.
Limits and errors
The MCP server inherits your plan's limits from the REST API:
| Status | Meaning |
|---|---|
401 | Missing or invalid API key — pass a jp_live_ bearer token. |
402 | Monthly request quota exceeded for your plan. |
429 | Per-second rate limit exceeded. |
Call list_pricing_plans to see the quota, rate limit, and max results per call for each plan.
Other agent surfaces
Beyond MCP, JobsPipe is discoverable by autonomous agents:
- Agent skills —
SKILL.mddocuments for autonomous discovery athttps://jobspipe.dev/.well-known/agent-skills/index.json. llms.txt— an agent-friendly index of the site athttps://jobspipe.dev/llms.txt. Every content page is also available as raw Markdown.- OpenAPI spec — the API's machine-readable schema at
https://api.jobspipe.dev/openapi.json, and an interactive reference athttps://api.jobspipe.dev/docs/reference.