news 2026/5/1 5:05:20

python mcp stdio模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python mcp stdio模式

server:

"""3.1 【stdio模式】mcp服务端开发"""
#导入mcp依赖包
from mcp.server.fastmcp import FastMCP
#创建mcp实例
mcp = FastMCP("Tool MCP Server")

@mcp.tool()
def add_tool(x:int,y:int):
"""
有两个数字相加的加法工具
:param x: 第一个数字
:param y: 第二个数字
:return: 两个数字的和
"""
return x+y

@mcp.tool()
def sub_tool(x:int,y:int):
"""
有两个数字相减的减法工具
:param x: 第一个数字
:param y: 第二个数字
:return: 两个数字的差
"""
return x-y

if __name__ == "__main__":
print(" MCP Server Start!")
#启动mcp服务:有两种协议,分别是stdio和tcp,stdio模式下,transport参数必须为stdio
mcp.run(transport="stdio")

client:
"""3.2 【stdio模式】mcp客户端开发—连接服务端"""
import asyncio
import json
from contextlib import AsyncExitStack

from mcp import StdioServerParameters, stdio_client, ClientSession
from openai import OpenAI


class MCPClient:

def __init__(self):
self.async_exit_stack = AsyncExitStack()
self.session = None
self.deepseek = OpenAI(
api_key="sk-304d80ba4865490283ec012fcdfa568a",
base_url="https://api.deepseek.com"
)


async def connect_to_server(self,server_path):
# 一、创建服务连接的参数
server_parameters = StdioServerParameters(
command="python",
args=[server_path],
env=None
)
# 二、创建stdio_client
client = stdio_client(server_parameters)
transport = await self.async_exit_stack.enter_async_context(client)
read_stream, write_stream = transport
# 三、创建会话client
client_session = ClientSession(read_stream, write_stream)
self.session = await self.async_exit_stack.enter_async_context(client_session)
# 四、初始化会话
await self.session.initialize()

async def execute(self,query:str):
# 一、获取server.py中的工具列表
response = await self.session.list_tools()
list_tools = response.tools
print("打印出获取的工具列表:",list_tools)
#二、创建function calling 格式(大模型使用)、
tools =[
{
"type":"function",
"function":{
"name":tool.name,
"description":tool.description,
"parameters":tool.inputSchema
}
} for tool in list_tools
]
# 三、 创建messages,deepseek大模型的格式
messages = [
{
"role":"user",
"content":query
}
]
# 四、调用deepseek大模型
deepseek_response = self.deepseek.chat.completions.create(
model="deepseek-chat",
messages=messages,
tools=tools
)
# 打印出大模型的决策结果
print("==== deepseek 响应持结果:",deepseek_response)
choice_result = deepseek_response.choices[0]
#第二次调用大模型的前置参数
messages.append(choice_result.message.model_dump())
tool_call = choice_result.message.tool_calls[0]

print(" tool_call:",tool_call)
print("大模型决策的最终结果,工具名称:",tool_call.function.name,",参数:",tool_call.function.arguments)
function_name = tool_call.function.name
arguments = json.loads(tool_call.function.arguments)
# 五、调用工具链
tool_result = await self.session.call_tool(
name = function_name,
arguments=arguments
)
print("==== 工具调用结果:",tool_result)
#最终的结果
result = tool_result.content[0].text
print("==== 最终的结果:",result)

# 六、使用大模型生成最终的结果,并且使用语言模型生成最终的结果
messages.append({
"role": "tool",
"content": tool_result.content[0].text,
"tool_call_id": tool_call.id
})
# 再次调用大模型
deepseek_response = self.deepseek.chat.completions.create(
model="deepseek-chat",
messages=messages,
tools=tools,
)
# 获取最终的结果
result = deepseek_response.choices[0].message.content
print("==== 最终的结果:", result)


#关闭资源
async def aclose(self):
await self.async_exit_stack.aclose()

async def main():
client = MCPClient()
try:
await client.connect_to_server("server.py")
await client.execute("帮我计算一下2加3等于几?")
except Exception as e:
print(f"连接失败: {e}")
return
finally:
await client.aclose()

if __name__ == "__main__":
asyncio.run(main())



D:\Users\msi\miniconda3\python.exe D:\mcp-client\源码文档\源码文档\0722-01-01\07220101\mcp例子\client_stdio.py
[12/18/25 19:20:35] INFO Processing request of type server.py:674
ListToolsRequest
打印出获取的工具列表: [Tool(name='add_tool', title=None, description='\n 有两个数字相加的加法工具\n :param x: 第一个数字\n :param y: 第二个数字\n :return: 两个数字的和\n ', inputSchema={'properties': {'x': {'title': 'X', 'type': 'integer'}, 'y': {'title': 'Y', 'type': 'integer'}}, 'required': ['x', 'y'], 'title': 'add_toolArguments', 'type': 'object'}, outputSchema=None, icons=None, annotations=None, meta=None), Tool(name='sub_tool', title=None, description='\n 有两个数字相减的减法工具\n :param x: 第一个数字\n :param y: 第二个数字\n :return: 两个数字的差\n ', inputSchema={'properties': {'x': {'title': 'X', 'type': 'integer'}, 'y': {'title': 'Y', 'type': 'integer'}}, 'required': ['x', 'y'], 'title': 'sub_toolArguments', 'type': 'object'}, outputSchema=None, icons=None, annotations=None, meta=None)]
==== deepseek 响应持结果: ChatCompletion(id='7f5c79d0-5bba-46c2-86ad-d155997067da', choices=[Choice(finish_reason='tool_calls', index=0, logprobs=None, message=ChatCompletionMessage(content='我来帮您计算2加3等于几。', refusal=None, role='assistant', annotations=None, audio=None, function_call=None, tool_calls=[ChatCompletionMessageFunctionToolCall(id='call_00_ovwMqIGcfUpVnZlRLJaM6xoE', function=Function(arguments='{"x": 2, "y": 3}', name='add_tool'), type='function', index=0)]))], created=1766056836, model='deepseek-chat', object='chat.completion', service_tier=None, system_fingerprint='fp_eaab8d114b_prod0820_fp8_kvcache', usage=CompletionUsage(completion_tokens=69, prompt_tokens=483, total_tokens=552, completion_tokens_details=None, prompt_tokens_details=PromptTokensDetails(audio_tokens=None, cached_tokens=0), prompt_cache_hit_tokens=0, prompt_cache_miss_tokens=483))
tool_call: ChatCompletionMessageFunctionToolCall(id='call_00_ovwMqIGcfUpVnZlRLJaM6xoE', function=Function(arguments='{"x": 2, "y": 3}', name='add_tool'), type='function', index=0)
大模型决策的最终结果,工具名称: add_tool ,参数: {"x": 2, "y": 3}
==== 工具调用结果: meta=None content=[TextContent(type='text', text='5', annotations=None, meta=None)] structuredContent=None isError=False
==== 最终的结果: 5
[12/18/25 19:20:39] INFO Processing request of type server.py:674
CallToolRequest
==== 最终的结果: 2加3等于5。

Process finished with exit code 0


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 19:24:38

发布水利工程检测LIMS实验室管理系统的功能与应用模块

面对不同类型的专用LIMS,首先要了解的就是他的专用能力,其中水利工程LIMS系统是面向水利行业检测的专业工具,核心是整合水利工程相关的水质、岩土、混凝土、泥沙、金属结构等检测业务流程,实现检测数据的全流程管理,质…

作者头像 李华
网站建设 2026/4/27 23:36:55

Java遗留系统改造效率飙升300%!AI智能重构方案破解企业数字化转型痛点

在企业数字化转型推进过程中,Java遗留系统的现代化改造始终是技术团队面临的核心挑战。传统重构实施阶段,开发人员需直面代码结构繁杂、技术文档缺失、技术债务累积等多重阻碍,这些因素直接导致项目风险攀升与开发成本增加。一、遗留系统重构…

作者头像 李华
网站建设 2026/4/26 0:47:40

【Linux | Windows | Terminal Command】 Linux---grep | Windows--- findstr

文章目录搜索文本命令LinuxgrepWindowsfindstr搜索文本命令 Linux grep Windows 在Windows中,与Linux grep命令功能最接近的是**findstr**命令,用于在文件中搜索字符串和正则表达式;同时,你也可以通过安装WSL (Windows Subsyst…

作者头像 李华
网站建设 2026/4/14 18:17:20

Oracle索引技术:理论与实操全解析

索引是Oracle数据库性能优化的核心组件,如同书籍的目录,能快速定位数据位置,减少磁盘I/O开销。合理设计和维护索引可显著提升查询效率,而误用则可能导致性能下降。 一、核心理论:索引的本质与分类 1. 索引的核心作用 加…

作者头像 李华
网站建设 2026/4/29 9:16:47

逻辑越权之水平垂直越权

1.水平越权 通过替换身份标识(如ID),使A账号访问或操作相同权限的B账号的数据。 2.逻辑越权 低权限账号发送高权限请求,从而执行高权限操作。 3.未授权访问 删除请求中的认证信息后,仍能访问或执行受限操作。 pikac…

作者头像 李华
网站建设 2026/4/29 6:40:31

git 本地分支上进行了合并操作但尚未推送到远程仓库,如何撤销?

如果你在本地分支上进行了合并操作但尚未推送到远程仓库,可以通过以下几种方式撤销合并: 1. 使用 git reset 撤销合并(推荐) 查看合并记录 git log --oneline -5找到合并前的 commit ID,然后重置 # 软重置(…

作者头像 李华