jef-mcp
Jef MCP
An MCP server for a model that decides instead of generating.
Jef never produces text. Every answer is one of the options you supplied, a number from 1 to 10, a yes or no, or a flag, with a confidence between 84% and 99%. It reads 0 tokens of your input, because it hashes it rather than reading it. It stores nothing, costs nothing, and returns the same answer for the same input forever.
It is a parody of TypeSafe AI's real decision model, Jev, and it is labelled as one everywhere. If you want to understand the real thing, we wrote a straight explainer for it: What is Jev?
Connect
The server is hosted. Nothing to install, no key, no account.
https://typosafe.lol/mcpClaude Code:
claude mcp add --transport http jef https://typosafe.lol/mcpAnything that reads a config file:
{
"mcpServers": {
"jef": { "type": "http", "url": "https://typosafe.lol/mcp" }
}
}Or find it in the official MCP registry
as lol.typosafe/jef, or on Smithery as typosafe/jef.
Related MCP server: daf-jev
Tools
Tool | Ask it | Get back |
| A yes-or-no question |
|
| 2 to 5 options | One of them, plus a probability for each |
| Something to rate | 1 to 10 |
| 2 to 5 options | Them, in order |
| A described behaviour |
|
Every result carries a structuredContent object with the answer, the confidence, the
probability for each option, and two booleans that matter more than the answer does.
Two things an agent must handle
escalated: true means the question touched health, harm, money, law or safety. The
content is ESCALATED TO A HUMAN and confidence is 0. Tell the person to ask a human. Do
not rephrase the question to get a different answer.
blocked: true means the input contained profanity, slurs or sexual content. The
content is NOT EVALUATED, nothing was stored, and nothing is echoed back. Do not retry.
Both checks run on normalised text, so leetspeak, dotted letters and stretched spellings are caught, and both cover English, Spanish, Portuguese, Japanese and Chinese.
Beyond that: Jef is a parody and its answers are deliberately arbitrary. Present them as a confident arbitrary choice, which is what the user asked for, and never as advice.
Run it yourself
npx jef-mcp # MCP over stdio, what most clients spawnOr from source:
git clone https://github.com/SPFreedom/jef-mcp.git
cd jef-mcp
node src/stdio.js # stdio transport
node src/server.js # http://localhost:8787/mcp
node test.js # smoke test, no networkAs a local stdio server in a client config:
{
"mcpServers": {
"jef": { "command": "npx", "args": ["-y", "jef-mcp"] }
}
}The hosted URL needs no install. This one runs entirely offline, which is possible because the whole model is 331 lines and reads nothing.
Zero dependencies. src/jef.js is the whole model, and src/handler.js is the exact
handler running at typosafe.lol/mcp.
Why the joke works
Every other MCP server is a wrapper around something that does work. This one wraps a 32-bit hash and a lookup table, and is honest that it never reads your input. It is stateless, so there is no session to establish and nothing to resume, which is the one part of MCP it implements better than most.
Related: npx typosafe is the same model on the
command line, where the exit code is the decision.
Docker
docker build -t jef-mcp .
docker run -i --rm jef-mcp # stdio, nothing exposedThe build runs the test suite, so a broken image cannot be produced. Nothing is installed, because there is nothing to install.
License
MIT. The model is 331 lines. Read it.
Available Tools
5 toolsjef_flagAsk Jef if it is a red flagARead-onlyIdempotentInspect
Judge a described behaviour as RED FLAG, GREEN FLAG or BEIGE FLAG. Use this when the user describes something someone did and wants a verdict on it. Beige means neither good nor bad, merely odd. Anything describing harm, threats or abuse escalates instead of being judged.
| Name | Required | Description | Default |
|---|---|---|---|
| behaviour | Yes | What the person did, in one sentence. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | Which decision shape was used. |
| answer | Yes | Exactly "RED FLAG", "GREEN FLAG" or "BEIGE FLAG". |
| blocked | Yes | True when the input contained profanity, slurs or sexual content. Nothing was stored or echoed. Do not retry. |
| ranking | No | The options in order, best first. Null unless the shape was order. |
| cost_usd | No | Always 0. There is no billing. |
| thoughts | No | Always 0. |
| escalated | Yes | True when the input touched health, harm, money, law or safety. Tell the person to ask a human. Do not rephrase and retry. |
| confidence | Yes | 0.84 to 0.99 normally, exactly 0 when escalated or blocked. It is not calibrated and means nothing. |
| latency_ms | No | Negative. Jef answers before you ask. |
| tokens_read | No | Always 0. The input is hashed, not read. |
| probabilities | No | One entry per option, percentages summing to 100. Null unless the shape was pick. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds the escalation rule for harmful content and defines 'beige', providing context beyond the annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the main purpose, and every sentence adds value. It is concise without wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one parameter fully described in the schema and an output schema present, the description covers the key behavioral nuances (escalation, definition of beige). It is complete enough for an agent to invoke correctly, though it does not mention the exact output format, which is likely in the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter 'behaviour' is described adequately. The description adds meaning by clarifying that it should be a one-sentence behavior description and specifies the escalation condition, enhancing the schema's basic description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Judge') and resource ('described behaviour') with a clear output (RED/GREEN/BEIGE flag). It is not a tautology and clearly distinguishes itself as a judgment tool, though it does not explicitly name sibling tools to differentiate from.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use ('when the user describes something someone did and wants a verdict') and when not to (anything describing harm, threats, or abuse escalates). It lacks explicit alternative tool names but provides a clear condition for not using it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jef_pickAsk Jef to pick oneARead-onlyIdempotentInspect
Pick one of 2 to 5 options and give a probability for each. Use this when the user is stuck between named choices and wants one chosen for them: dinner, which film, which of three plans. Jef can only ever return an option you passed in, so it cannot introduce an idea of its own.
| Name | Required | Description | Default |
|---|---|---|---|
| options | Yes | The candidates. The answer is always one of these, exactly as written. | |
| question | No | Optional context, such as "what should I cook tonight". Affects the answer but is not read. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | Which decision shape was used. |
| answer | Yes | One of the options you passed in, copied exactly. |
| blocked | Yes | True when the input contained profanity, slurs or sexual content. Nothing was stored or echoed. Do not retry. |
| ranking | No | The options in order, best first. Null unless the shape was order. |
| cost_usd | No | Always 0. There is no billing. |
| thoughts | No | Always 0. |
| escalated | Yes | True when the input touched health, harm, money, law or safety. Tell the person to ask a human. Do not rephrase and retry. |
| confidence | Yes | 0.84 to 0.99 normally, exactly 0 when escalated or blocked. It is not calibrated and means nothing. |
| latency_ms | No | Negative. Jef answers before you ask. |
| tokens_read | No | Always 0. The input is hashed, not read. |
| probabilities | No | One entry per option, percentages summing to 100. Null unless the shape was pick. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds the key behavioral guarantee that Jef cannot introduce new options ('only ever return an option you passed in'), and that it outputs probabilities. It does not elaborate on the behavior of the optional question parameter beyond the schema's note, but it adds meaningful constraint disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loads the primary action and output, gives concrete usage examples, and adds a single crucial constraint. No redundant or filler language. Every sentence serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with two parameters, full schema coverage, and an output schema (present). Annotations cover safety (readOnly, idempotent, non-destructive). The description covers purpose, usage, and a key behavioral constraint. It does not explicitly state what the question parameter does beyond the schema, but that is already documented. Overall, nothing critical is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides full descriptions for both parameters (100% coverage). The description does not add any parameter-specific meaning beyond what the schema already states; it only reiterates the constraint that returned options are from the passed list, which is already in the options description. Thus, the description does not need to compensate, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Pick') and resource ('one of 2 to 5 options') and states the output ('give a probability for each'). It clearly distinguishes from siblings like jef_rank or jef_yes_no by specifying the scenario of 'stuck between named choices.' The constraint that it only returns passed-in options further clarifies scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it ('when the user is stuck between named choices and wants one chosen for them') with concrete examples (dinner, film, plans). It does not explicitly name alternative sibling tools, but the examples imply the use case is distinct from ranking or scoring. This is clear but could benefit from explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jef_rankAsk Jef to rank thingsARead-onlyIdempotentInspect
Put 2 to 5 options in order, best first. Use this when the user wants a priority order decided for them, such as which chore to do first or which of several tasks to start with. Returns every option you passed, reordered, never a subset.
| Name | Required | Description | Default |
|---|---|---|---|
| options | Yes | The things to order. All of them come back, reordered. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | Which decision shape was used. |
| answer | Yes | The options joined with " > ", best first. |
| blocked | Yes | True when the input contained profanity, slurs or sexual content. Nothing was stored or echoed. Do not retry. |
| ranking | No | The options in order, best first. Null unless the shape was order. |
| cost_usd | No | Always 0. There is no billing. |
| thoughts | No | Always 0. |
| escalated | Yes | True when the input touched health, harm, money, law or safety. Tell the person to ask a human. Do not rephrase and retry. |
| confidence | Yes | 0.84 to 0.99 normally, exactly 0 when escalated or blocked. It is not calibrated and means nothing. |
| latency_ms | No | Negative. Jef answers before you ask. |
| tokens_read | No | Always 0. The input is hashed, not read. |
| probabilities | No | One entry per option, percentages summing to 100. Null unless the shape was pick. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, and non-destructive behavior. The description adds valuable behavioral context beyond annotations: the output preserves all inputs, is reordered, and is never a subset.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with no filler. The core constraint is front-loaded, the usage context follows, and the invariant return behavior is stated clearly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, well-annotated tool with an output schema, the description covers what the tool does, when to use it, and key behavior. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents options with min/max constraints and the 'all come back, reordered' behavior. The tool description restates this but does not add new parameter-specific meaning beyond 'best first,' which is more of an output ordering rule.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Put 2 to 5 options in order, best first.' It clearly distinguishes ranking from the sibling tools by emphasizing that every passed option is returned reordered, never a subset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context: 'Use this when the user wants a priority order decided for them' with concrete examples. It does not explicitly name sibling tools or state when not to use it, but the use case is specific enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jef_scoreAsk Jef to rate somethingARead-onlyIdempotentInspect
Rate something from 1 to 10. Use this when the user wants a number put on something subjective, such as an outfit, a plan, or an excuse. The number is arbitrary and deterministic, so the same description always scores the same.
| Name | Required | Description | Default |
|---|---|---|---|
| thing | Yes | What is being rated, described in the user's own words. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | Which decision shape was used. |
| answer | Yes | A score written as "7/10". |
| blocked | Yes | True when the input contained profanity, slurs or sexual content. Nothing was stored or echoed. Do not retry. |
| ranking | No | The options in order, best first. Null unless the shape was order. |
| cost_usd | No | Always 0. There is no billing. |
| thoughts | No | Always 0. |
| escalated | Yes | True when the input touched health, harm, money, law or safety. Tell the person to ask a human. Do not rephrase and retry. |
| confidence | Yes | 0.84 to 0.99 normally, exactly 0 when escalated or blocked. It is not calibrated and means nothing. |
| latency_ms | No | Negative. Jef answers before you ask. |
| tokens_read | No | Always 0. The input is hashed, not read. |
| probabilities | No | One entry per option, percentages summing to 100. Null unless the shape was pick. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful behavioral context beyond annotations by explaining that the score is 'arbitrary and deterministic' and that identical descriptions always receive the same score. This supplements the idempotentHint and readOnlyHint annotations with a meaningful user-facing behavior, though the deterministic aspect is somewhat implied by the idempotent annotation already.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core action, and every sentence earns its place. The purpose, usage context, and key behavioral caveat are all covered in three concise sentences with no filler or redundant detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (single parameter), rich annotations, and presence of an output schema, the description is fully sufficient. It explains what to input, how the tool behaves, and when to use it, leaving no critical gaps for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the parameter is already well documented. The description adds value by specifying the kind of content expected ('something subjective') and providing examples (outfit, plan, excuse), which clarifies the scope of 'thing' beyond the schema's generic 'what is being rated.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Rate something from 1 to 10') and the exact resource/subject being rated, distinguishing it from siblings like jef_flag or jef_yes_no by specifying a numeric 1-10 subjective rating. The verb and resource are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this when the user wants a number put on something subjective' and gives concrete examples (outfit, plan, excuse), providing clear conditions for use. However, it does not explicitly mention when not to use it or name alternative tools, so it falls just short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jef_yes_noAsk Jef yes or noARead-onlyIdempotentInspect
Answer a yes-or-no question with YES or NO and a confidence. Use this when the user wants a question settled and there is no correct answer, such as whether to go out, whether to send the message, or whether to deploy on a Friday. Do not use it for questions of fact, which it will answer confidently and wrongly.
| Name | Required | Description | Default |
|---|---|---|---|
| question | Yes | The question, phrased so that yes or no is a sensible answer. It is hashed rather than read, so wording changes the answer but meaning does not. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | Which decision shape was used. |
| answer | Yes | Exactly "YES" or "NO", or "ESCALATED TO A HUMAN", or "NOT EVALUATED". |
| blocked | Yes | True when the input contained profanity, slurs or sexual content. Nothing was stored or echoed. Do not retry. |
| ranking | No | The options in order, best first. Null unless the shape was order. |
| cost_usd | No | Always 0. There is no billing. |
| thoughts | No | Always 0. |
| escalated | Yes | True when the input touched health, harm, money, law or safety. Tell the person to ask a human. Do not rephrase and retry. |
| confidence | Yes | 0.84 to 0.99 normally, exactly 0 when escalated or blocked. It is not calibrated and means nothing. |
| latency_ms | No | Negative. Jef answers before you ask. |
| tokens_read | No | Always 0. The input is hashed, not read. |
| probabilities | No | One entry per option, percentages summing to 100. Null unless the shape was pick. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds a valuable behavioral caveat—that it will answer factual questions 'confidently and wrongly'—which is beyond what annotations provide. The schema note about hashing also contributes, but that is not part of the main description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exactly two sentences with zero fluff. It front-loads the core purpose first, then provides usage guidance and a critical warning. Every word earns its place, and it remains highly readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with a single parameter and an existing output schema, the description is complete. It covers purpose, when to use, when not to use, and a behavioral caveat. The output format is presumably handled by the output schema, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the 'question' parameter is fully documented in the schema, including the hashing behavior and constraints. The main description adds no additional parameter-level semantics, so the baseline of 3 applies as the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Answer'), a clear resource ('a yes-or-no question'), and the exact output format ('YES or NO and a confidence'). It distinguishes itself from sibling tools by restricting scope to questions with no correct answer and explicitly excludes factual questions, making it unambiguous which tool to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use it ('when the user wants a question settled and there is no correct answer') with concrete examples, and when not to ('Do not use it for questions of fact'). However, it does not name any alternative sibling tools (e.g., jef_score or jef_pick) that might apply instead, so the alternatives component is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.4.7- First observed
jef_flag - First observed
jef_pick - First observed
jef_rank - First observed
jef_score - First observed
jef_yes_no
TDQS
Scored across 5 tools
Each tool produces a distinctly different output type: binary yes/no, a single pick with probabilities, a numeric score, an ordering, and a categorical flag. The descriptions explicitly map use cases to each response shape, so an agent should not confuse them.
All names share the jef_ prefix and use lowercase snake_case, which is consistent. The only slight deviation is jef_yes_no being named after its output while the others are verb-like commands (pick, score, rank, flag), but this is a minor inconsistency.
Five tools is a well-scoped size for a subjective-decision helper server. Each tool covers a different way a user might want an opinion, and none feel redundant or unnecessary.
The tool surface covers the main decision output types an agent would need: binary choices, selection among options, numerical ratings, ordering, and categorical verdicts. There are no obvious dead ends or missing operations for the stated purpose.
Related MCP Connectors
Deterministic contextual decision arbitration and action routing for autonomous software. Takes current state, context, or intent plus caller-supplied candidate actions, state transitions, routes, refusals, escalations, tools, or models and returns a deterministic ordered candidate field. Also provides persistent machine representations for memory, retrieval, indexing, and downstream coherence measurement.
Human-in-the-loop for AI agents. Submit choices, get a human decision.
Sort up to 1,000 texts into your own labels with a calibrated confidence per answer. No API key.
Deterministic decision layer for autonomous agents: reproducible PROCEED/REVIEW/SKIP verdicts.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceMCP server that wraps the StupidAPIs' 'The Committee' tool, which convenes five random number generators to argue and vote with one always dissenting.4 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables natural-language interaction with TypeSafe's Jev decision API, supporting mixed question calls, batch evaluation, model listing, and confidence or composite-score gates over stdio.6MIT
- AlicenseAqualityBmaintenanceEnables frontier coding agents to delegate routine probabilistic judgments to TypeSafe Jev, providing calibrated triage signals for failures, attempts, completion, context ranking, findings, risk, and generic evidence-grounded questions.7MIT
- AlicenseAqualityAmaintenanceEnables agents to get fast, calibrated probabilistic answers from Jev (Typesafe AI) to yes/no, scale, or choice questions about provided material, without using a generative model.1MIT