Action1 MCP by usefulapi
Read endpoints, missing updates, CVE vulnerabilities, installed software and reports in Action1.
Description from the maker (original English)
Occupation classifier: free text to ranked O*NET-SOC codes with tasks, skills and RIASEC. Local.
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"onet-match": {
"command": "uvx",
"args": [
"onet-match",
"mcp"
]
}
}
}Run this in your terminal
claude mcp add onet-match -- uvx onet-match mcpPaste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"onet-match": {
"command": "uvx",
"args": [
"onet-match",
"mcp"
]
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"onet-match": {
"type": "stdio",
"command": "uvx",
"args": [
"onet-match",
"mcp"
]
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 8, 2026
The registry name was verified with the GitHub account Benjamin-V-Chan, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
The registry does not list a required key, though some servers ask you to sign in on first use.
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (0.3.5) reached the registry 7 days ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Python (uv) on your computer.
In the same category: Action1 MCP by usefulapi, QNSQY, EchelonGraph CVE & Exposure
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
Read endpoints, missing updates, CVE vulnerabilities, installed software and reports in Action1.
Linux only, local: post-quantum CBOM scan, encrypt to public keys, verify. Takes no secrets
CVE, KEV, EPSS, SBOM and advisory lookups; per-CVE exposure from Shodan data (© Shodan). Keyless.
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
**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.
| use case | input | top match (confidence) |
|---|---|---|
| Career exploration | designed our robot in CAD and wired its circuits for my high school robotics team | Robotics Engineers, 17-2199.08 (0.38); #2 Robotics Technicians |
| Career exploration | I love weather, maps and tracking storms | Atmospheric and Space Scientists, 19-2021.00 (0.87) |
| Skills-based hiring | Must know survival analysis, R, SAS and clinical trial data | Biostatisticians, 15-2041.01 (0.60) |
| Skills-based hiring | Must know Solidity, smart contracts and Ethereum | Blockchain Engineers, 15-1299.07 (0.81) |
| Resume parsing | Led a team of 12 nurses on a cardiac ICU night shift | Critical Care Nurses, 29-1141.03 (0.42); #2 Acute Care Nurses |
| Resume parsing | Excel, QuickBooks, payroll, AP/AR | Payroll and Timekeeping Clerks, 43-3051.00 (0.49) |
| Career counseling | skills: Python, SQL, Tableau; interests: sports statistics | Statisticians, 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.
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.
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.
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.
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.
All models are evaluated on the same held-out splits. Every number traces to a saved run in outputs/runs/.
| model | O\*NET test top-1 | O\*NET test top-5 | messy-text test top-1 | messy-text test top-5 | p50 latency |
|---|---|---|---|---|---|
| TF-IDF baseline | 20.5% | 40.5% | 17.4% | 39.2% | 0.5 ms |
| BM25 | 20.7% | 40.1% | 24.1% | 45.2% | 0.2 ms |
| bge-base-en-v1.5, off the shelf | 36.1% | 64.3% | 45.4% | 77.6% | 6.9 ms |
| fine-tuned bge-base | 50.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 |
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
(Hugging Face Hub)"] BU --> API["match() · onet-match CLI · REST API"]
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.
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.
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
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
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.scripts/matching/.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.
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
Only the beginning is shown; read the rest in the repo