Migrated from design-system-swarm with fresh git history.
Old project history preserved in /home/overbits/apps/design-system-swarm
Core components:
- MCP Server (Python FastAPI with mcp 1.23.1)
- Claude Plugin (agents, commands, skills, strategies, hooks, core)
- DSS Backend (dss-mvp1 - token translation, Figma sync)
- Admin UI (Node.js/React)
- Server (Node.js/Express)
- Storybook integration (dss-mvp1/.storybook)
Self-contained configuration:
- All paths relative or use DSS_BASE_PATH=/home/overbits/dss
- PYTHONPATH configured for dss-mvp1 and dss-claude-plugin
- .env file with all configuration
- Claude plugin uses ${CLAUDE_PLUGIN_ROOT} for portability
Migration completed: $(date)
🤖 Clean migration with full functionality preserved
7.8 KiB
7.8 KiB
DSS MCP-First Architecture
Why MCP? Why Not REST?
You were absolutely right to question REST endpoints. Here's why MCP-first is the right approach for DSS:
The Problem with REST (Traditional Approach)
JavaScript Chat UI
↓
REST API (/api/projects, /api/manifest, etc.)
↓
Python Backend
↓
Database/Filesystem
↓
Response → Chat UI
Issues:
- ❌ Duplicate business logic (REST endpoint + MCP tool)
- ❌ Latency: JS → HTTP → Python → DB → HTTP → JS
- ❌ Two implementations of same feature
- ❌ Hard to test end-to-end
- ❌ Claude can't directly call your tools
- ❌ Requires building REST wrapper around everything
The MCP-First Solution
JavaScript Chat UI
↓
Claude (with MCP tools available)
↓
Call MCP Tool (tool_use)
↓
Python MCP Server
↓
Database/Filesystem
↓
Response → Claude → Chat UI
Benefits:
- ✅ Single source of truth (MCP tool)
- ✅ Claude makes intelligent decisions
- ✅ Native tool_use integration
- ✅ No REST endpoints to maintain
- ✅ Better context awareness
- ✅ Simpler architecture
The Workflow
Old Way (REST-based)
// UI code
const response = await fetch('/api/projects', {
method: 'POST',
body: JSON.stringify({name, root_path, description})
});
const project = await response.json();
New Way (MCP-first)
// Chat interprets: "create project test in ./src"
// JavaScript just parses and sends to Claude:
{
action: 'call_mcp_tool',
tool: 'dss_create_project',
args: {name, root_path, description}
}
// Claude receives the tool result and responds naturally
Component Roles
JavaScript (Frontend)
- Parse natural language input
- Extract structured parameters using AI
- Display MCP tool results
- Manage chat conversation
- Does NOT make API calls
Claude (AI Agent)
- Understands user intent
- Calls appropriate MCP tools
- Chains tools together (e.g., create project → setup Figma → discover files)
- Returns human-readable results
- Orchestrates the workflow
MCP Server (Backend)
- Implements all business logic as tools
- Reads/writes to database and filesystem
- Manages project manifests
- Handles Figma API integration
- Encrypts credentials
- Audit logging
- Single implementation
Architecture Comparison
| Aspect | REST Approach | MCP-First Approach |
|---|---|---|
| API Endpoints | Many (/projects, /manifest, /figma, etc.) | None (just MCP tools) |
| Where logic lives | Scattered (REST + MCP) | Centralized (MCP tools only) |
| Data flow | JS → HTTP → Python → DB → HTTP → JS | JS → Claude → MCP Server → DB |
| Claude integration | Hooks into REST responses | Direct tool_use |
| Debugging | Need to trace both REST and MCP | Trace MCP tool directly |
| Tool reusability | Limited | All MCP tools available to Claude |
| Latency | 2 HTTP roundtrips | 1 MCP tool call |
| Testing | Unit test REST, unit test MCP | Integration test MCP tools |
Implementation Phases
Phase 1: Implement MCP Tools
- Add 6 new MCP tools to
tools/dss_mcp/tools/project_tools.py - Implement manifest management
- Encrypt Figma credentials in database
- Register tools in handler
Phase 2: Update JavaScript
- Remove REST calls
- Keep command parsing
- Return MCP tool specifications
- Let Claude execute tools
Phase 3: End-to-End Testing
- Test full workflow: user input → Claude → MCP tool → result
- Verify credential encryption
- Test manifest creation/updates
- Test Figma API integration
Example Workflow: Create Project with Figma
User says:
"Create a design system project called web-ui in ./packages/design with my Figma workspace"
JavaScript processes:
// Parse natural language
const command = '/init'
const params = {
name: 'web-ui',
root_path: './packages/design'
}
Claude orchestrates:
1. Ask for Figma API token if not already configured
2. Call dss_setup_figma_credentials (if needed)
3. Call dss_create_project
4. Call dss_discover_figma_files
5. Return summary to user
Each tool runs:
# Tool 1: dss_create_project
- Create project in database
- Create figma.json manifest
- Return project_id
# Tool 2: dss_setup_figma_credentials (cached if already set)
- Encrypt and store token
- Validate with Figma API
# Tool 3: dss_discover_figma_files
- Read credentials from database
- Query Figma API for user's files
- Return suggestions
Result:
✅ Project created: web-ui
✅ Figma credentials stored
✅ Found 5 Figma files:
- Design Tokens
- Components
- Icons
- Patterns
- Documentation
Next steps:
- /add-figma <file_key> to link specific files
- /sync to extract tokens
- /analyze to scan for components
Database Schema Integration
Existing Tables Used:
projects- Project metadataproject_integrations- User-scoped encrypted credentialsintegration_health- API health monitoringmcp_tool_usage- Audit log
No New Tables Needed!
The existing schema already supports:
- Project creation
- User-scoped credentials
- Integration health tracking
- Tool usage auditing
Manifest Location:
- File-based:
{project_root}/figma.json - Version controlled: Can be checked into git
- Fast access: Direct filesystem read/write
- Auditable: Last modified timestamp
Security
Credential Storage
User Input: "figd_pAT_xxxxxxxxxxxx"
↓
Encrypted with Fernet: cipher.encrypt(config.encode())
↓
Stored in project_integrations.config
↓
Retrieved and decrypted when needed
↓
Never exposed to frontend
User Isolation
- Credentials scoped to user_id
- Each project can have user's own integration configs
- No global shared credentials
- Audit trail of all tool usage
Circuit Breaker
- Protects against cascading Figma API failures
- Fails gracefully with clear error messages
- Tracks integration health
- Automatic recovery
Why This is Better
-
Single Source of Truth
- MCP tools define everything
- No REST endpoints to maintain
- No duplication
-
Better User Experience
- Claude understands context
- Can chain operations (create → setup → discover)
- Returns natural language feedback
- Anticipates next steps
-
Easier to Debug
- Trace single execution path
- Clear tool input/output
- Audit log of all operations
- No HTTP layer to troubleshoot
-
Scales Better
- Add new tools without REST endpoints
- Claude can discover and use new tools
- No coordination between layers
- Clear separation of concerns
-
More Secure
- Credentials never exposed to frontend
- Encrypted storage in database
- User-scoped access control
- Complete audit trail
Next Steps
-
Backend Implementation
- Implement 6 MCP tools (see MCP_TOOLS_SPEC.md)
- Add encryption to project_integrations
- Register tools in handler
- Test with MCP client
-
Frontend Updates
- Keep command parsing in JavaScript
- Return MCP tool specifications
- Let Claude handle execution
- Display results naturally
-
Testing
- Test each MCP tool individually
- Test end-to-end workflow
- Verify encryption/decryption
- Load test Figma API calls
-
Documentation
- Update user guides
- Document command flow
- Add troubleshooting guide
- Create architecture diagram
Result
A true MCP-first, AI-native design system platform where:
- Claude orchestrates all operations
- Tools are the single source of truth
- No REST API complexity
- Clean, maintainable architecture
- Better user experience
- Maximum security
This is how modern AI applications should be built! 🚀