Skip to content

Goose - 深度技术调研

项目概览

调研日期: 2026-02-27
仓库: https://github.com/block/goose
许可证: Apache-2.0
版本: v1.0.0
Stars: 31.4K | Forks: 1.8k | Contributors: 156


目录

  1. 项目概述
  2. MCP-Native 架构深度分析
  3. 核心组件实现
  4. 与竞品对比
  5. 评估与建议

1. 项目概述

1.1 定位与背景

Goose 是 Block (前 Square) 开源的 AI Agent 框架,核心创新在于 MCP-Native 架构

核心定位: - 🔥 MCP-Native: 从第一天就基于 Model Context Protocol 构建 - 🔥 Enterprise-Ready: 企业级安全与可扩展性 - 🔥 Extensible: 通过 MCP 服务器无限扩展能力 - 🔥 Rust Core: 高性能 Rust 实现核心逻辑

关键数据: - 31.4K GitHub Stars(2026年2月) - Block 公司生产环境验证 - 支持 100+ MCP 服务器生态

1.2 架构哲学

Goose 设计哲学
├─ MCP First: 所有工具都是 MCP 服务器
├─ Composability: 通过组合 MCP 服务器构建能力
├─ Enterprise Security: 企业级安全模型
└─ Rust Performance: 高性能底层实现

2. MCP-Native 架构深度分析

2.1 什么是 MCP-Native?

传统 Agent 架构:

Agent Core ──→ 内置工具(硬编码)
        └──→ 外部 API(SDK 封装)

Goose MCP-Native 架构:

Agent Core ──→ MCP Client ──→ MCP Server A (文件系统)
                          ──→ MCP Server B (数据库)
                          ──→ MCP Server C (自定义工具)
                          ──→ ...任意 MCP 服务器

关键区别: - 工具不是代码,而是独立的 MCP 服务器进程 - 通过 STDIO 或 SSE 通信 - 动态发现、热插拔

2.2 架构分层

Goose 架构分层
┌─────────────────────────────────────────┐
│  CLI / GUI / Gateway Interface         │  ← 用户界面层
├─────────────────────────────────────────┤
│  Session Manager (SQLite-backed)       │  ← 会话管理层
│  ├── User Session                      │
│  ├── Scheduled Session                 │
│  ├── SubAgent Session                  │
│  └── Terminal Session                  │
├─────────────────────────────────────────┤
│  Agent Loop (crates/goose/src/agents)  │  ← 核心循环层
│  ├── reply_internal()                  │
│  ├── MOIM Injection                    │
│  ├── Context Compaction                │
│  └── Tool Pair Summarization           │
├─────────────────────────────────────────┤
│  Extension Manager                     │  ← 扩展管理层
│  ├── MCP Client (Trait-based)          │
│  ├── Tool Discovery                    │
│  └── Tool Dispatch                     │
├─────────────────────────────────────────┤
│  Provider Layer                        │  ← Provider 层
│  ├── OpenAI / Anthropic                │
│  ├── Google / Ollama                   │
│  └── Custom Providers                  │
├─────────────────────────────────────────┤
│  MCP Protocol Layer                    │  ← MCP 协议层
│  ├── Transport (STDIO/SSE)             │
│  └── Capability Negotiation            │
├─────────────────────────────────────────┤
│  MCP Servers (External Processes)      │  ← 工具层
│  ├── Built-in Extensions               │
│  ├── Stdio Servers                     │
│  ├── HTTP Servers                      │
│  └── Frontend Extensions               │
└─────────────────────────────────────────┘

3. 核心组件实现

3.1 目录结构

goose/
├── crates/
│   ├── goose/                   # Rust 核心库 ★★★
│   │   ├── src/
│   │   │   ├── agents/          # Agent 核心实现 ★★★★★
│   │   │   │   ├── agent.rs     # Agent 循环,reply_internal() (700+ lines)
│   │   │   │   ├── extension_manager.rs  # Extension 管理
│   │   │   │   ├── mcp_client.rs         # MCP Client trait
│   │   │   │   └── moim.rs               # MOIM 注入
│   │   │   ├── session/         # 会话管理
│   │   │   │   ├── session_manager.rs    # Session 定义
│   │   │   │   └── storage.rs            # 持久化存储
│   │   │   ├── providers/       # LLM Provider 抽象 ★★★★
│   │   │   │   ├── base.rs               # Provider trait
│   │   │   │   ├── openai.rs
│   │   │   │   ├── anthropic.rs
│   │   │   │   └── ollama.rs
│   │   │   ├── tool_inspection/ # 工具安全检查 ★★★
│   │   │   └── context_mgmt/    # 上下文管理
│   │   └── Cargo.toml
│   │
│   ├── goose-cli/               # CLI 实现 ★★
│   ├── goose-server/            # 服务器模式
│   └── mcp-core/                # MCP 核心协议实现
├── ui/                          # React 前端
├── documentation/               # 文档
└── extensions/                  # 内置 MCP 服务器

3.2 MCP Client 实现 (crates/goose/src/agents/mcp_client.rs)

核心职责: 定义 MCP 客户端 trait,管理 MCP 服务器通信

#[async_trait::async_trait]
pub trait McpClientTrait: Send + Sync {
    async fn list_tools(
        &self, 
        session_id: &str, 
        cursor: Option<String>,
        cancellation_token: CancellationToken
    ) -> Result<ListToolsResult, Error>;

    async fn call_tool(
        &self, 
        session_id: &str, 
        name: &str, 
        arguments: Value,
        cancellation_token: CancellationToken
    ) -> Result<CallToolResult, Error>;

    async fn read_resource(
        &self, 
        session_id: &str, 
        uri: &str, 
        cancellation_token: CancellationToken
    ) -> Result<ReadResourceResult, Error>;

    async fn subscribe(&self) -> mpsc::Receiver<ServerNotification>;
}

关键设计: - Trait-Based: 通过 trait 抽象 MCP 客户端行为,支持多种实现 - Session-Aware: 所有操作都需要 session_id,支持多会话隔离 - Cancellation Support: 支持取消令牌,实现优雅中断 - 订阅模式: 支持服务器通知订阅,实现异步消息推送

3.3 Agent 循环 (crates/goose/src/agents/agent.rs, reply_internal() 方法)

核心方法: reply_internal() (Lines 575-700+)

async fn reply_internal(
    &self,
    conversation: Conversation,
    session_config: SessionConfig,
    session: Session,
    cancel_token: Option<CancellationToken>,
) -> Result<BoxStream<'_>, Result<AgentEvent>>> {
    let context = self.prepare_reply_context(&session.id, conversation, ...).await?;

    Ok(Box::pin(async_stream::try_stream! {
        let mut turns_taken = 0u32;
        let max_turns = session_config.max_turns.unwrap_or(DEFAULT_MAX_TURNS);

        loop {
            if is_token_cancelled(&cancel_token) {
                break;
            }

            // Check for final output
            if let Some(final_output_tool) = self.final_output_tool.lock().await.as_ref() {
                if final_output_tool.final_output.is_some() {
                    yield AgentEvent::Message(Message::assistant().with_text(...));
                    break;
                }
            }

            turns_taken += 1;
            if turns_taken > max_turns {
                yield AgentEvent::Message(Message::assistant().with_text(
                    "I've reached the maximum number of actions..."
                ));
                break;
            }

            // Tool pair summarization for context management
            let tool_pair_summarization_task = crate::context_mgmt::maybe_summarize_tool_pair(...);

            // MOIM injection
            let conversation_with_moim = super::moim::inject_moim(...).await;

            // Stream response from LLM provider
            let mut stream = Self::stream_response_from_provider(...).await?;

            while let Some(next) = stream.next().await {
                match next {
                    // Process messages, tool calls, etc.
                }
            }
        }
    }))
}

关键特性: - 流式响应: 使用 BoxStream 返回异步流,支持实时输出 - 回合限制: max_turns 防止无限循环,默认限制保护 - 取消支持: 通过 CancellationToken 实现优雅中断 - 最终输出检测: 支持 final_output_tool 终止条件 - MOIM 注入: Model-Optimized Intermediate Messages 优化上下文 - 工具对摘要: 自动上下文压缩,管理 token 使用

3.4 Session 管理 (crates/goose/src/session/session_manager.rs)

Session 结构:

pub struct Session {
    pub id: String,
    pub working_dir: PathBuf,
    pub session_type: SessionType,  // User, Scheduled, SubAgent, etc.
    pub extension_data: ExtensionData,
    pub conversation: Option<Conversation>,
    pub provider_name: Option<String>,
    pub model_config: Option<ModelConfig>,
}

pub enum SessionType {
    User,      // Standard user-initiated sessions
    Scheduled, // Sessions triggered by scheduler
    SubAgent,  // Child agent sessions for parallel tasks
    Hidden,    // Internal/system sessions
    Terminal,  // Terminal UI sessions
    Gateway,   // Gateway/API sessions
}

特性: - 多类型会话: 支持用户、调度、子代理等多种会话类型 - 工作目录隔离: 每个会话有独立的工作目录 - 扩展数据: 存储扩展相关的状态数据 - 对话持久化: SQLite-backed 持久化存储 - Provider 配置: 每个会话可配置独立的 LLM Provider

3.5 Extension Manager (crates/goose/src/agents/extension_manager.rs)

核心职责: 管理所有 MCP 扩展的生命周期和工具分发

pub struct ExtensionManager {
    extensions: Mutex<HashMap<String, Extension>>,
    tools_cache: Mutex<Option<Arc<Vec<Tool>>>>,
    tools_cache_version: AtomicU64,
}

impl ExtensionManager {
    pub async fn dispatch_tool_call(
        &self,
        session_id: &str,
        tool_call: CallToolRequestParams,
        working_dir: Option<&std::path::Path>,
        cancellation_token: CancellationToken,
    ) -> Result<ToolCallResult> {
        let resolved = self.resolve_tool(session_id, &tool_name_str).await?;
        let client = resolved.client.clone();

        let fut = async move {
            client.call_tool(&session_id, &actual_tool_name, arguments, ..., cancellation_token).await
        };

        Ok(ToolCallResult {
            result: Box::new(fut.boxed()),
            notification_stream: Some(Box::new(ReceiverStream::new(notifications_receiver))),
        })
    }
}

设计要点: - 工具缓存: 原子版本控制的工具列表缓存 - 工具名前缀: 自动添加 {extension}__{tool_name} 前缀避免冲突 - 异步流返回: 支持通知流,实现工具执行状态实时反馈 - 会话隔离: 工具调用按 session_id 隔离

3.6 工具发现流程

ExtensionManager.get_prefixed_tools(session_id)
fetch_all_tools()
Iterate all MCP clients
client.list_tools(session_id, cursor, token)
Prefix tool names: "{extension}__{tool_name}"

特性: - 动态发现: 运行时从所有连接的服务器获取工具列表 - 分页支持: 支持 cursor 分页,处理大量工具场景 - 取消支持: 发现过程可被取消 - 命名空间隔离: 通过前缀避免工具名冲突

3.7 关键特性总结

特性 实现方式 价值
MCP-Native 所有工具通过 MCP 暴露,非 ad-hoc 函数 标准化、可移植
Extension-Centric 一切都是扩展(built-in、stdio、HTTP、frontend) 统一模型、灵活扩展
Session-Based SQLite-backed 持久化会话 状态管理、恢复能力
Provider-Agnostic 可插拔 LLM Provider OpenAI、Anthropic、Google、Ollama
Security-First 多层工具检查 防止恶意工具执行
MOIM Model-Optimized Intermediate Messages 上下文优化
Context Compaction 自动压缩超阈值上下文 Token 管理、成本控制

4. 与竞品对比

4.1 与 Claude Code 对比

特性 Goose Claude Code
MCP 支持 ⭐⭐⭐⭐⭐ 原生架构 ⭐⭐⭐⭐⭐ SDK MCP
Sub-agents ⭐⭐⭐ 通过 MCP ⭐⭐⭐⭐⭐ 内置
安全模型 ⭐⭐⭐⭐ Docker 可选 ⭐⭐⭐⭐⭐ Seatbelt
企业支持 ⭐⭐⭐⭐⭐ Block 背书 ⭐⭐⭐⭐ Anthropic
IDE 集成 ⭐⭐⭐ 有限 ⭐⭐⭐⭐⭐ 深度

结论: - Goose 优势: MCP-Native、开源、企业级、Rust 性能 - Claude Code 优势: 更成熟的功能集、更深的 IDE 集成

4.2 与 OpenCode 对比

特性 Goose OpenCode
MCP ⭐⭐⭐⭐⭐ 原生 ⭐⭐⭐⭐ Client 支持
架构 ⭐⭐⭐⭐⭐ 模块化 ⭐⭐⭐⭐ 单体
UI ⭐⭐⭐ TUI 简单 ⭐⭐⭐⭐⭐ 丰富
Stars 31.4K 97.5K

结论: OpenCode 更适合终端用户,Goose 更适合构建自定义 Agent 平台。


5. 评估与建议

5.1 适用场景

推荐场景

  1. MCP 生态: 需要使用大量 MCP 服务器
  2. 企业部署: 需要企业级安全和支持
  3. 自定义 Agent: 基于 Goose 构建自己的 Agent 平台
  4. 性能敏感: Rust 核心提供更好性能
  5. 工具多样化: 需要通过 MCP 连接各种外部工具

不推荐场景

  1. 简单使用: 只想快速开始,不想配置 MCP
  2. 丰富 UI: 需要美观的 TUI
  3. 预装工具: 希望开箱即用大量内置工具

5.2 学术价值

MCP-Native 研究价值: - 首次将 MCP 作为核心架构(而非附加功能) - 证明了进程隔离 + 协议通信的可行性 - 为 Agent 工具标准化提供实践参考

5.3 工程价值

架构借鉴: - MCP Client 实现模式 - 进程隔离与通信 - 插件化工具系统


附录:核心代码位置

模块 文件 代码行数 关键功能
Agent 循环 crates/goose/src/agents/agent.rs ~700+ 核心编排逻辑,reply_internal()
Extension Manager crates/goose/src/agents/extension_manager.rs ~500+ MCP 服务器管理、工具分发
MCP Client Trait crates/goose/src/agents/mcp_client.rs ~200+ MCP 客户端 trait 定义
Session Manager crates/goose/src/session/session_manager.rs ~400+ 会话存储、SessionType 定义
Provider 抽象 crates/goose/src/providers/base.rs ~300+ LLM Provider 抽象层
工具检查 crates/goose/src/tool_inspection/ ~400+ 安全检查和验证
CLI crates/goose-cli/src/main.rs ~500 命令行界面

参考: - Goose GitHub - MCP Specification