- Added the following ADRs to `docs/adrs/` directory: - ADR-001: MCP Integration Architecture - ADR-002: Real-time Communication Architecture - ADR-003: Background Task Architecture - ADR-004: LLM Provider Abstraction - ADR-005: Technology Stack Selection - Each ADR details the context, decision drivers, considered options, final decisions, and implementation plans. - Documentation aligns technical choices with architecture principles and system requirements for Syndarix.
3.7 KiB
ADR-001: MCP Integration Architecture
Status: Accepted Date: 2025-12-29 Deciders: Architecture Team Related Spikes: SPIKE-001
Context
Syndarix requires integration with multiple external services (LLM providers, Git, issue trackers, file systems, CI/CD). The Model Context Protocol (MCP) was identified as the standard for tool integration in AI applications. We need to decide on:
- The MCP framework to use
- Server deployment pattern (singleton vs per-project)
- Scoping mechanism for multi-project/multi-agent access
Decision Drivers
- Simplicity: Minimize operational complexity
- Resource Efficiency: Avoid spawning redundant processes
- Consistency: Unified interface across all integrations
- Scalability: Support 10+ concurrent projects
- Maintainability: Easy to add new MCP servers
Considered Options
Option 1: Per-Project MCP Servers
Spawn dedicated MCP server instances for each project.
Pros:
- Complete isolation between projects
- Simple access control (project owns server)
Cons:
- Resource heavy (7 servers × N projects)
- Complex orchestration
- Difficult to share cross-project resources
Option 2: Unified Singleton MCP Servers (Selected)
Single instance of each MCP server type, with explicit project/agent scoping.
Pros:
- Resource efficient (7 total servers)
- Simpler deployment
- Enables cross-project learning (if desired)
- Consistent management
Cons:
- Requires explicit scoping in all tools
- Shared state requires careful design
Option 3: Hybrid (MCP Proxy)
Single proxy that routes to per-project backends.
Pros:
- Balance of isolation and efficiency
Cons:
- Added complexity
- Routing overhead
Decision
Adopt Option 2: Unified Singleton MCP Servers with explicit scoping.
All MCP servers are deployed as singletons. Every tool accepts project_id and agent_id parameters for:
- Access control validation
- Audit logging
- Context filtering
Implementation
MCP Server Registry
| Server | Port | Purpose |
|---|---|---|
| LLM Gateway | 9001 | Route LLM requests with failover |
| Git MCP | 9002 | Git operations across providers |
| Knowledge Base MCP | 9003 | RAG and document search |
| Issues MCP | 9004 | Issue tracking operations |
| File System MCP | 9005 | Workspace file operations |
| Code Analysis MCP | 9006 | Static analysis, linting |
| CI/CD MCP | 9007 | Pipeline operations |
Framework Selection
Use FastMCP 2.0 for all MCP server implementations:
- Decorator-based tool registration
- Built-in async support
- Compatible with SSE transport
- Type-safe with Pydantic
Tool Signature Pattern
@mcp.tool()
def tool_name(
project_id: str, # Required: project scope
agent_id: str, # Required: calling agent
# ... tool-specific params
) -> Result:
validate_access(agent_id, project_id)
log_tool_usage(agent_id, project_id, "tool_name")
# ... implementation
Consequences
Positive
- Single deployment per MCP type simplifies operations
- Consistent interface across all tools
- Easy to add monitoring/logging centrally
- Cross-project analytics possible
Negative
- All tools must include scoping parameters
- Shared state requires careful design
- Single point of failure per MCP type (mitigated by multiple instances)
Neutral
- Requires MCP client manager in FastAPI backend
- Authentication handled internally (service tokens for v1)
Compliance
This decision aligns with:
- FR-802: MCP-first architecture requirement
- NFR-201: Horizontal scalability requirement
- NFR-602: Centralized logging requirement
This ADR supersedes any previous decisions regarding MCP architecture.