Jinja2 MCP Server
by WW-AI-Lab
README.md
# Jinja2 MCP Server
> **ð ç产就绪çMCPåè®®Jinja2æš¡æ¿æž²ææå¡åš**
> 䞺AIåºçšæäŸåŒºå€§çæš¡æ¿å€çèœåïŒæ¯æå€æJSONåæ°åå®å
šæ²ç®±æ§è¡
[](https://python.org)
[](https://modelcontextprotocol.io)
[](LICENSE)
[](https://github.com/WW-AI-Lab/jinja2-mcp-server)
---
## ð¯ æ žå¿ç¹æ§
### ð§ MCPåè®®å®æŽæ¯æ
- **åäŒ èŸåè®®**: åæ¶æ¯æstdioåStreamableHttpäŒ èŸ
- **æ åå
Œå®¹**: å®å
šå
Œå®¹MCP宿¹åè®®è§è
- **AIéæ**: äžClaudeãGPTçAIæš¡åæ çŒéæ
- **è°è¯å奜**: æ¯æMCP Inspectorå¯è§åè°è¯
### ð¡ïž å®å
šäžæ§èœ
- **å®å
šæ²ç®±**: å€å±å®å
šéªè¯ïŒé²æ¢æ¶ææš¡æ¿æ§è¡
- **åŒæ¥å€ç**: åºäºFastMCPç髿§èœåŒæ¥æ¶æ
- **æºèœçŒå**: æš¡æ¿è§£æçŒåïŒæåæž²ææ§èœ
- **èµæºéå¶**: æ§è¡è¶
æ¶ã埪ç¯éå¶çå®å
šæºå¶
### ðš åèœå®æŽæ§
- **Jinja2 3.1+**: æ¯æææ°çæ¬çææç¹æ§
- **å€ææ°æ®**: 宿ŽçJSONæ°æ®ç»ææ¯æ
- **æä»¶æš¡æ¿**: æ¯ææš¡æ¿æä»¶ç³»ç»åç»§æ¿
- **è°è¯å·¥å
·**: æš¡æ¿éªè¯ãè¯æ³æ£æ¥ãæ§èœåæ
---
## ð å¿«éåŒå§
### ð ç¯å¢èŠæ±
- **Python**: 3.8+ (æšè3.12+)
- **ç³»ç»**: macOS / Linux / Windows
- **å
å**: æäœ512MBïŒæšè1GB+
### â¡ äžé®å®è£
```bash
# å
é项ç®
git clone https://github.com/WW-AI-Lab/jinja2-mcp-server.git
cd jinja2-mcp-server
# å®è£
äŸèµ
pip install -r requirements.txt
# ç«å³å¯åš (stdioæš¡åŒïŒéåAI客æ·ç«¯)
python run_server.py --transport stdio
# æå¯åšHTTPæš¡åŒ (éåè°è¯åæµè¯)
python run_server.py --transport streamable-http --port 8123
```
### ð® å¿«éäœéª
```bash
# 䜿çšMCP Inspectorè¿è¡å¯è§åæµè¯
# 1. å¯åšHTTPæå¡åš
python run_server.py --transport streamable-http --port 8123
# 2. æåŒMCP Inspector: https://github.com/modelcontextprotocol/inspector
# 3. è¿æ¥å°: http://localhost:8123
# 4. æµè¯render_templateå·¥å
·
```
---
## ð ïž æ žå¿å·¥å
·
### 1ïžâ£ render_template - æš¡æ¿æž²æ
```json
{
"template": "Hello {{ user.name }}! You have {{ messages | length }} messages.",
"variables": {
"user": {"name": "Alice"},
"messages": [{"id": 1}, {"id": 2}]
}
}
```
**èŸåº**: `"Hello Alice! You have 2 messages."`
### 2ïžâ£ render_template_file - æä»¶æš¡æ¿
```json
{
"template_path": "examples/templates/email.html",
"variables": {
"user": {"name": "Bob", "email": "bob@example.com"},
"items": [{"name": "Product A", "price": 29.99}]
}
}
```
### 3ïžâ£ validate_template - æš¡æ¿éªè¯
```json
{
"template": "{% for item in items %}{{ item.name }}{% endfor %}"
}
```
**èŸåº**: `{"valid": true, "variables_used": ["items"], "complexity": "low"}`
### 4ïžâ£ list_filters - è¿æ»€åšå衚
è·åææå¯çšçJinja2è¿æ»€åšïŒ54䞪å
çœ®è¿æ»€åšïŒ
### 5ïžâ£ get_template_info - æš¡æ¿åæ
è·åæš¡æ¿ç诊ç»ä¿¡æ¯åæ§èœåæ
---
## ð é¡¹ç®æ¶æ
```
jinja2-mcp-server/
âââ ðïž src/jinja_mcp_server/ # æ žå¿ä»£ç
â âââ mcp_server.py # FastMCPæå¡åšå®ç°
â âââ server.py # å¯åšå
¥å£
â âââ jinja/environment.py # Jinja2ç¯å¢ç®¡ç
â âââ config/settings.py # é
眮系ç»
â âââ tools/registry.py # MCPå·¥å
·æ³šå
â âââ utils/ # å·¥å
ጼ
âââ ð examples/templates/ # ç€ºäŸæš¡æ¿
â âââ basic.html # åºç¡HTMLæš¡æ¿
â âââ email.html # é®ä»¶æš¡æ¿
â âââ config.yaml # é
眮暡æ¿
âââ 𧪠tests/ # æµè¯çšäŸ
âââ ð docs/ # é¡¹ç®ææ¡£
âââ ð run_server.py # å¯åšèæ¬
```
---
## ðš 䜿çšåºæ¯
### ð€ AIåºçšéæ
```python
# äžClaude/GPTéæ
# AIæš¡åå¯ä»¥éè¿MCPåè®®è°çšæš¡æ¿æž²æåèœ
# æ¯æåšæçæé®ä»¶ãæ¥åãé
眮æä»¶ç
```
### ð§ é®ä»¶æš¡æ¿ç³»ç»
```html
<!-- examples/templates/email.html -->
<html>
<body>
<h1>Hello {{ user.name }}!</h1>
<p>Your order summary:</p>
<ul>
{% for item in items %}
<li>{{ item.name }} - ${{ item.price }}</li>
{% endfor %}
</ul>
</body>
</html>
```
### âïž é
眮æä»¶çæ
```yaml
# examples/templates/config.yaml
server:
name: {{ server.name }}
port: {{ server.port }}
environment: {{ env }}
features:
{% for feature in features %}
- {{ feature }}
{% endfor %}
```
### ð æ¥åçæ
```html
<!-- åšææ¥åæš¡æ¿ -->
<div class="report">
<h2>{{ report.title }}</h2>
<p>Generated on: {{ now() | strftime('%Y-%m-%d') }}</p>
{% if metrics %}
<table>
{% for metric in metrics %}
<tr>
<td>{{ metric.name }}</td>
<td>{{ metric.value | round(2) }}</td>
</tr>
{% endfor %}
</table>
{% endif %}
</div>
```
---
## âïž é«çº§é
眮
### ç¯å¢åéé
眮
```bash
# å€å¶é
眮æä»¶
cp env.example .env
# çŒèŸé
眮
JINJA_AUTOESCAPE=true
JINJA_CACHE_SIZE=400
SECURITY_MAX_LOOP_ITERATIONS=10000
LOGGING_LEVEL=INFO
```
### JSONé
眮æä»¶
```json
{
"jinja": {
"template_dirs": ["templates", "examples/templates"],
"autoescape": true,
"cache_size": 400,
"strict_undefined": false
},
"security": {
"enable_sandbox": true,
"max_template_size": 1048576,
"execution_timeout": 30,
"max_loop_iterations": 10000
},
"logging": {
"level": "INFO",
"enable_structlog": true,
"format": "json"
},
"mcp": {
"server_name": "jinja2-mcp-server",
"version": "1.0.0"
}
}
```
---
## 𧪠åŒåäžæµè¯
### åŒåç¯å¢æå»º
```bash
# å
éå¹¶è¿å
¥é¡¹ç®
git clone https://github.com/WW-AI-Lab/jinja2-mcp-server.git
cd jinja2-mcp-server
# å建èæç¯å¢
python -m venv .venv
source .venv/bin/activate # Linux/macOS
# .venv\Scripts\activate # Windows
# å®è£
åŒåäŸèµ
pip install -r requirements.txt
# è¿è¡æµè¯
python -m pytest tests/ -v
# ä»£ç æ ŒåŒå
black src/ tests/
isort src/ tests/
# ç±»åæ£æ¥
mypy src/
```
### æ§èœæµè¯
```bash
# åºç¡åèœæµè¯
python test_server.py
# MCPåè®®æµè¯
python test_mcp_tools.py
# æš¡æ¿æä»¶æµè¯
python test_template_files.py
# HTTPåè®®æµè¯
python test_mcp_http.py
```
---
## ð æ§èœææ
### ð åºåæ§èœ
- **å¯åšæ¶éŽ**: < 2ç§
- **å
åå çš**: åå§ ~50MBïŒè¿è¡æ¶ < 256MB
- **ååºå»¶è¿**: å¹³å < 10ms
- **å¹¶åå€ç**: > 200 requests/second
- **æš¡æ¿æž²æ**: ç®åæš¡æ¿ < 1msïŒå€ææš¡æ¿ < 50ms
### ð æ©å±æ§
- **æš¡æ¿çŒå**: æ¯æ400䞪暡æ¿çŒå
- **æä»¶å€§å°**: åæš¡æ¿æå€§1MB
- **å¹¶åè¿æ¥**: ç论æ éå¶ïŒåç³»ç»èµæºéå¶ïŒ
- **äŒ èŸåè®®**: stdio + StreamableHttpååè®®æ¯æ
---
## ð§ ææ¯å®ç°
### æ žå¿ææ¯æ
```python
# åºäºç°ä»£Pythonçæ
FastMCP # MCPåè®®æ¡æ¶
Jinja2 3.1+ # æš¡æ¿åŒæ
Pydantic v2 # æ°æ®éªè¯
structlog # ç»æåæ¥å¿
asyncio # åŒæ¥å€ç
MarkupSafe # å®å
šèœ¬ä¹
```
### æ¶æè®Ÿè®¡
```
âââââââââââââââââââââââââââââââââââââââââââ
â MCP Clients â
â âââââââââââââââ âââââââââââââââ â
â â AI Models â â MCP Inspectorâ â
â âââââââââââââââ âââââââââââââââ â
âââââââââââ¬ââââââââââââââââââ¬ââââââââââââââ
â MCP Protocol â
â â
âââââââââââŒââââââââââââââââââŒââââââââââââââ
â jinja2-mcp-server â
â âââââââââââââââââââââââââââââââââââ â
â â FastMCP Core â â
â âââââââââââââââââââââââââââââââââââ â
â âââââââââââââââââââââââââââââââââââ â
â â MCP Tools (5䞪) â â
â âââââââââââââââââââââââââââââââââââ â
â âââââââââââââââââââââââââââââââââââ â
â â Jinja2 Service Layer â â
â âââââââââââââââââââââââââââââââââââ â
â âââââââââââââââââââââââââââââââââââ â
â â Infrastructure â â
â âââââââââââââââââââââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââ
```
### å®å
šæºå¶
```python
# å€å±å®å
šé²æ€
1. ASTè¯æ³è§£æéªè¯
2. æ²ç®±ç¯å¢æ§è¡
3. èµæºäœ¿çšéå¶
4. æ§è¡è¶
æ¶æ§å¶
5. åŸªç¯æ¬¡æ°éå¶
6. å±é©åœæ°è¿æ»€
```
---
## ð ïž æ©å±æ¹å
### å·²å®ç°åèœ â
- [x] 宿ŽçMCPåè®®æ¯æ
- [x] Jinja2 3.1+ å
šåèœæ¯æ
- [x] åäŒ èŸåè®® (stdio/HTTP)
- [x] å®å
šæ²ç®±æ§è¡
- [x] åŒæ¥é«æ§èœå€ç
- [x] æš¡æ¿æä»¶ç³»ç»æ¯æ
- [x] 诊ç»çéè¯¯è¯æ
- [x] ç»æåæ¥å¿è®°åœ
---
## ð ææ¡£èµæº
### ð æ žå¿ææ¡£
- **[åŒåè§å](docs/åŒåè§å.md)** - 诊ç»çåŒååçšåææ¯å³ç
- **[å¿«éåŒå§](#-å¿«éåŒå§)** - 5åéäžææå
- **[APIåè](#ïž-æ žå¿å·¥å
·)** - 宿Žçå·¥å
·APIææ¡£
- **[é
眮æå](#ïž-é«çº§é
眮)** - é«çº§é
眮é项
### ð¯ 䜿çšç€ºäŸ
- **[åºç¡æš¡æ¿](examples/templates/basic.html)** - HTMLæš¡æ¿ç€ºäŸ
- **[é®ä»¶æš¡æ¿](examples/templates/email.html)** - é®ä»¶æš¡æ¿ç€ºäŸ
- **[é
眮暡æ¿](examples/templates/config.yaml)** - YAMLé
眮瀺äŸ
### ð§ åŒåæå
- **[èŽ¡ç®æå](#-åŒåäžæµè¯)** - åŠäœåäžé¡¹ç®åŒå
- **[æµè¯æå](#-åŒåäžæµè¯)** - æµè¯çšäŸçŒå
- **[æ§èœäŒå](docs/performance.md)** - æ§èœè°äŒå»ºè®®
---
## ð€ èŽ¡ç®æå
### ð åäžåŒå
1. **Fork** æ¬ä»åº
2. åå»ºç¹æ§åæ¯: `git checkout -b feature/amazing-feature`
3. æäº€æŽæ¹: `git commit -m 'Add amazing feature'`
4. æšé忝: `git push origin feature/amazing-feature`
5. æäº€ **Pull Request**
### ð é®é¢æ¥å
- [Issues](https://github.com/WW-AI-Lab/jinja2-mcp-server/issues) - Bugæ¥åååèœè¯·æ±
- [Discussions](https://github.com/WW-AI-Lab/jinja2-mcp-server/discussions) - 瀟åºè®šè®º
### ð åŒåè§è
- **代ç 飿 Œ**: éµåŸªPEP 8ïŒäœ¿çšblackæ ŒåŒå
- **ç±»åæç€º**: 䜿çšmypyè¿è¡ç±»åæ£æ¥
- **æµè¯èŠç**: æ°åèœå¿
é¡»å
嫿µè¯çšäŸ
- **ææ¡£æŽæ°**: éèŠæŽæ¹éèŠæŽæ°ææ¡£
---
## ð åŒæºåè®®
**MIT License** â éæåçšãæ¹é ïŒæ¬¢è¿èŽ¡ç®ä»£ç ïŒ
åŠæè¿äžªé¡¹ç®å¯¹äœ æåž®å©ïŒè¯·ç»äžª â **Star** æ¯æäžäžïŒ
---
## ð€ å
³äº WW-AI-Lab
è¿æ¯ **WW-AI-Lab** çåŒæºé¡¹ç®ïŒæä»¬äžæ³šäºïŒ
- ð **äŒäžèªåšåè§£å³æ¹æ¡** - æµè§åšèªåšåãAIå·¥äœæµ
- ð€ **Agentic Workflow** - 端å°ç«¯çAIäžå¡æµçš
- ðŒïž **çæåŒAIåºçš** - 倿𡿿š¡åãåŸåå€ç
- ð **æ°æ®æŽå¯å·¥å
·** - AI驱åšçæ°æ®åæ
### ð¡ 项ç®ç¹ç¹
- **AIèŸ
å©åŒå**: æ¬é¡¹ç®å®å
šç± Cursor IDE + Claude åäœå®æ
- **ç产就绪**: èœæ¯åŒæºé¡¹ç®ïŒäœä»£ç 莚é蟟å°ç产æ å
- **åŒæºå
±äº«**: å
å«å®æŽçåŒåè¿çšææ¡£åæäœ³å®è·µ
- **åŠä¹ å奜**: 诊ç»çææ¯å®ç°è¯ŽæïŒäŸ¿äºåŠä¹ åæ¹è¿
### ð ä»åŒæºå°äŒäž
åœåŒæºé¡¹ç®åšå®è·µäžè¯ææææ¶ïŒæä»¬äŒå°å
¶å级䞺äŒäžçº§æ¹æ¡ïŒ
ð **YFGaia** - æäŸæŽäž¥è°šçæµè¯ãææ¡£äžé¿æç»Žæ€
### ð èç³»æä»¬
| æž é | å°å | çšé |
|------|------|------|
| ð§ **Email** | [toxingwang@gmail.com](mailto:toxingwang@gmail.com) | åäœ / äžå¡åšè¯¢ |
| ðŠ **X (Twitter)** | [@WW_AI_Lab](https://x.com/WW_AI_Lab) | ææ°åšæãææ¯å享 |
| ð¬ **埮信** | toxingwang | 深床亀æµïŒæ·»å è¯·æ³šææ¥æº |
---
**å
莣声æ**: æ¬é¡¹ç®åºäºMITåè®®åŒæºïŒä»
äŸåŠä¹ åç 究䜿çšãåŠéåäžæ¯æïŒè¯·éè¿äžè¿°æž éèç³»ã
**Built with â€ïž using Python, Jinja2, FastMCP and Cursor IDE**This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessSyncing