@enconvo/dxt 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE.md ADDED
@@ -0,0 +1,7 @@
1
+ Copyright 2025 Anthropic, PBC.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,118 @@
1
+ # Desktop Extensions (DXT)
2
+
3
+ Desktop Extensions (`.dxt`) are zip archives containing a local MCP server and a `manifest.json` that describes the server and its capabilities. The format is spiritually similar to Chrome extensions (`.crx`) or VS Code extensions (`.vsix`), enabling end users to install local MCP servers with a single click.
4
+
5
+ This repository provides three components: The extension specification in [MANIFEST.md](MANIFEST.md), a CLI tool for creating extensions (see [CLI.md](CLI.md)), and the code used by Claude for macOS and Windows to load and verify DXT extensions ([src/index.ts](src/index.ts)).
6
+
7
+ - For developers of local MCP servers, we aim to make distribution and installation of said servers convenient
8
+ - For developers of apps supporting local MCP servers, we aim to make it easy to add support for DXT extensions
9
+
10
+ Claude for macOS and Windows uses the code in this repository to enable single-click installation of local MCP servers, including a number of end user-friendly features - such as automatic updates, easy configuration of MCP servers and the variables and parameters they need, and a curated directory. We are committed to the open ecosystem around MCP servers and believe that its ability to be universally adopted by multiple applications and services has benefits developers aiming to connect AI tools to other apps and services. Consequently, we’re open-sourcing the Desktop Extension specification, toolchain, and the schemas and key functions used by Claude for macOS and Windows to implement its own support of Desktop Extensions. It is our hope that the `dxt` format doesn’t just make local MCP servers more portable for Claude, but other AI desktop applications, too.
11
+
12
+ # For Extension Developers
13
+
14
+ At the core, DXT are simple zip files containing your entire MCP server and a `manifest.json`. Consequently, turning a local MCP server into an extension is straightforward: You just have to put all your required files in a folder, create a `manifest.json`, and then create an archive.
15
+
16
+ To make this process easier, this package offers a CLI that helps you with the creation of both the `manifest.json` and the final `.dxt` file. To install it, run:
17
+
18
+ ```sh
19
+ npm install -g @anthropic-ai/dxt
20
+ ```
21
+
22
+ 1. In a folder containing your local MCP server, run `dxt init`. This command will guide you through the creation of a `manifest.json`.
23
+ 2. Run `dxt pack` to create a `dxt` file.
24
+ 3. Now, any app implementing support for DXT can run your local MCP server. As an example, open the file with Claude for macOS and Windows to show an installation dialog.
25
+
26
+ You can find the full spec for the `manifest.json` and all its mandatory and optional fields in [MANIFEST.md](MANIFEST.md). Examples for extensions can be found in [examples](./examples/).
27
+
28
+ ## Prompt Template for AI Tools
29
+
30
+ AI tools like Claude Code are particularly good at creating desktop extensions when informed about the spec. When prompting an AI coding tool to build an extension, briefly explain what your extension aims to do - then add the following context to your instructions.
31
+
32
+ > I want to build this as a Desktop Extension, abbreviated as "DXT". Please follow these steps:
33
+ >
34
+ > 1. **Read the specifications thoroughly:**
35
+ > - https://github.com/anthropics/dxt/blob/main/README.md - DXT architecture overview, capabilities, and integration
36
+ > patterns
37
+ > - https://github.com/anthropics/dxt/blob/main/MANIFEST.md - Complete extension manifest structure and field definitions
38
+ > - https://github.com/anthropics/dxt/tree/main/examples - Reference implementations including a "Hello World" example
39
+ > 2. **Create a proper extension structure:**
40
+ > - Generate a valid manifest.json following the MANIFEST.md spec
41
+ > - Implement an MCP server using @modelcontextprotocol/sdk with proper tool definitions
42
+ > - Include proper error handling, security measures, and timeout management
43
+ > 3. **Follow best development practices:**
44
+ > - Implement proper MCP protocol communication via stdio transport
45
+ > - Structure tools with clear schemas, validation, and consistent JSON responses
46
+ > - Make use of the fact that this extension will be running locally
47
+ > - Add appropriate logging and debugging capabilities
48
+ > - Include proper documentation and setup instructions
49
+ > 4. **Test considerations:**
50
+ > - Validate that all tool calls return properly structured responses
51
+ > - Verify manifest loads correctly and host integration works
52
+ >
53
+ > Generate complete, production-ready code that can be immediately tested. Focus on defensive programming, clear error messages, and following the exact DXT specifications to ensure compatibility with the ecosystem.
54
+
55
+ ## Directory Structures
56
+
57
+ ### Minimal Extension
58
+
59
+ A `manifest.json` is the only required file.
60
+
61
+ ### Example: Node.js Extension
62
+
63
+ ```
64
+ extension.dxt (ZIP file)
65
+ ├── manifest.json # Required: Extension metadata and configuration
66
+ ├── server/ # Server files
67
+ │ └── index.js # Main entry point
68
+ ├── node_modules/ # Bundled dependencies
69
+ ├── package.json # Optional: NPM package definition
70
+ ├── icon.png # Optional: Extension icon
71
+ └── assets/ # Optional: Additional assets
72
+ ```
73
+
74
+ ### Example: Python Extension
75
+
76
+ ```
77
+ extension.dxt (ZIP file)
78
+ ├── manifest.json # Required: Extension metadata and configuration
79
+ ├── server/ # Server files
80
+ │ ├── main.py # Main entry point
81
+ │ └── utils.py # Additional modules
82
+ ├── lib/ # Bundled Python packages
83
+ ├── requirements.txt # Optional: Python dependencies list
84
+ └── icon.png # Optional: Extension icon
85
+ ```
86
+
87
+ ### Example: Binary Extension
88
+
89
+ ```
90
+ extension.dxt (ZIP file)
91
+ ├── manifest.json # Required: Extension metadata and configuration
92
+ ├── server/ # Server files
93
+ │ ├── my-server # Unix executable
94
+ │ ├── my-server.exe # Windows executable
95
+ └── icon.png # Optional: Extension icon
96
+ ```
97
+
98
+ ### Bundling Dependencies
99
+
100
+ **Python Extensions:**
101
+
102
+ - Bundle all required packages in `server/lib/` directory
103
+ - OR bundle a complete virtual environment in `server/venv/`
104
+ - Use tools like `pip-tools`, `poetry`, or `pipenv` to create reproducible bundles
105
+ - Set `PYTHONPATH` to include bundled packages via `mcp_config.env`
106
+
107
+ **Node.js Extensions:**
108
+
109
+ - Run `npm install --production` to create `node_modules`
110
+ - Bundle the entire `node_modules` directory with your extension
111
+ - Use `npm ci` or `yarn install --frozen-lockfile` for reproducible builds
112
+ - Server entry point specified in manifest.json's `server.entry_point`
113
+
114
+ **Binary Extensions:**
115
+
116
+ - Static linking preferred for maximum compatibility
117
+ - Include all required shared libraries if dynamic linking used
118
+ - Test on clean systems without development tools
@@ -0,0 +1,3 @@
1
+ export * from "./schemas.js";
2
+ export * from "./shared/config.js";
3
+ export * from "./types.js";
@@ -0,0 +1,4 @@
1
+ // Browser-compatible exports
2
+ export * from "./schemas.js";
3
+ export * from "./shared/config.js";
4
+ export * from "./types.js";
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,275 @@
1
+ #!/usr/bin/env node
2
+ import { execSync } from "child_process";
3
+ import { Command } from "commander";
4
+ import { existsSync, readFileSync, statSync } from "fs";
5
+ import { basename, dirname, join, resolve } from "path";
6
+ import { fileURLToPath } from "url";
7
+ import { signDxtFile, unsignDxtFile, verifyDxtFile } from "../node/sign.js";
8
+ import { cleanDxt, validateManifest } from "../node/validate.js";
9
+ import { initExtension } from "./init.js";
10
+ import { packExtension } from "./pack.js";
11
+ import { unpackExtension } from "./unpack.js";
12
+ // ES modules equivalent of __dirname
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = dirname(__filename);
15
+ // Get version from package.json
16
+ const packageJsonPath = join(__dirname, "..", "..", "package.json");
17
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
18
+ const version = packageJson.version;
19
+ /**
20
+ * Create a self-signed certificate for signing DXT extensions
21
+ */
22
+ function createSelfSignedCertificate(certPath, keyPath) {
23
+ const subject = "/CN=DXT Self-Signed Certificate/O=DXT Extensions/C=US";
24
+ try {
25
+ // Generate a self-signed certificate valid for 10 years, no password
26
+ execSync(`openssl req -x509 -newkey rsa:4096 -keyout "${keyPath}" -out "${certPath}" -days 3650 -nodes -subj "${subject}"`, { stdio: "pipe" });
27
+ }
28
+ catch (error) {
29
+ throw new Error(`Failed to create self-signed certificate: ${error}`);
30
+ }
31
+ }
32
+ // Create the CLI program
33
+ const program = new Command();
34
+ program
35
+ .name("dxt")
36
+ .description("Tools for building Desktop Extensions")
37
+ .version(version);
38
+ // Init command
39
+ program
40
+ .command("init [directory]")
41
+ .description("Create a new DXT extension manifest")
42
+ .option("-y, --yes", "Accept all defaults (non-interactive mode)")
43
+ .action((directory, options) => {
44
+ void (async () => {
45
+ try {
46
+ const success = await initExtension(directory, options?.yes);
47
+ process.exit(success ? 0 : 1);
48
+ }
49
+ catch (error) {
50
+ console.error(`ERROR: ${error instanceof Error ? error.message : "Unknown error"}`);
51
+ process.exit(1);
52
+ }
53
+ })();
54
+ });
55
+ // Validate command
56
+ program
57
+ .command("validate <manifest>")
58
+ .description("Validate a DXT manifest file")
59
+ .action((manifestPath) => {
60
+ const success = validateManifest(manifestPath);
61
+ process.exit(success ? 0 : 1);
62
+ });
63
+ // Clean command
64
+ program
65
+ .command("clean <dxt>")
66
+ .description("Cleans a DXT file, validates the manifest, and minimizes bundle size")
67
+ .action(async (dxtFile) => {
68
+ await cleanDxt(dxtFile);
69
+ });
70
+ // Pack command
71
+ program
72
+ .command("pack [directory] [output]")
73
+ .description("Pack a directory into a DXT extension")
74
+ .action((directory = process.cwd(), output) => {
75
+ void (async () => {
76
+ try {
77
+ const success = await packExtension({
78
+ extensionPath: directory,
79
+ outputPath: output,
80
+ });
81
+ process.exit(success ? 0 : 1);
82
+ }
83
+ catch (error) {
84
+ console.error(`ERROR: ${error instanceof Error ? error.message : "Unknown error"}`);
85
+ process.exit(1);
86
+ }
87
+ })();
88
+ });
89
+ // Unpack command
90
+ program
91
+ .command("unpack <dxt-file> [output]")
92
+ .description("Unpack a DXT extension file")
93
+ .action((dxtFile, output) => {
94
+ void (async () => {
95
+ try {
96
+ const success = await unpackExtension({
97
+ dxtPath: dxtFile,
98
+ outputDir: output,
99
+ });
100
+ process.exit(success ? 0 : 1);
101
+ }
102
+ catch (error) {
103
+ console.error(`ERROR: ${error instanceof Error ? error.message : "Unknown error"}`);
104
+ process.exit(1);
105
+ }
106
+ })();
107
+ });
108
+ // Sign command
109
+ program
110
+ .command("sign <dxt-file>")
111
+ .description("Sign a DXT extension file")
112
+ .option("-c, --cert <path>", "Path to certificate file (PEM format)", "cert.pem")
113
+ .option("-k, --key <path>", "Path to private key file (PEM format)", "key.pem")
114
+ .option("-i, --intermediate <paths...>", "Paths to intermediate certificate files")
115
+ .option("--self-signed", "Create a self-signed certificate if none exists")
116
+ .action((dxtFile, options) => {
117
+ void (async () => {
118
+ try {
119
+ const dxtPath = resolve(dxtFile);
120
+ if (!existsSync(dxtPath)) {
121
+ console.error(`ERROR: DXT file not found: ${dxtFile}`);
122
+ process.exit(1);
123
+ }
124
+ let certPath = options.cert;
125
+ let keyPath = options.key;
126
+ // Create self-signed certificate if requested
127
+ if (options.selfSigned) {
128
+ const dxtDir = resolve(__dirname, "..");
129
+ certPath = join(dxtDir, "self-signed-cert.pem");
130
+ keyPath = join(dxtDir, "self-signed-key.pem");
131
+ if (!existsSync(certPath) || !existsSync(keyPath)) {
132
+ console.log("Creating self-signed certificate...");
133
+ createSelfSignedCertificate(certPath, keyPath);
134
+ console.log("Self-signed certificate created");
135
+ }
136
+ else {
137
+ console.log("Using existing self-signed certificate");
138
+ }
139
+ }
140
+ else {
141
+ // Check for manual certificate paths
142
+ if (!existsSync(certPath)) {
143
+ console.error(`ERROR: Certificate file not found: ${certPath}`);
144
+ console.log("Tip: Use --self-signed to create a self-signed certificate");
145
+ process.exit(1);
146
+ }
147
+ if (!existsSync(keyPath)) {
148
+ console.error(`ERROR: Private key file not found: ${keyPath}`);
149
+ process.exit(1);
150
+ }
151
+ }
152
+ console.log(`Signing ${basename(dxtPath)}...`);
153
+ signDxtFile(dxtPath, certPath, keyPath, options.intermediate);
154
+ console.log(`Successfully signed ${basename(dxtPath)}`);
155
+ // Display certificate info
156
+ const signatureInfo = await verifyDxtFile(dxtPath);
157
+ if (signatureInfo.status === "signed" ||
158
+ signatureInfo.status === "self-signed") {
159
+ console.log(`Signed by: ${signatureInfo.publisher}`);
160
+ console.log(`Issuer: ${signatureInfo.issuer}`);
161
+ if (signatureInfo.status === "self-signed") {
162
+ console.log(`Warning: Certificate is self-signed`);
163
+ }
164
+ }
165
+ }
166
+ catch (error) {
167
+ console.log(`ERROR: Signing failed: ${error instanceof Error ? error.message : "Unknown error"}`);
168
+ process.exit(1);
169
+ }
170
+ })();
171
+ });
172
+ // Verify command
173
+ program
174
+ .command("verify <dxt-file>")
175
+ .description("Verify the signature of a DXT extension file")
176
+ .action((dxtFile) => {
177
+ void (async () => {
178
+ try {
179
+ const dxtPath = resolve(dxtFile);
180
+ if (!existsSync(dxtPath)) {
181
+ console.error(`ERROR: DXT file not found: ${dxtFile}`);
182
+ process.exit(1);
183
+ }
184
+ console.log(`Verifying ${basename(dxtPath)}...`);
185
+ const result = await verifyDxtFile(dxtPath);
186
+ if (result.status === "signed") {
187
+ console.log(`Signature is valid`);
188
+ console.log(`Signed by: ${result.publisher}`);
189
+ console.log(`Issuer: ${result.issuer}`);
190
+ console.log(`Valid from: ${new Date(result.valid_from).toLocaleDateString()} to ${new Date(result.valid_to).toLocaleDateString()}`);
191
+ console.log(`Fingerprint: ${result.fingerprint}`);
192
+ }
193
+ else if (result.status === "self-signed") {
194
+ console.log(`Signature is valid (self-signed)`);
195
+ console.log(`WARNING: This extension is self-signed`);
196
+ console.log(`Signed by: ${result.publisher}`);
197
+ console.log(`Valid from: ${new Date(result.valid_from).toLocaleDateString()} to ${new Date(result.valid_to).toLocaleDateString()}`);
198
+ console.log(`Fingerprint: ${result.fingerprint}`);
199
+ }
200
+ else {
201
+ console.error(`ERROR: Extension is not signed`);
202
+ process.exit(1);
203
+ }
204
+ }
205
+ catch (error) {
206
+ console.log(`ERROR: Verification failed: ${error instanceof Error ? error.message : "Unknown error"}`);
207
+ process.exit(1);
208
+ }
209
+ })();
210
+ });
211
+ // Info command
212
+ program
213
+ .command("info <dxt-file>")
214
+ .description("Display information about a DXT extension file")
215
+ .action((dxtFile) => {
216
+ void (async () => {
217
+ try {
218
+ const dxtPath = resolve(dxtFile);
219
+ if (!existsSync(dxtPath)) {
220
+ console.error(`ERROR: DXT file not found: ${dxtFile}`);
221
+ process.exit(1);
222
+ }
223
+ const stat = statSync(dxtPath);
224
+ console.log(`File: ${basename(dxtPath)}`);
225
+ console.log(`Size: ${(stat.size / 1024).toFixed(2)} KB`);
226
+ // Check if signed
227
+ const signatureInfo = await verifyDxtFile(dxtPath);
228
+ if (signatureInfo.status === "signed") {
229
+ console.log(`\nSignature Information:`);
230
+ console.log(` Subject: ${signatureInfo.publisher}`);
231
+ console.log(` Issuer: ${signatureInfo.issuer}`);
232
+ console.log(` Valid from: ${new Date(signatureInfo.valid_from).toLocaleDateString()} to ${new Date(signatureInfo.valid_to).toLocaleDateString()}`);
233
+ console.log(` Fingerprint: ${signatureInfo.fingerprint}`);
234
+ console.log(` Status: Valid`);
235
+ }
236
+ else if (signatureInfo.status === "self-signed") {
237
+ console.log(`\nSignature Information:`);
238
+ console.log(` Subject: ${signatureInfo.publisher}`);
239
+ console.log(` Issuer: ${signatureInfo.issuer} (self-signed)`);
240
+ console.log(` Valid from: ${new Date(signatureInfo.valid_from).toLocaleDateString()} to ${new Date(signatureInfo.valid_to).toLocaleDateString()}`);
241
+ console.log(` Fingerprint: ${signatureInfo.fingerprint}`);
242
+ console.log(` Status: Valid (self-signed)`);
243
+ }
244
+ else {
245
+ console.log(`\nWARNING: Not signed`);
246
+ }
247
+ }
248
+ catch (error) {
249
+ console.log(`ERROR: Failed to read DXT info: ${error instanceof Error ? error.message : "Unknown error"}`);
250
+ process.exit(1);
251
+ }
252
+ })();
253
+ });
254
+ // Unsign command (for development/testing)
255
+ program
256
+ .command("unsign <dxt-file>")
257
+ .description("Remove signature from a DXT extension file")
258
+ .action((dxtFile) => {
259
+ try {
260
+ const dxtPath = resolve(dxtFile);
261
+ if (!existsSync(dxtPath)) {
262
+ console.error(`ERROR: DXT file not found: ${dxtFile}`);
263
+ process.exit(1);
264
+ }
265
+ console.log(`Removing signature from ${basename(dxtPath)}...`);
266
+ unsignDxtFile(dxtPath);
267
+ console.log(`Signature removed`);
268
+ }
269
+ catch (error) {
270
+ console.log(`ERROR: Failed to remove signature: ${error instanceof Error ? error.message : "Unknown error"}`);
271
+ process.exit(1);
272
+ }
273
+ });
274
+ // Parse command line arguments
275
+ program.parse();
@@ -0,0 +1,185 @@
1
+ import type { DxtManifest } from "../types.js";
2
+ interface PackageJson {
3
+ name?: string;
4
+ version?: string;
5
+ description?: string;
6
+ main?: string;
7
+ author?: string | {
8
+ name?: string;
9
+ email?: string;
10
+ url?: string;
11
+ };
12
+ repository?: string | {
13
+ type?: string;
14
+ url?: string;
15
+ };
16
+ license?: string;
17
+ }
18
+ export declare function readPackageJson(dirPath: string): PackageJson;
19
+ export declare function getDefaultAuthorName(packageData: PackageJson): string;
20
+ export declare function getDefaultAuthorEmail(packageData: PackageJson): string;
21
+ export declare function getDefaultAuthorUrl(packageData: PackageJson): string;
22
+ export declare function getDefaultRepositoryUrl(packageData: PackageJson): string;
23
+ export declare function getDefaultBasicInfo(packageData: PackageJson, resolvedPath: string): {
24
+ name: string;
25
+ authorName: string;
26
+ displayName: string;
27
+ version: string;
28
+ description: string;
29
+ };
30
+ export declare function getDefaultAuthorInfo(packageData: PackageJson): {
31
+ authorEmail: string;
32
+ authorUrl: string;
33
+ };
34
+ export declare function getDefaultServerConfig(packageData?: PackageJson): {
35
+ serverType: "node";
36
+ entryPoint: string;
37
+ mcp_config: {
38
+ command: string;
39
+ args: string[];
40
+ env?: Record<string, string>;
41
+ };
42
+ };
43
+ export declare function getDefaultOptionalFields(packageData: PackageJson): {
44
+ keywords: string;
45
+ license: string;
46
+ repository: undefined;
47
+ };
48
+ export declare function createMcpConfig(serverType: "node" | "python" | "binary", entryPoint: string): {
49
+ command: string;
50
+ args: string[];
51
+ env?: Record<string, string>;
52
+ };
53
+ export declare function getDefaultEntryPoint(serverType: "node" | "python" | "binary", packageData?: PackageJson): string;
54
+ export declare function promptBasicInfo(packageData: PackageJson, resolvedPath: string): Promise<{
55
+ name: string;
56
+ authorName: string;
57
+ displayName: string;
58
+ version: string;
59
+ description: string;
60
+ }>;
61
+ export declare function promptAuthorInfo(packageData: PackageJson): Promise<{
62
+ authorEmail: string;
63
+ authorUrl: string;
64
+ }>;
65
+ export declare function promptServerConfig(packageData?: PackageJson): Promise<{
66
+ serverType: "python" | "node" | "binary";
67
+ entryPoint: string;
68
+ mcp_config: {
69
+ command: string;
70
+ args: string[];
71
+ env?: Record<string, string>;
72
+ };
73
+ }>;
74
+ export declare function promptTools(): Promise<{
75
+ tools: {
76
+ name: string;
77
+ description?: string;
78
+ }[];
79
+ toolsGenerated: boolean;
80
+ }>;
81
+ export declare function promptPrompts(): Promise<{
82
+ prompts: {
83
+ name: string;
84
+ description?: string;
85
+ arguments?: string[];
86
+ text: string;
87
+ }[];
88
+ promptsGenerated: boolean;
89
+ }>;
90
+ export declare function promptOptionalFields(packageData: PackageJson): Promise<{
91
+ keywords: string;
92
+ license: string;
93
+ repository: {
94
+ type: string;
95
+ url: string;
96
+ } | undefined;
97
+ }>;
98
+ export declare function promptLongDescription(description: string): Promise<string | undefined>;
99
+ export declare function promptUrls(): Promise<{
100
+ homepage: string;
101
+ documentation: string;
102
+ support: string;
103
+ }>;
104
+ export declare function promptVisualAssets(): Promise<{
105
+ icon: string;
106
+ screenshots: string[];
107
+ }>;
108
+ export declare function promptCompatibility(serverType: "node" | "python" | "binary"): Promise<{
109
+ runtimes?: {
110
+ python?: string;
111
+ node?: string;
112
+ } | undefined;
113
+ platforms?: ("darwin" | "win32" | "linux")[] | undefined;
114
+ } | undefined>;
115
+ export declare function promptUserConfig(): Promise<Record<string, {
116
+ type: "string" | "number" | "boolean" | "directory" | "file";
117
+ title: string;
118
+ description: string;
119
+ required?: boolean;
120
+ default?: string | number | boolean | string[];
121
+ multiple?: boolean;
122
+ sensitive?: boolean;
123
+ min?: number;
124
+ max?: number;
125
+ }>>;
126
+ export declare function buildManifest(basicInfo: {
127
+ name: string;
128
+ displayName: string;
129
+ version: string;
130
+ description: string;
131
+ authorName: string;
132
+ }, longDescription: string | undefined, authorInfo: {
133
+ authorEmail: string;
134
+ authorUrl: string;
135
+ }, urls: {
136
+ homepage: string;
137
+ documentation: string;
138
+ support: string;
139
+ }, visualAssets: {
140
+ icon: string;
141
+ screenshots: string[];
142
+ }, serverConfig: {
143
+ serverType: "node" | "python" | "binary";
144
+ entryPoint: string;
145
+ mcp_config: {
146
+ command: string;
147
+ args: string[];
148
+ env?: Record<string, string>;
149
+ };
150
+ }, tools: Array<{
151
+ name: string;
152
+ description?: string;
153
+ }>, toolsGenerated: boolean, prompts: Array<{
154
+ name: string;
155
+ description?: string;
156
+ arguments?: string[];
157
+ text: string;
158
+ }>, promptsGenerated: boolean, compatibility: {
159
+ claude_desktop?: string;
160
+ platforms?: ("darwin" | "win32" | "linux")[];
161
+ runtimes?: {
162
+ python?: string;
163
+ node?: string;
164
+ };
165
+ } | undefined, userConfig: Record<string, {
166
+ type: "string" | "number" | "boolean" | "directory" | "file";
167
+ title: string;
168
+ description: string;
169
+ required?: boolean;
170
+ default?: string | number | boolean | string[];
171
+ multiple?: boolean;
172
+ sensitive?: boolean;
173
+ min?: number;
174
+ max?: number;
175
+ }>, optionalFields: {
176
+ keywords: string;
177
+ license: string;
178
+ repository?: {
179
+ type: string;
180
+ url: string;
181
+ };
182
+ }): DxtManifest;
183
+ export declare function printNextSteps(): void;
184
+ export declare function initExtension(targetPath?: string, nonInteractive?: boolean): Promise<boolean>;
185
+ export {};