MCP templates

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

TemplateToolsConfig
echoecho(message)
fileslist_files(path), read_file(path), search_files(path, query)local_path: "/data/mcp_files" — drop files in ./home_data/mcp_files/ on your host
postgresQuery against a configured Postgres instancedsn: "postgresql://user:pw@host:5432/db"
slackRead / write Slack via bot tokenbot_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, confluence
  • microsoft365, 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 of ToolDef with JSON-schema input.
  • async def call_tool(name, arguments, ctx) — the dispatcher. Receives ctx.config + ctx.policy from the deployment row.

Reference implementations: files.py, postgres.py.