API转MCP工具库

MCPify是一个.NET库,将现有的ASP.NET Core API或外部OpenAPI/Swagger规范转换为MCP工具,供AI助手使用。

  • by abdebek
  • C#
  • 本地部署
  • 4 星标
  • 更新于
在 GitHub 查看 abdebek/MCPify

使用说明

MCPify

MCPify 是a。NET库,弥合现有ASP。NET核心API(或外部OpenAPI/Swagger规范)和 模型上下文协议(MCP)。它允许您将API操作公开为MCP工具,可以由Claude Desktop等人工智能助手使用,确保与现有服务无缝集成。

最新版本: v0.0.12-现在有了增强的OAuth中间件和改进的测试基础设施!

最新动态

v0.0.12(最新版本-2026年1月23日)

  • 增强型OAuth中间件:改进了OAuth身份验证中间件,具有更好的错误处理和令牌管理(#17)
  • JWT令牌验证:完全支持JWT访问令牌验证,包括过期、受众和范围验证(#15)
  • 根据工具范围要求:使用模式匹配为特定工具定义粒度范围要求(#15)
  • 自动范围发现:作用域会自动从OpenAPI安全方案中提取出来,并在验证过程中强制执行(#15)
  • WWW身份验证标头:改进了WWW-Authenticate标头,以根据MCP规范包含作用域参数
  • 登录:控制无头环境中OAuth登录的浏览器启动行为
  • OAuth2配置列表:支持多个暴露于AuthorizationServers的OAuth提供者(#13)

特性

  • 自动生成刀具:将OpenAPI(Swagger)v2/v3定义动态转换为MCP工具。
  • 混合动力支持:暴露你的 本地 ASP。NET核心端点和 外部的 公共API同时。
  • 无缝身份验证:内置了对OAuth 2.0授权代码流和PKCE的支持。
    • 包括a login_auth_code_pkce 自动处理基于浏览器的登录流的工具。
    • 使用加密的本地存储安全地存储每个会话的令牌。
    • 令牌过期时自动刷新。
  • 符合MCP授权规范:完全遵守 MCP授权规范.
    • 受保护资源元数据(/.well-known/oauth-protected-resource)
    • RFC 8707资源参数支持
    • JWT令牌验证(过期、受众、范围)
    • 403禁止 insufficient_scope 错误
  • 双重运输:支持两者 Stdio (适用于Claude等本地桌面应用程序)和 Http (SSE)运输。
  • 生产就绪:强大的日志记录、错误处理和可配置选项。

支持的框架

  • .NET 8。网9。净值10

快速开始

1.安装

将该软件包安装到您的ASP。NET核心项目:

dotnet add package MCPify

2.配置

将MCPify添加到您的 Program.cs:

using MCPify.Hosting;

var builder = WebApplication.CreateBuilder(args);

// ... Add other services ...

// Add MCPify services
builder.Services.AddMcpify(options =>
{
    // Stdio for local tools (Claude Desktop), Http for remote servers
    options.Transport = McpTransportType.Stdio;

    // Option A: Expose Local Endpoints
    options.LocalEndpoints = new LocalEndpointsOptions
    {
        Enabled = true,
        ToolPrefix = "myapp_",
        BaseUrlOverride = "https://localhost:5001",  // Optional: override base URL
        Filter = op => op.Route.StartsWith("/api"),  // Optional: filter endpoints
        AuthenticationFactory = sp => sp.GetRequiredService<OAuthAuthorizationCodeAuthentication>()  // Optional
    };

    // Option B: Expose External APIs from URL
    options.ExternalApis.Add(new ExternalApiOptions
    {
        ApiBaseUrl = "https://petstore.swagger.io/v2",
        OpenApiUrl = "https://petstore.swagger.io/v2/swagger.json",
        ToolPrefix = "petstore_"
    });

    // Option C: Expose External APIs from Local File
    options.ExternalApis.Add(new ExternalApiOptions
    {
        ApiBaseUrl = "https://api.example.com",
        OpenApiFilePath = "path/to/openapi-spec.json",  // or .yaml
        ToolPrefix = "myapi_"
    });
});

var app = builder.Build();

// Add Middleware (order matters!)
app.UseAuthentication();
app.UseAuthorization();

// ... Map your endpoints ...

// Map the MCP endpoint (required for Http transport)
app.MapMcpifyEndpoint();

app.Run();

3.使用Claude Desktop

使用MCPify应用程序 克劳德桌面,编辑您的配置文件(%APPDATA%\Claude\claude_desktop_config.json 在Windows或 ~/Library/Application Support/Claude/claude_desktop_config.json 在macOS上):

{
  "mcpServers": {
    "my-app": {
      "command": "dotnet",
      "args": [
        "run",
        "--project",
        "/absolute/path/to/YourProject.csproj", 
        "--",
        "--Mcpify:Transport=Stdio"
      ]
    }
  }
}

注: 使用时 dotnet run,确保您的应用程序不会将构建日志打印到stdout,因为这会破坏MCP JSON-RPC协议。您可以隐藏日志或将应用程序发布为单个可执行文件,以实现更清晰的设置。

认证

MCPify提供全面的OAuth 2.0身份验证支持,包括自动令牌管理、验证和范围强制。

启用OAuth

在您的 Program.cs (请确保在致电之前完成此操作 AddMcpify):

services.AddScoped<OAuthAuthorizationCodeAuthentication>(sp => {
    return new OAuthAuthorizationCodeAuthentication(
        clientId: "your-client-id",
        authorizationEndpoint: "https://auth.example.com/authorize",
        tokenEndpoint: "https://auth.example.com/token",
        scope: "api_access",
        secureTokenStore: sp.GetRequiredService<ISecureTokenStore>(),
        mcpContextAccessor: sp.GetRequiredService<IMcpContextAccessor>(),
        redirectUri: "http://localhost:5000/auth/callback" // Your app must handle this
    );
});

// Register the Login Tool
services.AddLoginTool(sp => new LoginTool());

登录流程

  1. 用户问克劳德: “请登录” 或者使用需要身份验证的工具。
  2. 克劳德称 login_auth_code_pkce 工具。
  3. MCPify会自动打开登录页面的系统浏览器(在交互式环境中)。
  4. 用户登录并批准请求。
  5. 浏览器重定向回您的应用程序(例如。, /auth/callback).
  6. 您的应用程序会保存令牌并显示成功消息。
  7. 这 login_auth_code_pkce 该工具检测到成功登录并向Claude报告。
  8. Claude现在可以调用经过身份验证的工具了!

无头/远程环境

在无法打开浏览器的无头服务器、容器或远程环境中运行MCPify时,您可以配置登录行为以跳过浏览器启动尝试并立即返回授权URL:

builder.Services.AddMcpify(options =>
{
    // For headless/remote environments - return URL immediately without browser launch
    options.LoginBrowserBehavior = BrowserLaunchBehavior.Never;
});

可用选项 LoginBrowserBehavior:

值 描述
Auto (默认) 自动检测无头环境(Linux、SSH会话、容器上没有DISPLAY),并在适当的时候跳过浏览器启动。
Always 无论环境如何,始终尝试打开浏览器。
Never 切勿尝试打开浏览器。立即返回手动身份验证的授权URL。非常适合无头服务器和容器。

随着 Auto 在模式下,MCPify通过检查以下内容来检测无头环境:

  • Linux:缺失 DISPLAY 或 WAYLAND_DISPLAY 环境变量、无X转发的SSH会话、Docker容器
  • 视窗:容器环境(Kubernetes、Docker)
  • macOS:SSH会话

受保护资源元数据和挑战

MCPify现在依赖官方 ModelContextProtocol.AspNetCore OAuth 2.0的身份验证处理程序。当你打电话的时候 AddMcpify,MCP身份验证方案会自动注册,处理程序会发出 WWW-Authenticate 挑战指向受保护的资源元数据端点。

builder.Services.AddMcpify(options =>
{
    // Set the resource URL for audience validation
    options.ResourceUrlOverride = "https://api.example.com";

    // Configure OAuth provider(s)
    options.OAuthConfigurations.Add(new OAuth2Configuration
    {
        AuthorizationUrl = "https://auth.example.com/authorize",
        TokenUrl = "https://auth.example.com/token",
        Scopes = new Dictionary<string, string>
        {
            { "read", "Read access" },
            { "write", "Write access" }
        }
    });

    // Enable token validation (opt-in for backward compatibility)
    options.TokenValidation = new TokenValidationOptions
    {
        EnableJwtValidation = true,
        ValidateAudience = true,
        ValidateScopes = true,
        RequireOAuthConfiguredScopes = true,  // Auto-require scopes from OAuth config
        ClockSkew = TimeSpan.FromMinutes(5)
    };
});

如果需要自定义播发的元数据(例如添加文档链接或覆盖检测到的资源URL),可以配置 McpAuthenticationOptions:

builder.Services.PostConfigure<McpAuthenticationOptions>(options =>
{
    options.ResourceMetadata ??= new ProtectedResourceMetadata();
    options.ResourceMetadata.Documentation = new Uri("https://docs.example.com/mcp");
});

确保您的中间件管道包括 app.UseAuthentication(); 和 app.UseAuthorization(); 以便处理程序可以参与请求。挑战不再通过定制中间件运行;标准ASP。NET Core身份验证流处理一切。

RFC 8707资源参数

MCPify自动包含 RFC 8707 resource OAuth请求中的参数 ResourceUrlOverride 已配置。这有助于授权服务器发布特定资源范围内的令牌:

builder.Services.AddMcpify(options =>
{
    options.ResourceUrlOverride = "https://api.example.com";
});

资源参数添加到:

  • 授权URL(/authorize?resource=...)
  • 令牌交换请求(POST /token 和 resource=...)
  • 令牌刷新请求

贡献

我们欢迎捐款!请查看我们的 贡献指南 了解详情。

许可证

麻省理工学院