Casys PML

Procedural Memory for AI Agents

One gateway. Any model.Full observability.

Build AI workflows once, run them with Claude, GPT, Gemini, or your local Ollama. Every tool call traced. Debug in seconds, not hours.

Model-Agnostic·
Full Traceability·
Learns Patterns
workflow:ci-deploy
live
22calls3models$0.028cost1retry

Collective Intelligence

Every executionmakes it smarter.

The more workflows run, the better the system gets. Network effects that compound — impossible to catch up once you start.

Community Patterns

Learn from thousands of workflow executions. The more people use it, the smarter it gets for everyone.

Auto-Optimization

Your workflows improve automatically over time. No manual tuning required.

Smart Suggestions

"Users who ran this also used..." — discover tools you didn't know you needed.

Architecture

How it works

A unified gateway that connects any LLM to any MCP server, with full observability and continuous learning.

Any LLM Client
Claude · GPT · Gemini · Ollama
PML Gateway
RegistryDAG ExecutorSandbox
Symbolic World ModelObservability
MCP Servers
filesystem · postgres · github · (Any Tools)
SANDBOXfetchparsellmrunAI ACTIONSCHECKPOINTAPPROVE?PROTECTEDfilesdbapi$_TOOLS & DATA

Security

Autonomous,not reckless.

AI agents shouldn't have the keys to everything. Actions run in isolation — they can't access your data or tools without going through controlled checkpoints. Sensitive operations always ask before acting.

Sandboxed Execution

Code runs in isolated workers with no direct access

Human-in-the-Loop

Dangerous actions require explicit approval

Audit Trail

Every action logged for transparency

Catalog

ops:deployNotify

Orchestrate release notifications across platforms

const release = await mcp.github.get_release({ tag: "latest" });

await mcp.slack.post_message({
  channel: "#deployments",
  text: `🚀 ${release.tag_name} deployed!`
});

await mcp.notion.update_page({
  page_id: "releases",
  properties: { Status: "Live" }
});

return { version: release.tag_name };
github.get_releaseslack.post_messagenotion.update_page
sales:researchCompany

Multi-source intelligence with parallel fetching

const [web, linkedin, funding] = await Promise.all([
  mcp.brave.search({ query: `${company} news` }),
  mcp.linkedin.company({ name: company }),
  mcp.crunchbase.funding({ company })
]);

const summary = await mcp.std.agent_summarize({
  content: JSON.stringify({ web, linkedin, funding }),
  format: "bullet_points"
});

return { company, summary, sources: 3 };
brave.searchlinkedin.companycrunchbase.fundingagent_summarize
data:syncPipeline

ETL workflow with validation and notifications

const leads = await mcp.postgres.query({
  query: "SELECT * FROM leads WHERE synced = false"
});

for (const lead of leads.rows) {
  const valid = await mcp.std.validate_email({ email: lead.email });
  if (valid) await mcp.salesforce.upsert({ data: lead });
}

await mcp.slack.dm({ user: "@sales", text: `✓ ${leads.rows.length} synced` });
postgres.queryvalidate_emailsalesforce.upsertslack.dm
ai:analyzeRepo

Deep codebase analysis with agent delegation

const files = await mcp.fs.glob({ pattern: "src/**/*.ts" });

const analysis = await mcp.std.agent_delegate({
  goal: "Analyze architecture patterns",
  tools: ["fs_read", "grep"],
  maxIterations: 10
});

await mcp.notion.create_page({
  title: "Architecture Report",
  content: analysis.summary
});
fs.globagent_delegatenotion.create_page
support:triageTicket

Auto-classify and route support tickets

const ticket = await mcp.zendesk.get_ticket({ id: ticketId });

const classification = await mcp.std.agent_classify({
  text: ticket.description,
  categories: ["bug", "feature", "billing"]
});

await mcp.linear.create_issue({
  title: ticket.subject,
  labels: [classification.category]
});
zendesk.get_ticketagent_classifylinear.create_issue

Quick Start

Up and running in 3 steps

Add procedural memory to Claude Code in under a minute.

1

Install PML

One command. Works on Linux, macOS, and Windows.

terminal
$ curl -fsSL https://pml.casys.ai/install.sh | sh
✓ Installed pml to /usr/local/bin/pml
2

Initialize your project

Creates .mcp.json for Claude Code. PML starts automatically via stdio.

terminal
$ cd your-project
$ pml init
Created .pml.json
Created .mcp.json

$ echo "PML_API_KEY=your_key" >> .env
3

Use with Claude Code

That's it. Claude Code auto-starts PML. Just describe what you want.

claude-code
# PML tools are available automatically:
discover({ intent: "read a JSON file" })

execute({
  intent: "List dependencies from package.json",
  code: `const pkg = await mcp.fs.read_file(...);`
})
PML learns patterns as you work

Early Access

Join the Beta

Be among the first to give your agents procedural memory.

Ready to try?

Give your agents procedural memory. Start building smarter workflows today.