Setup

One MCP server. No integration code.

CrewAI speaks MCP, and AgentValet publishes an MCP server. Point one at the other and the crew has a tool for every platform you have granted, and no tool for anything you have not.

crew.py
from crewai import Agent
from crewai.mcp import MCPServerStdio

agent = Agent(
    role="Operations Engineer",
    goal="Keep the team informed and the tracker up to date",
    mcps=[MCPServerStdio(
        command="npx",
        args=["-y", "@agentvalet/mcp-server"],
        env={"AGENT_ID": agent_id, "OWNER_ID": owner_id},
    )],
)
1
Sign in at app.agentvalet.ai (it's free) and create an agent.
2
Run pip install agentvalet then agentvalet register --code <your-code>. The keypair is generated on your machine; only the public half is sent.
3
Add the mcps= block above to any agent in your crew.
4
Approve platforms in the dashboard. What you grant is exactly what the crew can see.
Prefer pure Python? pip install crewai-agentvalet gives you the same governance as ordinary CrewAI tools, with no Node and no MCP server: tools=governed_tools() builds one typed tool per granted platform.
Why the stdio server and not a URL?

AgentValet also exposes a remote MCP endpoint, and MCPServerHTTP will connect to it. But agent assertions are deliberately short-lived: 60 seconds. MCPServerHTTP takes its headers once, at construction, so a static token goes stale a minute into the run and every later tool call fails. The stdio server signs a fresh assertion for each request, so it keeps working for as long as the crew runs. Use the remote endpoint only where you have somewhere to refresh the token from.

What changes

The tool list becomes the permission boundary

Not an allow-list you maintain
CrewAI can filter tools in your own code. That is a convenience an agent can talk its way around. Here the list is computed on the server from your grants and your policy, so a platform you have not granted produces no tool at all.
No credential in the crew
Not in your environment, not in a config file, not in the model's context. The real credential is decrypted in memory inside AgentValet at call time and never appears in a response.
Approval per action, not per task
CrewAI's human_input asks a human to shape the work. An AgentValet approval asks a human to authorise a specific outbound effect. The tool pauses, you approve from your phone, and the crew carries on.
The other half of the log
Your CrewAI logs say what the agents decided to do. The audit log says what they were permitted to do, and what a human said when asked. That is the question you get asked after something goes wrong.
Crews of more than one

Different roles, different authority.

Give each role its own agent when their authority should differ. A researcher that only reads and a publisher that can post are two identities with two grant sets, and the audit trail then tells you which role did what. Register them separately from the dashboard, and grant the narrow ones narrowly: each agent's permissions are the ones you gave it directly.

Govern your crew in under 5 minutes.

One MCP block, or one pip install. Free to start, no credit card.