Claude Skills Guide

Claude Code API Security: OWASP Guidelines for AI Agent Development

Building secure APIs for Claude Code integrations requires understanding both traditional web security and the unique risks that AI agents introduce. The OWASP Top 10 remains the standard framework for identifying critical vulnerabilities, but AI agent workflows add new attack surfaces that deserve attention.

This guide covers practical security patterns for developers building Claude Code integrations, whether you’re using the CLI, creating custom skills, or building agentic workflows that interact with external services.

Authentication and Authorization in Agentic Systems

Traditional API authentication often assumes a single request-response cycle. Claude Code agents operate differently—they maintain context across multiple turns, potentially escalating privileges as they complete complex tasks.

Pattern: Scoped Token Execution

Rather than granting broad API access, create tokens with minimal required scopes for each agent task:

# Create scoped tokens for specific agent operations
def create_agent_token(task_scope: list[str], expires_in: int = 3600):
    scopes = {
        "read_users": ["GET /users", "GET /users/*"],
        "write_orders": ["POST /orders", "PUT /orders/*"],
        "admin": ["*"]  # Never grant to agents by default
    }
    
    requested = [s for s in task_scope if s in scopes]
    token = generate_jwt(
        scopes=requested,
        expires=datetime.utcnow() + timedelta(seconds=expires_in),
        max_uses=50  # Limit total requests per token
    )
    return token

This pattern prevents a compromised agent from accessing resources outside its assigned scope. Combine this with the tdd skill when building authentication systems to ensure proper test coverage.

Input Validation: The First Line of Defense

LLM outputs can contain unexpected content that downstream systems must handle safely. Claude Code agents often construct queries, generate file paths, or build shell commands—each requiring rigorous validation.

Validating Agent-Generated Content

import re
from urllib.parse import urlparse

def validate_agent_output(output: str, context: str) -> bool:
    """Validate outputs based on expected context."""
    
    if context == "file_path":
        # Prevent path traversal
        unsafe_patterns = ["../", "..\\", "/etc/", "C:\\Windows"]
        return not any(p in output for p in unsafe_patterns)
    
    if context == "sql_query":
        # Basic SQL injection prevention
        dangerous = ["DROP", "DELETE FROM", ";--", "UNION SELECT"]
        return not any(d in output.upper() for d in dangerous)
    
    if context == "url":
        # Validate URL safety
        parsed = urlparse(output)
        return parsed.scheme in ("http", "https") and parsed.netloc
    
    return True

The frontend-design skill demonstrates safe patterns when generating UI components—always validate that generated HTML doesn’t contain injection payloads.

Rate Limiting for Stateful Agents

Agents can consume resources faster than traditional users because they make multiple API calls in seconds. Implement rate limiting that accounts for agent behavior:

from collections import defaultdict
import time

class AgentRateLimiter:
    def __init__(self, requests_per_minute: int = 60):
        self.rpm = requests_per_minute
        self.window = 60
        self.requests = defaultdict(list)
    
    def check(self, agent_id: str) -> bool:
        now = time.time()
        # Clean old entries
        self.requests[agent_id] = [
            t for t in self.requests[agent_id] 
            if now - t < self.window
        ]
        
        if len(self.requests[agent_id]) >= self.rpm:
            return False
        
        self.requests[agent_id].append(now)
        return True

This becomes critical when using the supermemory skill for long-running research tasks that generate many API calls.

Handling Sensitive Data in Context

Claude Code maintains conversation context across turns. Sensitive data in context windows creates exposure risk:

  1. Explicit filtering: Strip sensitive patterns before sending to Claude
  2. Context segmentation: Use separate conversations for different trust levels
  3. Auto-expiration: Implement context truncation policies
import re

SENSITIVE_PATTERNS = [
    r'\b\d{3}-\d{2}-\d{4}\b',  # SSN
    r'\b[A-Z0-9]{20,}\b',       # API keys
    r'Bearer\s+[A-Za-z0-9\-._~+/]+=*',  # Auth tokens
]

def sanitize_context(messages: list[dict]) -> list[dict]:
    """Remove sensitive data from context before sending to Claude."""
    sanitized = []
    for msg in messages:
        content = msg.get("content", "")
        for pattern in SENSITIVE_PATTERNS:
            content = re.sub(pattern, "[REDACTED]", content)
        sanitized.append({**msg, "content": content})
    return sanitized

Output Encoding and Injection Prevention

AI-generated outputs can contain malicious content designed to exploit downstream systems. The pdf skill and docx skill both handle file generation—ensure outputs are properly sanitized before writing:

from html import escape

def sanitize_for_html(content: str) -> str:
    """Prevent XSS when displaying agent outputs."""
    return escape(content)

def sanitize_for_markdown(content: str) -> str:
    """Remove potentially dangerous markdown."""
    dangerous = [
        r'<script[^>]*>.*?</script>',
        r'javascript:',
        r'on\w+\s*=',
    ]
    sanitized = content
    for pattern in dangerous:
        sanitized = re.sub(pattern, '', sanitized, flags=re.IGNORECASE)
    return sanitized

Dependency and Supply Chain Security

Claude Code often installs packages, runs npm install, or uses pip. Protect your agent environment:

# Use pip-audit in your project
uv pip install pip-audit
uv run pip-audit -r requirements.txt

Secure Skill Development

When building custom skills for Claude Code, follow security best practices:

  1. Validate all tool inputs within the skill, not just at API boundaries
  2. Log security-relevant events for audit trails
  3. Implement timeouts to prevent runaway agent loops
  4. Test injection scenarios using the tdd skill with adversarial inputs

The mcp-builder skill provides templates for secure MCP server implementation, including proper error handling that doesn’t leak sensitive information.

Monitoring and Incident Response

Deploy monitoring that tracks agent behavior patterns:

import logging

security_logger = logging.getLogger("security")

def log_agent_action(agent_id: str, action: str, resource: str, status: str):
    security_logger.info(
        f"agent_id={agent_id} action={action} resource={resource} status={status}"
    )

# Watch for anomalies
def detect_anomalous_behavior(agent_id: str, actions: list) -> bool:
    # Sudden spike in activity
    if len(actions) > 100 in 60 seconds:
        return True
    # Accessing unusual resources
    unusual = ["system", "admin", "config"]
    return any(u in str(actions).lower() for u in unusual)

Summary

Securing Claude Code integrations requires adapting OWASP principles to agentic workflows. Key takeaways:

By applying these patterns, you build AI agent systems that are both powerful and secure.

Built by theluckystrike — More at zovo.one