MCP服务器快速启动工具

一个基于TypeScript和Model Context Protocol (MCP) SDK构建的快速启动服务器示例,提供工具、资源和提示的定义与交互功能。

  • by scriptstar
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 scriptstar/mcp-starter-kit-node

使用说明

MCP快速启动服务器

这个项目是一个使用TypeScript构建的模型上下文协议(MCP)服务器的简单快速入门示例 @modelcontextprotocol/sdk。它演示了如何定义基本工具、资源和提示。

特性

  • 工具: add:将两个数字相加。
    • 参数: a (数字), b (编号)
    • 返回值:字符串形式的总和。
  • 工具: fetch-chuck-jokes:偶然听到查克·诺里斯的笑话。
    • 参数:无
    • 返回:Chuck Norris的笑话作为字符串。
  • 资源: greeting:提供个性化问候。
    • URI方案: greeting://{name}
    • 例子: greeting://World 将为“世界”献上问候。
  • 提示: getGreetingAndJoke:指示AI客户端按名字问候用户,然后告诉他们一个Chuck Norris的笑话。
    • 参数: name (字符串)
    • 示例:调用 name: "Narendra" 将为AI设置一个对话,以问候Narendra并讲一个笑话。

目录结构

quick-start/
├── build/              # Compiled JavaScript output
├── src/                # TypeScript source files
│   ├── index.ts        # Main server setup and entry point
│   ├── tools/
│   │   └── index.ts    # Tool definitions
│   ├── resources/
│   │   └── index.ts    # Resource definitions
│   └── prompts/
│       └── index.ts    # Prompt definitions
├── .gitignore
├── package-lock.json
├── package.json
├── tsconfig.json
└── README.md           # This file

先决条件

  • Node.js (建议使用v18.x或更高版本)
  • npm (附带Node.js)

设置和安装

  1. 克隆存储库(如果您还没有):

    git clone https://github.com/scriptstar/mcp-starter-kit-node.git
    cd mcp-starter-kit-node
    
  2. 安装依赖项:

    npm install
    

构建服务器

要将TypeScript代码编译为JavaScript,请运行:

npm run build

此命令执行 tsc (TypeScript编译器)根据 tsconfig.json 配置并将输出放置在 build/ 目录。它还使主构建文件可执行。

运行服务器

构建完成后,您可以使用以下命令启动MCP服务器:

node build/index.js

或者,对于类似生产的环境,您可以使用start脚本:

npm start

服务器将启动并监听标准输入(stdin)上的消息,并向标准输出(stdout)发送响应,因为它使用 StdioServerTransport.

开发工作流程

为了获得更高效的开发体验,您可以使用 dev 脚本:

npm run dev

此命令使用 concurrently 运行两个进程:

  1. tsc -w:监视TypeScript文件的更改并自动重新编译。
  2. nodemon build/index.js:观察变化 build 目录(其中 tsc 输出JavaScript)并自动重启Node.js服务器。

这在开发过程中提供了一种类似实时重新加载的体验。

代码检查

该项目使用ESLint和TypeScript支持来维护代码质量和一致性。

  • 要检查棉绒错误,请执行以下操作:
    npm run lint
    
  • 要自动修复可修复的棉绒错误,请执行以下操作:
    npm run lint:fix
    

建议在提交代码之前运行linter。

运作原理

此服务器实现模型上下文协议。

  • src/index.ts:初始化 McpServer 实例,从各自的模块导入工具、资源和提示注册函数,调用这些函数向服务器注册,然后连接 StdioServerTransport 处理沟通。
  • src/tools/index.ts:出口a registerTools 功能。
    • add:需要两个数字 a 和 b 并返回它们的总和。
    • fetch-chuck-jokes:向以下对象发出HTTP GET请求 https://api.chucknorris.io/jokes/random 并返回笑话。
  • src/resources/index.ts:出口a registerResources 功能。
    • greeting:定义资源模板 greeting://{name}当请求此URI时,它会返回一条个性化的问候消息。
  • src/prompts/index.ts:出口a registerPrompts 功能。
    • getGreetingAndJoke:定义一个需要 name 争论。它构建了一组初始消息来指导AI客户端。第一条消息(角色:助手)设置上下文,第二条消息(职位:用户)使用提供的 name.

与服务器交互(概念)

此MCP服务器设计为由MCP客户端(例如,AI助手、开发工具)控制。客户端通过向其stdin发送JSON-RPC消息并从其stdout接收响应来与服务器通信。

以下是客户端如何与定义的功能交互:

  1. 呼叫 add 工具: 客户端可以发送JSON-RPC请求,如下所示:

    {
      "jsonrpc": "2.0",
      "method": "callTool",
      "params": { "name": "add", "args": { "a": 5, "b": 3 } },
      "id": "request1"
    }
    

    服务器将返回结果:

    {
      "jsonrpc": "2.0",
      "result": { "content": [{ "type": "text", "text": "8" }] },
      "id": "request1"
    }
    
  2. 访问 greeting 资源: 客户端可以请求读取资源URI greeting://Alice:

    {
      "jsonrpc": "2.0",
      "method": "readResource",
      "params": { "uri": "greeting://Alice" },
      "id": "request2"
    }
    

    服务器将响应:

    {
      "jsonrpc": "2.0",
      "result": {
        "contents": [{ "uri": "greeting://Alice", "text": "Hello, Alice!" }]
      },
      "id": "request2"
    }
    
  3. 使用 getGreetingAndJoke 提示: 想要为“Bob”启动此引导任务的客户端将发送:

    {
      "jsonrpc": "2.0",
      "method": "getPrompt",
      "params": {
        "uri": "prompt://getGreetingAndJoke",
        "args": { "name": "Bob" }
      },
      "id": "request3"
    }
    

    服务器将以初始消息进行响应:

    {
      "jsonrpc": "2.0",
      "result": {
        "messages": [
          {
            "role": "assistant",
            "content": {
              "type": "text",
              "text": "You are a friendly assistant. Your task is to greet the user by their name and then tell them a Chuck Norris joke. You should use the available tools and resources to accomplish this. I will now wait for your instruction to proceed with greeting and joke telling for the specified user."
            }
          },
          {
            "role": "user",
            "content": {
              "type": "text",
              "text": "Please greet Bob and then tell a Chuck Norris joke."
            }
          }
        ]
      },
      "id": "request3"
    }
    

    然后,AI客户端将处理这些消息,并随后决定调用 greeting 资源(代表“Bob”)和 fetch-chuck-jokes 工具,使用单独 readResource 和 callTool 请求:

进一步发展

  • 添加具有各种输入/输出类型的更复杂的工具。
  • 实现与本地文件或数据库交互的资源。
  • 为多回合对话创建更复杂的提示。
  • 如果需要,探索其他传输层(例如HTTP)。
  • 添加全面的错误处理和日志记录。

这个README应该能很好地概述你的项目!