A session in ACP represents an independent conversation context between a client and an agent. Each session maintains:
Conversation history (messages, tool calls, results)
Current working directory
Connected MCP servers
Session-specific configuration
Current mode and model settings
typedef SessionId = String;class SessionState { final String sessionId; final String cwd; final List<McpServerBase> mcpServers; final List<Message> history; final String currentMode; final String currentModel; // ...}
class NewSessionResponse { final String sessionId; final SessionModeState? modes; final SessionModelState? models; final List<SessionConfigOption>? configOptions;}
Once created, clients send prompts to the session:
final result = await connection.prompt( PromptRequest( sessionId: session.sessionId, prompt: [ TextContentBlock(text: 'Refactor this function'), ResourceContentBlock( resource: EmbeddedResource( resource: TextResourceContents( uri: 'file:///src/main.dart', text: fileContents, ), ), ), ], ),);
The agent processes the prompt and streams updates back:
// In your Client implementation@overrideFuture<void> sessionUpdate(SessionNotification params) async { if (params.sessionId == currentSessionId) { // Handle update for this session handleUpdate(params.update); }}
class SessionModeState { final List<SessionMode> availableModes; final String currentModeId;}class SessionMode { final String id; // e.g., "code", "ask", "architect" final String name; // Display name final String? description; // User-facing description}
Use modes to adjust system prompts, available tools, and permission policies. For example, “ask” mode might be read-only, while “code” mode allows file modifications.
class SessionModelState { final List<ModelInfo> availableModels; final String currentModelId;}class ModelInfo { final String modelId; // e.g., "gpt-4", "claude-3-opus" final String name; // Display name final String? description; // User-facing description}
class SessionConfigOption { final String id; // Unique identifier final String name; // Display name final String? description; // Help text final String? category; // Grouping category final String type; // Currently only "select" final String currentValue; // Current selected value final SessionConfigSelectOptions options; // Available options}
Agents receive MCP servers in newSession and loadSession requests:
@overrideFuture<NewSessionResponse> newSession(NewSessionRequest params) async { // Connect to each MCP server for (final server in params.mcpServers) { if (server is StdioMcpServer) { await connectStdioServer(server); } else if (server is HttpMcpServer) { await connectHttpServer(server); } else if (server is SseMcpServer) { await connectSseServer(server); } } // Return session info return NewSessionResponse(sessionId: generateId());}
Advertise which MCP transport types you support via AgentCapabilities.mcpCapabilities during initialization.
abstract class SessionUpdate {}// Message chunksclass UserMessageChunkSessionUpdate extends SessionUpdate { final ContentBlock content;}class AgentMessageChunkSessionUpdate extends SessionUpdate { final ContentBlock content;}class AgentThoughtChunkSessionUpdate extends SessionUpdate { final ContentBlock content;}// Tool callsclass ToolCallSessionUpdate extends SessionUpdate { final String toolCallId; final String title; final ToolKind? kind; final ToolCallStatus? status; final List<ToolCallLocation>? locations; final Map<String, dynamic>? rawInput; final Map<String, dynamic>? rawOutput; final List<ToolCallContent>? content;}class ToolCallUpdateSessionUpdate extends SessionUpdate { final String toolCallId; final String? title; final ToolCallStatus? status; final List<ToolCallContent>? content; // ...}// Execution planclass PlanSessionUpdate extends SessionUpdate { final List<PlanEntry> entries;}// State changesclass CurrentModeUpdateSessionUpdate extends SessionUpdate { final String currentModeId;}class AvailableCommandsUpdateSessionUpdate extends SessionUpdate { final List<AvailableCommand> availableCommands;}class ConfigOptionUpdate extends SessionUpdate { final List<SessionConfigOption> configOptions;}class SessionInfoUpdate extends SessionUpdate { final String? title; final String? updatedAt;}class UsageUpdate extends SessionUpdate { final int used; final int size; final Cost? cost;}