一分钟入门mcp开发

京东云开发者
• 阅读 2

作者:京东物流 张华

给自己几分钟时间,快速了解一下mcp技术~

0 1分钟时间入门

👉 Python实现一个基于sse通信的完整mcp-demo

0.1 环境依赖

Python >= 3.10

Package           Version
----------------- ---------
annotated-types   0.7.0
anyio             4.9.0
certifi           2025.4.26
click             8.2.1
h11               0.16.0
httpcore          1.0.9
httpx             0.28.1
httpx-sse         0.4.0
idna              3.10
mcp               1.9.2
pydantic          2.11.5
pydantic-core     2.33.2
pydantic-settings 2.9.1
python-dotenv     1.1.0
python-multipart  0.0.20
sniffio           1.3.1
sse-starlette     2.3.6
starlette         0.47.0
typing-extensions 4.14.0
typing-inspection 0.4.1
uvicorn           0.34.3

0.2 实现mcp-server

server-1-带2个tool

#!/usr/bin/env python
#-*- coding:UTF-8 -*-
#########################################################################
# File Name: sse_server_1.py
# Author: AI_Team
# Mail: example@jd.com
# Created Time: 17:19:01 2025-06-04
#########################################################################
import sys
import httpx
import asyncio
from mcp.server import FastMCP

app = FastMCP('web-search', port=9000)


@app.tool()
async def web_search(query: str) -> str:
    """
    搜索互联网内容

    Args:
        query: 要搜索内容

    Returns:
        搜索结果的总结
    """
    res_data = ["query", query]
    return ':'.join(res_data)

@app.tool()
async def hello_world() -> str:
    """
    给世界打招呼

    Args:
        None

    Returns:
        打招呼的内容
    """
    return "Hi mcp world!"


if __name__ == "__main__":
    app.run(transport='sse')

server-2-带1个tool

#!/usr/bin/env python
#-*- coding:UTF-8 -*-
#########################################################################
# File Name: sse_server_2.py
# Author: AI_Team
# Mail: example@jd.com
# Created Time: 17:19:01 2025-06-04
#########################################################################
import sys
import httpx
import asyncio
from mcp.server import FastMCP

app = FastMCP('test-sse', port=9001)


@app.tool()
async def hi_world() -> str:
    """
    给世界打招呼的另一种说法

    Args:
        None

    Returns:
        带中文的打招呼内容
    """
    return "你好 mcp world!"


if __name__ == "__main__":
    app.run(transport='sse')

0.3 实现mcp-client

#!/usr/bin/env python
#-*- coding:UTF-8 -*-
#########################################################################
# File Name: sse_cli.py
# Author: AI_Team
# Mail: example@jd.com
# Created Time: 18:43:37 2025-06-04
#########################################################################
import sys
import asyncio
from contextlib import AsyncExitStack
from mcp.client.sse import sse_client
from mcp import ClientSession


class MCPClient:
    def __init__(self, server_urls: list[str]):
        """
        初始化 MCP 客户端。
        :param server_urls: SSE 服务地址列表,用于连接多个服务器。
        """
        self.server_urls = server_urls
        self.sessions = {} # 存储每个服务器的会话及其上下文 :server_id -> session
        self.tool_mapping = {} # 工具映射 :prefixed_name -> (session, original_tool_name)
        self.exit_stack = AsyncExitStack()

    async def initialize_sessions(self):
        """
        初始化与所有 SSE 服务器的连接,并获取可用工具列表。
        """
        for i, server_url in enumerate(self.server_urls):
            server_id = f"server{i}" # 为每个服务器生成唯一标识符
            # 创建 SSE 客户端并进入上下文
            streams_context = sse_client(url=server_url)
            streams = await self.exit_stack.enter_async_context(streams_context)
            session = await self.exit_stack.enter_async_context(ClientSession(*streams))

            await session.initialize()
            # 存储会话
            self.sessions[server_id] = session
            # 获取工具列表并建立映射
            response = await session.list_tools()
            print(response)
            for tool in response.tools:
                prefixed_name = f"{server_id}_{tool.name}" # 为工具名添加服务器前缀
                self.tool_mapping[prefixed_name] = (session, tool.name)
            print(f"已连接到 {server_url},工具列表:{[tool.name for tool in response.tools]}")

    async def chat_loop(self):
        for i in range(5):
            try:
                for prefixed_name, (session, tool_name) in self.tool_mapping.items():
                    if tool_name == "web_search":
                        res = await session.call_tool('web_search', {'query': '杭州今天天气'})
                    elif tool_name == "hello_world":
                        res = await session.call_tool('hello_world')
                    elif tool_name == "hi_world":
                        res = await session.call_tool('hi_world')
                    else:
                        res = "tool不存在!"
                    print (tool_name + ": ")
                    print (res)
            except Exception as e:
                import traceback
                traceback.print_exc()

    async def cleanup(self):
        """
        清理所有会话和连接资源,确保无资源泄漏。
        """
        await self.exit_stack.aclose()
        print("所有会话已清理。")


async def main():
    # 定义 SSE 服务器地址列表
    server_urls = ["http://localhost:9000/sse", "http://localhost:9001/sse"]
    # 创建并运行客户端
    client = MCPClient(server_urls=server_urls)
    try:
        await client.initialize_sessions()
        await client.chat_loop()
    finally:
        await client.cleanup()


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

0.4 执行一下吧😁

# 启动server-1
python sse_server_1.py

# 启动server-2
python sse_server_2.py

# cliend端执行一下
python sse_cli.py

1 如果你还有1分钟时间

👉 mcp是什么

1.1 先看官方的定义

MCP 简介

MCP 是一个开放协议,它为应用程序向 LLM 提供上下文的方式进行了标准化。你可以将 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 为设备连接各种外设和配件提供了标准化的方式一样,MCP 为 AI 模型连接各种数据源和工具提供了标准化的接口。

为什么选择 MCP?

MCP 帮助你在 LLM 的基础上构建代理(agents)和复杂的工作流。LLM 经常需要与数据和工具集成,而 MCP 提供了:

•持续增长的预构建集成列表,LLM 可直接使用

•灵活切换不同的 LLM 提供商和厂商

•在你的基础设施内安全地处理数据的最佳实践

通用架构

MCP 核心采用客户端-服务器架构,主机应用可以连接多个服务器:

一分钟入门mcp开发



MCP Hosts: 如 Claude Desktop、IDE 或 AI 工具,希望通过 MCP 访问数据的程序

MCP Clients: 维护与服务器一对一连接的协议客户端

MCP Servers: 轻量级程序,通过标准的 Model Context Protocol 提供特定能力

本地数据源: MCP 服务器可安全访问的计算机文件、数据库和服务

远程服务: MCP 服务器可连接的互联网上的外部系统(如通过 APIs)

MCP核心概念

MCP 服务器可以提供三种主要类型的能力:

1.Resources: 可以被 clients 读取的类文件数据(如 API 响应或文件内容)

2.Tools: 可以被 LLM 调用的函数(需要用户批准)

3.Prompts: 预先编写的模板,帮助用户完成特定任务

1.2 尝试解读

是一个桥接层

•支持本机进程通信和远程网络通信两种模式

•把大模型和应用依赖的资源间的联系规范化

一分钟入门mcp开发

2 如果你暂时没有着急的事情

👉 mcp的由来

2.1 再看mcp支持的三种资源

恰好适配大模型的三种应用方式,一切都是为了方便LLM主导的技术时代

 一分钟入门mcp开发



2.2 未来展望

mcp的背后逻辑:大家只对能力开源,且大家均遵守君子协定的假设

这种假设过于强,会存在很多隐患

参考文档

https://mcp-docs.cn/introduction

点赞
收藏
评论区
推荐文章
Karen110 Karen110
3年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Wesley13 Wesley13
3年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
mysql5.7.26 基于GTID的主从复制环境搭建
mysql5.7.26基于GTID的主从复制环境搭建时间:2019090616:10:21    阅读:20    评论:0    收藏:0    \点我收藏\标签:connect(https://www.oschina.net/action/GoToLink?
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
京东云开发者 京东云开发者
1个月前
EI与MCP的故事
作者:CHO孔令晗EIFuture,AINow!🎉🎉🎉MCP能做什么?先简单唠叨几句,试想一下,在MCP在之前,如果我们模型的产出更符合我们的预期,我们可能会将所需的数据上下文贴到Prompt中,但随着我们对产出的要求越来越高,CV大法的方式将信息添
京东云开发者 京东云开发者
7个月前
前端技术探秘-Nodejs的CommonJS规范实现原理
作者:京东物流乔盼盼了解Node.jsNode.js是一个基于ChromeV8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模型,让JavaScript运行在服务端的开发平台,它让JavaScript成为与PHP、Python、Pe
京东云开发者 京东云开发者
6个月前
cursor无敌了
作者:京东物流董振阳0、CursorIDECursor是一款基于人工智能的代码编辑器,创建了一个集成开发环境(IDE)。旨在帮助开发人员编写代码,并于AI进行实时互动,提供写代码建议、错误检测和自动补全功能。支持多种编程语言(如Python、JavaScr
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
京东云开发者 京东云开发者
1个月前
财务合同MCP实践
作者:CHO李航一、背景:随着MCP的普及,能否从业务角度,以MCP化的交互方式让业务简单通过自然语言描述进行对系统的操作,从而带来成本更低更便捷更快的体验。二、实现功能:1.根据合同状态或编号查询合同信息:i.question:请帮我查询待签署的合同ii