# Interviewstack Jobs

> Official InterviewStack.io job-search tools for AI assistants. Search live curated jobs, polish your resume, and draft tailored applications from your terminal.

- **Type:** MCP server
- **Install:** `agentstack add mcp-interviewstackio-interviewstack-jobs`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [interviewstackio](https://agentstack.voostack.com/s/interviewstackio)
- **Installs:** 0
- **Category:** [Search](https://agentstack.voostack.com/c/search)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [interviewstackio](https://github.com/interviewstackio)
- **Source:** https://github.com/interviewstackio/interviewstack-jobs

## Install

```sh
agentstack add mcp-interviewstackio-interviewstack-jobs
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# InterviewStack.io Job Search - for your AI assistant

Search **live, curated jobs** from the [InterviewStack.io job board](https://interviewstack.io/job-board)
from **any MCP-compatible AI assistant** - Claude Code, Cursor, VS Code + Copilot,
OpenAI Codex, Windsurf, and more. Let your AI find roles that genuinely fit you,
polish your resume against real postings, and draft tailored applications.

Under the hood this is **one open [MCP](https://modelcontextprotocol.io) server** - 
the same endpoint and tools for every client. This repo packages it for easy setup
plus the workflow guidance that makes it sing: a **Claude Code plugin** (one-click,
bundles the skills) and a portable **[`AGENTS.md`](./AGENTS.md)** that Codex, Cursor,
Copilot, Windsurf and ~20 other tools read natively.

> Jobs are sourced from **InterviewStack.io** (the `.io` job board - not a `.com`).

---

## Quick start - one copy-paste, then just talk

1. **Get a key** (free) - sign in at [app.interviewstack.io/sidenav/job-search-mcp](https://app.interviewstack.io/sidenav/job-search-mcp) and click Create key. That page fills your key into the command below automatically and has a **Test connection** button to confirm it works. One active key at a time - delete it from the same page if you need a fresh one.
2. **Connect Claude Code** - paste this ONE line in your Terminal (your key is embedded, no shell setup, nothing to forget):
   ```bash
   claude mcp add --transport http interviewstack-jobs https://mcp-job-search.interviewstack-io.workers.dev/mcp --header "Authorization: Bearer isk_your_key_here"
   ```
   Then fully quit and reopen Claude Code, and run `/mcp` to confirm **interviewstack-jobs** is connected. Using a different tool? See [Step 2](#step-2---connect-your-tool).
3. **(Optional) add the guided skills** - paste in Claude Code for auto-updating tailor/resume/digest workflows:
   ```
   /plugin marketplace add interviewstackio/interviewstack-jobs
   /plugin install interviewstack-jobs@interviewstack-jobs
   ```
4. **That's the whole setup. Now just ask:**
   > "Find new jobs that match my resume and save the best ones for me every morning."

   Your assistant takes it from there: asks for your resume, sets up the morning
   schedule itself (jittered, on your machine), and from then on the best new
   matches land in [your application tracker](https://app.interviewstack.io/sidenav/my-applications)
   with a note on why each one fits. You review and apply. Jobs you remove are
   never re-saved. More ideas: [starter prompts](#starter-prompts---what-to-ask-it).

Prefer to script the schedule yourself instead of asking in chat? See
[Step 3](#step-3---daily-digest-on-autopilot).

---

## Step 1 - Get your API key (all tools)

Sign in at **[app.interviewstack.io/sidenav/job-search-mcp](https://app.interviewstack.io/sidenav/job-search-mcp)**
and click **Create key**. Copy the key (`isk_…`) - it's shown once. The page also
has a **Test connection** button: paste your key there to confirm it works before
you wire it into a tool. One active key at a time: delete it from the same page if
you need a fresh one (anything still using the old key stops working).

> **Paste the key directly into each tool's config** (shown in Step 2). The
> configs below embed the literal key - no shell environment variables, which
> GUI-launched editors often don't inherit and are the #1 cause of a silent
> "Unauthorized" later. **Never commit your key.** It's read-only and
> rate-limited, but treat it like a password; delete-and-recreate anytime.

## Step 2 - Connect your tool

The MCP endpoint is the same everywhere:
`https://mcp-job-search.interviewstack-io.workers.dev/mcp` with header
`Authorization: Bearer `.

Claude Code

**Most reliable - one line in your Terminal** (key embedded, no env vars):

```bash
claude mcp add --transport http interviewstack-jobs https://mcp-job-search.interviewstack-io.workers.dev/mcp --header "Authorization: Bearer isk_your_key_here"
```

Quit and reopen Claude Code, then verify with `/mcp`.

**Optional - also get the bundled, auto-updating skills** (tailor-application,
resume-polish, daily-job-digest). Paste inside Claude Code:

```
/plugin marketplace add interviewstackio/interviewstack-jobs
/plugin install interviewstack-jobs@interviewstack-jobs
```

The plugin reads your key from an `INTERVIEWSTACK_MCP_KEY` environment variable,
so if you use the plugin route, add `export INTERVIEWSTACK_MCP_KEY="isk_…"` to
your `~/.zshrc` (or `~/.bashrc`) and relaunch Claude Code from a fresh terminal.
The one-line command above needs none of that. Enable auto-update under `/plugin`
→ Marketplaces → `interviewstack-jobs` → **Enable auto-update**.

Cursor

Add to `~/.cursor/mcp.json` (global - works in every project). Paste your real
key in place of `isk_your_key_here`:

```json
{
  "mcpServers": {
    "interviewstack-jobs": {
      "url": "https://mcp-job-search.interviewstack-io.workers.dev/mcp",
      "headers": { "Authorization": "Bearer isk_your_key_here" }
    }
  }
}
```

Save the file, then fully quit and reopen Cursor; check **Settings → MCP** for a
green dot. For the workflow guidance, copy [`AGENTS.md`](./AGENTS.md) into your
project root (Cursor reads it), or add it under `.cursor/rules/`.

VS Code + GitHub Copilot (agent mode)

Add to `.vscode/mcp.json`:

```json
{
  "servers": {
    "interviewstack-jobs": {
      "type": "http",
      "url": "https://mcp-job-search.interviewstack-io.workers.dev/mcp",
      "headers": { "Authorization": "Bearer ${input:interviewstack_key}" }
    }
  },
  "inputs": [
    {
      "id": "interviewstack_key",
      "type": "promptString",
      "description": "InterviewStack.io MCP key",
      "password": true
    }
  ]
}
```

VS Code prompts once for the key and stores it securely. For guidance, drop
[`AGENTS.md`](./AGENTS.md) in the repo root - Copilot reads it (or
`.github/copilot-instructions.md`).

OpenAI Codex CLI

Add to `~/.codex/config.toml`. The first line (at the very top of the file, not
inside any `[section]`) lets Codex use a literal key instead of an environment
variable. Paste your real key in place of `isk_your_key_here`:

```toml
experimental_use_rmcp_client = true

[mcp_servers.interviewstack-jobs]
url = "https://mcp-job-search.interviewstack-io.workers.dev/mcp"
bearer_token = "isk_your_key_here"
```

Save, restart Codex, then run `codex mcp list` to confirm. Codex reads
[`AGENTS.md`](./AGENTS.md) natively - copy it into your project root.

Windsurf

Add to `~/.codeium/windsurf/mcp_config.json`. Paste your real key in place of
`isk_your_key_here`:

```json
{
  "mcpServers": {
    "interviewstack-jobs": {
      "serverUrl": "https://mcp-job-search.interviewstack-io.workers.dev/mcp",
      "headers": { "Authorization": "Bearer isk_your_key_here" }
    }
  }
}
```

Save, then in Windsurf open the Cascade panel → MCP and click **Refresh** (or
restart Windsurf). Windsurf reads [`AGENTS.md`](./AGENTS.md) - copy it into your
project root.

Any other MCP client

Point your client at a remote **Streamable-HTTP** MCP server:

```json
{
  "mcpServers": {
    "interviewstack-jobs": {
      "type": "http",
      "url": "https://mcp-job-search.interviewstack-io.workers.dev/mcp",
      "headers": { "Authorization": "Bearer YOUR_KEY_HERE" }
    }
  }
}
```

Some clients (e.g. older Claude Desktop builds) only support stdio MCP - bridge with
[`mcp-remote`](https://www.npmjs.com/package/mcp-remote):
`npx mcp-remote https://mcp-job-search.interviewstack-io.workers.dev/mcp --header "Authorization: Bearer YOUR_KEY"`.
Then add [`AGENTS.md`](./AGENTS.md) for the workflow guidance.

Once connected, grab a prompt from [Starter prompts](#starter-prompts---what-to-ask-it) below.

### Not working? Unblock it

Almost every problem is the key. The fastest fix is the **Test connection** button
on [the key page](https://app.interviewstack.io/sidenav/job-search-mcp) - paste
your key and it tells you immediately if the key itself is good.

- **"Unauthorized" / 401** - the key is missing, mistyped, or you pasted the
  placeholder (`isk_your_key_here`) instead of your real key. Copy the whole key
  (starts with `isk_`), no missing characters or stray spaces. Can't find it? You
  can't recover it - delete it on the key page and create a new one.
- **The tool doesn't show the server** - fully **quit and reopen** the tool (not
  just close the window); configs are only read on a fresh start. Cursor/VS
  Code/Windsurf also have an MCP **Refresh** button.
- **Worked yesterday, not today** - a key works only until it's deleted or
  replaced. If you made a new key, update every tool and scheduled digest with it.
- **Is it safe to put the key in a file?** - Yes. It only reads jobs, is
  rate-limited, and you can delete it anytime. That's why we embed it directly
  instead of fiddling with system environment variables - fewer things to break.

Still stuck? Email [support@interviewstack.io](mailto:support@interviewstack.io) with
the tool you're using.

---

## Step 3 - Daily digest on autopilot

This is the step that makes the whole thing passive: a scheduled run finds what's
**new** for you each morning, **auto-saves the strongest matches** (each with a
one-line "why it fits" note) into your
[application tracker](https://app.interviewstack.io/sidenav/my-applications), and
writes a compact digest to a log. You review and apply from the tracker - jobs you
remove are never re-saved.

The easiest way: **just ask your assistant** - *"set up my daily job digest to run
on a local open model."* It will run the installer, set up Ollama, and schedule it.
Or do it yourself:

### Recommended - free + private, on a local open model

The recurring run uses a **local open model** (via [Ollama](https://ollama.com)) -
no hosted-AI key, no per-token bills, and your resume/profile never leaves your
machine. After setup, each morning is just `python3 digest.py`.

```bash
# Installs Ollama if needed, pulls the model, and writes a JITTERED schedule.
INTERVIEWSTACK_MCP_KEY=isk_... WINDOW_START=6 WINDOW_END=9 \
  ./examples/cron/open-model/setup.sh
```

Then edit `~/.config/interviewstack-digest/config.json` (your profile + search
criteria) and test with `python3 ~/.config/interviewstack-digest/digest.py --dry-run`.
Full guide: [`examples/cron/open-model/`](examples/cron/open-model/).

### Alternative - hosted AI each morning

Prefer to spend a hosted-AI call per run instead of running a local model?

```bash
DIGEST_PROMPT="Run my daily job digest: new senior ML engineer roles, remote, US, \
posted in the last 3 days, deduped against my last run. Top 6, save the best 2-3 \
to my tracker with concrete fit reasons." \
WINDOW_START=6 WINDOW_END=9 ./examples/cron/setup-daily-digest.sh
```

This template runs Claude Code headlessly; on another tool (Codex, Copilot, ...),
schedule that tool's equivalent headless command with the same jittered timing.

> **⏰ Always jitter the schedule.** Don't run it at 09:00 sharp. If everyone runs
> on the hour, the shared job database takes a synchronized hit and gets slow for
> everyone. Both setup scripts randomize the time for you; if you schedule manually,
> pick a random minute (e.g. `07:23`, not `08:00`). The digest isn't time-critical.

---

## Starter prompts - what to ask it

Copy-paste any of these into your connected AI tool. They're ordered roughly by
where you are in a job search.

**Explore what the board covers**
> "What job search tools do you have from InterviewStack, and what roles does the
> board support for someone with my background? Here's my resume: [paste]"

**Find roles that actually fit you (not keyword soup)**
> "Here's my resume: [paste]. Find roles on the InterviewStack board that genuinely
> fit my background - rank by real fit, be honest about stretches, and show salary
> where listed."

**Targeted search with hard constraints**
> "Find senior backend engineer roles, remote, US, posted this week, paying
> $180k+. I need visa sponsorship. Top 10, newest first."

**Build a shortlist and save it for later**
> "Search for staff product manager roles in fintech, hybrid or remote in NYC.
> Save the 3 best fits to my InterviewStack tracker with a concrete reason for
> each, and give me the link to review them."

**Tailor applications to the best matches**
> "Here's my resume: [paste]. Find the 2 best-fitting senior data scientist roles
> posted this week and draft tailored resume bullets, a short cover note, and the
> apply link for each. Save both to my tracker."

**Polish your resume against real demand**
> "Pull 8-10 real senior DevOps postings from the InterviewStack board, tell me
> which skills and phrasings keep recurring, and rewrite my resume toward that
> demand. Here's the current version: [paste]"

**Scope a career pivot with real data**
> "I'm a data analyst who wants to move toward ML engineering. Using the
> InterviewStack board: which adjacent roles exist, what do their postings ask for
> that I don't have yet, and which current openings would accept my profile today?"

**Market recon**
> "What are the highest-paying remote machine learning roles on the board right
> now? Which companies show up most in those results?"

**Set up the recurring digest (interactive alternative to Step 3)**
> "Set up a daily job digest for me: new senior frontend roles, remote, EU,
> every morning at a randomized time between 7 and 9. Each run, save the best 2-3
> new matches to my tracker with fit reasons and keep the digest to 6 lines."

A few habits that get better results: paste your **real resume** (fit ranking is
only as good as what the agent knows about you), state **hard constraints**
explicitly (visa, salary floor, location), and ask it to be **honest about
stretches** - the board's curated taxonomy means "no good matches" is a real,
useful answer.

---

## Use a local, open model (free and private)

Prefer to run the AI on your own machine? Point a local open-source model at the same
MCP server. Two real wins:

- **Free.** No API keys, no per-token bills. The model runs on your hardware; your only
  cost is your own compute.
- **Private.** Your model and your **resume stay on your machine**. (Job search still
  calls our hosted MCP, so the job data comes from InterviewStack.io, but your resume
  and the model never leave your computer.)

**What you need**

1. A local runtime. [Ollama](https://ollama.com) is the simplest.
2. A model that is good at **tool calling** - this workflow is multi-step (the agent
   calls `find_roles`, then `search_jobs`, then `get_job`), so an agentic/coding model
   is the right pick. A strong, ~30B example is **`qwen3-coder:30b`** (tuned for tool
   use; budget roughly 24 GB+ of RAM/VRAM at a 4-bit quant). Smaller 7-14B models work
   but are less reliable at the multi-tool flow. (If you specifically want a ~27B model,
   Google's `gemma3:27b` is another option, but pick one trained for tool calling.)
3. An MCP-capable agent client that supports local models, such as
   [Cline](https://cline.bot) for VS Code.

**Recipe: Cline + Ollama + Qwen3-Coder**

```bash
# 1. Pull the model (see ollama.com/library for current tags)
ollama pull qwen3-coder:30b
```

```json
// 2. In Cline, add the MCP server (MCP Servers -> Configure), remote HTTP:
{
  "mcpServers": {
    "interviewstack-jobs": {
      "type": "streamableHttp",
      "url": "https://mcp-job-search.interviewstack-io.workers.dev/mcp",
      "headers": { "Authorization": "Bearer YOUR_KEY" }
    }
  }
}
```

3. In Cline, choose **Ollama** as the API provider and `qwen3-coder:30b` as the model.
4. Drop [`AGENTS.md`](./AGENTS.md) into your workspace so the model follows the
   curated-filters-first workflow, then ask it to find roles and tailor to your resume.

> **Honest note:** local models are less reliable at multi-step tool orchestration than
> frontier hosted models, so expect to guide them a bit more. The curated-filters-first
> design (resolve the role with `find_roles`, then a structured `se

…

## Source & license

This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [interviewstackio](https://github.com/interviewstackio)
- **Source:** [interviewstackio/interviewstack-jobs](https://github.com/interviewstackio/interviewstack-jobs)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/mcp-interviewstackio-interviewstack-jobs
- Seller: https://agentstack.voostack.com/s/interviewstackio
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
