MCP----当今程序员必备的知识

一.介绍

在当今快速发展的技术环境中,大型语言模型(LLM)已经成为人工智能领域的重要组成部分。这些模型不仅能够理解和生成自然语言,还能执行各种复杂的任务,如翻译、问答、甚至编程。然而,随着LLM的广泛应用,一个关键问题逐渐显现:如何使这些模型能够与外部世界进行有效互动?为了解决这一问题,模型上下文协议(Model Context Protocol,简称MCP)应运而生。
MCP是一个创新的开源协议,旨在标准化大型语言模型与外部数据源和工具之间的通信方式。它允许模型通过互联网找到一些有用的信息,而不仅仅是依赖于其训练数据。MCP的出现,使得LLM能够更加灵活地应对各种实际场景,从而为程序员提供了更多的可能性和便利。

技术诞生的前提

在深入探讨MCP之前,我们需要了解其诞生的背景和前提。随着人工智能技术的飞速发展,大语言模型(LLM)已经成为处理自然语言任务的强大工具。然而,传统的LLM在处理需要外部信息的任务时,往往显得力不从心。例如,当模型需要查询最新的新闻、天气信息或者调用外部API时,它通常无法直接与外部世界进行互动。
为了解决这一问题,研究人员和开发者们开始探索如何使LLM能够与外部环境进行通信。早期的方法包括通过API调用外部服务,但这些方法往往需要大量的手动配置和编码,且不够灵活。因此,一个能够简化这一过程的协议变得尤为重要。
MCP的诞生正是为了满足这一需求。它提供了一种标准化的方式来描述和调用外部服务,使得LLM能够更加轻松地与外部世界进行互动。MCP的设计理念是将复杂的外部服务简化为模型可以理解的格式,从而降低开发者的工作负担。
MCP的出现,解决了当前AI模型因数据孤岛限制而无法充分发挥潜力的难题。它使得AI应用能够安全地访问和操作本地及远程数据,为AI应用提供了连接万物的接口。
在AI项目开发中,人们发现集成AI模型复杂,现有框架如LangChain Tools、LlamaIndex和Vercel AI SDK存在问题。LangChain(一言难尽)和LlamaIndex代码抽象高,商业化过重;Vercel AI SDK与Nextjs绑定过深。而MCP的优势在于:一是开放标准利于服务商开发API,二是避免开发者重复造轮子,可利用现有MCP服务增强Agent。

MCP的原理 (C-S架构)

MCP的核心原理是通过定义一套标准化的接口和协议,使得大语言模型能够通过互联网找到一些有用的信息。先来看一个简单的天气查询:

  • 服务描述

MCP要求每个外部服务提供一个标准化的描述文件,该文件包含服务的功能、输入参数、输出格式等信息。这些信息以JSON格式表示,使得模型能够轻松解析和理解。

[
  {
    "name": "weather-service",
    "description": "获取城市天气信息",
    "endpoint": "/api/weather",
    "inputParams": { "city": "string" },
    "outputFormat": { "temperature": "number", "condition": "string" }
  }
]
package com.example.mcpdemo.model;

import java.util.Map;

public class ServiceDescription {
    private String name;
    private String description;
    private String endpoint;
    private Map<String, String> inputParams;
    private Map<String, String> outputFormat;

    // Getters and Setters
}
package com.example.mcpdemo.model;

import java.util.Map;

public class ServiceRequest {
    private String serviceName;
    private Map<String, Object> parameters;

    // Getters and Setters
}
  • 服务发现

模型可以通过互联网搜索或特定的目录找到这些服务描述文件。MCP提供了一套搜索机制,使得模型能够快速定位到所需的服务。

package com.example.mcpdemo.service;

import com.example.mcpdemo.model.ServiceDescription;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.*;

@Service
public class ServiceDiscovery {

    private final Map<String, ServiceDescription> services = new HashMap<>();

    @PostConstruct
    public void init() {
        // 模拟注册一个天气服务
        Map<String, String> input = new HashMap<>();
        input.put("city", "string");

        Map<String, String> output = new HashMap<>();
        output.put("temperature", "number");
        output.put("condition", "string");

        ServiceDescription weatherService = new ServiceDescription();
        weatherService.setName("weather-service");
        weatherService.setDescription("获取城市天气信息");
        weatherService.setEndpoint("/api/weather");
        weatherService.setInputParams(input);
        weatherService.setOutputFormat(output);

        services.put("weather-service", weatherService);
    }

    public Optional<ServiceDescription> findService(String serviceName) {
        return Optional.ofNullable(services.get(serviceName));
    }

    public Collection<ServiceDescription> getAllServices() {
        return services.values();
    }
}
  • 服务调用

一旦模型找到了合适的服务,它可以通过MCP的调用机制来调用该服务。调用过程包括提供必要的输入参数,并接收服务的输出结果。

package com.example.mcpdemo.controller;

import com.example.mcpdemo.model.ServiceDescription;
import com.example.mcpdemo.model.ServiceRequest;
import com.example.mcpdemo.service.ServiceDiscovery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class ServiceController {

    @Autowired
    private ServiceDiscovery serviceDiscovery;

    @PostMapping("/discover")
    public Collection<ServiceDescription> discoverServices() {
        return serviceDiscovery.getAllServices();
    }

    @PostMapping("/invoke")
    public Map<String, Object> invokeService(@RequestBody ServiceRequest request) {
        Map<String, Object> result = new HashMap<>();

        serviceDiscovery.findService(request.getServiceName()).ifPresent(desc -> {
            // 模拟调用服务并返回结果
            if ("weather-service".equals(desc.getName())) {
                String city = (String) request.getParameters().get("city");
                result.put("temperature", 25);
                result.put("condition", "晴");
                result.put("city", city);
            }
        });

        return result;
    }
}
  • 结果处理

模型根据接收到的输出结果进行进一步的处理和分析,从而完成任务。
MCP的设计使得整个过程自动化且高效。模型不需要手动配置或编码,只需要通过自然语言指令即可完成服务的发现和调用。这种设计大大降低了开发的复杂性,提高了开发效率。
MCP是一个开放协议,用于标准化应用程序向大语言模型提供上下文的方式。可以将MCP想象成AI应用程序的USB-C接口。就像USB-C为设备连接各种外设和配件提供了标准化接口一样,MCP为模型连接各种数据源和工具提供了标准化接口。
MCP遵循客户端-主机-服务器架构,其中每个主机可以运行多个客户端实例。该架构使用户能够跨应用程序集成AI能力,同时保持清晰的安全边界并隔离问题。MCP基于JSON-RPC构建,提供了一个有状态会话协议,专注于客户端和服务器之间的上下文交换和采样协调。
MCP主机就相当于一个应用程序,如:cursor,trae,为用户与LLM交互连接;MCP客户端就是中间枢纽,连接LLM与服务器;MCP服务器就负责在本地或外部查询信息
MCP的主要目的在于解决当前AI模型因数据孤岛限制而无法充分发挥潜力的难题。它使得AI应用能够安全地访问和操作本地及远程数据,为AI应用提供了连接万物的接口。

MCP的优势

你在使用大模型时,肯定遇到过你想查询一个最近刚发生的事,但返回在这里插入图片描述
但使用了MCP就不会出现这种事情了。

简化开发流程

MCP提供了一套标准化的接口和协议,使得开发者不需要手动配置和编码,就能实现LLM与外部服务的互动。这大大降低了开发的复杂性,提高了开发效率。

提高模型的灵活性

MCP使得LLM能够根据需要动态调用外部服务,而不必预先知道所有可能的外部信息。这种灵活性使得模型能够更好地适应各种实际场景。

增强模型的能力

通过调用外部服务,LLM能够获取最新的信息和功能,从而增强其处理复杂任务的能力。例如,模型可以查询最新的天气信息、新闻或者调用图像识别API等。

促进开放生态系统的建设

MCP是一个开源协议,鼓励开发者和企业共享和使用各种外部服务。这有助于建立一个开放、协作的技术生态系统。
MCP可以帮助我们在LLM之上构建Agent或者复杂的工作流,对于一些经常需要与数据和工具集成的场景,MCP协议提供以下功能:

  • 基于协议实现的集成数据集或工具可以以插件方式快速连接到LLM。
  • 解耦数据和模型,使开发者可以专注于特定领域数据和工具的开发。
    有了MCP,可以和数据和文件系统、开发工具、Web和浏览器自动化、生产力和通信、各种社区生态能力全部集成,实现强大的协作工作能力,它的价值远不可估量。
    MCP的出现,使得大模型应用能够安全地访问和操作本地及远程数据,为AI应用提供了连接万物的接口。它通过标准化的协议,简化了大模型与外部工具之间的集成过程,提高了开发效率。

MCP的缺点

尽管MCP具有诸多优势,但也存在一些潜在的缺点和挑战:

安全性和隐私问题

MCP使得LLM能够直接与外部服务互动,这可能导致模型暴露在安全风险中。例如,模型可能会被诱导调用恶意服务,或者在调用过程中泄露用户的敏感信息。

依赖外部服务的可靠性

MCP的运行依赖于外部服务的可用性和可靠性。如果某个服务不可用或响应缓慢,可能会影响整个系统的性能。

服务描述的质量

MCP依赖于服务提供者提供的服务描述文件。如果这些文件不准确或不完整,可能会影响模型调用服务的效果。

标准化的挑战

虽然MCP提供了一套标准化的接口和协议,但在实际应用中,不同服务提供商可能有不同的实现方式,这可能导致兼容性问题。

用户同意和控制

用户必须明确同意并理解所有数据访问和操作;用户必须保留对共享数据和执行操作的控制权。主机必须在向服务器发送用户数据之前实施明确的用户同意机制。这增加了实现的复杂性,可能影响用户体验[7]。

MCP的应用场景

MCP在实际应用中有着广泛的应用场景,以下是几个典型的应用例子:

路径规划智能体

大模型应用:智能体应用

  • 外部工具:Amap Maps MCP服务
  • 提供能力:地理信息获取能力
    通过MCP服务,智能体应用可以调用高德地图API获取地理位置信息,实现路径规划功能[1]。

网页爬取工作流

大模型应用:工作流应用

  • 外部工具:Firecrawl MCP服务
  • 提供能力:网页爬取能力
    通过MCP服务,工作流应用可以调用Firecrawl爬虫工具获取网页内容,实现数据采集功能[1]。

代码编辑器中的代码生成

在代码编辑器中,MCP可以用于调用代码生成API,根据上下文生成代码片段。例如,给定一个函数描述,MCP可以调用代码生成API生成相应的代码实现。

数据分析中的数据处理

在数据分析场景中,MCP可以用于调用数据处理API,对数据进行清洗、转换和分析。例如,给定一个数据集和分析需求,MCP可以调用数据处理API生成分析报告。

自然语言处理中的文本摘要

在自然语言处理场景中,MCP可以用于调用文本摘要API,对长文本进行摘要。例如,给定一篇新闻文章,MCP可以调用文本摘要API生成文章的摘要。
MCP通过提供标准化的接口和协议,使得开发者可以轻松地将大语言模型与各种外部工具和数据源集成,从而构建更加强大和实用的AI应用。

MCP的大致理解:(仅供参考)

定义查询新闻的任务

接下来,我们定义一个查询新闻的任务:

task = {
    "description": "查询最新的新闻信息",
    "required_input": {
        "category": "新闻"
    },
    "expected_output": {
        "type": "string",
        "description": "最新的新闻信息"
    }
}

提交任务

通过MCP客户端提交任务:

result = client.submit_task(task)

输出结果

最后,输出查询结果:

print(result)

MCP的未来发展

(太火了,已经23K了。GitHub地址我放在这里了:https://github.com/modelcontextprotocol)
随着人工智能技术的不断发展,MCP作为连接大语言模型与外部世界的重要协议,也将在未来得到进一步的发展和完善。

标准化与兼容性

随着MCP的广泛应用,其标准化和兼容性将得到进一步的提升。更多的服务提供商和开发者将采用MCP协议,从而形成一个更加开放和互联的生态系统。

安全性与隐私保护

随着MCP的广泛应用,安全性与隐私保护将成为未来发展的重点。MCP协议将引入更加严格的安全机制和隐私保护措施,确保用户数据的安全和隐私。

性能优化

为了提高MCP的性能,未来的MCP协议将进行性能优化,减少延迟,提高响应速度,从而提供更好的用户体验。

新功能与特性

未来的MCP协议将引入更多的功能和特性,如支持更多的数据类型和操作,提供更丰富的上下文信息,从而进一步增强大语言模型的能力。

企业级应用

随着MCP的成熟,其在企业级应用中的使用将更加广泛。更多的企业将采用MCP协议来集成大语言模型与企业内部系统,从而提高业务效率和创新能力。

结论

MCP(模型上下文协议)是一个创新的开源协议,它重新定义了大语言模型(LLM)与外部世界的互动方式。通过提供一套标准化的接口和协议,MCP使得LLM能够更加轻松地与外部服务进行互动,从而增强其处理复杂任务的能力。
MCP的主要优势在于简化了开发流程,提高了模型的灵活性,并促进了开放生态系统的建设。然而,它也存在一些潜在的缺点和挑战,如安全性和隐私问题、依赖外部服务的可靠性等。
对于入职开发人员来说,了解和掌握MCP的相关知识是非常重要的。通过学习MCP的原理、优势与缺点,以及如何使用代码示例和简单的开发全流程,开发者可以更加高效地利用大语言模型来解决实际问题。
希望本文能够帮助你更好地理解MCP,并在实际开发中应用这一技术。
感谢你看到这里,喜欢的可以点点关注哦!

参考资料

[0] 一文看懂:MCP(大模型上下文协议) - 知乎专栏. https://zhuanlan.zhihu.com/p/27327515233.
[1] 模型上下文协议(MCP) - 阿里云文档- Aliyun.com. https://help.aliyun.com/zh/model-studio/mcp-introduction.
[2] 大模型上下文协议——MCP详解 - 知乎专栏. https://zhuanlan.zhihu.com/p/19707405738.
[5] 模型上下文协议(MCP) - Anthropic API. https://docs.anthropic.com/zh-CN/docs/agents-and-tools/mcp.
[6] MCP 协议规范. https://www.claudemcp.com/zh/specification.
[7] 规范- MCP中文文档. https://mcp.maomu.com/specification/2025-03-26/index.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值