What Alfred can deploy. Locally. Today.
Home edition ships four MCP server templates. Each spawns as a Docker container on the same network as the Powerloom API, with deterministic naming, health-check, and idempotent re-apply.
The enterprise edition at powerloom.tech adds ten more SaaS-integrated templates (github, notion, jira, linear, etc.). Those require maintained container images — the home edition will pick them up as community contributions land.
Available now
| Template | Tools | Config |
|---|---|---|
echo | echo(message) | — |
files | list_files(path), read_file(path), search_files(path, query) | local_path: "/data/mcp_files" — drop files in ./home_data/mcp_files/ on your host |
postgres | Query against a configured Postgres instance | dsn: "postgresql://user:pw@host:5432/db" |
slack | Read / write Slack via bot token | bot_token: "xoxb-..." |
How Alfred deploys them
Ask in natural language. Alfred translates to the REST call. Example conversation (in Claude Code, after you've wired the MCP config):
you: Deploy a files MCP pointed at my sample data.
alfred: (invokes powerloom_whoami, confirms identity)
(POST /mcp-deployments {template_kind: "files", isolation_mode:
"dedicated", config_json: {"local_path": "/data/mcp_files"}})
Deployment created. Deploy worker will spawn
powerloom-files-mcp:local shortly.
Want me to attach it to a specific agent once it's healthy?
you: Yes, create a research-agent that uses it.
alfred: (POST /agents, POST /agents/{id}/mcp-servers, POST
/runtime-credentials if needed)
Agent 'research-agent' created in /home.
MCP 'files' attached.
Invocation ready.Under the hood, the deploy worker generates a per-template docker run command, builds the image from the repo's Dockerfile if it's not cached, joins it to the powerloom_default docker network, and writes the MCP registration row pointing at http://powerloom-mcp-<id>:8080/mcp.
files local-path mode
Unique to the home edition. In enterprise, the files template reads from an S3 bucket. In home mode, you can point it at a local directory via config.local_path.
Path-traversal is rejected server-side: any .. that escapes the configured root returns a ToolError, regardless of what the LLM sends.
The home compose bind-mounts ./home_data/mcp_files:/data/mcp_files by default. Drop any file in that folder on your host and Alfred can read it via the spawned MCP. Useful for "summarize today's notes", "search my export dump for X", etc.
Not yet in home edition
Ten SaaS templates exist in the enterprise edition but aren't wired to local container images yet:
github,google_drive,notion,jira,confluencemicrosoft365,salesforce,zendesk,hubspot,linear
Each needs a container image — either from a public registry or a repo-local Dockerfile. If you have a strong use case for one, open an issue or a PR:
Want to write your own handler?
MCP handlers live in mcp_handlers/mcp_handlers/handlers/. Each handler implements a small protocol:
template_kind— the string Alfred uses in deployment requests.tools— a list ofToolDefwith JSON-schema input.async def call_tool(name, arguments, ctx)— the dispatcher. Receivesctx.config+ctx.policyfrom the deployment row.
Reference implementations: files.py, postgres.py.