
onet-match
io.github.Benjamin-V-Chan由 GitHub 帳號 Benjamin-V-Chan 發布v0.3.5更新於 Nov 1, 2026
Occupation classifier: free text to ranked O*NET-SOC codes with tasks, skills and RIASEC. Local.
發布方自己的服務:match.bot
概覽
本機 MCP 伺服器,把職稱、履歷或技能清單等自由文字對應到排序後的 O*NET-SOC 職業代碼,並附上任務、技能與 RIASEC 興趣。
- 可以做什麼
- 比對職業:把描述工作的自由文字轉成附校準信賴度的 O*NET-SOC 代碼排序結果
- 查詢職業:依 SOC 代碼取得職業詳情,包含任務、技能、知識與 RIASEC 興趣
- 回傳彙總輪廓:每筆結果含大類、職業分區、描述,以及依信賴度加權的技能與興趣彙總
- 適用情境
- 適合需要把雜亂的職稱或徵才資訊標準化、把履歷條目與技能清單編碼為標準職業,或讓職涯探索與人力規劃的回答以 O*NET 資料為依據而非自由生成的場合。
- 執行需求
- 以 stdio 在本機執行,通常用 uvx 從 onet-match 套件啟動(或以 pip 安裝並加上 mcp 附加項)。比對不需要 API 金鑰或帳號。第一次呼叫會從 Hugging Face Hub 下載約 0.5 GB 的模型包並快取,因此首次執行需要網路。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 onet-match,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
onet-match
[PyPI] [DOI] [MCP Registry] [Demo]
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: 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.
Real outputs of the served model, saved in outputs/examples/readme_examples.json.
Quickstart
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.
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.
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):
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.
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/.
- 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
- A fine-tuned bi-encoder (bge-base) embeds the input and retrieves the 20 nearest occupations.
- A fine-tuned cross-encoder rescores those 20.
- The two scores are blended with a weight chosen on validation data.
- 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.
Train your own
- Synthetic text:
WITH_SYNTH=1 TRAIN_LLM=<model> EVAL_PROVIDER=<provider> EVAL_LLM=<model> scripts/matching/reproduce.shalso 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:
pytestruns 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 matching, and the former
ONET-Data-Collector repository was merged in.
Citation
License and data attribution
The code is MIT-licensed; see LICENSE.
This product includes information from the O*NET 31.0 Database by the U.S. Department of Labor, Employment and Training Administration (USDOL/ETA), used under the CC BY 4.0 license. O*NET® is a trademark of USDOL/ETA. USDOL/ETA has not approved, endorsed or tested this product.
來源:README.md,提交 c635b7a
工具
0版本歷史
3- v0.3.5最新Nov 1, 2026
- v0.3.4Nov 1, 2026
- v0.3.2Oct 30, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分
其他 Match 整合
match.bot
bot.match官方發布者
AI 代理程式的免費會面場所:註冊、查詢代理程式、點贊、接受介紹。檢視 whats_waiting。AI 翻譯

Ofac Match
由 GitHub 帳號 krunalsolanki 發布
在本機執行的 MCP 伺服器,用 OFAC SDN 制裁名單篩選姓名,並解釋每個比對分數的由來。

PaintColorHQ Color Match
由 GitHub 帳號 pcameron80 發布
託管式 MCP 伺服器,可依任意十六進位色碼在 13 個品牌中找出最接近的真實可購買塗料顏色,並以 CIEDE2000 評分。
Nityaflow GST credit match
in.nityaflow
遠端 MCP 伺服器,用於印度 GST 進項稅額扣抵核對、收據驗證,以及 AI 代理付款前的授權檢查。

Esports Match Timelines: Valorant & CS2
由 GitHub 帳號 LMSlay 發布
託管於 Apify 的遠端 MCP 伺服器,從 YouTube 與 Twitch 的公開賽事直播錄影中讀取《特戰英豪》與 CS2 的逐回合比分。