【AI 学习】用 Kotlin 开发一个最基础的 MCP Server 并让它与 Cursor 联动

前言

进入 2025 年后,在我的日常工作流里 AI 的使用率显著上升,使用的 AI 工具和用法也在逐步迭代。从一开始仅使用网页版的 ChatGPT / Claude 编写工具类代码,到在 Android Studio 里接入 GitHub Copilot 插件进行代码补全,再到可以独立完成功能开发的 Cursor 和最近流行的 CLI Agent,我一直在使用模型本身及 Cursor 等平台提供的工具,并没有真正研究过具体如何让模型与文件系统和代码库交互。

在今天这篇文档中,我将会通过编写一个 MCP Server 并在 Cursor 中实际调用它的方式,了解 LLM 如何与「现实世界」进行交互,以及我们应该如何封装工具给 LLM 调用,以最大限度为日常工作提效。

核心概念

1. MCP

MCP,全称 Model Context Protocol,中文翻译为模型上下文协议,是一套用于定义 LLM / 客户端 与 **外部「服务端(Server)」**之间交互方式的标准协议。支持发现与调用工具(Tools)、浏览资源(Resources)、订阅事件(Prompts / Notifications)等,目标是让 AI 客户端以统一方式接入系统能力。

2. 传输层

常见为 stdio(本地进程)、SSE(服务端推送)、WebSocket。后续的 Demo 会采用 stdio 方式,便于在本地通过 JSON-RPC 2.0 + LSP 风格头交互。

3. JSON-RPC 报文

采用 Content-Length: <n>\r\n\r\n + JSON 体 的 framing。请求包含 id、method、params,响应包含 id 对应的 result 或 error。

4. initialize

客户端启动后首先调用,服务端返回 protocolVersion、serverInfo、capabilities,用于声明支持哪些能力(如 tools)。

5. tools

服务端对外暴露的一组可调用操作。客户端可通过 tools/list 枚举工具,随后通过 tools/call 调用具体工具并获取结构化结果。

环境配置

MCP 官方提供了 TypeScript、Python 等多种语言的 SDK,这其中也包含 Kotlin。作为一名 Android 开发者,我将基于 MCP Kotlin SDK 来开发这个项目,使用的 IDE 则是 IntelliJ IDEA Community。

首先,创建一个 Kotlin 项目,Build System 选择 Gradle,JDK 版本这里我选择的是 17,Gradle DSL 选择的是 Groovy 语言(当然,也可以选择更现代化的 Kotlin DSL):

创建好项目之后,在 build.gradle 里先添加好 SDK 的依赖并加上 application 块,方便后续打二进制包供 MCP 客户端使用:

Groovy 复制代码
dependencies {
    implementation "io.modelcontextprotocol:kotlin-sdk:0.6.0"
}

application {
    mainClass = 'com.tangping.MainKt'
}

本次开发的 MCP 服务器将使用 stdio 与客户端通信,没法像普通 Web API 一样通过 Postman 测试,因此需要安装一个叫 MCP Inspector 的工具。这个工具需要用 npm 安装,提供了 Web 界面,能够很直观地测试 MCP 服务器的功能。本地安装了 npm 后,通过如下命令即可安装它:

Bash 复制代码
npm install -g @modelcontextprotocol/inspector

功能开发

我们将开发一个根据用户名来问好的简单工具,以演示 MCP Server 最基础的用法。首先,在 main 函数里定义一个 Server 对象,capabilities 参数中需要加上对 tools 的支持:

Kotlin 复制代码
val server = Server(
    serverInfo = Implementation(
        name = "MCPServerDemoKt",
        version = "1.0.0"
    ),
    options = ServerOptions(
        capabilities = ServerCapabilities(
            tools = ServerCapabilities.Tools(listChanged = true)
        )
    )
)

接下来为 Server 对象添加一个工具,并定义好工具的名称、描述以及入参:

Kotlin 复制代码
server.addTool(
    name = "hello",
    description = "A simple hello world tool",
    inputSchema = Tool.Input(
        properties = buildJsonObject {
            putJsonObject("name") {
                put("type", "string")
                put("description", "The name to greet")
            }
        },
        required = listOf("name")
    ),
    handler = ::handleHello
)

上面的 handler 参数指向如下的处理函数,此函数从 request 中解析出名为 name 的参数,并返回内容为 Hello, $name 的文本:

Kotlin 复制代码
private fun handleHello(request: CallToolRequest): CallToolResult {
    val name = request.arguments["name"]?.jsonPrimitive?.content ?: "World"
    return CallToolResult(
        content = listOf(TextContent(
            text = "Hello, $name!"
        ))
    )
}

指定通信方式为 stdio,再以阻塞方式启动服务器,业务代码就开发完毕了:

Kotlin 复制代码
val transport = StdioServerTransport(
    inputStream = System.`in`.asInput(),
    outputStream = System.out.asSink().buffered(),
)
runBlocking {
    server.connect(transport)
    val done = Job()
    server.onClose {
        done.complete()
    }
    println("MCP Server running...")
    done.join()
}

本地测试

用 IDE 运行一下编写好的程序,确认能看到 MCP Server running... 这行输出,就可以开始用 MCP Inspector 测试了。首先运行 ./gradlew installDist,将编译产物和运行依赖打包到一个本地的可运行目录结构中(在这里对应 build/install/项目名):

然后复制 bin 下可执行文件的绝对路径,在终端中运行命令 mcp-inspector <可执行文件的绝对路径>,浏览器会自动打开:

点击 Connect 按钮,服务器会自动连接上,然后就可以在 Tools 窗口中测试之前写好的 hello 工具了:

连接 Cursor

打开 Cursor,进入 Preferences > Cursor Settings > Tools & Integrations,点击 Add Custom MCP 按钮:

用以下内容替换 mcp.json 文件的内容(command 处要填写上面获取到的绝对路径),然后回到 Cursor Settings 页面:

JSON 复制代码
{
  "mcpServers": {
    "mcp-server-demo-kt": {
      "command": "/Users/admin/Projects/MCPServerDemoKt/build/install/MCPServerDemoKt/bin/MCPServerDemoKt",
      "args": [],
      "env": {}
    }
  }
}

能看到我们编写的 hello 工具已经在 Cursor 可用 MCP 工具的列表中了:

接下来打开 Agent 模式,让 LLM 调用我们的工具,分别对三名用户问好:

可以看到大模型已经能够调用我们封装好的能力了。

参考内容

本篇文章只是用一个最简单的例子演示了 MCP Server 的开发与测试流程,实际上 MCP 的强大之处远不止于此。如果想继续学习更深入的知识,可以参考以下内容:

【掘金】我用一个周末开发的 MCP 工具,让 Claude 帮我管理了整个项目

【掘金】手把手教你构建自己的 MCP 服务器并把它连接到你的 Cursor

以下是 MCP 的官方中英文文档,内含多种语言的 SDK 说明,进行相关开发时若遇到问题推荐先查询官方文档:

MCP 官方文档(英文)

MCP 官方文档(中文)

相关推荐
猿小羽几秒前
基于 Spring AI 与 Streamable HTTP 构建 MCP Server 实践
java·llm·spring ai·mcp·streamable http
AC赳赳老秦1 分钟前
等保2.0合规实践:DeepSeek辅助企业数据分类分级与自动化报告生成
大数据·人工智能·分类·数据挖掘·自动化·数据库架构·deepseek
FansyMeng2 分钟前
AI入门之anaconda安装
人工智能
小雨下雨的雨4 分钟前
HarmonyOS 应用开发实战:高精图像处理与头像裁剪持久化技术深度解析
图像处理·人工智能·华为·ai·交互·harmonyos·鸿蒙系统
共享家95274 分钟前
LangChain初识
人工智能·langchain
ASD123asfadxv4 分钟前
SAR图像地面军事目标识别与分类:YOLO11-Seg-RFAConv实现教程
人工智能·目标跟踪·分类
Marry Andy5 分钟前
Atlas 300l Duo部署qwen3_32b_light
linux·人工智能·经验分享·语言模型·自然语言处理
铁蛋AI编程实战5 分钟前
Agentic AI/GPT-4o替代/Spring AI 2.0/国产大模型轻量化
java·人工智能·spring
Mr. zhihao5 分钟前
从 Word2Vec 到 Transformer:Attention 是如何被“逼出来的”?
人工智能·transformer·word2vec
hit56实验室10 分钟前
【易经系列】《屯卦》九五:屯其膏,小贞吉,大贞凶
人工智能