Koskamo

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.

Hiring Signals MCP logo, by OpenKrillVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by OpenKrill
MCP endpoint (Streamable HTTP)
https://hiring.openkrill.app/mcp
Vendor documentation

What 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

Vendor evidenceRegistry 1.0.0
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
Server-advertised capabilities
{
  "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.

Hiring Signals: Who is hiring, what changed. Use company_hiring_brief when the user asks what a company is hiring for or how fast. Use watch_new_roles to follow companies: the first call returns a watch_key and records the open roles (baseline true, nothing new yet); tell the user to keep the key. Later calls with that watch_key return new and closed roles since the last call. Use watchlist_digest with the key to rank the watched companies by hiring pace. Use segment_hiring_ranking for the fastest-hiring companies in a segment (a function, a city, a company list or hiring systems); it needs an API key on the segment plan, and on subscription_required give the user plan_page and stop. Velocity is empty until a board has snapshots that old; say so rather than guessing. Never invent a watch_key. Do not look up or contact people at the companies. This server allows 60 tool calls a minute per network and 5,000 a day for all callers together; the day count resets at 00:00 UTC. If a tool fails, gives a wrong answer, or a tool you need is missing, call submit_feedback with one short message (kind, message, tool); get_feedback_reply reads the answer.

Tools

7 advertised

company_hiring_brief — Company hiring brief
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

company_hiring_brief input schema
{
  "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
}
company_hiring_brief output schema
{
  "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."
    }
  }
}
company_hiring_brief annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
watch_new_roles — Watch companies for new and closed roles
Advertised by the server during the last successful anonymous check.
Open-world

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).

watch_new_roles input schema
{
  "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
}
watch_new_roles output schema
{
  "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"
    }
  }
}
watch_new_roles annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
watchlist_digest — Watchlist hiring digest
Advertised by the server during the last successful anonymous check.
Advertised read-only

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).

watchlist_digest input schema
{
  "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
}
watchlist_digest output schema
{
  "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"
    }
  }
}
watchlist_digest annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
segment_hiring_ranking — Fastest-hiring companies in a segment
Advertised by the server during the last successful anonymous check.
Advertised read-only

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).

segment_hiring_ranking input schema
{
  "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
}
segment_hiring_ranking output schema
{
  "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"
    }
  }
}
segment_hiring_ranking annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
submit_feedback — Send feedback, bug report or tool request
Advertised by the server during the last successful anonymous check.
Open-world

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.

submit_feedback input schema
{
  "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
}
submit_feedback output schema
{
  "type": "object",
  "required": [
    "ticket",
    "status"
  ],
  "properties": {
    "note": {
      "type": "string"
    },
    "reply": {
      "type": [
        "string",
        "null"
      ]
    },
    "status": {
      "enum": [
        "pending",
        "answered"
      ],
      "type": "string"
    },
    "ticket": {
      "type": "string"
    }
  }
}
submit_feedback annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
get_feedback_reply — Read maintainer reply to feedback
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_feedback_reply input schema
{
  "type": "object",
  "required": [
    "ticket"
  ],
  "properties": {
    "ticket": {
      "type": "string",
      "pattern": "^fb_[0-9a-f]{32}$",
      "description": "The ticket id that submit_feedback returned."
    }
  },
  "additionalProperties": false
}
get_feedback_reply output schema
{
  "type": "object",
  "required": [
    "ticket",
    "status"
  ],
  "properties": {
    "note": {
      "type": "string"
    },
    "reply": {
      "type": [
        "string",
        "null"
      ]
    },
    "status": {
      "enum": [
        "pending",
        "answered"
      ],
      "type": "string"
    },
    "ticket": {
      "type": "string"
    }
  }
}
get_feedback_reply annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
index_tools — Search the tools on this server
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

index_tools input schema
{
  "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
}
index_tools output schema
{
  "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."
          }
        }
      }
    }
  }
}
index_tools annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

3 advertised

company-hiring-brief — Company hiring brief

Advertised by the server during the last successful anonymous check.

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

Advertised by the server during the last successful anonymous check.

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

Advertised by the server during the last successful anonymous check.

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

No resource definitions available.

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.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http hiring-signals-mcp https://hiring.openkrill.app/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add hiring-signals-mcp --url https://hiring.openkrill.app/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable hiring-signals-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "hiring-signals-mcp": {
      "url": "https://hiring.openkrill.app/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "hiring-signals-mcp": {
      "type": "streamableHttp",
      "url": "https://hiring.openkrill.app/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start hiring-signals-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "hiring-signals-mcp": {
      "type": "http",
      "url": "https://hiring.openkrill.app/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http hiring-signals-mcp https://hiring.openkrill.app/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "hiring-signals-mcp": {
      "url": "https://hiring.openkrill.app/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "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.

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.

Claim this listing