Hiring Signals MCP
An MCP server provided by OpenKrill that allows AI agents to monitor company hiring activity. It provides briefs on who is hiring, tracks new and closed job roles since the last check, and identifies the fastest-hiring companies, enabling agents to gather live recruitment intelligence without authentication.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://hiring.openkrill.app/mcpWhat you can do with it
- Monitor specific companies for new job postings
- Track closed or filled roles to assess hiring velocity
- Identify fastest-hiring companies for market research
- Generate hiring briefs for competitive analysis
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- hiring-signals 1.1.0
- MCP protocol
- 2025-06-18
- Tools
- 7 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- 3 advertised
{
"tools": {
"listChanged": false
},
"prompts": {
"listChanged": false
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
7 advertised
company_hiring_brief — Company hiring brief
Best for: what one company is hiring for and how fast, such as "what is Snap hiring for?" or "is Airbnb hiring faster this month?". Returns: open roles, shares remote and with a salary, top departments and countries, the 5 newest roles, and roles opened and closed over 7, 30 and 90 days and per week once the board has a day of history. The board token goes into watch_new_roles. A paid call adds hiring_velocity: new roles per week for 13 weeks, a trend and a percentile among tracked companies. Input tips: {"company": "https://snapchat.wd1.myworkdayjobs.com/snap"}, an "ats:slug" token or a company name. Not for: lists of individual jobs with filters, or people at the company.
{
"type": "object",
"examples": [
{
"company": "greenhouse:airbnb"
}
],
"required": [
"company"
],
"properties": {
"company": {
"type": "string",
"maxLength": 300,
"minLength": 2,
"description": "A careers page URL, an \"ats:slug\" token such as \"greenhouse:airbnb\", or a company name or domain such as \"stripe.com\"."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"api_version",
"company",
"ats",
"board",
"open_roles",
"departments",
"countries",
"newest",
"velocity",
"history_days",
"as_of",
"untrusted_source",
"note",
"source"
],
"properties": {
"ats": {
"type": "string"
},
"note": {
"type": "string"
},
"as_of": {
"type": "string",
"description": "ISO 8601 time the data was published by its source or fetched from it. A cached answer keeps the time of its fetch."
},
"board": {
"type": "string",
"description": "The ats:slug token; pass it to watch_new_roles to follow this board."
},
"newest": {
"type": "array",
"items": {
"type": "object",
"required": [
"title"
],
"properties": {
"title": {
"type": "string"
},
"apply_url": {
"type": [
"string",
"null"
]
},
"posted_at": {
"type": [
"string",
"null"
]
}
}
}
},
"source": {
"type": "object",
"required": [
"name",
"url"
],
"properties": {
"url": {
"type": "string"
},
"name": {
"type": "string"
}
},
"description": "Who the data comes from, to cite and to check it against."
},
"weekly": {
"type": "array",
"items": {
"type": "object",
"required": [
"week",
"opened",
"closed"
],
"properties": {
"week": {
"type": "string"
},
"closed": {
"type": "integer"
},
"opened": {
"type": "integer"
}
}
},
"description": "Roles opened and closed per week (Monday dates, oldest first, up to 13), for boards the history store reads daily."
},
"company": {
"type": "string"
},
"velocity": {
"type": "array",
"items": {
"type": "object",
"required": [
"days",
"since",
"opened",
"closed"
],
"properties": {
"days": {
"type": "integer"
},
"since": {
"type": "string"
},
"closed": {
"type": "integer"
},
"opened": {
"type": "integer"
}
}
},
"description": "Roles opened and closed over each window (7, 30 and, from the history store, 90 days), from daily reads of this board; a window starts no earlier than the first read, and the list is empty until the board has a day of history."
},
"countries": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"roles"
],
"properties": {
"name": {
"type": "string"
},
"roles": {
"type": "integer"
}
}
}
},
"open_roles": {
"type": "integer"
},
"api_version": {
"type": "string",
"const": "2026-10-22",
"description": "Date of this answer's shape; it changes only when a field is removed or changes meaning."
},
"departments": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"roles"
],
"properties": {
"name": {
"type": "string"
},
"roles": {
"type": "integer"
}
}
}
},
"history_days": {
"type": "integer",
"description": "Days of history kept for this board."
},
"remote_share": {
"type": "number",
"description": "Share of open roles marked remote, 0 to 1."
},
"salary_share": {
"type": "number",
"description": "Share of open roles that publish a salary, 0 to 1."
},
"hiring_velocity": {
"type": [
"object",
"null"
],
"properties": {
"as_of": {
"type": "string"
},
"label": {
"type": "string"
},
"trend": {
"enum": [
"rising",
"steady",
"falling",
null
],
"type": [
"string",
"null"
]
},
"weeks": {
"type": "array",
"items": {
"type": "object",
"required": [
"week",
"new"
],
"properties": {
"new": {
"type": "integer"
},
"week": {
"type": "string"
}
}
}
},
"boards": {
"type": "array",
"items": {
"type": "string"
}
},
"method": {
"type": "string"
},
"history": {
"enum": [
"backfilled",
"since_first_read"
],
"type": "string"
},
"percentile": {
"type": [
"integer",
"null"
],
"description": "0 to 100: the share of tracked companies with fewer new roles in their 4 newest weeks."
},
"last_4_weeks": {
"type": "array",
"items": {
"type": "object",
"required": [
"week",
"new"
],
"properties": {
"new": {
"type": "integer"
},
"week": {
"type": "string"
}
}
}
},
"new_last_7_days": {
"type": "integer"
},
"ranked_companies": {
"type": "integer"
}
},
"description": "Paid calls only. New roles per ISO week (Monday dates) for the company's tracked boards, each role once on the day its board says it was posted (Greenhouse, Lever, Ashby) or first seen: the last 7 days, the 4 newest weeks, 13 weeks, a trend and the percentile among tracked companies. Counts only roles still open or seen since the board was first read. Null when the history store does not track the board."
},
"untrusted_source": {
"type": "boolean"
},
"hiring_velocity_hint": {
"type": "string",
"description": "Present instead of hiring_velocity on a call that was not paid: how to get it."
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}watch_new_roles — Watch companies for new and closed roles
Best for: following companies over time, such as "watch Stripe and Ramp and tell me about new roles". Returns: a watch_key, then on later calls the roles opened and closed since the last call (up to 100 of each listed, all counted). The first call is a baseline: it records the open roles and reports none as new. Input tips: {"companies": ["greenhouse:airbnb", "lever:spotify"]} to start; {"watch_key": "hs_..."} to check, plus companies to add (at most 25). Not for: a one-off look at one company (use company_hiring_brief).
{
"type": "object",
"examples": [
{
"companies": [
"greenhouse:airbnb"
]
}
],
"properties": {
"companies": {
"type": "array",
"items": {
"type": "string",
"maxLength": 300,
"minLength": 2
},
"maxItems": 25,
"minItems": 1,
"description": "Careers page URLs, \"ats:slug\" tokens or company names, such as [\"greenhouse:airbnb\", \"https://jobs.lever.co/spotify\"]. Added to the watch."
},
"watch_key": {
"type": "string",
"pattern": "^hs_[0-9a-f]{32}$",
"description": "The watch_key an earlier call returned. Leave it out to start a new watch."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"api_version",
"watch_key",
"baseline",
"boards",
"open_roles",
"new_count",
"closed_count",
"new_roles",
"closed_roles",
"failed",
"as_of",
"untrusted_source",
"note",
"source"
],
"properties": {
"note": {
"type": "string"
},
"as_of": {
"type": "string",
"description": "ISO 8601 time the data was published by its source or fetched from it. A cached answer keeps the time of its fetch."
},
"since": {
"type": [
"string",
"null"
],
"description": "When the watch was last read."
},
"boards": {
"type": "integer"
},
"failed": {
"type": "array",
"items": {
"type": "object",
"required": [
"company",
"code"
],
"properties": {
"code": {
"type": "string"
},
"company": {
"type": "string"
}
}
}
},
"source": {
"type": "object",
"required": [
"name",
"url"
],
"properties": {
"url": {
"type": "string"
},
"name": {
"type": "string"
}
},
"description": "Who the data comes from, to cite and to check it against."
},
"baseline": {
"type": "boolean",
"description": "True on a watch's first read: every open role is recorded and none is reported as new. A company added later is recorded the same way on its first read."
},
"new_count": {
"type": "integer"
},
"new_roles": {
"type": "array",
"items": {
"type": "object",
"required": [
"board",
"title",
"url"
],
"properties": {
"url": {
"type": "string"
},
"board": {
"type": "string"
},
"title": {
"type": "string"
},
"company": {
"type": [
"string",
"null"
]
}
}
}
},
"watch_key": {
"type": "string",
"description": "Keep it: it is the only way to read this watch again. Calls with it return changes since the last call."
},
"open_roles": {
"type": "integer"
},
"api_version": {
"type": "string",
"const": "2026-10-22",
"description": "Date of this answer's shape; it changes only when a field is removed or changes meaning."
},
"closed_count": {
"type": "integer"
},
"closed_roles": {
"type": "array",
"items": {
"type": "object",
"required": [
"board",
"title",
"url"
],
"properties": {
"url": {
"type": "string"
},
"board": {
"type": "string"
},
"title": {
"type": "string"
},
"company": {
"type": [
"string",
"null"
]
}
}
}
},
"untrusted_source": {
"type": "boolean"
}
}
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}watchlist_digest — Watchlist hiring digest
Best for: which watched companies are hiring fastest, such as "who on my watch is hiring most this week?". Returns: per company on the watch, open roles and roles opened and closed over 7 and 30 days, fastest first. It reads the watch's last read and the daily snapshots, never a job board, so call watch_new_roles first for fresh counts. Input tips: {"watch_key": "hs_..."}. Not for: starting a watch (use watch_new_roles).
{
"type": "object",
"examples": [
{
"watch_key": "hs_00000000000000000000000000000000"
}
],
"required": [
"watch_key"
],
"properties": {
"watch_key": {
"type": "string",
"pattern": "^hs_[0-9a-f]{32}$",
"description": "The watch_key an earlier call returned. Leave it out to start a new watch."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"api_version",
"boards",
"last_call_at",
"as_of",
"source"
],
"properties": {
"as_of": {
"type": "string",
"description": "ISO 8601 time the data was published by its source or fetched from it. A cached answer keeps the time of its fetch."
},
"boards": {
"type": "array",
"items": {
"type": "object",
"required": [
"board",
"open_roles"
],
"properties": {
"board": {
"type": "string"
},
"company": {
"type": [
"string",
"null"
]
},
"closed_7d": {
"type": [
"integer",
"null"
]
},
"opened_7d": {
"type": [
"integer",
"null"
]
},
"closed_30d": {
"type": [
"integer",
"null"
]
},
"open_roles": {
"type": "integer"
},
"opened_30d": {
"type": [
"integer",
"null"
]
}
}
}
},
"source": {
"type": "object",
"required": [
"name",
"url"
],
"properties": {
"url": {
"type": "string"
},
"name": {
"type": "string"
}
},
"description": "Who the data comes from, to cite and to check it against."
},
"api_version": {
"type": "string",
"const": "2026-10-22",
"description": "Date of this answer's shape; it changes only when a field is removed or changes meaning."
},
"last_call_at": {
"type": "string"
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}segment_hiring_ranking — Fastest-hiring companies in a segment
Best for: who is hiring fastest in a market, such as "which companies added the most sales roles in Berlin this week?". Returns: companies ranked by new roles over 7 days, each with boards, open roles, baseline weekly average, ratio and a spike flag, plus as_of and the method. Input tips: {"segment": {"function": "sales", "city": "berlin"}}, {"segment": {"ats": ["greenhouse"]}} or {"segment": {"companies": ["stripe.com"]}}; no segment ranks every company. A function or city segment is this week's leaderboard list (at most 50). Country and size are not filters. Needs: an API key on the segment plan (49 USD a month); else subscription_required with plan_page. Not for: one company's detail (use company_hiring_brief).
{
"type": "object",
"examples": [
{
"limit": 20,
"segment": {
"ats": [
"greenhouse"
]
}
}
],
"properties": {
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Companies to return, fastest first. Default 50."
},
"segment": {
"type": "object",
"properties": {
"ats": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[a-z0-9-]{2,40}$"
},
"maxItems": 20,
"minItems": 1,
"description": "Hiring systems, such as [\"greenhouse\", \"lever\", \"ashby\"]."
},
"city": {
"type": "string",
"pattern": "^[a-z0-9-]{1,80}$",
"description": "A city slug from the leaderboard, such as \"berlin\", \"new-york\" or \"remote\"; with function, both must match."
},
"function": {
"enum": [
"engineering",
"sales",
"marketing",
"ops",
"support",
"product",
"design",
"other"
],
"type": "string",
"description": "Companies on this week's leaderboard for this function: the most new roles in it over 7 days, at most 50."
},
"companies": {
"type": "array",
"items": {
"type": "string",
"maxLength": 300,
"minLength": 3
},
"maxItems": 100,
"minItems": 1,
"description": "Companies, as a domain (\"stripe.com\"), a board token (\"greenhouse:airbnb\") or a company key from an earlier answer (\"domain:stripe.com\")."
}
},
"description": "Which companies to rank. Leave it out to rank every company the history store reads.",
"additionalProperties": false
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"api_version",
"segment",
"as_of",
"method",
"companies",
"source"
],
"properties": {
"as_of": {
"type": "string",
"description": "ISO 8601 time the data was published by its source or fetched from it. A cached answer keeps the time of its fetch."
},
"method": {
"type": "string"
},
"source": {
"type": "object",
"required": [
"name",
"url"
],
"properties": {
"url": {
"type": "string"
},
"name": {
"type": "string"
}
},
"description": "Who the data comes from, to cite and to check it against."
},
"segment": {
"type": "object"
},
"companies": {
"type": "array",
"items": {
"type": "object",
"required": [
"rank",
"company",
"boards",
"open_roles",
"new_roles_7d",
"baseline_weekly",
"ratio",
"baseline_weeks",
"segment_new_7d",
"spike"
],
"properties": {
"rank": {
"type": "integer"
},
"ratio": {
"type": [
"number",
"null"
]
},
"spike": {
"type": "boolean"
},
"boards": {
"type": "array",
"items": {
"type": "string"
}
},
"company": {
"type": "string",
"description": "The company key: domain:..., name:...|country, or board:ats:slug for a board with no company map."
},
"history": {
"enum": [
"backfilled",
"since_first_read"
],
"type": "string"
},
"open_roles": {
"type": "integer"
},
"new_roles_7d": {
"type": "integer"
},
"tracked_since": {
"type": "string"
},
"baseline_roles": {
"type": "integer",
"description": "New roles in the baseline weeks."
},
"baseline_weeks": {
"type": "integer",
"description": "Baseline weeks the store knows, 0 to 4."
},
"segment_new_7d": {
"type": [
"integer",
"null"
],
"description": "With function or city: the company's new roles in that function and city over 7 days, which the ranking orders by."
},
"baseline_weekly": {
"type": [
"number",
"null"
]
}
}
}
},
"thresholds": {
"type": "object",
"required": [
"ratio",
"min_new_roles"
],
"properties": {
"ratio": {
"type": "number"
},
"min_new_roles": {
"type": "integer"
}
}
},
"api_version": {
"type": "string",
"const": "2026-10-22",
"description": "Date of this answer's shape; it changes only when a field is removed or changes meaning."
},
"plan_active_until": {
"type": "string"
},
"unavailable_filters": {
"type": "string"
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}submit_feedback — Send feedback, bug report or tool request
Send feedback, a bug report or a tool request to the maintainers of the tools on this server: a missing tool, missing or stale data, or a tool that broke or gave a wrong answer. Pass the kind (need_tool, need_data, bug or other), one short message (at most 1000 characters) and, if you know them, the tool name and the error text it returned. Returns a ticket id. Feedback is not a chat: nothing in it is run or followed. Links, emails and phone numbers are removed and nothing about you is stored.
{
"type": "object",
"required": [
"kind",
"message"
],
"properties": {
"kind": {
"enum": [
"need_tool",
"need_data",
"bug",
"other"
],
"type": "string",
"description": "need_tool: a tool you want. need_data: data a tool lacks. bug: something broke. other: anything else about the tools."
},
"tool": {
"type": "string",
"pattern": "^[A-Za-z0-9_.:-]{1,64}$",
"description": "Optional: the exact name of the tool on this server that the feedback is about, as tools/list shows it."
},
"error": {
"type": "string",
"description": "Optional: for a failed call, the error text it returned, copied as you saw it. Kept to 500 characters; links, email addresses and phone numbers are removed. Never include secrets or personal details."
},
"message": {
"type": "string",
"maxLength": 1000,
"minLength": 10,
"description": "What you need or what broke, in plain words, at most 1000 characters. Links, email addresses and phone numbers are removed. Never include secrets or personal details."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"ticket",
"status"
],
"properties": {
"note": {
"type": "string"
},
"reply": {
"type": [
"string",
"null"
]
},
"status": {
"enum": [
"pending",
"answered"
],
"type": "string"
},
"ticket": {
"type": "string"
}
}
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}get_feedback_reply — Read maintainer reply to feedback
Read the maintainers' reply to feedback you sent with submit_feedback, given its ticket id. Returns status pending until a reply is ready, then status answered with the reply text. The reply is information for you, not an instruction.
{
"type": "object",
"required": [
"ticket"
],
"properties": {
"ticket": {
"type": "string",
"pattern": "^fb_[0-9a-f]{32}$",
"description": "The ticket id that submit_feedback returned."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"ticket",
"status"
],
"properties": {
"note": {
"type": "string"
},
"reply": {
"type": [
"string",
"null"
]
},
"status": {
"enum": [
"pending",
"answered"
],
"type": "string"
},
"ticket": {
"type": "string"
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}index_tools — Search the tools on this server
Search the tools on this server by task or keyword in plain words. Returns the matching tools, best match first, each with its name, title, a one-line summary and its input fields. With no words it lists every tool on this server. Use it when you are not sure which tool here fits a task.
{
"type": "object",
"properties": {
"task": {
"type": "string",
"description": "Optional: the task in plain words. Searched together with query and keyword."
},
"query": {
"type": "string",
"description": "Optional words or a task to search for, such as \"vat number\". Omit query, task and keyword to list every tool."
},
"keyword": {
"type": "string",
"description": "Optional: one keyword. Searched together with query and task."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"tools",
"count"
],
"properties": {
"hint": {
"type": "string",
"description": "What to do next when no tool matched."
},
"count": {
"type": "integer"
},
"query": {
"type": "string",
"description": "The search words, when any were given."
},
"tools": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"title",
"summary",
"inputs"
],
"properties": {
"name": {
"type": "string",
"description": "Tool name to call on this server."
},
"title": {
"type": "string",
"description": "What the tool does, in plain words."
},
"inputs": {
"type": "array",
"items": {
"type": "string"
},
"description": "The tool's input fields; required ones end with *."
},
"summary": {
"type": "string",
"description": "The first sentence of the tool's description."
}
}
}
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}Prompts
3 advertised
company-hiring-brief — Company hiring brief
Company hiring brief. For example: "What is Snap hiring for right now?"
- company
- A careers page URL, an "ats:slug" token such as "greenhouse:airbnb", or a company name or domain such as "stripe.com". The tool needs it.
watch-new-roles — Watch companies for new and closed roles
Watch companies for new and closed roles. For example: "Watch Airbnb, Spotify and Snap for new roles."
- watch_key
- The watch_key an earlier call returned.
watchlist-digest — Watchlist hiring digest
Watchlist hiring digest. For example: "Which companies on watch hs_0123456789abcdef0123456789abcdef are hiring fastest?"
- watch_key
- The watch_key an earlier call returned. The tool needs it.
Resources
Not advertised
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 1151 ms
- 95th percentile latency
- 1151 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 1151 ms · metadata changed · 7 tool(s), 3 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http hiring-signals-mcp https://hiring.openkrill.app/mcpCodex
codex mcp add hiring-signals-mcp --url https://hiring.openkrill.app/mcpCursor
{
"mcpServers": {
"hiring-signals-mcp": {
"url": "https://hiring.openkrill.app/mcp"
}
}
}Cline
{
"mcpServers": {
"hiring-signals-mcp": {
"type": "streamableHttp",
"url": "https://hiring.openkrill.app/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"hiring-signals-mcp": {
"type": "http",
"url": "https://hiring.openkrill.app/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http hiring-signals-mcp https://hiring.openkrill.app/mcpClaude Desktop
{
"mcpServers": {
"hiring-signals-mcp": {
"url": "https://hiring.openkrill.app/mcp"
}
}
}Windsurf
{
"mcpServers": {
"hiring-signals-mcp": {
"serverUrl": "https://hiring.openkrill.app/mcp"
}
}
}Let your agent find its tools
Find servers like Hiring Signals MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other productivity and knowledge servers
Do you run Hiring Signals MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.