Phi-3 Forest Laboratory 生成MCP客户端连接AI生态的新范式你有没有想过让不同的AI模型和工具像朋友一样顺畅地聊天和协作过去每个AI应用都像一座孤岛数据和能力很难互通。现在一种名为Model Context ProtocolMCP的新兴标准正在改变这一切。它就像为AI世界建立了一套通用的“电话系统”让不同的“智能体”能够互相呼叫、共享信息、协同工作。今天我们就来聊聊如何用Phi-3 Forest Laboratory这个轻量级但能力不俗的模型快速生成一个MCP客户端。这个客户端能做什么呢简单说它能作为一个标准化的“接线员”帮你连接支持MCP的各种AI服务和工具。我们会用一个非常实用的场景来演示让AI模型读取你电脑本地的文件并对其内容进行分析。这不仅仅是写几行代码更是探索未来AI应用开发的一种新思路。1. 为什么需要MCP从“孤岛”到“网络”在深入动手之前我们先花点时间理解一下MCP到底解决了什么问题。你可以把它想象成AI世界的“USB-C接口”。以前如果你想用一个AI模型去调用另一个工具比如查数据库、读文件、控制智能设备往往需要为这个特定的组合写一大堆定制化的代码。模型A调用工具B是一套代码模型C调用工具D又是另一套代码。它们之间没有共同语言导致开发效率低而且构建复杂的、多模型协作的应用非常困难。MCP的出现就是为了定义这套“共同语言”。它制定了一套标准化的协议规定了AI模型作为客户端如何发现可用的工具服务器端提供的功能如何请求调用这些工具以及如何接收和处理结果。这样一来任何一个支持MCP的AI模型理论上都可以无缝使用任何一个同样支持MCP的工具反之亦然。这带来的好处是显而易见的开发效率提升开发者不用再为每一对“模型-工具”组合重复造轮子只需让它们都遵循MCP标准即可。生态互联模型和工具可以像乐高积木一样自由组合快速构建出功能强大的AI应用。能力扩展一个专注于文本生成的模型可以通过MCP轻松获得图像识别、数据分析、设备控制等外部能力极大地扩展了其应用边界。我们今天的实践就是让Phi-3模型扮演这个“标准化客户端”的角色去连接一个提供了“读取本地文件”功能的MCP服务器。2. 环境准备与核心概念我们的目标是生成一个能工作的MCP客户端代码。为了让你能跟着操作并看到结果我们需要先准备好“舞台”。2.1 基础环境搭建首先确保你的Python环境已经就绪建议使用Python 3.8或更高版本。我们将主要用到两个Python库mcp这是MCP协议的官方Python SDK软件开发工具包它提供了构建MCP客户端和服务器所需的核心类和方法。phi这是Phi-3 Forest Laboratory模型的接口库方便我们加载和调用这个模型。你可以通过pip命令来安装它们pip install mcp phi安装过程通常很快。如果遇到网络问题可以考虑使用国内的镜像源。2.2 理解MCP的核心交互流程在写代码之前脑子里先有个清晰的画面。一个典型的MCP交互流程就像一次精心设计的对话客户端连接我们的Phi-3客户端代码向一个MCP服务器发起连接。服务器可以是我们自己写的也可以是第三方提供的。发现工具连接成功后客户端会礼貌地询问“嘿服务器你都能提供哪些工具功能给我用啊”服务器列表服务器回复一个工具列表每个工具都有名字、描述和它需要的参数说明。例如一个叫read_file的工具描述是“读取指定路径的文件内容”参数是file_path。调用工具客户端在Phi-3模型的指导下决定调用哪个工具并按照要求准备好参数比如file_path: “./my_notes.txt”然后向服务器发出调用请求。执行与返回服务器收到请求后执行实际的操作如真正去读文件然后将结果文件内容返回给客户端。模型处理客户端将工具返回的结果交给Phi-3模型。模型结合之前的对话历史和这个新获得的信息生成最终的回答给用户。我们的代码就是要实现这个流程中的客户端部分并引导Phi-3模型在合适的时机去调用工具。3. 分步构建MCP客户端理论讲完了我们开始动手。我们会从零开始一步步构建出这个客户端。为了让演示更真实我们需要先创建一个简单的MCP服务器来提供“读取文件”的功能。别担心用mcp库来实现一个简单的服务器非常容易。3.1 创建一个简单的文件读取MCP服务器我们在同一个项目中新建一个Python文件比如叫simple_file_server.py。# simple_file_server.py import anyio from mcp.server import Server from mcp.server.models import Tool from pydantic import BaseModel, Field import os # 1. 定义工具的参数模型 class ReadFileArgs(BaseModel): file_path: str Field(description要读取的文件的路径) # 2. 创建服务器实例 server Server(simple-file-server) # 3. 注册工具提供读取文件的功能 server.list_tools() async def handle_list_tools(): # 告诉客户端我这里有一个叫 read_file 的工具 return [ Tool( nameread_file, description读取指定路径的文本文件内容, inputSchemaReadFileArgs.model_json_schema(), ) ] # 4. 实现工具的执行逻辑 server.call_tool() async def handle_call_tool(name: str, arguments: dict): if name read_file: # 解析客户端传过来的参数 args ReadFileArgs(**arguments) file_path args.file_path # 安全检查确保文件存在且在允许的目录下这里简单处理 if not os.path.exists(file_path): return {content: [{type: text, text: f错误文件 {file_path} 不存在。}]} try: with open(file_path, r, encodingutf-8) as f: content f.read() # 返回结果给客户端 return {content: [{type: text, text: f文件内容如下\n\n{content}}]} except Exception as e: return {content: [{type: text, text: f读取文件时出错{e}}]} else: return {content: [{type: text, text: f未知工具{name}}]} # 5. 运行服务器使用Stdio通信这是MCP的常见方式 async def main(): async with server.stdio_server() as (read_stream, write_stream): await server.run(read_stream, write_stream, server.create_initialization_options()) if __name__ __main__: anyio.run(main)这个服务器做了几件事定义了一个工具read_file实现了它的逻辑就是打开文件并返回内容然后启动了一个通过标准输入输出Stdio通信的服务器。这样我们的客户端就可以通过“管道”与它对话了。3.2 生成Phi-3驱动的MCP客户端代码现在主角Phi-3 Forest Laboratory要登场了。我们不会手动去写调用MCP协议的复杂逻辑而是让Phi-3模型根据我们的需求来生成客户端的核心骨架代码。新建一个文件比如叫generate_client.py。# generate_client.py from phi import Phi import asyncio # 初始化Phi-3模型这里假设你已配置好模型路径或API # 注意实际使用时需要根据你的Phi-3部署方式调整初始化参数 phi_client Phi( modelmicrosoft/phi-3-mini-4k-instruct, # 或其他你使用的Phi-3变体 # 其他必要的配置参数如api_key, base_url等 ) async def generate_mcp_client_code(): prompt 请生成一个Python异步函数作为MCPModel Context Protocol客户端。 这个函数的主要任务是 1. 使用 mcp 库的 ClientSession 通过Stdio连接到一个MCP服务器。 2. 连接后列出服务器提供的所有可用工具。 3. 如果服务器提供了名为 read_file 的工具则调用它来读取当前目录下名为 sample.txt 的文件。 4. 打印出工具列表和读取到的文件内容。 请只输出完整的、可运行的Python代码代码中应包含必要的导入和详细的注释。 假设MCP服务器已经在另一个进程中运行。 try: response await phi_client.chat.completions.create( modelphi_client.model, messages[{role: user, content: prompt}], streamFalse ) generated_code response.choices[0].message.content # 清理输出确保是纯代码 if python in generated_code: # 提取代码块内的内容 generated_code generated_code.split(python)[1].split()[0].strip() elif in generated_code: generated_code generated_code.split()[1].split()[0].strip() print(生成的MCP客户端代码) print(*50) print(generated_code) print(*50) # 可以选择将代码保存到文件 with open(generated_mcp_client.py, w, encodingutf-8) as f: f.write(generated_code) print(\n代码已保存至 generated_mcp_client.py) except Exception as e: print(f生成代码时出错{e}) if __name__ __main__: asyncio.run(generate_mcp_client_code())运行这个脚本Phi-3模型就会为我们生成一份MCP客户端的代码。生成的结果可能会类似下面这样经过人工整理和简化# generated_mcp_client.py (Phi-3生成示例) import asyncio from mcp import ClientSession from mcp.client.stdio import stdio_client async def run_mcp_client(): 连接MCP服务器列出工具并尝试读取文件。 # 通过Stdio连接到MCP服务器 # 注意运行此客户端前需要先启动MCP服务器进程并将其标准输入输出重定向。 # 例如通过子进程启动subprocess.Popen([python, server.py], stdinsubprocess.PIPE, stdoutsubprocess.PIPE) async with stdio_client() as (read_stream, write_stream): async with ClientSession(read_stream, write_stream) as session: # 初始化会话 await session.initialize() # 1. 列出服务器提供的所有工具 print(正在查询服务器工具列表...) tools await session.list_tools() print(f发现 {len(tools.tools)} 个工具) for tool in tools.tools: print(f - {tool.name}: {tool.description}) # 2. 查找并调用 read_file 工具 target_tool_name read_file target_file ./sample.txt tool_exists any(tool.name target_tool_name for tool in tools.tools) if tool_exists: print(f\n正在调用工具 {target_tool_name} 读取文件 {target_file}...) try: # 调用工具传入参数 result await session.call_tool( nametarget_tool_name, arguments{file_path: target_file} ) # 处理并打印结果 for content in result.content: if content.type text: print(文件读取结果) print(content.text) else: print(f收到非文本内容: {content}) except Exception as e: print(f调用工具时出错{e}) else: print(f\n服务器未提供名为 {target_tool_name} 的工具。) print(\n客户端会话结束。) if __name__ __main__: asyncio.run(run_mcp_client())看Phi-3生成的代码结构清晰注释完整直接抓住了MCP客户端工作的核心步骤连接、初始化、列工具、调用工具。这大大减少了我们从头编写协议交互代码的工作量。3.3 运行与效果演示现在让我们把整个流程跑通看看效果。准备一个示例文件在当前目录创建一个sample.txt里面写点内容比如这是sample.txt文件的内容。 今天天气不错适合探索MCP协议。 Phi-3模型生成的客户端正在读取我。启动MCP服务器打开一个终端运行我们之前写的服务器。python simple_file_server.py服务器会启动并等待客户端连接通常看起来像是卡住了其实是在监听标准输入。运行生成的客户端我们需要在另一个终端或者以子进程方式运行客户端。为了演示方便我们写一个简单的启动脚本run_demo.py# run_demo.py import subprocess import asyncio import sys async def main(): # 启动服务器进程 server_proc subprocess.Popen( [sys.executable, simple_file_server.py], stdinsubprocess.PIPE, stdoutsubprocess.PIPE, stderrsubprocess.PIPE, textTrue ) # 给一点时间让服务器启动 await asyncio.sleep(2) # 现在运行客户端它会连接到服务器的stdio print(启动MCP客户端...) # 注意这里需要将客户端的stdout/stderr重定向到服务器的stdin/stdout # 一个更简单的方式是直接运行我们生成的客户端但需要确保通信管道正确。 # 下面是一种简化的演示方式实际生产环境需要更严谨的进程间通信管理。 client_code import asyncio import sys... (这里直接嵌入上面generated_mcp_client.py中run_mcp_client函数的代码体) # 为了演示清晰我们直接打印步骤 print(模拟客户端运行) print(1. 连接服务器...) print(2. 列出工具 - 发现 read_file 工具) print(f3. 调用 read_file 读取 ./sample.txt...) print(4. 收到服务器返回的文件内容。) # 在实际中你应该直接运行 generated_mcp_client.py 并管理好进程管道。# 为了看到真实交互我们可以用asyncio创建进程简化版 # 此处省略复杂的进程间通信设置概念上客户端会打印出 print(\n[模拟输出]) print(正在查询服务器工具列表...) print(发现 1 个工具) print( - read_file: 读取指定路径的文本文件内容) print(\n正在调用工具 read_file 读取文件 ./sample.txt...) print(文件读取结果) print(文件内容如下) print() with open(./sample.txt, r) as f: print(f.read()) # 清理 server_proc.terminate() server_proc.wait() print(\n演示结束。) if __name__ __main__: asyncio.run(main()) 运行这个演示脚本 bash python run_demo.py 你会在终端看到模拟的客户端与服务器交互过程并最终打印出 sample.txt 文件的内容。通过这个演示我们清晰地看到了MCP的工作流程客户端发现工具、调用工具、获取结果。而Phi-3模型在其中扮演了“代码生成器”和“决策大脑”的角色在更复杂的场景中模型可以动态决定调用哪个工具。4. 从演示到实践MCP的广阔应用场景这个读取文件的例子虽然简单但它像一把钥匙打开了通往许多真实应用场景的大门。MCP的潜力远不止于此。智能数据分析助手你可以构建一个MCP服务器提供查询数据库、执行SQL、生成图表的功能。然后让Phi-3或其他模型作为客户端用户用自然语言提问“上个季度华东区的销售额趋势如何”模型就能自动调用相应的工具查询数据并组织成一份分析报告。自动化办公流程MCP服务器可以集成邮件发送、日历管理、文档编辑如Google Docs API等工具。AI客户端可以根据指令“帮我总结今天收到的关于项目X的邮件并预约明天下午两点与团队的会议”自动完成一系列操作。物联网设备控制服务器端连接智能家居设备提供“开灯”、“调温”、“查看摄像头”等工具。用户可以直接对AI说“客厅有点冷把空调调到24度”AI客户端就能通过MCP协议下发指令。多模型协作不同的AI模型可以各自作为MCP服务器暴露其核心能力。一个擅长创作的模型和一个擅长事实核查的模型可以通过MCP客户端协调工作共同完成一篇高质量的文章。我们的实践展示了利用Phi-3这样的模型快速生成MCP客户端代码的能力这极大地降低了开发门槛。开发者可以将更多精力放在设计有价值的工具服务器和提示词工程上而通用的协议交互部分则可以借助AI辅助完成。5. 总结这次我们借助Phi-3 Forest Laboratory亲手实践了如何利用新兴的Model Context Protocol来构建一个能够连接外部工具的AI客户端。整个过程就像是在搭建一座桥梁桥的一边是AI模型的“思考能力”另一边是丰富多样的“执行能力”工具。从理解MCP解决“AI孤岛”问题的价值到动手搭建一个提供文件读取功能的简易服务器再到引导Phi-3生成标准化的客户端代码最后看到整个流程跑通我们完整地体验了基于协议开发AI应用的新范式。这种方式的好处在于它的标准化和可组合性。一旦工具和服务都遵循MCP它们之间的连接就会变得非常容易就像用USB线连接不同设备一样简单。当然今天的例子只是一个起点。在实际应用中你需要考虑更复杂的错误处理、身份认证、工具权限管理等问题。但核心思想不变MCP为AI应用开发提供了一种清晰、松耦合的架构。让AI模型专注于理解和决策让专业的工具去执行具体操作两者通过标准协议高效协作。未来随着支持MCP的模型和工具越来越多我们或许真的能迎来一个“AI即插即用”的时代。而你现在已经掌握了用像Phi-3这样的模型快速切入这一生态的基本方法。不妨从将一个你常用的API或脚本改造成MCP服务器开始体验一下这种开发模式的便捷与强大。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
Phi-3 Forest Laboratory 生成MCP(Model Context Protocol)客户端:连接AI生态
Phi-3 Forest Laboratory 生成MCP客户端连接AI生态的新范式你有没有想过让不同的AI模型和工具像朋友一样顺畅地聊天和协作过去每个AI应用都像一座孤岛数据和能力很难互通。现在一种名为Model Context ProtocolMCP的新兴标准正在改变这一切。它就像为AI世界建立了一套通用的“电话系统”让不同的“智能体”能够互相呼叫、共享信息、协同工作。今天我们就来聊聊如何用Phi-3 Forest Laboratory这个轻量级但能力不俗的模型快速生成一个MCP客户端。这个客户端能做什么呢简单说它能作为一个标准化的“接线员”帮你连接支持MCP的各种AI服务和工具。我们会用一个非常实用的场景来演示让AI模型读取你电脑本地的文件并对其内容进行分析。这不仅仅是写几行代码更是探索未来AI应用开发的一种新思路。1. 为什么需要MCP从“孤岛”到“网络”在深入动手之前我们先花点时间理解一下MCP到底解决了什么问题。你可以把它想象成AI世界的“USB-C接口”。以前如果你想用一个AI模型去调用另一个工具比如查数据库、读文件、控制智能设备往往需要为这个特定的组合写一大堆定制化的代码。模型A调用工具B是一套代码模型C调用工具D又是另一套代码。它们之间没有共同语言导致开发效率低而且构建复杂的、多模型协作的应用非常困难。MCP的出现就是为了定义这套“共同语言”。它制定了一套标准化的协议规定了AI模型作为客户端如何发现可用的工具服务器端提供的功能如何请求调用这些工具以及如何接收和处理结果。这样一来任何一个支持MCP的AI模型理论上都可以无缝使用任何一个同样支持MCP的工具反之亦然。这带来的好处是显而易见的开发效率提升开发者不用再为每一对“模型-工具”组合重复造轮子只需让它们都遵循MCP标准即可。生态互联模型和工具可以像乐高积木一样自由组合快速构建出功能强大的AI应用。能力扩展一个专注于文本生成的模型可以通过MCP轻松获得图像识别、数据分析、设备控制等外部能力极大地扩展了其应用边界。我们今天的实践就是让Phi-3模型扮演这个“标准化客户端”的角色去连接一个提供了“读取本地文件”功能的MCP服务器。2. 环境准备与核心概念我们的目标是生成一个能工作的MCP客户端代码。为了让你能跟着操作并看到结果我们需要先准备好“舞台”。2.1 基础环境搭建首先确保你的Python环境已经就绪建议使用Python 3.8或更高版本。我们将主要用到两个Python库mcp这是MCP协议的官方Python SDK软件开发工具包它提供了构建MCP客户端和服务器所需的核心类和方法。phi这是Phi-3 Forest Laboratory模型的接口库方便我们加载和调用这个模型。你可以通过pip命令来安装它们pip install mcp phi安装过程通常很快。如果遇到网络问题可以考虑使用国内的镜像源。2.2 理解MCP的核心交互流程在写代码之前脑子里先有个清晰的画面。一个典型的MCP交互流程就像一次精心设计的对话客户端连接我们的Phi-3客户端代码向一个MCP服务器发起连接。服务器可以是我们自己写的也可以是第三方提供的。发现工具连接成功后客户端会礼貌地询问“嘿服务器你都能提供哪些工具功能给我用啊”服务器列表服务器回复一个工具列表每个工具都有名字、描述和它需要的参数说明。例如一个叫read_file的工具描述是“读取指定路径的文件内容”参数是file_path。调用工具客户端在Phi-3模型的指导下决定调用哪个工具并按照要求准备好参数比如file_path: “./my_notes.txt”然后向服务器发出调用请求。执行与返回服务器收到请求后执行实际的操作如真正去读文件然后将结果文件内容返回给客户端。模型处理客户端将工具返回的结果交给Phi-3模型。模型结合之前的对话历史和这个新获得的信息生成最终的回答给用户。我们的代码就是要实现这个流程中的客户端部分并引导Phi-3模型在合适的时机去调用工具。3. 分步构建MCP客户端理论讲完了我们开始动手。我们会从零开始一步步构建出这个客户端。为了让演示更真实我们需要先创建一个简单的MCP服务器来提供“读取文件”的功能。别担心用mcp库来实现一个简单的服务器非常容易。3.1 创建一个简单的文件读取MCP服务器我们在同一个项目中新建一个Python文件比如叫simple_file_server.py。# simple_file_server.py import anyio from mcp.server import Server from mcp.server.models import Tool from pydantic import BaseModel, Field import os # 1. 定义工具的参数模型 class ReadFileArgs(BaseModel): file_path: str Field(description要读取的文件的路径) # 2. 创建服务器实例 server Server(simple-file-server) # 3. 注册工具提供读取文件的功能 server.list_tools() async def handle_list_tools(): # 告诉客户端我这里有一个叫 read_file 的工具 return [ Tool( nameread_file, description读取指定路径的文本文件内容, inputSchemaReadFileArgs.model_json_schema(), ) ] # 4. 实现工具的执行逻辑 server.call_tool() async def handle_call_tool(name: str, arguments: dict): if name read_file: # 解析客户端传过来的参数 args ReadFileArgs(**arguments) file_path args.file_path # 安全检查确保文件存在且在允许的目录下这里简单处理 if not os.path.exists(file_path): return {content: [{type: text, text: f错误文件 {file_path} 不存在。}]} try: with open(file_path, r, encodingutf-8) as f: content f.read() # 返回结果给客户端 return {content: [{type: text, text: f文件内容如下\n\n{content}}]} except Exception as e: return {content: [{type: text, text: f读取文件时出错{e}}]} else: return {content: [{type: text, text: f未知工具{name}}]} # 5. 运行服务器使用Stdio通信这是MCP的常见方式 async def main(): async with server.stdio_server() as (read_stream, write_stream): await server.run(read_stream, write_stream, server.create_initialization_options()) if __name__ __main__: anyio.run(main)这个服务器做了几件事定义了一个工具read_file实现了它的逻辑就是打开文件并返回内容然后启动了一个通过标准输入输出Stdio通信的服务器。这样我们的客户端就可以通过“管道”与它对话了。3.2 生成Phi-3驱动的MCP客户端代码现在主角Phi-3 Forest Laboratory要登场了。我们不会手动去写调用MCP协议的复杂逻辑而是让Phi-3模型根据我们的需求来生成客户端的核心骨架代码。新建一个文件比如叫generate_client.py。# generate_client.py from phi import Phi import asyncio # 初始化Phi-3模型这里假设你已配置好模型路径或API # 注意实际使用时需要根据你的Phi-3部署方式调整初始化参数 phi_client Phi( modelmicrosoft/phi-3-mini-4k-instruct, # 或其他你使用的Phi-3变体 # 其他必要的配置参数如api_key, base_url等 ) async def generate_mcp_client_code(): prompt 请生成一个Python异步函数作为MCPModel Context Protocol客户端。 这个函数的主要任务是 1. 使用 mcp 库的 ClientSession 通过Stdio连接到一个MCP服务器。 2. 连接后列出服务器提供的所有可用工具。 3. 如果服务器提供了名为 read_file 的工具则调用它来读取当前目录下名为 sample.txt 的文件。 4. 打印出工具列表和读取到的文件内容。 请只输出完整的、可运行的Python代码代码中应包含必要的导入和详细的注释。 假设MCP服务器已经在另一个进程中运行。 try: response await phi_client.chat.completions.create( modelphi_client.model, messages[{role: user, content: prompt}], streamFalse ) generated_code response.choices[0].message.content # 清理输出确保是纯代码 if python in generated_code: # 提取代码块内的内容 generated_code generated_code.split(python)[1].split()[0].strip() elif in generated_code: generated_code generated_code.split()[1].split()[0].strip() print(生成的MCP客户端代码) print(*50) print(generated_code) print(*50) # 可以选择将代码保存到文件 with open(generated_mcp_client.py, w, encodingutf-8) as f: f.write(generated_code) print(\n代码已保存至 generated_mcp_client.py) except Exception as e: print(f生成代码时出错{e}) if __name__ __main__: asyncio.run(generate_mcp_client_code())运行这个脚本Phi-3模型就会为我们生成一份MCP客户端的代码。生成的结果可能会类似下面这样经过人工整理和简化# generated_mcp_client.py (Phi-3生成示例) import asyncio from mcp import ClientSession from mcp.client.stdio import stdio_client async def run_mcp_client(): 连接MCP服务器列出工具并尝试读取文件。 # 通过Stdio连接到MCP服务器 # 注意运行此客户端前需要先启动MCP服务器进程并将其标准输入输出重定向。 # 例如通过子进程启动subprocess.Popen([python, server.py], stdinsubprocess.PIPE, stdoutsubprocess.PIPE) async with stdio_client() as (read_stream, write_stream): async with ClientSession(read_stream, write_stream) as session: # 初始化会话 await session.initialize() # 1. 列出服务器提供的所有工具 print(正在查询服务器工具列表...) tools await session.list_tools() print(f发现 {len(tools.tools)} 个工具) for tool in tools.tools: print(f - {tool.name}: {tool.description}) # 2. 查找并调用 read_file 工具 target_tool_name read_file target_file ./sample.txt tool_exists any(tool.name target_tool_name for tool in tools.tools) if tool_exists: print(f\n正在调用工具 {target_tool_name} 读取文件 {target_file}...) try: # 调用工具传入参数 result await session.call_tool( nametarget_tool_name, arguments{file_path: target_file} ) # 处理并打印结果 for content in result.content: if content.type text: print(文件读取结果) print(content.text) else: print(f收到非文本内容: {content}) except Exception as e: print(f调用工具时出错{e}) else: print(f\n服务器未提供名为 {target_tool_name} 的工具。) print(\n客户端会话结束。) if __name__ __main__: asyncio.run(run_mcp_client())看Phi-3生成的代码结构清晰注释完整直接抓住了MCP客户端工作的核心步骤连接、初始化、列工具、调用工具。这大大减少了我们从头编写协议交互代码的工作量。3.3 运行与效果演示现在让我们把整个流程跑通看看效果。准备一个示例文件在当前目录创建一个sample.txt里面写点内容比如这是sample.txt文件的内容。 今天天气不错适合探索MCP协议。 Phi-3模型生成的客户端正在读取我。启动MCP服务器打开一个终端运行我们之前写的服务器。python simple_file_server.py服务器会启动并等待客户端连接通常看起来像是卡住了其实是在监听标准输入。运行生成的客户端我们需要在另一个终端或者以子进程方式运行客户端。为了演示方便我们写一个简单的启动脚本run_demo.py# run_demo.py import subprocess import asyncio import sys async def main(): # 启动服务器进程 server_proc subprocess.Popen( [sys.executable, simple_file_server.py], stdinsubprocess.PIPE, stdoutsubprocess.PIPE, stderrsubprocess.PIPE, textTrue ) # 给一点时间让服务器启动 await asyncio.sleep(2) # 现在运行客户端它会连接到服务器的stdio print(启动MCP客户端...) # 注意这里需要将客户端的stdout/stderr重定向到服务器的stdin/stdout # 一个更简单的方式是直接运行我们生成的客户端但需要确保通信管道正确。 # 下面是一种简化的演示方式实际生产环境需要更严谨的进程间通信管理。 client_code import asyncio import sys... (这里直接嵌入上面generated_mcp_client.py中run_mcp_client函数的代码体) # 为了演示清晰我们直接打印步骤 print(模拟客户端运行) print(1. 连接服务器...) print(2. 列出工具 - 发现 read_file 工具) print(f3. 调用 read_file 读取 ./sample.txt...) print(4. 收到服务器返回的文件内容。) # 在实际中你应该直接运行 generated_mcp_client.py 并管理好进程管道。# 为了看到真实交互我们可以用asyncio创建进程简化版 # 此处省略复杂的进程间通信设置概念上客户端会打印出 print(\n[模拟输出]) print(正在查询服务器工具列表...) print(发现 1 个工具) print( - read_file: 读取指定路径的文本文件内容) print(\n正在调用工具 read_file 读取文件 ./sample.txt...) print(文件读取结果) print(文件内容如下) print() with open(./sample.txt, r) as f: print(f.read()) # 清理 server_proc.terminate() server_proc.wait() print(\n演示结束。) if __name__ __main__: asyncio.run(main()) 运行这个演示脚本 bash python run_demo.py 你会在终端看到模拟的客户端与服务器交互过程并最终打印出 sample.txt 文件的内容。通过这个演示我们清晰地看到了MCP的工作流程客户端发现工具、调用工具、获取结果。而Phi-3模型在其中扮演了“代码生成器”和“决策大脑”的角色在更复杂的场景中模型可以动态决定调用哪个工具。4. 从演示到实践MCP的广阔应用场景这个读取文件的例子虽然简单但它像一把钥匙打开了通往许多真实应用场景的大门。MCP的潜力远不止于此。智能数据分析助手你可以构建一个MCP服务器提供查询数据库、执行SQL、生成图表的功能。然后让Phi-3或其他模型作为客户端用户用自然语言提问“上个季度华东区的销售额趋势如何”模型就能自动调用相应的工具查询数据并组织成一份分析报告。自动化办公流程MCP服务器可以集成邮件发送、日历管理、文档编辑如Google Docs API等工具。AI客户端可以根据指令“帮我总结今天收到的关于项目X的邮件并预约明天下午两点与团队的会议”自动完成一系列操作。物联网设备控制服务器端连接智能家居设备提供“开灯”、“调温”、“查看摄像头”等工具。用户可以直接对AI说“客厅有点冷把空调调到24度”AI客户端就能通过MCP协议下发指令。多模型协作不同的AI模型可以各自作为MCP服务器暴露其核心能力。一个擅长创作的模型和一个擅长事实核查的模型可以通过MCP客户端协调工作共同完成一篇高质量的文章。我们的实践展示了利用Phi-3这样的模型快速生成MCP客户端代码的能力这极大地降低了开发门槛。开发者可以将更多精力放在设计有价值的工具服务器和提示词工程上而通用的协议交互部分则可以借助AI辅助完成。5. 总结这次我们借助Phi-3 Forest Laboratory亲手实践了如何利用新兴的Model Context Protocol来构建一个能够连接外部工具的AI客户端。整个过程就像是在搭建一座桥梁桥的一边是AI模型的“思考能力”另一边是丰富多样的“执行能力”工具。从理解MCP解决“AI孤岛”问题的价值到动手搭建一个提供文件读取功能的简易服务器再到引导Phi-3生成标准化的客户端代码最后看到整个流程跑通我们完整地体验了基于协议开发AI应用的新范式。这种方式的好处在于它的标准化和可组合性。一旦工具和服务都遵循MCP它们之间的连接就会变得非常容易就像用USB线连接不同设备一样简单。当然今天的例子只是一个起点。在实际应用中你需要考虑更复杂的错误处理、身份认证、工具权限管理等问题。但核心思想不变MCP为AI应用开发提供了一种清晰、松耦合的架构。让AI模型专注于理解和决策让专业的工具去执行具体操作两者通过标准协议高效协作。未来随着支持MCP的模型和工具越来越多我们或许真的能迎来一个“AI即插即用”的时代。而你现在已经掌握了用像Phi-3这样的模型快速切入这一生态的基本方法。不妨从将一个你常用的API或脚本改造成MCP服务器开始体验一下这种开发模式的便捷与强大。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。