职位匹配服务

一个基于FastAPI的Web服务,通过分析职位描述和LinkedIn个人资料数据集,计算匹配度并推荐前5名候选人。

  • by JaumFaquinha
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 JaumFaquinha/linkedin_mcp_job_matcher

使用说明

LinkedIn MCP工作匹配器(HTTP)

Web 服务 在 快速API que:

  1. 收到职位描述(学历,要求,可取,经验时间,意见)
  2. 关於 数据集 (CSV/JSON/TXT)com的URL在LinkedIn上的表现
  3. 美国嗯 MCP服务器 (LinkedIn MCP) 收集个人资料数据
  4. 计算到 粘性 并介绍 前5名 候选人

界面web simples(PicoCSS)+端点 POST /analyze.


1) 要求

  • 码头工人 ≥ 24
  • Docker Compose 第2版
  • 访问一个 MCP服务器HTTP 旋转和曝光:
    • GET /mcp 准握手(流式HTTP do MCP)
    • 乌玛 工具 (默认 : linkedin.fetch_profile)什么油 { "url": "<linkedin-profile-url>" }
  • (可选) make 对于快捷键

⚠️ 服务 没有登录 在LinkedIn上。MCP 服务器必须负责任何必要的身份验证,并从配置文件中返回结构化数据。


2)项目结构(建议)

project-root/
├─ app/
│  ├─ main.py                # FastAPI app
│  ├─ linkedin_mcp.py        # Cliente MCP (streamable HTTP)
│  ├─ scoring.py             # Regras de pontuação
│  ├─ templates/
│  │  ├─ index.html
│  │  └─ results.html
│  └─ static/
│     └─ ...                 # (opcional)
├─ Dockerfile
├─ docker-compose.yml
├─ .env                      # variáveis de ambiente
└─ README.md

(3)环境变量(.env)

创建文件 .env Raiz com:

# Porta pública do app FastAPI
APP_PORT=8000

# Conexão com o MCP Server (modo HTTP streamable)
MCP_HOST=host.docker.internal   # dentro do container, aponta para máquina host (ajuste se necessário)
MCP_PORT=8080                   # porta onde o MCP Server está ouvindo
MCP_PATH=/mcp                   # path do endpoint HTTP do MCP

# Nome da tool exposta pelo MCP para buscar o perfil:
MCP_PROFILE_TOOL=linkedin.fetch_profile

# Concorrência e timeout das chamadas ao MCP
MCP_CONCURRENCY=3
FETCH_TIMEOUT_S=60

智利 host.docker.internal 可能不存在。如果 MCP 在主机上运行,请使用主机的 IP 地址(例如: 172.17.0.1)或者通过编辑使两者都工作 /etc/hosts.
提示( 在共享网络中共享) : 如果 MCP 是 在另一个 docker-compose 服务中 (例如: mcp) 你可以使用 MCP_HOST=mcp e MCP_PORT=<porta interna>.


4) Dockerfile

示例 Dockerfile 最小值 :

FROM python:3.11-slim

WORKDIR /app

# Sistema
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential curl && \
    rm -rf /var/lib/apt/lists/*

# Dependências Python
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Código
COPY app ./app

# Porta interna do Uvicorn
EXPOSE 8000

# Entrypoint
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--proxy-headers"]

确保你有一个 requirements.txt 内容(例子):

fastapi==0.115.0
uvicorn[standard]==0.30.6
jinja2==3.1.4
python-dotenv==1.0.1
httpx==0.27.2
anyio==4.6.2
mcp[cli]==1.12.0

(版本可能会有所不同,请与您的代码保持兼容。


5) docker-compose.yml

例如 只 应用程序(假设MCP已经在外部运行或在另一个组件中运行):

services:
  job-matcher-app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: job-matcher-app
    env_file:
      - .env
    ports:
      - "${APP_PORT}:8000"
    restart: unless-stopped

如果你 也 要将 MCP 服务器编排到此组合中,请添加一个服务 mcp 并指出 MCP_HOST=mcp例子(说明):

services:
  mcp:
    image: seu-registro/linkedIn-mcp:latest
    ports:
      - "8080:8080"
    environment:
      - SOME_AUTH_TOKEN=...
  job-matcher-app:
    build: .
    env_file: .env
    environment:
      - MCP_HOST=mcp
      - MCP_PORT=8080
    depends_on:
      - mcp
    ports:
      - "${APP_PORT}:8000"

6) 构建与运行

# 1) Build
docker compose build

# 2) Subir
docker compose up -d

# 3) Logs (opcional)
docker compose logs -f job-matcher-app

访问 :
http://localhost:8000 (ou http://<seu-host>:${APP_PORT})

健康检查快速:

curl http://localhost:8000/health || true

7) Uso通过界面Web

  1. 阿布拉 http://localhost:8000
  2. Preencha:
    • 学历要求 (例如: Bachelor, Master, High School)
    • 所需技能 (例如: Python, FastAPI, Docker)
    • 所需技能 (例如: AWS, GitHub Actions)
    • 最少年工作经验 (例如: 3)
    • 备注 (可选)
  3. 上传do数据集
    • CSV 带头 linkedin_url 哦 url
    • JSON COM对象数组 linkedin_url 哦 url
    • 文本 每行 URL
  4. 发送。页面 results 它将显示:
    • 已处理多少个配置文件
    • 前5名候选人
    • 分数组成部分(required/desired/education/experience/keywords/penalty)
    • (可选) 块 <details> 如果某个配置文件失败,则会出现错误

8)使用您的cURL(直接端点)

curl -F "education_required=Bachelor" \
     -F "required_skills=Python,FastAPI,Docker" \
     -F "desired_skills=AWS,GitHub Actions" \
     -F "min_years_experience=3" \
     -F "notes=We value clean code." \
     -F "dataset=@/caminho/para/dataset.csv" \
     http://localhost:8000/analyze

9) 数据集格式

CSV(推荐)

linkedin_url
https://www.linkedin.com/in/fulano/
https://www.linkedin.com/in/ciclano/

哦

url
https://www.linkedin.com/in/fulano/
https://www.linkedin.com/in/ciclano/

JSON

[
  {"linkedin_url": "https://www.linkedin.com/in/fulano/"},
  {"url": "https://www.linkedin.com/in/ciclano/"}
]

文本

https://www.linkedin.com/in/fulano/
https://www.linkedin.com/in/ciclano/

后端仅删除并保留包含以下内容的 URL "linkedin.com".


10)有用的设置

  • 竞争 (并行分析的最大配置文件数):
    • MCP_CONCURRENCY (标准: 3)
  • 超时 每次调用 MCP:
    • FETCH_TIMEOUT_S 以秒为单位(默认:60)
  • MCP工具:
    • MCP_PROFILE_TOOL (默认 : linkedin.fetch_profile)
  • 端点MCP:
    • MCP_HOST, MCP_PORT, MCP_PATH

其他 .env e 重新启动 服务:

docker compose up -d --build

(1)故障排除(Troubleshooting)

11.1“无法分析个人资料。”无卡片

  • MCP 可能已失败、过期或 URL 无效
  • 看看块 <details> 在页面顶部 results (未启用模板)
  • 查看应用程序日志:
    docker compose logs -f job-matcher-app
    

11.2 错误 anyio / TaskGroup /“试图退出取消作用域…”

  • 当 HTTP MCP 会话在创建它的任务之外关闭时发生这种情况。
  • 实施建议 每通话会话 (async with streamablehttp_client(...))以减轻。
  • 持久性:
    • 保证 mcp[cli] 已更新(mcp[cli]>=1.12.0)
    • Reduza MCP_CONCURRENCY
    • 增大 FETCH_TIMEOUT_S

11.3“无法发送请求,因为客户端已关闭。”

  • 指示在发送前关闭 MCP 上的 HTTPX 客户端。
  • 检查 MCP 服务器 和 连接 MCP_HOST/MCP_PORT/MCP_PATH.
  • 测试连接 从内部 做容器:
    docker exec -it job-matcher-app sh
    # dentro do container:
    apt-get update && apt-get install -y curl || true
    curl -v http://$MCP_HOST:$MCP_PORT$MCP_PATH
    

11.4 所有分数 0%

  • 确认 MCP 是否返回结构化数据(技能、经验、教育)。
  • 检查 MCP_PROFILE_TOOL.
  • 修订 linkedin_mcp.py (标准化)和 scoring.py (规则和规则)

11.5“TypeError:未定义不定义 轮次”

  • O模板美国 |round(1).
  • 后端必须始终发送数字 _safe_components().
  • 如果您更改了模板,请使用 |default(0)|float|round(1).

11.6 在主机 (Linux) 上访问 MCP

  • host.docker.internal 可能无法解决。
  • 使用 bridge docker 的 IP 位置 (例如 : 172.17.0.1(或调整) /etc/hosts.

12) 开发 & 热重载 (可选)

Rodar本地com热重载:

uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

13) 停止和删除

docker compose down
# Para remover imagens (cuidado):
# docker compose down --rmi all --volumes --remove-orphans

14) 许可证

在此设定您工程的许可证( MIT、 Apache-2.0 等) 。