Tenon reads job adverts with you, and shows its working.
Give your AI assistant a job advert and ask whether it fits you. With Tenon connected, the assistant reads the advert into a fixed shape (what the role asks for, what it offers), marking each item as observed in the advert or inferred from it, and quoting the advert for the observed ones; Tenon checks that every quotation it claims really is in the advert, word for word, and that the shape holds. Then the assistant scores how your experience covers each requirement, quoting your own words for any coverage it claims, and Tenon checks those quotations the same way and does the arithmetic. Nothing is stored. Tenon contains no AI model of its own. What it guarantees is narrow and useful: a quotation that is not really there is thrown out, and the numbers add up. Whether the assistant read the whole advert, or judged well, or inferred sensibly, is still for you to check, which is why it shows you the description before it scores anything.
Connect it
Tenon is a remote MCP server. There is no account and no key.
https://tenon.alanlong.design/mcp
- Claude (claude.ai or Claude Desktop): Settings → Connectors → Add custom connector → paste the URL. No authentication.
- Claude Code:
claude mcp add --transport http tenon https://tenon.alanlong.design/mcp - ChatGPT (developer mode): add a connector with the same URL.
Then, in a conversation: "Here's a job ad [link or pasted text]. Is it a good fit for me? Here's my CV: [paste]. Use Tenon."
What it does
| Tool | What it does |
|---|---|
tenon_validate_description | Takes the advert and the assistant's description of the role. Returns the description with stable keys, or the exact items it dropped and the rule each broke (a claimed quotation that is not in the advert, a duplicate key, a weight out of range). |
tenon_assess_fit | Takes your statements and preferences and the assistant's fit read. Every requirement needs a quotation of at most twelve words from one of your statements; anything unsupported is rejected. Returns feasibility, desirability, and a rank, and a repair note if the read needs another pass. |
tenon_gate_role | Takes the countries you can work in and, optionally, title phrases and a salary floor. Returns whether the role is workable, needs sponsorship, or excludes you, with the advert clause that decided it, and pass, fail, or unconfirmed on each gate. |
The assistant is asked to show you the validated description and wait for your say-so before anything about you is used. Prompts named tenon, tenon_describe_role and tenon_assess_fit walk that sequence in hosts that offer prompts; the tools work without them.
Who Tenon is for
Tenon is for you, the candidate, working out whether a role fits before you apply. It is not for employers or agencies, and the terms say so. Nothing you send is kept, and there is no model inside Tenon: the reading and the judgement are your own assistant's. The privacy notice has the detail.
What it keeps
Nothing of what you send. Requests are answered from memory and discarded; Tenon's own record is a one-line log per request (which tool, how it went, sizes and status codes, no content) that expires in three days, plus daily counts. Cloudflare, which hosts it, keeps short-lived connection records as any host does. Exactly what and for how long is in the privacy notice.
Limits worth knowing
- Tenon checks quotations and arithmetic; it cannot check that the assistant read the whole advert or judged well. Read the description it shows you before you confirm.
- Eligibility is a reading of the advert's words against the countries you name. It is not legal advice.
- Some job sites (LinkedIn among them) block automated reading. Paste the text, or find the same role on the employer's own careers page.
- Batches are capped so results fit inside what assistants can display: up to ten roles per fit call, twenty per gate call.
Contracts and hints, for the curious
The server publishes what it checks as MCP resources: tenon://contract/description, tenon://contract/fit, tenon://schema/state (what your assistant holds between calls, in your name), and tenon://sources/hints (public job feeds it can read cleanly). The code is part of the Tenon project by Alan Long.