JobsPipe
AI Agents

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/mcp

How 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_xxxxxxxxxxxxxxxxxxxxxxxx

A 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

ToolDescription
search_jobsSearch live job postings from 30+ sources, normalized into one schema.
list_pricing_plansList 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:

ParameterTypeDescription
job_title_orstring[]Match jobs whose title contains any of these phrases.
job_title_notstring[]Exclude jobs whose title contains any of these phrases.
description_orstring[]Match jobs whose description contains any of these phrases.
company_name_orstring[]Match jobs from any of these exact company names.
job_country_code_orstring[]ISO country codes to include, e.g. ["US","GB"].
region_orstring[]US states and Canadian provinces as ISO 3166-2 codes, e.g. ["US-NY","CA-ON"].
employment_type_orstring[]full-time, part-time, contract, temporary, internship.
source_orstring[]Match any collector source, e.g. ["linkedin","greenhouse"].
source_notstring[]Exclude sources, e.g. ["indeed","linkedin"] for ATS-direct only.
job_seniority_orstring[]Seniority levels to include.
remotebooleantrue returns remote-only, false excludes remote.
work_arrangement_orstring[]remote, hybrid or onsite — finer than remote, which reads false for hybrid and onsite alike.
posted_at_gtestringOnly postings on or after this date (YYYY-MM-DD).
posted_at_max_age_daysnumberOnly postings newer than this many days.
limitnumberMax rows to return (capped by your plan).
offsetnumberPagination offset.
include_total_resultsbooleanPopulate 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_jobs call 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_results with 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_or targets 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:

StatusMeaning
401Missing or invalid API key — pass a jp_live_ bearer token.
402Monthly request quota exceeded for your plan.
429Per-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:

On this page