loading…
Search for a command to run...
loading…
A production-ready MCP server that enables users to interact with Neo4j databases through health checks and Cypher query tools. It features a structured, contai
A production-ready MCP server that enables users to interact with Neo4j databases through health checks and Cypher query tools. It features a structured, containerized architecture with built-in support for Azure deployments and environment-driven configuration.
Build a production-ready FastMCP server that is structured, configurable, testable, and ready for local, containerized, and Azure deployments. Include Neo4j connectivity as a tool and provide CI/CD scaffolding.
Required for CI deploy jobs:
App Service only:
Container Apps only:
. ├─ app/ │ ├─ init.py │ ├─ config.py │ ├─ logging.py │ ├─ main.py │ └─ tools/ │ ├─ init.py │ ├─ greetings.py │ └─ neo4j.py ├─ tests/ │ └─ test_greetings.py ├─ requirements/ │ ├─ base.txt │ └─ dev.txt ├─ .env.example ├─ Dockerfile ├─ docker-compose.yml ├─ startup.sh ├─ requirements.txt ├─ server.py ├─ azure/ │ ├─ appsettings.json │ └─ containerapp.yaml ├─ scripts/ │ ├─ deploy_aca.sh │ └─ deploy_appservice.sh └─ .github/ └─ workflows/ └─ ci-deploy.yml
Local:
Docker:
Azure App Service (manual):
Neo4j env vars (required for Neo4j tools):
MCP client headers (stateless streamable-http):
Postman import (stateless collection):
{
"info": {
"name": "FastMCP Neo4j (Stateless)",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "neo4j_health",
"request": {
"method": "POST",
"header": [
{ "key": "Accept", "value": "application/json, text/event-stream" },
{ "key": "Content-Type", "value": "application/json" }
],
"body": {
"mode": "raw",
"raw": "{\n \"jsonrpc\": \"2.0\",\n \"id\": \"h1\",\n \"method\": \"tools/call\",\n \"params\": {\n \"name\": \"neo4j_health\",\n \"arguments\": {}\n }\n}"
},
"url": {
"raw": "http://{{host}}:{{port}}/mcp",
"protocol": "http",
"host": ["{{host}}"],
"port": "{{port}}",
"path": ["mcp"]
}
}
},
{
"name": "neo4j_query",
"request": {
"method": "POST",
"header": [
{ "key": "Accept", "value": "application/json, text/event-stream" },
{ "key": "Content-Type", "value": "application/json" }
],
"body": {
"mode": "raw",
"raw": "{\n \"jsonrpc\": \"2.0\",\n \"id\": \"q1\",\n \"method\": \"tools/call\",\n \"params\": {\n \"name\": \"neo4j_query\",\n \"arguments\": {\n \"cypher\": \"MATCH (n) RETURN n LIMIT 5\",\n \"parameters\": {}\n }\n }\n}"
},
"url": {
"raw": "http://{{host}}:{{port}}/mcp",
"protocol": "http",
"host": ["{{host}}"],
"port": "{{port}}",
"path": ["mcp"]
}
}
}
],
"variable": [
{ "key": "host", "value": "127.0.0.1" },
{ "key": "port", "value": "8000" }
]
}
flowchart TB
App["FastMCP App
app/main.py
tools/*.py
config.py
logging.py"]
Neo4j["Neo4j DB
bolt://host:7687"]
MCP["/mcp endpoint"]
App <---> Neo4j App --> MCP
Start -> load Settings -> configure JSON logging -> create FastMCP -> register tools -> run(host, port)
Local: Developer -> Python -> FastMCP -> /mcp
Docker: Developer -> Docker -> Container (FastMCP) -> Neo4j container
Azure Container Apps: GitHub Actions -> ACA -> Container (FastMCP)
Azure App Service: GitHub Actions -> App Service -> startup.sh -> FastMCP
Add this to claude_desktop_config.json and restart Claude Desktop.
{
"mcpServers": {
"fastmcp-production-ready-server": {
"command": "npx",
"args": []
}
}
}