TypeScript SDK
Complete API reference for the Amp TypeScript SDK. This document provides detailed information about all functions, types, and interfaces.
Installation
# Install the Amp SDK using npm
npm install @ampcode/sdk
# or yarn
yarn add @ampcode/sdk
# Optional: manually install the Amp CLI, already a dependency
npx -y @ampcode/sdk install If you need to use Amp before Amp Neo, install the legacy SDK release @ampcode/sdk@0.1.0-20260528044221-ge0e19fa:
npm install @ampcode/sdk@0.1.0-20260528044221-ge0e19fa Functions
execute()
The main function for executing Amp CLI commands programmatically.
function execute(options: ExecuteOptions): AsyncIterable<StreamMessage> Parameters
options(ExecuteOptions) - Configuration for the execution
Returns
AsyncIterable<StreamMessage>- Stream of messages from the Amp CLI
Example
import { execute } from '@ampcode/sdk'
for await (const message of execute({
prompt: 'Analyze this codebase',
options: {
cwd: './my-project',
},
})) {
if (message.type === 'assistant') {
console.log('Assistant:', message.message.content)
} else if (message.type === 'result' && !message.is_error) {
console.log('Final result:', message.result)
break
}
} createUserMessage()
Helper function to create properly formatted user input messages for streaming conversations.
function createUserMessage(text: string, options?: { requestId?: string }): UserInputMessage Parameters
text(string) - The text content for the user messageoptions.requestId(string, optional) - A 1–256 character ID. Reusing it for a retry on the same thread prevents Amp from creating another user message.
Returns
UserInputMessage- A formatted user input message
Example
import { createUserMessage } from '@ampcode/sdk'
const message = createUserMessage('Analyze this code', { requestId: 'analysis-123' })
console.log(message)
// Output: { type: 'user', requestId: 'analysis-123', message: { role: 'user', content: [{ type: 'text', text: 'Analyze this code' }] } } createPermission()
Helper function to create permissions plugin rule objects for controlling tool usage.
function createPermission(
tool: string,
action: 'allow' | 'reject' | 'ask' | 'delegate',
options?: {
matches?: Record<string, PermissionMatchCondition>
context?: 'thread' | 'subagent'
to?: string
},
): Permission Parameters
tool(string) - The name of the tool to which this permission applies (supports glob patterns)action('allow' | 'reject' | 'ask' | 'delegate') - How Amp should proceed when matchedoptions(object, optional) - Additional configuration for the permissionmatches(Record<string, PermissionMatchCondition>) - Match conditions for tool argumentscontext('thread' | 'subagent') - Only apply this rule in specific contextto(string) - Command to delegate to (required when action is'delegate')
Returns
Permission- A permission object that can be used in the permissions array
Examples
import { createPermission } from '@ampcode/sdk'
// Allow all Bash commands
createPermission('Bash', 'allow')
// Allow specific git commands
createPermission('Bash', 'allow', {
matches: { cmd: 'git *' },
})
// Ask for approval on Read operations for sensitive paths
createPermission('Read', 'ask', {
matches: { path: '/etc/*' },
})
// Delegate web browsing to a custom command
createPermission('mcp__playwright__*', 'delegate', {
to: 'node browse.js',
})
// Only apply in subagent context
createPermission('Bash', 'reject', {
context: 'subagent',
}) threads.new()
Create a new empty thread and return its ID.
async function threads.new(options?: ThreadsNewOptions): Promise<string> Parameters
options(ThreadsNewOptions, optional) - Configuration for the new thread
Returns
Promise<string>- The thread ID
Example
import { threads } from '@ampcode/sdk'
// Create a new private thread
const threadId = await threads.new({ visibility: 'private' })
console.log('Created thread:', threadId) threads.markdown()
Get a thread rendered as markdown.
async function threads.markdown(options: ThreadsMarkdownOptions): Promise<string> Parameters
options(ThreadsMarkdownOptions) - Options containing the thread ID
Returns
Promise<string>- The thread content as markdown
Example
import { threads } from '@ampcode/sdk'
// Get thread content as markdown
const markdown = await threads.markdown({ threadId: 'T-abc123-def456' })
console.log(markdown) threads.setMultiplayer()
Open or close a thread for contributions (multiplayer). Only works on orb threads with shared (non-private) visibility, and only for the thread owner.
async function threads.setMultiplayer(options: ThreadsSetMultiplayerOptions): Promise<void> Parameters
options(ThreadsSetMultiplayerOptions) - The thread ID, enabled flag, and optional open-window duration
Returns
Promise<void>
Example
import { threads } from '@ampcode/sdk'
// Open a thread for contributions for the default duration (currently 1 week)
await threads.setMultiplayer({ threadId: 'T-abc123-def456' })
// Open a thread for contributions for 12 hours
await threads.setMultiplayer({ threadId: 'T-abc123-def456', hours: 12 })
// Close a thread for contributions
await threads.setMultiplayer({ threadId: 'T-abc123-def456', enabled: false }) Types
ExecuteOptions
Configuration options for the execute() function.
interface ExecuteOptions {
prompt: string | AsyncIterable<UserInputMessage>
options?: AmpOptions
signal?: AbortSignal
} Properties
| Property | Type | Required | Description |
|---|---|---|---|
prompt | string \| AsyncIterable<UserInputMessage> | Yes | The input prompt as a string or async iterable of user messages for multi-turn conversations |
options | AmpOptions | No | CLI configuration options |
signal | AbortSignal | No | Signal for cancellation support |
AmpOptions
Configuration options that map to Amp CLI flags.
interface AmpOptions {
cwd?: string
mode?: string // Prefer 'low', 'medium', 'high', or 'ultra'
effort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max'
dangerouslyAllowAll?: boolean
noArchiveAfterExecute?: boolean
visibility?: 'private' | 'unlisted' | 'workspace' | 'group'
settingsFile?: string
logLevel?: 'debug' | 'info' | 'warn' | 'error' | 'audit'
logFile?: string
mcpConfig?: string | MCPConfig
env?: Record<string, string>
continue?: boolean | string
skills?: string
enabledTools?: string[]
permissions?: Permission[]
labels?: string[]
thinking?: boolean
executor?: 'local' | 'orb'
project?: string
title?: string
} The built-in modes are 'low', 'medium', 'high', and 'ultra'. You can also pass a
string for a custom plugin-defined mode.
executor defaults to local execution. With executor: 'orb', prompt must be a string rather
than streaming input. project requires orb execution; when it is omitted, Amp may infer a project
from the Git remotes under cwd, or start the orb without a repository if none match. The orb
executor ignores local-only options (permissions, enabledTools, skills, mcpConfig, and dangerouslyAllowAll) with a warning; configure those in the Amp project instead.
Properties
| Property | Type | Default | Description |
|---|---|---|---|
cwd | string | process.cwd() | Current working directory for execution |
mode | string | 'medium' | Prefer 'low', 'medium', 'high', or 'ultra'; custom plugin-defined mode strings are also accepted |
effort | 'none' \| 'minimal' \| 'low' \| 'medium' \| 'high' \| 'xhigh' \| 'max' | - | Reasoning effort for supported modes |
dangerouslyAllowAll | boolean | undefined | Allow all tool usage without permission prompts. When permissions is provided and this is unset, the SDK forces it to false so permissions take effect. |
noArchiveAfterExecute | boolean | false | Leave new execute threads unarchived after execution completes |
visibility | 'private' \| 'unlisted' \| 'workspace' \| 'group' | 'workspace' | Thread visibility level |
settingsFile | string | - | Path to custom settings file |
logLevel | 'debug' \| 'info' \| 'warn' \| 'error' \| 'audit' | undefined | Logging verbosity level |
logFile | string | - | Path to write logs |
continue | boolean \| string | false | Continue most recent thread (true) or specific thread by ID (string) |
mcpConfig | string \| MCPConfig | - | MCP server configuration as JSON string, or config object |
env | Record<string, string> | - | Additional environment variables |
skills | string | - | Folder path with custom skills |
enabledTools | string[] | - | Tool name patterns to enable (maps to amp.tools.enable) |
permissions | Permission[] | - | Permissions plugin rules for tool usage |
labels | string[] | - | Labels to add to the thread |
thinking | boolean | false | Include thinking blocks in the result stream |
executor | 'local' \| 'orb' | 'local' | Run in the local CLI process or a remote orb |
project | string | Inferred | Amp project for a new orb thread; requires executor: 'orb' |
title | string | - | Title for a new thread, up to 256 characters |
Message Types
The SDK streams various message types during execution. All messages implement the base StreamMessage type.
SystemMessage
Initial message containing session information and available tools.
interface SystemMessage {
type: 'system'
subtype: 'init'
session_id: string
cwd: string
tools: string[]
mcp_servers: Array<{
name: string
status:
| 'awaiting-approval'
| 'authenticating'
| 'connecting'
| 'reconnecting'
| 'connected'
| 'denied'
| 'failed'
| 'blocked-by-registry'
}>
} Properties
| Property | Type | Description |
|---|---|---|
session_id | string | Unique identifier for this execution session |
cwd | string | Current working directory |
tools | string[] | List of available tool names |
mcp_servers | Array<{name: string, status: string}> | Status of MCP servers |
AssistantMessage
AI assistant responses with text content and tool usage.
interface AssistantMessage {
type: 'assistant'
session_id: string
message: {
id: string
type: 'message'
role: 'assistant'
model: string
content: Array<TextContent | ToolUseContent>
stop_reason: 'end_turn' | 'tool_use' | 'max_tokens' | null
stop_sequence: string | null
usage?: Usage
}
parent_tool_use_id: string | null
} Properties
| Property | Type | Description |
|---|---|---|
session_id | string | Unique identifier for this execution session |
message | object | The assistant’s message content |
parent_tool_use_id | string \| null | ID of parent tool use if this is a tool response |
UserMessage
User input and tool results.
interface UserMessage {
type: 'user'
session_id: string
message: {
role: 'user'
content: Array<TextContent | ToolResultContent>
}
parent_tool_use_id: string | null
} Properties
| Property | Type | Description |
|---|---|---|
session_id | string | Unique identifier for this execution session |
message | object | The user’s message content |
parent_tool_use_id | string \| null | ID of parent tool use if this is a tool response |
ResultMessage
Final successful execution result.
interface ResultMessage {
type: 'result'
subtype: 'success'
session_id: string
is_error: false
result: string
duration_ms: number
num_turns: number
usage?: Usage
permission_denials?: string[]
} Properties
| Property | Type | Description |
|---|---|---|
session_id | string | Unique identifier for this execution session |
result | string | The final result from the assistant |
duration_ms | number | Total execution time in milliseconds |
num_turns | number | Number of conversation turns |
usage | Usage | Token usage information |
permission_denials | string[] | List of permissions that were denied |
ErrorResultMessage
Final error result indicating execution failure.
interface ErrorResultMessage {
type: 'result'
subtype: 'error_during_execution' | 'error_max_turns'
session_id: string
is_error: true
error: string
duration_ms: number
num_turns: number
usage?: Usage
permission_denials?: string[]
} Properties
| Property | Type | Description |
|---|---|---|
session_id | string | Unique identifier for this execution session |
error | string | Error message describing what went wrong |
duration_ms | number | Total execution time in milliseconds |
num_turns | number | Number of conversation turns |
usage | Usage | Token usage information |
permission_denials | string[] | List of permissions that were denied |
TextContent
Plain text content block.
interface TextContent {
type: 'text'
text: string
} ToolUseContent
Tool execution request.
interface ToolUseContent {
type: 'tool_use'
id: string
name: string
input: Record<string, unknown>
} ToolResultContent
Result from tool execution.
interface ToolResultContent {
type: 'tool_result'
tool_use_id: string
content: string
is_error: boolean
} Usage
Token usage and billing information from API calls.
interface Usage {
input_tokens: number
cache_creation_input_tokens?: number
cache_read_input_tokens?: number
output_tokens: number
service_tier?: string
} Properties
| Property | Type | Description |
|---|---|---|
input_tokens | number | Number of input tokens used |
cache_creation_input_tokens | number | Tokens used for cache creation |
cache_read_input_tokens | number | Tokens read from cache |
output_tokens | number | Number of output tokens generated |
service_tier | string | Service tier used for this request |
Input Types
UserInputMessage
Formatted user input message for streaming conversations.
interface UserInputMessage {
type: 'user'
requestId?: string
message: {
role: 'user'
content: Array<{
type: 'text'
text: string
}>
}
} MCPConfig
Configuration for MCP (Model Context Protocol) servers. Supports both stdio-based and HTTP-based servers.
type MCPConfig = Record<string, MCPServer>
// MCPServer is a union of stdio and HTTP server configurations MCPServer accepts either a stdio server config (with command) or an HTTP server config (with url):
const mcpConfig: MCPConfig = {
playwright: { command: 'npx', args: ['-y', '@playwright/mcp'] },
remote: { url: 'https://api.example.com/mcp' },
} Stdio server properties:
| Property | Type | Required | Description |
|---|---|---|---|
command | string | Yes | Command to start the MCP server |
args | string[] | No | Command line arguments |
env | Record<string, string> | No | Environment variables for the server |
disabled | boolean | No | Whether this server is disabled |
HTTP server properties:
| Property | Type | Required | Description |
|---|---|---|---|
url | string | Yes | URL of the HTTP MCP server |
headers | Record<string, string> | No | HTTP headers to send with requests |
transport | string | No | Transport type (e.g., “sse”) |
oauth | object | No | OAuth configuration for authentication |
disabled | boolean | No | Whether this server is disabled |
ThreadsNewOptions
Options for creating a new thread.
interface ThreadsNewOptions {
visibility?: 'private' | 'unlisted' | 'workspace' | 'group'
} Properties
| Property | Type | Required | Description |
|---|---|---|---|
visibility | 'private' \| 'unlisted' \| 'workspace' \| 'group' | No | Thread visibility |
ThreadsMarkdownOptions
Options for getting thread markdown.
interface ThreadsMarkdownOptions {
threadId: string
} Properties
| Property | Type | Required | Description |
|---|---|---|---|
threadId | string | Yes | The thread ID to get markdown for |
ThreadsSetMultiplayerOptions
Options for opening or closing a thread for contributions (multiplayer). The duration options are summed; the total must be between 5 minutes and 7 days. When enabled is true and no duration is given, the server default (currently 1 week) is used. Duration options are not allowed when enabled is false.
interface ThreadsSetMultiplayerOptions {
threadId: string
enabled?: boolean
minutes?: number
hours?: number
days?: number
weeks?: number
} Properties
| Property | Type | Required | Description |
|---|---|---|---|
threadId | string | Yes | The thread ID to update |
enabled | boolean | No | Whether the thread is open for contributions (default true) |
minutes | number | No | Open-window duration in minutes |
hours | number | No | Open-window duration in hours |
days | number | No | Open-window duration in days |
weeks | number | No | Open-window duration in weeks |
Permission
Individual permissions plugin rule for controlling tool usage.
interface Permission {
tool: string
matches?: Record<string, PermissionMatchCondition>
action: 'allow' | 'reject' | 'ask' | 'delegate'
context?: 'thread' | 'subagent'
to?: string
} Properties
| Property | Type | Required | Description |
|---|---|---|---|
tool | string | Yes | Tool name (supports glob patterns like Bash or mcp__*) |
matches | Record<string, PermissionMatchCondition> | No | Match conditions for tool arguments |
action | 'allow' \| 'reject' \| 'ask' \| 'delegate' | Yes | How Amp should proceed when the rule matches |
context | 'thread' \| 'subagent' | No | Apply rule only in main thread or sub-agents |
to | string | No | Command to delegate to (required when action is delegate) |
Example
import { execute, createPermission } from '@ampcode/sdk'
for await (const message of execute({
prompt: 'Deploy the application',
options: {
permissions: [
// Allow git commands
createPermission('Bash', 'allow', { matches: { cmd: 'git *' } }),
// Allow reading files
createPermission('Read', 'allow'),
],
},
})) {
// Handle messages
} PermissionMatchCondition
Match condition for tool arguments. Supports strings (with glob patterns or regex), arrays (OR logic), booleans, numbers, null, undefined, and nested objects.
type PermissionMatchCondition =
| string
| PermissionMatchCondition[]
| { [key: string]: PermissionMatchCondition }
| boolean
| number
| null
| undefined Examples
// String pattern with wildcard
{
cmd: 'npm *'
}
// Array for OR logic
{
cmd: ['npm install', 'npm test', 'npm run build']
}
// Regex pattern
{
cmd: '/^git (status|log|diff)$/'
}
// Nested object matching
{
env: {
NODE_ENV: 'production'
}
} Requirements
- Node.js 18 or higher