2分钟构建自己的MCP服务器,从算数到 Firecrawl MCP(手动挡 + AI档)

大模型向量数据库云通信

🍹

Insight Daily

🪺

Aitrainee | 公众号:AI进修生

Hi,这里是Aitra inee,欢迎阅 读本期新文章。

你可能听说过 MCP 服务器,甚至看过相关配置实践。

但今天,我们将更进一步:构建你自己的 MCP 服务器。

这不仅仅是一个教程。

我们将深入 MCP 服务器的核心概念。

并展示如何利用 AI,轻松生成它。

无需编写大量代码,只需提供关键上下文。

我们会先构建一个最简单的mcp。

但,MCP 服务器不仅可以用于本地工具,还可以与 API 交互。

换句话说,MCP 服务器可以控制任何有 API 的平台。

所以我们会到构建一个基于Firecrawl的AI搜索和AI爬虫的、初具使用价值的MCP。

你可以用这个方法,为几乎任何工具构建 MCP 服务器,无论是本地运行的程序,还是远程 API,都可以通过 MCP 服务器进行控制。

准备好了吗?

MCP 文档支持多种 SDK,包括 Python、TypeScript、Java 和 Kotlin。

picture.image

https://modelcontextprotocol.io/introduction

选择你最擅长的。

我将使用 TypeScript SDK,你可以在 GitHub 上找到。

picture.image

https://github.com/modelcontextprotocol/typescript-sdk/blob/main/README.md

这个文档,除了安装指南,还有一个快速构建MCP入门指南。

picture.image

掌握这些基础,你将能够构建任何你想要的功能。

什么是 MCP?

MCP,全称模型上下文协议,是一种协议,旨在以安全、标准化的方式连接大型语言模型(LLMs)与外部数据源和工具。它被比作AI应用程序的USB-C端口,简化了AI模型与数据和服务的交互。

picture.image

  • 通过

资源(Resources)

暴露数据(类似于 GET 端点;用于将信息加载到 LLM 的上下文中)。

  • 通过

工具(Tools)

提供功能(类似于 POST 端点;用于执行代码或产生副作用)。

  • 通过

提示(Prompts)

定义交互模式(可复用的 LLM 交互模板)。

  • 以及更多功能!

picture.image

更多的详情,你可以在我这个做实验的网站中找到:

picture.image

https://aiagency.xin/blog

构建一个最简单的加法计数MCP

每当我们构建一些新的东西的时候,通常需要做一些开发环境。MCP也不例外。

所以首先,我们需要安装MCP第三方包。

  1. 全局安装MCP SDK包

picture.image

  1. 创建一个简单的MCP 服务器(如图片所示的示例代码)

创建一个目录。

picture.image

创建一个index文件

picture.image

index文件里面的代码详细是这样:

先来搭个 MCP 服务器的架子:


      
 
 
 
 
 
 
      
          

        import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
        
   

 
        import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
        
   

 
        import { z } from "zod";
      
    

这几行,把需要的工具先准备好。 McpServer 用来建服务器, ResourceTemplate 用来做资源模板, StdioServerTransport 负责通信, zod 用来校验数据格式。

建个服务器:


      
 
 
 
 
 
 
      
          

        const server = new McpServer({
        
   

 
          name: "Demo",
        
   

 
          version: "1.0.0"
        
   

 
        });
      
    

给服务器起个名(Demo),写上版本号(1.0.0)。

加个加法工具:


      
 
 
 
 
 
 
      
          

        server.tool("add",
        
   

 
          { a: z.number(), b: z.number() },
        
   

 
          async ({ a, b }) => ({
        
   

 
            content: [{ type: "text", text: String(a + b) }]
        
   

 
          })
        
   

 
        );
      
    

server.tool 就是添加工具。 "add" 是工具名,后面跟着输入参数( ab ,都是数字),最后是具体干啥:把 ab 加起来。

再加个打招呼的资源:


      
 
 
 
 
 
 
      
          

        server.resource(
        
   

 
          "greeting",
        
   

 
          new ResourceTemplate("greeting://{name}", { list: undefined }),
        
   

 
          async (uri, { name }) => ({
        
   

 
            contents: [{
        
   

 
              uri: uri.href,
        
   

 
              text: `Hello, ${name}!`
        
   

 
            }]
        
   

 
          })
        
   

 
        );
      
    

server.resource 就是添加资源。 "greeting" 是资源名, greeting://{name} 是资源模板, {name} 是个变量。后面跟着具体干啥:根据 name 变量,生成一句 “Hello, xxx!”。

最后,让服务器跑起来:


      
 
 
 
 
 
 
      
          

        const transport = new StdioServerTransport();
        
   

 
        await server.connect(transport);
      
    

StdioServerTransport 负责用标准输入输出(stdin/stdout)来通信。 server.connect 就把服务器和通信方式连起来了。

完整如下:


          
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
          
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
          
import { z } from "zod";
          

          
// Create an MCP server
          
const server = new McpServer({
          
  name: "Demo",
          
  version: "1.0.0"
          
});
          

          
// Add an addition tool
          
server.tool("add",
          
  { a: z.number(), b: z.number() },
          
  async ({ a, b }) => ({
          
    content: [{ type: "text", text: String(a + b) }]
          
  })
          
);
          

          
// Add a dynamic greeting resource
          
server.resource(
          
  "greeting",
          
  new ResourceTemplate("greeting://{name}", { list: undefined }),
          
  async (uri, { name }) => ({
          
    contents: [{
          
      uri: uri.href,
          
      text: `Hello, ${name}!`
          
    }]
          
  })
          
);
          

          
// Start receiving messages on stdin and sending messages on stdout
          
const transport = new StdioServerTransport();
          
await server.connect(transport);
      
0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
大规模高性能计算集群优化实践
随着机器学习的发展,数据量和训练模型都有越来越大的趋势,这对基础设施有了更高的要求,包括硬件、网络架构等。本次分享主要介绍火山引擎支撑大规模高性能计算集群的架构和优化实践。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论