プロトタイプ · プレビュー版:公式レジストリのすべてのサーバーを掲載し、30分ごとに同期しています。レビューとアカウント機能は今後のステップで始まります。
PopNx MCPAIを使う人のためのMCPサーバー · やさしい言葉で解説

onet-match

作者:Benjamin-V-Chanバージョン 0.3.5i★ –iパソコンで動く
レジストリ名io.github.Benjamin-V-Chan/onet-match

インストール

概要

作者による説明(英語の原文)

Occupation classifier: free text to ranked O*NET-SOC codes with tasks, skills and RIASEC. Local.

PopNx MCPの3つの柱

この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。

できること

このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。

  • 接続方法: パソコンで動く
  • トランスポート: stdio
  • カテゴリ: サイバーセキュリティ

インストール

使っているAIアプリを選んで、設定をコピーしてください。

インストールの前に

  • 基本チェック:1項目中1項目に合格
  • あなたのパソコンで、あなたのユーザーと同じ権限(ファイル、ネットワーク、アプリ)で動きます。
  • レジストリには、入力が必要なキーは載っていません。

必要なもの

  • PyPIPythonのuvのインストール(uvxコマンドに必要)

どのアプリを使っていますか?

上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。

Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます

{
  "mcpServers": {
    "onet-match": {
      "command": "uvx",
      "args": [
        "onet-match",
        "mcp"
      ]
    }
  }
}

ターミナルでこれを実行します

claude mcp add onet-match -- uvx onet-match mcp

Cursorで開く

または、設定を自分でコピーする

プロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます

{
  "mcpServers": {
    "onet-match": {
      "command": "uvx",
      "args": [
        "onet-match",
        "mcp"
      ]
    }
  }
}

ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。

VS Codeで開く

または、設定を自分でコピーする

プロジェクトの .vscode/mcp.json に貼り付けます

{
  "servers": {
    "onet-match": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "onet-match",
        "mcp"
      ]
    }
  }
}

ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。

これはパソコンで動くサーバーですが、ChatGPTがつなげるのはインターネット上のサーバーだけです。ほかのアプリを選んでください。

選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。

この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。

できること

パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。

基本チェックi

誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月7日にチェック

  • ✓ 合格

    作者とリポジトリが一致

    レジストリ名は、リポジトリを所有するGitHubアカウント Benjamin-V-Chan で確認済みです

  • … 未チェック

    今もメンテナンスされている

    このリポジトリはまだGitHubから読み取っていません

  • … 未チェック

    ライセンスがある

    このリポジトリはまだGitHubから読み取っていません

  • – 対象外

    エンドポイントが応答する

    これはパソコンで動くため、インターネット上のエンドポイントはありません

  • – 対象外

    OAuthでサインイン

    パソコンで動き、代わりにローカルの設定を使います

  • … 未チェック

    ツールの説明に隠れた指示がない

    パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです

サイバーセキュリティのほかのサーバーとの比較i

  • このカテゴリのほかの993件のうち0%よりスターが多い
  • このカテゴリのほかの993件のうち86%より最近レジストリに公開
  • 基本チェックの結果が、このカテゴリのほかの993件のうち100%と同じかそれ以上

レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。

よくある質問

onet-matchは安全ですか?

当てはまる基本チェック1項目のうち1項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。

どんなキーやコードが必要ですか?

レジストリには必須のキーは載っていません。ただし、最初に使うときにサインインを求めるサーバーもあります。

パソコンで動きますか、それともクラウドですか?

あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。

今もメンテナンスされていますか?

GitHubリポジトリの最終更新は–、最新バージョン(0.3.5)がレジストリに届いたのは6 日前です。

どのアプリで使えますか?

Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにPython (uv)も必要です。

代わりに使えるものは?

同じカテゴリには:ipdata MCP by usefulapi, MaxMind minFraud MCP by usefulapi, Lambda Labs MCP by usefulapi

代わりの候補

同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。

カードの見方:★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i

作者のREADME

READMEを開く

作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。

onet-match

**Occupation classification and job-title normalization against the O\*NET-SOC taxonomy.** onet-match turns messy, unstructured text about work (job titles, resume bullets, job postings, project descriptions, interest statements, skill lists) into standardized SOC codes with a fine-tuned retrieve-and-rerank transformer pipeline. On held-out O\*NET text it ranks the right occupation first 51% of the time, against 21% for a TF-IDF baseline, and 65% vs 17% on messy, human-style inputs. Each result is enriched with O\*NET tasks, skills, knowledge and RIASEC interests, and comes with a calibrated confidence. Use it from Python, the command line, a REST API or any MCP-compatible agent, with no API keys.

  • [Try it in your browser](https://huggingface.co/spaces/BenjaminChan12/onet-match): no install, and the model runs on your device.
  • Open source (MIT) and runs locally. No API key or account needed to match.
  • Fine-tuned bge-base bi-encoder + cross-encoder reranker over all 923 O\*NET 31.0 occupations. About 47 ms per query on a laptop.
  • Python API, CLI, REST API (FastAPI), MCP server for AI assistants, and Docker.
  • Also includes the O\*NET data pipeline it's built on: bulk database download, a Web Services client and analysis tools.
use caseinputtop match (confidence)
Career explorationdesigned our robot in CAD and wired its circuits for my high school robotics teamRobotics Engineers, 17-2199.08 (0.38); #2 Robotics Technicians
Career explorationI love weather, maps and tracking stormsAtmospheric and Space Scientists, 19-2021.00 (0.87)
Skills-based hiringMust know survival analysis, R, SAS and clinical trial dataBiostatisticians, 15-2041.01 (0.60)
Skills-based hiringMust know Solidity, smart contracts and EthereumBlockchain Engineers, 15-1299.07 (0.81)
Resume parsingLed a team of 12 nurses on a cardiac ICU night shiftCritical Care Nurses, 29-1141.03 (0.42); #2 Acute Care Nurses
Resume parsingExcel, QuickBooks, payroll, AP/ARPayroll and Timekeeping Clerks, 43-3051.00 (0.49)
Career counselingskills: Python, SQL, Tableau; interests: sports statisticsStatisticians, 15-2041.00 (0.59)
Job-posting normalization{"title": "Wind Turbine Tech", "requirements": ["climbing", "hydraulics", "electrical troubleshooting"]}Wind Turbine Service Technicians, 49-9081.00 (0.81)

Real outputs of the served model, saved in outputs/examples/readme_examples.json.

Quickstart

pip install "onet-match[matching]"
from onet_match import match

result = match("Must know survival analysis, R, SAS and clinical trial data", top_k=5) for m in result.matches: print(m.soc, m.title, m.confidence) print(result.profile["riasec_code"]) # aggregate interest code, e.g. "ICS"

The package imports as onet_match and provides the onet-match command. The first call downloads the pretrained model bundle (about 0.5 GB) from the Hugging Face Hub (BenjaminChan12/onet-match) and caches it.

onet-match match "Excel, QuickBooks, payroll, AP/AR"          # CLI (add --json for JSON)

pip install "onet-match[matching,serve]" onet-match serve --port 8000 # REST API curl -s localhost:8000/match -H 'content-type: application/json' \ -d '{"text": "I love weather, maps and tracking storms", "top_k": 3}'

REST routes: POST /match, POST /match/batch, GET /occupation/{soc} and GET /health. The full request and response contract and the Docker setup are in docs/API.md.

For coding agents: llms.txt is a one-page summary, and AGENTS.md covers usage from another project and work inside this repo.

Use from AI assistants (MCP)

onet-match mcp runs a Model Context Protocol server with two read-only tools: match_occupations(text, top_k) and get_occupation(soc). Add it to any MCP client (Claude Desktop, Cursor, VS Code and others):

{

"mcpServers": { "onet-match": { "command": "uvx", "args": ["--from", "onet-match[mcp]", "onet-match", "mcp"] } } }

Without uv, run pip install "onet-match[mcp]" and use "command": "onet-match", "args": ["mcp"]. For a remote server, use onet-match mcp --transport streamable-http --port 8001 (served at /mcp). Tool arguments and return fields are in docs/API.md. Listed in the MCP Registry as io.github.Benjamin-V-Chan/onet-match, on Glama and on mcpservers.org.

What each match contains

soc, title, confidence (calibrated, 0–1), score, major_group and its title, job_zone, riasec_code, description, top_tasks, top_skills and top_knowledge (with O\*NET importance and level). Each result also carries a profile that aggregates skills, knowledge and all six RIASEC interests across the matches, weighted by confidence.

Use cases

  • Career exploration (EdTech). Map what students say they did or enjoy to occupations and skills.
  • Resume and profile parsing. Code experience bullets and skill lists to SOC codes.
  • Skills-based hiring and workforce planning. Turn a list of required skills into the roles that use them, to scope a job or find adjacent talent.
  • Job-posting normalization. Turn informal titles and descriptions into standard occupations.
  • Workforce and labor-market analytics. Batch-code large text collections.
  • Career counseling tools. Show the tasks and skills behind a suggestion.
  • LLM agents. Ground occupation questions in O\*NET instead of free generation (see llms.txt).

Worked example: onet-match-job-postings codes 3,000 LinkedIn job postings and compares pay by occupation group.

Details and integration patterns: docs/APPLICATIONS.md.

Accuracy

All models are evaluated on the same held-out splits. Every number traces to a saved run in outputs/runs/.

modelO\*NET test top-1O\*NET test top-5messy-text test top-1messy-text test top-5p50 latency
TF-IDF baseline20.5%40.5%17.4%39.2%0.5 ms
BM2520.7%40.1%24.1%45.2%0.2 ms
bge-base-en-v1.5, off the shelf36.1%64.3%45.4%77.6%6.9 ms
fine-tuned bge-base50.2%78.2%65.2%92.6%6.8 ms
fine-tuned bge-base + reranker (served)51.1%79.1%65.4%92.9%46.7 ms
  • **O\*NET test:** 6,792 held-out titles, task statements, work activities and descriptions.
  • Messy-text test: 4,703 informal snippets written by a different LLM than the one that wrote the training text.
  • Confidence: temperature-calibrated, ECE 0.037.
  • Full results: per-input-type tables, calibration, ablations, learning curves and error analysis are in docs/RESULTS.md.

How it works

flowchart LR

B["O*NET 31.0 database (bulk download)"] --> C["Occupation catalog 923 occupations"] C --> P["Labeled pairs titles · tasks · activities"] C --> S["LLM-written messy text train: model A · test: model B"] P --> T["Fine-tune bi-encoder

  • cross-encoder reranker"] S --> T T --> BU["Model bundle

(Hugging Face Hub)"] BU --> API["match() · onet-match CLI · REST API"]

  1. A fine-tuned bi-encoder (bge-base) embeds the input and retrieves the 20 nearest occupations.
  2. A fine-tuned cross-encoder rescores those 20.
  3. The two scores are blended with a weight chosen on validation data.
  4. A temperature-scaled softmax turns the blended scores into calibrated confidence.

The validation and test tasks are removed from the occupation documents the models search, so no test text leaks into retrieval. Synthetic training and test text come from different LLMs.

In-browser demo

The demo Space runs the same pipeline client-side with transformers.js: both models are exported to ONNX and quantized to int8 (about 130 MB, cached after the first visit). demo/build.py builds it from a bundle. Quantization and the browser runtime shift results slightly: on 800 test queries the browser picks the same top match as the Python package 95% of the time, with top-1 accuracy 61.5% vs 62.6% (outputs/demo/browser_parity.json). Use the Python package for anything that matters.

O\*NET data pipeline

The onet_data_collector package (onet-collect) downloads and verifies O\*NET database releases, which needs no credentials. It also wraps O\*NET Web Services: keyword search, occupation details and flattened profiles. See docs/COLLECTOR.md.

onet-collect bulk download                         # download + verify the latest O*NET database

onet-match collect "healthcare" "technology" # Web Services search (free O*NET account, see .env.example) onet-match eda | keywords | cluster # classic analysis: coverage, keyword attribution, TF-IDF clusters

Train your own

git clone https://github.com/Benjamin-V-Chan/onet-match && cd onet-match

pip install -e ".[dev]" onet-match matching build-data # O*NET catalog, labeled pairs, splits scripts/matching/reproduce.sh # every model, ablation and the results report onet-match matching bundle " " --run # package a model for serving

  • Synthetic text: WITH_SYNTH=1 TRAIN_LLM= EVAL_PROVIDER= EVAL_LLM= scripts/matching/reproduce.sh also generates the messy training and test text, using a different LLM for each. It needs LLM API keys in environment variables.
  • Training time: bge-base took 58 minutes for one epoch on a laptop GPU (Apple Silicon, MPS). The exact scripts behind every saved run are in scripts/matching/.
  • Tests: pytest runs fully offline, using tiny local models and a mocked LLM.

Set ONET_MATCH_BUNDLE=/path/to/bundle to serve your own model, or ONET_MATCH_HF_REPO=owner/repo to load one from the Hub.

Background

This project was originally built in 2024 as an open-source edtech tool for analyzing O*NET occupational data at scale, and as part of my capstone project for an engineering course. Its analytics pipeline (EDA, occupation clustering, and keyword attribution) was later integrated into production products at Project Leo, and has inspired related work at other companies and projects.

In 2026 it was rebuilt around semantic occupation

冒頭だけを表示しています。続きはリポジトリで読めます

PopNxに聞く