mcp-job-radar

mcp-job-radar

Enables AI agents to search, rank, and explain job matches through a secure read-only interface that blocks prompt injections and unsafe content.

Category
访问服务器

README

MCP Job Radar

English · Português

A secure, read-only Model Context Protocol server for job discovery and explainable matching.

CI Python 3.11+ MCP 2026-07-28 License MIT

Job descriptions can contain prompt injections, commands, secret requests, and malicious links. This server exposes job-search capabilities to AI hosts without turning untrusted listings into an instruction channel. Every tool is typed, bounded, audited, read-only, and exercised through a real in-memory MCP client.

What a reviewer can verify in three minutes

uv sync --extra dev
uv run pytest
uv run mcp-job-radar-demo

The demo connects an official MCP client to the server, discovers the tools through tools/list, calls search_jobs, and prints its structured result. Tests cover tool discovery, JSON Schema, deterministic ranking, typed errors, timeouts, retries, circuit breaking, and adversarial content.

Tools

Tool What it returns Safety boundary
search_jobs Bounded matches from title and declared skills Descriptions do not affect search
rank_jobs Score, reasons, and tradeoffs against a typed profile Deterministic policy, no hidden LLM judgment
explain_match Exact factors behind one score Same policy as ranking, no post-hoc explanation
export_shortlist Markdown or JSON inside the response No filesystem write or job application

All inputs and outputs use strict Pydantic models. Invalid, missing, duplicate, or excessive input produces a stable machine-readable error rather than an implementation traceback.

Architecture

flowchart LR
    H[AI host] -->|MCP| M[MCP adapter]
    M --> A[Safe audit boundary]
    A --> S[Typed job service]
    S --> R[Deterministic ranker]
    S --> G[Untrusted-content gateway]
    S --> D[Timeout, retry, circuit breaker]
    D --> F[(Normalized fixtures)]
    G -->|bounded and redacted| M

The MCP adapter contains no ranking logic. The application service owns use cases, the security gateway owns the trust boundary, and the repository owns source resilience. This separation keeps the protocol replaceable and the critical policies independently testable.

Read the full architecture and threat model and the adversarial test matrix.

Security controls

  • Job descriptions are bounded, normalized, scanned, and redacted before entering agent context.
  • Prompt-injection phrases, secret requests, commands, and embedded URLs become explicit findings.
  • Listing URLs must use public HTTPS and cannot contain credentials or target local/private hosts.
  • Result count and batch IDs are capped at 25.
  • Source access has a timeout, bounded retry, and an in-process circuit breaker.
  • Audit events contain tool name, status, duration, and error type, never arguments or result bodies.
  • There is intentionally no command execution, arbitrary fetch, local-file read, auto-apply, or persistent export capability.

Example request

{
  "job_ids": ["remoteok-1001", "remotive-3003"],
  "profile": {
    "target_titles": ["AI Engineer", "AI Solutions Architect"],
    "skills": ["Python", "RAG", "LLM", "MCP"],
    "remote_required": true,
    "seniority": "senior",
    "minimum_salary_brl": 20000
  },
  "limit": 10
}

The result carries a numerical score plus positive signals and explicit tradeoffs. Explanations are generated by the same scoring function, so they cannot drift from the ranking.

Run as an MCP server

The default transport is stdio:

uv run mcp-job-radar

Example host configuration:

{
  "mcpServers": {
    "job-radar": {
      "command": "uv",
      "args": ["--directory", "ABSOLUTE_PATH_TO_REPOSITORY", "run", "mcp-job-radar"]
    }
  }
}

The project uses the official Python SDK v2 and its current MCP 2026-07-28 protocol line. The automated integration test uses Client(mcp), the SDK's in-memory client, rather than invoking Python functions directly.

Relationship to radar-de-vagas

radar-de-vagas owns ingestion from six public sources, two-layer relevance filtering, normalization, global deduplication, and priority ordering. mcp-job-radar adds the agent-facing contract and security boundary. Its checked-in normalized dataset makes tests deterministic and keeps CI independent of scraping, credentials, rate limits, and third-party outages.

Measured behavior

The acceptance suite verifies:

  • exactly four discoverable MCP tools;
  • structured MCP results and generated input schemas;
  • repeatable ranking and matching explanations;
  • all defined hostile-content classes redacted;
  • unsafe URL classes rejected;
  • malformed and slow sources returned as typed retryable failures;
  • no auto-application or persistent-write surface.

Coverage is enforced at 85% in CI. The README reports only behaviors asserted by the repository, not production traffic or synthetic business-accuracy claims.

Verification-driven adjustments

  • The implementation was aligned to the installed MCP SDK v2 API after an integration test verified the moved ToolError boundary and the typed list_tools() response envelope.
  • The normalized fixture was moved inside the Python package after inspecting the built wheel. This prevents a demo that works only from an editable source checkout.
  • Read-only, non-destructive, idempotent, and closed-world annotations are asserted on all four discovered tools, so the published metadata is checked rather than merely documented.

Limitations and next steps

  • The demo data is synthetic and normalized. It proves the agent boundary, not live-source uptime.
  • Ranking is lexical and policy-based; semantic equivalence and career nuance remain outside v0.1.
  • The circuit breaker is process-local. A distributed deployment would require shared state and metrics.
  • A live adapter should consume a versioned normalized output from radar-de-vagas, not import its script or duplicate source-specific scraping.
  • Authentication and Streamable HTTP deployment are intentionally absent from this local stdio demonstration. They become necessary only when exposing the server beyond a trusted host.

AI assistance disclosure

The repository was developed with AI-assisted implementation and review. Architecture, security claims, tests, limitations, and published artifacts were checked against executable behavior. Authorship responsibility and final technical decisions remain with Raphael Caveagna.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选