【MCP】详细了解MCP协议:和function call的区别何在?如何使用MCP?

【MCP】详细了解MCP协议:和function call的区别何在?如何使用MCP?

本文介绍了MCP大模型上下文协议的的概念,并对比了MCP协议和function call的区别,同时用python sdk为例介绍了mcp的使用方式。

1. 什么是MCP?

官网:https://modelcontextprotocol.io/introduction

2025年,Anthropic提出了MCP协议。MCP全称为Model Context Protocol,翻译过来是大模型上下文协议。这个协议的主要为AI大模型和外部工具(比如让AI去查询信息,或者让AI操作本地文件)之间的交互提供了一个统一的处理协议。我们常用的USB TypeC接口(USB-C)统一了USB接口的样式,MCP协议就好比AI大模型中的USB-C,统一了大模型与工具的对接方式。

MCP协议采用了C/S架构,也就是服务端、客户端架构,能支持在客户端设备上调用远程Server提供的服务,同时也支持stdio流式传输模式,也就是在客户端本地启动mcp服务端。只需要在配置文件中新增MCP服务端,就能用上这个MCP服务器提供的各种工具,大大提高了大模型使用外部工具的便捷性。

image.png

MCP是开源协议,能让所有AI厂商、AI工具都将MCP集成到自己的客户端中,从而扩大MCP的可用面。毕竟只有用的人越多,协议才能不断发展,不断变得更好。

2. 了解function call

在MCP没有出来之前,我们的AI Agent开发如果想调用外部工具需要针对不同的AI大模型SDK编写不同的代码,其中最为常用的是openai提供的function call的处理逻辑。

本小节参考博客:

2.1. function call demo

2.1.1. 配置工具,AI提供参数

当我们调用 OpenAI Chat Completions 接口时,可以通过tools参数传入可供使用的外部工具。这个工具的调用中就包含了工具的作用,工具需要传入的参数,以及参数的释义。其中tool_choice字段设置为auto代表让大模型自动选择tools,设置为none时不会调用外部工具。

{ "tool_choice":"auto","messages":[{ "role":"system","content":"你是一个天气查询助手"},{ "role":"user","content":"帮我查询上海的天气"}],"tools":[{ "type":"function","function":{ "name":"get_weather","description":"获取指定城市的天气","parameters":{ "type":"object","properties":{ "city":{ "type":"string","description":"城市名"}},"required":["city"],}}}]}

对应的python openai代码如下,我们将tools部分放入一个包含dict的list,作为create函数的tools参数即可。同时tool_choice传入auto代表自动选择工具。这里我用了硅基流动提供的Qwen2.5模型作为演示,运行下面这个代码需要修改api_key为正确值。

import openai # 1.75.0import json # 后续会用到jsondefmain(): client = openai.OpenAI( api_key="xxxxx", base_url="https://api.siliconflow.cn/v1") tools =[{ "type":"function","function":{ "name":"get_weather","description":"获取指定城市的天气","parameters":{ "type":"object","properties":{ "city":{ "type":"string","description":"城市名"}},"required":["city"],}}}] res = client.chat.completions.create(model="Qwen/Qwen2.5-32B-Instruct", messages=[{ "role":"system","content":"你是一个天气查询助手"},{ "role":"user","content":"帮我查询上海的天气"}], tools=tools, tool_choice="auto")print("content:",res.choices[0].message.content)print("tools:",res.choices[0].message.tool_calls)print("message:", res.choices[0].message.to_dict())

运行程序,发出请求后,大模型就会根据用户提出的问题和提供的tools,来为这个tools编写需要提供的参数。此时content会是空,不会输出内容,tool_calls中会包含调用的工具和参数。

❯ uv run main.py content: tools: [ChatCompletionMessageToolCall(id='01964be6e485603d6a2a0acbbc7eba91', function=Function(arguments='{"city": "上海"}', name='get_weather'), type='function')] message: {'content': '', 'role': 'assistant', 'tool_calls': [{'id': '01964be6e485603d6a2a0acbbc7eba91', 'function': {'arguments': '{"city": "上海"}', 'name': 'get_weather'}, 'type': 'function'}]} 

对应如下json格式响应,包含了我们的参数

"message":{ "role":"assistant","content":"","tool_calls":[{ "id":"01964be6e485603d6a2a0acbbc7eba91","type":"function","function":{ "name":"get_weather","arguments":"{\n \"city\": \"上海\"\n}"}}]}
2.1.2. 调用工具并让AI二次处理

随后,我们就可以根据这个大模型返回的参数来调用我们的函数,并得到函数的返回结果,再次与大模型进行对话。此时需要按下面的方式维护对话上下文,首先需要将第一次请求AI返回的结果插入到上下文中("role": "assistant"的json字符串),然后再插入工具调用的数据,格式如下:

{ "role":"tool",

Read more

告别盲区:Superpowers 如何赋能你的 AI 编程助手,实现高效、规范的软件开发?

告别盲区:Superpowers 如何赋能你的 AI 编程助手,实现高效、规范的软件开发? 在软件开发的浩瀚宇宙中,人工智能正日益成为我们不可或缺的伙伴。然而,仅仅拥有一个强大的 AI 编程助手还不够,如何确保它能始终遵循最佳实践、输出高质量代码,并与我们无缝协作,这仍然是一个挑战。今天,我们将深入探讨一个备受瞩目的 GitHub 项目——obra/superpowers,一个旨在为你的 AI 编码代理提供“超能力”的智能技能框架和软件开发方法论。 obra/superpowers 不仅仅是一个工具库,它是一套完整的、基于可组合“技能”构建的软件开发工作流。它为 AI 代理注入了系统性的思维和严谨的开发流程,让你的助手不再只是盲目地写代码,而是像一位经验丰富的工程师一样,有条不紊地完成任务。目前,该项目已获得超过 40,000 颗星,足见其在开发者社区中的影响力和认可度。 为什么我们需要 Superpowers? 对于初级开发者、

By Ne0inhk
2026年 Trae 收费模式改变 —— AI 编程“免费午餐”终结后的生存法则

2026年 Trae 收费模式改变 —— AI 编程“免费午餐”终结后的生存法则

关键词:Trae, Cursor, AI 编程成本, Token 计费, Agent 模式, 职业转型 大家好,我是飞哥!👋 2026年,AI编辑器Trae 也将收费模式改为按 Token 收费。 有些开发者开始动摇:“AI 编辑器越来越贵,是不是应该放弃使用,回归纯手写代码?” 对于用户来说,这无疑是一次涨价。但在飞哥看来,这次涨价背后释放了两个非常关键的信号: 1. AI 技术已进入稳定成熟期: 厂商不再需要通过“免费/低价补贴”来换取用户数据进行模型迭代。产品已经足够成熟,有底气接受市场真实定价的检验。 2. 倒逼用户进化,优胜劣汰: 涨价是一道筛子。它在要求用户大幅提升自己的 AI 使用水平(如 Prompt 技巧、Context 管理)。 * 低级使用者(只会问“怎么写代码”

By Ne0inhk

它不止写代码,还能教你写“好”代码:飞算JavaAI最佳实践优化器实测

一、一次例行的项目“体检” 在维护一个微信小程序餐厅点餐的后端项目时,我并没有遇到什么具体的、棘手的错误。代码能编译,功能也正常。但就像对待一辆常年奔波的车,我总想给它做一次全面的“体检”,看看有没有哪些不易察觉的“零件磨损”或可以优化的地方。 项目采用了Spring Boot框架,结构清晰。我并没有特定目标,只是想知道:在那些看似正常的代码背后,是否隐藏着不符合现代最佳实践的“惯性写法”? 于是,我点开了AI工具箱里的 “框架最佳实践优化器”。它的描述很吸引人:“提炼主流框架的实战指南…帮你跳过试错,直接写出高效、规范的代码。” 我选择针对“Java API”运行一次。 二、意料之外的“诊断报告” 点击运行后,优化器开始工作。控制台日志快速滚动,显示它正在“获取框架最佳实践优化器信息”。几秒钟后,分析完成。 结果有些出乎我的意料。优化器并没有对我预想的复杂架构或设计模式提出建议,而是给出了一个非常具体、看似微小的优化点:“Use MapContainsKey”

By Ne0inhk