2026年7月28日,MCP协议发布了史上最大的一次架构变革。Python SDK 同步推出 v2 版本,彻底告别了有状态会话。你的工具链不会因此变弱——反而会在部署和扩展上获得质的飞跃。这篇 5000 字实战教程带你从零搭建、调试、上线,覆盖全部关键踩坑点。
▲
一、MCP 2026-07-28:这次更新到底改了什么
2026年7月28日,MCP(Model Context Protocol)正式发布了 2026-07-28 版规范。这距离上次大更新(2025年11月)已经过去了8个月,期间 MCP 生态爆发式增长——仅 Python SDK 的每月下载量就接近 5 亿次,TypeScript 和 Python SDK 均突破了 10 亿总下载量。
这次更新的核心是一个大胆的决定:把 MCP 从"双向有状态协议"改造成"请求/响应无状态协议"。用通俗的话说,以前每一条连接都需要服务器记住"你是谁",现在每条请求自带身份信息,服务器不需要记任何事。
具体变化有七个关键点:
第一,握手和会话被彻底移除。 旧协议里,客户端必须先发 initialize 请求,服务器返回 Mcp-Session-Id,之后所有请求都得带上这个 Session ID。这意味着一个用户的所有请求必须打到同一台服务器实例——如果你有 3 台实例做负载均衡,就必须配粘性路由或共享 Session 存储(Redis)。新协议把这些全删了:每条请求在 _meta 字段里携带客户端身份和协议版本,任何一台实例都能独立处理,不需要共享任何东西。
第二,Header 级别路由。 Mcp-Method 和 Mcp-Name 现在作为 HTTP 请求头传输。这意味着你的 API 网关、WAF、限流器可以直接在 Header 层面做决策——看到 Mcp-Method: tools/call 就限流,看到 Mcp-Name: search 就路由到搜索引擎集群。完全不需要解析 JSON 请求体。
第三,列表结果可缓存。 tools/list、resources/list 的响应现在自带 ttlMs(缓存有效期)和 cacheScope(缓存作用域)。客户端可以缓存工具目录,不用每次都重新拉取。这对大模型来说很重要——每次调用前重新拉工具列表会消耗 token 和延迟,有了缓存机制,只有工具列表真的变了才需要刷新。
第四,多轮交互(MRTR)替代长连接。 旧协议里,如果工具执行到一半需要用户确认(比如"确定删除 3 个文件吗?"),服务器通过 SSE 推送一个提示给客户端。这要求连接一直保持打开。新协议的 MRTR 机制改为:服务器返回 inputRequired 结果,客户端收集用户答案后重新发起原请求,带着 inputResponses 和 requestState。任何实例都能处理这个重试请求,因为所有上下文都在请求体里。
第五,正式弃用三项功能。 Roots(根目录列表)、Sampling(服务器请求 LLM 补全)、Logging(日志通知)被标记为弃用,但有 12 个月的宽限期。HTTP+SSE 传输方式也被弃用。同时弃用了 Dynamic Client Registration(DCR),转向 Client ID Metadata Documents(CIMD)。
第六,授权机制全面增强。 Token 必须绑定到签发它的授权服务器,不能跨服务器复用(RFC 9207 标准)。这堵上了一个严重的安全漏洞:在旧协议里,攻击者可以从一个授权服务器拿到 Token 去访问另一个服务器。
第七,正式扩展框架落地。 Tasks 长任务、MCP Apps(server 自带 UI)等作为扩展独立演进。Extensions 机制的引入意味着 MCP 核心协议可以保持稳定,新功能通过扩展逐步加入。
这些变化看似激进,但实际是为了解决一个根本矛盾:MCP 的定位是"连接一切 AI 工具的标准协议",但有状态的架构让它在生产环境部署时问题重重。无状态化之后,MCP 终于可以像普通 HTTP API 一样轻松扩展了。
二、环境准备:5 分钟搭好开发环境
MCP 社区已经全面拥抱 uv 作为包管理器。它用 Rust 写成,依赖解析速度比 pip 快 10-100 倍,而且自带虚拟环境管理。
安装 uv
# macOS / Linux
curl -sSf https:__install.python-uv.org | bash
# Windows(PowerShell 管理员运行)
powershell -c "irm https:__install.python-uv.org | iex"
# 验证安装
uv --version
创建项目并安装 SDK
mkdir my-first-mcp && cd my-first-mcp
uv init
uv add "mcp[cli]"
这里的关键是 mcp[cli] 而不是 mcp。[cli] 额外包含了 mcp dev 命令——这是开发过程中最重要的调试工具。如果只装 mcp,你会发现自己少了一个最关键的命令。
⚠️ 踩坑 1:mcp dev server.py 会启动内置的 MCP Inspector 浏览器界面,提供交互式工具测试、请求/响应查看、性能耗时分析。这是目前最快的 MCP Server 调试方式——比自己写 curl 命令效率高 10 倍。但如果你只装了 pip install mcp 没有 [cli],这个命令不存在,你会浪费很多时间。
验证安装是否成功:
uv run python -c "from mcp.server import MCPServer; print('OK')"
如果输出 OK,环境就准备就绪了。
三、实战一:你的第一个 MCP Server(工具 + 资源 + 提示词)
先从最简单但功能完整的服务器开始——提供天气查询和基础数学运算。
创建 server.py:
"""MCP Server v2 — 天气预报 + 计算器"""
from mcp.server import MCPServer
# v2 直接用 MCPServer,不再需要 FastMCP 包装层
mcp = MCPServer("WeatherCalc")
# ── 工具:数学运算 ──
@mcp.tool()
def add(a: int, b: int) -> int:
"""返回两个整数的和"""
return a + b
@mcp.tool()
def divide(a: float, b: float) -> dict:
"""安全除法,返回商和余数(除数为零时返回错误)"""
if b == 0:
return {"error": "除数不能为零"}
return {
"quotient": round(a / b, 4),
"remainder": round(a % b, 4),
}
# ── 工具:天气查询(模拟数据) ──
@mcp.tool()
def get_weather(city: str) -> str:
"""查询指定城市的天气状况"""
weather_db = {
"北京": "晴,25°C,湿度 45%,北风 3 级",
"上海": "多云,28°C,湿度 65%,东南风 2 级",
"深圳": "阵雨,30°C,湿度 80%,西南风 4 级",
"成都": "阴,22°C,湿度 70%,无持续风向",
"杭州": "小雨,24°C,湿度 85%,东北风 2 级",
}
return weather_db.get(city, f"未找到「{city}」的天气数据。支持的城市:{', '.join(weather_db.keys())}")
# ── 资源:可查询的城市列表 ──
@mcp.resource("weather://cities")
def list_cities() -> str:
"""返回当前支持天气查询的城市列表"""
return "北京, 上海, 深圳, 成都, 杭州"
# ── 提示词模板 ──
@mcp.prompt()
def travel_advice(city: str) -> str:
"""根据城市天气生成出行建议提示词"""
return f"""请根据 {city} 的天气情况,给出一份出行建议报告。报告应包含:
1. 穿衣建议
2. 是否需要带雨具
3. 户外活动适宜度
4. 健康提醒(如防晒、防寒等)"""
if __name__ == "__main__":
mcp.run(transport="stdio")
启动 Inspector 调试
你会看到类似这样的输出:
Available tools:
- add: 返回两个整数的和
- divide: 安全除法,返回商和余数(除数为零时返回错误)
- get_weather: 查询指定城市的天气状况
Available resources:
- weather://cities: 返回当前支持天气查询的城市列表
Available prompts:
- travel_advice: 根据城市天气生成出行建议提示词
✓ MCP Inspector running at http:__localhost:5173
打开浏览器访问 get_weather,输入 {"city": "深圳"}`,右侧立刻显示返回结果:
整个开发→测试的循环极其高效:改一行代码 → 重启 Inspector → 点一下测试按钮 → 看结果。全程不到 5 秒。
⚠️ 踩坑 2:所有 @mcp.tool() 装饰的函数必须有完整的 type hints。MCP 依赖这些类型注解生成 JSON Schema,宿主 AI 才能知道传什么参数、什么类型。如果你写 def search(q) 而不是 def search(q: str),AI 模型拿到的是一个无类型约束的参数,传参质量会大幅下降。
⚠️ 踩坑 3:函数返回类型建议用具体类型而非裸 dict。虽然 -> dict 在 Python 中不报错,但 MCP 的 JSON Schema 推导会变成 {"type": "object"}——完全没有字段级别的结构信息。更好的做法是用 TypedDict 或 Pydantic Model。
四、实战二:接真实 API——Hacker News 搜索引擎
上面的例子是模拟数据。现在做一个真正有用的工具:搜索 Hacker News 上的 AI 相关内容,数据来自 HN Algolia 免费 API。
"""MCP Server — Hacker News 实时搜索"""
from mcp.server import MCPServer
import json
import urllib.request
import urllib.parse
mcp = MCPServer("HN Explorer")
@mcp.tool()
def search_hn(query: str, limit: int = 5) -> dict:
"""搜索 Hacker News 上与 AI 相关的热门文章。
Args:
query: 搜索关键词。示例:MCP protocol, Claude Code, OpenAI
limit: 返回结果数量(1-20),默认 5
Returns:
包含查询词、结果数量和文章列表的字典
"""
encoded_query = urllib.parse.quote(query)
url = (
f"https:__hn.algolia.com/api/v1/search?"
f"query={encoded_query}&tags=story&hitsPerPage={min(limit, 20)}"
)
try:
with urllib.request.urlopen(url, timeout=10) as resp:
data = json.loads(resp.read().decode())
except Exception as e:
return {"error": f"HN API 请求失败: {str(e)}"}
results = []
for hit in data.get("hits", []):
results.append({
"title": hit.get("title"),
"url": hit.get("url") or (
f"https:__news.ycombinator.com/item?id={hit.get('objectID')}"
),
"points": hit.get("points", 0),
"comments": hit.get("num_comments", 0),
"author": hit.get("author"),
"created_at": hit.get("created_at", ""),
})
return {
"query": query,
"total_results": data.get("nbHits", 0),
"returned": len(results),
"results": results,
}
@mcp.tool()
def get_top_stories(limit: int = 10) -> dict:
"""获取 Hacker News 当前热榜文章
Args:
limit: 返回条数,默认 10
Returns:
包含热榜文章的字典,按热度排序
"""
url = f"https:__hn.algolia.com/api/v1/search?" \
f"tags=front_page&hitsPerPage={min(limit, 30)}"
try:
with urllib.request.urlopen(url, timeout=10) as resp:
data = json.loads(resp.read().decode())
except Exception as e:
return {"error": f"获取热榜失败: {str(e)}"}
stories = []
for hit in data.get("hits", []):
stories.append({
"title": hit.get("title"),
"url": hit.get("url", ""),
"points": hit.get("points", 0),
"comments": hit.get("num_comments", 0),
})
return {"stories": stories}
@mcp.resource("hn://topics")
def hot_topics() -> str:
"""当前 AI 社区热门话题关键词"""
return "\n".join([
"MCP protocol 2026-07-28",
"Claude Code agent automation",
"Python SDK v2 migration",
"AI agent orchestration",
"Open-source LLM deployment",
])
if __name__ == "__main__":
mcp.run(transport="stdio")
这个工具可以直接被 Claude Desktop 或 Cursor 调用。比如用户说:「帮我搜一下 HN 上关于 MCP 2026-07-28 的讨论」,Claude 会自动调用 search_hn("MCP 2026-07-28"),拿到结果后帮你总结。
⚠️ 踩坑 4:urllib.request.urlopen 在某些内网环境或代理环境下可能超时。生产环境建议用 httpx 或 aiohttp 替代,设置合理的超时和重试策略。
⚠️ 踩坑 5:HN Algolia API 有时对中文关键词返回零结果。这是因为 Algolia 的索引对 CJK 分词支持有限。建议用英文关键词搜索,或者在 prompt 里引导 AI 先用英文搜再翻译。
▲
五、连接 AI 宿主:Claude Desktop / Cursor
MCP Server 本身只是一个后台进程,需要通过配置文件接入 AI 宿主才能被使用。
Claude Desktop 配置
编辑配置文件:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"hn-explorer": {
"command": "uv",
"args": [
"run",
"--directory",
"/absolute/path/to/my-first-mcp",
"server.py"
]
}
}
}
重启 Claude Desktop,新对话里输入「帮我看看 HN 上今天最火的 AI 话题」,Claude 会自动发现并调用 get_top_stories 工具。
Cursor 配置
Cursor 的配置更简单,在项目根目录创建 .cursor/mcp.json:
{
"mcpServers": {
"hn-explorer": {
"command": "uv",
"args": ["run", "--directory", ".", "server.py"]
}
}
}
Cursor 里 --directory 可以用 . 相对路径,这个比 Claude Desktop 友好。
⚠️ 踩坑 6:Claude Desktop 的 --directory 必须用绝对路径。因为它从自己的安装目录启动,相对路径会解析到完全错误的位置。这是新手最常见的配置错误。
⚠️ 踩坑 7:如果你看到「无法连接到 MCP 服务器」,先确认三件事:(1) uv run python server.py 能独立运行不报错;(2) 配置文件的 JSON 格式正确(多余的逗号会导致解析失败);(3) uv 在系统 PATH 中(用 which uv 验证)。
六、从 v1 迁移到 v2:三个最疼的变化
如果你之前用 v1 写过 MCP Server,迁移到 v2 时以下是实际踩过的坑:
变化一:不再有 initialize 握手
v1 的代码里有显式的握手过程,v2 全部移除。代码对比:
# v1 风格(需要 async + 握手)
from mcp.server.fastmcp import FastMCP
import asyncio
mcp = FastMCP("MyServer")
async def main():
async with mcp.run_stdio_async():
...
asyncio.run(main())
# v2 风格(去掉握手,可以直接非 async)
from mcp.server import MCPServer
mcp = MCPServer("MyServer")
if __name__ == "__main__":
mcp.run(transport="stdio") # 同步调用,一行搞定
变化二:FastMCP → MCPServer
FastMCP 在 v2 中仍然存在(作为 MCPServer 的包装),但官方文档已经推荐直接用 MCPServer。API 几乎一样——@mcp.tool()、@mcp.resource()、@mcp.prompt() 这些装饰器的用法完全相同。主要的区别是初始化方式从 FastMCP(name) 变成了 MCPServer(name)。
变化三:如果你用了 Mcp-Session-Id
v1 里很多开发者利用 session ID 来追踪状态(比如"当前用户打开了哪个浏览器窗口")。v2 没有 session 了,正确的做法是把状态 ID 作为工具参数显式传递:
# v2:显式传状态
@mcp.tool()
def search_page(browser_id: str, query: str) -> dict:
"""browser_id 由模型在多步操作中显式传递"""
browser = get_browser_instance(browser_id)
return browser.search(query)
模型的优点恰恰在这里:它能看到 browser_id,可以在多个工具调用之间自动传递这个标识符,就像人类在多步操作中记住"我在用那个窗口"一样自然。这比隐藏在传输层的 session 状态更透明、更可控。
▲
七、生产部署:从本地 stdio 到云端 HTTP
本地开发用 stdio 就够了。但如果你要把 MCP Server 部署到服务器供团队使用,需要用 Streamable HTTP transport。
改为 HTTP 模式
if __name__ == "__main__":
# 开发:uv run mcp dev server.py
# 生产:
mcp.run(transport="http", host="0.0.0.0", port=8000)
Nginx 反向代理(无需粘性路由)
upstream mcp_cluster {
# v2 不需要 ip_hash 或 sticky cookie!
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
server {
listen 80;
server_name mcp.yourdomain.com;
location /mcp {
proxy_pass http:__mcp_cluster;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
v1 的话,这个 nginx 配置必须在 upstream 块里加 ip_hash 或部署 Redis 做 session 共享,否则状态会丢失。v2 完全不需要这些——任何请求打到任何实例都能正确处理。
Docker 化
FROM python:3.12-slim
WORKDIR /app
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
COPY pyproject.toml uv.lock ./
RUN uv sync --frozen --no-dev
COPY server.py .
EXPOSE 8000
CMD ["uv", "run", "python", "server.py"]
一行命令部署:
docker build -t my-mcp-server . && docker run -p 8000:8000 my-mcp-server
八、进阶实战:做一个 AI 内容创作的 MCP 工具套件
理解了基础概念后,我们做一个更贴近实际业务的例子——为 AI 创业者打造的内容创作工具套件。这个工具包含三个能力:
功能设计
- 字数统计工具:分析一篇文章的中文字数、英文单词数、段落数、阅读时间
- 标题评分工具:根据标题的吸引力、信息密度、点击率潜力打分
- 排版模板资源:提供三种公众号排版模板供 AI 参考
"""MCP Server — AI 内容创作工具套件"""
from mcp.server import MCPServer
import re
mcp = MCPServer("Content Toolkit")
@mcp.tool()
def analyze_article(text: str) -> dict:
"""分析文章的统计信息:字符数、段落数、预估阅读时间等。
Args:
text: 要分析的文章全文(支持中英文混合)
Returns:
包含 cn_chars, en_words, paragraphs, reading_time_minutes 的统计字典
"""
cn_chars = len(re.findall(r'[\u4e00-\u9fff]', text))
en_words = len(re.findall(r'[a-zA-Z]+', text))
paragraphs = len([p for p in text.split('\n\n') if p.strip()])
# 中文阅读速度约 400 字/分钟,英文约 200 词/分钟
reading_time = round(cn_chars / 400 + en_words / 200, 1)
return {
"cn_chars": cn_chars,
"en_words": en_words,
"total_chars": len(text),
"paragraphs": paragraphs,
"reading_time_minutes": max(reading_time, 0.1),
"fits_wechat": "✅ 适合" if cn_chars <= 5000 else "⚠️ 偏长,公众号建议拆分",
}
@mcp.tool()
def score_title(title: str) -> dict:
"""对文章标题进行多维度评分,帮助优化点击率。
Args:
title: 文章标题文本
Returns:
包含各维度评分和总分(满分 100)的字典
"""
score = 0
details = {}
# 长度评分(公众号标题 15-25 字最佳)
cn_len = len(re.findall(r'[\u4e00-\u9fff]', title))
if 15 <= cn_len <= 25:
details["长度"] = (10, "15-25字,最佳长度 ✅")
score += 10
elif 10 <= cn_len <= 30:
details["长度"] = (6, f"{cn_len}字,长度可接受")
score += 6
else:
details["长度"] = (2, f"{cn_len}字,偏短或偏长")
# 数字/数据评分
if re.search(r'\d+', title):
details["数据感"] = (15, "包含数字,增强可信度 ✅")
score += 15
else:
details["数据感"] = (5, "缺少数字,建议加入具体数据")
# 悬念/对比评分
suspense_patterns = ['为什么', '如何', '怎样', '竟然', '居然', 'vs', 'VS', '还是']
if any(p in title for p in suspense_patterns):
details["悬念感"] = (15, "包含悬念/对比元素,增加点击欲 ✅")
score += 15
else:
details["悬念感"] = (8, "信息陈述为主,可增加对比或悬念")
# 情绪词评分
emotional = ['必看', '重磅', '炸裂', '终于', '全面', '终极', '实战']
if any(e in title for e in emotional):
details["情绪张力"] = (10, "包含情绪词,提升紧迫感 ✅")
score += 10
else:
details["情绪张力"] = (5, "偏平实,可适当增加情绪词")
details["总分"] = min(score, 100)
return {"title": title, "total_score": min(score, 100), "details": details}
@mcp.resource("template://wechat-article")
def article_template() -> str:
"""公众号文章排版模板(Markdown 格式)"""
return """# 标题
> 一句话核心观点,吸引读者点进来
## 开篇钩子
200字以内讲清楚这篇文章解决什么问题、读者能得到什么。
## 核心内容分 3-5 个章节
每章有数据支撑、案例说明、可操作步骤。
## 总结
核心要点回顾 + 行动号召。
<hr>
#标签1 #标签2 #标签3
> 💡 觉得有用?分享给需要的朋友。关注「AI创业内参」,获取更多实战干货。"""
if __name__ == "__main__":
mcp.run(transport="stdio")
这个工具套件在实际使用中非常高效。比如你对 Claude 说「帮我分析这篇文章的字数和结构,然后给这篇新文章起 5 个标题并打分」,Claude 会自动调用 analyze_article 获取统计信息,然后调用 score_title 对每个候选标题评分排序——全自动完成,几秒钟出结果。
⚠️ 踩坑 8:@mcp.resource() 返回的模板内容里如果包含 Markdown 格式符号,AI 模型会正确理解并用于排版。但如果返回的是 HTML,AI 可能会混淆。建议 resource 返回纯 Markdown 或纯文本,让宿主 AI 自己决定渲染方式。
九、常见问题与排障
Q: 我的 MCP Server 启动了但 Claude 找不到工具?
A: 三步排查法:(1) 确认 uv run python server.py 能独立运行不报错;(2) 确认配置文件 JSON 格式正确——特别是结尾不能有多余逗号;(3) 检查 uv 是否在系统 PATH 中(which uv)。如果以上都没问题,重启 Claude Desktop 后查看「Developer → MCP Logs」获取详细错误。
Q: stdio 和 HTTP transport 应该选哪个?
A: 本地开发用 stdio(零配置,直接跑)。生产环境用 HTTP(可水平扩展、可加认证中间件、可配负载均衡)。注意 stdio 模式每次 Claude 启动都会新开一个进程,适合轻量工具;HTTP 模式是常驻进程,适合有缓存或需要维持数据库连接的工具。
Q: 一个 Server 里建议放多少个工具?
A: 没有硬性限制,但经验法则是 3-8 个工具最合适。太少说明功能拆得太粗(一个工具做太多事,AI 难以选择);太多会让工具的 JSON Schema 总大小超限(部分宿主 AI 对工具描述总长度有限制)。如果一个 Server 需要 10+ 个工具,建议拆成多个独立的 Server。
Q: v2 的 _meta 字段里应该放什么?
A: _meta 是 v2 替代旧握手信息的关键字段。至少应该包含 io.modelcontextprotocol/clientInfo(客户端名称和版本)。如果你的 Server 在网关后面,还建议加 traceparent(W3C Trace Context)做分布式追踪。不需要像 v1 那样把所有能力列表塞进去——v2 有专门的 server/discover 方法按需查询。
Q: 工具函数里能做异步操作吗?比如调外部 API 或查数据库?
A: 可以但不推荐在同步函数里用 asyncio.run()。正确做法是使用 @mcp.tool() 配合 async def——MCPServer 完全支持异步工具函数。示例:
import httpx
@mcp.tool()
async def fetch_price(symbol: str) -> dict:
"""异步查询股票价格"""
async with httpx.AsyncClient() as client:
resp = await client.get(f"https:__api.example.com/price/{symbol}")
return resp.json()
十、总结:无状态化对开发者的真正价值
MCP 2026-07-28 规范的发布和 Python SDK v2 的推出,做了一件看似"减法"的事——去掉会话层、去掉握手、去掉粘性路由依赖。但这恰恰是 MCP 走向生产级的关键一步。无状态化意味着你的 MCP Server 可以像普通 HTTP API 一样部署:挂负载均衡、配自动扩缩容、加 API 网关限流——所有这些都不再需要额外的状态同步层。
回顾一下我们从零到一完成的事情:安装环境、写第一个 MCP Server、用 Inspector 交互调试、接入 HN 真实 API、连接 Claude Desktop 实测、用 Docker 部署上线。这套流程适用于任何你未来需要定制的 AI 工具链。
一个简单的对比:
| v1(2025-11-25) | v2(2026-07-28) |
|---|
| 负载均衡 | 需要 ip_hash 或 Redis | 普通轮询即可 |
| 首次调用 | 先 initialize 握手 | 直接发 tool call |
| 网关限流 | 需解析 JSON body | 读 Header 即可 |
| 工具目录 | 每次重新拉取 | 支持 ttlMs 缓存 |
| 长任务 | 依赖 SSE 长连接 | MRTR 轮询模式 |
| 水平扩展 | 需共享存储 | 无状态,随意扩 |
下一步行动:用上面 server.py 的模板,花 30 分钟走通完整流程——写工具→mcp dev 调试→接入 Claude Desktop→实际对话测试。跑通一次,你就掌握了用 AI Agent 工具链开发的核心技能。
#AI创业 #Agent工坊 #MCP协议 #Python开发 #AI工具链 #一人公司
本文由AI辅助创作,经人工审核编辑发布
更多一人公司案例与工具,微信搜索「AI创业内参」关注我们