- Renamed all directories: OpenHarbor.MCP.* → Svrnty.MCP.* - Updated all namespaces in 179 C# files - Renamed 20 .csproj files and 3 .sln files - Updated 193 documentation references - Updated 33 references in main CODEX codebase - Updated Codex.sln with new paths - Build verified: 0 errors Preparing for extraction to standalone repositories. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1002 lines
27 KiB
Markdown
1002 lines
27 KiB
Markdown
# Svrnty.MCP - Detailed Implementation Plan
|
|
|
|
**Project:** Standalone, Reusable MCP Library for .NET
|
|
**Status:** Planned (Not Yet Started)
|
|
**Created:** 2025-10-19
|
|
**Version:** 1.0.0
|
|
**Estimated Effort:** 3-4 weeks (24-32 hours active work)
|
|
|
|
---
|
|
|
|
## Executive Summary
|
|
|
|
Svrnty.MCP is a **standalone .NET library** implementing the Model Context Protocol (MCP) server functionality. It is designed to be:
|
|
|
|
- **Reusable** across any .NET project
|
|
- **Modular** with clean separation of concerns
|
|
- **Scalable** with built-in permission and rate limiting
|
|
- **Secure** with deny-by-default security model
|
|
- **Self-contained** with complete documentation and examples
|
|
|
|
**First Use Case:** CODEX MCP Gateway (makes CODEX knowledge accessible to all AI agents)
|
|
|
|
**Future Use Cases:** Any .NET application wanting to expose tools/resources via MCP protocol
|
|
|
|
---
|
|
|
|
## Table of Contents
|
|
|
|
- [Architecture](#architecture)
|
|
- [Project Structure](#project-structure)
|
|
- [Implementation Phases](#implementation-phases)
|
|
- [Test-Driven Development Strategy](#test-driven-development-strategy)
|
|
- [AGENT-PRIMER.md Specifications](#agent-primermd-specifications)
|
|
- [CODEX Integration](#codex-integration)
|
|
- [Technology Stack](#technology-stack)
|
|
- [Success Criteria](#success-criteria)
|
|
|
|
---
|
|
|
|
## Architecture
|
|
|
|
### Clean Architecture Layers
|
|
|
|
```
|
|
┌─────────────────────────────────────────────┐
|
|
│ Svrnty.MCP.Core │
|
|
│ (Pure Abstractions - Zero Dependencies) │
|
|
│ │
|
|
│ IMcpServer, IMcpTool, IMcpResource │
|
|
│ IPermissionProvider, IRateLimiter │
|
|
│ McpRequest, McpResponse, McpTool │
|
|
└─────────────────┬───────────────────────────┘
|
|
│ Depends On
|
|
┌─────────────────┴───────────────────────────┐
|
|
│ Svrnty.MCP.Infrastructure │
|
|
│ (Implementation + Transport) │
|
|
│ │
|
|
│ McpServer, ToolRegistry, StdioTransport │
|
|
│ PermissionProvider, TokenBucketRateLimiter │
|
|
│ McpProtocolHandler, AuditLogger │
|
|
└─────────────────┬───────────────────────────┘
|
|
│ Depends On
|
|
┌─────────────────┴───────────────────────────┐
|
|
│ Svrnty.MCP.AspNetCore │
|
|
│ (ASP.NET Core Integration) │
|
|
│ │
|
|
│ ServiceCollectionExtensions │
|
|
│ McpMiddleware, AuditMiddleware │
|
|
│ McpOptions (Configuration) │
|
|
└─────────────────────────────────────────────┘
|
|
|
|
┌─────────────────────────────────────────────┐
|
|
│ Svrnty.MCP.Cli │
|
|
│ (Standalone CLI Runner) │
|
|
│ │
|
|
│ Program.cs (Entry Point) │
|
|
│ Configuration Loading │
|
|
│ Stdio Transport Execution │
|
|
└─────────────────────────────────────────────┘
|
|
```
|
|
|
|
### Component Responsibilities
|
|
|
|
**Core (Abstractions):**
|
|
- `IMcpServer` - Server lifecycle and tool registration
|
|
- `IMcpTool` - Tool interface with execute method
|
|
- `IMcpResource` - Resource interface (future)
|
|
- `IPermissionProvider` - Permission checking abstraction
|
|
- `IRateLimiter` - Rate limiting abstraction
|
|
- Models: Request, Response, Tool metadata, Errors
|
|
|
|
**Infrastructure (Implementation):**
|
|
- `McpServer` - Concrete server implementation
|
|
- `ToolRegistry` - Dynamic tool registration and discovery
|
|
- `McpProtocolHandler` - Protocol message parsing and routing
|
|
- `StdioTransport` - Process stdin/stdout communication
|
|
- `PermissionProvider` - Permission checking logic
|
|
- `TokenBucketRateLimiter` - Rate limiting implementation
|
|
- `AuditLogger` - Audit trail for security
|
|
|
|
**AspNetCore (Integration):**
|
|
- `AddMcpServer()` - DI extension method
|
|
- `McpMiddleware` - HTTP transport middleware
|
|
- `McpOptions` - Configuration model
|
|
- `AuditMiddleware` - Audit logging middleware
|
|
|
|
**Cli (Runtime):**
|
|
- `Program.cs` - CLI entry point
|
|
- Configuration loading from JSON
|
|
- HTTP transport runner
|
|
|
|
---
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
/home/svrnty/codex/Svrnty.MCP/
|
|
├── Svrnty.MCP.sln
|
|
├── README.md
|
|
├── AGENT-PRIMER.md # AI-assisted configuration
|
|
├── LICENSE # MIT
|
|
├── .gitignore
|
|
├── .editorconfig
|
|
│
|
|
├── src/
|
|
│ ├── Svrnty.MCP.Core/
|
|
│ │ ├── Abstractions/
|
|
│ │ │ ├── IMcpServer.cs
|
|
│ │ │ ├── IMcpTool.cs
|
|
│ │ │ ├── IMcpResource.cs
|
|
│ │ │ ├── IPermissionProvider.cs
|
|
│ │ │ └── IRateLimiter.cs
|
|
│ │ ├── Models/
|
|
│ │ │ ├── McpRequest.cs
|
|
│ │ │ ├── McpResponse.cs
|
|
│ │ │ ├── McpTool.cs
|
|
│ │ │ ├── McpResource.cs
|
|
│ │ │ ├── PermissionScope.cs
|
|
│ │ │ └── RateLimitPolicy.cs
|
|
│ │ ├── Exceptions/
|
|
│ │ │ ├── McpException.cs
|
|
│ │ │ ├── PermissionDeniedException.cs
|
|
│ │ │ ├── RateLimitExceededException.cs
|
|
│ │ │ └── ToolNotFoundException.cs
|
|
│ │ └── Svrnty.MCP.Core.csproj
|
|
│ │
|
|
│ ├── Svrnty.MCP.Infrastructure/
|
|
│ │ ├── Server/
|
|
│ │ │ ├── McpServer.cs
|
|
│ │ │ ├── ToolRegistry.cs
|
|
│ │ │ └── McpProtocolHandler.cs
|
|
│ │ ├── Security/
|
|
│ │ │ ├── PermissionProvider.cs
|
|
│ │ │ ├── TokenBucketRateLimiter.cs
|
|
│ │ │ └── AuditLogger.cs
|
|
│ │ ├── Transport/
|
|
│ │ │ ├── StdioTransport.cs
|
|
│ │ │ └── HttpTransport.cs
|
|
│ │ └── Svrnty.MCP.Infrastructure.csproj
|
|
│ │
|
|
│ ├── Svrnty.MCP.AspNetCore/
|
|
│ │ ├── Extensions/
|
|
│ │ │ └── ServiceCollectionExtensions.cs
|
|
│ │ ├── Middleware/
|
|
│ │ │ ├── McpMiddleware.cs
|
|
│ │ │ └── AuditMiddleware.cs
|
|
│ │ ├── Configuration/
|
|
│ │ │ └── McpOptions.cs
|
|
│ │ └── Svrnty.MCP.AspNetCore.csproj
|
|
│ │
|
|
│ └── Svrnty.MCP.Cli/
|
|
│ ├── Program.cs
|
|
│ └── Svrnty.MCP.Cli.csproj
|
|
│
|
|
├── tests/
|
|
│ ├── Svrnty.MCP.Core.Tests/
|
|
│ │ ├── Abstractions/
|
|
│ │ ├── Models/
|
|
│ │ └── Exceptions/
|
|
│ ├── Svrnty.MCP.Infrastructure.Tests/
|
|
│ │ ├── Server/
|
|
│ │ ├── Security/
|
|
│ │ └── Transport/
|
|
│ └── Svrnty.MCP.Integration.Tests/
|
|
│ ├── EndToEnd/
|
|
│ └── Scenarios/
|
|
│
|
|
├── samples/
|
|
│ └── CodexMcpServer/ # CODEX example
|
|
│ ├── Program.cs
|
|
│ ├── CodexMcpServer.cs
|
|
│ ├── Tools/
|
|
│ │ ├── SearchCodexTool.cs
|
|
│ │ ├── GetDocumentTool.cs
|
|
│ │ ├── ListDocumentsTool.cs
|
|
│ │ ├── SearchByTagTool.cs
|
|
│ │ ├── GetDocumentSectionsTool.cs
|
|
│ │ └── ListTagsTool.cs
|
|
│ ├── Permissions/
|
|
│ │ └── CodexPermissionProvider.cs
|
|
│ ├── codex-mcp-config.json
|
|
│ └── CodexMcpServer.csproj
|
|
│
|
|
├── docs/
|
|
│ ├── getting-started.md
|
|
│ ├── architecture.md
|
|
│ ├── creating-tools.md
|
|
│ ├── permission-model.md
|
|
│ ├── rate-limiting.md
|
|
│ └── deployment.md
|
|
│
|
|
└── templates/ # For AGENT-PRIMER.md
|
|
├── appsettings.json.template
|
|
├── mcp-config.json.template
|
|
├── Program.cs.template
|
|
└── sample-tool.cs.template
|
|
```
|
|
|
|
---
|
|
|
|
## Implementation Phases
|
|
|
|
### Phase 1: Core Abstractions (Week 1, 6-8 hours)
|
|
|
|
**Goal:** Define core interfaces and models with zero dependencies
|
|
|
|
#### Step 1.1: Project Setup (30 minutes)
|
|
**TDD:** Not applicable (infrastructure setup)
|
|
|
|
**Tasks:**
|
|
- Create solution: `dotnet new sln -n Svrnty.MCP`
|
|
- Create Core project: `dotnet new classlib -n Svrnty.MCP.Core --framework net8.0`
|
|
- Configure: Enable nullable, ImplicitUsings
|
|
- Add to solution
|
|
|
|
**Deliverables:**
|
|
- Svrnty.MCP.sln
|
|
- Svrnty.MCP.Core.csproj
|
|
- .editorconfig (C# formatting)
|
|
|
|
#### Step 1.2: Core Interfaces (2 hours)
|
|
**TDD:** Write interface tests first (behavior validation via mocks)
|
|
|
|
**Tests FIRST:**
|
|
```csharp
|
|
// Svrnty.MCP.Core.Tests/Abstractions/IMcpServerTests.cs
|
|
[Fact]
|
|
public async Task RegisterTool_WithValidTool_AddsToRegistry()
|
|
{
|
|
var server = new Mock<IMcpServer>();
|
|
var tool = new Mock<IMcpTool>();
|
|
|
|
server.Setup(s => s.RegisterTool(tool.Object))
|
|
.Returns(Task.CompletedTask);
|
|
|
|
await server.Object.RegisterTool(tool.Object);
|
|
|
|
server.Verify(s => s.RegisterTool(tool.Object), Times.Once);
|
|
}
|
|
```
|
|
|
|
**Implementation:**
|
|
```csharp
|
|
// Svrnty.MCP.Core/Abstractions/IMcpServer.cs
|
|
public interface IMcpServer
|
|
{
|
|
Task RegisterTool(IMcpTool tool);
|
|
Task<IEnumerable<IMcpTool>> GetTools();
|
|
Task<McpResponse> HandleRequest(McpRequest request);
|
|
Task Start(CancellationToken cancellationToken = default);
|
|
Task Stop();
|
|
}
|
|
|
|
// Svrnty.MCP.Core/Abstractions/IMcpTool.cs
|
|
public interface IMcpTool
|
|
{
|
|
string Name { get; }
|
|
string Description { get; }
|
|
McpToolSchema Schema { get; }
|
|
Task<McpResponse> Execute(McpRequest request);
|
|
}
|
|
|
|
// Svrnty.MCP.Core/Abstractions/IPermissionProvider.cs
|
|
public interface IPermissionProvider
|
|
{
|
|
Task<bool> HasPermission(string agentId, string action, string? resource = null);
|
|
Task<IEnumerable<string>> GetPermissions(string agentId);
|
|
}
|
|
|
|
// Svrnty.MCP.Core/Abstractions/IRateLimiter.cs
|
|
public interface IRateLimiter
|
|
{
|
|
Task<bool> TryAcquire(string agentId);
|
|
Task<RateLimitInfo> GetLimitInfo(string agentId);
|
|
}
|
|
```
|
|
|
|
**Deliverables:**
|
|
- 5 core interfaces
|
|
- 10+ interface behavior tests
|
|
|
|
#### Step 1.3: Core Models (2 hours)
|
|
**TDD:** Write model tests first (validation, serialization)
|
|
|
|
**Tests FIRST:**
|
|
```csharp
|
|
[Fact]
|
|
public void McpRequest_WithValidData_Serializes()
|
|
{
|
|
var request = new McpRequest
|
|
{
|
|
Method = "tools/call",
|
|
Params = new { tool = "search", query = "test" }
|
|
};
|
|
|
|
var json = JsonSerializer.Serialize(request);
|
|
var deserialized = JsonSerializer.Deserialize<McpRequest>(json);
|
|
|
|
Assert.Equal(request.Method, deserialized.Method);
|
|
}
|
|
```
|
|
|
|
**Implementation:**
|
|
```csharp
|
|
// Svrnty.MCP.Core/Models/McpRequest.cs
|
|
public record McpRequest
|
|
{
|
|
public string Method { get; init; } = string.Empty;
|
|
public object? Params { get; init; }
|
|
public string? Id { get; init; }
|
|
}
|
|
|
|
// Svrnty.MCP.Core/Models/McpResponse.cs
|
|
public record McpResponse
|
|
{
|
|
public object? Result { get; init; }
|
|
public McpError? Error { get; init; }
|
|
public string? Id { get; init; }
|
|
}
|
|
|
|
// Svrnty.MCP.Core/Models/McpTool.cs
|
|
public record McpTool
|
|
{
|
|
public string Name { get; init; } = string.Empty;
|
|
public string Description { get; init; } = string.Empty;
|
|
public McpToolSchema Schema { get; init; } = new();
|
|
}
|
|
```
|
|
|
|
**Deliverables:**
|
|
- 7 core models
|
|
- 15+ model tests (validation, serialization)
|
|
|
|
#### Step 1.4: Exceptions (1 hour)
|
|
**TDD:** Write exception tests first
|
|
|
|
**Tests FIRST:**
|
|
```csharp
|
|
[Fact]
|
|
public void PermissionDeniedException_WithAgentAndAction_ContainsDetails()
|
|
{
|
|
var ex = new PermissionDeniedException("agent1", "read", "/docs");
|
|
|
|
Assert.Contains("agent1", ex.Message);
|
|
Assert.Contains("read", ex.Message);
|
|
Assert.Equal("agent1", ex.AgentId);
|
|
}
|
|
```
|
|
|
|
**Implementation:**
|
|
```csharp
|
|
public class PermissionDeniedException : McpException
|
|
{
|
|
public string AgentId { get; }
|
|
public string Action { get; }
|
|
public string? Resource { get; }
|
|
|
|
public PermissionDeniedException(string agentId, string action, string? resource = null)
|
|
: base($"Agent '{agentId}' denied permission to '{action}' on resource '{resource ?? "any"}'")
|
|
{
|
|
AgentId = agentId;
|
|
Action = action;
|
|
Resource = resource;
|
|
}
|
|
}
|
|
```
|
|
|
|
**Deliverables:**
|
|
- 4 exception classes
|
|
- 8+ exception tests
|
|
|
|
**Phase 1 Checkpoint:**
|
|
- Total tests: ~35
|
|
- All passing: ✅
|
|
- Zero dependencies: ✅
|
|
- Code coverage: >90% ✅
|
|
|
|
---
|
|
|
|
### Phase 2: Server Implementation (Week 1-2, 8-10 hours)
|
|
|
|
**Goal:** Implement MCP server with permission, rate limiting, and transport
|
|
|
|
#### Step 2.1: Infrastructure Project Setup (30 minutes)
|
|
- Create Infrastructure project
|
|
- Reference Core project
|
|
- Configure test project
|
|
|
|
#### Step 2.2: McpServer Implementation (3 hours)
|
|
**TDD:** Write server tests first
|
|
|
|
**Tests FIRST:**
|
|
```csharp
|
|
[Fact]
|
|
public async Task RegisterTool_WithValidTool_AddsToRegistry()
|
|
{
|
|
var server = new McpServer();
|
|
var tool = new MockSearchTool();
|
|
|
|
await server.RegisterTool(tool);
|
|
var tools = await server.GetTools();
|
|
|
|
Assert.Contains(tools, t => t.Name == tool.Name);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task HandleRequest_WithRegisteredTool_ExecutesTool()
|
|
{
|
|
var server = new McpServer();
|
|
var tool = new Mock<IMcpTool>();
|
|
tool.Setup(t => t.Name).Returns("test_tool");
|
|
tool.Setup(t => t.Execute(It.IsAny<McpRequest>()))
|
|
.ReturnsAsync(new McpResponse { Result = "success" });
|
|
|
|
await server.RegisterTool(tool.Object);
|
|
var request = new McpRequest { Method = "tools/call", Params = new { tool = "test_tool" } };
|
|
|
|
var response = await server.HandleRequest(request);
|
|
|
|
Assert.NotNull(response.Result);
|
|
tool.Verify(t => t.Execute(It.IsAny<McpRequest>()), Times.Once);
|
|
}
|
|
```
|
|
|
|
**Implementation:**
|
|
```csharp
|
|
public class McpServer : IMcpServer
|
|
{
|
|
private readonly IToolRegistry _toolRegistry;
|
|
private readonly IPermissionProvider _permissionProvider;
|
|
private readonly IRateLimiter _rateLimiter;
|
|
|
|
public async Task RegisterTool(IMcpTool tool)
|
|
{
|
|
await _toolRegistry.Add(tool);
|
|
}
|
|
|
|
public async Task<McpResponse> HandleRequest(McpRequest request)
|
|
{
|
|
// Permission check
|
|
// Rate limit check
|
|
// Route to tool
|
|
// Return response
|
|
}
|
|
}
|
|
```
|
|
|
|
**Deliverables:**
|
|
- McpServer implementation
|
|
- ToolRegistry implementation
|
|
- 20+ server tests
|
|
|
|
#### Step 2.3: Permission Provider (2 hours)
|
|
**TDD:** Permission tests first
|
|
|
|
**Tests FIRST:**
|
|
```csharp
|
|
[Fact]
|
|
public async Task HasPermission_WithAllowedAction_ReturnsTrue()
|
|
{
|
|
var config = new PermissionConfig
|
|
{
|
|
Agents = new Dictionary<string, AgentPermissions>
|
|
{
|
|
["agent1"] = new() { Permissions = new[] { "read", "search" } }
|
|
}
|
|
};
|
|
var provider = new PermissionProvider(config);
|
|
|
|
var result = await provider.HasPermission("agent1", "read");
|
|
|
|
Assert.True(result);
|
|
}
|
|
```
|
|
|
|
**Implementation:**
|
|
```csharp
|
|
public class PermissionProvider : IPermissionProvider
|
|
{
|
|
private readonly PermissionConfig _config;
|
|
|
|
public async Task<bool> HasPermission(string agentId, string action, string? resource = null)
|
|
{
|
|
// Check agent permissions
|
|
// Check scopes
|
|
// Return result
|
|
}
|
|
}
|
|
```
|
|
|
|
**Deliverables:**
|
|
- PermissionProvider implementation
|
|
- 15+ permission tests
|
|
|
|
#### Step 2.4: Rate Limiter (2 hours)
|
|
**TDD:** Rate limiter tests first
|
|
|
|
**Tests:**
|
|
- Token bucket algorithm tests
|
|
- Concurrent request tests
|
|
- Limit exceeded scenarios
|
|
|
|
**Deliverables:**
|
|
- TokenBucketRateLimiter implementation
|
|
- 12+ rate limiter tests
|
|
|
|
#### Step 2.5: Stdio Transport (1.5 hours)
|
|
**TDD:** Transport tests first
|
|
|
|
**Tests:**
|
|
- Read from stdin
|
|
- Write to stdout
|
|
- Handle malformed input
|
|
|
|
**Deliverables:**
|
|
- StdioTransport implementation
|
|
- 10+ transport tests
|
|
|
|
**Phase 2 Checkpoint:**
|
|
- Total tests: ~90
|
|
- All passing: ✅
|
|
- Integration test: MCP server end-to-end ✅
|
|
|
|
---
|
|
|
|
### Phase 3: ASP.NET Core Integration (Week 2, 6-8 hours)
|
|
|
|
**Goal:** Enable MCP server in ASP.NET Core applications
|
|
|
|
#### Step 3.1: Service Extensions (2 hours)
|
|
**TDD:** Extension tests first
|
|
|
|
**Tests:**
|
|
```csharp
|
|
[Fact]
|
|
public void AddMcpServer_RegistersServices()
|
|
{
|
|
var services = new ServiceCollection();
|
|
|
|
services.AddMcpServer(options => {
|
|
options.ServerName = "test";
|
|
});
|
|
|
|
var provider = services.BuildServiceProvider();
|
|
Assert.NotNull(provider.GetService<IMcpServer>());
|
|
}
|
|
```
|
|
|
|
**Implementation:**
|
|
```csharp
|
|
public static IServiceCollection AddMcpServer(
|
|
this IServiceCollection services,
|
|
Action<McpOptions> configure)
|
|
{
|
|
services.Configure(configure);
|
|
services.AddSingleton<IMcpServer, McpServer>();
|
|
services.AddSingleton<IPermissionProvider, PermissionProvider>();
|
|
services.AddSingleton<IRateLimiter, TokenBucketRateLimiter>();
|
|
return services;
|
|
}
|
|
```
|
|
|
|
**Deliverables:**
|
|
- ServiceCollectionExtensions
|
|
- 8+ extension tests
|
|
|
|
#### Step 3.2: MCP Middleware (3 hours)
|
|
**TDD:** Middleware tests first
|
|
|
|
**Tests:**
|
|
- HTTP POST handling
|
|
- Permission enforcement
|
|
- Rate limiting
|
|
- Error responses
|
|
|
|
**Deliverables:**
|
|
- McpMiddleware implementation
|
|
- 15+ middleware tests
|
|
|
|
#### Step 3.3: Configuration (1 hour)
|
|
**TDD:** Configuration tests
|
|
|
|
**Deliverables:**
|
|
- McpOptions model
|
|
- Configuration validation tests
|
|
|
|
**Phase 3 Checkpoint:**
|
|
- Total tests: ~120
|
|
- ASP.NET Core integration working ✅
|
|
|
|
---
|
|
|
|
### Phase 4: CLI Runner & Documentation (Week 3, 4-6 hours)
|
|
|
|
**Goal:** Standalone CLI for HTTP transport + complete documentation
|
|
|
|
#### Step 4.1: CLI Program (1 hour)
|
|
**TDD:** CLI behavior tests
|
|
|
|
**Deliverables:**
|
|
- Program.cs with configuration loading
|
|
- HTTP transport runner
|
|
- 5+ CLI tests
|
|
|
|
#### Step 4.2: CODEX Sample (2 hours)
|
|
**TDD:** Sample implementation tests
|
|
|
|
**Deliverables:**
|
|
- CodexMcpServer sample
|
|
- 6 CODEX tools implemented
|
|
- Integration test with CODEX API
|
|
|
|
#### Step 4.3: Documentation (1.5 hours)
|
|
**Not TDD** (documentation doesn't need tests)
|
|
|
|
**Deliverables:**
|
|
- Complete README.md
|
|
- Getting started guide
|
|
- Architecture documentation
|
|
- Tool creation guide
|
|
- Deployment guide
|
|
|
|
**Phase 4 Checkpoint:**
|
|
- Total tests: ~140
|
|
- Sample working with CODEX ✅
|
|
- Documentation complete ✅
|
|
|
|
---
|
|
|
|
## Test-Driven Development Strategy
|
|
|
|
### TDD Principles (CODEX RULE #3)
|
|
|
|
**Mandatory workflow:**
|
|
1. **RED:** Write test that fails
|
|
2. **Verify RED:** Run test, confirm failure
|
|
3. **GREEN:** Write minimal code to pass
|
|
4. **Verify GREEN:** Run test, confirm success
|
|
5. **REFACTOR:** Improve code, keep tests green
|
|
6. **REPEAT:** Next requirement
|
|
|
|
### Test Organization
|
|
|
|
```
|
|
tests/
|
|
├── Svrnty.MCP.Core.Tests/
|
|
│ ├── Abstractions/ # Interface behavior tests
|
|
│ ├── Models/ # Model validation tests
|
|
│ └── Exceptions/ # Exception tests
|
|
├── Svrnty.MCP.Infrastructure.Tests/
|
|
│ ├── Server/ # Server logic tests
|
|
│ ├── Security/ # Permission & rate limit tests
|
|
│ └── Transport/ # Transport tests
|
|
└── Svrnty.MCP.Integration.Tests/
|
|
└── EndToEnd/ # Full MCP server scenarios
|
|
```
|
|
|
|
### Test Coverage Goals
|
|
|
|
- **Core:** >95% (pure logic, easy to test)
|
|
- **Infrastructure:** >90% (some I/O dependencies)
|
|
- **AspNetCore:** >85% (middleware has framework dependencies)
|
|
- **Overall:** >90%
|
|
|
|
### Testing Tools
|
|
|
|
- **xUnit:** Test framework (CODEX-approved)
|
|
- **Moq:** Mocking library (CODEX-approved)
|
|
- **FluentAssertions:** Assertion library (optional, check approval)
|
|
|
|
---
|
|
|
|
## AGENT-PRIMER.md Specifications
|
|
|
|
### Purpose
|
|
|
|
Enable AI agents to automatically configure Svrnty.MCP for any target system by:
|
|
1. Analyzing the system
|
|
2. Generating configuration
|
|
3. Creating sample tools
|
|
4. Setting up environment
|
|
|
|
### Structure
|
|
|
|
```markdown
|
|
# Svrnty.MCP Agent Primer
|
|
|
|
**For AI Agents:** This file guides automated setup of Svrnty.MCP.
|
|
|
|
## Step 1: System Analysis
|
|
|
|
**Commands to run:**
|
|
```bash
|
|
dotnet --version # Check .NET SDK
|
|
ls -la [target-project-path] # Analyze structure
|
|
cat [target-project]/*.csproj # Read dependencies
|
|
cat [target-project]/appsettings.json # Check configuration
|
|
```
|
|
|
|
**Detect:**
|
|
- .NET SDK version (require 8.0+)
|
|
- Project type (Console, ASP.NET Core, Worker)
|
|
- Database (PostgreSQL, SQL Server, None)
|
|
- Authentication (Keycloak, JWT, None)
|
|
- Operating system
|
|
|
|
## Step 2: Generate Configuration
|
|
|
|
**Based on analysis, generate:**
|
|
|
|
### For ASP.NET Core Projects:
|
|
- `appsettings.json` MCP section
|
|
- `Program.cs` AddMcpServer() call
|
|
- Sample controller integration
|
|
|
|
### For Console Projects:
|
|
- `mcp-config.json`
|
|
- `Program.cs` standalone server
|
|
- HTTP transport setup
|
|
|
|
**Templates:** See `templates/` folder
|
|
|
|
## Step 3: Create Sample Tools
|
|
|
|
**Generate based on detected features:**
|
|
|
|
**If database detected:**
|
|
```csharp
|
|
// Tools/QueryDatabaseTool.cs
|
|
public class QueryDatabaseTool : IMcpTool
|
|
{
|
|
public string Name => "query_database";
|
|
// ... implementation
|
|
}
|
|
```
|
|
|
|
**If API detected:**
|
|
```csharp
|
|
// Tools/CallApiTool.cs
|
|
public class CallApiTool : IMcpTool
|
|
{
|
|
public string Name => "call_api";
|
|
// ... implementation
|
|
}
|
|
```
|
|
|
|
**If git repository detected:**
|
|
```csharp
|
|
// Tools/SearchRepositoryTool.cs
|
|
public class SearchRepositoryTool : IMcpTool
|
|
{
|
|
public string Name => "search_repo";
|
|
// ... implementation
|
|
}
|
|
```
|
|
|
|
## Step 4: Setup Development Environment
|
|
|
|
**Generate:**
|
|
- `.editorconfig` (if not exists)
|
|
- `launchSettings.json` (for debugging)
|
|
- `README.md` (project-specific)
|
|
- `run-mcp-server.sh` (startup script)
|
|
|
|
## Step 5: Validation
|
|
|
|
**Run automated tests:**
|
|
```bash
|
|
dotnet build # Compile
|
|
dotnet test # Run tests
|
|
./run-mcp-server.sh --test # Test connectivity
|
|
```
|
|
|
|
## Example: CODEX Integration
|
|
|
|
**Detected:**
|
|
- ASP.NET Core 8 project
|
|
- PostgreSQL database
|
|
- REST API at http://localhost:5050
|
|
- Semantic search capability
|
|
|
|
**Generated:**
|
|
- CodexMcpServer.cs
|
|
- 6 tools: search_codex, get_document, list_documents, search_by_tag, get_document_sections, list_tags
|
|
- codex-mcp-config.json with permission model
|
|
- Integration tests
|
|
|
|
**Output:** `samples/CodexMcpServer/` ready to run
|
|
```
|
|
|
|
### Implementation
|
|
|
|
The AGENT-PRIMER.md will include:
|
|
- Detailed system analysis commands
|
|
- Decision trees for configuration generation
|
|
- Complete templates for all scenarios
|
|
- Validation procedures
|
|
- Example outputs for common cases
|
|
|
|
---
|
|
|
|
## CODEX Integration
|
|
|
|
### Integration Approach
|
|
|
|
**Option 1: NuGet Package (Production)**
|
|
```bash
|
|
dotnet add package Svrnty.MCP.AspNetCore
|
|
```
|
|
|
|
**Option 2: Project Reference (Development)**
|
|
```bash
|
|
dotnet add reference ../Svrnty.MCP/src/Svrnty.MCP.AspNetCore/Svrnty.MCP.AspNetCore.csproj
|
|
```
|
|
|
|
### CODEX MCP Server Structure
|
|
|
|
```
|
|
src/Codex.Mcp/
|
|
├── Program.cs
|
|
├── CodexMcpServer.cs
|
|
├── Tools/
|
|
│ ├── SearchCodexTool.cs
|
|
│ ├── GetDocumentTool.cs
|
|
│ ├── ListDocumentsTool.cs
|
|
│ ├── SearchByTagTool.cs
|
|
│ ├── GetDocumentSectionsTool.cs
|
|
│ └── ListTagsTool.cs
|
|
├── Permissions/
|
|
│ └── CodexPermissionProvider.cs
|
|
└── codex-mcp-config.json
|
|
```
|
|
|
|
### Sample Tool Implementation
|
|
|
|
```csharp
|
|
using Svrnty.MCP.Core.Abstractions;
|
|
|
|
public class SearchCodexTool : IMcpTool
|
|
{
|
|
private readonly HttpClient _httpClient;
|
|
|
|
public string Name => "search_codex";
|
|
public string Description => "Search CODEX knowledge base";
|
|
|
|
public async Task<McpResponse> Execute(McpRequest request)
|
|
{
|
|
var query = request.Params["query"];
|
|
var limit = request.Params["limit"] ?? 10;
|
|
|
|
var response = await _httpClient.PostAsJsonAsync(
|
|
"http://localhost:5050/api/search/hybrid",
|
|
new { query, limit }
|
|
);
|
|
|
|
var result = await response.Content.ReadFromJsonAsync<SearchResult>();
|
|
return new McpResponse { Result = result };
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Technology Stack
|
|
|
|
### Core Dependencies (CODEX-Approved)
|
|
|
|
- .NET 8.0 SDK
|
|
- C# 11
|
|
- System.Text.Json (built-in)
|
|
- xUnit (testing)
|
|
- Moq (mocking)
|
|
|
|
### New Dependencies (Require Approval via ADR)
|
|
|
|
- **MCP SDK** (if available for .NET)
|
|
- Alternative: Implement MCP protocol directly
|
|
- License: Verify open source
|
|
- Tier: Core (essential for protocol)
|
|
|
|
- **FluentAssertions** (optional, testing)
|
|
- License: Apache 2.0
|
|
- Purpose: Better test assertions
|
|
- Tier: Development only
|
|
|
|
### CODEX RULE #1 Compliance
|
|
|
|
All new dependencies must be:
|
|
1. Documented in ADR
|
|
2. Added to CODEX tech stack
|
|
3. Approved before use
|
|
4. CODEX-approved alternatives used if available
|
|
|
|
---
|
|
|
|
## Success Criteria
|
|
|
|
### Module-Level Criteria
|
|
|
|
**Functionality:**
|
|
- [x] MCP server starts and accepts connections
|
|
- [x] Tools can be registered dynamically
|
|
- [x] Permission model enforces access control
|
|
- [x] Rate limiting prevents abuse
|
|
- [x] Audit logging tracks all operations
|
|
- [x] HTTP transport works
|
|
- [x] HTTP transport works (ASP.NET Core)
|
|
|
|
**Quality:**
|
|
- [x] >90% test coverage
|
|
- [x] All tests passing
|
|
- [x] Zero compiler warnings
|
|
- [x] TDD followed for all code
|
|
- [x] Clean Architecture respected
|
|
|
|
**Usability:**
|
|
- [x] Complete README with examples
|
|
- [x] API documentation generated
|
|
- [x] Sample implementations working
|
|
- [x] AGENT-PRIMER.md tested
|
|
- [x] Easy to copy to new projects
|
|
|
|
**Performance:**
|
|
- [x] <10ms overhead per request
|
|
- [x] Handles 1000+ req/sec
|
|
- [x] Rate limiting accurate
|
|
|
|
### CODEX Integration Criteria
|
|
|
|
**CODEX MCP Server:**
|
|
- [x] All 6 tools implemented
|
|
- [x] Integration tests passing
|
|
- [x] Permission model configured
|
|
- [x] Can be called from Claude Code
|
|
- [x] Can be called from Cursor
|
|
- [x] Returns valid MCP responses
|
|
|
|
**Documentation:**
|
|
- [x] Updated future-mcp-integration-plan.md
|
|
- [x] Completion notes in registry.json
|
|
- [x] CODEX_INDEX.md references Svrnty.MCP
|
|
|
|
---
|
|
|
|
## Timeline & Milestones
|
|
|
|
### Week 1
|
|
- Day 1-2: Phase 1 (Core abstractions)
|
|
- Day 3-5: Phase 2 (Server implementation start)
|
|
|
|
### Week 2
|
|
- Day 1-3: Phase 2 (Server implementation complete)
|
|
- Day 4-5: Phase 3 (ASP.NET Core integration)
|
|
|
|
### Week 3
|
|
- Day 1-2: Phase 4 (CLI + CODEX sample)
|
|
- Day 3-4: Documentation
|
|
- Day 5: Testing & validation
|
|
|
|
### Week 4 (Buffer)
|
|
- Refinement
|
|
- Additional samples
|
|
- NuGet packaging
|
|
- Final testing
|
|
|
|
---
|
|
|
|
## Next Steps
|
|
|
|
1. **Get approval for this plan**
|
|
2. **Create folder structure:** `/home/svrnty/codex/Svrnty.MCP/`
|
|
3. **Write AGENT-PRIMER.md**
|
|
4. **Begin Phase 1:** Core abstractions with TDD
|
|
5. **Track progress:** Use TodoWrite for each phase
|
|
|
|
---
|
|
|
|
**Status:** Planned (Awaiting Approval)
|
|
**Created:** 2025-10-19
|
|
**Version:** 1.0.0
|
|
**Related:** scratch/future-mcp-integration-plan.md (Appendix B)
|