惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
Microsoft Security Blog
Microsoft Security Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Vercel News
Vercel News
Application and Cybersecurity Blog
Application and Cybersecurity Blog
C
Check Point Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
The Hacker News
The Hacker News
L
LINUX DO - 热门话题
T
Tenable Blog
Hugging Face - Blog
Hugging Face - Blog
Google Online Security Blog
Google Online Security Blog
博客园 - Franky
P
Proofpoint News Feed
H
Hacker News: Front Page
P
Privacy & Cybersecurity Law Blog
月光博客
月光博客
P
Proofpoint News Feed
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
The GitHub Blog
The GitHub Blog
云风的 BLOG
云风的 BLOG
博客园_首页
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
CERT Recently Published Vulnerability Notes
Forbes - Security
Forbes - Security
I
InfoQ
Stack Overflow Blog
Stack Overflow Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Attack and Defense Labs
Attack and Defense Labs
N
News and Events Feed by Topic
博客园 - 叶小钗
T
Threat Research - Cisco Blogs
aimingoo的专栏
aimingoo的专栏
D
Darknet – Hacking Tools, Hacker News & Cyber Security
小众软件
小众软件
大猫的无限游戏
大猫的无限游戏
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Hacker News - Newest:
Hacker News - Newest: "LLM"
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
O
OpenAI News
G
Google Developers Blog
Martin Fowler
Martin Fowler
罗磊的独立博客
S
SegmentFault 最新的问题
T
Tor Project blog
量子位

李宇博客

web图像色彩 相册 - 夏天 | 李宇Blog Iphone SE2 体验 IOS14 体验 相册 - 三月 | 李宇Blog “视频” 是怎么来的? 相册 - 上海双年展 相册 - 西安 | 李宇Blog 过去几年用过的一些手机 世界杯 Dusha字体 一年的时间 相册 - 朱家角 | 李宇Blog
MCP 怎么用
李宇 · 2025-11-21 · via 李宇博客
import { readdir, stat } from 'fs/promises'
import { join } from 'path'
import { homedir } from 'os'
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'

// 创建 MCP 服务器实例
// name 和 version 用于标识服务器
const server = new McpServer({
  name: 'desktop_folders',
  version: '1.0.0',
})

/**
 * 注册工具:list_desktop_folders
 *
 * server.tool() 方法用于注册一个可被 AI 调用的工具
 * 参数说明:
 *   - 第一个参数:工具名称(AI 通过这个名称调用工具)
 *   - 第二个参数:工具的参数定义(这里为空对象,表示不需要参数)
 *   - 第三个参数:工具的执行函数(异步函数,返回工具执行结果)
 */
server.tool(
  'list_desktop_folders',
  {}, // 工具参数定义(空对象表示无参数)
  async () => {
    try {
      // 获取桌面路径(跨平台兼容)
      const desktopPath = join(homedir(), 'Desktop')

      // 读取桌面目录下的所有文件和文件夹
      const items = await readdir(desktopPath)

      // 并行检查每个项目是否为文件夹(提高性能)
      const folderChecks = await Promise.all(
        items.map(async (item) => {
          const itemPath = join(desktopPath, item)
          const stats = await stat(itemPath)
          return stats.isDirectory() ? item : null
        })
      )

      // 过滤出文件夹名称(移除 null 值)
      const folders = folderChecks.filter(Boolean)

      // 格式化返回结果
      // MCP 工具必须返回特定格式:content 数组包含文本内容
      return {
        content: [
          {
            type: 'text',
            text:
              folders.length > 0
                ? `桌面上的文件夹:\n${folders.join('\n')}\n\n共 ${folders.length} 个文件夹`
                : '桌面上没有文件夹',
          },
        ],
      }
    } catch (error) {
      // 错误处理:返回错误信息并标记为错误
      return {
        content: [
          {
            type: 'text',
            text: `错误:${error.message}`,
          },
        ],
        isError: true,
      }
    }
  }
)

/**
 * 启动服务器
 *
 * StdioServerTransport 使用标准输入输出进行通信
 * 这是 MCP 服务器最常见的通信方式
 */
const transport = new StdioServerTransport()
await server.connect(transport)

import { readdir, stat } from 'fs/promises'
import { join } from 'path'
import { homedir } from 'os'
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'

// 创建 MCP 服务器实例
// name 和 version 用于标识服务器
const server = new McpServer({
  name: 'desktop_folders',
  version: '1.0.0',
})

/**
 * 注册工具:list_desktop_folders
 *
 * server.tool() 方法用于注册一个可被 AI 调用的工具
 * 参数说明:
 *   - 第一个参数:工具名称(AI 通过这个名称调用工具)
 *   - 第二个参数:工具的参数定义(这里为空对象,表示不需要参数)
 *   - 第三个参数:工具的执行函数(异步函数,返回工具执行结果)
 */
server.tool(
  'list_desktop_folders',
  {}, // 工具参数定义(空对象表示无参数)
  async () => {
    try {
      // 获取桌面路径(跨平台兼容)
      const desktopPath = join(homedir(), 'Desktop')

      // 读取桌面目录下的所有文件和文件夹
      const items = await readdir(desktopPath)

      // 并行检查每个项目是否为文件夹(提高性能)
      const folderChecks = await Promise.all(
        items.map(async (item) => {
          const itemPath = join(desktopPath, item)
          const stats = await stat(itemPath)
          return stats.isDirectory() ? item : null
        })
      )

      // 过滤出文件夹名称(移除 null 值)
      const folders = folderChecks.filter(Boolean)

      // 格式化返回结果
      // MCP 工具必须返回特定格式:content 数组包含文本内容
      return {
        content: [
          {
            type: 'text',
            text:
              folders.length > 0
                ? `桌面上的文件夹:\n${folders.join('\n')}\n\n共 ${folders.length} 个文件夹`
                : '桌面上没有文件夹',
          },
        ],
      }
    } catch (error) {
      // 错误处理:返回错误信息并标记为错误
      return {
        content: [
          {
            type: 'text',
            text: `错误:${error.message}`,
          },
        ],
        isError: true,
      }
    }
  }
)

/**
 * 启动服务器
 *
 * StdioServerTransport 使用标准输入输出进行通信
 * 这是 MCP 服务器最常见的通信方式
 */
const transport = new StdioServerTransport()
await server.connect(transport)