Skip to content

toolnexus

Give any LLM tool-calling, an MCP host, agent skills, and remote agents — in a few lines, in five languages.

Point it at your tools. Get a working agent.

Section titled “Point it at your tools. Get a working agent.”

Point toolnexus at an mcp.json and a skills/ folder and you get the tool-calling loop, skills injection, five unified tool sources, and conversation memory — all included. The same three lines, in every language:

import { createToolkit, createClient } from "toolnexus"
const tk = await createToolkit({
mcpConfig: "./mcp.json", // every MCP server's tools
skillsDir: "./skills", // every SKILL.md, loaded on demand
})
const agent = createClient({
baseUrl: "https://openrouter.ai/api/v1", // any OpenAI- or Anthropic-style endpoint
style: "openai",
model: "openai/gpt-4o-mini",
})
const { text } = await agent.run("Use my tools to answer this.", { toolkit: tk })
console.log(text)

MCP servers

Read an mcp.json, connect to every server (local stdio + remote streamable-HTTP), expose each server tool as a uniform Tool.

Agent skills

Glob a skills/ folder of SKILL.md files; one skill tool loads instructions and resources on demand — progressive disclosure.

Your own functions

Register a plain function as a tool. Native, HTTP endpoints, and the built-in shell/file tools all share the same shape.

Remote A2A agents

Another agent, called like a function. toolkit.serve(...) also exposes your toolkit to the world as an A2A agent.

The loop, included

System prompt, skills injection, parallel + chained tool calls, hooks, streaming, retries, conversation memory, observability metrics.

Human in the loop

The suspension layer: an agent can pause, ask you a question, and resume — plus an MCP elicitation bridge. Nobody else ships this across five ports.

The whole point is parity: the same examples/ fixtures produce the same behavior in every language. Install for yours on the install page, or walk the one-demo-five-sources tour.