Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build AI agents on Cloudflare Workers using the Agents SDK. Load when creating stateful agents, durable workflows, real-time WebSocket apps, scheduled tasks, MCP servers, or chat applications. Covers Agent class, state management, callable RPC, Workflows integration, and React hooks.
.claude/skills/shobcoder-agents-sdk/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -6% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -5% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 2% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 354% | 0% |
STOP. Your knowledge of the Agents SDK may be outdated. Prefer retrieval over pre-training for any Agents SDK task.
Fetch current docs from https://github.com/cloudflare/agents/tree/main/docs before implementing.
| Topic | Doc | Use for | | ------------------- | ----------------------------- | ---------------------------------------------- | | Getting started | docs/getting-started.md | First agent, project setup | | State | docs/state.md | setState, validateStateChange, persistence | | Routing | docs/routing.md | URL patterns, routeAgentRequest, basePath | | Callable methods | docs/callable-methods.md | @callable, RPC, streaming, timeouts | | Scheduling | docs/scheduling.md | schedule(), scheduleEvery(), cron | | Workflows | docs/workflows.md | AgentWorkflow, durable multi-step tasks | | HTTP/WebSockets | docs/http-websockets.md | Lifecycle hooks, hibernation | | Email | docs/email.md | Email routing, secure reply resolver | | MCP client | docs/mcp-client.md | Connecting to MCP servers | | MCP server | docs/mcp-servers.md | Building MCP servers with McpAgent | | Client SDK | docs/client-sdk.md | useAgent, useAgentChat, React hooks | | Human-in-the-loop | docs/human-in-the-loop.md | Approval flows, pausing workflows | | Resumable streaming | docs/resumable-streaming.md | Stream recovery on disconnect |
Cloudflare docs: https://developers.cloudflare.com/agents/
The Agents SDK provides:
@callable() methods invoked over WebSocketscheduleEvery), and cron tasksAgentWorkflowMcpAgentAIChatAgent with resumable streamsuseAgent, useAgentChat for client appsbashnpm ls agents # Should show agents package
If not installed:
bashnpm install agents
jsonc{ "durable_objects": { "bindings": [{ "name": "MyAgent", "class_name": "MyAgent" }], }, "migrations": [{ "tag": "v1", "new_sqlite_classes": ["MyAgent"] }], }
typescriptimport { Agent, routeAgentRequest, callable } from "agents" type State = { count: number } export class Counter extends Agent<Env, State> { initialState = { count: 0 } // Validation hook - runs before state persists (sync, throwing rejects the update) validateStateChange(nextState: State, source: Connection | "server") { if (nextState.count < 0) throw new Error("Count cannot be negative") } // Notification hook - runs after state persists (async, non-blocking) onStateUpdate(state: State, source: Connection | "server") { console.log("State updated:", state) } @callable() increment() { this.setState({ count: this.state.count + 1 }) return this.state.count } } export default { fetch: (req, env) => routeAgentRequest(req, env) ?? new Response("Not found", { status: 404 }), }
Requests route to /agents/{agent-name}/{instance-name}:
| Class | URL | | ---------- | -------------------------- | | Counter | /agents/counter/user-123 | | ChatRoom | /agents/chat-room/lobby |
Client: useAgent({ agent: "Counter", name: "user-123" })
| Task | API | | ------------------- | ------------------------------------------------------ | | Read state | this.state.count | | Write state | this.setState({ count: 1 }) | | SQL query | this.sqlSELECT * FROM users WHERE id = ${id} | | Schedule (delay) | await this.schedule(60, "task", payload) | | Schedule (cron) | await this.schedule("0 * * * *", "task", payload) | | Schedule (interval) | await this.scheduleEvery(30, "poll") | | RPC method | @callable() myMethod() { ... } | | Streaming RPC | @callable({ streaming: true }) stream(res) { ... } | | Start workflow | await this.runWorkflow("ProcessingWorkflow", params) |
tsximport { useAgent } from "agents/react" function App() { const [state, setLocalState] = useState({ count: 0 }) const agent = useAgent({ agent: "Counter", name: "my-instance", onStateUpdate: (newState) => setLocalState(newState), onIdentity: (name, agentType) => console.log(`Connected to ${name}`), }) return <button onClick={() => agent.setState({ count: state.count + 1 })}>Count: {state.count}</button> }
Other measured skills in the registry, with their headline benchmark lift.