A tool is a tool is a tool
The insight toolnexus is built on: MCP server tools, agent skills, your own functions, remote
HTTP endpoints, the built-in shell/file tools, and remote A2A agents are the same thing to an
LLM — a named, described, schema’d callable. toolnexus unifies every source behind one Tool
interface, emits the schema in OpenAI / Anthropic / Gemini formats, and drives any model with them.
The sources
Section titled “The sources”| Source | What it is | Appears as |
|---|---|---|
| MCP | Servers from mcp.json — local stdio + remote streamable-HTTP |
source: "mcp" |
| Agent skills | A skills/ folder of SKILL.md files, loaded on demand |
one skill tool |
| Native | Your own function, registered natively (defineTool / NativeTool) |
source: "native" |
| HTTP | A remote HTTP endpoint wrapped as a tool | source: "http" |
| Built-ins | bash, read, write, edit, grep, glob, and more — on by default | source: "builtin" |
| A2A | A remote agent’s skills, fetched from its Agent Card | source: "a2a" |
Every one produces a Tool with a name, a description, an input schema, and an execute. The
adapters render that uniform shape into whatever your model expects.
Deep dives: MCP servers · Agent skills
The client loop
Section titled “The client loop”The unified client ships a built-in tool-calling loop: system prompt, skills injection into the prompt, parallel and chained tool calls, hooks (before/after tool), streaming, retries, conversation memory, and observability metrics. You bring a model endpoint; toolnexus runs the conversation.
Inbound, too
Section titled “Inbound, too”toolnexus is not only a consumer of tools — toolkit.serve(addr, …) exposes your toolkit to
the outside world as a remote A2A agent: an Agent Card plus JSON-RPC over the same client
loop. Your toolkit becomes something another toolnexus (in any of the five languages) can call as
a tool.