模型上下文协议服务器

一个基于.NET 8构建的模型上下文协议(MCP)服务器,为企业工具和AI助手提供连接服务。

  • by Argha713
  • C#
  • 本地部署
  • 更新于
在 GitHub 查看 Argha713/dotnet-mcp-server

使用说明

🔌 .net mcp服务器

A. 模型上下文协议(MCP) 服务器构建于 .NET 8 它将企业工具暴露给人工智能助手,如Claude Desktop、VS Code(Copilot/Continue/Cline)、Cursor、Windsurf等。

MCP是Anthropic的开放协议,允许AI助手连接到外部数据源和工具。该项目将MCP引入。NET生态系统。它与 任何兼容MCP的客户端 --不仅仅是克劳德桌面。

📖 全部文件 --入门指南、工具参考、插件指南


什么是MCP?

这 模型上下文协议 允许AI助手:

  • 🔍 查询您的数据库
  • 📁 从系统中读取文件
  • 🌐 调用外部API
  • ⏰ 获取实时信息

AI可以直接访问所需的工具,而不是将数据复制到提示中。


特性

此服务器提供九种企业就绪工具:

工具 说明
🕐 日期时间 获取当前时间,在时区之间转换
📁 文件系统 读取文件,列出目录(在允许的路径内)
🗄️ sqlquery 对配置的数据库执行只读SQL查询
🌐 http_request 向允许的API发出GET/POST请求
📝 文本 正则表达式匹配/替换、字数、文本差异、格式JSON/XML
🔄 数据转换 JSON查询、CSV/JSON/XML转换、base64、哈希
🌍 环境 获取/列出/检查环境变量(敏感值被屏蔽)
💻 系统信息 操作系统详细信息、运行进程、网络接口
🔀 版本控制系统 只读Git:状态、日志、差异、分支、责备

安全功能

  • ✅ 文件访问受限 仅限于已配置的目录
  • ✅ SQL查询是只读的 (仅限选择,危险关键字被阻止)
  • ✅ HTTP请求受限 到允许的主机
  • ✅ 环境变量 带有敏感值掩码(密码、令牌、密钥)
  • ✅ Git操作是只读的 具有路径验证和参数净化功能
  • ✅ Regex超时保护 抵御ReDoS攻击
  • ✅ XXE预防 在XML解析中
  • ✅ 无任意代码执行

🚀 Quick Start

先决条件


Option A — Install as a Global Tool (Recommended)

dotnet tool install -g DotnetMcpServer

然后运行交互式安装向导以创建配置:

dotnet-mcp-server --init

巫师写道 appsettings.json 到您的用户配置目录:

  • 窗户: %APPDATA%\dotnet-mcp-server\appsettings.json
  • Linux/macOS: ~/.config/dotnet-mcp-server/appsettings.json

配置后,您可以验证一切是否正常:

dotnet-mcp-server --validate

要稍后更新到最新版本,请执行以下操作:

dotnet tool update -g DotnetMcpServer

Option B — Clone and Build

git clone https://github.com/Argha713/dotnet-mcp-server.git
cd dotnet-mcp-server
dotnet build

配置(仅选项B)

编辑 src/McpServer/appsettings.json:

{
  "FileSystem": {
    "AllowedPaths": [
      "C:\\Users\\YourName\\Documents",
      "C:\\Projects"
    ]
  },
  "Sql": {
    "Connections": {
      "MyDB": {
        "ConnectionString": "Server=localhost;Database=MyDB;Trusted_Connection=True;",
        "Description": "My local database"
      }
    }
  },
  "Http": {
    "AllowedHosts": [
      "api.github.com",
      "jsonplaceholder.typicode.com"
    ]
  }
}

Option C — Docker (No .NET Required)

在容器中运行服务器,并与演示SQL server一起运行——否。您的计算机上需要.NET SDK。

第一步: 复制示例配置和环境文件:

cp docker/appsettings.example.json docker/appsettings.json
cp .env.example .env

第二步: 编辑 docker/appsettings.json 设置允许的路径、SQL连接和HTTP主机。编辑 .env 设置一个强大的 SQL_SA_PASSWORD.

步骤3: 构建映像并启动这两个服务:

docker-compose up --build

这 docker build 该步骤运行所有测试——如果任何测试失败,构建将中止。

Claude桌面集成 (docker运行模式):

{
  "mcpServers": {
    "dotnet-mcp-server": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "-v", "/path/to/docker/appsettings.json:/home/app/.config/dotnet-mcp-server/appsettings.json:ro",
        "dotnet-mcp-server"
      ]
    }
  }
}

注: 替换 /path/to/docker/appsettings.json 与你的绝对路径 docker/appsettings.json 文件。在Windows上使用正斜杠或转义反斜杠。


Connect to Your MCP Client

在 支持的客户 请参阅下面的部分,并按照设置说明进行操作。

注: 所有客户端配置示例都使用全局工具命令 dotnet-mcp-server。如果您使用的是选项B(克隆和构建),请替换 "command": "dotnet-mcp-server" 随着 "command": "dotnet", "args": ["run", "--project", "C:\\path\\to\\dotnet-mcp-server\\src\\McpServer"] 相反。


🖥️ Supported Clients

Claude Desktop

配置文件位置:

操作系统 路径
窗户 %APPDATA%\Claude\claude_desktop_config.json
macOS ~/Library/Application Support/Claude/claude_desktop_config.json

将以下内容添加到配置文件中:

{
  "mcpServers": {
    "dotnet-mcp-server": {
      "command": "dotnet-mcp-server"
    }
  }
}

重新启动克劳德桌面。您应该在聊天中看到可用的工具。

VS Code — GitHub Copilot (Built-in)

VS代码具有 原生MCP支持 通过GitHub Copilot(代理模式)。无需扩展——只需启用副驾驶的VS Code 1.99+。

第一步: 在VS Code中打开您的项目。

第二步: 创建一个 .vscode/mcp.json 工作区根目录中的文件:

{
  "servers": {
    "dotnet-mcp-server": {
      "command": "dotnet-mcp-server"
    }
  }
}

步骤3: 打开 副驾驶聊天 面板(Ctrl+Shift+I 或 Cmd+Shift+I).

步骤4: 切换到 代理模式 (点击聊天面板顶部的下拉菜单,选择“Agent”)。

步骤5: 您应该看到列出的MCP工具。问副驾驶问题,比如 “东京现在几点了?” 或 “列出我的文档文件夹中的文件”.

提示: 您还可以通过VS Code设置全局添加服务器(settings.json):

{
  "mcp": {
    "servers": {
      "dotnet-mcp-server": {
        "command": "dotnet-mcp-server"
      }
    }
  }
}

VS Code — Continue.dev (Open Source)

继续 是VS Code和JetBrains的免费开源AI编码助手。

第一步: 安装 继续 VS Code Marketplace的扩展。

第二步: 打开继续配置:按 Ctrl+Shift+P → type Continue: Open Config → 选择它。

步骤3: 这将打开 ~/.continue/config.json.在下面添加MCP服务器 mcpServers:

{
  "mcpServers": [
    {
      "name": "dotnet-mcp-server",
      "command": "dotnet-mcp-server"
    }
  ]
}

步骤4: 重新加载VS代码(Ctrl+Shift+P → Developer: Reload Window).

步骤5: 打开继续聊天面板。这些工具将在代理模式下可用。

VS Code — Cline (Open Source)

克莱恩 是VS Code的免费开源自主AI编码代理。

第一步: 安装 克莱恩 VS Code Marketplace的扩展。

第二步: 打开Cline设置:单击侧栏中的Cline图标→ 点击 齿轮图标 → go to MCP服务器.

步骤3: 点击 “编辑MCP设置” 哪个打开 ~/Documents/Cline/cline_mcp_settings.json.添加:

{
  "mcpServers": {
    "dotnet-mcp-server": {
      "command": "dotnet-mcp-server"
    }
  }
}

步骤4: 重新启动Cline。这些工具应出现在MCP服务器部分。

Cursor

光标 是一款内置MCP支持的AI优先代码编辑器。

第一步: 打开光标设置→ go to 主控程序 部分(或新闻 Ctrl+Shift+J).

第二步: 点击 “添加新的MCP服务器”.

步骤3: 或者,创建/编辑 ~/.cursor/mcp.json:

{
  "mcpServers": {
    "dotnet-mcp-server": {
      "command": "dotnet-mcp-server"
    }
  }
}

步骤4: 重新启动游标。使用Composer(代理模式)中的工具。

Windsurf (Codeium)

帆板运动 是Codeium的一款支持MCP的AI编辑器。

第一步: 打开Windsurf,前往 设置 → 主控程序.

第二步: 点击 “添加服务器” 并配置:

{
  "mcpServers": {
    "dotnet-mcp-server": {
      "command": "dotnet-mcp-server"
    }
  }
}

步骤3: 重新启动Windsurf。Cascade(AI聊天)中提供了工具。

Claude Code (CLI)

克劳德代码 是Anthropic的CLI工具。它原生支持MCP服务器。

claude mcp add dotnet-mcp-server dotnet-mcp-server

就是这样——Claude Code会在需要时自动启动服务器。

ChatGPT Desktop

OpenAI的ChatGPT桌面应用程序支持MCP服务器(需要Plus计划)。

第一步: 打开ChatGPT桌面→ 设置 → 测试版功能 → 启用 MCP服务器.

第二步: 首选 设置 → MCP服务器 → click “添加服务器”.

步骤3: 配置:

  • 姓名: dotnet-mcp-server
  • 命令: dotnet-mcp-server
  • 论据: (留空)

步骤4: 重新启动ChatGPT。聊天中会出现工具。

Manual Testing (No Client Needed)

您可以直接从任何终端测试服务器:

dotnet run --project src/McpServer

然后逐行粘贴JSON-RPC消息:

{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","clientInfo":{"name":"manual-test","version":"1.0"}}}
{"jsonrpc":"2.0","method":"notifications/initialized"}
{"jsonrpc":"2.0","id":2,"method":"tools/list"}
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"datetime","arguments":{"action":"now"}}}

注: 替换 C:\path\to\dotnet-mcp-server 上面所有示例中克隆仓库的实际路径。


💬 Tool Usage Examples

DateTime Tool

问克劳德:

  • “东京现在几点了?”
  • “将美国东部时间下午3点转换为印度标准时间”
  • “当前UTC时间是多少?”

File System Tool

问克劳德:

  • “列出我的文档文件夹中的文件”
  • “阅读README.md的内容”
  • “在我的项目中搜索所有.cs文件”

SQL Query Tool

问克劳德:

  • “显示MyDB数据库中的表”
  • “按收入查询前10名客户”
  • “描述订单表的结构”

HTTP Tool

问克劳德:

  • “获取我的GitHub个人资料信息”
  • “从JSONPlaceholder API获取最新帖子”
  • “您可以访问哪些API?”

Text Tool

问克劳德:

  • “查找此文本中的所有电子邮件地址”
  • “在我的配置中将localhost:3000替换为api.prod.com”
  • “这份文件有多少个单词?”
  • “让我看看这两个配置之间的区别”
  • “漂亮地打印这个缩小的JSON”

Data Transform Tool

问克劳德:

  • “将此CSV转换为JSON”
  • “从该JSON中提取所有用户电子邮件”
  • “Base64编码此字符串”
  • “生成此文本的SHA256哈希值”
  • “将此XML响应转换为JSON”

Environment Tool

问克劳德:

  • “我的JAVA_HOME设置为什么?”
  • “显示所有与节点相关的环境变量”
  • “是否配置了DOCKER_HOST?”

System Info Tool

问克劳德:

  • “我有多少磁盘空间?”
  • “哪些进程使用的内存最多?”
  • “我的操作系统版本和.NET运行时是什么?”
  • “显示我的网络接口”

Git Tool

问克劳德:

  • “我在这个仓库中更改了哪些文件?”
  • “显示最后10个提交”
  • “我目前的变化有什么不同?”
  • “谁最后修改了Program.cs的第42行?”

⚙️ Configuration Reference

Example Profiles

中提供了即用型配置文件 examples/configs/:

文件 最适合
developer.json 软件开发人员——本地仓库、开发数据库、GitHub/npm/docs API
data-analyst.json 数据分析师——数据目录、分析数据库、公共数据API
api-integrator.json API集成商—广泛的外部API访问,最少的文件系统

将其中一个复制到您的配置目录并编辑以匹配您的环境。

File System Settings

{
  "FileSystem": {
    "AllowedPaths": [
      "/home/user/documents",
      "/projects"
    ]
  }
}

SQL Settings

{
  "Sql": {
    "Connections": {
      "Production": {
        "ConnectionString": "Server=...;Database=...;",
        "Description": "Production database (read-only)"
      },
      "Analytics": {
        "ConnectionString": "Server=...;Database=...;",
        "Description": "Analytics warehouse"
      }
    }
  }
}

HTTP Settings

{
  "Http": {
    "AllowedHosts": [
      "api.github.com",
      "api.stripe.com",
      "your-internal-api.com"
    ],
    "TimeoutSeconds": 30
  }
}

🏗️ Architecture

┌──────────────┐ ┌──────────┐ ┌────────┐ ┌──────────┐
│Claude Desktop│ │ VS Code  │ │ Cursor │ │ ChatGPT  │
│              │ │(Copilot/ │ │        │ │ Desktop  │
│              │ │Continue/ │ │        │ │          │
│              │ │ Cline)   │ │        │ │          │
└──────┬───────┘ └────┬─────┘ └───┬────┘ └────┬─────┘
       │              │           │            │
       └──────────────┴─────┬─────┴────────────┘
                            │ JSON-RPC over stdio
                            ▼
                 ┌─────────────────────┐
                 │  dotnet-mcp-server  │
                 │  (MCP Server)       │
                 ├─────────────────────┤
                 │  ┌───────────────┐  │
                 │  │ DateTime Tool │  │
                 │  ├───────────────┤  │
                 │  │ FileSystem    │  │
                 │  ├───────────────┤  │
                 │  │ SQL Query     │  │
                 │  ├───────────────┤  │
                 │  │ HTTP Tool     │  │
                 │  ├───────────────┤  │
                 │  │ Text Tool     │  │
                 │  ├───────────────┤  │
                 │  │ Data Transform│  │
                 │  ├───────────────┤  │
                 │  │ Environment   │  │
                 │  ├───────────────┤  │
                 │  │ System Info   │  │
                 │  ├───────────────┤  │
                 │  │ Git Tool      │  │
                 │  └───────────────┘  │
                 └─────────────────────┘
                            │
               ┌────┬───┬───┴───┬────┐
               ▼    ▼   ▼       ▼    ▼
             Files SQL  APIs   Git  OS

📂 Project Structure

dotnet-mcp-server/
├── src/
│   └── McpServer/
│       ├── Protocol/           # MCP/JSON-RPC types
│       ├── Tools/              # Tool implementations
│       ├── Configuration/      # Settings classes
│       ├── McpServerHandler.cs # Main server logic
│       └── Program.cs          # Entry point
├── tests/
│   └── McpServer.Tests/        # Unit tests
├── docker/
│   └── appsettings.example.json  # Docker config template
├── examples/
│   ├── configs/
│   │   ├── developer.json        # Developer profile
│   │   ├── data-analyst.json     # Data analyst profile
│   │   └── api-integrator.json   # API integrator profile
│   └── SamplePlugin/             # Reference plugin implementation
├── Dockerfile                  # Multi-stage Alpine build
├── docker-compose.yml          # mcp-server + SQL Server 2022
├── .env.example                # SQL SA password template
└── README.md

🔧 Adding Custom Tools

创建一个新类来实现 ITool:

public class MyCustomTool : ITool
{
    public string Name => "my_tool";
    public string Description => "Does something useful";

    public JsonSchema InputSchema => new()
    {
        Type = "object",
        Properties = new Dictionary<string, JsonSchemaProperty>
        {
            ["input"] = new() { Type = "string", Description = "Input value" }
        },
        Required = new List<string> { "input" }
    };

    public async Task<ToolCallResult> ExecuteAsync(
        Dictionary<string, object>? arguments,
        CancellationToken cancellationToken)
    {
        var input = arguments?["input"]?.ToString();
        // Do something...
        return new ToolCallResult
        {
            Content = new List<ContentBlock>
            {
                new() { Type = "text", Text = $"Result: {input}" }
            }
        };
    }
}

注册于 Program.cs:

services.AddSingleton<ITool, MyCustomTool>();

🔌 Plugin Development

您可以使用自己的工具扩展服务器,无需分叉或修改核心项目。插件很简单。NET类库实现 ITool 然后掉进 plugins/ 文件夹。

Scaffold a plugin in one command

第一步: 安装模板包(一次):

dotnet new install DotnetMcpServer.Templates

第二步: 构建一个新的插件项目:

dotnet new mcp-tool -n WeatherTool
cd WeatherTool

步骤3: 实施您的工具--打开 WeatherTool.cs 并遵循TODO标记。

步骤4: 构建和安装:

dotnet build -c Release

窗户:

copy bin\Release\net8.0\WeatherTool.dll "$env:APPDATA\dotnet-mcp-server\plugins\"

Linux/macOS:

cp bin/Release/net8.0/WeatherTool.dll ~/.config/dotnet-mcp-server/plugins/

重新启动服务器——您的工具出现在 tools/list 自动。

Plugin configuration

通过以下方式将值传递给您的插件 appsettings.json:

{
  "Plugins": {
    "Config": {
      "my_api_key": "your-value-here"
    }
  }
}

使用 PluginContext 工具类中的构造函数模式,用于读取这些值(scaffold文件包含一个注释掉的示例)。


🔍 Troubleshooting

问题 解决方案
客户端看不到工具 检查配置文件路径是否正确。重新启动客户端。确保路径 dotnet-mcp-server 是绝对的。
“拒绝访问”错误 将路径添加到 AllowedPaths 在 appsettings.json
SQL连接失败 请验证连接字符串。确保SQL Server正在运行。
HTTP请求被阻止 将主机添加到 AllowedHosts 在 appsettings.json
“服务器未初始化”错误 您的客户端必须发送 initialize 在调用工具之前。大多数客户会自动执行此操作。
VS Code Copilot不显示工具 请确保您在 代理模式 (非询问/编辑模式)。检查 .vscode/mcp.json 语法。
工具未加载到游标中 转到设置→ MCP并检查服务器是否显示绿色状态。如果需要,重新启动Cursor。

查看日志

日志被写入stderr。要查看它们:

dotnet run 2> log.txt

路线图

✅ Phase 1 — Security & Stability

  • [x] 文件系统工具的路径遍历预防
  • [x] SQL注入预防(仅限SELECT强制执行)
  • [x] 支持子域的HTTP主机分配列表验证
  • [x] XML解析中的XXE预防
  • [x] 带有正则表达式超时的ReDoS保护
  • [x] 环境变量敏感值屏蔽

✅ Phase 2 — New Tools

  • [x] 文本工具(正则表达式匹配/替换、字数统计、差异、格式JSON/XML)
  • [x] 数据转换工具(JSON查询、CSV↔JSON↔XML转换、base64、哈希)
  • [x] 环境工具(使用掩码获取/列出/检查环境变量)
  • [x] 系统信息工具(操作系统详细信息、进程、磁盘、网络)
  • [x] Git工具(只读:状态、日志、差异、分支、责备)

✅ Phase 3 — Production Readiness

  • [x] 3.1--具有自包含二进制发布的CI/CD管道
  • [x] 3.2-- --validate 配置健康检查标志
  • [x] 3.3-- --init 交互式设置向导
  • [x] 3.4--NuGet全局工具(dotnet tool install -g DotnetMcpServer)
  • [x] 3.5——带有测试门的Docker多阶段Alpine构建

✅ Phase 4 — MCP Protocol Completeness

  • [x] 4.1——资源协议(resources/list, resources/read)
  • [x] 4.2——提示协议(prompts/list, prompts/get)
  • [x] 4.3——记录协议(logging/setLevel,日志转发到客户端)
  • [x] 4.4——进度通知(每个工具流式进度令牌)

✅ Phase 5 — Developer Experience

  • [x] 5.1——插件架构(插入式DLL插件)
  • [x] 5.2-- dotnet new mcp-tool 模板
  • [x] 5.3--示例配置文件(开发人员、数据分析师、api集成商)
  • [x] 5.4--CONTRIBUTING.md和GitHub问题模板
  • [x] 5.5--GitHub Pages文档网站(MkDocs材料)

✅ Phase 6 — Advanced Features

  • [x] 6.1--多数据库支持(SQL Server、PostgreSQL、MySQL、SQLite)
  • [x] 6.2--审计日志记录(滚动JSONL文件并进行参数净化)
  • [x] 6.3——每工具滑动窗口速率限制
  • [x] 6.4--具有可配置TTL的每工具响应缓存

✅ Phase 7 — Tool-level Authentication & Permissions

  • [x] 7.1-API密钥认证通过 MCP_API_KEY 环境变量
  • [x] 7.2--按键工具分配列表(将键限制为特定工具)
  • [x] 7.3--按键操作列表(将一个键限制为工具中的特定操作)
  • [x] 7.4--审核记录包括客户身份名称

Phase 8 ✅ — Document Processing Tool

  • [x] 8.1——通过PdfPig读取PDF(文本提取、元数据、搜索)
  • [x] 8.2--通过OpenXml+ClosedXML创建Office文档(Word.docx、Excel.xlsx、PowerPoint.pptx)
  • [x] 8.3--表格提取(Word+PDF)、带行/列计数的Excel表格列表、进度报告

Phase 9 — Notification & Communication Tool

  • []9.1--通过SMTP(MailKit)发送电子邮件通知,收件人分配列表
  • []9.2--Microsoft Teams+Slack webhook通知
  • []9.3——通用HTTP webhook+Markdown到自适应卡/块工具包模板

贡献

欢迎Bug报告、功能请求和拉取请求!请阅读 贡献.md 在提交之前。


相关项目


许可证

此项目根据MIT许可证获得许可-请参阅 许可证 文件以获取详细信息。


作者

阿加·萨卡尔


⭐ 如果你觉得这个项目有帮助,请给它一颗星!