Desktop Extensions (DXT) 详解

Desktop Extensions (DXT) 详解

什么是Desktop Extensions (DXT)?

Desktop Extensions (DXT,桌面扩展) 是一种用于打包和分发本地MCP (Model Context Protocol) 服务器的标准化格式。它类似于Chrome扩展(.crx)或VS Code扩展(.vsix),允许用户通过单次点击安装本地MCP服务器。

Desktop Extensions​https://www.anthropic.com/engineering/desktop-extensions

DXT的核心是一个包含以下内容的ZIP压缩包: - 完整的本地MCP服务器代码/二进制文件 - 描述扩展功能和配置的manifest.json文件 - 其他资源文件(如图标、配置文件等)

DXT的主要特点

特点 (Feature)描述 (Description)优势 (Advantage)
单文件分发 (Single-file distribution)所有内容打包在一个.dxt文件中简化安装和分发过程
标准化配置 (Standardized configuration)通过manifest.json定义服务器配置消除手动配置错误
跨平台支持 (Cross-platform support)支持Node.jsPython和二进制服务器开发者可自由选择技术栈
用户配置集成 (User configuration integration)内置用户配置系统提供统一的配置界面
自动更新 (Automatic updates)支持扩展版本管理和更新确保用户使用最新版本

DXT使用方法

1. 安装CLI工具

npm install -g @anthropic-ai/dxt

2. 创建扩展

# 初始化新扩展
dxt init my-extension
cd my-extension

# 开发你的MCP服务器代码
# (根据选择的服务器类型创建相应文件)

# 打包扩展
dxt pack . my-extension.dxt

3. 签名扩展(可选)

# 自签名扩展(开发用途)
dxt sign my-extension.dxt --self-signed

# 使用正式证书签名
dxt sign my-extension.dxt --cert cert.pem --key key.pem

4. 安装使用

生成的.dxt文件可直接在支持DXT格式的应用程序中安装使用。由于所有文件已预先打包,安装过程仅需解压即可。

Manifest定义详解

基本结构

{
  "dxt_version": "0.1",
  "name": "my-extension",
  "version": "1.0.0",
  "description": "A simple MCP extension",
  "author": {
    "name": "Extension Author"
  },
  "server": {
    "type": "node",
    "entry_point": "server/index.js",
    "mcp_config": {
      "command": "node",
      "args": ["${__dirname}/server/index.js"]
    }
  }
}

关键字段说明

1. 元数据部分 (Metadata)

字段 (Field)类型 (Type)必填 (Required)描述 (Description)
dxt_versionstringDXT规范版本
namestring扩展的唯一标识名称
versionstring语义化版本号
descriptionstring简短描述
authorobject作者信息

2. 服务器配置 (Server Configuration)

"server": {
  "type": "python",
  "entry_point": "server/main.py",
  "mcp_config": {
    "command": "python",
    "args": ["server/main.py"],
    "env": {
      "PYTHONPATH": "server/lib",
      "API_KEY": "${user_config.api_key}"
    },
    "platform_overrides": {
      "win32": {
        "command": "python.exe"
      }
    }
  }
}

这里定义了服务端的核心配置,其中mcp_config部分是与 MCP 兼容的实际运行时配置,而外层的typeentry_point字段提供了更抽象的接口定义,为未来可能的扩展保留了灵活性。两者内容本质上是相关的,但外层配置提供了更高层次的抽象。

服务器类型支持:

  • node: Node.js服务器
  • python: Python服务器
  • binary: 预编译二进制

3. 用户配置 (User Configuration)

"user_config": {
  "api_key": {
    "type": "string",
    "title": "API Key",
    "description": "Your API key for authentication",
    "sensitive": true,
    "required": true
  },
  "max_file_size": {
    "type": "number",
    "title": "Maximum File Size (MB)",
    "description": "Maximum file size to process",
    "default": 10,
    "min": 1,
    "max": 100
  }
}

配置类型支持:

  • string: 文本输入
  • number: 数字输入
  • boolean: 复选框/开关
  • directory: 目录选择器
  • file: 文件选择器

directory 和 file 在实际类型定义里,其实是 string | string[ ] 。所以可以通过 multiple 参数来控制配置一个或者多个可访问的路径或者文件。

4. 工具和提示定义 (Tools and Prompts)

"tools": [
  {
    "name": "search_files",
    "description": "Search for files in a directory"
  }
],
"prompts": [
  {
    "name": "explain_code",
    "description": "Explain how code works",
    "arguments": ["code", "language"],
    "text": "Explain this ${arguments.language} code:\n${arguments.code}"
  }
],
"tools_generated": true,
"prompts_generated": false

实际应用示例

文件搜索扩展示例

{
  "dxt_version": "0.1",
  "name": "file-search",
  "display_name": "File Search Extension",
  "version": "1.0.0",
  "description": "Allows searching files in specified directories",
  "author": {
    "name": "Search Tools Inc.",
    "email": "support@searchtools.com"
  },
  "server": {
    "type": "node",
    "entry_point": "server/index.js",
    "mcp_config": {
      "command": "node",
      "args": ["${__dirname}/server/index.js"],
      "env": {
        "SEARCH_PATHS": "${user_config.search_dirs}"
      }
    }
  },
  "user_config": {
    "search_dirs": {
      "type": "directory",
      "title": "Search Directories",
      "description": "Directories to include in searches",
      "multiple": true,
      "required": true,
      "default": ["${HOME}/Documents"]
    },
    "max_depth": {
      "type": "number",
      "title": "Maximum Search Depth",
      "description": "How many subdirectory levels to search",
      "default": 3,
      "min": 1,
      "max": 10
    }
  },
  "tools": [
    {
      "name": "search_files",
      "description": "Search for files by name or content"
    },
    {
      "name": "get_file_info",
      "description": "Get information about a file"
    }
  ],
  "compatibility": {
    "claude_desktop": ">=1.2.0",
    "platforms": ["darwin", "win32", "linux"],
    "runtimes": {
      "node": ">=16.0.0"
    }
  }
}

以上是一个 manifest.json 文件的完整配置示例,供大家参考。

总结

Desktop Extensions (DXT,桌面扩展) 是一种创新的本地MCP服务器打包和分发格式,具有以下核心优势:

  1. 简化分发:将复杂配置封装为单文件,实现一键安装
  2. 标准化接口:通过manifest.json明确定义服务器能力和配置需求
  3. 跨平台支持:兼容Node.js、Python和二进制等多种服务器类型
  4. 用户友好:内置配置系统提供统一的用户界面
  5. 生态系统集成:支持工具和提示的声明,便于AI应用集成

DXT特别适合需要与桌面AI应用集成的本地服务场景,如:

  • 文件系统访问工具
  • 本地数据库查询接口
  • 专业软件集成插件
  • 自定义自动化工具

通过标准化和简化本地MCP服务器的分发流程,DXT有望成为AI桌面应用生态系统中重要的组成部分。

上手开发 DXT

关于 DXT 的使用操作,网上已有大量演示。今天我们将重点讲解如何利用官方 GitHub 库进行开发。

Anthropics DXThttps://github.com/anthropics/dxt

DXT 库主要提供了用于创建和打包 DXT 文件的接口,并且提供解压缩已打包的 DXT 文件并转换为 MCP server 的功能。

现有的解压缩和转换接口

1. 核心配置转换接口

库中提供了 getMcpConfigForManifest 函数,这是将 DXT 扩展转换为 MCP server 配置的核心接口: config.ts:

export async function getMcpConfigForManifest(
  options: GetMcpConfigForManifestOptions,
): Promise<McpServerConfig | undefined> 

该函数的主要功能包括:

  const baseConfig = manifest.server?.mcp_config;
  if (!baseConfig) {
    return undefined;
  }
  • 处理平台特定的配置覆盖:
  if (baseConfig.platform_overrides) {
    if (process.platform in baseConfig.platform_overrides) {
      const platformConfig = baseConfig.platform_overrides[process.platform];

      result.command = platformConfig.command || result.command;
      result.args = platformConfig.args || result.args;
      result.env = platformConfig.env || result.env;
    }
  }
  • 执行变量替换,包括 ${__dirname}${user_config.*} 等:
  const variables: Record<string, string | string[]> = {
    __dirname: extensionPath,
    pathSeparator,
    "/": pathSeparator,
    ...systemDirs,
  };

  // Build merged configuration from defaults and user settings
  const mergedConfig: Record<string, unknown> = {};

  // First, add defaults from manifest
  if (manifest.user_config) {
    for (const [key, configOption] of Object.entries(manifest.user_config)) {
      if (configOption.default !== undefined) {
        mergedConfig[key] = configOption.default;
      }
    }
  }

  // Then, override with user settings
  if (userConfig) {
    Object.assign(mergedConfig, userConfig);
  }

  // Add merged configuration variables for substitution
  for (const [key, value] of Object.entries(mergedConfig)) {
    // Convert user config to the format expected by variable substitution
    const userConfigKey = `user_config.${key}`;

    if (Array.isArray(value)) {
      // Keep arrays as arrays for proper expansion
      variables[userConfigKey] = value.map(String);
    } else if (typeof value === "boolean") {
      // Convert booleans to "true"/"false" strings as per spec
      variables[userConfigKey] = value ? "true" : "false";
    } else {
      // Convert other types to strings
      variables[userConfigKey] = String(value);
    }
  }

2. 变量替换系统

DXT 系统支持多种变量替换,用于将打包的扩展适配到运行时环境: MANIFEST.md

支持的变量包括:

  • ${__dirname}: 扩展目录的绝对路径
  • ${HOME}${DESKTOP}${DOCUMENTS}${DOWNLOADS}: 系统目录
  • ${user_config.*}: 用户配置值
  • ${pathSeparator} 或 ${/}: 路径分隔符

架构分析

DXT 到 MCP Server 的转换流程

所以对于一个Desktop MCP Client 应用,典型的实现流程应当包括:

  1. 接收 .dxt 文件
  2. 解压缩 ZIP 档案
  3. 验证数字签名
  4. 解析 manifest.json
  5. 使用 getMcpConfigForManifest 生成 MCP 配置
  6. 启动 MCP server 进程

开源实现

由于 Claude Desktop 本身是闭源的,所以无法获知它的实际实现方式,所以我在我自己的开源项目 TUUI 中完整实现了一遍,这里提供一下使用效果:

配置界面需要配置允许访问的目录

file-system-node 默认提供了一系列用于访问本地路径的工具

LLM 自动编排工具调用来完成文件夹的访问和文件的写入

最后保持好习惯,所有代码都开源到了github:

https://www.github.com/AI-QL/tuui

对于 Window 系统的小伙伴,可以安装 nodejs 之后,直接在最新 release 中下载 zip 免安装包和对应的两个 .dxt 文件示例来体验(注意:其中 file-system-node.dxt 这个官方包的 Allowed Directory 实际是个必须配置的参数。所以需要配置之后才能正常启动 MCP Server)

对于 MacOS 的小伙伴,就比较麻烦了,我在 README 中给出了一些 ISSUE 链接,需要魔改一下 node 的安装访问路径。由于对应的问题在开源社区还是 open 状态,所以我暂时也只能保持现状,等有了较为明确的结论再调试这部分。

好了,以上就是今天的内容,睡觉去了,又要秃了。。。。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值