李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 每日心情
  • Now
  • 系列文章
  • 论坛
  • 左邻右舍
    • 左邻右舍
    • 博友圈
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于我
    • 网站地图
    • 网站统计
    • 另一个网站
    • 我的导航站
    • 赞助
  • 🚇开往
Destiny
自是人生长恨水长东
  1. 首页
  2. AI
  3. 正文

MCP深度解析:从协议本质到实战落地,彻底搞懂 AI 工具交互的标准化方案

2025年11月11日 约 4,678 字16 分钟 44 0 0
本文最后更新于 2025年11月10日,距今已 281 天,其中的信息可能已经发生变化,请注意甄别。

在 AI 工具化的浪潮中,Function Call 让 LLM 具备了调用外部工具的能力,但随着工具数量增多、LLM 厂商林立,“接口不统一、迁移成本高、生态碎片化”的问题日益凸显。MCP(Model Context Protocol)的出现,如同 AI 世界的“HTTP 协议”,为 LLM 与工具的交互建立了统一标准。

一、先回顾:Function Call 为何需要 MCP ?

在理解 MCP 之前,我们需要先明确:Function Call 解决了“LLM 不会用工具”的问题,但带来了新的麻烦。原文提到了 Function Call 的核心痛点,本节将结合具体场景,补充更多细节:

1. Function Call 的工作原理(快速回顾)

Function Call 是 LLM 调用外部工具的基础机制,核心流程:

  1. 开发者通过 JSON Schema 定义工具(函数名、描述、参数);
  2. 将工具定义与用户查询一起传给 LLM;
  3. LLM 解析查询,判断是否需要调用工具,返回函数名和参数;
  4. 开发者执行工具调用,将结果回传给 LLM;
  5. LLM 整合结果,生成自然语言回复。

2. Function Call 的 5 大核心痛点

(1)无统一标准,跨 LLM 迁移成本极高

不同 LLM 厂商的 Function Call 实现差异巨大,导致“一套代码适配一个 LLM”:

  • 参数定义差异:OpenAI 用 functions 参数,Anthropic 用 tools 参数,百度文心一言用 plugin 参数;
  • 返回格式差异:OpenAI 返回 function_call 字段,Claude 返回 tool_calls 字段,参数结构也不同;
  • 场景示例:将 OpenAI 的 Function Call 代码迁移到 Claude,需修改工具定义格式、返回值解析逻辑,迁移成本达 80%。

(2)JSON Schema 维护困难,无法共享

Function Call 的工具描述依赖 JSON Schema,存在两大问题:

  • 可读性差:复杂工具的 JSON Schema 冗长,修改参数需手动编辑 JSON,易出错;
  • 无法共享:工具定义与代码强绑定,无法在不同项目、不同团队间复用,形成“信息孤岛”。

(3)工具增多导致 Token 浪费严重

当工具数量超过 10 个时,每次调用 LLM 都需携带所有工具的 JSON Schema,导致:

  • 输入 Token 暴增:10 个复杂工具的 JSON Schema 可能占用上千 Token,远超用户查询本身;
  • 算力浪费:用户查询无需工具调用时,仍需传递所有工具定义,增加 LLM 推理负担。

(4)依赖 LLM 能力,稳定性不足

Function Call 的有效性完全依赖 LLM 的理解能力:

  • 需通过复杂的 System Prompt 约束 LLM 输出格式,不同 LLM 对 Prompt 的敏感度不同;
  • 部分低能力 LLM 会出现“误调用工具”“参数提取错误”,需额外开发容错逻辑。

(5)无中间层,LLM 与工具强绑定

Function Call 让 LLM 直接与工具交互,导致:

  • 工具升级或替换时,需修改 LLM 调用代码;
  • 无法统一管理工具的权限、速率限制、错误处理;
  • 不支持 LLM 无感切换,一旦绑定某个 LLM,替换成本极高。

3. 痛点总结:Function Call 是“点解决方案”,而非“生态方案”

Function Call 解决了 LLM 与工具“能不能交互”的问题,但没解决“如何高效、标准化、可扩展交互”的问题——这正是 MCP 诞生的核心原因。

二、MCP 协议本质:AI 工具交互的“HTTP 标准”

MCP(Model Context Protocol)是 Anthropic 开源的LLM 与工具交互的标准化协议,核心目标是“让 LLM 与工具的交互像 HTTP 通信一样通用、简单、可扩展”。

1. MCP 的核心设计理念

  • 解耦:将 LLM 与工具分离,通过 MCP 中间层实现通信,避免强绑定;
  • 标准化:定义统一的工具描述格式、通信流程、数据交互规范;
  • 生态化:支持工具的共享、复用、发现,形成“工具市场”;
  • 兼容性:兼容所有支持 Function Call 的 LLM,无需修改 LLM 本身。

2. MCP 的核心组件与职责

MCP 架构包含三大核心组件,分工明确:

组件 核心职责 示例实现
MCP Client 对接 LLM,发起工具查询、执行调用 Claude Desktop、Cursor、自定义客户端
MCP Server 提供工具能力,注册工具元信息、处理调用请求 天气查询 Server、数据库操作 Server、API 代理 Server
MCP 协议 定义通信规范(工具描述、请求/响应格式) 工具元数据格式、RPC 通信协议、错误码标准

关键补充:MCP Server 的核心能力

  • 工具注册:向 Client 暴露工具元信息(名称、描述、参数、返回格式);
  • 请求处理:接收 Client 的工具调用请求,执行逻辑并返回结果;
  • 权限控制:支持 API Key、角色权限等访问控制;
  • 错误处理:统一的错误码和异常描述,便于 Client 处理。

3. MCP 协议核心规范(详细版)

MCP 协议的核心是“工具描述格式”和“通信流程”,以下是关键规范细节:

(1)工具元数据规范

MCP 定义了统一的工具描述格式,比 Function Call 的 JSON Schema 更易读、可维护:

{
  "schemaVersion": "v1", // 协议版本
  "tool": {
    "name": "weather_query", // 工具唯一标识
    "description": "查询指定城市和日期的天气信息", // 工具描述
    "inputSchema": { // 输入参数 schema
      "type": "object",
      "properties": {
        "city": {
          "type": "string",
          "description": "城市名称(如北京、上海)",
          "required": true
        },
        "date": {
          "type": "string",
          "format": "YYYY-MM-DD",
          "description": "查询日期(支持未来7天)",
          "required": true
        },
        "unit": {
          "type": "string",
          "enum": ["celsius", "fahrenheit"],
          "default": "celsius",
          "description": "温度单位"
        }
      }
    },
    "outputSchema": { // 输出参数 schema
      "type": "object",
      "properties": {
        "location": {"type": "string"},
        "temperature": {"type": "string"},
        "unit": {"type": "string"},
        "description": {"type": "string"}
      }
    },
    "errorSchema": { // 错误输出 schema
      "type": "object",
      "properties": {
        "code": {"type": "integer"},
        "message": {"type": "string"},
        "detail": {"type": "object"}
      }
    }
  }
}

(2)通信流程规范

MCP 采用 RPC 风格的通信流程,核心步骤:

  1. 初始化:MCP Client 与 Server 建立连接,Client 调用 list_tools() 获取工具列表;
  2. 工具筛选:Client 根据用户查询,筛选出可能需要的工具(解决 Token 浪费问题);
  3. LLM 推理:Client 将筛选后的工具元信息与用户查询传给 LLM,判断是否调用工具;
  4. 工具调用:LLM 决定调用工具后,Client 按 MCP 格式向 Server 发送调用请求;
  5. 结果返回:Server 执行工具逻辑,返回结果,Client 回传给 LLM;
  6. 生成回复:LLM 整合结果,生成自然语言回复。

(3)数据交互格式规范

  • 通信协议:支持 JSON-RPC 2.0、gRPC 两种方式,默认 JSON-RPC;
  • 编码格式:UTF-8,支持文本、JSON、二进制数据(如图片、文件);
  • 错误码标准:
    • 4xx:客户端错误(参数错误、权限不足);
    • 5xx:服务端错误(工具执行失败、服务不可用);
    • 6xx:协议错误(版本不兼容、格式错误)。

4. MCP 与 Function Call 的核心差异(扩展版)

对比维度 Function Call MCP(Model Context Protocol)
核心定位 LLM 调用工具的实现方案 LLM 与工具交互的标准化协议
跨 LLM 兼容性 差(各厂商自定义) 好(统一协议,适配所有 LLM)
工具描述维护 复杂(JSON Schema 嵌入代码) 简单(独立元数据文件,支持共享)
工具数量扩展性 差(工具增多导致 Token 暴增) 好(支持工具筛选,按需传递)
生态化支持 无(工具无法共享) 有(工具市场、跨平台复用)
开发复杂度 低(快速实现单个工具) 中(需搭建 Server,但后续复用成本低)
错误处理 需手动实现 协议统一处理,Client/Server 各司其职
适用场景 简单工具调用、快速验证 复杂工具生态、多 LLM 适配、企业级应用

三、MCP 实战:从零搭建 MCP Server 与 Client

理论不如实践,本节将用 Python 实现一个“天气查询”的 MCP Server 和 Client,让你直观感受 MCP 的工作流程。

1. 环境准备

  • 依赖库:mcp-python(MCP 官方 SDK)、fastapi(搭建 Server)、requests(HTTP 工具调用);
  • 安装命令:

    pip install mcp-python fastapi uvicorn requests

2. 第一步:搭建 MCP Server(天气查询服务)

MCP Server 负责注册工具、处理调用请求,核心代码如下:

from mcp.server import Server, Tool
from mcp.types import InputSchema, OutputSchema, ErrorSchema
from pydantic import BaseModel
import requests

# 1. 定义工具输入/输出/错误模型
class WeatherInput(BaseModel):
    city: str  # 城市名称
    date: str  # 日期(YYYY-MM-DD)
    unit: str = "celsius"  # 温度单位,默认摄氏度

class WeatherOutput(BaseModel):
    location: str  # 城市
    temperature: str  # 温度
    unit: str  # 单位
    description: str  # 天气描述

class WeatherError(BaseModel):
    code: int  # 错误码
    message: str  # 错误信息
    detail: dict = None  # 错误详情

# 2. 实现天气查询工具逻辑
def query_weather(input_data: WeatherInput) -> WeatherOutput:
    # 模拟调用天气 API(实际场景替换为真实 API)
    api_key = "your_weather_api_key"
    url = f"https://api.weatherapi.com/v1/forecast.json?key={api_key}&q={input_data.city}&dt={input_data.date}"
    response = requests.get(url)
    data = response.json()

    if response.status_code != 200:
        raise ValueError(f"天气查询失败:{data.get('error', {}).get('message', '未知错误')}")

    # 解析返回结果
    forecast = data["forecast"]["forecastday"][0]["day"]
    return WeatherOutput(
        location=input_data.city,
        temperature=str(forecast["avgtemp_c"] if input_data.unit == "celsius" else forecast["avgtemp_f"]),
        unit=input_data.unit,
        description=forecast["condition"]["text"]
    )

# 3. 创建 MCP Server 并注册工具
server = Server()

# 注册天气查询工具
weather_tool = Tool(
    name="weather_query",
    description="查询指定城市和日期的天气信息",
    input_schema=InputSchema(model=WeatherInput),
    output_schema=OutputSchema(model=WeatherOutput),
    error_schema=ErrorSchema(model=WeatherError),
    handler=query_weather  # 工具执行逻辑
)

server.register_tool(weather_tool)

# 4. 启动 MCP Server(基于 FastAPI)
if __name__ == "__main__":
    import uvicorn
    # 以 FastAPI 方式启动,端口 8000
    uvicorn.run(server.fastapi_app, host="0.0.0.0", port=8000)

3. 第二步:搭建 MCP Client(对接 LLM 与 MCP Server)

MCP Client 负责与 Server 通信、筛选工具、对接 LLM,核心代码如下:

from mcp.client import Client
from openai import OpenAI
import json

# 1. 初始化 MCP Client 和 LLM 客户端
mcp_client = Client(base_url="http://localhost:8000")  # 连接 MCP Server
llm_client = OpenAI(api_key="your_openai_key", base_url="https://api.openai.com/v1")

# 2. 工具筛选函数(解决 Token 浪费问题)
def filter_tools(tools, user_query: str) -> list:
    """根据用户查询筛选相关工具(简化版,实际可结合 RAG 优化)"""
    relevant_keywords = ["天气", "温度", "下雨", "晴天", "预报"]
    if any(keyword in user_query for keyword in relevant_keywords):
        return [tool for tool in tools if tool.name == "weather_query"]
    return []

# 3. 核心交互流程
def process_user_query(user_query: str) -> str:
    # 步骤 1:从 MCP Server 获取所有工具
    tools = mcp_client.list_tools()

    # 步骤 2:筛选与用户查询相关的工具
    relevant_tools = filter_tools(tools, user_query)
    if not relevant_tools:
        # 无相关工具,直接调用 LLM 回复
        response = llm_client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[{"role": "user", "content": user_query}]
        )
        return response.choices[0].message.content

    # 步骤 3:将工具元信息转换为 LLM 可理解的格式
    llm_tools = [{
        "type": "function",
        "function": {
            "name": tool.name,
            "description": tool.description,
            "parameters": tool.input_schema.model.schema()["properties"],
            "required": [k for k, v in tool.input_schema.model.schema()["properties"].items() if v.get("required", False)]
        }
    } for tool in relevant_tools]

    # 步骤 4:调用 LLM,判断是否需要工具调用
    llm_response = llm_client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": user_query}],
        tools=llm_tools,
        tool_choice="auto"
    )
    message = llm_response.choices[0].message

    # 步骤 5:如果需要工具调用,执行 MCP Server 调用
    if hasattr(message, "tool_calls") and message.tool_calls:
        tool_call = message.tool_calls[0]
        tool_name = tool_call.function.name
        tool_args = json.loads(tool_call.function.arguments)

        # 调用 MCP Server 工具
        mcp_response = mcp_client.call_tool(tool_name, tool_args)

        # 步骤 6:将工具结果回传给 LLM,生成最终回复
        final_response = llm_client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "user", "content": user_query},
                message.model_dump(),
                {
                    "role": "tool",
                    "name": tool_name,
                    "content": json.dumps(mcp_response.content[0].text)
                }
            ]
        )
        return final_response.choices[0].message.content

    # 无需工具调用,直接返回 LLM 回复
    return message.content

# 4. 测试交互
if __name__ == "__main__":
    user_query = "查询 2025-10-01 上海的天气"
    result = process_user_query(user_query)
    print("最终回复:", result)

4. 实战效果说明

  • 运行 MCP Server 后,Client 可通过 list_tools() 获取天气工具;
  • 用户查询包含“天气”关键词时,自动筛选并传递该工具给 LLM;
  • LLM 生成工具调用参数,Client 通过 MCP 协议调用 Server,获取天气数据;
  • 最终 LLM 整合结果,返回自然语言回复,整个过程完全标准化。

5. 关键优化点(解决原文提到的 Token 浪费问题)

  • 工具筛选:仅传递与用户查询相关的工具,减少 Token 消耗;
  • 标准化调用:无论后续替换 LLM(如从 GPT-3.5 切换到 Claude),只需修改 LLM 客户端配置,无需改动 MCP 交互逻辑。

四、MCP 的生态现状与核心价值

1. 支持 MCP 的核心玩家

(1)LLM 厂商

  • 官方支持:Claude 3 全系列、GPT-4/5、Qwen-2、Llama 3;
  • 间接支持:通过 MCP Client 适配,所有支持 Function Call 的 LLM 均可接入 MCP 生态。

(2)开发工具

  • IDE 集成:Cursor、Claude Desktop、Trae(AI 编程工具);
  • 框架支持:LangChain、LlamaIndex 已集成 MCP 协议,可直接调用 MCP Server。

(3)工具市场

  • Anthropic MCP Hub:官方工具市场,提供天气、翻译、数据库等常用 MCP Server;
  • 第三方市场:GitHub 上已有上百个开源 MCP Server,覆盖办公、开发、数据分析等场景。

2. MCP 的 3 大核心价值

(1)降低开发成本:一次开发,多端复用

  • MCP Server 开发一次,可被所有支持 MCP 的 LLM、Client 调用;
  • 无需为不同 LLM 适配工具,迁移成本从 80% 降至 5%。

(2)激活工具生态:从“孤岛”到“集市”

  • 工具元信息标准化,支持跨团队、跨项目共享;
  • 工具开发者可专注功能实现,无需关心 LLM 适配,加速工具生态繁荣。

(3)增强系统稳定性:解耦带来的弹性

  • LLM 与工具解耦,替换 LLM 或工具时,不影响整体系统;
  • 中间层统一处理错误、权限、速率限制,减少重复开发。

3. MCP 尚未解决的问题与优化方案

原文提到 MCP 未完全解决所有问题,本节补充具体优化方案:

(1)工具质量参差不齐

  • 问题:工具市场缺乏质量审核,部分 MCP Server 功能简陋、稳定性差;
  • 解决方案:建立工具评分机制、官方认证体系,Client 可根据评分筛选工具。

(2)Token 浪费仍存在(筛选不精准)

  • 问题:简单的关键词筛选可能遗漏相关工具,或误选无关工具;
  • 解决方案:结合 RAG 技术,将工具描述嵌入向量数据库,根据用户查询的语义相似度筛选工具。

(3)多工具协同复杂

  • 问题:MCP 仅解决单个工具调用的标准化,多工具协同(如“查天气→订机票→订酒店”)仍需手动处理;
  • 解决方案:与 Agent 结合,让 Agent 基于 MCP 协议实现多工具的自动调度。

五、MCP 与相关技术的结合场景

MCP 不是孤立的协议,它能与 RAG、Agent、向量数据库等技术结合,发挥更大价值:

1. MCP + RAG:智能工具筛选与知识增强

  • 用 RAG 管理工具元信息,用户查询时通过语义检索筛选工具;
  • 工具返回结果后,结合 RAG 补充相关知识,提升 LLM 回复质量。

2. MCP + Agent:标准化的 Agent 工具调用

  • Agent 负责任务拆解和工具调度,MCP 负责工具调用的标准化执行;
  • 无论 Agent 对接哪个 LLM,都通过 MCP 调用工具,实现 Agent 的跨 LLM 兼容。

3. MCP + 向量数据库:工具能力的语义检索

  • 将工具的功能描述、适用场景嵌入向量数据库;
  • 用户查询时,先检索最匹配的工具,再通过 MCP 调用,提升工具调用精准度。

六、常见误区与避坑指南

1. 误区 1:MCP 是 Function Call 的替代者

  • 纠正:MCP 是 Function Call 的“标准化封装”,而非替代者;MCP 底层仍依赖 Function Call 实现 LLM 与工具的交互,只是统一了交互规范。

2. 误区 2:所有场景都需要 MCP

  • 纠正:简单场景(单个 LLM + 1-2 个工具)无需 MCP,直接用 Function Call 更高效;MCP 适合多 LLM、多工具、需长期维护的复杂场景。

3. 误区 3:MCP 会增加系统复杂度

  • 纠正:短期搭建 MCP Server 确实增加少量开发成本,但长期来看,标准化带来的复用、迁移、维护成本降低,远大于初期投入。

4. 避坑指南

  • 优先使用成熟的 MCP SDK(如 Python/Go/JS 官方 SDK),避免手动实现协议;
  • 开发 MCP Server 时,严格遵循工具元数据规范,确保兼容性;
  • 客户端必须实现工具筛选逻辑,否则会出现 Token 浪费问题;
  • 生产环境需为 MCP Server 配置监控、重试、熔断机制,避免单点故障。

七、总结:MCP 是 AI 生态的“基础设施”

MCP 的核心价值不在于“让 LLM 更聪明”,而在于“让 LLM 与工具的交互更高效、更标准、更生态化”。它就像 AI 世界的 HTTP 协议,看似简单,却为整个生态的繁荣奠定了基础。

随着 MCP 生态的完善,未来我们将看到:

  • 工具开发者:专注功能实现,一次开发即可接入所有 LLM;
  • 应用开发者:无需关心 LLM 与工具的适配,专注业务逻辑;
  • 普通用户:像装插件一样,为 LLM 添加各类工具,打造个性化 AI 助手。

对于开发者而言,现在学习 MCP 不是提前布局,而是应对 AI 工具化趋势的必备技能。无论是搭建企业内部的 AI 工具平台,还是开发面向公众的 AI 应用,MCP 都将成为不可或缺的标准化方案。

如果你正在搭建 AI 工具相关项目,不妨尝试用 MCP 规范工具交互——初期的一点投入,终将在后续的维护和扩展中得到丰厚回报。

除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/ren-gong-zhi-neng/4568

推荐阅读

  • 从技术本质到生态关联,一文吃透 AIGC、RAG、Agent、Function Call、MCP
  • AI Agent 扩展双雄:MCP 与 Agent Skill 深度拆解——从设计哲学到实战落地
  • 6款核心MCP协议工具让AI深度融入业务,告别“纸上谈兵”
  • 企业级自动化 Agent 架构深析:Prompt 演进驱动的智能工作流落地
  • LangChain 1.0 智能体实战:MCP 协议赋能工具标准化调用(从开发到落地)
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: AI Function Call MCP
最后更新:2025年11月10日
相关文章
  • n8n深度解析:可视化编排与灵活拓展的双引擎驱动2025年12月5日
  • 从入门到精通:Ollama 本地大模型全攻略(含 UI 界面、多语言调用、进阶优化)2025年11月5日
  • AI“说谎”“编造事实”的原因详解2025年12月31日
  • 从技术本质到生态关联,一文吃透 AIGC、RAG、Agent、Function Call、MCP2025年10月17日
  • AI能写代码,却造不出软件:软件工程的核心竞争力从未改变2025年11月6日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复

文章评论

还没有评论,快来抢沙发吧~

Your time is limited, so don't waste it living someone else's life. Don't be trapped by dogma -- which is living with the results of other people's thinking. Don't let the noise of other's opinions drown out your own inner voice. And most important, have the courage to follow your heart and intuition. They somehow already know what you truly want to become. Everything else is secondary.

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
每日早报 · 2026年8月18日 写了一个订阅每日新闻的WP插件 每日早报 · 2026年8月17日 每日早报 · 2026年8月16日 每日早报 · 2026年8月15日 每日早报 · 2026年8月14日
给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能Kratos+ v1.1.16版本更新说明AI时代,个人技术博客的出路在哪里?增加了两套复古皮肤-牛皮纸、千禧网页这个域名注册整整十年了,十年时间,真快啊Kratos+ v1.1.14版本更新说明
CC知识共享协议各协议内容解释 深度解析多级缓存架构:从设计到落地,彻底解决数据一致性难题 从零开始入门 K8s | Kubernetes 网络概念及策略控制 AI原生数据库新标杆:seekdb深度解析,轻量架构与混合搜索的双重革命 结合Apollo配置中心实现日志级别动态配置 使用RocketMQ时,服务启动过程中,Consumer在服务未启动时消费消息问题处理
最近评论
李锋镝 发布于 3 小时前(08月18日) 给主题加了个功能,可以在RSS中排除指定分类,哈哈哈
李锋镝 发布于 4 小时前(08月18日) :8: 喜欢就好
不凡 发布于 14 小时前(08月17日) 哇,配色真好看,观感很舒服! :52:
李锋镝 发布于 17 小时前(08月17日) 哈哈哈,那个插件我之前也用过,那个内容都是固定的,我这个每天不同的时间拉取数据也不一样,等我研究研究...
Hary 发布于 17 小时前(08月17日) emmm大哥,这样每天输出到博客,然后别人订阅rss全是这个,有点不太好,之前很流行一段时间每天60...
标签聚合
Redis MQ JVM MySQL 多线程 ElasticSearch 日常 Claude IDEA AI 分布式 SpringBoot SQL AI编程 K8s 数据库 WordPress JAVA 架构 Spring
友情链接
  • 瓦匠个人小站
  • 若梦博客
  • 九仞之行
  • 老张博客
  • 知向前端
  • 哥斯拉
  • Honesty
  • 韩情脉脉
  • 皮皮社
  • Serendipity
  • Mr.Sun的博客
  • 韩小韩博客
  • 志文工作室
  • 懋和道人
  • 临窗旋墨
  • 搬砖日记
  • 林羽凡
  • 彬红茶日记
  • 蜗牛工作室
  • sssr7844的博客

COPYRIGHT © 2026 lifengdi.com. ALL RIGHTS RESERVED.

正在博友圈履约中

域名年龄

Theme Kratos+ By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号