Anthropic 3亿美元收购Stainless:一文看懂AI开发工具链的「咽喉」战略
前言:当AI巨头开始「修路」
2026年5月18日,Anthropic宣布完成对开发者工具初创公司Stainless的收购。虽然双方未披露具体交易金额,但据The Information报道,此次收购估值超过3亿美元,由红杉资本和安德森·霍洛维茨基金支持的Stainless正式纳入Anthropic旗下。
然而真正让这场收购在技术圈引发震动的,不是价格标签,而是另一个事实:OpenAI、Google和Anthropic自己,都在使用Stainless的工具。
这家名不见经传的纽约初创公司,掌握着AI行业最关键的基础设施之一——SDK生成引擎。它的工作听起来甚至有些枯燥:将结构化的API规范,自动转换为TypeScript、Python、Go、Java、Kotlin等多种编程语言的SDK代码库。但正是这种「枯燥」,让它成为整个AI开发生态的「隐形血管」。
本文将深入剖析这场收购背后的技术逻辑、战略意图,以及对整个AI开发者工具链格局的深远影响。
一、Stainless是谁:一家「修路工」公司
1.1 创立背景
Stainless由前Stripe工程师Alex Rattray于2022年创立。Stripe以构建高质量API和SDK闻名于世,Rattray将这一工程文化带到了AI时代。
Stripe长期以来在支付API领域建立了一套极其严谨的规范体系,开发者体验(Developer Experience,简称DX)是其核心竞争力之一。Rattray将这一理念迁移到了AI API领域:与其让每个AI供应商各自维护一套质量参差不齐的SDK,不如用自动化的方式从API规范统一生成高质量SDK。
1.2 核心产品
Stainless的核心产品有两大部分:
第一,SDK自动生成引擎。 开发者只需提供OpenAPI规范的JSON或YAML文件,Stainless的系统就能自动生成包含以下特性的SDK:
- 完整的类型定义(TypeScript的interface、Python的dataclass、Go的struct等)
- 自动错误处理和重试逻辑
- 完善的文档注释
- 同步和异步两种调用模式
- 版本管理和迁移工具
第二,MCP服务器平台。 除了SDK生成,Stainless还提供了符合Model Context Protocol(MCP)的服务器工具。MCP是Anthropic主导的AI Agent与外部工具/数据源交互的标准协议,Stainless的MCP工具让开发者可以快速构建符合MCP规范的服务器端点。
1.3 客户版图
在被收购前,Stainless的客户覆盖了AI行业的顶级玩家:
- Anthropic:自Anthropic API上线起,所有官方SDK均由Stainless生成
- OpenAI:使用Stainless生成其多语言API SDK
- Google:通过Stainless维护其AI相关API的SDK生态
这就是为什么这场收购如此敏感——Anthropic买下了一家所有竞争对手都在依赖的基础设施供应商。
二、技术深度:SDK生成引擎的架构解析
2.1 为什么SDK生成是技术难题
在深入Stainless的技术之前,我们需要理解为什么SDK生成是一个被低估的技术挑战。
想象一下:一个AI供应商的API有50个端点,每个端点有10个参数,每个参数有多种可能的类型组合,还需要处理嵌套对象、数组、枚举等各种复杂数据结构。如果用手动方式为每种编程语言编写SDK:
- 工作量巨大(5种语言 × 50个端点 × 复杂的类型处理)
- 版本同步困难(API改了,所有语言的SDK都要同步更新)
- 质量参差不齐(不同语言可能由不同团队维护)
- 错误处理不一致(重试策略、超时设置、日志规范各有不同)
而当API经常迭代时(如AI API通常每月都会有新功能),手动维护SDK的成本会指数级增长。Stainless的价值,正是用自动化将这个成本降到接近零。
2.2 核心架构:三层转换引擎
Stainless的SDK生成系统可以拆解为三层架构:
┌─────────────────────────────────────────────────────────────┐
│ 第一层:规范解析层 │
│ OpenAPI 3.0/3.1 JSON/YAML → 内部中间表示(IR) │
│ │
│ ├── 解析所有HTTP端点、方法、路径参数 │
│ ├── 提取所有请求/响应body的JSON Schema │
│ ├── 识别认证机制(Bearer/API Key/OAuth) │
│ └── 生成完整的类型依赖图(DAG) │
└──────────────────────────┬──────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 第二层:类型映射层 │
│ JSON Schema → 各语言的原生类型系统 │
│ │
│ TypeScript: "type" → interface, "enum" → union type │
│ Python: "type" → dataclass, "enum" → Enum │
│ Go: "type" → struct + reflect tags │
│ Java: "type" → class, "enum" → Enum │
│ Kotlin: "type" → data class, "enum" → Enum class │
└──────────────────────────┬──────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 第三层:代码生成层 │
│ IR + 类型映射 → 各语言的高质量SDK代码 │
│ │
│ ├── 客户端类(包含所有HTTP逻辑) │
│ ├── 类型定义文件(各语言独立模块) │
│ ├── 错误处理模块(统一的异常类) │
│ ├── 重试与超时策略(可配置) │
│ ├── 测试用例生成(每个端点对应测试) │
│ └── 文档注释(从规范自动提取) │
└─────────────────────────────────────────────────────────────┘
2.3 关键技术细节
2.3.1 JSON Schema的复杂类型处理
API规范中最复杂的部分是对复杂数据结构的描述。Stainless需要处理以下场景:
// 假设OpenAPI规范中有这样一个Schema:
{
"components": {
"schemas": {
"Message": {
"type": "object",
"properties": {
"role": { "type": "string", "enum": ["user", "assistant", "system"] },
"content": { "type": "string" },
"tool_calls": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ToolCall"
}
},
"metadata": {
"type": "object",
"additionalProperties": true
}
}
},
"ToolCall": {
"type": "object",
"properties": {
"id": { "type": "string" },
"type": { "type": "string", "const": "function" },
"function": { "$ref": "#/components/schemas/FunctionCall" }
}
}
}
}
}
Stainless的解析引擎需要:
- 识别
$ref引用并展开为完整的对象定义 - 处理
enum约束生成类型安全的联合类型 - 处理
additionalProperties生成Record<string, any>或Map<>类型 - 处理
array和嵌套object生成正确的泛型容器
生成的不同语言类型定义如下:
TypeScript:
export type MessageRole = "user" | "assistant" | "system";
export interface Message {
role: MessageRole;
content: string;
tool_calls?: ToolCall[];
metadata?: Record<string, unknown>;
}
export interface ToolCall {
id: string;
type: "function";
function: FunctionCall;
}
Python:
from dataclasses import dataclass, field
from typing import Literal, Optional, Dict, Any, List
class Message:
role: Literal["user", "assistant", "system"]
content: str
tool_calls: Optional[List[ToolCall]] = None
metadata: Optional[Dict[str, Any]] = None
@dataclass
class ToolCall:
id: str
type: Literal["function"] = "function"
function: FunctionCall
Go:
type Message struct {
Role MessageRole `json:"role"`
Content string `json:"content"`
ToolCalls []ToolCall `json:"tool_calls,omitempty"`
Metadata map[string]any `json:"metadata,omitempty"`
}
type MessageRole string
const (
RoleUser MessageRole = "user"
RoleAssistant MessageRole = "assistant"
RoleSystem MessageRole = "system"
)
2.3.2 同步/异步双模式支持
现代编程语言都支持异步操作,AI API尤其需要。Stainless为每种语言生成同步和异步两套接口:
TypeScript示例:
// 同步模式
class AnthropicClient {
createMessage(params: CreateMessageParams): Promise<Message> {
return this.request('POST', '/v1/messages', params);
}
}
// 异步迭代器模式(流式响应)
async *createMessageStream(params: CreateMessageParams): AsyncGenerator<ContentBlock> {
const response = await this.request('POST', '/v1/messages', {
...params,
stream: true
});
for await (const line of response.body) {
if (line.startsWith('data: ')) {
yield JSON.parse(line.slice(6));
}
}
}
2.3.3 智能重试与错误处理
网络请求必然面临各种故障,SDK需要优雅地处理。Stainless生成的重试逻辑:
// 基于Stainless SDK的重试策略
class RetryableError extends Error {
constructor(
message: string,
public readonly statusCode: number,
public readonly attemptCount: number
) {
super(message);
this.name = 'RetryableError';
}
}
async function withRetry<T>(
operation: () => Promise<T>,
options: RetryOptions = {}
): Promise<T> {
const {
maxAttempts = 3,
baseDelay = 1000,
maxDelay = 10000,
retryableStatuses = [408, 429, 500, 502, 503, 504]
} = options;
let lastError: Error;
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
return await operation();
} catch (error) {
lastError = error as Error;
// 判断是否可重试
if (error instanceof RetryableError) {
if (!retryableStatuses.includes(error.statusCode)) {
throw error; // 非可重试错误,立即抛出
}
} else if (!(error instanceof NetworkError)) {
throw error; // 非网络错误,立即抛出
}
if (attempt === maxAttempts) break;
// 指数退避 + 抖动
const delay = Math.min(
baseDelay * Math.pow(2, attempt - 1) + Math.random() * 1000,
maxDelay
);
await sleep(delay);
}
}
throw lastError!;
}
2.4 MCP服务器:AI Agent的「工具接口」
Model Context Protocol(MCP)是Anthropic主导的AI Agent与外部工具交互的标准协议。Stainless提供的MCP服务器生成工具,允许开发者:
- 用OpenAPI规范描述一个工具(如「查询天气」「发送邮件」)
- Stainless自动生成符合MCP规范的服务器实现
- Claude或其他AI Agent可以通过MCP协议调用这些工具
// Stainless MCP服务器生成的工具定义示例
import { McpServer } from '@anthropic-ai/stainless-mcp';
const server = new McpServer({
name: 'weather-tools',
version: '1.0.0'
});
server.tool('get_weather', {
description: '查询指定城市的天气信息',
inputSchema: {
type: 'object',
properties: {
city: { type: 'string', description: '城市名称' },
unit: {
type: 'string',
enum: ['celsius', 'fahrenheit'],
default: 'celsius'
}
},
required: ['city']
}
}, async ({ city, unit }) => {
// 实际工具逻辑
const weather = await fetchWeather(city, unit);
return {
content: [{
type: 'text',
text: `当前${city}天气:${weather.temp}°${unit === 'celsius' ? 'C' : 'F'},${weather.condition}`
}]
};
});
这样,开发者无需深入理解MCP协议的底层细节,只需用OpenAPI规范描述工具,就能快速构建可被AI Agent调用的服务。
三、战略解析:Anthropic为什么要买「对手的铲子」
3.1 三亿美元买的是什么
Anthropic以超过3亿美元的价格收购Stainless,这笔钱的战略价值可以从几个维度理解:
1. 竞争壁垒构建
Anthropic的竞争对手——OpenAI、Google DeepMind——都在使用Stainless的工具构建自己的SDK生态。这意味着一旦Anthropic完成收购:
- OpenAI和Google将无法继续使用Stainless的自动化工具
- 他们需要重新投入人力维护SDK,或寻找替代方案
- Anthropic独家获得的工具能力将让Claude SDK在质量和更新速度上形成代际优势
Anthropic宣布将逐步关闭所有Stainless的托管服务,包括其SDK生成器。虽然现有客户仍拥有已生成SDK的所有权,但后续更新将不再可用。
2. 开发者生态控制
SDK是开发者接触AI API的第一入口。一个好的SDK体验(清晰的类型提示、完善的文档、顺畅的更新节奏)会直接影响开发者的工具选择。当Anthropic拥有了最强的SDK生成能力,它就能在开发者心智中建立更深的品牌认知。
3. 技术团队整合
Stainless团队——尤其是Alex Rattray——在SDK工程领域有深厚积累。他们的加入将直接强化Anthropic的开发工具链能力。据Anthropic公告,Stainless团队将全面加入Anthropic,专注于强化Claude生态的底层开发工具链。
3.2 「修路工」战略的历史先例
科技史上,通过控制「基础设施」来影响竞争格局的案例并不少见:
Stripe的支付基础设施战略: Stripe通过构建高质量的支付API,让成千上万的开发者习惯于「用Stripe的方式」处理支付。当Stripe推出新产品(如Stripe Connect、Stripe Atlas)时,这批开发者几乎是零成本转化。
GitHub对 Codespaces 的投入: GitHub Codespaces将云端开发环境直接集成到代码托管平台,让开发者在GitHub生态内完成从编写到调试的全流程,减少了切换到其他IDE的摩擦。
Datadog的APM基础设施: Datadog通过免费的开源客户端库(dd-agent等)渗透到开发者的系统监控体系中,一旦建立了数据采集的「管道」,迁移成本就变得极高。
Anthropic收购Stainless,正是这一战略逻辑在AI时代的重演。
3.3 3亿美元背后的竞争格局演变
从更宏观的视角看,这场收购揭示了AI竞争的关键转变:
2024-2025年:模型能力竞争
→ 谁的基础模型最强(GPT-4 vs Claude 3 vs Gemini)
2025-2026年:价格与速度竞争
→ 谁的成本更低、响应更快
2026年+:开发者生态竞争
→ 谁能提供更好的开发工具、更顺滑的集成体验
当基础模型的能力差异逐渐缩小(GPT-5.5已能通过ProgramBench),价格竞争也趋于白热化,开发者生态的粘性成为新的战场。SDK作为开发者日常接触最多的接口,其质量直接影响开发者对整个平台的评价。
四、影响分析:谁受损,谁获益
4.1 OpenAI:失去SDK基础设施,需重建
OpenAI的官方Python、TypeScript等SDK均依赖Stainless生成。收购完成后:
短期影响:
- 已生成的SDK代码完全归OpenAI所有,可以继续使用
- 但API规范如有更新,OpenAI需要手动同步所有语言版本
长期影响:
- OpenAI需要投入工程资源重建SDK生成流程
- 或者寻找其他SDK生成工具(如Kiota、Swagger Codegen等),但这些工具的质量与Stainless有差距
- 新SDK的生成速度和覆盖语言范围可能下降
OpenAI可能的应对:
- 加大自研SDK生成工具的投入
- 收购或投资其他SDK生成公司
- 或者接受SDK质量下降的现实,更多依赖社区贡献
4.2 Google:同样面临SDK迁移挑战
Google的AI API(Gemini系列)同样使用Stainless生成多语言SDK。Google的应对空间相对更大:
- 内部有强大的工程团队,可以快速重建SDK生成能力
- 但重建需要时间,期间SDK质量可能下降
- Google也可能借此机会推动其内部的SDK标准化工作
4.3 Anthropic:获得战略优势,但也面临风险
获益:
- 独家获得Stainless的高质量SDK生成能力
- 削弱了竞争对手的开发者体验
- 吸引了有工程能力的顶尖团队加入
风险:
- 反垄断审查:收购一家被OpenAI和Google共同使用的关键基础设施供应商,可能引发监管关注
- 开发者信任:如果Anthropic被感知为「故意断供竞争对手」,可能影响其在开发者社区的品牌形象
- 内部整合挑战:收购后的技术整合往往比想象中更复杂
4.4 开发者:从竞争到生态重构
对于普通开发者而言,这场收购的影响是双面的:
短期不便:
- 如果你正在使用OpenAI或Google的SDK,并且依赖Stainless的自动更新机制,你需要关注SDK的维护状态
- MCP服务器的生态可能因Stainless产品关停而受到影响
长期机会:
- Anthropic承诺将Stainless的技术整合进Claude生态,Claude开发者将获得更好的工具链
- SDK生成技术的进步可能催生新的行业标准
- 开源社区可能出现替代方案
五、技术趋势:SDK自动化的下一个十年
5.1 SDK生成的行业现状
Stainless不是唯一的SDK生成工具,但它的质量确实是行业中最好的。以下是当前主要方案对比:
| 工具 | 支持语言 | OpenAPI支持 | 实时同步 | MCP支持 | 质量评分 |
|---|---|---|---|---|---|
| Stainless | TS/Python/Go/Java/Kotlin | ✅ 完整 | ✅ 自动 | ✅ 原生 | ⭐⭐⭐⭐⭐ |
| Kiota (Microsoft) | C#/Java/Go/PHP/Python/Ruby/TypeScript | ✅ 完整 | 需手动触发 | ❌ | ⭐⭐⭐ |
| Swagger Codegen | 40+语言 | ✅ 完整 | 需手动触发 | ❌ | ⭐⭐ |
| OpenAPI Generator | 50+语言 | ✅ 完整 | 需手动触发 | ❌ | ⭐⭐ |
| Fern | TypeScript/Python | ✅ 完整 | 需手动触发 | ❌ | ⭐⭐⭐ |
可以看到,Stainless的核心优势在于「实时同步」和「MCP原生支持」。当API规范更新时,Stainless可以自动触发重新生成流程,并在CI/CD中无缝集成。
5.2 MCP协议:AI Agent的「USB接口」
Model Context Protocol(MCP)是这场收购中另一个关键角色。
在传统软件开发中,当我们需要让程序调用外部服务时,通常有两种方式:
方式一:硬编码
# 每个工具单独实现,没有统一标准
async def get_weather(city):
response = await http.get(f"https://api.weather.com/{city}")
return response.json()
async def send_email(to, content):
response = await http.post("https://api.email.com/send", {
"to": to, "content": content
})
return response.json()
方式二:MCP统一协议
# 所有工具遵循同一协议,AI Agent可以通用调用
class MCPClient:
def __init__(self, servers: List[MCPServer]):
self.servers = servers
async def call_tool(self, tool_name: str, params: dict):
for server in self.servers:
if tool := server.get_tool(tool_name):
return await tool.execute(params)
raise ToolNotFoundError(tool_name)
# 新的天气工具只需遵循MCP协议,即可被AI Agent发现和调用
MCP的价值在于「即插即用」:开发者只需将工具服务器启动,AI Agent就能自动发现所有可用工具,无需为每个工具单独编写集成代码。Stainless在MCP服务器生成方面的能力,使它成为Anthropic完善AI Agent生态的关键拼图。
5.3 代码示例:MCP工具的完整开发流程
为了更好地理解Stainless/MCP的技术价值,这里展示一个完整的MCP工具开发流程。
场景: 开发一个GitHub仓库分析工具,让Claude能够查询仓库的Star数、贡献者信息、最近的Issue等。
第一步:定义OpenAPI规范
# github-analytics.yaml
openapi: 3.0.0
info:
title: GitHub Analytics API
version: 1.0.0
paths:
/repos/{owner}/{repo}:
get:
operationId: getRepoInfo
parameters:
- name: owner
in: path
required: true
schema:
type: string
- name: repo
in: path
required: true
schema:
type: string
responses:
'200':
description: 仓库信息
content:
application/json:
schema:
type: object
properties:
full_name:
type: string
stargazers_count:
type: integer
forks_count:
type: integer
open_issues_count:
type: integer
description:
type: string
/repos/{owner}/{repo}/contributors:
get:
operationId: getContributors
parameters:
- name: owner
in: path
schema: { type: string }
- name: repo
in: path
schema: { type: string }
responses:
'200':
content:
application/json:
schema:
type: array
items:
type: object
properties:
login: { type: string }
contributions: { type: integer }
第二步:用Stainless生成MCP服务器
stainless generate --spec github-analytics.yaml \
--platform mcp \
--output ./github-mcp-server \
--lang typescript
生成的MCP服务器结构:
github-mcp-server/
├── src/
│ ├── tools/
│ │ ├── getRepoInfo.ts
│ │ └── getContributors.ts
│ ├── clients/
│ │ └── githubClient.ts
│ ├── types/
│ │ └── schema.ts
│ └── index.ts # MCP服务器入口
├── package.json
└── stainless.config.json
第三步:运行服务器
// src/index.ts
import { McpServer } from '@anthropic-ai/stainless-mcp';
import { getRepoInfo } from './tools/getRepoInfo';
import { getContributors } from './tools/getContributors';
const server = new McpServer({
name: 'github-analytics',
version: '1.0.0',
tools: {
getRepoInfo,
getContributors
}
});
server.listen(3000, () => {
console.log('GitHub MCP Server running on http://localhost:3000');
});
第四步:Claude Agent调用
// 在Claude Code中配置MCP服务器
import { Anthropic } from '@anthropic-ai/sdk';
const client = new Anthropic();
const response = await client.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 1024,
tools: [
{
type: 'mcp',
server: 'http://localhost:3000',
tools: ['getRepoInfo', 'getContributors']
}
],
messages: [{
role: 'user',
content: '分析一下 https://github.com/anthropics/claude-code 这个仓库的基本信息和贡献者'
}]
});
这就是MCP的价值:开发者只需要编写API规范和业务逻辑,Stainless自动处理协议层面的所有复杂性。
5.4 SDK生成的技术演进方向
展望未来,SDK生成技术有几个值得关注的方向:
1. AI辅助的规范撰写
当前SDK生成的瓶颈之一是OpenAPI规范的质量。一个写得不好的规范,生成的SDK也会有各种问题。AI可以帮助:
- 分析现有API行为,自动生成高质量的OpenAPI规范
- 发现规范中的歧义和不一致性并给出修复建议
- 从自然语言描述直接生成完整的API规范
2. 测试覆盖的自动化
SDK生成器通常只生成「happy path」的代码,错误处理和边界情况的测试往往被忽略。未来,SDK生成器可能会:
- 自动生成针对每个端点的完整测试套件
- 使用AI模拟各种异常场景(网络超时、服务宕机、格式错误等)
- 生成性能基准测试代码
3. 渐进式类型语言的支持
随着Swift、Kotlin等移动端语言的崛起,以及Rust在系统编程中的流行,SDK生成器需要更好地支持这些具有强类型系统的语言,提供与语言风格一致的SDK设计。
六、开发者行动指南
6.1 如果你正在使用Stainless生成的SDK
立即行动:
- 确认你依赖的SDK版本和来源
- 备份已生成的SDK代码(虽然你有所有权,但Anthropic可能随时下线生成工具)
- 评估迁移到其他SDK生成工具的成本
中期规划:
- 建立内部的SDK生成流水线,减少对外部工具的依赖
- 关注OpenAI和Google的SDK更新公告,及时同步最新版本
- 考虑参与开源SDK社区的贡献,共同维护SDK质量
6.2 如果你是AI应用开发者
工具选择建议:
- 评估各AI供应商SDK的质量和维护状态
- 优先选择有明确SDK维护承诺的供应商
- 避免硬编码对特定SDK的深度依赖,使用抽象层解耦
MCP生态建议:
- MCP正在成为AI Agent工具的标准,关注其生态发展
- 学习用OpenAPI规范描述你的工具,利用Stainless或类似工具快速构建MCP服务器
- 参与MCP协议标准的讨论和制定
6.3 如果你在考虑构建AI相关产品
战略考量:
- AI基础设施的「咽喉」位置正在成为并购热点,选择供应商时需评估其被收购风险
- 考虑「多供应商」策略,避免单点依赖
- 关注开源替代方案,降低商业供应商锁定的风险
七、结语:基础设施之战的下半场
Anthropic收购Stainless,是AI行业从「模型能力竞争」转向「开发者生态竞争」的一个标志性事件。
当基础模型的能力差距逐渐缩小,价格竞争趋于均衡,SDK的质量、工具链的完善程度、开发者社区的活跃度,就成了新的决定性因素。这就像云计算市场的演进:最初大家比拼VM实例的规格,后来发现开发者更在意的是SDK的易用性、CLI工具的效率、以及整个生态的丰富程度。
对于整个行业而言,这场收购既是挑战也是机遇:
- 挑战:竞争对手的SDK维护成本将上升,可能影响其开发者体验
- 机遇:这会倒逼整个行业提升SDK生成的自动化水平,新的开源工具可能出现
- 趋势:开发者工具链的重要性被提升到战略高度,更多并购可能发生
对于开发者而言,最重要的是保持「基础设施不可知」的姿态:不要过度依赖某一个工具或平台,保持技术的迁移能力和选择的灵活性。毕竟,在技术行业,变化是唯一的不变。
当Anthropic买下「修路工」的那一刻,AI战争的底层逻辑已经悄然改变。而作为开发者,我们能做的,就是在这场基础设施战争中,找到自己的位置,守住自己的技术栈,然后继续写出好的代码。
本文覆盖技术点:SDK自动生成引擎架构、OpenAPI规范解析、JSON Schema类型映射、多语言代码生成、MCP协议原理、AI Agent工具链、开发者生态竞争策略。