hh-relay: public hh.ru search relay
hh-relay
A read-only relay over api.hh.ru: it holds its own app OAuth token and exposes vacancy search and details via MCP and ChatGPT Actions, no user keys
Low risk
We rate an entry low when it mostly gives the agent instructions and reference material.
Why this level
- Only two read-only tools for search and vacancy details, no access to personal account data
- The public server is hosted by the author, so client requests go to their side
Install
In your terminal, with SkillFoxx CLI
npx skillfoxx add mcp/hh-relayDetects the agents on your machine, checks the risk and pins the version.
Other ways to install
Assembled automatically, review before installing.
Run in a terminal
claude mcp add --transport http hh-relay https://hh-relay.vercel.app/mcpOr add to the file .mcp.json, in the project
{
"mcpServers": {
"hh-relay": {
"type": "http",
"url": "https://hh-relay.vercel.app/mcp"
}
}
}If the file already exists, add the server inside the mcpServers key.
The button opens the agent and offers to add the server. If nothing happens, copy the config below.
Add to the file ~/.cursor/mcp.json, for all projects
{
"mcpServers": {
"hh-relay": {
"url": "https://hh-relay.vercel.app/mcp"
}
}
}If the file already exists, add the server inside the mcpServers key. For a single project, put the same block into .cursor/mcp.json.
The button opens the agent and offers to add the server. If nothing happens, copy the config below.
Run in a terminal
code --add-mcp '{"name":"hh-relay","type":"http","url":"https://hh-relay.vercel.app/mcp"}'Or add to the file .vscode/mcp.json, in the project
{
"servers": {
"hh-relay": {
"type": "http",
"url": "https://hh-relay.vercel.app/mcp"
}
}
}If the file already exists, add the server inside the servers key.
Run in a terminal
codex mcp add hh-relay --url https://hh-relay.vercel.app/mcpOr add to the file ~/.codex/config.toml, for all projects
[mcp_servers.hh-relay]
url = "https://hh-relay.vercel.app/mcp"If the file already exists, append the block to the end.
Run in a terminal
gemini mcp add -s user -t http hh-relay https://hh-relay.vercel.app/mcpOr add to the file ~/.gemini/settings.json, for all projects
{
"mcpServers": {
"hh-relay": {
"httpUrl": "https://hh-relay.vercel.app/mcp"
}
}
}If the file already exists, add the server inside the mcpServers key.
Add to the file ~/.config/devin/mcp_config.json, for all projects
{
"mcpServers": {
"hh-relay": {
"serverUrl": "https://hh-relay.vercel.app/mcp"
}
}
}If the file already exists, add the server inside the mcpServers key. Legacy Cascade keeps the MCP config in ~/.codeium/windsurf/mcp_config.json.
Formerly Windsurf.
Add to the file cline_mcp_settings.json, for all projects
{
"mcpServers": {
"hh-relay": {
"type": "streamableHttp",
"url": "https://hh-relay.vercel.app/mcp"
}
}
}If the file already exists, add the server inside the mcpServers key. Open the settings file in Cline: MCP Servers tab, Configure MCP Servers.
Add to the file .roo/mcp.json, in the project
{
"mcpServers": {
"hh-relay": {
"type": "streamable-http",
"url": "https://hh-relay.vercel.app/mcp"
}
}
}If the file already exists, add the server inside the mcpServers key.
A fork of Roo Code, same .roo folders.
Add to the file opencode.json, in the project
{
"mcp": {
"hh-relay": {
"type": "remote",
"url": "https://hh-relay.vercel.app/mcp"
}
}
}If the file already exists, add the server inside the mcp key.
Add to the file ~/.config/zed/settings.json, for all projects
{
"context_servers": {
"hh-relay": {
"url": "https://hh-relay.vercel.app/mcp"
}
}
}If the file already exists, add the server inside the context_servers key.
Connect the published server at https://hh-relay.vercel.app/mcp as a remote MCP with no authorization, or run your own instance: export HH_CLIENT_ID and HH_CLIENT_SECRET for an approved hh.ru app, run uv sync --all-groups and uv run uvicorn hh_relay.app:app, then call search_vacancies and get_vacancy.
Other ways from the author
{
"mcpServers": {
"hh-relay": {
"url": "https://hh-relay.vercel.app/mcp"
}
}
}The published public server, no authorization needed.
This is third-party code. Review the repository files before installing.
What it does
hh.ru requires clients to use OAuth 2.0 Client Credentials to reach its official API, so the relay holds an approved hh.ru app's client_id and client_secret server-side and fetches the application token itself, while public relay clients go through no authorization at all. The REST endpoints GET /api/vacancies/search (up to 50 unique vacancies from the last 24 hours, filterable by region and experience) and GET /api/vacancies/{id} return normalized data, with the description field's untrusted HTML from hh.ru explicitly flagged as needing safe handling on the client side. A separate stateless MCP endpoint /mcp exposes two read-only tools: search_vacancies and get_vacancy. Errors from hh.ru (403, 429, a changed response shape) turn into stable codes like upstream_forbidden or upstream_structure_changed, and logs contain only the request path and exception type, no tokens or search text. Two ready-made skills ship with it: searching Python vacancies and drafting a cover letter from a vacancy card through the same MCP.
Who it is for. For ChatGPT Actions and MCP client developers who need public hh.ru vacancy search without registering their own app or handling OAuth.
Good fit when
- You need hh.ru search and vacancy details without registering your own app and handling OAuth keys
- You want a stable error format instead of parsing api.hh.ru's codes and response shape directly
- You want ready-made skills for Python vacancy search and cover letter drafting
Not a fit when
- You need personal account data: applications, resumes, messages. The relay only handles public vacancy search via an application token
- You need more than 50 vacancies per search or results older than 24 hours: the relay deliberately limits results
- You need your own physically isolated server rather than the shared public https://hh-relay.vercel.app
Example request
Find Python FastAPI vacancies in Moscow with 1-3 years of experience from the last dayLimitations
The repository has no stated license. Running your own instance needs an approved hh.ru app with client_id and client_secret; the README explicitly warns not to pass them to public endpoints or commit them to Git. Search is limited to the last 24 hours and 50 unique vacancies per call. The creation_time field is always empty because the official API doesn't provide a separate confirmed value.
How to disable. Remove the hh-relay block from your MCP client configuration or your Custom GPT Action settings.
MCP
- Transport
- http
- Authentication
- not required
| Environment variables | |
|---|---|
| HH_CLIENT_ID required, secret | Client ID of an approved hh.ru app, needed only to run your own relay instance. |
| HH_CLIENT_SECRET required, secret | The Client Secret for the same hh.ru app. |
Security check
- Only two read-only tools for search and vacancy details, no access to personal account data
- The public server is hosted by the author, so client requests go to their side
README in short
The README describes a FastAPI relay for Custom GPT Actions and MCP that fetches its own application token via OAuth 2.0 Client Credentials and serves hh.ru vacancy search. It lists REST endpoints with curl examples, a full table of upstream error codes, an MCP-for-ChatGPT section with a public no-auth address, and Vercel deploy steps with environment variables. Tests use anonymized fixtures and never call hh.ru.
FAQ
Does a user need an hh.ru key to search vacancies?
No, public relay clients go through no authorization at all; only the relay itself holds the keys.
Can the relay apply to a vacancy or show my personal data?
No, it only has two read-only tools for search and vacancy details via an application token, with no access to a personal account.
Related
A self-hosted knowledge base with block-level references and a built-in MCP server for connecting AI agents to your notes
A CLI for every Google Workspace API with JSON output and agent skills: Drive, Gmail, Calendar, Sheets and more
Local search over Markdown notes, docs and meeting transcripts: keywords, semantic search and reranking, with an MCP server
A task manager for AI-driven development: breaks a PRD into dependent tasks and guides the agent through them via MCP or CLI