Runtime security SDK for AI agents — guard tool calls in 1 line
Project description
Clampd Python SDK
Runtime security for AI agents. Guard every tool call — OpenAI, Anthropic, LangChain, Google ADK — in 1 line.
Installation
pip install clampd
With framework extras:
pip install clampd[langchain] # LangChain callback handler
pip install clampd[mcp] # MCP server support
pip install clampd[all] # Everything
Quick Start
import clampd
from openai import OpenAI
# Configure once at startup
clampd.init(
agent_id="my-agent",
gateway_url="http://localhost:8080",
api_key="ag_live_...",
)
# Wrap your OpenAI client — done
client = clampd.openai(OpenAI())
# Use it exactly like before. Clampd intercepts every tool call.
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Look up active users"}],
tools=[...],
)
# Dangerous tool calls → blocked before execution
# Safe tool calls → proceed normally
Configuration
Three ways to configure (pick one):
# Option 1: Environment variables
# export CLAMPD_GATEWAY_URL=http://localhost:8080
# export CLAMPD_API_KEY=ag_live_...
# export CLAMPD_AGENT_ID=my-agent
# Option 2: Global init (recommended)
clampd.init(agent_id="my-agent", gateway_url="...", api_key="...")
# Option 3: Inline per-call
@clampd.guard("db.query", agent_id="my-agent", gateway_url="...", api_key="...")
def query(sql): ...
Anthropic / Claude
import clampd
from anthropic import Anthropic
clampd.init(agent_id="my-agent")
client = clampd.anthropic(Anthropic())
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[{"role": "user", "content": "..."}],
tools=[...],
)
LangChain
import clampd
handler = clampd.langchain(agent_id="my-agent")
result = executor.invoke(
{"input": "Look up active users"},
config={"callbacks": [handler]},
)
Google ADK
import clampd
from google.adk import Agent
agent = Agent(
tools=[...],
before_tool_callback=clampd.adk(agent_id="my-agent"),
)
Direct Guard (any function)
import clampd
clampd.init(agent_id="my-agent")
@clampd.guard("database.query")
def run_query(sql: str):
return db.execute(sql)
# With response checking (opt-in)
@clampd.guard("file_read", check_response=True)
def read_file(path: str):
return open(path).read()
run_query("SELECT * FROM users") # allowed
run_query("DROP TABLE users") # raises ClampdBlockedError
Error Handling
from clampd import ClampdBlockedError
try:
run_query("DROP TABLE users")
except ClampdBlockedError as e:
print(f"Blocked: {e}")
# e.risk_score, e.denial_reason, e.request_id
API Reference
| Function | Description |
|---|---|
clampd.init(...) |
Configure global client (once at startup) |
clampd.openai(client) |
Wrap OpenAI client |
clampd.anthropic(client) |
Wrap Anthropic client |
clampd.guard(tool_name) |
Decorator for any function |
clampd.langchain(...) |
LangChain callback handler |
clampd.adk(...) |
Google ADK before_tool_callback |
Requirements
- Python 3.10+
- A running Clampd gateway
License
BUSL-1.1
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
clampd-0.1.0.tar.gz
(16.9 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
clampd-0.1.0-py3-none-any.whl
(15.0 kB
view details)
File details
Details for the file clampd-0.1.0.tar.gz.
File metadata
- Download URL: clampd-0.1.0.tar.gz
- Upload date:
- Size: 16.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bd0a2e99f19d2f2bf721f30752f83592326677912338d5ff40da1d1919f9ae9b
|
|
| MD5 |
747bfaf8886827b524e31a12dd43a97f
|
|
| BLAKE2b-256 |
70c630fbc2be5e930bcf98b66e1430359cde65b3f8324b6a4f810cbd36a0e83d
|
File details
Details for the file clampd-0.1.0-py3-none-any.whl.
File metadata
- Download URL: clampd-0.1.0-py3-none-any.whl
- Upload date:
- Size: 15.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c8401188e3d548570ea5fbd88421759c822e1793a25d03dec6df66d3cd6998bf
|
|
| MD5 |
3169a792d336994a206b0b3c76161ca6
|
|
| BLAKE2b-256 |
d5316d2fa729acc3d7549f72a518297e53d911d6ad9e63d9e6e97e79c6d137e3
|