使用说明
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自动处理基于浏览器的登录流的工具。 - 使用加密的本地存储安全地存储每个会话的令牌。
- 令牌过期时自动刷新。
- 包括a
- 符合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());
登录流程
- 用户问克劳德: “请登录” 或者使用需要身份验证的工具。
- 克劳德称
login_auth_code_pkce工具。 - MCPify会自动打开登录页面的系统浏览器(在交互式环境中)。
- 用户登录并批准请求。
- 浏览器重定向回您的应用程序(例如。,
/auth/callback). - 您的应用程序会保存令牌并显示成功消息。
- 这
login_auth_code_pkce该工具检测到成功登录并向Claude报告。 - 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=...) - 令牌刷新请求
贡献
我们欢迎捐款!请查看我们的 贡献指南 了解详情。
许可证
麻省理工学院
