npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@shipany/open-agent-sdk

v0.1.7

Published

Open-source Agent SDK inspired by @anthropic-ai/claude-agent-sdk. Runs the agent loop in-process — no local CLI required. Deploy anywhere: cloud, serverless, Docker, CI/CD.

Readme

Open Agent SDK

npm Node.js License

Open Agent SDK is an open-source Agent SDK inspired by @anthropic-ai/claude-agent-sdk. Build autonomous AI agents that can understand codebases, edit files, run commands, search the web, and execute complex multi-step workflows.

Unlike the official @anthropic-ai/claude-agent-sdk which requires a local Claude Code CLI process, Open Agent SDK runs the full agent loop in-process — deploy anywhere: cloud servers, serverless functions, Docker containers, CI/CD pipelines.

Get started

npm install @shipany/open-agent-sdk

Set your API key:

export ANTHROPIC_API_KEY=your-api-key

Or use a third-party provider like OpenRouter:

export ANTHROPIC_BASE_URL=https://openrouter.ai/api
export ANTHROPIC_API_KEY=your-openrouter-api-key
export ANTHROPIC_MODEL=anthropic/claude-sonnet-4-6

Quick start

One-shot query (compatible with official SDK)

import { query } from '@shipany/open-agent-sdk'

for await (const message of query({
  prompt: 'Find and fix the bug in auth.py',
  options: {
    allowedTools: ['Read', 'Edit', 'Bash'],
    permissionMode: 'acceptEdits',
  },
})) {
  if (message.type === 'assistant' && message.message?.content) {
    for (const block of message.message.content) {
      if ('text' in block) console.log(block.text)
      else if ('name' in block) console.log(`Tool: ${block.name}`)
    }
  } else if (message.type === 'result') {
    console.log(`Done: ${message.subtype}`)
  }
}

Simple prompt (blocking)

import { createAgent } from '@shipany/open-agent-sdk'

const agent = createAgent({ model: 'claude-sonnet-4-6' })
const result = await agent.prompt('Read package.json and tell me the project name')

console.log(result.text)
console.log(`Tokens: ${result.usage.input_tokens + result.usage.output_tokens}`)

Multi-turn session

import { createAgent } from '@shipany/open-agent-sdk'

const agent = createAgent({
  model: 'claude-sonnet-4-6',
  systemPrompt: 'You are a senior software engineer. Be concise.',
})

const r1 = await agent.prompt('Read the main entry point and explain the architecture')
console.log(r1.text)

// Full context from turn 1 is preserved
const r2 = await agent.prompt('Now refactor the error handling')
console.log(r2.text)

Custom tools

import { createAgent, getAllBaseTools } from '@shipany/open-agent-sdk'

const weatherTool = {
  name: 'GetWeather',
  description: 'Get weather for a city',
  inputJSONSchema: {
    type: 'object',
    properties: { city: { type: 'string' } },
    required: ['city'],
  },
  get inputSchema() { return { safeParse: (v) => ({ success: true, data: v }) } },
  async prompt() { return this.description },
  async call(input) { return { data: `Weather in ${input.city}: 22°C, sunny` } },
  userFacingName: () => 'GetWeather',
  isReadOnly: () => true,
  isConcurrencySafe: () => true,
  mapToolResultToToolResultBlockParam: (data, id) => ({
    type: 'tool_result', tool_use_id: id, content: data,
  }),
}

const agent = createAgent({
  tools: [...getAllBaseTools(), weatherTool],
})

const result = await agent.prompt('What is the weather in Tokyo?')

MCP server integration

import { createAgent } from '@shipany/open-agent-sdk'

const agent = createAgent({
  mcpServers: {
    filesystem: {
      command: 'npx',
      args: ['-y', '@modelcontextprotocol/server-filesystem', '/tmp'],
    },
    playwright: {
      command: 'npx',
      args: ['@playwright/mcp@latest'],
    },
  },
})

const result = await agent.prompt('List files in /tmp')

Subagents

import { query } from '@shipany/open-agent-sdk'

for await (const message of query({
  prompt: 'Use the code-reviewer agent to review this codebase',
  options: {
    allowedTools: ['Read', 'Glob', 'Grep', 'Agent'],
    agents: {
      'code-reviewer': {
        description: 'Expert code reviewer for quality and security.',
        prompt: 'Analyze code quality and suggest improvements.',
        tools: ['Read', 'Glob', 'Grep'],
      },
    },
  },
})) {
  // handle messages...
}

Permissions

import { query } from '@shipany/open-agent-sdk'

// Read-only agent: can only analyze, not modify
for await (const message of query({
  prompt: 'Review this code for best practices',
  options: {
    allowedTools: ['Read', 'Glob', 'Grep'],
  },
})) {
  // ...
}

API reference

query({ prompt, options })

Top-level entry point, compatible with @anthropic-ai/claude-agent-sdk. Returns an AsyncGenerator<SDKMessage>.

createAgent(options)

Create a reusable agent with persistent session state.

  • agent.query(prompt) — streaming response (AsyncGenerator)
  • agent.prompt(prompt) — blocking response (Promise<QueryResult>)
  • agent.getMessages() — conversation history
  • agent.clear() — reset session

Options

| Option | Type | Default | Description | |--------|------|---------|-------------| | model | string | claude-sonnet-4-6 | Claude model ID | | apiKey | string | env.ANTHROPIC_API_KEY | API key | | baseURL | string | Anthropic API | API base URL (for third-party providers) | | cwd | string | process.cwd() | Working directory for tools | | systemPrompt | string | — | Custom system prompt | | tools | Tool[] | All built-in | Available tools | | allowedTools | string[] | — | Tool whitelist (e.g. ['Read', 'Glob']) | | permissionMode | string | bypassPermissions | acceptEdits / bypassPermissions / plan / default | | maxTurns | number | 100 | Max agentic turns | | maxBudgetUsd | number | — | Max USD spend | | mcpServers | object | — | MCP server configurations | | agents | object | — | Custom subagent definitions | | hooks | object | — | Lifecycle hooks (PreToolUse, PostToolUse, Stop, etc.) | | thinking | object | — | Extended thinking configuration | | env | object | — | Environment variables (compatible with official SDK) | | resume | string | — | Resume a previous session by ID | | canUseTool | function | — | Custom permission callback | | includePartialMessages | boolean | false | Include raw streaming events |

Environment variables

| Variable | Description | |----------|-------------| | ANTHROPIC_API_KEY | API key | | ANTHROPIC_BASE_URL | API base URL (for third-party providers like OpenRouter) | | ANTHROPIC_MODEL | Default model |

Also supports options.env for passing environment variables programmatically, same as the official SDK.

Built-in tools

| Tool | Description | |------|-------------| | Read | Read files with line numbers, images, PDFs | | Write | Create or overwrite files | | Edit | Precise string replacement in files | | Bash | Execute shell commands | | Glob | Find files by pattern | | Grep | Search file contents with regex (ripgrep) | | WebFetch | Fetch and parse web content | | WebSearch | Search the web | | Agent | Spawn subagents for parallel work | | NotebookEdit | Edit Jupyter notebooks | | Skill | Invoke custom skills | | AskUserQuestion | Ask the user clarifying questions | | TodoWrite | Create/manage todo lists | | ToolSearch | Search available tools | | SendMessage | Send messages to agents/teammates | | TeamCreate / TeamDelete | Create/delete agent teams | | EnterPlanMode / ExitPlanMode | Plan approval mode | | EnterWorktree / ExitWorktree | Git worktree isolation | | ListMcpResources / ReadMcpResource | MCP resource access | | TaskCreate / TaskUpdate / TaskList / TaskGet / TaskStop / TaskOutput | Task management |

Architecture

The official @anthropic-ai/claude-agent-sdk architecture:

Your code → SDK → spawn cli.js subprocess → stdin/stdout JSON → Anthropic API

Open Agent SDK runs everything in-process:

Your code → SDK → QueryEngine → Anthropic API (direct)

What's under the hood

This SDK contains the complete Claude Code engine (2,000+ source files), not a simplified reimplementation:

| Component | Description | |-----------|-------------| | System Prompt | Full prompt construction with static/dynamic boundary caching | | Permission System | 4-layer pipeline: rules → low-risk skip → whitelist → AI classifier + circuit breaker | | Memory System | Auto-memory with 4 types (user/feedback/project/reference), autoDream background organizer | | Context Compression | 9-segment structured extraction (autocompact, microcompact, snip compact) | | Multi-Agent | Leader/Teammate teams, Git worktree isolation, permission bubbling, async mailbox | | MCP Client | Full MCP support: stdio, SSE, HTTP transports | | Search | ripgrep + glob (same as Claude Code — no vector DB needed) | | Tool Execution | Concurrent batching for read-only tools, serial for mutations | | API Client | Streaming, retry with exponential backoff, fallback models, prompt caching |

Comparison with @anthropic-ai/claude-agent-sdk

| | Official SDK | Open Agent SDK | |---|---|---| | Architecture | Spawns local CLI subprocess | In-process agent loop | | Cloud deployment | Requires CLI installed | Works anywhere | | Serverless | Not supported | Fully supported | | Docker | Needs CLI in image | Just npm install | | API surface | query(), tool(), sessions | query(), createAgent(), sessions | | Built-in tools | 26 tools | 26 tools (same set) | | System prompt | Full engine | Full engine (same code) | | Permission system | 4-layer + AI classifier | 4-layer + AI classifier (same code) | | Memory system | Auto-memory + autoDream | Auto-memory + autoDream (same code) | | Context compression | 9-segment structured | 9-segment structured (same code) | | Multi-agent | Teams, worktrees | Teams, worktrees (same code) | | MCP support | Full | Full (same code) | | Custom tools | Via MCP | Native function tools + MCP | | Streaming | Via subprocess stdio | Direct API streaming |

Examples

See the examples/ directory:

| # | Example | What it demonstrates | |---|---------|---------------------| | 01 | Simple Query | Streaming with createAgent().query() | | 02 | Multi-Tool | Glob + Bash orchestration | | 03 | Multi-Turn | Session persistence across turns | | 04 | Prompt API | Blocking agent.prompt() | | 05 | System Prompt | Custom system prompt | | 06 | MCP Server | MCP stdio transport | | 07 | Custom Tools | User-defined tools | | 08 | Official API | query() drop-in compatible | | 09 | Subagents | Agent delegation | | 10 | Permissions | Read-only agent |

Run any example:

npx tsx examples/01-simple-query.ts

Reporting bugs

File issues at github.com/shipany-ai/open-agent-sdk/issues.

Contributors

Star History

Star History Chart

License

MIT