The Claude Agent SDK adapter allows you to run AgentMark prompts as agentic tasks using Anthropic’s Claude Agent SDK . This adapter is suited for agentic execution with tool use, budget controls, and built-in tracing. Available for both TypeScript and Python.
Installation
npm install @agentmark-ai/claude-agent-sdk-adapter @anthropic-ai/claude-agent-sdk
pip install agentmark-claude-agent-sdk agentmark-prompt-core claude-agent-sdk
Setup
Create your AgentMark client with a ClaudeAgentModelRegistry. The registry supports maxThinkingTokens for extended thinking: import { createAgentMarkClient , ClaudeAgentModelRegistry } from "@agentmark-ai/claude-agent-sdk-adapter" ;
const modelRegistry = new ClaudeAgentModelRegistry ()
. registerModels ([ "claude-sonnet-4-20250514" ])
. registerModels ([ "claude-opus-4-20250514" ], {
maxThinkingTokens: 10000 ,
});
export const client = createAgentMarkClient ({
loader: fileLoader ,
modelRegistry ,
});
Create your AgentMark client in agentmark_client.py: from pathlib import Path
from dotenv import load_dotenv
from agentmark.prompt_core import FileLoader
from agentmark_claude_agent_sdk import (
create_claude_agent_client,
ClaudeAgentModelRegistry,
ClaudeAgentAdapterOptions,
ModelConfig,
)
load_dotenv()
# Default registry passes model names through directly
model_registry = ClaudeAgentModelRegistry.create_default()
# Or configure with extended thinking
model_registry = ClaudeAgentModelRegistry()
model_registry.register_models(
[ "claude-sonnet-4-20250514" ],
lambda name , _ : ModelConfig( model = name)
)
model_registry.register_models(
[ "claude-opus-4-20250514" ],
lambda name , _ : ModelConfig( model = name, max_thinking_tokens = 10000 )
)
loader = FileLoader( base_dir = str (Path( __file__ ).parent.resolve()))
client = create_claude_agent_client(
model_registry = model_registry,
loader = loader,
)
Running Prompts
The Claude Agent SDK adapter runs prompts as agentic tasks. The agent executes autonomously, using tools and multi-turn reasoning:
import { client } from "./agentmark.client" ;
const prompt = await client . loadTextPrompt ( "task.prompt.mdx" );
const input = await prompt . format ({
props: { task: "Analyze the auth module and suggest improvements" },
});
const result = await runAgent ( input );
console . log ( result . text );
import asyncio
from agentmark_claude_agent_sdk import run_text_prompt
from agentmark_client import client
async def main ():
prompt = await client.load_text_prompt( "code-reviewer.prompt.mdx" )
params = await prompt.format( props = {
"task" : "Analyze the auth module and suggest improvements"
})
result = await run_text_prompt(params)
print (result.output)
asyncio.run(main())
Adapter Options
Configure agent behavior through adapter options:
const input = await prompt . format ({
props: { task: "Refactor the database layer" },
adapterOptions: {
permissionMode: "auto" ,
maxTurns: 10 ,
cwd: "/path/to/project" ,
maxBudgetUsd: 5.00 ,
allowedTools: [ "read" , "write" , "bash" ],
disallowedTools: [ "browser" ],
systemPromptPreset: "default" ,
onWarning : ( warning ) => {
console . warn ( "Agent warning:" , warning );
},
},
});
from agentmark_claude_agent_sdk import ClaudeAgentAdapterOptions
client = create_claude_agent_client(
model_registry = model_registry,
loader = loader,
adapter_options = ClaudeAgentAdapterOptions(
permission_mode = "bypassPermissions" ,
max_turns = 10 ,
cwd = "/path/to/project" ,
max_budget_usd = 5.00 ,
allowed_tools = [ "read" , "write" , "bash" ],
disallowed_tools = [ "browser" ],
system_prompt_preset = False ,
on_warning = lambda w : print ( f "Warning: { w } " ),
),
)
Option TypeScript Python Description Permission mode permissionModepermission_modeHow the agent requests permission for actions Max turns maxTurnsmax_turnsMaximum number of agentic reasoning turns Working directory cwdcwdWorking directory for file system operations Budget limit maxBudgetUsdmax_budget_usdMaximum USD budget for the task Allowed tools allowedToolsallowed_toolsWhitelist of tools the agent can use Disallowed tools disallowedToolsdisallowed_toolsBlacklist of tools the agent cannot use System prompt systemPromptPresetsystem_prompt_presetSystem prompt preset to use Warning handler onWarningon_warningCallback for agent warnings
Object Generation
For structured output, use object prompts:
import { client } from "./agentmark.client" ;
import { z } from "zod" ;
const prompt = await client . loadObjectPrompt ( "extract.prompt.mdx" , {
schema: z . object ({
sentiment: z . enum ([ "positive" , "negative" , "neutral" ]),
confidence: z . number (),
}),
});
const input = await prompt . format ({
props: { text: "This product is amazing!" },
});
const result = await runAgent ( input );
console . log ( result . object );
from agentmark_claude_agent_sdk import run_object_prompt
prompt = await client.load_object_prompt(ast)
params = await prompt.format( props = { "text" : "This product is amazing!" })
result = await run_object_prompt(params)
print (result.output)
Tools
The Claude Agent SDK adapter handles tools differently from the AI SDK adapter . Instead of registering custom tool executors, you list tool names in your prompt frontmatter. The adapter passes these names as allowedTools to the Claude Agent SDK.
Tools can be any of the SDK’s built-in tools (Read, Write, Bash, etc.) or tools provided by MCP servers. To use custom tools, configure MCP servers when creating the client:
import { createAgentMarkClient , ClaudeAgentModelRegistry } from "@agentmark-ai/claude-agent-sdk-adapter" ;
export const client = createAgentMarkClient ({
loader: fileLoader ,
modelRegistry ,
mcp_servers: {
weather: { url: "https://weather-mcp.example.com/sse" },
},
});
client = create_claude_agent_client(
model_registry = model_registry,
mcp_servers = { "weather" : { "url" : "https://weather-mcp.example.com/sse" }},
loader = loader,
)
Then reference tools by name in your prompts:
---
name : task
text_config :
model_name : claude-sonnet-4-20250514
tools :
- weather
---
< System > You are a helpful assistant with access to weather data. </ System >
< User > { props . task } </ User >
Tracing
Enable tracing using the /traced export: import { createAgentMarkClient , ClaudeAgentModelRegistry } from "@agentmark-ai/claude-agent-sdk-adapter/traced" ;
const client = createAgentMarkClient ({
loader: fileLoader ,
modelRegistry ,
});
// All prompt runs are now automatically traced
const prompt = await client . loadTextPrompt ( "task.prompt.mdx" );
const input = await prompt . format ({ props: { task: "..." } });
const result = await runAgent ( input );
The Python adapter integrates with OpenTelemetry for tracing via hooks: from agentmark_claude_agent_sdk import (
create_telemetry_hooks,
TelemetryConfig,
)
telemetry_config = TelemetryConfig(
is_enabled = True ,
prompt_name = "my-task" ,
props = { "task" : "..." },
function_id = "task-handler" ,
)
hooks = create_telemetry_hooks(telemetry_config)
Learn more in the Observability documentation .
Getting Started (Python)
Scaffold a Python project with the Claude Agent SDK adapter:
npm create agentmark@latest my-app
# Select "Python" when prompted for language
# Select "Claude Agent SDK" as the adapter
Run the dev server:
Limitations
No image generation — Use the AI SDK adapter for experimental_generateImage
No speech generation — Use the AI SDK adapter for experimental_generateSpeech
No streaming — Results are returned after the agent completes all turns
Next Steps
Prompts Learn about prompt syntax
Tools & Agents Configure tools for your agents
Observability Monitor your agents in production
Other Integrations Explore other AI frameworks
Have Questions? We’re here to help! Choose the best way to reach us: