从零开始学MCP | 什么是 MCP?MCP 核心概念详细解析!

一、什么是 MCP?

模型上下文协议 (Model Context Protocol, MCP) 是一种旨在标准化人工智能模型(尤其是大型语言模型等)与外部工具、资源或环境进行交互的方式的协议。其核心目标是使模型能够安全、可控地扩展其能力,超越自身固有的知识和计算限制。

在这里插入图片描述

随着人工智能模型变得越来越强大,让Agent能够安全有效地与外部世界互动变得至关重要。MCP 提供了一种结构化的方法来实现这一点,从而解锁了 AI 的新应用场景,例如:

  • 增强的知识检索: 模型可以调用搜索引擎或知识库 API 来获取最新的信息,超越其训练数据的限制。

  • 自动化工作流程: 模型可以调用各种工具和服务来自动化复杂的任务,例如发送邮件、管理日程、部署代码等。

  • 与物理世界的互动: 模型可以控制机器人、智能家居设备或其他物理系统。个性化体验: 模型可以访问用户特定的数据和服务,从而提供更加个性化的体验。

定义了模型、工具和用户之间如何进行交互。你可以把它看作是一个框架,规定了构建智能对话系统时需要考虑和处理的关键要素。

在这里插入图片描述

对于客户端通常是发起 request 然后服务器返回 Result,当资源发生变化时候服务器端推送给客户端 notification

常见的推送技术:

  • WebSockets:
    一种持久化的双向通信协议,服务器和客户端可以随时互相发送数据。常用于网页应用。

  • Server-Sent Events (SSE):
    服务器单向地向客户端推送事件的简单协议,适用于只需要服务器向客户端发送更新的场景。

  • MQTT (Message Queuing Telemetry Transport):
    一种轻量级的发布/订阅消息协议,常用于物联网设备和移动应用。

  • Firebase Cloud Messaging (FCM) / Apple Push Notification service (APNs):
    专门用于向移动App推送通知的平台服务。

在这里插入图片描述

核心概念:

  • Request (请求):
    客户端发送给服务器,请求执行某个操作并期望得到响应(Result)。

  • Result (结果):
    服务器对客户端发送的 Request 的成功响应。

  • Notification (通知):
    客户端或服务器发送的单向消息,不期望收到响应。

  • Prompt (提示):
    给模型提供的指令,用于指导其生成回复或执行任务。

  • Resource (资源):
    模型在执行任务时可能需要访问的数据或工具。

  • Log (日志):
    对话过程的记录。

  • Tool (工具):
    模型可以执行的特定操作。

工具 (Tools): 由 MCP 服务器暴露的可执行功能,AI 客户端可以请求使用。
资源 (Resources): 由 MCP 服务器暴露的数据和内容,可以作为 AI 的上下文信息使用。
提示词 (Prompts): 由服务器定义的可重用提示模板,客户端可以使用。

在这里插入图片描述

class ListPromptsRequest(Request):
    """Sent from the client to request a list of prompts and prompt templates the server has."""
    method: Literal["prompts/list"]
    params: RequestParams | None = None

客户端希望了解服务器有哪些可用的 prompts 资源。客户端向服务器请求获取服务器所提供的提示(Prompt)和提示模板的列表。

class Prompt(BaseModel):
    """A prompt or prompt template that the server offers."""
    name: str
    """The name of the prompt or prompt template."""
    description: str | None = None
    """An optional description of what this prompt provides."""
    arguments: list[PromptArgument] | None = None
    """A list of arguments to use for templating the prompt."""
    model_config = ConfigDict(extra="allow")

这是服务器提供的核心 prompts 资源 的抽象表示,用于表示服务器提供的一个提示或一个提示模板。其中 name: str 提示或提示模板的名称,用于在客户端进行标识。description: str | None = None: 对该提示提供的功能的描述。arguments: list[PromptArgument] | None = None: 如果这是一个提示模板,则包含一个 PromptArgument 对象的列表,描述了使用该模板时需要提供的参数。如果这是一个可以直接使用的提示,则可能为 None 或空列表。

class PromptArgument(BaseModel):
    """An argument for a prompt template."""
    name: str
    """The name of the argument."""
    description: str | None = None
    """A human-readable description of the argument."""
    required: bool | None = None
    """Whether this argument must be provided."""
    model_config = ConfigDict(extra="allow")

这个类定义了一个提示模板的参数。当服务器提供一个可以被模板化的提示时,这个类用于描述该模板中需要用户提供的每个参数。

class ListPromptsResult(Result):
    """The server's response to a prompts/list request from the client."""
    prompts: list[Prompt]

这是服务器对 ListPromptsRequest成功响应类。它包含了服务器提供的提示和提示模板的列表。这是服务器返回的 prompts 资源 信息。返回为 Prompt 的列表。

class GetPromptRequestParams(RequestParams):
    """Parameters for getting a prompt."""
    name: str
    """The name of the prompt or prompt template."""
    arguments: dict[str, str] | None = None
    """Arguments to use for templating the prompt."""
    model_config = ConfigDict(extra="allow")
class GetPromptRequest(Request):
    """Used by the client to get a prompt provided by the server."""
    method: Literal["prompts/get"]
    params: GetPromptRequestParams

这里其中 GetPromptRequestParams这个类定义了客户端向服务器请求获取特定提示时需要提供的参数。GetPromptRequest(Request):这是一个请求类,用于客户端向服务器请求获取一个特定的提示

class TextContent(BaseModel):
    """Text content for a message."""
    type: Literal["text"]
    text: str
    """The text content of the message."""
    model_config = ConfigDict(extra="allow")
class ImageContent(BaseModel):
    """Image content for a message."""
    type: Literal["image"]
    data: str
    """The base64-encoded image data."""
    mimeType: str
    """The MIME type of the image. Different providers may support different image types."""
    model_config = ConfigDict(extra="allow")
Role = Literal["user", "assistant"]

以上这些类定义 message 中角色 role 取值范围以及 message content 的类别。

class SamplingMessage(BaseModel):
    """Describes a message issued to or received from an LLM API."""
    role: Role
    content: TextContent | ImageContent
    model_config = ConfigDict(extra="allow"

这个类描述了发送给或接收自语言模型 (LLM API) 的一条消息。它封装了消息的角色和内容。这是构建 prompts 并解析模型回复的基本单元。一个完整的 prompt 可能由多条 SamplingMessage 组成(例如,包含上下文的多轮对话)。content: TextContent | ImageContent: 消息的具体内容,可以是文本或图像。这表明模型可以处理和生成多模态内容。

好的,我们继续基于 MCP 的概念来解释你提供的关于 “tools”(工具)的 Python 类。这些类定义了客户端如何发现和调用 MCP 服务提供的各种工具。

MCP 工具服务核心概念:

  • 工具资源管理:
    MCP 服务提供了一系列可供模型或客户端调用的工具(Tool),以扩展其能力。

  • 工具发现:
    客户端可以查询 MCP 服务以获取可用的工具列表。

  • 工具描述:
    每个工具都有名称、描述和输入模式(inputSchema),用于指导客户端如何正确调用该工具。

  • 工具调用:
    客户端可以发送请求来实际调用 MCP 服务提供的工具,并传递必要的参数。

  • 工具调用结果:
    MCP 服务会返回工具调用的结果。

  • 工具列表变更通知:
    服务端可以主动通知客户端工具列表发生了变化。

class Tool(BaseModel):
    """Definition for a tool the client can call."""
    name: str
    """The name of the tool."""
    description: str | None = None
    """A human-readable description of the tool."""
    inputSchema: dict[str, Any]
    """A JSON Schema object defining the expected parameters for the tool."""
    model_config = ConfigDict(extra="allow")

这个类定义了一个工具的结构,描述了客户端可以调用的一个功能。这是 MCP 提供的核心 tools 资源的抽象表示。

inputSchema: dict[str, Any]: 一个 JSON Schema 对象,定义了调用该工具时期望的参数及其结构和类型。这对于客户端正确地构建 CallToolRequest 非常重要。

class ListToolsRequest(Request):
    """Sent from the client to request a list of tools the server has."""
    method: Literal["tools/list"]
    params: RequestParams | None = None

用于客户端向服务器请求获取服务器所提供的工具列表。

class ListToolsResult(Result):
    """The server's response to a tools/list request from the client."""
    tools: list[Tool]

这是服务器对 ListToolsRequest成功响应类。它包含了服务器提供的工具列表。

class CallToolRequestParams(RequestParams):
    """Parameters for calling a tool."""
    name: str
    arguments: dict[str, Any] | None = None
    model_config = ConfigDict(extra="allow")
class CallToolRequest(Request):
    """Used by the client to invoke a tool provided by the server."""
    method: Literal["tools/call"]
    params: CallToolRequestParams

CallToolRequestParams(RequestParams)定义了客户端向服务器调用特定工具时需要提供的参数。CallToolRequest 用于客户端向服务器发起调用特定工具的请求。

class CallToolResult(Result):
    """The server's response to a tool call."""
    toolResult: Any

服务器对 CallToolRequest 的成功响应类。它包含了工具调用的结果。

class ToolListChangedNotification(Notification):
    """An optional notification from the server to the client, informing it that the list of tools it offers has changed."""
    method: Literal["notifications/tools/list_changed"]
    params: NotificationParams | None = None

这是一个通知类,服务器可以主动发送给客户端,告知客户端服务器提供的工具列表已经发生了变化。一种机制,允许服务器将 tools资源 的变化通知给感兴趣的客户端,而无需客户端通过轮询来获取资源变更信息。

这些类共同定义了 MCP 中工具服务的交互方式。客户端可以通过 ListToolsRequest 获取可用的工具列表,通过 CallToolRequest 调用特定的工具,并接收 CallToolResult 作为响应。服务器还可以通过 ToolListChangedNotification 主动通知客户端工具列表的更新。这种设计使得模型或客户端能够动态地发现和利用 MCP 服务提供的各种功能强大的工具,从而扩展其能力和应用场景。这与 MCP 旨在构建灵活和可扩展的对话式 AI 系统的目标是一致的。

MCP 日志记录服务核心概念:

  • 日志级别控制:
    客户端可以请求服务器调整发送给它的日志消息的详细程度。

  • 标准化日志消息:
    服务器通过特定的通知向客户端发送日志消息,包含日志级别、记录器名称(可选)和实际的日志数据。

  • 单向通知:
    日志消息是从服务器发送到客户端的通知,客户端不期望对此进行响应。

LoggingLevel = Literal["debug", "info", "warning", "error"]

类型别名,定义了日志记录的级别

class SetLevelRequestParams(RequestParams):
    """Parameters for setting the logging level."""
    level: LoggingLevel
    """The level of logging that the client wants to receive from the server."""
    model_config = ConfigDict(extra="allow")
class SetLevelRequest(Request):
    """A request from the client to the server, to enable or adjust logging."""
    method: Literal["logging/setLevel"]
    params: SetLevelRequestParams

用于客户端向服务器发送设置日志级别的请求。客户端希望配置log资源的输出。包含了设置日志级别所需的参数,即期望的日志级别。

class LoggingMessageNotificationParams(NotificationParams):
    """Parameters for logging message notifications."""
    level: LoggingLevel
    """The severity of this log message."""
    logger: str | None = None
    """An optional name of the logger issuing this message."""
    data: Any
    """The data to be logged, such as a string message or an object. Any JSON serializable type is allowed here."""
    model_config = ConfigDict(extra="allow")

这个类定义了服务器向客户端发送日志消息通知时包含的参数。

  • level: LoggingLevel: 这条日志消息的严重程度。
  • logger: str | None = None: 可选的发出这条日志消息的记录器的名称。这有助于客户端识别日志消息的来源。
  • data: Any: 要记录的实际数据。这可以是字符串消息、对象或其他任何可以被 JSON 序列化的类型。这提供了很大的灵活性,可以记录各种类型的信息。

这些类定义了 MCP 中简单的日志记录机制。客户端可以通过 SetLevelRequest 请求服务器调整发送给它的日志级别。服务器则可以通过 LoggingMessageNotification 主动地将日志消息推送给客户端。这种机制允许客户端根据需要控制接收到的日志信息量,并为客户端提供了查看服务器内部运行状态的一种方式,有助于调试和监控。由于 LoggingMessageNotification 是一个 Notification,所以客户端在收到日志消息后不需要发送任何响应。

好的,我们继续基于 MCP 的概念来解释你提供的关于 “sampling”(采样)和 “completion”(补全)的 Python 类。这些类定义了 MCP 服务如何请求客户端(通常是更底层的 LLM 接口)进行语言模型采样和补全操作。

MCP 采样服务核心概念:

  • 服务器请求采样:

    MCP 服务本身可能不直接与底层的 LLM API 交互,而是通过客户端发送采样请求。

  • 标准化的采样请求:

    CreateMessageRequest 定义了服务器向客户端请求生成 LLM 消息的标准格式,包含了生成消息所需的各种参数。

  • 上下文管理:

    MCP 允许服务器请求客户端包含来自不同 MCP 服务器的上下文信息,以增强 LLM 的生成效果。

  • 标准化的采样结果:

    CreateMessageResult 定义了客户端返回给服务器的 LLM 采样结果的格式,包含了生成的消息内容、模型信息和停止原因。

MCP 补全服务核心概念:

  • 客户端请求补全:

    客户端可以请求服务器提供基于特定资源或提示的补全选项。

  • 资源引用:

    ResourceReferencePromptReference 用于指定补全所基于的资源或提示。

  • 参数化补全:

    CompletionArgument 用于提供补全的上下文参数。

  • 标准化的补全请求和结果:

    CompleteRequestCompleteResult 定义了客户端与服务器之间进行补全请求和响应的标准格式。

  • 补全选项:

    Completion 类包含了服务器返回的补全值以及相关的元数据,如总数和是否有更多选项。

IncludeContext = Literal["none", "thisServer", "allServers"]

类型别名,定义了在创建消息时包含上下文的范围

"none": 不包含任何额外的上下文。"thisServer": 包含来自发起 ``CreateMessageRequest 的 MCP 服务器的上下文。“allServers”: 包含来自所有相关的 MCP 服务器的上下文。

class CreateMessageRequestParams(RequestParams):
    """Parameters for creating a message."""
    messages: list[SamplingMessage]
    systemPrompt: str | None = None
    """An optional system prompt the server wants to use for sampling."""
    includeContext: IncludeContext | None = None
    """A request to include context from one or more MCP servers (including the caller), to be attached to the prompt."""
    temperature: float | None = None
    maxTokens: int
    """The maximum number of tokens to sample, as requested by the server."""
    stopSequences: list[str] | None = None
    metadata: dict[str, Any] | None = None
    """Optional metadata to pass through to the LLM provider."""
    model_config = ConfigDict(extra="allow")

messages: list[SamplingMessage]: 一个包含 SamplingMessage 对象的列表,构成了发送给 LLM 的输入提示。这可以包含用户和助手之间的多轮对话历史。
systemPrompt: str | None = None: 一个可选的系统提示,用于指导 LLM 的行为。
includeContext: IncludeContext | None = None: 请求包含来自一个或多个 MCP 服务器的上下文信息。
temperature: float | None = None: LLM 采样的温度参数,控制生成文本的随机性。
maxTokens: int: 服务器请求 LLM 生成的最大 token 数。
stopSequences: list[str] | None = None: 一组字符串,当 LLM 生成的文本包含这些字符串时,采样将停止。
metadata: dict[str, Any] | None = None: 可选的元数据,用于传递给底层的 LLM 提供商。
model_config = ConfigDict(extra="allow"): 允许额外的字段。

class CreateMessageRequest(Request):
    """A request from the server to sample an LLM via the client."""
    method: Literal["sampling/createMessage"]
    params: CreateMessageRequestParams
StopReason = Literal["endTurn", "stopSequence", "maxTokens"]

类型别名,定义了 LLM 停止生成文本的原因

endTurn: LLM 认为当前轮对话已结束。
stopSequence: LLM 生成的文本包含了一个在 stopSequences 中指定的停止序列。
maxTokens: LLM 生成的 token 数达到了 maxTokens 的限制。

class CreateMessageResult(Result):
    """The client's response to a sampling/create_message request from the server."""
    role: Role
    content: TextContent | ImageContent
    model: str
    """The name of the model that generated the message."""
    stopReason: StopReason
    """The reason why sampling stopped."""

这是客户端对 CreateMessageRequest成功响应类,包含了 LLM 生成的消息内容。

role: Role: 生成的消息的角色,通常是 “assistant”。
content: TextContent | ImageContent: LLM 生成的实际内容,可以是文本或图像。 model: str: 生成此消息的 LLM 的名称或标识符。 stopReason: StopReason`: LLM 停止生成文本的原因。
继承自 Result,表明这是一个成功的采样操作结果。

class ResourceReference(BaseModel):
    """A reference to a resource or resource template definition."""
    type: Literal["ref/resource"]
    uri: str
    """The URI or URI template of the resource."""
    model_config = ConfigDict(extra="allow")

MCP 关联: 这用于在补全请求中指定要基于哪个 resource 进行补全。
字段解释:
type: Literal["ref/resource"]: 指明这是一个资源引用。
uri: str: 资源的 URI 或 URI 模板。
class PromptReference(BaseModel):

class PromptReference(BaseModel):
    """Identifies a prompt."""
    type: Literal["ref/prompt"]
    name: str
    """The name of the prompt or prompt template"""
    model_config = ConfigDict(extra="allow")

二、如何系统学习掌握AI大模型?

AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。

学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。

这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享

在这里插入图片描述

1. 成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。

在这里插入图片描述

2. 大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

在这里插入图片描述

3. 大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

在这里插入图片描述

4. 2024行业报告

行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

在这里插入图片描述

5. 大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

在这里插入图片描述

6. 大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

在这里插入图片描述

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方CSDN官方认证二维码,免费领取【保证100%免费

在这里插入图片描述