jev-mcp-dispatcher
Plain-language MCP tool calls with no LLM at all, only Jev.
# jev-mcp-dispatcher
**Zero general-purpose LLM calls — anywhere in this pipeline, not for
picking the tool, not for reading a parameter's value out of a sentence, not
for anything.** This is a proof of concept for a different way to do MCP
tool dispatch: given a **simple** MCP (Model Context Protocol) server — one
whose tools take primitive-typed parameters — this script dynamically
discovers its tool signatures at runtime and uses
[Jev](https://docs.typesafe.ai) — [TypeSafe](https://typesafe.ai)'s System One
reasoning model — to route a plain natural-language command to the correct
tool and extract its arguments straight out of the sentence, using only
Jev's typed primitives (`Choice` / `Noul`) instead of free-text generation.
The dispatcher logic never hardcodes a specific tool name, parameter name,
or parameter count. It is *not* a claim that this works against an
arbitrary MCP server unconditionally — see
[Scope and caveats](#scope-and-caveats) for exactly what the input text and
the tool registry need to look like.
> Every decision — which tool to call, which words belong to which
> argument, how many independent actions a command describes, whether a
> number is spelled out in words — is made by asking Jev one typed question
> and reading back a probability, never by asking a model to generate text.
```
"Play Blinding Lights by The Weeknd on the speaker"
│
▼
discover tools from the MCP server (list_tools())
│
▼
Jev picks the tool: play_song (confidence 1.00)
│
▼
for each parameter Jev declared:
title (string) -> "Blinding Lights"
artist (string) -> "The Weeknd"
device (enum) -> "speaker"
│
▼
play_song(title="Blinding Lights", artist="The Weeknd", device="speaker")
│