Tools & connectors
Tools are what your agent can do. Ownware ships a built-in kit (filesystem, shell, web, browser, memory, sub-agents, …), and three connector types add more — each one line of config in agent.json, no code changes.
For AI agentscondensed build recipe
built-ins are selected by tools.preset (full/coding/readonly/none) filtered by allow/deny globs (deny wins). Add MCP servers under tools.mcp ({"<name>": {"transport":"stdio","command":"npx","args":[…]}} — url transport also supported); Composio via tools.composio {"toolkits":["github","notion"]} (requires COMPOSIO_API_KEY env before boot, otherwise silently disabled); custom tools via tools.custom [{"path":"tools/my-tool.ts"}] where the file exports defineTool({ name, description, inputSchema, execute }) from ownware. Restart the gateway after editing.
When to use which
| You want | Use |
|---|---|
| Files, shell, search on the host | Built-in presets — already there |
| An existing tool server (filesystem, GitHub, databases…) | MCP — any stdio or url server |
| SaaS apps (GitHub, Notion, Slack, 400+) with managed auth | Composio |
| Your own logic in TypeScript | Custom tools |
Built-in tools
Selected by tools.preset, filtered by allow/deny globs — deny always wins:
"tools": { "preset": "full", "deny": ["shell_execute"] }Presets: full (all built-ins — filesystem, shell, web, browser, memory, sub-agent, …) · coding (filesystem + shell) · readonly (read-only filesystem) · none. See Profile format.
Any MCP server
Verified: the agent gets the server's tools at startup.
"mcp": {
"everything": {
"transport": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-everything"]
}
}Both stdio and url transports are supported.
Composio — 400+ SaaS apps
Requires COMPOSIO_API_KEY in the environment before the gateway starts (get one at composio.dev). Without the key, Composio stays disabled and declared toolkits are ignored.
"composio": { "toolkits": ["github", "notion"] }Your own tool
A TypeScript file in the profile folder:
import { defineTool } from 'ownware'
export const codeReview = defineTool({
name: 'code_review',
description: 'Run a code review on a file',
inputSchema: {
type: 'object',
properties: { file: { type: 'string', description: 'File to review' } },
required: ['file'],
},
async execute(input) {
return { content: 'Review complete', isError: false }
},
})"custom": [{ "path": "tools/my-tool.ts" }]How it works
At assembly time the kernel merges all four sources into one tool list, then the engine's security layers apply to every call equally — policy filters, input guards, zone classification, and human-in-the-loop permissions. A connector tool gets no special trust. See Thinking in Ownware § security.
Next steps
- Profile format — where these blocks live in
agent.json. - The run API — watch
tool.call.start/.endevents stream.