# Deno MCP Server

A Model Context Protocol (MCP) server for executing Deno TypeScript/JavaScript code. This server allows LLMs like Claude to run Deno code securely with configurable permissions.

## Features

- Execute Deno TypeScript or JavaScript code
- Configure permissions (net, read, write, env, run, etc.)
- Enable/disable unstable features
- Get Deno version information

## Prerequisites

Before using this MCP server, ensure you have:

- [Node.js](https://nodejs.org/) 16 or higher installed
- [Deno](https://deno.land/manual/getting_started/installation) installed
- [Claude Desktop](https://claude.ai/download) or [Cline](https://github.com/saoudrizwan/cline) installed

## Installation

1. Clone this repository:
```bash
git clone https://github.com/Timtech4u/deno-mcp.git
cd deno-mcp
```

2. Install dependencies:
```bash
npm install
```

3. Build the project:
```bash
npm run build
```

## Configuration

### For Claude Desktop

1. Open your Claude Desktop configuration file:
   - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
   - Windows: `%APPDATA%\Claude\claude_desktop_config.json`

2. Add the Deno MCP server configuration:
```json
{
  "mcpServers": {
    "deno": {
      "command": "node",
      "args": [
        "/absolute/path/to/deno-mcp/dist/index.js"
      ],
      "disabled": false,
      "autoApprove": [
        "execute_deno_code",
        "check_deno_version"
      ]
    }
  }
}
```

3. Replace `/absolute/path/to/deno-mcp` with the actual path where you cloned the repository.

4. Restart Claude Desktop.

### For Cline

1. Open your Cline MCP settings file:
   - macOS: `~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`
   - Windows: `%APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json`

2. Add the Deno MCP server configuration:
```json
{
  "mcpServers": {
    "deno": {
      "command": "node",
      "args": [
        "/absolute/path/to/deno-mcp/dist/index.js"
      ],
      "disabled": false,
      "autoApprove": [
        "execute_deno_code",
        "check_deno_version"
      ]
    }
  }
}
```

3. Replace `/absolute/path/to/deno-mcp` with the actual path where you cloned the repository.

4. Restart Cline or reload the window.

## How to Use

Once configured, you can ask Claude to run Deno code in various ways. Here are some examples:

### Basic Usage

You can run simple Deno code without any special permissions:

```
Can you run this Deno code for me?

console.log("Hello from Deno!");
console.log("Version:", Deno.version);
console.log("Current directory:", Deno.cwd());
```

### With Network Permissions

To make HTTP requests, you need to grant network permissions:

```
Run this Deno code with network permissions:

async function fetchData() {
  const response = await fetch("https://jsonplaceholder.typicode.com/todos/1");
  const data = await response.json();
  console.log("Fetched data:", data);
}

await fetchData();
```

### With File System Permissions

To read or write files, you need to grant file system permissions:

```
Run this Deno code with file system permissions:

const text = "Hello, Deno File System!";
await Deno.writeTextFile("./hello.txt", text);
console.log("File written successfully");

const content = await Deno.readTextFile("./hello.txt");
console.log("File content:", content);
```

### With Multiple Permissions

You can combine multiple permissions:

```
Run this Deno code with network and file system permissions:

const response = await fetch("https://jsonplaceholder.typicode.com/todos/1");
const data = await response.json();
await Deno.writeTextFile("./todo.json", JSON.stringify(data, null, 2));
console.log("Todo data saved to file");
```

### Using Deno Standard Library

You can use Deno's standard library:

```
Run this Deno code with network permissions:

import { serve } from "https://deno.land/std@0.192.0/http/server.ts";

const handler = (req) => new Response("Hello, Deno Server!");
console.log("HTTP server running on http://localhost:8000");
serve(handler, { port: 8000 });
```

## Available Tools

### execute_deno_code

Executes Deno TypeScript/JavaScript code.

Parameters:
- `code` (string, required): The Deno code to execute
- `permissions` (array of strings, optional): List of permissions to grant (e.g., "net", "read", "write", "env", "run", etc.)
- `unstable` (boolean, optional): Whether to enable unstable features
- `typescript` (boolean, optional): Whether the code is TypeScript (true) or JavaScript (false)

Example usage through Claude:

```
Can you run this Deno code with permissions for network and file system access?

const response = await fetch("https://api.github.com/users/denoland");
const data = await response.json();
await Deno.writeTextFile("./deno-github.json", JSON.stringify(data, null, 2));
console.log("GitHub data for Deno saved to file");
```

### check_deno_version

Returns information about the installed Deno version.

Example usage through Claude:

```
Can you check what version of Deno I have installed?
```

## Troubleshooting

### Deno Not Found

If you see an error like "Deno is not installed", make sure Deno is installed and available in your system PATH.

### Permission Errors

If your code fails with permission errors, make sure you're requesting the appropriate permissions:

- Network requests: `"net"`
- File system: `"read"` and/or `"write"`
- Environment variables: `"env"`
- Running subprocesses: `"run"`

### Timeout Errors

The server has a 30-second timeout for code execution. If your code takes longer than that, it will be terminated.

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

## License

MIT
