Spaces:
Paused
Paused
Deploy MCP server (Docker Space)
Browse files- Agent.md +19 -0
- Dockerfile +57 -0
- README.md +8 -6
- app.py +25 -0
- requirements.txt +2 -0
- start.sh +15 -0
Agent.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Operational Checklist & Guidelines for Coding Agents
|
| 2 |
+
|
| 3 |
+
These rules apply to all automated contributors working on this project.
|
| 4 |
+
|
| 5 |
+
## Checklist
|
| 6 |
+
|
| 7 |
+
1. **Review this file (`Agent.md`)** before attempting any deployment or codebase modification. It must be executed/used as the first operational checklist when setting up or modifying the code's changes.
|
| 8 |
+
2. **Sync with Target Space:** Ensure you have up-to-date knowledge of the project's structure (`n8n-mcp-server` inside a Docker container on Hugging Face Spaces).
|
| 9 |
+
3. **Important Files:** Understand that `app.py`, `start.sh`, and `requirements.txt` are NOT dead code. They are necessary to boot a dummy FastAPI server on port 7860 to satisfy Hugging Face Space health checks, while the MCP server runs on port 8000.
|
| 10 |
+
4. **Deploy Properly:** Use the proper `hf upload <repo_id> . --repo-type=space --revision main` (or the equivalent CLI flag `--branch main`) command to deploy.
|
| 11 |
+
5. **Monitor Logs:** Monitor build logs via `/logs/build` and run logs via `/logs/run` endpoints in the Hugging Face API.
|
| 12 |
+
6. **Verify API Endpoints:** Ensure exposed APIs are up and functional (e.g. checking responses and logs) before closing a deployment task.
|
| 13 |
+
|
| 14 |
+
## Repository Setup
|
| 15 |
+
The repository builds a Docker image that clones `https://github.com/JsonLord/n8n-mcp-server-api.git` (specifically the `feat/bearer-auth` branch) and runs an `n8n-mcp-server` internally.
|
| 16 |
+
|
| 17 |
+
## Important Guidelines
|
| 18 |
+
- Do not let API connectivity errors (like n8n "Quota Exceeded") crash the container on startup. Instead, patch the error throwing mechanism so the application remains responsive via its API endpoints.
|
| 19 |
+
- Commit and update this `Agent.md` file regularly.
|
Dockerfile
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Stage 1: Build the application
|
| 2 |
+
FROM node:20 AS builder
|
| 3 |
+
|
| 4 |
+
# Install git
|
| 5 |
+
RUN apt-get update && apt-get install -y git
|
| 6 |
+
|
| 7 |
+
WORKDIR /app
|
| 8 |
+
|
| 9 |
+
# Clone the repository
|
| 10 |
+
RUN git clone --branch feat/bearer-auth https://github.com/JsonLord/n8n-mcp-server-api.git .
|
| 11 |
+
|
| 12 |
+
# Install dependencies
|
| 13 |
+
RUN npm ci
|
| 14 |
+
|
| 15 |
+
# Patch the error throwing
|
| 16 |
+
RUN sed -i 's/throw error;/\/\/ throw error;/' src/config/server.ts
|
| 17 |
+
|
| 18 |
+
# Build the project
|
| 19 |
+
RUN npm run build
|
| 20 |
+
|
| 21 |
+
# Strip dev-dependencies; keeps runtime small
|
| 22 |
+
RUN npm prune --omit=dev
|
| 23 |
+
|
| 24 |
+
# Stage 2: Create the production image
|
| 25 |
+
FROM node:20-bullseye-slim
|
| 26 |
+
|
| 27 |
+
# Install python
|
| 28 |
+
RUN apt-get update && apt-get install -y python3 python3-pip
|
| 29 |
+
|
| 30 |
+
WORKDIR /app
|
| 31 |
+
|
| 32 |
+
# Copy ready-to-run artefacts from builder
|
| 33 |
+
COPY --from=builder /app/build ./n8n-mcp-server/build
|
| 34 |
+
COPY --from=builder /app/node_modules ./n8n-mcp-server/node_modules
|
| 35 |
+
COPY --from=builder /app/package*.json ./n8n-mcp-server/
|
| 36 |
+
|
| 37 |
+
# Set executable permissions for the binary
|
| 38 |
+
RUN chmod +x n8n-mcp-server/build/index.js
|
| 39 |
+
|
| 40 |
+
# Install python requirements
|
| 41 |
+
COPY requirements.txt .
|
| 42 |
+
RUN pip3 install -r requirements.txt
|
| 43 |
+
|
| 44 |
+
# Copy python app and start script
|
| 45 |
+
COPY app.py .
|
| 46 |
+
COPY start.sh .
|
| 47 |
+
RUN chmod +x start.sh
|
| 48 |
+
|
| 49 |
+
# Create the .env directory
|
| 50 |
+
RUN mkdir -p n8n-mcp-server
|
| 51 |
+
|
| 52 |
+
# Expose the port the app runs on
|
| 53 |
+
EXPOSE 7860
|
| 54 |
+
EXPOSE 8000
|
| 55 |
+
|
| 56 |
+
# Set the entrypoint to run the MCP server
|
| 57 |
+
CMD ["./start.sh"]
|
README.md
CHANGED
|
@@ -1,10 +1,12 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: docker
|
| 7 |
-
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: n8n-mcp-server
|
| 3 |
+
emoji: 🚀
|
| 4 |
+
colorFrom: blue
|
| 5 |
+
colorTo: green
|
| 6 |
sdk: docker
|
| 7 |
+
app_port: 7860
|
| 8 |
---
|
| 9 |
|
| 10 |
+
# n8n-mcp-server
|
| 11 |
+
|
| 12 |
+
This space deploys the n8n-mcp-server.
|
app.py
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from fastapi import FastAPI, Request, HTTPException
|
| 2 |
+
from fastapi.responses import StreamingResponse
|
| 3 |
+
import os, json, asyncio
|
| 4 |
+
|
| 5 |
+
app = FastAPI()
|
| 6 |
+
|
| 7 |
+
@app.get("/")
|
| 8 |
+
def greet_json():
|
| 9 |
+
return {"message": "n8n-mcp-server is running in the background."}
|
| 10 |
+
|
| 11 |
+
# SSE endpoint – requires TOKEN secret
|
| 12 |
+
@app.get("/sse")
|
| 13 |
+
async def sse_endpoint(request: Request):
|
| 14 |
+
token = request.headers.get("Authorization")
|
| 15 |
+
expected = f"Bearer {os.getenv('TOKEN', '')}"
|
| 16 |
+
if token != expected:
|
| 17 |
+
raise HTTPException(status_code=401, detail="Invalid token")
|
| 18 |
+
async def event_generator():
|
| 19 |
+
while True:
|
| 20 |
+
if await request.is_disconnected():
|
| 21 |
+
break
|
| 22 |
+
data = {"event": "heartbeat", "ts": int(asyncio.time())}
|
| 23 |
+
yield f"data: {json.dumps(data)}\n\n"
|
| 24 |
+
await asyncio.sleep(2)
|
| 25 |
+
return StreamingResponse(event_generator(), media_type="text/event-stream")
|
requirements.txt
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
fastapi
|
| 2 |
+
uvicorn[standard]
|
start.sh
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
|
| 3 |
+
# Create a .env file for the n8n-mcp-server
|
| 4 |
+
# The values are taken from the Hugging Face Space's environment variables
|
| 5 |
+
echo "N8N_API_URL=${N8N_API_URL}" > n8n-mcp-server/.env
|
| 6 |
+
echo "N8N_API_KEY=${N8N_API_KEY}" >> n8n-mcp-server/.env
|
| 7 |
+
echo "N8N_WEBHOOK_USERNAME=${N8N_WEBHOOK_USERNAME}" >> n8n-mcp-server/.env
|
| 8 |
+
echo "N8N_WEBHOOK_PASSWORD=${N8N_WEBHOOK_PASSWORD}" >> n8n-mcp-server/.env
|
| 9 |
+
echo "DEBUG=${DEBUG}" >> n8n-mcp-server/.env
|
| 10 |
+
|
| 11 |
+
# Start the n8n-mcp-server in the background
|
| 12 |
+
node n8n-mcp-server/build/index.js &
|
| 13 |
+
|
| 14 |
+
# Start the uvicorn server in the foreground
|
| 15 |
+
uvicorn app:app --host 0.0.0.0 --port 7860
|