Design-Pattern-MCP
by sirius-zuo
README.md
<p align="center">
<img src="assets/Design-Pattern-MCP-Banner.jpg" alt="Design-Pattern-MCP" width="1280">
</p>
# Design-Pattern-MCP
An MCP (Model Context Protocol) server that provides design pattern structural constraints and anti-patterns to AI coding agents. Agents call this server during code generation to ensure they implement patterns correctly.
> **This server is not for human use.** It is called by AI coding agents (Claude Code, Cursor, Copilot, etc.).
## Tools
### `suggest_pattern`
Map a problem description to pattern name(s).
**Input:** `{ description: string, category?: "creational"|"structural"|"behavioral"|"modern"|"architectural" }`
**Output:** Up to 3 `PatternSuggestion[]` — `{ name, category, rationale, confidence }`
**Token cost:** ~50–100 tokens
### `get_template`
Get structural constraints and anti-patterns for a specific pattern in a specific language.
**Input:** `{ pattern: string, language: "go"|"java"|"python"|"rust"|"typescript"|"generic" }`
**Output:** Compact plain text with COMPONENTS, CONSTRAINTS, ANTI-PATTERNS, language-specific notes, example structure
**Token cost:** ~300–500 tokens
## Installation
```bash
git clone git@github.com:sirius-zuo/design-pattern-mcp.git
cd design-pattern-mcp
npm install
npm run build
```
## Register with Claude Code
Add to `~/.claude/settings.json`:
```json
{
"mcpServers": {
"design-pattern-templates": {
"command": "node",
"args": ["/absolute/path/to/design-pattern-mcp/dist/index.js"]
}
}
}
```
## Register with Cursor
Add to `.cursor/mcp.json` (project) or `~/.cursor/mcp.json` (global):
```json
{
"mcpServers": {
"design-pattern-templates": {
"command": "node",
"args": ["/absolute/path/to/design-pattern-mcp/dist/index.js"]
}
}
}
```
## Register with Windsurf
Add to `~/.codeium/windsurf/mcp_config.json`:
```json
{
"mcpServers": {
"design-pattern-templates": {
"command": "node",
"args": ["/absolute/path/to/design-pattern-mcp/dist/index.js"]
}
}
}
```
## Register with GitHub Copilot (VS Code)
Add to `.vscode/mcp.json` (project) or user settings:
```json
{
"servers": {
"design-pattern-templates": {
"type": "stdio",
"command": "node",
"args": ["/absolute/path/to/design-pattern-mcp/dist/index.js"]
}
}
}
```
## Usage in Claude Desktop
Once registered, you can ask Claude to use the tools directly in conversation. The typical workflow is: **suggest a pattern first**, then **fetch the full template** for the one you want to implement.
---
### Example 1 — Find the right pattern
**You ask Claude:**
> I need to support multiple payment methods like credit card, PayPal, and crypto that can be swapped at runtime. What pattern should I use?
**Claude calls `suggest_pattern` and returns:**
```
[
{
"name": "Strategy",
"category": "behavioral",
"rationale": "multiple interchangeable algorithms",
"confidence": 0.67
},
{
"name": "Decorator",
"category": "structural",
"rationale": "add responsibilities dynamically without subclassing",
"confidence": 0.50
},
{
"name": "Saga",
"category": "modern",
"rationale": "long-running distributed transaction",
"confidence": 0.33
}
]
```
Strategy is the strongest match. You then ask for the full template.
---
### Example 2 — Get the full template for your language
**You ask Claude:**
> Give me the Strategy pattern template for TypeScript.
**Claude calls `get_template` with `{ pattern: "strategy", language: "typescript" }` and returns:**
```
Pattern: Strategy
Language: typescript
COMPONENTS:
- **Context**: Holds a reference to a Strategy. Delegates algorithm execution to it. Contains NO algorithm logic itself.
CONSTRAINTS:
- Context must NOT contain algorithm logic; all logic lives in ConcreteStrategy.
ANTI-PATTERNS:
- Embedding the if/else or switch selection logic inside Context (defeats the purpose).
TYPESCRIPT-SPECIFIC NOTES:
- Define single-method stateless strategies as function types: `type SortStrategy = (data: number[]) => number[]` — no interface or class needed.
- Multi-method or stateful strategies: use an `interface` with structural typing — no `implements` declaration required.
- Inject via constructor (`constructor(private strategy: SortStrategy)`) for immutability; use a setter only when runtime switching is required.
- `Context` holds a field typed to the function type or interface; calling it is `this.strategy(params)` or `this.strategy.execute(params)`.
EXAMPLE STRUCTURE:
```typescript
type Sorter = (data: number[]) => number[];
class SortContext {
constructor(private strategy: Sorter) {}
setStrategy(s: Sorter): void { this.strategy = s; }
run(data: number[]): number[] { return this.strategy(data); }
}
// Usage — any function with the right signature is a valid strategy
const ctx = new SortContext(data => [...data].sort((a, b) => a - b));
ctx.run([3, 1, 2]); // [1, 2, 3]
// Interface-based for stateful strategies
interface PricingStrategy { calculate(basePrice: number): number; }
class DiscountStrategy implements PricingStrategy {
constructor(private pct: number) {}
calculate(base: number): number { return base * (1 - this.pct); }
}
```
**Claude then uses this output as grounding constraints when writing your actual payment service code — ensuring the context doesn't embed algorithm logic, strategies are injected via constructor, and the TypeScript-idiomatic function-type approach is used.**
## Pattern Coverage
38 patterns across 5 categories:
- **Creational** (5): Abstract Factory, Builder, Factory Method, Prototype, Singleton
- **Structural** (7): Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy
- **Behavioral** (11): Chain of Responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template Method, Visitor
- **Modern** (8): Circuit Breaker, CQRS, Dependency Injection, Event Sourcing, Pub/Sub, Repository, Retry with Backoff, Saga
- **Architectural** (7): Clean Architecture, Event-Driven Architecture, Hexagonal Architecture, Layered Architecture, Microservices, MVC/MVP/MVVM, Pipe and Filter
## Development
```bash
npm test # run tests
npm run build # compile TypeScript to dist/
npm start # run the MCP server
```
TDQS
A4.2/5.0
Scored across 2 tools
Disambiguation5/5
The two tools have completely distinct purposes: one maps a problem to pattern names, the other retrieves implementation details for a known pattern. No overlap or ambiguity exists.
Naming Consistency5/5
Both tool names follow the verb_noun convention (suggest_pattern, get_template), creating a predictable pattern.
Tool Count3/5
With only 2 tools, the server feels minimal. However, the narrow scope (pattern suggestion and template retrieval) justifies the small count, though it borders on too few.
Completeness4/5
The core workflow is covered: identify a pattern, then retrieve its template. Missing a list_patterns or comparison tool, but these are not essential for the primary purpose.
Maintenance
ActivityInactive
ResponsivenessNo issues