Quickstart#
Install a tool and call it from Node or Python.
Initialize an agent (manifest)#
agentpm init --kind agent --name research-assistant --description "Assistant composed of multiple tools"This generates agent.json:
{
"kind": "agent",
"name": "research-assistant",
"version": "0.1.0",
"description": "Assistant composed of multiple tools",
"tools": []
}Heads-up
The agent manifest is the source of truth for what your agent can call. We’ll add tools to tools[] next.
Add a tool to your agent#
Option A - CLI adds it for you#
agentpm install @zack/summarize-document@0.1.0The CLI resolves, downloads, and writes the entry to agent.json → tools[].
Option B - Edit manifest, then install#
Add to agent.json:
"tools": [
{
"name": "@zack/summarize-document",
"version": "0.1.0"
}
]Then run:
agentpm installDeterministic installs
AgentPM locks the exact artifact and runs it in a managed subprocess with your declared runtime & required environment variables, keeping your agent app clean and repeatable.
Use the tool from Node#
Install the SDK:
pnpm add @agentpm/sdk
# or: npm i @agentpm/sdkCall the tool:
import { load } from '@agentpm/sdk';
const summarize = await load('@zack/summarize-document@0.1.0');
// `summarize` is a callable bound to a managed subprocess
const out = await summarize({ text: 'AgentPM makes tools portable across stacks.' });
console.log(out);load()resolves & prepares the tool per your manifest/version.- The tool executes in a subprocess, so Node apps can safely call Python tools (and vice-versa) with no dependency collisions.
Use the tool from Python#
Install the SDK:
uv pip install agentpm
# or: pip install agentpmCall the tool:
from agentpm import load
t = load("@zack/summarize-document@0.1.0")
out = t({ "text": "AgentPM makes tools portable across stacks." })
print(out)load()returns a callable bound to the tool’s subprocess runtime.- Same manifest, same artifact—just a different host language.