Toolnexus: a vendor-neutral tool-calling layer for LLMs, byte-identical across 5 languages (with real human-in-the-loop suspend/resume)
Mirrored from r/LocalLLaMA for archival readability. Support the source by reading on the original site.
Toolnexus is a small, vendor-neutral library that gives any LLM the dynamic tool-calling an agent framework has, but ported byte-identically across five languages (JavaScript, Python, Go, Java, C#).
The idea: MCP servers, agent skills, your own functions, HTTP endpoints, the built-in shell/file tools, and remote A2A agents are all the same thing to a model — a named, described, schema'd callable. toolnexus unifies them behind one Tool interface, emits the schema in OpenAI / Anthropic / Gemini formats, and ships a client with the tool-calling loop built in (parallel + chained calls, streaming, hooks, retries, conversation memory, metrics).
Three lines to a working agent:
const tk = await createToolkit({ mcpConfig: "./mcp.json", skillsDir: "./skills" }) const client = createClient({ baseUrl, style: "openai", model }) await client.run("do the thing", { toolkit: tk }) The part I'm most happy with is human-in-the-loop as a first-class primitive: when a tool needs a person — an approval, an OAuth login, a "decide this" — the loop doesn't fail, it suspends, surfaces a typed request, and resumes exactly where it left off once you answer (synchronously, or durably hours later from a chat). It also bridges MCP elicitation into the same mechanism.
It's also an inbound endpoint: the assembled toolkit can be re-served as an MCP server or an A2A agent, so other agents can call your tools.
The whole point of the five ports is parity — the same examples/ fixtures produce the same behavior everywhere; that's enforced in CI. Docs (with a short narrated demo):
[link] [comments]
Discussion (0)
Sign in to join the discussion. Free account, 30 seconds — email code or GitHub.
Sign in →No comments yet. Sign in and be the first to say something.