返回市场
.NET元数据MCP服务器

.NET元数据MCP服务器

作者:V0v1kkk11 星标更新:2025-10-19

项目介绍

.NET 类型探索器 MCP 服务器

一个提供来自 .NET 项目的详细类型信息的 Model Context Protocol (MCP) 服务器,用于 AI 编码代理。

概述

.NET 类型探索器 MCP 服务器是一个强大的工具,旨在帮助 AI 编码代理理解和处理 .NET 代码库。它提供了一种结构化的方式来探索 .NET 项目中的程序集、命名空间和类型,使得 AI 代理能够生成准确且上下文感知的代码建议。

该服务器通过反射从编译的 .NET 程序集中提取详细的类型信息,包括类、接口、方法、属性、字段和事件。这些信息随后可以通过一组工具供 AI 代理系统地探索代码库。

贡献

欢迎贡献!请随时提交拉取请求。

功能

  • 程序集探索:检索 .NET 项目引用的所有程序集列表
  • 命名空间探索:发现指定程序集内的所有命名空间
  • 类型探索:获取指定命名空间内类型的详细信息,包括:
    • 带有泛型参数的完整类型名称
    • 实现的接口
    • 带有参数的构造函数
    • 带有返回类型和参数的方法
    • 带有类型和访问器的属性
    • 带有类型和修饰符的字段
    • 带有处理器类型的事件
  • NuGet 包搜索:在 nuget.org 上搜索 NuGet 包,支持过滤和分页
  • NuGet 包版本信息:检索特定 NuGet 包的版本历史和依赖信息
  • 过滤:应用通配符过滤以缩小结果范围
  • 分页:处理大型结果集时内置分页

发展路线图

  • 添加 NuGet 集成以提供实际包版本的信息
  • 迁移到官方的 Model Context Protocol C# SDK (modelcontextprotocol/csharp-sdk)
  • 支持多个 NuGet 包源(自定义/私有源)
  • 添加构建依赖关系图的能力
  • 改善多项目场景

先决条件

  • .NET 9.0 SDK 或更高版本
  • 想要探索的 .NET 项目

配置

NuGet 包源

服务器支持同时查询多个 NuGet 包源。在 appsettings.json 中配置自定义源:

{
  "Tools": {
    "DefaultPageSize": 20,
    "IntendResponse": false,
    "NuGetSources": [
      {
        "Name": "nuget.org",
        "Url": "https://api.nuget.org/v3/index.json",
        "Enabled": true
      },
      {
        "Name": "MyPrivateFeed",
        "Url": "https://my-company.com/nuget/v3/index.json",
        "Enabled": true
      },
      {
        "Name": "dotnet-core (MyGet)",
        "Url": "https://dotnet.myget.org/F/dotnet-core/api/v3/index.json",
        "Enabled": true,
        "Comment": "示例:.NET Core 预览包的公共 MyGet 源"
      }
    ]
  }
}

配置选项:

  • Name:包源的友好名称
  • Url:完整的 NuGet v3 API 终结点 URL(必须以 /v3/index.json 结尾)
  • Enabled:设置为 false 以临时禁用某个源而不删除它

行为:

  • 所有启用的源并行查询以提高性能
  • 结果自动按包 ID 和版本去重
  • 如果一个源失败,服务器将继续使用剩余的源
  • 默认源行为:仅当 appsettings.json 中未配置任何源时添加 nuget.org

优先级和去重:

当同一个包在多个源中找到时,服务器采用基于优先级的策略:

  1. 优先级由顺序决定:配置中列出的第一个源具有更高的优先级
  2. 确定性结果:列表中的第一个源始终对重复的包具有优先权
  3. 并行查询:尽管执行是并行的,但结果按优先级顺序处理
  4. 元数据一致性:包元数据(描述、下载次数等)始终来自包含该包的最高优先级源

示例:

{
  "NuGetSources": [
    { "Name": "Internal", "Url": "https://internal.company.com/nuget/v3/index.json", "Enabled": true },
    { "Name": "nuget.org", "Url": "https://api.nuget.org/v3/index.json", "Enabled": true }
  ]
}

在此配置中,如果一个包存在于两个源中,则使用“Internal”的信息。

安装

方案 1:本地安装

  1. 克隆仓库
  2. 构建项目:
    dotnet build -c Release
    
  3. 发布项目:
    dotnet publish -c Release -r <runtime-identifier> --self-contained false
    
    <runtime-identifier> 替换为目标平台(例如,win-x64linux-x64osx-x64)。

方案 2:Docker

服务器作为 Docker 容器提供,提供了更好的隔离性和更简单的部署:

  1. 从 Docker Hub 拉取镜像

    docker pull vrogozhin/dotnet-types-explorer-mcp:latest
    
  2. 或本地构建

    git clone https://github.com/V0v1kkk/DotNetMetadataMcpServer.git
    cd DotNetMetadataMcpServer
    docker build -t dotnet-types-explorer-mcp .
    
  3. 运行容器

    docker run --rm -i \
      -v /path/to/your/dotnet/projects:/workspace \
      vrogozhin/dotnet-types-explorer-mcp:latest
    

Docker 部署的好处:

  • 不需要在机器上安装 .NET SDK
  • 隔离环境防止冲突
  • 在不同操作系统上具有一致的行为
  • 包含 MSBuild 和所有必需的依赖项
  • 通过拉取最新镜像轻松更新

配置

本地配置

要使用 .NET 类型探索器 MCP 服务器与 AI 代理,您需要在 MCP 设置文件中进行配置。这里是一个示例配置:

{
  "mcpServers": {
    "dotnet-types-explorer": {
      "command": "/path/to/DotNetMetadataMcpServer",
      "args": [ "--homeEnvVariable", "/home/user" ],
      "disabled": false,
      "alwaysAllow": [],
      "timeout": 300
    }
  }
}

/path/to/DotNetMetadataMcpServer 替换为已发布的可执行文件的实际路径,并将 /home/user 替换为您自己的主目录。

Docker 配置

对于 Docker 部署,配置您的 MCP 客户端如下:

{
  "mcpServers": {
    "dotnet-types-explorer": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-v",
        "/path/to/your/dotnet/projects:/workspace",
        "vrogozhin/dotnet-types-explorer-mcp:latest"
      ],
      "disabled": false,
      "alwaysAllow": [],
      "timeout": 100
    }
  }
}

/path/to/your/dotnet/projects 替换为包含您的 .NET 项目的目录。容器将有权访问此目录中的所有项目。

重要限制

  • 项目必须在扫描之前构建。服务器依赖于编译的程序集来提取类型信息,因此请确保在使用工具之前构建您的项目。
  • 工具不会跟踪对其他项目的引用。它只检查指定的项目及其 NuGet 依赖项。如果您需要分析多个项目,您需要分别扫描每个项目。

如何定位项目输出

当扫描项目时,服务器需要编译的程序集路径。MsBuildHelper 评估项目并尝试按以下顺序查找输出程序集:

  • 请求的配置(默认为 Debug),然后
  • Release,如果仍未找到,
  • 回退到再次检查 Debug 作为安全默认值。

第一个存在的输出获胜。如果没有找到输出,假设一个合理的默认路径并记录警告。这使本地运行(通常是 Debug)和 CI 运行(通常是 Release)具有一致的行为。确保在扫描之前以这些配置之一构建项目。

使用

服务器提供五个主要工具,可以由 AI 代理使用:

  1. ReferencedAssembliesExplorer:从 .NET 项目检索引用的程序集
  2. NamespacesExplorer:从指定的程序集检索命名空间
  3. NamespaceTypes:从指定的命名空间检索类型
  4. NuGetPackageSearch:在 nuget.org 上搜索 NuGet 包,支持过滤和分页
  5. NuGetPackageVersions:检索特定 NuGet 包的版本历史和依赖信息

此工具已在 Roo Code Visual Studio 扩展中进行了测试,这是一个支持 Model Context Protocol 的 AI 编码助手。您可以在 GitHub 上找到有关 Roo Code 的更多信息。

可能使用 .clinerules 文件来指示您的编码助手使用 MCP 服务器。

AI 编码助手指令

如果您正在处理带有 NuGet 包引用的 .NET 项目,并需要使用这些包编写代码,您应该使用 Dotnet 类型探索器 MCP 服务器系统地探索这些包的 API。这在您不熟悉包的 API 或文档有限时尤为重要。

当处理 .NET 项目时:

  1. 首先确保项目已构建。此工具依赖于编译的程序集来提取类型信息。
  2. 使用 ReferencedAssembliesExplorer 工具检索项目文件引用的所有程序集。这为您提供了一个所有可用程序集的列表。
  3. 关注第三方库和 NuGet 包,而不是 Base Class Library (BCL) 类型如 System.* 或 Microsoft.*,这些类型在其他地方已经很好地记录了。
  4. 一旦确定了相关的程序集,使用 NamespacesExplorer 工具发现这些程序集内的命名空间。这有助于您了解库是如何组织的。
  5. 在确定了相关的命名空间后,使用 NamespaceTypes 工具检索您感兴趣的命名空间内的类型详细信息。这包括方法、属性、字段、事件等。
  6. 当您被大量数据淹没或确切知道您在寻找什么时,才使用过滤。
  7. 如果您需要查找特定的 NuGet 包或探索它们的版本和依赖关系,请使用 NuGetPackageSearch 工具按名称或关键字搜索包。
  8. 当您需要特定 NuGet 包的详细信息,包括其版本历史和依赖关系时,请使用 NuGetPackageVersions 工具。这对于理解兼容性需求或依赖链特别有用。
  9. 使用 NuGet 工具的过滤能力来缩小搜索特定版本或具有特定命名模式的包的结果。

请记住,此工具仅检查指定的项目及其 NuGet 依赖项。它不会跟踪解决方案中的其他项目引用。如果您需要分析多个项目,您需要分别扫描每个项目。

这种自顶向下的方法(程序集 → 命名空间 → 类型)是探索和理解 .NET 库最有效的方式,特别是当您需要编写使用它们的代码时。对于 API 可能不明显或记录不足的第三方库,这种方法尤其有价值。NuGet 工具通过提供直接访问包信息而无需将包已引用在项目中,补充了这一方法。

工作原理

服务器使用以下过程提取类型信息:

  1. 项目评估:使用 MSBuild 评估项目文件并找到编译的程序集
  2. 程序集加载:加载编译的程序集及其依赖项
  3. 类型反射:使用反射提取类型详细信息
  4. 过滤和分页:对结果应用过滤和分页
  5. 响应格式化:将结果格式化为 JSON 并返回给客户端

API 参考

ReferencedAssembliesExplorer

根据过滤器和分页检索引用的程序集。

输入模式:

{
  "type": "object",
  "properties": {
    "ProjectFileAbsolutePath": {
      "type": "string"
    },
    "PageNumber": {
      "type": "integer"
    },
    "FullTextFiltersWithWildCardSupport": {
      "type": "array",
      "items": {
        "type": [
          "string",
          "null"
        ]
      }
    }
  },
  "required": [
    "ProjectFileAbsolutePath"
  ]
}

响应:

{
  "AssemblyNames": ["Assembly1", "Assembly2", ...],
  "CurrentPage": 1,
  "AvailablePages": [1, 2, ...]
}

NamespacesExplorer

支持过滤和分页从指定的程序集检索命名空间。

输入模式:

{
  "type": "object",
  "properties": {
    "ProjectFileAbsolutePath": {
      "type": "string"
    },
    "AssemblyNames": {
      "type": "array",
      "items": {
        "type": [
          "string",
          "null"
        ]
      }
    },
    "PageNumber": {
      "type": "integer"
    },
    "FullTextFiltersWithWildCardSupport": {
      "type": "array",
      "items": {
        "type": [
          "string",
          "null"
        ]
      }
    }
  },
  "required": [
    "ProjectFileAbsolutePath"
  ]
}

响应:

{
  "Namespaces": ["Namespace1", "Namespace2", ...],
  "CurrentPage": 1,
  "AvailablePages": [1, 2, ...]
}

NamespaceTypes

支持过滤和分页从指定的命名空间检索类型。

输入模式:

{
  "type": "object",
  "properties": {
    "ProjectFileAbsolutePath": {
      "type": "string"
    },
    "Namespaces": {
      "type": "array",
      "items": {
        "type": [
          "string",
          "null"
        ]
      }
    },
    "PageNumber": {
      "type": "integer"
    },
    "FullTextFiltersWithWildCardSupport": {
      "type": "array",
      "items": {
        "type": [
          "string",
          "null"
        ]
      }
    }
  },
  "required": [
    "ProjectFileAbsolutePath"
  ]
}

响应:

{
  "TypeData": [
    {
      "FullName": "Namespace.TypeName",
      "Implements": ["Interface1", "Interface2", ...],
      "Constructors": ["(param1, param2)", ...],
      "Methods": ["ReturnType MethodName(param1, param2)", ...],
      "Properties": ["PropertyType PropertyName { get; set; }", ...],
      "Fields": ["FieldType FieldName", ...],
      "Events": ["event EventHandlerType EventName", ...]
    },
    ...
  ],
  "CurrentPage": 1,
  "AvailablePages": [1, 2, ...]
}

NuGetPackageSearch

支持过滤和分页在 nuget.org 上搜索 NuGet 包。

输入模式:

{
  "type": "object",
  "properties": {
    "SearchQuery": {
      "type": "string"
    },
    "IncludePrerelease": {
      "type": "boolean"
    },
    "PageNumber": {
      "type": "integer"
    },
    "FullTextFiltersWithWildCardSupport": {
      "type": "array",
      "items": {
        "type": [
          "string",
          "null"
        ]
      }
    }
  },
  "required": [
    "SearchQuery"
  ]
}

响应:

{
  "Packages": [
    {
      "Id": "Newtonsoft.Json",
      "Version": "13.0.3",
      "Description": "Json.NET 是一个流行的高性能 JSON 框架",
      "Authors": "James Newton-King",
      "DownloadCount": 1000000,
      "Published": "2023-03-08T00:00:00Z"
    },
    ...
  ],
  "CurrentPage": 1,
  "AvailablePages": [1, 2, ...]
}

NuGetPackageVersions

检索特定 NuGet 包的版本历史和依赖信息。

输入模式:

{
  "type": "object",
  "properties": {
    "PackageId": {
      "type": "string"
    },
    "IncludePrerelease": {
      "type": "boolean"
    },
    "PageNumber": {
      "type": "integer"
    },
    "FullTextFiltersWithWildCardSupport": {
      "type": "array",
      "items": {
        "type": [
          "string",
          "null"
        ]
      }
    }
  },
  "required": [
    "PackageId"
  ]
}

响应:

{
  "PackageId": "Newtonsoft.Json",
  "Versions": [
    {
      "Id": "Newtonsoft.Json",
      "Version": "13.0.3",
      "Description": "Json.NET 是一个流行的高性能 JSON 框架",
      "Authors": "James Newton-King",
      "DownloadCount": 1000000,
      "Published": "2023-03-08T00:00:00Z",
      "DependencyGroups": [
        {
          "TargetFramework": ".NETStandard2.0",
          "Dependencies": [
            {
              "Id": "System.Text.Json",
              "VersionRange": "6.0.0"
            }
          ]
        }
      ]
    },
    ...
  ],
  "CurrentPage": 1,
  "AvailablePages": [1,