格局打开!Function Calling只是“点”,MCP是“线”,A2A才是“面”!一文讲透AI交互的升维思考!

单纯的大模型是一个只会聊天的“学霸”,而配上Agent的大模型将是“万能助手”。你让它“关掉客厅的灯”,它不再只是礼貌地回答你“好的,已为您关闭客厅的灯”,而是真的动手把灯关了。

在这场关于智能体(AI Agent)的进化革命中,背后隐藏着三个关键“武器”:MCP(Model Context Protocol)、Function Calling和A2A(Agent to Agent protocol)。简单来说,MCP、Function Calling和A2A分别代表三种AI Agent和外界不同的协作方式:

  1. MCP

    AI Agent 与 AI Tools 之间的工具发现、注册和调用协议。注意:MCP并不会和LLM直接交互,不要被名字中的Model误导了,看完文章你就明白了。

  2. Function Calling

    AI Agent 与 AI Model 之间的工具调用协议

  3. A2A

    AI Agent 与 AI Agent 之间的发现与任务分配协议

本文会深入解析MCP、Function Calling和A2A的协议细节,揭示其背后的本质,以便我们在工作中可以更好地开发、使用Agent技术。

1. AI Agent

首先,让我们了解一下什么是AI Agent(人工智能体)?AI Agent 是一种能自主感知环境、自主规划并执行动作,以完成特定任务的智能系统。关于LLM和Agent的关系,有个形象的比喻——LLM是AI Agent的“大脑”,而AI Agent是LLM的“身体”。

  • 没有Agent的LLM

    能力被禁锢在对话和文本生成中,是“思想的巨人,行动的矮子”。

  • 没有LLM的Agent

    会退化为一个僵硬的、按固定流程行事的自动化脚本,缺乏应对不确定性的智慧和灵活性。

AI Agent区别于传统的SOP(Standard Operation Procedure),workflow在于,传统的方式是基于规则的自动化,有明确的、预设的“如果-那么”规则。而AI Agent是基于目标的自主性,能自主规划、执行、调整。能感知环境变化,动态调整策略。能处理模糊、不确定的任务。其本质在于大模型本身所具备的强大语言理解,推理和泛化能力。

一个完整的Agent除了大脑(LLM)外,还需要:

  • 感知模块

    “眼睛和耳朵”,通过API、搜索引擎、文件系统等获取外部信息。

  • 工具集

    “手和脚”,可以调用各种函数、API、软件等来影响现实。这就是Function Calling、MCP等技术的用武之地。

  • 记忆模块

    “工作日志和经历”,通过向量数据库或记忆流记录过去的历史,用于长期规划和参考。

接下来,让我们一起看看AI Agent是如何用MCP、Function Calling和A2A技术让大模型从“思想的巨人,行动的矮子”变成“万能助手”的。

2. MCP协议

为了更好的理解MCP(Model Context Protocol,模型上下文协议),我们需要先实现一个特殊的Agent,它能自动记录MCP client和server之间的通信内容。通过解析通信内容,无需多言,你就能明了MCP的真谛。

2.1 实现一个Agent

1)准备工作

  1. 安装Cline Agent,目前只有VS Code的插件
  2. 安装Python,以及uv工具(Python包安装器和解析器),设置repository源,在环境变量中,设置UV_INDEX_URL=https://repo.huaweicloud.com/repository/pypi/simple/
  3. 可用的大模型服务,比如openAI, deepseek,openrouter等

2)创建python项目

mkdir mcpserver cd mcpserver# 初始化项目 uv init# 创建虚环境uv sync# 安装mcpuv add mcp# 激活虚拟环境(Windows).venv\Scripts\activate

3)创建MCP Server

这个MCP Server很简单,模拟一个获取天气信息的工具。其代码如下:

from  mcp.server.fastmcp import FastMCP# 一、创建FastMCP类mcp = FastMCP("获取天气信息")# 二、自定义工具(Stdio 模式)@mcp.tool("获取天气信息")defget_forecast(city) -> str:"""    获取天气信息     参数:    city (str): 城市名称    返回:    city_forecast : 当前城市的天气信息    """# 这里只是简单的返回一个Mock,真实场景会调用天气APIreturn  city + "明天有大暴雨!"# 三、初始化MCP Serverif __name__ == '__main__':# printprint("MCP Server is running...")    mcp.run(transport='stdio')print("MCP exist")

除了上面这个MCP Server之外,我们还需要一个日志记录工具mcp_logger.py (https://github.com/MarkTechStation/VideoCode/) 用来截获mcp client和mcp server之间的通信(仅限于stdio方式),这个工具可以把通信内容写入到当前目录下的mcp_io.log日志文件

4)在Cline中配置MCP Server

1)在VSCode的Cline插件上点击“Configure MCP Servers”
2)在配置文件中写入启动mcp server的信息,这条配置的意思是:通过“python mcp_logger.py uv run mcp_weather_server.py”命令来运行MCP Server
3)当看到配置界面的get_forcast工具为绿色时,表示MCP Server已经配置并启动成功了

5)验证Agent使用工具

当我们在任务窗口输入“杭州明天的天气如何”,会发现Cline Agent在大模型的帮助下,会主动调用get_forecast工具,然后成功完成任务。

此时查看mcp_io.log,会发现它记录了完整的MCP Client 和 MCP Server之间的通信内容。

== 1. 初始化阶段 ==MCP Client发送:{"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"CodeMate","version":"25.2.200"}},"jsonrpc":"2.0","id":0}MCP Server发送:{"jsonrpc":"2.0","id":0,"result":{"protocolVersion":"2025-06-18","capabilities":{"experimental":{},"prompts":{"listChanged":false},"resources":{"subscribe":false,"listChanged":false},"tools":{"listChanged":false}},"serverInfo":{"name":"获取天气信息","version":"1.16.0"}}}MCP Client发送:{"method":"notifications/initialized","jsonrpc":"2.0"}== 2. 工具注册阶段 ==MCP Client发送:{"method":"tools/list","jsonrpc":"2.0","id":1}MCP Server发送:{"jsonrpc":"2.0","id":1,"result":{"tools":[{"name":"获取天气信息","description":"\n    获取天气信息\n\n     参数:\n    city (str): 城市名称\n\n    返回:\n    city_forecast : 当前城市的天气信息\n    ","inputSchema":{"properties":{"city":{"title":"city","type":"string"}},"required":["city"],"title":"get_forecastArguments","type":"object"},"outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"get_forecastOutput","type":"object"}}]}}MCP Client发送:{"method":"resources/list","jsonrpc":"2.0","id":2}MCP Server发送:{"jsonrpc":"2.0","id":2,"result":{"resources":[]}}MCP Client发送:{"method":"resources/templates/list","jsonrpc":"2.0","id":3}MCP Server发送:{"jsonrpc":"2.0","id":3,"result":{"resourceTemplates":[]}}== 3. 工具调用阶段 ==MCP Client发送:{"method":"tools/call","params":{"name":"获取天气信息","arguments":{"city":"杭州"}},"jsonrpc":"2.0","id":4}MCP Server发送:{"jsonrpc":"2.0","id":4,"result":{"content":[{"type":"text","text":"杭州明天有大暴雨!"}],"structuredContent":{"result":"杭州明天有大暴雨!"},"isError":false}}

2.2 解析MCP协议

通过日志我们可以看到,MCP通信内容是基于JSON-RPC协议的,JSON-RPC是我见过最简洁的协议,就像其口号说的,simple is better。

我们把日志转换成时序图,不难发现,整个通信过程分为3个阶段:

  1. 初始化阶段

    也就是MCP Client和 MCP Server的握手过程。通常,MCP Client是以内置组件的形式存在于Agent内部。

  2. 工具注册阶段

    MCP Client会询问MCP Server,你有哪些可用的tools(工具),resources(资源)、templates(模板)。MCP Server会按照规定的格式返回对应的能力描述。

  3. 工具调用阶段

    当大模型需要调用工具时,会告诉Agent,你需要用{"city":"杭州"}这个参数,去调用下get_forecast这个工具。MCP Client知道这个工具是“获取天气信息”这个MCP Server提供的,调用即可。

这就是MCP,其本质就是支持AI Agent用一种通用的方式发现、注册、调用外部的工具,从而协助LLM完成用户任务。wait,大模型怎么知道要在什么时候调用工具,以及用什么方式调用工具呢?

3. Function Calling (大模型为什么知道要调用哪个工具)

当我问“杭州明天的天气如何”的时候,大模型为什么知道要调用get_forecast这个工具呢?实际上,这就是大模型的Function Calling,而这个能力需要我们通过prompt的方式来教大模型。这个能力正是大模型区别传统SOP的关键:用非结构化的“柔性”,完美克服了传统规则的“刚性”

我们可以通过查看Cline的源码来理解Agent是如何“指导”大模型进行Function Calling的。你可以在此查看:Cline的完整system prompt(https://github.com/cline/cline),整个prompt有600行,将近50K大小,总共13000个字符,会消耗5000个tokens。这就是为什么很多人吐槽Cline Agent烧Token的原因:)。内容比较多,我们截取里面部分内容分析一下,你就明白为什么大模型有能力调用工具了。

3.1 身份声明

首先给模型带个高帽子,你是个软件高手!因为Cline是coding agent,当然要如此声明。可能还有个附加好处,直接激活MoE,帮服务端省点电费。

You are Cline, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices.

3.2 能力声明

亮明身份之后,还要声明所具备的能力(capabilities),即告诉大模型:
1)你能推理任务,并且step-by-step的使用工具,完成任务。这是客户端能变成Agent的关键,即让模型follow ReAct(Reasoning+Acting)模式,处理用户任务。
2)你能使用工具,且会用XML的格式与我沟通。不同的Agent会选择不同的格式,Cline是用XML,也可以是JSON。

TOOL USEYou have access to a set of tools that are executed upon the user's approval. You can use one tool per message, and will receive the result of that tool use in the user's response. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use.# Tool Use FormattingTool use is formatted using XML-style tags. The tool name is enclosed in opening and closing tags, and each parameter is similarly enclosed within its own set of tags. Here's the structure:<tool_name><parameter1_name>value1</parameter1_name><parameter2_name>value2</parameter2_name>...</tool_name>

3.3 系统工具能力

Cline作为coding agent,已经内置了一些工具,主要是和写代码相关的。包括execute_command(执行命令),read_file(读文件),write_to_file(写文件)等。这里有一个工作目录(working directory)的概念,为了安全性考虑,文件操作只被允许在working directory下面。因此,在实际使用Cline之前,我们需要搞清楚当前的working directory是在哪里。

## execute_command## read_file## list_files## write_to_fileDescription: Request to write content to a file at the specified path. If the file exists, it will be overwritten with the provided content. If the file doesn't exist, it will be created. This tool will automatically create any directories needed to write the file.Parameters:- path: (required) The path of the file to write to (relative to the current working directory ${cwd.toPosix()})- content: (required) The content to write to the file. ALWAYS provide the COMPLETE intended content of the file, without any truncation or omissions. You MUST include ALL parts of the file, even if they haven't been modified.Usage:<write_to_file><path>File path here</path><content>Your file content here</content></write_to_file>

3.4 MCP扩展工具能力

除了Cline的内建工具之外,当然少不了用户自定义的扩展工具,比如我们案例中的get_forecast工具,之所以我们的Agent会调用MCP Server的get_forecast工具“获取天气信息”。正是因为我们在2.1章节中注册了get_forecast MCP工具。对于Cline Agent而言,所谓的工具注册,就是在Cline发送给大模型的prompt中加入了如下的功能描述信息。这些提示词和内建工具的提示词类似,都是在“指导”大模型,教它有这些工具的能力(capabilities),从而实现Function Calling。

# Connected MCP ServersWhen a server is connected, you can use the server's tools via the `use_mcp_tool` tool, and access the server's resources via the `access_mcp_resource` tool.## weather (python mcp_logger.py uv run mcp_weather_server.py)### Available Tools- get_forecast: 获取天气信息Args: city: 城市名称Input Schema:{  "type": "object",  "properties": {    "city": {      "title": "city",      "type": "string"    }  },  "required": [    "city"  ],  "title": "get_forecastArguments"}

3.5 完成任务

当完成所有的subtask,迭代执行完tools,达成任务目标。大模型需要通过<attempt_completion>通知Agent任务完成,并在<result>中呈现最终任务执行结果,如果需要demonstrate(演示)的话,也可以有演示的CLI,但这是可选的。

## attempt_completionDescription: After each tool use, the user will respond with the result of that tool use, i.e. if it succeeded or failed, along with any reasons for failure. Once you've received the results of tool uses and can confirm that the task is complete, use this tool to present the result of your work to the user. Optionally you may provide a CLI command to showcase the result of your work. The user may respond with feedback if they are not satisfied with the result, which you can use to make improvements and try again.IMPORTANT NOTE: This tool CANNOT be used until you've confirmed from the user that any previous tool uses were successful. Failure to do so will result in code corruption and system failure. Before using this tool, you must ask yourself in <thinking></thinking> tags if you've confirmed from the user that any previous tool uses were successful. If not, then DO NOT use this tool.Parameters:- result: (required) The result of the task. Formulate this result in a way that is final and does not require further input from the user. Don't end your result with questions or offers for further assistance.- command: (optional) A CLI command to execute to show a live demo of the result to the user. For example, use \`open index.html\` to display a created html website, or \`open localhost:3000\` to display a locally running development server. But DO NOT use commands like \`echo\` or \`cat\` that merely print text. This command should be valid for the current operating system. Ensure the command is properly formatted and does not contain any harmful instructions.Usage:<attempt_completion><result>Your final result description here</result><command>Command to demonstrate result (optional)</command></attempt_completion>

4. Context Engieering

通过上文对Cline System Prompt的解读,你会发现,Agent的本质就是一个精心设计的Prompt。因为大模型本质上是“上下文学习者”:它们没有长期的记忆,每次交互都是独立的。你提供的上下文就是它此次交互的全部世界。

因此,要想实现完整的Agent功能,在传递给LLM的信息中,除了System prompt,user message之外,还要包括Docs(领域知识,工作对象等),工作记忆(Message history)等。把这些内容都汇总起来就是LLM需要的Context(上下文),而这个汇总(精炼、压缩)的工作就叫Context Engineering (https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents)
这也是Context Engineering和Prompt Engineering的主要区别。

回过头来,你应该就能理解我在开篇说的,MCP是和模型无关的协议。MCP只是一个为了Model的Context而服务的Protocol。它既不和Model交互,也和Model无关。它只是给Context Engineering服务的一环。

5. A2A协议

Agent的本质是Context,像Cline这样的Agent,通过MCP扩展的工具能力使用说明,都是放在prompt里,工具不多还好,如果很多,可能会撑爆Context Window,即使不会撑爆,过长的Context,也会引发Context Rot (https://research.trychroma.com/context-rot) 问题。这和我们人类的认知类似,信息越多,越难focus,越难抓住重点。

关于如何提供有效的,长度适中的Context,是Contex Engineering的关键。在Context Engineering一文中有详细阐述。常用的技术有Compaction(压缩),Structured Note-taking(结构化笔记),以及Multi-Agent architectures(多Agent架构)。所谓的Multi-Agent,就是从Agent层面做分而治之,从而控制单个Agent的Context长度。

而多agent之间的协作,就涉及到A2A协议,即Agent to Agent协议。

A2A是google开源的开放协议。其包含如下核心概念:

概念描述
Agent Card(卡片)位于 /.well-known/agent.json,描述能力、技能、端点 URL 和认证要求,用于发现
A2A Server(服务器)实现协议方法,管理任务执行
A2A Client(客户端)发送请求如 tasks/sendtasks/sendSubscribe,消费 A2A 服务
Task(任务)核心工作单位,有唯一 ID,状态包括 submittedworking
Message(消息)通信单位,角色为 useragent,包含 Parts
Parts(部分)内容单位,包括 TextPartFilePartDataPart
Artifacts(工件)任务输出,包含 Parts
流式传输使用 SSE 事件更新长期任务状态
推送通知通过 webhook 发送更新

和MCP一样,A2A采用的也是JSON-RPC协议,其工作机制也很类似,主要包括Agent的发现、注册和使用,通信细节不再赘述,大致流程如下:

  1. 发现

    客户端从 /.well-known/agent.json 获取 Agent Card,了解智能体的能力。

  2. 启动

    客户端发送任务请求:

  3. 处理

    服务器处理任务,可能涉及流式更新或直接返回结果。

  4. 交互(可选)

    若任务状态为 input-required,客户端可发送更多消息,使用相同 Task ID 提供输入。

  5. 完成

    任务达到终端状态(如 completed、failed 或 canceled)。

总结

单纯的大模型,只能对话和生成文本,是“思想的巨人,行动的矮子”。配上Agent的大模型,能感知环境、使用工具、执行任务,成为“万能助手”。AI Agent的核心在于Context Engineering,背后需要依赖三大关键技术:MCP、Function Calling 和 A2A。这三项技术,并不是有你无我的排斥关系,而是可以通力协作的互补关系。大模型通过 Prompt 学习工具使用,实现非结构化任务处理,克服传统规则的“刚性”,使得AGI(Artificial General Intelligence,通用人工智能)成为可能。

如何高效转型Al大模型领域?

作为一名在一线互联网行业奋斗多年的老兵,我深知持续学习和进步的重要性,尤其是在复杂且深入的Al大模型开发领域。为什么精准学习如此关键?

  • 系统的技术路线图:帮助你从入门到精通,明确所需掌握的知识点。
  • 高效有序的学习路径:避免无效学习,节省时间,提升效率。
  • 完整的知识体系:建立系统的知识框架,为职业发展打下坚实基础。

AI大模型从业者的核心竞争力

  • 持续学习能力:Al技术日新月异,保持学习是关键。
  • 跨领域思维:Al大模型需要结合业务场景,具备跨领域思考能力的从业者更受欢迎。
  • 解决问题的能力:AI大模型的应用需要解决实际问题,你的编程经验将大放异彩。

以前总有人问我说:老师能不能帮我预测预测将来的风口在哪里?

现在没什么可说了,一定是Al;我们国家已经提出来:算力即国力!

未来已来,大模型在未来必然走向人类的生活中,无论你是前端,后端还是数据分析,都可以在这个领域上来,我还是那句话,在大语言AI模型时代,只要你有想法,你就有结果!只要你愿意去学习,你就能卷动的过别人!

现在,你需要的只是一份清晰的转型计划和一群志同道合的伙伴。作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

在这里插入图片描述

MCP(Multi-Component Protocol)与Function Calling是两种在AI Agent系统中用于处理工具调用的技术,但它们在设计理念、实现方式以及应用场景上有显著的区别。 Function Calling是一种由模型直接调用特定函数的能力,通常用于执行具体的任务。模型通过学习或预定义的方式了解如何使用这些函数,并根据输入请求直接调用相应的功能[^2]。这种方式的优在于其实现简单且直接,适用于少量工具的情况。然而,当工具数量增加时,Function Calling的局限性开始显现,比如需要为每个新工具编写注册逻辑,护成本较高,且缺乏统一的接入标准,导致不同模型之间工具的兼容性差[^3]。 相比之下,MCP提供了一种更加标准化和灵活的解决方案。它不仅定义了一套统一的工具接入协议,还引入了上下文感知和调度机制,使得AI Agent能够更智能地管理和使用工具。MCP的设计允许工具的一次注册即可在多个环境中复用,同时提供了安全隔离和权限配置等功能,增强了系统的安全性与通用性[^4]。这意味着,即使更换了模型,只要遵循相同的MCP协议,原有的工具仍然可以被有效利用,大大提高了工具的可移植性和系统的扩展性[^1]。 在实际应用中,MCPFunction Calling可以协同工作。MCP负责整合各种工具资源,而Function Calling则专注于具体功能的执行。这种分工不仅减轻了模型直接处理复杂工具调用的压力,还促进了不同组件之间的高效协作。 ### 示例代码 以下是一个简单的示例,展示了如何使用Python实现一个基本的Function Calling机制,以及如何通过MCP协议来调用相同的工具。 #### Function Calling 示例 ```python def add(a, b): return a + b def subtract(a, b): return a - b # 模拟模型决定调用哪个函数 def call_function(func_name, *args): if func_name == 'add': return add(*args) elif func_name == 'subtract': return subtract(*args) else: raise ValueError("Unknown function") result = call_function('add', 5, 3) print(result) # 输出: 8 ``` #### MCP 协议调用示例 ```python class Tool: def __init__(self, name, function): self.name = name self.function = function class MCPClient: def __init__(self): self.tools = {} def register_tool(self, tool): self.tools[tool.name] = tool.function def invoke_tool(self, tool_name, *args): if tool_name in self.tools: return self.tools[tool_name](*args) else: raise ValueError("Tool not found") # 创建MCP客户端实例并注册工具 client = MCPClient() client.register_tool(Tool('add', lambda a, b: a + b)) client.register_tool(Tool('subtract', lambda a, b: a - b)) # 调用工具 result = client.invoke_tool('add', 5, 3) print(result) # 输出: 8 ``` ### 总结 综上所述,虽然Function CallingMCP都能实现工具调用,但MCP以其标准化、灵活性及安全性方的优势,更适合处理大规模和复杂的工具管理需求。而Function Calling则因其简单直接,在处理少量工具时依然具有一定的实用性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值