plugins/ to share skills and MCP servers across managed ADK and LangGraph agents. Harnest discovers its declarations automatically. Advanced applications must wire these capabilities themselves.
Need Python APIs, SDK dependencies, typed context, or lifecycle behavior? Build a Harnest Extension in
extensions/. Application hooks and resource factories belong in lifecycle/.Add a plugin
From the agent folder, install a reviewed local package into the project:plugins/<manifest-name>. Links and special files are rejected. Use --force to replace an installed package; a failed replacement restores the previous version.
The installer accepts local directories. Use harnest extensions search to discover executable Harnest Extensions.
Place each package in its own directory. Keep the package’s root plugin.json intact:
plugins/warehouse/plugin.json
$schema shown above and a name. That name identifies the plugin, even when its enclosing directory has a different name. Both component locations are optional: a skills-only, MCP-only, or manifest-only package is valid.
Plugin skills join the agent’s skill registry and load on demand through list_skills, load_skill, and load_skill_resource. Plugin MCP servers join direct connections from mcp/. Use a skill to explain when to call its tools, which inputs they need, and how to interpret their output.
Rebuild after adding a package, or use development reload while serving locally.
Attach a plugin after compilation
Agent Desktop can attach plugins when creating a session. The desktop downloads the package and sends Harnest a ZIP withplugin.json at its root.
POST /sessions
sha256 must match the decoded ZIP. Harnest returns each plugin’s name and computed digest in metadata.plugins, and stores the archive privately with the session for restart recovery.
The plugin set is fixed when the session is created. Create another session to add, remove, or update a plugin. Dynamic attachment currently requires a managed root Agent; managed Graph and advanced applications retain their compiled capability wiring.
Harnest accepts at most 16 plugins per session and regular files only. It rejects encrypted members, links, absolute or parent paths, case-insensitive path collisions, more than 256 files, files larger than 4 MiB, archives larger than 8 MiB, and expanded content larger than 32 MiB. The server’s configured
limits.max_request_bytes also applies to the base64 JSON request and may impose a lower effective limit.
Configure MCP servers
Portable MCP declarations live in rootmcp.json, not Python factories. Each server declares its transport explicitly:
plugins/warehouse/mcp.json
MCP connections open at runtime; compilation does not start servers.
Local processes and persistent data
For a package that includesserver.py, a stdio declaration can use:
plugins/warehouse/mcp.json
command must be an executable name or a bundled path beginning with ./, not a shell command.
Harnest supplies both variables to each stdio subprocess. Persistent data lives below
$XDG_DATA_HOME/harnest/agent-plugins, or ~/.local/share/harnest/agent-plugins when XDG_DATA_HOME is unset. Set HARNEST_PLUGIN_DATA_DIR to override that base directory. Harnest separates data by installation and plugin; package updates do not erase it.
Only ${PLUGIN_ROOT} and ${PLUGIN_DATA} expand, and only in stdio args, env values, and cwd. Other placeholders stay literal. Do not override the reserved variables in env. An omitted cwd uses the package directory. An explicit cwd must start with ./, ${PLUGIN_ROOT}, or ${PLUGIN_DATA} and remain inside the corresponding directory after resolution.
Remote connections and credentials
Remote URLs require HTTPS except for loopback hosts. URL and header values are literal:${TOKEN} does not read an environment variable. Do not embed secrets in plugin headers or stdio environment declarations.
MCP HTTP clients use the process’s HTTP(S) and ALL_PROXY variables, including SOCKS proxies. Remove those variables to bypass proxy discovery. Diagnostics omit proxy URLs and credentials.
Authentication is client-managed; Agent Plugins 1.0 does not define portable credential references or OAuth configuration. When your application needs custom credential resolution, configure a direct MCP client with Harnest’s credential providers.
Validation and diagnostics
Harnest validates the manifest before discovering components. An invalid manifest rejects that plugin. Invalid skill entries or MCP server entries are skipped with diagnostics while valid siblings continue loading. An invalidmcp.json disables that plugin’s MCP component without disabling its skills.
Unknown client namespaces and their directories are ignored. Standard plugins cannot contribute Harnest lifecycle hooks or arbitrary Python modules.
Author Agent Skills
Write focused instructions and load supporting resources on demand.
Build a Harnest Extension
Package Python functionality, lifecycle behavior, and typed context.