Simpler than all. Faster than most. The complete agentic backbone. Build in the language you're comfortable with: JavaScript, Python, Go, Java, C#, Elixir, Clojure or Rust, with the same behaviour in each. MCP servers, agent skills, your own functions and media generation, for any LLM.
One vendor-neutral agent library, ported by hand to JavaScript, Python, Go, Java, C#, Elixir,
Clojure and Rust, held to one conformance contract (SPEC.md) so the shared
examples/ produce the same output in every port.
An MCP server tool, an agent skill, your own function, a remote HTTP endpoint, a built-in
shell/file tool, a remote A2A agent and an in-process sub-agent are all the same thing to a
model: a named, described, schema'd callable (an insight borrowed from
opencode). Toolnexus puts every one of them behind one
Tool interface, emits the schema in OpenAI / Anthropic / Gemini shape, and drives any model with
them through one client loop.
npm i toolnexus # JavaScript / TypeScript (npm)
pip install toolnexus # Python (PyPI)
go get github.com/muthuishere/toolnexus/golang # Go
dotnet add package Toolnexus # C# / .NET (NuGet)
{:toolnexus, "~> 0.29"} # Elixir (mix.exs deps, Hex)
# Java (Maven Central): io.github.muthuishere:toolnexus:0.29.0
# Clojure (deps.edn, Clojars): net.clojars.muthuishere/toolnexus {:mvn/version "0.29.0"} (JVM and cljgo)
cargo add toolnexus # Rust (crates.io)
Point it at an mcp.json (the standard Claude-desktop-style config) and a skills/ folder of
SKILL.md files, then run:
import { createToolkit, createClient } from "toolnexus"
const tk = await createToolkit({ mcpConfig: "./mcp.json", skillsDir: "./skills" })
const agent = createClient({ baseUrl: "https://openrouter.ai/api/v1", style: "openai", model: "openai/gpt-4o-mini" })
const { text } = await agent.run("Refund order 4021 using the policy.", { toolkit: tk })
The key comes from OPENROUTER_API_KEY because the host is openrouter.ai: a key is only ever
sent to the host it belongs to. A local server or proxy needs apiKey or apiKeyEnv
(recipe). The same shape in every language:
Quickstart.
SKILL.md standard, loaded on demand through one skill tool. SkillssetMode / setModel switch a running agent without a restart. In-process clientcreateClassifier and judge adapters: yes/no, pick-one and score answers as typed values, on any System One endpoint or OpenAI's Decisions API. Typed decisions · BackendsRequest; a waitFor host resolves it, or the run returns pending and resumes later. SuspensionafterRound hook), streaming with retry events, retries and resilience, opt-in model fallback on overload, stop-reason recovery, reactive compaction on context overflow, prompt caching and tool tiers, sub-agents, observability. Streaming · Resilience · Sub-agentsExact per-port spellings and any port-specific gaps are in CHANGELOG.md and each
port's API reference.
Measured against 21 frameworks on a zero-cost mock model, per language. Honest summary: lowest per-request overhead over MCP in Python, JavaScript, C# and Rust, level with Eino in Go, and level with LangChain4j on the JVM (2.15 vs 2.17 ms p50, 141 vs 140 MB, starting faster at 174 vs 259 ms). Every row, loss included: Nov 2026 standing.
| language | package | docs |
|---|---|---|
| JavaScript / TypeScript | toolnexus | js/ · API |
| Python | toolnexus | python/ · API |
| Go | github.com/muthuishere/toolnexus/golang | golang/ · API |
| Java | io.github.muthuishere:toolnexus | java/ · API |
| C# / .NET | Toolnexus | csharp/ · API |
| Elixir | toolnexus | elixir/ · API |
| Clojure | net.clojars.muthuishere/toolnexus | clojure/ · API |
| Rust | toolnexus | rust/ · API |
Built something on Toolnexus? Open a PR adding one line here.
SPEC.md — the cross-language contract; §0 is the one-page conformance suite. A behaviour change lands in all eight ports or it is not done.CHANGELOG.md — what shipped. Changes go through OpenSpec first; see CLAUDE.md and PUBLISHING.md.MIT — see LICENSE.
Can you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |